Module: kamailio Branch: master Commit: a022dbd6b30d8301053950756cd30a2b478433e0 URL: https://github.com/kamailio/kamailio/commit/a022dbd6b30d8301053950756cd30a2b...
Author: Henning Westerholt hw@gilawa.com Committer: Henning Westerholt hw@gilawa.com Date: 2022-08-21T12:38:16Z
core: add pmtu_discovery=2 for IPv4 and IPv6 - set IP_PMTUDISC_WANT/IPV6_PMTUDISC_WANT (GH #3141)
- add pmtu_discovery=2 for IPv4 and IPv6 - set IP_PMTUDISC_WANT/IPV6_PMTUDISC_WANT - related to GH #3141 - for IPv4: will fragment a datagram if needed according to the path MTU, or will set the don't-fragment flag otherwise - for IPv6: will fragment a datagram if needed according to the path MTU for IPv6
---
Modified: src/core/udp_server.c
---
Diff: https://github.com/kamailio/kamailio/commit/a022dbd6b30d8301053950756cd30a2b... Patch: https://github.com/kamailio/kamailio/commit/a022dbd6b30d8301053950756cd30a2b...
---
diff --git a/src/core/udp_server.c b/src/core/udp_server.c index 7c501f0dab..3edf485199 100644 --- a/src/core/udp_server.c +++ b/src/core/udp_server.c @@ -349,9 +349,19 @@ int udp_init(struct socket_info* sock_info) #endif #if defined (__OS_linux) if (addr->s.sa_family==AF_INET){ - /* If pmtu_discovery=1 then set DF bit and do Path MTU discovery - * disabled by default. Specific to IPv4. */ - optval= (pmtu_discovery) ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT; + /* If pmtu_discovery=1 then set DF bit and do Path MTU discovery, + * disabled by default. Specific to IPv4. If pmtu_discovery=2 + * then the datagram will be fragmented if needed according to + * path MTU, or will set the don't-fragment flag otherwise */ + switch (pmtu_discovery) { + case 1: optval=IP_PMTUDISC_DO; + break; + case 2: optval=IP_PMTUDISC_WANT; + break; + case 0: + default: optval=IP_PMTUDISC_DONT; + break; + } if(setsockopt(sock_info->socket, IPPROTO_IP, IP_MTU_DISCOVER, (void*)&optval, sizeof(optval)) ==-1){ LM_ERR("IPv4 setsockopt: %s\n", strerror(errno)); @@ -359,9 +369,19 @@ int udp_init(struct socket_info* sock_info) } } else if (addr->s.sa_family==AF_INET6){ /* IPv6 never fragments but sends ICMPv6 Packet too Big, - * If pmtu_discovery=1 then set DF bit and do Path MTU discovery - * disabled by default. Specific to IPv6. */ - optval= (pmtu_discovery) ? IPV6_PMTUDISC_DO : IPV6_PMTUDISC_DONT; + * If pmtu_discovery=1 then set DF bit and do Path MTU discovery, + * disabled by default. Specific to IPv6. If pmtu_discovery=2 + * then the datagram will be fragmented if needed according to + * path MTU */ + switch (pmtu_discovery) { + case 1: optval=IPV6_PMTUDISC_DO; + break; + case 2: optval=IPV6_PMTUDISC_WANT; + break; + case 0: + default: optval=IPV6_PMTUDISC_DONT; + break; + } if(setsockopt(sock_info->socket, IPPROTO_IPV6, IPV6_MTU_DISCOVER, (void*)&optval, sizeof(optval)) ==-1){