diff --git a/daemon/call.h b/daemon/call.h index 3328ed9b4..bcf741fd9 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -360,6 +360,7 @@ struct call { time_t ml_deleted; unsigned char tos; char *created_from; + struct sockaddr_in6 created_from_addr; }; struct local_interface { diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 73584180b..67ce881f5 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -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) { diff --git a/daemon/call_interfaces.h b/daemon/call_interfaces.h index 209707f66..5c1e68601 100644 --- a/daemon/call_interfaces.h +++ b/daemon/call_interfaces.h @@ -13,6 +13,7 @@ struct call; struct call_stats; struct callmaster; struct control_stream; +struct sockaddr_in6; extern int trust_address_def; @@ -24,12 +25,13 @@ str *call_lookup_tcp(char **, struct callmaster *); void call_delete_tcp(char **, struct callmaster *); void calls_status_tcp(struct callmaster *, struct control_stream *); -str *call_update_udp(char **, struct callmaster *, const char*); +str *call_update_udp(char **, struct callmaster *, const char*, const struct sockaddr_in6 *); str *call_lookup_udp(char **, struct callmaster *); str *call_delete_udp(char **, struct callmaster *); str *call_query_udp(char **, struct callmaster *); -const char *call_offer_ng(bencode_item_t *, struct callmaster *, bencode_item_t *, const char*); +const char *call_offer_ng(bencode_item_t *, struct callmaster *, bencode_item_t *, const char*, + const struct sockaddr_in6 *); const char *call_answer_ng(bencode_item_t *, struct callmaster *, bencode_item_t *); const char *call_delete_ng(bencode_item_t *, struct callmaster *, bencode_item_t *); const char *call_query_ng(bencode_item_t *, struct callmaster *, bencode_item_t *); diff --git a/daemon/control_ng.c b/daemon/control_ng.c index afe5a91df..d568520b0 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -111,7 +111,7 @@ static void control_ng_incoming(struct obj *obj, str *buf, struct sockaddr_in6 * if (!str_cmp(&cmd, "ping")) bencode_dictionary_add_string(resp, "result", "pong"); else if (!str_cmp(&cmd, "offer")) - errstr = call_offer_ng(dict, c->callmaster, resp, addr); + errstr = call_offer_ng(dict, c->callmaster, resp, addr, sin); else if (!str_cmp(&cmd, "answer")) errstr = call_answer_ng(dict, c->callmaster, resp); else if (!str_cmp(&cmd, "delete")) diff --git a/daemon/control_udp.c b/daemon/control_udp.c index bab804142..1e4f3b214 100644 --- a/daemon/control_udp.c +++ b/daemon/control_udp.c @@ -83,7 +83,7 @@ static void control_udp_incoming(struct obj *obj, str *buf, struct sockaddr_in6 } if (chrtoupper(out[RE_UDP_UL_CMD][0]) == 'U') - reply = call_update_udp(out, u->callmaster, addr); + reply = call_update_udp(out, u->callmaster, addr, sin); else if (chrtoupper(out[RE_UDP_UL_CMD][0]) == 'L') reply = call_lookup_udp(out, u->callmaster); else if (chrtoupper(out[RE_UDP_DQ_CMD][0]) == 'D')