Module: kamailio
Branch: master
Commit: a022dbd6b30d8301053950756cd30a2b478433e0
URL:
https://github.com/kamailio/kamailio/commit/a022dbd6b30d8301053950756cd30a2…
Author: Henning Westerholt <hw(a)gilawa.com>
Committer: Henning Westerholt <hw(a)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/a022dbd6b30d8301053950756cd30a2…
Patch:
https://github.com/kamailio/kamailio/commit/a022dbd6b30d8301053950756cd30a2…
---
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){