From 513ac44a84c5748aa9eab765f979c9c9ce12992d Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 5 Sep 2014 12:38:50 -0400 Subject: [PATCH] incorporate new local-interface infrastructure into appropriate places --- daemon/aux.h | 16 +++++- daemon/call.c | 135 +++++++++++++++++++++++--------------------------- daemon/call.h | 20 +++++--- daemon/dtls.c | 2 +- daemon/main.c | 8 +-- daemon/sdp.c | 97 +++++++++++------------------------- daemon/sdp.h | 1 + daemon/stun.c | 44 ++++++++-------- 8 files changed, 146 insertions(+), 177 deletions(-) diff --git a/daemon/aux.h b/daemon/aux.h index 4ae7c2e48..62506cd60 100644 --- a/daemon/aux.h +++ b/daemon/aux.h @@ -205,15 +205,20 @@ INLINE int smart_pton(int af, char *src, void *dst) { return inet_pton(af, src, dst); } -INLINE int pton_46(struct in6_addr *dst, const char *src) { +INLINE int pton_46(struct in6_addr *dst, const char *src, int *family) { u_int32_t in4; - if (inet_pton(AF_INET6, src, dst) == 1) + if (inet_pton(AF_INET6, src, dst) == 1) { + if (family) + *family = AF_INET6; return 0; + } in4 = inet_addr(src); if (in4 == INADDR_NONE) return -1; in4_to_6(dst, in4); + if (family) + *family = AF_INET; return 0; } @@ -406,5 +411,12 @@ INLINE void bf_copy(unsigned int *u, unsigned int f, const unsigned int *s, unsi INLINE void bf_copy_same(unsigned int *u, const unsigned int *s, unsigned int g) { bf_copy(u, g, s, g); } +INLINE void g_queue_append(GQueue *dst, const GQueue *src) { + GList *l; + if (!src || !dst) + return; + for (l = src->head; l; l = l->next) + g_queue_push_tail(dst, l->data); +} #endif diff --git a/daemon/call.c b/daemon/call.c index a4fffb37f..ef99c025c 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -404,7 +404,7 @@ void kernelize(struct packet_stream *stream) { mpt.src_addr.family = mpt.dst_addr.family; mpt.src_addr.port = sink->sfd->fd.localport; - ifa = get_first_interface_address(cm, NULL, mpt.src_addr.family); /* XXX */ + ifa = sink->media->local_address; if (mpt.src_addr.family == AF_INET) mpt.src_addr.u.ipv4 = in6_to_4(&ifa->addr); else @@ -534,7 +534,7 @@ noop: goto done; } -void callmaster_msg_mh_src(struct callmaster *cm, struct msghdr *mh) { +void stream_msg_mh_src(struct packet_stream *ps, struct msghdr *mh) { struct cmsghdr *ch; struct in_pktinfo *pi; struct in6_pktinfo *pi6; @@ -543,6 +543,7 @@ void callmaster_msg_mh_src(struct callmaster *cm, struct msghdr *mh) { sin6 = mh->msg_name; + ifa = ps->media->local_address; ch = CMSG_FIRSTHDR(mh); ZERO(*ch); @@ -552,7 +553,6 @@ void callmaster_msg_mh_src(struct callmaster *cm, struct msghdr *mh) { ch->cmsg_level = IPPROTO_IP; ch->cmsg_type = IP_PKTINFO; - ifa = get_first_interface_address(cm, NULL, AF_INET); pi = (void *) CMSG_DATA(ch); ZERO(*pi); pi->ipi_spec_dst.s_addr = in6_to_4(&ifa->addr); @@ -564,7 +564,6 @@ void callmaster_msg_mh_src(struct callmaster *cm, struct msghdr *mh) { ch->cmsg_level = IPPROTO_IPV6; ch->cmsg_type = IPV6_PKTINFO; - ifa = get_first_interface_address(cm, NULL, AF_INET); pi6 = (void *) CMSG_DATA(ch); ZERO(*pi6); pi6->ipi6_addr = ifa->addr; @@ -800,7 +799,7 @@ forward: mutex_unlock(&sink->out_lock); - callmaster_msg_mh_src(cm, &mh); + stream_msg_mh_src(sink, &mh); ZERO(iov); iov.iov_base = s->s; @@ -2021,9 +2020,14 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, unsigned int num_ports; struct call_monologue *monologue = other_ml->active_dialogue; struct endpoint_map *em; + struct call *call; + struct callmaster *cm; + + call = monologue->call; + cm = call->callmaster; - monologue->call->last_signal = poller_now; - monologue->call->deleted = 0; + call->last_signal = poller_now; + call->deleted = 0; /* we must have a complete dialogue, even though the to-tag (monologue->tag) * may not be known yet */ @@ -2033,7 +2037,7 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, } __C_DBG("this="STR_FORMAT" other="STR_FORMAT, STR_FMT(&monologue->tag), STR_FMT(&other_ml->tag)); - __tos_change(monologue->call, flags); + __tos_change(call, flags); ml_media = other_ml_media = NULL; @@ -2108,15 +2112,24 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, other_media->desired_family = AF_INET; if (!IN6_IS_ADDR_V4MAPPED(&sp->rtp_endpoint.ip46)) other_media->desired_family = AF_INET6; - /* for outgoing SDP, use "direction"/DF or default to IPv4 (?) */ + /* for outgoing SDP, use "direction"/DF or default to what was offered */ if (!media->desired_family) - media->desired_family = AF_INET; + media->desired_family = other_media->desired_family; if (sp->desired_family) media->desired_family = sp->desired_family; else if (sp->direction[1] == DIR_EXTERNAL) media->desired_family = AF_INET6; + /* local interface selection XXX */ + media->interface = get_local_interface(cm, NULL); + media->local_address = get_interface_address(media->interface, media->desired_family); + other_media->interface = get_local_interface(cm, NULL); + other_media->local_address = get_interface_address(other_media->interface, + other_media->desired_family); + + + /* we now know what's being advertised by the other side */ MEDIA_SET(other_media, INITIALIZED); @@ -2273,15 +2286,11 @@ void call_destroy(struct call *c) { -typedef int (*csa_func)(char *o, struct packet_stream *ps, enum stream_address_format format, int *len); - -static int call_stream_address4(char *o, struct packet_stream *ps, enum stream_address_format format, int *len) { +static int call_stream_address4(char *o, struct packet_stream *ps, enum stream_address_format format, + int *len, struct interface_address *ifa) +{ u_int32_t ip4; - struct callmaster *m = ps->call->callmaster; int l = 0; - struct interface_address *ifa; - - ifa = get_first_interface_address(m, NULL, AF_INET); if (format == SAF_NG) { strcpy(o + l, "IP4 "); @@ -2301,12 +2310,10 @@ static int call_stream_address4(char *o, struct packet_stream *ps, enum stream_a return AF_INET; } -static int call_stream_address6(char *o, struct packet_stream *ps, enum stream_address_format format, int *len) { - struct callmaster *m = ps->call->callmaster; +static int call_stream_address6(char *o, struct packet_stream *ps, enum stream_address_format format, + int *len, struct interface_address *ifa) +{ int l = 0; - struct interface_address *ifa; - - ifa = get_first_interface_address(m, NULL, AF_INET6); if (format == SAF_NG) { strcpy(o + l, "IP6 "); @@ -2326,57 +2333,29 @@ static int call_stream_address6(char *o, struct packet_stream *ps, enum stream_a return AF_INET6; } -static csa_func __call_stream_address(struct packet_stream *ps, int variant) { - struct callmaster *m; - struct packet_stream *sink; - struct call_media *sink_media; - csa_func variants[2]; - struct interface_address *ifa; - assert(variant >= 0); - assert(variant < G_N_ELEMENTS(variants)); +int call_stream_address46(char *o, struct packet_stream *ps, enum stream_address_format format, + int *len, struct interface_address *ifa) +{ + struct packet_stream *sink; - m = ps->call->callmaster; sink = packet_stream_sink(ps); - sink_media = sink->media; - ifa = get_first_interface_address(m, NULL, AF_INET6); - - variants[0] = call_stream_address4; - variants[1] = call_stream_address6; - - if (!ifa) { - variants[1] = NULL; - goto done; - } - if (sink_media->desired_family == AF_INET) - goto done; - if (sink_media->desired_family == 0 && IN6_IS_ADDR_V4MAPPED(&sink->endpoint.ip46)) - goto done; - if (sink_media->desired_family == 0 && is_addr_unspecified(&sink->advertised_endpoint.ip46)) - goto done; - - variants[0] = call_stream_address6; - variants[1] = call_stream_address4; - goto done; - -done: - return variants[variant]; + if (ifa->family == AF_INET) + return call_stream_address4(o, sink, format, len, ifa); + return call_stream_address6(o, sink, format, len, ifa); } int call_stream_address(char *o, struct packet_stream *ps, enum stream_address_format format, int *len) { - csa_func f; + struct interface_address *ifa; + struct call_media *media; - ps = packet_stream_sink(ps); - f = __call_stream_address(ps, 0); - return f(o, ps, format, len); -} + media = ps->media; -int call_stream_address_alt(char *o, struct packet_stream *ps, enum stream_address_format format, int *len) { - csa_func f; + ifa = media->local_address; + if (!ifa) + return -1; - ps = packet_stream_sink(ps); - f = __call_stream_address(ps, 1); - return f ? f(o, ps, format, len) : -1; + return call_stream_address46(o, ps, format, len, ifa); } @@ -2820,6 +2799,8 @@ void callmaster_config_init(struct callmaster *m) { g_queue_push_tail(&lif->ipv4, ifa); else g_queue_push_tail(&lif->ipv6, ifa); + + sdp_ice_foundation(ifa); } } @@ -2833,27 +2814,35 @@ struct local_interface *get_local_interface(struct callmaster *m, str *name) { return lif; } -struct interface_address *get_first_interface_address(struct callmaster *m, str *name, int family) { - struct local_interface *lif; - GQueue *q; - - lif = get_local_interface(m, name); +const GQueue *get_interface_addresses(struct local_interface *lif, int family) { if (!lif) return NULL; switch (family) { case AF_INET: - q = &lif->ipv4; + return &lif->ipv4; break; case AF_INET6: - q = &lif->ipv6; + return &lif->ipv6; break; default: return NULL; } +} - if (!q->head) - return NULL; +struct interface_address *get_interface_address(struct local_interface *lif, int family) { + const GQueue *q; + q = get_interface_addresses(lif, family); + if (!q || !q->head) + return NULL; return q->head->data; } + +void get_all_interface_addresses(GQueue *q, struct local_interface *lif, int family) { + g_queue_append(q, get_interface_addresses(lif, family)); + if (family == AF_INET) + g_queue_append(q, get_interface_addresses(lif, AF_INET6)); + else + g_queue_append(q, get_interface_addresses(lif, AF_INET)); +} diff --git a/daemon/call.h b/daemon/call.h index 1ec43fe9c..8cf4549fb 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -156,6 +156,7 @@ struct crypto_suite; struct mediaproxy_srtp; struct streamhandler; struct sdp_ng_flags; +struct local_interface; typedef bencode_buffer_t call_buffer_t; @@ -272,6 +273,8 @@ struct call_media { str type; /* RO */ const struct transport_protocol *protocol; int desired_family; + struct local_interface *interface; + struct interface_address *local_address; str ice_ufrag; str ice_pwd; @@ -335,8 +338,11 @@ struct local_interface { }; struct interface_address { str interface_name; + int family; struct in6_addr addr; struct in6_addr advertised; + str ice_foundation; + char foundation_buf[16]; }; struct callmaster_config { @@ -390,7 +396,7 @@ struct call_stats { struct callmaster *callmaster_new(struct poller *); void callmaster_config_init(struct callmaster *); -void callmaster_msg_mh_src(struct callmaster *, struct msghdr *); +void stream_msg_mh_src(struct packet_stream *, struct msghdr *); void callmaster_get_all_calls(struct callmaster *m, GQueue *q); @@ -428,10 +434,13 @@ int call_delete_branch(struct callmaster *m, const str *callid, const str *branc void call_destroy(struct call *); void kernelize(struct packet_stream *); -int call_stream_address_alt(char *, struct packet_stream *, enum stream_address_format, int *); int call_stream_address(char *, struct packet_stream *, enum stream_address_format, int *); +int call_stream_address46(char *o, struct packet_stream *ps, enum stream_address_format format, + int *len, struct interface_address *ifa); struct local_interface *get_local_interface(struct callmaster *m, str *name); -struct interface_address *get_first_interface_address(struct callmaster *m, str *name, int family); +const GQueue *get_interface_addresses(struct local_interface *lif, int family); +struct interface_address *get_interface_address(struct local_interface *lif, int family); +void get_all_interface_addresses(GQueue *q, struct local_interface *lif, int family); const struct transport_protocol *transport_protocol(const str *s); @@ -485,11 +494,6 @@ INLINE str *call_str_init_dup(struct call *c, char *s) { str_init(&t, s); return call_str_dup(c, &t); } -INLINE int callmaster_has_ipv6(struct callmaster *m) { - if (get_first_interface_address(m, NULL, AF_INET6)) - return 1; - return 0; -} INLINE void callmaster_exclude_port(struct callmaster *m, u_int16_t p) { /* XXX atomic bit field? */ mutex_lock(&m->portlock); diff --git a/daemon/dtls.c b/daemon/dtls.c index 699422540..60dacdab7 100644 --- a/daemon/dtls.c +++ b/daemon/dtls.c @@ -660,7 +660,7 @@ int dtls(struct packet_stream *ps, const str *s, struct sockaddr_in6 *fsin) { iov.iov_base = buf; iov.iov_len = ret; - callmaster_msg_mh_src(ps->call->callmaster, &mh); + stream_msg_mh_src(ps, &mh); sendmsg(ps->sfd->fd.fd, &mh, 0); diff --git a/daemon/main.c b/daemon/main.c index 5597e9bd3..159fe79d5 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -261,6 +261,7 @@ static struct interface_address *if_addr_parse(char *s) { char *c; struct in6_addr addr, adv; struct interface_address *ifa; + int family; /* name */ c = strchr(s, '/'); @@ -278,12 +279,12 @@ static struct interface_address *if_addr_parse(char *s) { *c++ = 0; /* address */ - if (pton_46(&addr, s)) + if (pton_46(&addr, s, &family)) return NULL; adv = addr; if (c) { - if (pton_46(&adv, c)) + if (pton_46(&adv, c, NULL)) return NULL; } @@ -291,6 +292,7 @@ static struct interface_address *if_addr_parse(char *s) { ifa->interface_name = name; ifa->addr = addr; ifa->advertised = adv; + ifa->family = family; return ifa; } @@ -319,7 +321,7 @@ static void options(int *argc, char ***argv) { { "tos", 'T', 0, G_OPTION_ARG_INT, &tos, "Default TOS value to set on streams", "INT" }, { "timeout", 'o', 0, G_OPTION_ARG_INT, &timeout, "RTP timeout", "SECS" }, { "silent-timeout",'s',0,G_OPTION_ARG_INT, &silent_timeout,"RTP timeout for muted", "SECS" }, - { "pidfile", 'p', 0, G_OPTION_ARG_STRING, &pidfile, "Write PID to file", "FILE" }, + { "pidfile", 'p', 0, G_OPTION_ARG_FILENAME, &pidfile, "Write PID to file", "FILE" }, { "foreground", 'f', 0, G_OPTION_ARG_NONE, &foreground, "Don't fork to background", NULL }, { "port-min", 'm', 0, G_OPTION_ARG_INT, &port_min, "Lowest port to use for RTP", "INT" }, { "port-max", 'M', 0, G_OPTION_ARG_INT, &port_max, "Highest port to use for RTP", "INT" }, diff --git a/daemon/sdp.c b/daemon/sdp.c index d8ae77e20..37874390c 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -186,10 +186,6 @@ struct sdp_attribute { static const char ice_chars[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; -static char ice_foundation[17]; -static str ice_foundation_str; -static char ice_foundation_alt[17]; -static str ice_foundation_str_alt; @@ -1235,22 +1231,11 @@ warn: return 0; } -static int insert_ice_address(struct sdp_chopper *chop, struct packet_stream *ps) { +static int insert_ice_address(struct sdp_chopper *chop, struct packet_stream *ps, struct interface_address *ifa) { char buf[64]; int len; - call_stream_address(buf, ps, SAF_ICE, &len); - chopper_append_dup(chop, buf, len); - chopper_append_printf(chop, " %hu", ps->sfd->fd.localport); - - return 0; -} - -static int insert_ice_address_alt(struct sdp_chopper *chop, struct packet_stream *ps) { - char buf[64]; - int len; - - call_stream_address_alt(buf, ps, SAF_ICE, &len); + call_stream_address46(buf, ps, SAF_ICE, &len, ifa); chopper_append_dup(chop, buf, len); chopper_append_printf(chop, " %hu", ps->sfd->fd.localport); @@ -1508,53 +1493,40 @@ static void insert_candidates(struct sdp_chopper *chop, struct packet_stream *rt unsigned long priority, struct sdp_media *media, unsigned int relay) { - chopper_append_c(chop, "a=candidate:"); - chopper_append_str(chop, &ice_foundation_str); - chopper_append_printf(chop, " 1 UDP %lu ", priority); - insert_ice_address(chop, rtp); - if (relay) - chopper_append_c(chop, " typ relay\r\n"); - else - chopper_append_c(chop, " typ host\r\n"); - - if (rtcp) { - /* rtcp-mux only possible in answer */ - chopper_append_c(chop, "a=candidate:"); - chopper_append_str(chop, &ice_foundation_str); - chopper_append_printf(chop, " 2 UDP %lu ", priority - 1); - insert_ice_address(chop, rtcp); - if (relay) - chopper_append_c(chop, " typ relay\r\n"); - else - chopper_append_c(chop, " typ host\r\n"); - } + GQueue addrs = G_QUEUE_INIT; + GList *l; + struct interface_address *ifa; -} + get_all_interface_addresses(&addrs, rtp->media->interface, rtp->media->desired_family); -static void insert_candidates_alt(struct sdp_chopper *chop, struct packet_stream *rtp, struct packet_stream *rtcp, - unsigned long priority, struct sdp_media *media, - unsigned int relay) -{ - chopper_append_c(chop, "a=candidate:"); - chopper_append_str(chop, &ice_foundation_str_alt); - chopper_append_printf(chop, " 1 UDP %lu ", priority); - insert_ice_address_alt(chop, rtp); - if (relay) - chopper_append_c(chop, " typ relay\r\n"); - else - chopper_append_c(chop, " typ host\r\n"); + for (l = addrs.head; l; l = l->next) { + ifa = l->data; - if (rtcp) { chopper_append_c(chop, "a=candidate:"); - chopper_append_str(chop, &ice_foundation_str_alt); - chopper_append_printf(chop, " 2 UDP %lu ", priority - 1); - insert_ice_address_alt(chop, rtcp); + chopper_append_str(chop, &ifa->ice_foundation); + chopper_append_printf(chop, " 1 UDP %lu ", priority); + insert_ice_address(chop, rtp, ifa); if (relay) chopper_append_c(chop, " typ relay\r\n"); else chopper_append_c(chop, " typ host\r\n"); + + if (rtcp) { + /* rtcp-mux only possible in answer */ + chopper_append_c(chop, "a=candidate:"); + chopper_append_str(chop, &ifa->ice_foundation); + chopper_append_printf(chop, " 2 UDP %lu ", priority - 1); + insert_ice_address(chop, rtcp, ifa); + if (relay) + chopper_append_c(chop, " typ relay\r\n"); + else + chopper_append_c(chop, " typ host\r\n"); + } + + priority -= 256; } + g_queue_clear(&addrs); } static int has_ice(GQueue *sessions) { @@ -1814,13 +1786,6 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu insert_candidates(chop, ps, ps_rtcp, priority, sdp_media, flags->ice_force_relay); - - if (callmaster_has_ipv6(call->callmaster)) { - priority -= 256; - insert_candidates_alt(chop, ps, ps_rtcp, - priority, sdp_media, - flags->ice_force_relay); - } } next: @@ -1838,11 +1803,9 @@ error: } void sdp_init() { - random_ice_string(ice_foundation, sizeof(ice_foundation) - 1); - ice_foundation_str.s = ice_foundation; - ice_foundation_str.len = sizeof(ice_foundation) - 1; +} - random_ice_string(ice_foundation_alt, sizeof(ice_foundation_alt) - 1); - ice_foundation_str_alt.s = ice_foundation_alt; - ice_foundation_str_alt.len = sizeof(ice_foundation_alt) - 1; +void sdp_ice_foundation(struct interface_address *ifa) { + random_ice_string(ifa->foundation_buf, sizeof(ifa->foundation_buf)); + str_init_len(&ifa->ice_foundation, ifa->foundation_buf, sizeof(ifa->foundation_buf)); } diff --git a/daemon/sdp.h b/daemon/sdp.h index ccafaae39..678379c06 100644 --- a/daemon/sdp.h +++ b/daemon/sdp.h @@ -44,6 +44,7 @@ struct sdp_chopper { }; void sdp_init(void); +void sdp_ice_foundation(struct interface_address *ifa); int sdp_parse(str *body, GQueue *sessions); int sdp_streams(const GQueue *sessions, GQueue *streams, struct sdp_ng_flags *); diff --git a/daemon/stun.c b/daemon/stun.c index f14746831..99fc76950 100644 --- a/daemon/stun.c +++ b/daemon/stun.c @@ -228,13 +228,13 @@ INLINE void __output_add(struct msghdr *mh, struct tlv *tlv, unsigned int len, u __output_add(mh, &(attr)->tlv, sizeof(*(attr)), code, data, len) -static void output_finish(struct msghdr *mh, struct callmaster *cm) { +static void output_finish(struct msghdr *mh, struct packet_stream *ps) { struct header *hdr; hdr = mh->msg_iov->iov_base; hdr->msg_len = htons(hdr->msg_len); - callmaster_msg_mh_src(cm, mh); + stream_msg_mh_src(ps, mh); } static void fingerprint(struct msghdr *mh, struct fingerprint *fp) { @@ -284,9 +284,9 @@ static void integrity(struct msghdr *mh, struct msg_integrity *mi, str *pwd) { hdr->msg_len = ntohs(hdr->msg_len); } -static void stun_error_len(int fd, struct sockaddr_in6 *sin, struct header *req, +static void stun_error_len(struct packet_stream *ps, struct sockaddr_in6 *sin, struct header *req, int code, char *reason, int len, u_int16_t add_attr, void *attr_cont, - int attr_len, struct callmaster *cm) + int attr_len) { struct header hdr; struct error_code ec; @@ -305,16 +305,16 @@ static void stun_error_len(int fd, struct sockaddr_in6 *sin, struct header *req, fingerprint(&mh, &fp); - output_finish(&mh, cm); - sendmsg(fd, &mh, 0); + output_finish(&mh, ps); + sendmsg(ps->sfd->fd.fd, &mh, 0); } -#define stun_error(cm, fd, sin, str, code, reason) \ - stun_error_len(fd, sin, str, code, reason "\0\0\0", strlen(reason), \ - 0, NULL, 0, cm) -#define stun_error_attrs(cm, fd, sin, str, code, reason, type, content, len) \ - stun_error_len(fd, sin, str, code, reason "\0\0\0", strlen(reason), \ - type, content, len, cm) +#define stun_error(ps, sin, str, code, reason) \ + stun_error_len(ps, sin, str, code, reason "\0\0\0", strlen(reason), \ + 0, NULL, 0) +#define stun_error_attrs(ps, sin, str, code, reason, type, content, len) \ + stun_error_len(ps, sin, str, code, reason "\0\0\0", strlen(reason), \ + type, content, len) @@ -367,8 +367,8 @@ static int check_auth(str *msg, struct stun_attrs *attrs, struct call_media *med return memcmp(digest, attrs->msg_integrity.s, 20) ? -1 : 0; } -static int stun_binding_success(int fd, struct header *req, struct stun_attrs *attrs, - struct sockaddr_in6 *sin, struct call_media *media) +static int stun_binding_success(struct packet_stream *ps, struct header *req, struct stun_attrs *attrs, + struct sockaddr_in6 *sin) { struct header hdr; struct xor_mapped_address xma; @@ -377,7 +377,6 @@ static int stun_binding_success(int fd, struct header *req, struct stun_attrs *a struct msghdr mh; struct iovec iov[4]; /* hdr, xma, mi, fp */ unsigned char buf[256]; - struct callmaster *cm = media->call->callmaster; output_init(&mh, iov, sin, &hdr, STUN_BINDING_SUCCESS_RESPONSE, req->transaction, buf, sizeof(buf)); @@ -396,11 +395,11 @@ static int stun_binding_success(int fd, struct header *req, struct stun_attrs *a output_add(&mh, &xma, STUN_XOR_MAPPED_ADDRESS); } - integrity(&mh, &mi, &media->ice_pwd); + integrity(&mh, &mi, &ps->media->ice_pwd); fingerprint(&mh, &fp); - output_finish(&mh, cm); - sendmsg(fd, &mh, 0); + output_finish(&mh, ps); + sendmsg(ps->sfd->fd.fd, &mh, 0); return 0; } @@ -428,7 +427,6 @@ int stun(str *b, struct packet_stream *ps, struct sockaddr_in6 *sin) { u_int16_t unknowns[UNKNOWNS_COUNT]; const char *err; char addr[64]; - struct callmaster *cm = ps->call->callmaster; smart_ntop_port(addr, sin, sizeof(addr)); @@ -454,7 +452,7 @@ int stun(str *b, struct packet_stream *ps, struct sockaddr_in6 *sin) { goto ignore; ilog(LOG_WARNING, "STUN packet contained unknown " "\"comprehension required\" attribute(s)" SLF, SLP); - stun_error_attrs(cm, ps->sfd->fd.fd, sin, req, 420, "Unknown attribute", + stun_error_attrs(ps, sin, req, 420, "Unknown attribute", STUN_UNKNOWN_ATTRIBUTES, unknowns, u_int16_t_arr_len(unknowns) * 2); return 0; @@ -480,17 +478,17 @@ int stun(str *b, struct packet_stream *ps, struct sockaddr_in6 *sin) { goto unauth; ilog(LOG_INFO, "Successful STUN binding request" SLF, SLP); - stun_binding_success(ps->sfd->fd.fd, req, &attrs, sin, ps->media); + stun_binding_success(ps, req, &attrs, sin); return attrs.use ? 1 : 0; bad_req: ilog(LOG_NOTICE, "Received invalid STUN packet" SLF ": %s", SLP, err); - stun_error(cm, ps->sfd->fd.fd, sin, req, 400, "Bad request"); + stun_error(ps, sin, req, 400, "Bad request"); return 0; unauth: ilog(LOG_NOTICE, "STUN authentication mismatch" SLF, SLP); - stun_error(cm, ps->sfd->fd.fd, sin, req, 401, "Unauthorized"); + stun_error(ps, sin, req, 401, "Unauthorized"); return 0; ignore: ilog(LOG_NOTICE, "Not handling potential STUN packet" SLF ": %s", SLP, err);