|
|
|
|
@ -33,6 +33,8 @@
|
|
|
|
|
#define DBG(x...) ((void)0)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define VIA2STR(x) ( x ? x : "<none>")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static pcre *info_re;
|
|
|
|
|
@ -88,7 +90,7 @@ static void stream_closed(int fd, void *p) {
|
|
|
|
|
|
|
|
|
|
c = r->up->up->call;
|
|
|
|
|
|
|
|
|
|
mylog(LOG_WARNING, "[%s] Read error on RTP socket", c->callid);
|
|
|
|
|
mylog(LOG_WARNING, "[%s - %s] Read error on RTP socket", c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
|
|
|
|
|
call_destroy_all_branches(c);
|
|
|
|
|
}
|
|
|
|
|
@ -102,7 +104,7 @@ static void kernelize(struct callstream *c) {
|
|
|
|
|
struct streamrelay *r, *rp;
|
|
|
|
|
struct kernel_stream ks;
|
|
|
|
|
|
|
|
|
|
mylog(LOG_DEBUG, "[%s] Kernelizing RTP streams", c->call->callid);
|
|
|
|
|
mylog(LOG_DEBUG, "[%s - %s] Kernelizing RTP streams", c->call->callid, VIA2STR(c->call->viabranch));
|
|
|
|
|
|
|
|
|
|
ZERO(ks);
|
|
|
|
|
|
|
|
|
|
@ -177,7 +179,8 @@ static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_
|
|
|
|
|
smart_ntop_p(addr, &fsin->sin6_addr, sizeof(addr));
|
|
|
|
|
|
|
|
|
|
if (p->fd == -1) {
|
|
|
|
|
mylog(LOG_WARNING, "[%s] RTP packet to port %u discarded from %s:%u", c->callid, r->localport, addr, ntohs(fsin->sin6_port));
|
|
|
|
|
mylog(LOG_WARNING, "[%s - %s] RTP packet to port %u discarded from %s:%u",
|
|
|
|
|
c->callid, VIA2STR(c->viabranch), r->localport, addr, ntohs(fsin->sin6_port));
|
|
|
|
|
r->stats.errors++;
|
|
|
|
|
m->statsps.errors++;
|
|
|
|
|
return 0;
|
|
|
|
|
@ -197,7 +200,8 @@ static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_
|
|
|
|
|
pe->codec = "unknown";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mylog(LOG_DEBUG, "[%s] Confirmed peer information for port %u - %s:%u", c->callid, r->localport, addr, ntohs(fsin->sin6_port));
|
|
|
|
|
mylog(LOG_DEBUG, "[%s - %s] Confirmed peer information for port %u - %s:%u",
|
|
|
|
|
c->callid, VIA2STR(c->viabranch), r->localport, addr, ntohs(fsin->sin6_port));
|
|
|
|
|
|
|
|
|
|
pe->confirmed = 1;
|
|
|
|
|
}
|
|
|
|
|
@ -467,7 +471,7 @@ static void call_timer_iterator(void *key, void *val, void *ptr) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Closing call branch due to timeout",
|
|
|
|
|
c->callid, c->viabranch ? c->viabranch : "<none>");
|
|
|
|
|
c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
|
|
|
|
|
drop:
|
|
|
|
|
hlp->del = g_list_prepend(hlp->del, c);
|
|
|
|
|
@ -702,7 +706,8 @@ next:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m->lastport = port;
|
|
|
|
|
mylog(LOG_DEBUG, "[%s] Opened ports %u/%u for RTP", c->callid, a->localport, b->localport);
|
|
|
|
|
mylog(LOG_DEBUG, "[%s - %s] Opened ports %u/%u for RTP",
|
|
|
|
|
c->callid, VIA2STR(c->viabranch), a->localport, b->localport);
|
|
|
|
|
|
|
|
|
|
reserve:
|
|
|
|
|
bit_array_set(ports_used, a->localport);
|
|
|
|
|
@ -711,7 +716,7 @@ reserve:
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
fail:
|
|
|
|
|
mylog(LOG_ERR, "[%s] Failed to get RTP port pair", c->callid);
|
|
|
|
|
mylog(LOG_ERR, "[%s - %s] Failed to get RTP port pair", c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
if (a->fd != -1)
|
|
|
|
|
close(a->fd);
|
|
|
|
|
if (b->fd != -1)
|
|
|
|
|
@ -778,7 +783,8 @@ static void steal_peer(struct peer *dest, struct peer *src) {
|
|
|
|
|
c = src->up->call;
|
|
|
|
|
po = c->callmaster->poller;
|
|
|
|
|
|
|
|
|
|
mylog(LOG_DEBUG, "[%s] Re-using existing open RTP port %u", c->callid, r->localport);
|
|
|
|
|
mylog(LOG_DEBUG, "[%s - %s] Re-using existing open RTP port %u",
|
|
|
|
|
c->callid, VIA2STR(c->viabranch), r->localport);
|
|
|
|
|
|
|
|
|
|
dest->confirmed = 0;
|
|
|
|
|
unkernelize(dest);
|
|
|
|
|
@ -797,7 +803,8 @@ static void steal_peer(struct peer *dest, struct peer *src) {
|
|
|
|
|
srs = &src->rtps[i];
|
|
|
|
|
|
|
|
|
|
if (sr->fd != -1) {
|
|
|
|
|
mylog(LOG_DEBUG, "[%s] Closing port %u in favor of re-use", c->callid, sr->localport);
|
|
|
|
|
mylog(LOG_DEBUG, "[%s - %s] Closing port %u in favor of re-use",
|
|
|
|
|
c->callid, VIA2STR(c->viabranch), sr->localport);
|
|
|
|
|
close(sr->fd);
|
|
|
|
|
bit_array_clear(ports_used, sr->localport);
|
|
|
|
|
poller_del_item(po, sr->fd);
|
|
|
|
|
@ -973,7 +980,8 @@ found:
|
|
|
|
|
goto got_cs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mylog(LOG_WARNING, "[%s] Got LOOKUP, but no usable callstreams found", c->callid);
|
|
|
|
|
mylog(LOG_WARNING, "[%s - %s] Got LOOKUP, but no usable callstreams found",
|
|
|
|
|
c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
got_cs:
|
|
|
|
|
@ -1104,12 +1112,11 @@ static void call_destroy_all_branches(struct call *c) {
|
|
|
|
|
struct call *next;
|
|
|
|
|
|
|
|
|
|
/* rewind to beginning of list */
|
|
|
|
|
for(c; c->prev; c = c->prev);
|
|
|
|
|
for(; c->prev; c = c->prev);
|
|
|
|
|
|
|
|
|
|
/* delete full list */
|
|
|
|
|
while(c) {
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Delete call branch",
|
|
|
|
|
c->callid, c->viabranch ? c->viabranch : "<none>");
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Delete call branch", c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
if(!c->next) {
|
|
|
|
|
/* delete hash entry when on last branch */
|
|
|
|
|
g_hash_table_remove(m->callhash, c->callid);
|
|
|
|
|
@ -1121,7 +1128,6 @@ static void call_destroy_all_branches(struct call *c) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void call_destroy(struct call *c) {
|
|
|
|
|
struct callmaster *m = c->callmaster;
|
|
|
|
|
struct callstream *s;
|
|
|
|
|
|
|
|
|
|
if(c->prev)
|
|
|
|
|
@ -1219,8 +1225,8 @@ out:
|
|
|
|
|
static struct call *call_create(const char *callid, const char *viabranch, struct callmaster *m) {
|
|
|
|
|
struct call *c;
|
|
|
|
|
|
|
|
|
|
mylog(LOG_NOTICE, "[%s] Creating new call for viabranch %s",
|
|
|
|
|
callid, (viabranch ? viabranch : "<none>")); /* XXX will spam syslog on recovery from DB */
|
|
|
|
|
mylog(LOG_NOTICE, "[%s - %s] Creating new call",
|
|
|
|
|
callid, VIA2STR(viabranch)); /* XXX will spam syslog on recovery from DB */
|
|
|
|
|
c = g_slice_alloc0(sizeof(*c));
|
|
|
|
|
c->callmaster = m;
|
|
|
|
|
c->callid = strdup(callid);
|
|
|
|
|
@ -1331,7 +1337,7 @@ char *call_update_udp(const char **out, struct callmaster *m) {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ret = streams_print(c->callstreams, 1, (num >= 0) ? 0 : 1, out[RE_UDP_COOKIE], 1);
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Returning to SIP proxy: %s", c->callid, c->viabranch ? c->viabranch : "<none>", ret);
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Returning to SIP proxy: %s", c->callid, VIA2STR(c->viabranch), ret);
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
|
|
fail:
|
|
|
|
|
@ -1370,7 +1376,7 @@ char *call_lookup_udp(const char **out, struct callmaster *m) {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ret = streams_print(c->callstreams, 1, (num >= 0) ? 1 : 0, out[RE_UDP_COOKIE], 1);
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Returning to SIP proxy: %s", c->callid, c->viabranch ? c->viabranch : "<none>", ret);
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Returning to SIP proxy: %s", c->callid, VIA2STR(c->viabranch), ret);
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
|
|
fail:
|
|
|
|
|
@ -1398,7 +1404,7 @@ char *call_request(const char **out, struct callmaster *m) {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ret = streams_print(c->callstreams, abs(num), (num >= 0) ? 0 : 1, NULL, 0);
|
|
|
|
|
mylog(LOG_INFO, "[%s] Returning to SIP proxy: %s", c->callid, ret);
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Returning to SIP proxy: %s", c->callid, VIA2STR(c->viabranch), ret);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1425,7 +1431,7 @@ char *call_lookup(const char **out, struct callmaster *m) {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ret = streams_print(c->callstreams, abs(num), (num >= 0) ? 1 : 0, NULL, 0);
|
|
|
|
|
mylog(LOG_INFO, "[%s] Returning to SIP proxy: %s", c->callid, ret);
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Returning to SIP proxy: %s", c->callid, VIA2STR(c->viabranch), ret);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1446,7 +1452,7 @@ char *call_delete_udp(const char **out, struct callmaster *m) {
|
|
|
|
|
next = c->next;
|
|
|
|
|
if(g_strcmp0(out[RE_UDP_D_VIABRANCH], c->viabranch) == 0) {
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Deleting selective call branch",
|
|
|
|
|
c->callid, c->viabranch ? c->viabranch : "<none>");
|
|
|
|
|
c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
if(c->prev)
|
|
|
|
|
c->prev->next = c->next;
|
|
|
|
|
call_destroy(c);
|
|
|
|
|
@ -1459,7 +1465,7 @@ char *call_delete_udp(const char **out, struct callmaster *m) {
|
|
|
|
|
/* delete whole list */
|
|
|
|
|
while(c) {
|
|
|
|
|
mylog(LOG_INFO, "[%s - %s] Deleted call branch",
|
|
|
|
|
c->callid, c->viabranch ? c->viabranch : "<none>");
|
|
|
|
|
c->callid, VIA2STR(c->viabranch));
|
|
|
|
|
next = c->next;
|
|
|
|
|
call_destroy(c);
|
|
|
|
|
c = next;
|
|
|
|
|
|