|
|
@ -258,7 +258,7 @@ static void output_init(struct msghdr *mh, struct iovec *iov, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
INLINE void __output_add(struct msghdr *mh, struct tlv *tlv, unsigned int len, u_int16_t code, |
|
|
INLINE void __output_add(struct msghdr *mh, struct tlv *tlv, unsigned int len, u_int16_t code, |
|
|
void *append, unsigned int append_len) |
|
|
|
|
|
|
|
|
void *append, unsigned int append_len, int writable) |
|
|
{ |
|
|
{ |
|
|
struct iovec *iov; |
|
|
struct iovec *iov; |
|
|
struct header *hdr; |
|
|
struct header *hdr; |
|
|
@ -278,21 +278,21 @@ INLINE void __output_add(struct msghdr *mh, struct tlv *tlv, unsigned int len, u |
|
|
iov->iov_base = append; /* must have space for padding */ |
|
|
iov->iov_base = append; /* must have space for padding */ |
|
|
iov->iov_len = (append_len + 3) & 0xfffc; |
|
|
iov->iov_len = (append_len + 3) & 0xfffc; |
|
|
|
|
|
|
|
|
if ((append_len & 0x3)) { |
|
|
|
|
|
if (memcmp(append + append_len, "\0\0\0", 4 - (append_len & 0x3))) |
|
|
|
|
|
memset(append + append_len, 0, 4 - (append_len & 0x3)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (writable && (append_len & 0x3)) // if not writable, buffer must have trailing \0\0\0 |
|
|
|
|
|
memset(append + append_len, 0, 4 - (append_len & 0x3)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#define output_add(mh, attr, code) \ |
|
|
#define output_add(mh, attr, code) \ |
|
|
__output_add(mh, &(attr)->tlv, sizeof(*(attr)), code, NULL, 0) |
|
|
|
|
|
|
|
|
__output_add(mh, &(attr)->tlv, sizeof(*(attr)), code, NULL, 0, 0) |
|
|
#define output_add_len(mh, attr, code, len) \ |
|
|
#define output_add_len(mh, attr, code, len) \ |
|
|
__output_add(mh, &(attr)->tlv, len + sizeof(struct tlv), code, NULL, 0) |
|
|
|
|
|
#define output_add_data(mh, attr, code, data, len) \ |
|
|
|
|
|
__output_add(mh, &(attr)->tlv, sizeof(*(attr)), code, data, len) |
|
|
|
|
|
|
|
|
__output_add(mh, &(attr)->tlv, len + sizeof(struct tlv), code, NULL, 0, 0) |
|
|
|
|
|
#define output_add_data_wr(mh, attr, code, data, len) \ |
|
|
|
|
|
__output_add(mh, &(attr)->tlv, sizeof(*(attr)), code, data, len, 1) |
|
|
|
|
|
#define output_add_data_ro(mh, attr, code, data, len) \ |
|
|
|
|
|
__output_add(mh, &(attr)->tlv, sizeof(*(attr)), code, data, len, 0) |
|
|
#define output_add_data_len_pad(mh, attr, code, data, len) \ |
|
|
#define output_add_data_len_pad(mh, attr, code, data, len) \ |
|
|
__output_add(mh, &(attr)->tlv, sizeof((attr)->tlv), code, data, len) |
|
|
|
|
|
|
|
|
__output_add(mh, &(attr)->tlv, sizeof((attr)->tlv), code, data, len, 1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void __output_finish(struct msghdr *mh) { |
|
|
static void __output_finish(struct msghdr *mh) { |
|
|
@ -307,7 +307,7 @@ static void output_finish_src(struct msghdr *mh) { |
|
|
|
|
|
|
|
|
static void software(struct msghdr *mh, struct software *sw) { |
|
|
static void software(struct msghdr *mh, struct software *sw) { |
|
|
int i; |
|
|
int i; |
|
|
i = snprintf(sw->str, sizeof(sw->str) - 1, "rtpengine-%s", RTPENGINE_VERSION); |
|
|
|
|
|
|
|
|
i = snprintf(sw->str, sizeof(sw->str), "rtpengine-%s", RTPENGINE_VERSION); |
|
|
output_add_data_len_pad(mh, sw, STUN_SOFTWARE, sw->str, i); |
|
|
output_add_data_len_pad(mh, sw, STUN_SOFTWARE, sw->str, i); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -389,9 +389,9 @@ static void stun_error_len(struct stream_fd *sfd, const endpoint_t *sin, |
|
|
software(&mh, &sw); |
|
|
software(&mh, &sw); |
|
|
|
|
|
|
|
|
ec.codes = htonl(((code / 100) << 8) | (code % 100)); |
|
|
ec.codes = htonl(((code / 100) << 8) | (code % 100)); |
|
|
output_add_data(&mh, &ec, STUN_ERROR_CODE, reason, len); |
|
|
|
|
|
|
|
|
output_add_data_ro(&mh, &ec, STUN_ERROR_CODE, reason, len); |
|
|
if (attr_cont) |
|
|
if (attr_cont) |
|
|
output_add_data(&mh, &aa, add_attr, attr_cont, attr_len); |
|
|
|
|
|
|
|
|
output_add_data_wr(&mh, &aa, add_attr, attr_cont, attr_len); |
|
|
|
|
|
|
|
|
integrity(&mh, &mi, &sfd->stream->media->ice_agent->pwd[0]); |
|
|
integrity(&mh, &mi, &sfd->stream->media->ice_agent->pwd[0]); |
|
|
fingerprint(&mh, &fp); |
|
|
fingerprint(&mh, &fp); |
|
|
@ -665,7 +665,7 @@ int stun_binding_request(const endpoint_t *dst, u_int32_t transaction[3], str *p |
|
|
STR_FMT(&ufrags[0]), STR_FMT(&ufrags[1])); |
|
|
STR_FMT(&ufrags[0]), STR_FMT(&ufrags[1])); |
|
|
if (i <= 0 || i >= sizeof(username_buf)) |
|
|
if (i <= 0 || i >= sizeof(username_buf)) |
|
|
return -1; |
|
|
return -1; |
|
|
output_add_data(&mh, &un_attr, STUN_USERNAME, username_buf, i); |
|
|
|
|
|
|
|
|
output_add_data_wr(&mh, &un_attr, STUN_USERNAME, username_buf, i); |
|
|
|
|
|
|
|
|
cc.tiebreaker = htobe64(tiebreaker); |
|
|
cc.tiebreaker = htobe64(tiebreaker); |
|
|
output_add(&mh, &cc, controlling ? STUN_ICE_CONTROLLING : STUN_ICE_CONTROLLED); |
|
|
output_add(&mh, &cc, controlling ? STUN_ICE_CONTROLLING : STUN_ICE_CONTROLLED); |
|
|
|