diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-06-21 17:52:17 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-06-21 17:52:17 +0000 |
commit | f0aebf3f34fee9b2597cca6ea4d364f68fa427ac (patch) | |
tree | 84f029365d4ea93ffdb05086a9e2044200ece2ab /pjnath | |
parent | 947b02aaa62b13463265ad577cfaf35e576e1ba7 (diff) |
Optimize TURN client to send Send Indication without allocating a pool
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2045 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r-- | pjnath/src/pjnath/turn_session.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/pjnath/src/pjnath/turn_session.c b/pjnath/src/pjnath/turn_session.c index 0176e139..05059820 100644 --- a/pjnath/src/pjnath/turn_session.c +++ b/pjnath/src/pjnath/turn_session.c @@ -103,6 +103,7 @@ struct pj_turn_session pj_hash_table_t *peer_table; + pj_uint32_t send_ind_tsx_id[3]; /* tx_pkt must be 16bit aligned */ pj_uint8_t tx_pkt[PJ_TURN_MAX_PKT_LEN]; @@ -800,28 +801,43 @@ PJ_DEF(pj_status_t) pj_turn_session_sendto( pj_turn_session *sess, /* Peer has not been assigned Channel number, must use Send * Indication. */ - pj_stun_tx_data *tdata; + pj_stun_sockaddr_attr peer_attr; + pj_stun_binary_attr data_attr; + pj_stun_msg send_ind; + pj_size_t send_ind_len; + + /* Increment counter */ + ++sess->send_ind_tsx_id[3]; /* Create blank SEND-INDICATION */ - status = pj_stun_session_create_ind(sess->stun, - PJ_STUN_SEND_INDICATION, &tdata); + status = pj_stun_msg_init(&send_ind, PJ_STUN_SEND_INDICATION, + PJ_STUN_MAGIC, + (const pj_uint8_t*)sess->send_ind_tsx_id); if (status != PJ_SUCCESS) goto on_return; /* Add PEER-ADDRESS */ - pj_stun_msg_add_sockaddr_attr(tdata->pool, tdata->msg, - PJ_STUN_ATTR_PEER_ADDR, PJ_TRUE, - addr, addr_len); + pj_stun_sockaddr_attr_init(&peer_attr, PJ_STUN_ATTR_PEER_ADDR, + PJ_TRUE, addr, addr_len); + pj_stun_msg_add_attr(&send_ind, (pj_stun_attr_hdr*)&peer_attr); /* Add DATA attribute */ - pj_stun_msg_add_binary_attr(tdata->pool, tdata->msg, - PJ_STUN_ATTR_DATA, pkt, pkt_len); - - /* Send the indication */ - status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE, - PJ_FALSE, sess->srv_addr, - pj_sockaddr_get_len(sess->srv_addr), - tdata); + pj_stun_binary_attr_init(&data_attr, NULL, PJ_STUN_ATTR_DATA, NULL, 0); + data_attr.data = (void*)pkt; + data_attr.length = pkt_len; + pj_stun_msg_add_attr(&send_ind, (pj_stun_attr_hdr*)&data_attr); + + /* Encode the message */ + status = pj_stun_msg_encode(&send_ind, sess->tx_pkt, + sizeof(sess->tx_pkt), 0, + NULL, &send_ind_len); + if (status != PJ_SUCCESS) + goto on_return; + + /* Send the Send Indication */ + status = sess->cb.on_send_pkt(sess, sess->tx_pkt, send_ind_len, + sess->srv_addr, + pj_sockaddr_get_len(sess->srv_addr)); } on_return: |