--- linux/include/linux/sysctl.h 2005-08-05 09:04:37.000000000 +0200 +++ linux/include/linux/sysctl.h 2005-08-10 14:36:56.000000000 +0200 @@ -347,6 +347,7 @@ NET_TCP_TSO_WIN_DIVISOR=107, NET_TCP_BIC_BETA=108, NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109, + NET_UDP_WIDE_BROADCAST=169, }; enum { --- linux/net/ipv4/sysctl_net_ipv4.c 2005-08-05 09:04:37.000000000 +0200 +++ linux/net/ipv4/sysctl_net_ipv4.c 2005-08-10 14:35:45.000000000 +0200 @@ -49,6 +49,9 @@ extern int inet_peer_gc_mintime; extern int inet_peer_gc_maxtime; +/* From udp.c */ +extern int sysctl_udp_wide_broadcast; + #ifdef CONFIG_SYSCTL static int tcp_retr1_max = 255; static int ip_local_port_range_min[] = { 1, 1 }; @@ -699,6 +702,14 @@ .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 2005-08-05 09:04:37.000000000 +0200 +++ linux/net/ipv4/udp.c 2005-08-10 14:40:04.000000000 +0200 @@ -108,6 +108,8 @@ #include #include +int sysctl_udp_wide_broadcast = 0; + /* * Snmp MIB for the UDP layer */ @@ -292,7 +294,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;