Browse Source

incorporate new local-interface infrastructure into appropriate places

pull/26/head
Richard Fuchs 11 years ago
parent
commit
513ac44a84
8 changed files with 146 additions and 177 deletions
  1. +14
    -2
      daemon/aux.h
  2. +62
    -73
      daemon/call.c
  3. +12
    -8
      daemon/call.h
  4. +1
    -1
      daemon/dtls.c
  5. +5
    -3
      daemon/main.c
  6. +30
    -67
      daemon/sdp.c
  7. +1
    -0
      daemon/sdp.h
  8. +21
    -23
      daemon/stun.c

+ 14
- 2
daemon/aux.h View File

@ -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

+ 62
- 73
daemon/call.c View File

@ -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));
}

+ 12
- 8
daemon/call.h View File

@ -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);


+ 1
- 1
daemon/dtls.c View File

@ -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);


+ 5
- 3
daemon/main.c View File

@ -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" },


+ 30
- 67
daemon/sdp.c View File

@ -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));
}

+ 1
- 0
daemon/sdp.h View File

@ -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 *);


+ 21
- 23
daemon/stun.c View File

@ -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);


Loading…
Cancel
Save