diff --git a/cfg.lex b/cfg.lex index db3b6deb9de..73e4b83c48f 100644 --- a/cfg.lex +++ b/cfg.lex @@ -326,6 +326,7 @@ CR \n ANY "any" ANYCAST "anycast" +FRAG "frag" COM_LINE # @@ -581,6 +582,7 @@ SPACE [ ] {CR} { count();/* return CR;*/ } {ANY} { count(); return ANY; } {ANYCAST} { count(); return ANYCAST; } +{FRAG} { count(); return FRAG; } {SLASH} { count(); return SLASH; } {SCALE_UP_TO} { count(); return SCALE_UP_TO; } {SCALE_DOWN_TO} { count(); return SCALE_DOWN_TO; } diff --git a/cfg.y b/cfg.y index 947d5dbae44..d23d7a25cc8 100644 --- a/cfg.y +++ b/cfg.y @@ -430,6 +430,7 @@ extern int cfg_parse_only_routes; %token COLON %token ANY %token ANYCAST +%token FRAG %token SCRIPTVARERR %token SCALE_UP_TO %token SCALE_DOWN_TO @@ -636,6 +637,9 @@ listen_id_def: listen_id { IFOR(); socket_def_param: ANYCAST { IFOR(); p_tmp.flags |= SI_IS_ANYCAST; } + | FRAG { IFOR(); + p_tmp.flags |= SI_FRAG; + } | USE_WORKERS NUMBER { IFOR(); p_tmp.workers=$2; } diff --git a/ip_addr.h b/ip_addr.h index c449ef7fa0f..438b7779db0 100644 --- a/ip_addr.h +++ b/ip_addr.h @@ -89,7 +89,7 @@ union sockaddr_union{ enum si_flags { SI_NONE=0, SI_IS_IP=1, SI_IS_LO=2, SI_IS_MCAST=4, - SI_IS_ANYCAST=8 }; + SI_IS_ANYCAST=8, SI_FRAG=16 }; struct receive_info { struct ip_addr src_ip; diff --git a/net/net_udp.c b/net/net_udp.c index 34e2a9fb778..dfb3a4ec5bc 100644 --- a/net/net_udp.c +++ b/net/net_udp.c @@ -179,6 +179,13 @@ int udp_init_listener(struct socket_info *si, int status_flags) LM_ERR("setsockopt: %s\n", strerror(errno)); goto error; } + + if (si->flags & SI_FRAG) { + /* no DF */ + optval = IP_PMTUDISC_DONT; + setsockopt(si->socket, IPPROTO_IP, IP_MTU_DISCOVER, (void*)&optval, sizeof(optval)); + } + /* tos */ optval=tos; if (addr->s.sa_family==AF_INET6){ diff --git a/net/trans.c b/net/trans.c index 3aee25f7b85..e18f7f38235 100644 --- a/net/trans.c +++ b/net/trans.c @@ -264,9 +264,10 @@ void print_all_socket_lists(void) continue; for (si = protos[i].listeners; si; si = si->next) - printf(" %s: %s [%s]:%s%s%s\n", protos[i].name, + printf(" %s: %s [%s]:%s%s%s%s\n", protos[i].name, si->name.s, si->address_str.s, si->port_no_str.s, si->flags & SI_IS_MCAST ? " mcast" : "", + si->flags & SI_FRAG ? " allow_fragments" : "", is_anycast(si)? " anycast" : ""); } }