|
|
|
@ -134,7 +134,9 @@ fail:
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_opmode opmode, const char* addr) {
|
|
|
|
|
static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_opmode opmode, const char* addr,
|
|
|
|
|
const struct sockaddr_in6 *sin)
|
|
|
|
|
{
|
|
|
|
|
struct call *c;
|
|
|
|
|
struct call_monologue *monologue;
|
|
|
|
|
GQueue q = G_QUEUE_INIT;
|
|
|
|
@ -155,8 +157,9 @@ static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_o
|
|
|
|
|
return str_sprintf("%s 0 0.0.0.0\n", out[RE_UDP_COOKIE]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (addr) {
|
|
|
|
|
if (!c->created_from && addr) {
|
|
|
|
|
c->created_from = call_strdup(c, addr);
|
|
|
|
|
c->created_from_addr = *sin;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
monologue = call_get_mono_dialogue(c, &fromtag, &totag);
|
|
|
|
@ -207,11 +210,11 @@ out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
str *call_update_udp(char **out, struct callmaster *m, const char* addr) {
|
|
|
|
|
return call_update_lookup_udp(out, m, OP_OFFER, addr);
|
|
|
|
|
str *call_update_udp(char **out, struct callmaster *m, const char* addr, const struct sockaddr_in6 *sin) {
|
|
|
|
|
return call_update_lookup_udp(out, m, OP_OFFER, addr, sin);
|
|
|
|
|
}
|
|
|
|
|
str *call_lookup_udp(char **out, struct callmaster *m) {
|
|
|
|
|
return call_update_lookup_udp(out, m, OP_ANSWER, NULL);
|
|
|
|
|
return call_update_lookup_udp(out, m, OP_ANSWER, NULL, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -592,7 +595,8 @@ static void call_ng_process_flags(struct sdp_ng_flags *out, bencode_item_t *inpu
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const char *call_offer_answer_ng(bencode_item_t *input, struct callmaster *m,
|
|
|
|
|
bencode_item_t *output, enum call_opmode opmode, const char* addr)
|
|
|
|
|
bencode_item_t *output, enum call_opmode opmode, const char* addr,
|
|
|
|
|
const struct sockaddr_in6 *sin)
|
|
|
|
|
{
|
|
|
|
|
str sdp, fromtag, totag = STR_NULL, callid;
|
|
|
|
|
char *errstr;
|
|
|
|
@ -631,8 +635,9 @@ static const char *call_offer_answer_ng(bencode_item_t *input, struct callmaster
|
|
|
|
|
if (!call)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
if (addr) {
|
|
|
|
|
if (!call->created_from && addr) {
|
|
|
|
|
call->created_from = call_strdup(call, addr);
|
|
|
|
|
call->created_from_addr = *sin;
|
|
|
|
|
}
|
|
|
|
|
/* At least the random ICE strings are contained within the call struct, so we
|
|
|
|
|
* need to hold a ref until we're done sending the reply */
|
|
|
|
@ -680,12 +685,14 @@ out:
|
|
|
|
|
return errstr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *call_offer_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output, const char* addr) {
|
|
|
|
|
return call_offer_answer_ng(input, m, output, OP_OFFER, addr);
|
|
|
|
|
const char *call_offer_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output, const char* addr,
|
|
|
|
|
const struct sockaddr_in6 *sin)
|
|
|
|
|
{
|
|
|
|
|
return call_offer_answer_ng(input, m, output, OP_OFFER, addr, sin);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *call_answer_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) {
|
|
|
|
|
return call_offer_answer_ng(input, m, output, OP_ANSWER, NULL);
|
|
|
|
|
return call_offer_answer_ng(input, m, output, OP_ANSWER, NULL, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *call_delete_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) {
|
|
|
|
|