summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsip/sip_util.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-05-29 13:04:03 +0000
committerBenny Prijono <bennylp@teluu.com>2009-05-29 13:04:03 +0000
commit08640cc9411ca092e6456304bcce41f81b3bd3ce (patch)
tree6d1ad4e6304b1fb8d95b00858648cfbcd829a2ea /pjsip/src/pjsip/sip_util.c
parentad8907b8ea9f5715c05b19b41ea7b85509591153 (diff)
Integration of Sipit24 branch, many tickets involved:
- #793: AMR encoder should regard 'mode-set' param specified by remote decoder. - #831: Automatically switch to TCP transport when sending large request - #832: Support for outbound proxy setting without using Route header - #849: Modify conference audio switch behavior in connecting ports. - #850: Remove 'Require=replaces' param in 'Refer-To' header (in call transfer with replaces). - #851: Support for regular nomination in ICE - #852: --ip-addr support for IPv6 for media transport in pjsua - #854: Adding SOFTWARE attribute in all outgoing requests may cause compatibility problem with older STUN server (thanks Alexei Kuznetsov for the report) - #855: Bug in digit map frequencies for DTMF digits (thanks FCCH for the report) - #856: Put back the ICE candidate priority values according to the default values in the draft-mmusic-ice - #857: Support for ICE keep-alive with Binding indication - #858: Do not authenticate STUN 438 response - #859: AMR-WB format param in the SDP is not negotiated correctly. - #867: Return error instead of asserting when PJSUA-LIB fails to open log file git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2724 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsip/sip_util.c')
-rw-r--r--pjsip/src/pjsip/sip_util.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/pjsip/src/pjsip/sip_util.c b/pjsip/src/pjsip/sip_util.c
index 381ccade..faf8bdb6 100644
--- a/pjsip/src/pjsip/sip_util.c
+++ b/pjsip/src/pjsip/sip_util.c
@@ -1135,6 +1135,8 @@ static void stateless_send_transport_cb( void *token,
via->sent_by = stateless_data->cur_transport->local_name;
via->rport_param = 0;
+ pjsip_tx_data_invalidate_msg(tdata);
+
/* Send message using this transport. */
status = pjsip_transport_send( stateless_data->cur_transport,
tdata,
@@ -1181,6 +1183,51 @@ stateless_send_resolver_callback( pj_status_t status,
/* Copy server addresses */
pj_memcpy( &stateless_data->addr, addr, sizeof(pjsip_server_addresses));
+ /* RFC 3261 section 18.1.1:
+ * If a request is within 200 bytes of the path MTU, or if it is larger
+ * than 1300 bytes and the path MTU is unknown, the request MUST be sent
+ * using an RFC 2914 [43] congestion controlled transport protocol, such
+ * as TCP.
+ */
+ if (stateless_data->tdata->msg->type == PJSIP_REQUEST_MSG &&
+ addr->count > 0 &&
+ addr->entry[0].type == PJSIP_TRANSPORT_UDP)
+ {
+ int len;
+
+ /* Encode the request */
+ status = pjsip_tx_data_encode(stateless_data->tdata);
+ if (status != PJ_SUCCESS) {
+ if (stateless_data->app_cb) {
+ pj_bool_t cont = PJ_FALSE;
+ (*stateless_data->app_cb)(stateless_data, -status, &cont);
+ }
+ pjsip_tx_data_dec_ref(stateless_data->tdata);
+ return;
+ }
+
+ /* Check if request message is larger than 1300 bytes. */
+ len = stateless_data->tdata->buf.cur -
+ stateless_data->tdata->buf.start;
+ if (len >= PJSIP_UDP_SIZE_THRESHOLD) {
+ int i;
+ int count = stateless_data->addr.count;
+
+ /* Insert "TCP version" of resolved UDP addresses at the
+ * beginning.
+ */
+ if (count * 2 > PJSIP_MAX_RESOLVED_ADDRESSES)
+ count = PJSIP_MAX_RESOLVED_ADDRESSES / 2;
+ for (i = 0; i < count; ++i) {
+ pj_memcpy(&stateless_data->addr.entry[i+count],
+ &stateless_data->addr.entry[i],
+ sizeof(stateless_data->addr.entry[0]));
+ stateless_data->addr.entry[i].type = PJSIP_TRANSPORT_TCP;
+ }
+ stateless_data->addr.count = count * 2;
+ }
+ }
+
/* Process the addresses. */
stateless_send_transport_cb( stateless_data, stateless_data->tdata,
-PJ_EPENDING);