summaryrefslogtreecommitdiff
path: root/res/res_pjsip
diff options
context:
space:
mode:
authorGeorge Joseph <gjoseph@digium.com>2016-05-15 18:05:34 -0600
committerGeorge Joseph <gjoseph@digium.com>2016-05-15 18:05:34 -0600
commitb6f9392a122a905ebf1925c8b00ababa8ad04125 (patch)
tree39bbbec3a9098a131eda502a30da60731010aabc /res/res_pjsip
parent12db14b9b1f690c7a599d0dea36c5ec64a8f5422 (diff)
res_pjsip: Set TCP_NODELAY on TCP transports
Although it's perfectly legal to place multiple SIP messages in the same packet, it can cause problems because the Linux default is to enable Path MTU Discovery which sets the Don't Fragment bit on the packets. If adding a second message to the packet causes the MTU to be exceeded, and the destination isn't equipped to send a FRAGMENTATION NEEDED response to a large packet, the packet will just be dropped. We can't specifically tell the stack to send only 1 message per packet, but we can turn on TCP_NODELAY when we create the transport. This will at least tell the stack to send packets as soon as possible. ASTERISK-26005 #close Reported-by: Ross Beer Change-Id: I820f23227183f2416ca5e393bec510e8fe1c8fbd
Diffstat (limited to 'res/res_pjsip')
-rw-r--r--res/res_pjsip/config_transport.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c
index 3a5afb6bc..b9208976f 100644
--- a/res/res_pjsip/config_transport.c
+++ b/res/res_pjsip/config_transport.c
@@ -562,11 +562,17 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
}
} else if (transport->type == AST_TRANSPORT_TCP) {
pjsip_tcp_transport_cfg cfg;
+ int option = 1;
pjsip_tcp_transport_cfg_default(&cfg, temp_state->state->host.addr.sa_family);
cfg.bind_addr = temp_state->state->host;
cfg.async_cnt = transport->async_operations;
set_qos(transport, &cfg.qos_params);
+ cfg.sockopt_params.options[0].level = pj_SOL_TCP();
+ cfg.sockopt_params.options[0].optname = pj_TCP_NODELAY();
+ cfg.sockopt_params.options[0].optval = &option;
+ cfg.sockopt_params.options[0].optlen = sizeof(option);
+ cfg.sockopt_params.cnt = 1;
for (i = 0; i < BIND_TRIES && res != PJ_SUCCESS; i++) {
if (perm_state && perm_state->state && perm_state->state->factory