summaryrefslogtreecommitdiff
path: root/pjnath/src/pjnath/turn_session.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjnath/src/pjnath/turn_session.c')
-rw-r--r--pjnath/src/pjnath/turn_session.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/pjnath/src/pjnath/turn_session.c b/pjnath/src/pjnath/turn_session.c
index 521bf978..d3ff6ced 100644
--- a/pjnath/src/pjnath/turn_session.c
+++ b/pjnath/src/pjnath/turn_session.c
@@ -724,6 +724,12 @@ PJ_DEF(pj_status_t) pj_turn_session_alloc(pj_turn_session *sess,
sess->state<=PJ_TURN_STATE_RESOLVED,
PJ_EINVALIDOP);
+ /* Verify address family in allocation param */
+ if (param && param->af) {
+ PJ_ASSERT_RETURN(param->af==pj_AF_INET() || param->af==pj_AF_INET6(),
+ PJ_EINVAL);
+ }
+
pj_grp_lock_acquire(sess->grp_lock);
if (param && param != &sess->alloc_param)
@@ -770,11 +776,21 @@ PJ_DEF(pj_status_t) pj_turn_session_alloc(pj_turn_session *sess,
sess->alloc_param.lifetime);
}
- /* Include ADDRESS-FAMILY for IPv6 request */
- if (sess->af == pj_AF_INET6()) {
- enum { IPV6_AF_TYPE = 0x02 << 24 };
- pj_stun_msg_add_uint_attr(tdata->pool, tdata->msg,
- PJ_STUN_ATTR_REQ_ADDR_TYPE, IPV6_AF_TYPE);
+ /* Include ADDRESS-FAMILY if requested */
+ if (sess->alloc_param.af || sess->af == pj_AF_INET6()) {
+ enum { IPV4_AF_TYPE = 0x01 << 24,
+ IPV6_AF_TYPE = 0x02 << 24 };
+
+ if (sess->alloc_param.af == pj_AF_INET6() ||
+ (sess->alloc_param.af == 0 && sess->af == pj_AF_INET6()))
+ {
+ pj_stun_msg_add_uint_attr(tdata->pool, tdata->msg,
+ PJ_STUN_ATTR_REQ_ADDR_TYPE, IPV6_AF_TYPE);
+ } else if (sess->alloc_param.af == pj_AF_INET()) {
+ /* For IPv4, only add the attribute when explicitly requested */
+ pj_stun_msg_add_uint_attr(tdata->pool, tdata->msg,
+ PJ_STUN_ATTR_REQ_ADDR_TYPE, IPV4_AF_TYPE);
+ }
}
/* Server address must be set */
@@ -1358,7 +1374,12 @@ static void on_allocate_success(pj_turn_session *sess,
"RELAY-ADDRESS attribute"));
return;
}
- if (raddr_attr && raddr_attr->sockaddr.addr.sa_family != sess->af) {
+ if (raddr_attr &&
+ ((sess->alloc_param.af != 0 &&
+ raddr_attr->sockaddr.addr.sa_family != sess->alloc_param.af) ||
+ (sess->alloc_param.af == 0 &&
+ raddr_attr->sockaddr.addr.sa_family != sess->af)))
+ {
on_session_fail(sess, method, PJNATH_EINSTUNMSG,
pj_cstr(&s, "Error: Mismatched RELAY-ADDRESS "
"address family"));