--- linux/include/linux/sysctl.h Tue Jun 20 11:31:55 2006 +++ linux/include/linux/sysctl.h Wed Jun 28 15:50:21 2006 @@ -403,6 +403,7 @@ NET_TCP_MTU_PROBING=113, NET_TCP_BASE_MSS=114, NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115, + NET_UDP_WIDE_BROADCAST=169, }; enum { --- linux/net/ipv4/sysctl_net_ipv4.c Tue Jun 20 11:31:55 2006 +++ linux/net/ipv4/sysctl_net_ipv4.c Wed Jun 28 15:52:03 2006 @@ -22,6 +22,9 @@ /* From af_inet.c */ extern int sysctl_ip_nonlocal_bind; +/* From udp.c */ +extern int sysctl_udp_wide_broadcast; + #ifdef CONFIG_SYSCTL static int zero; static int tcp_retr1_max = 255; @@ -687,6 +690,14 @@ .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec + }, + { + .ctl_name = NET_UDP_WIDE_BROADCAST, + .procname = "udp_wide_broadcast", + .data = &sysctl_udp_wide_broadcast, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, }, { .ctl_name = 0 } }; --- linux/net/ipv4/udp.c Tue Jun 20 11:31:55 2006 +++ linux/net/ipv4/udp.c Wed Jun 28 15:55:11 2006 @@ -110,6 +110,8 @@ #include #include +int sysctl_udp_wide_broadcast = 0; + /* * Snmp MIB for the UDP layer */ @@ -294,7 +296,8 @@ if (inet->num != hnum || (inet->daddr && inet->daddr != rmt_addr) || (inet->dport != rmt_port && inet->dport) || - (inet->rcv_saddr && inet->rcv_saddr != loc_addr) || + !(sysctl_udp_wide_broadcast || + !(inet->rcv_saddr && inet->rcv_saddr != loc_addr)) || ipv6_only_sock(s) || (s->sk_bound_dev_if && s->sk_bound_dev_if != dif)) continue;