|
|
|
|
@ -1855,14 +1855,42 @@ str *call_lookup_tcp(char **out, struct callmaster *m) {
|
|
|
|
|
return call_request_lookup_tcp(out, m, OP_ANSWER, "totag");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int tags_match(const struct peer *p, const struct peer *px, const str *fromtag, const str *totag) {
|
|
|
|
|
if (!fromtag->len)
|
|
|
|
|
return 1;
|
|
|
|
|
if (str_cmp_str(&p->tag, fromtag))
|
|
|
|
|
return 0;
|
|
|
|
|
if (!totag->len)
|
|
|
|
|
return 1;
|
|
|
|
|
if (str_cmp_str(&px->tag, totag))
|
|
|
|
|
return 0;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* cs must be unlocked */
|
|
|
|
|
static int tags_match_cs(struct callstream *cs, const str *fromtag, const str *totag) {
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
mutex_lock(&cs->lock);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
|
|
if (tags_match(&cs->peers[i], &cs->peers[i ^ 1], fromtag, totag)) {
|
|
|
|
|
mutex_unlock(&cs->lock);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mutex_unlock(&cs->lock);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int call_delete_branch(struct callmaster *m, const str *callid, const str *branch,
|
|
|
|
|
const str *fromtag, const str *totag, bencode_item_t *output)
|
|
|
|
|
{
|
|
|
|
|
struct call *c;
|
|
|
|
|
struct callstream *cs;
|
|
|
|
|
GList *l;
|
|
|
|
|
int ret, i;
|
|
|
|
|
struct peer *p, *px;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
c = call_get(callid, NULL, m);
|
|
|
|
|
if (!c) {
|
|
|
|
|
@ -1872,37 +1900,16 @@ static int call_delete_branch(struct callmaster *m, const str *callid, const str
|
|
|
|
|
|
|
|
|
|
log_info = branch;
|
|
|
|
|
|
|
|
|
|
if (!fromtag || !fromtag->len)
|
|
|
|
|
goto no_tags;
|
|
|
|
|
|
|
|
|
|
for (l = c->callstreams->head; l; l = l->next) {
|
|
|
|
|
cs = l->data;
|
|
|
|
|
mutex_lock(&cs->lock);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
|
|
p = &cs->peers[i];
|
|
|
|
|
if (str_cmp_str(&p->tag, fromtag))
|
|
|
|
|
continue;
|
|
|
|
|
if (!totag || !totag->len)
|
|
|
|
|
goto tag_match;
|
|
|
|
|
|
|
|
|
|
px = &cs->peers[i ^ 1];
|
|
|
|
|
if (str_cmp_str(&px->tag, totag))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (tags_match_cs(cs, fromtag, totag))
|
|
|
|
|
goto tag_match;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mutex_unlock(&cs->lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mylog(LOG_INFO, LOG_PREFIX_C "Tags didn't match for delete message, ignoring", LOG_PARAMS_C(c));
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
tag_match:
|
|
|
|
|
mutex_unlock(&cs->lock);
|
|
|
|
|
|
|
|
|
|
no_tags:
|
|
|
|
|
if (output)
|
|
|
|
|
ng_call_stats(c, fromtag, totag, output);
|
|
|
|
|
|
|
|
|
|
@ -1989,18 +1996,9 @@ static void stats_query(struct call *call, const str *fromtag, const str *totag,
|
|
|
|
|
if (p->rtps[1].last > stats->newest)
|
|
|
|
|
stats->newest = p->rtps[1].last;
|
|
|
|
|
|
|
|
|
|
if (!fromtag->len)
|
|
|
|
|
goto tag_match;
|
|
|
|
|
|
|
|
|
|
if (str_cmp_str(&p->tag, fromtag))
|
|
|
|
|
continue;
|
|
|
|
|
if (!totag->len)
|
|
|
|
|
goto tag_match;
|
|
|
|
|
|
|
|
|
|
if (str_cmp_str(&px->tag, totag))
|
|
|
|
|
if (!tags_match(p, px, fromtag, totag))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
tag_match:
|
|
|
|
|
if (cb)
|
|
|
|
|
cb(p, px, arg);
|
|
|
|
|
|
|
|
|
|
|