Commit 814d8ffd authored by Linus Torvalds's avatar Linus Torvalds
parents 386bfcf5 1c2fb7f9
...@@ -12,7 +12,7 @@ Don is no longer the prime maintainer of this version of the driver. ...@@ -12,7 +12,7 @@ Don is no longer the prime maintainer of this version of the driver.
Please report problems to one or more of: Please report problems to one or more of:
Andrew Morton <andrewm@uow.edu.au> Andrew Morton <andrewm@uow.edu.au>
Netdev mailing list <netdev@oss.sgi.com> Netdev mailing list <netdev@vger.kernel.org>
Linux kernel mailing list <linux-kernel@vger.kernel.org> Linux kernel mailing list <linux-kernel@vger.kernel.org>
Please note the 'Reporting and Diagnosing Problems' section at the end Please note the 'Reporting and Diagnosing Problems' section at the end
......
...@@ -73,7 +73,7 @@ S: Status, one of the following: ...@@ -73,7 +73,7 @@ S: Status, one of the following:
3C359 NETWORK DRIVER 3C359 NETWORK DRIVER
P: Mike Phillips P: Mike Phillips
M: mikep@linuxtr.net M: mikep@linuxtr.net
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
L: linux-tr@linuxtr.net L: linux-tr@linuxtr.net
W: http://www.linuxtr.net W: http://www.linuxtr.net
S: Maintained S: Maintained
...@@ -81,13 +81,13 @@ S: Maintained ...@@ -81,13 +81,13 @@ S: Maintained
3C505 NETWORK DRIVER 3C505 NETWORK DRIVER
P: Philip Blundell P: Philip Blundell
M: philb@gnu.org M: philb@gnu.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
3CR990 NETWORK DRIVER 3CR990 NETWORK DRIVER
P: David Dillow P: David Dillow
M: dave@thedillows.org M: dave@thedillows.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
3W-XXXX ATA-RAID CONTROLLER DRIVER 3W-XXXX ATA-RAID CONTROLLER DRIVER
...@@ -130,7 +130,7 @@ S: Maintained ...@@ -130,7 +130,7 @@ S: Maintained
8169 10/100/1000 GIGABIT ETHERNET DRIVER 8169 10/100/1000 GIGABIT ETHERNET DRIVER
P: Francois Romieu P: Francois Romieu
M: romieu@fr.zoreil.com M: romieu@fr.zoreil.com
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
8250/16?50 (AND CLONE UARTS) SERIAL DRIVER 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
...@@ -143,7 +143,7 @@ S: Maintained ...@@ -143,7 +143,7 @@ S: Maintained
8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.] 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
P: Paul Gortmaker P: Paul Gortmaker
M: p_gortmaker@yahoo.com M: p_gortmaker@yahoo.com
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
A2232 SERIAL BOARD DRIVER A2232 SERIAL BOARD DRIVER
...@@ -332,7 +332,7 @@ S: Maintained ...@@ -332,7 +332,7 @@ S: Maintained
ARPD SUPPORT ARPD SUPPORT
P: Jonathan Layes P: Jonathan Layes
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
ASUS ACPI EXTRAS DRIVER ASUS ACPI EXTRAS DRIVER
...@@ -706,7 +706,7 @@ S: Orphaned ...@@ -706,7 +706,7 @@ S: Orphaned
DIGI RIGHTSWITCH NETWORK DRIVER DIGI RIGHTSWITCH NETWORK DRIVER
P: Rick Richardson P: Rick Richardson
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
W: http://www.digi.com W: http://www.digi.com
S: Orphaned S: Orphaned
...@@ -812,7 +812,7 @@ S: Maintained ...@@ -812,7 +812,7 @@ S: Maintained
ETHEREXPRESS-16 NETWORK DRIVER ETHEREXPRESS-16 NETWORK DRIVER
P: Philip Blundell P: Philip Blundell
M: philb@gnu.org M: philb@gnu.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
ETHERNET BRIDGE ETHERNET BRIDGE
...@@ -875,7 +875,7 @@ S: Maintained ...@@ -875,7 +875,7 @@ S: Maintained
FRAME RELAY DLCI/FRAD (Sangoma drivers too) FRAME RELAY DLCI/FRAD (Sangoma drivers too)
P: Mike McLagan P: Mike McLagan
M: mike.mclagan@linux.org M: mike.mclagan@linux.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
FREEVXFS FILESYSTEM FREEVXFS FILESYSTEM
...@@ -1215,7 +1215,7 @@ S: Maintained ...@@ -1215,7 +1215,7 @@ S: Maintained
IPX NETWORK LAYER IPX NETWORK LAYER
P: Arnaldo Carvalho de Melo P: Arnaldo Carvalho de Melo
M: acme@conectiva.com.br M: acme@conectiva.com.br
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
IRDA SUBSYSTEM IRDA SUBSYSTEM
...@@ -1482,7 +1482,7 @@ MARVELL MV64340 ETHERNET DRIVER ...@@ -1482,7 +1482,7 @@ MARVELL MV64340 ETHERNET DRIVER
P: Manish Lachwani P: Manish Lachwani
M: Manish_Lachwani@pmc-sierra.com M: Manish_Lachwani@pmc-sierra.com
L: linux-mips@linux-mips.org L: linux-mips@linux-mips.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Supported S: Supported
MATROX FRAMEBUFFER DRIVER MATROX FRAMEBUFFER DRIVER
...@@ -1592,13 +1592,13 @@ P: Andrew Morton ...@@ -1592,13 +1592,13 @@ P: Andrew Morton
M: akpm@osdl.org M: akpm@osdl.org
P: Jeff Garzik P: Jeff Garzik
M: jgarzik@pobox.com M: jgarzik@pobox.com
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
NETWORKING [GENERAL] NETWORKING [GENERAL]
P: Networking Team P: Networking Team
M: netdev@oss.sgi.com M: netdev@vger.kernel.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
NETWORKING [IPv4/IPv6] NETWORKING [IPv4/IPv6]
...@@ -1614,7 +1614,7 @@ P: Hideaki YOSHIFUJI ...@@ -1614,7 +1614,7 @@ P: Hideaki YOSHIFUJI
M: yoshfuji@linux-ipv6.org M: yoshfuji@linux-ipv6.org
P: Patrick McHardy P: Patrick McHardy
M: kaber@coreworks.de M: kaber@coreworks.de
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
IPVS IPVS
...@@ -1634,7 +1634,7 @@ NI5010 NETWORK DRIVER ...@@ -1634,7 +1634,7 @@ NI5010 NETWORK DRIVER
P: Jan-Pascal van Best and Andreas Mohr P: Jan-Pascal van Best and Andreas Mohr
M: Jan-Pascal van Best <jvbest@qv3pluto.leidenuniv.nl> M: Jan-Pascal van Best <jvbest@qv3pluto.leidenuniv.nl>
M: Andreas Mohr <100.30936@germany.net> M: Andreas Mohr <100.30936@germany.net>
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER
...@@ -1676,7 +1676,7 @@ P: Peter De Shrijver ...@@ -1676,7 +1676,7 @@ P: Peter De Shrijver
M: p2@ace.ulyssis.student.kuleuven.ac.be M: p2@ace.ulyssis.student.kuleuven.ac.be
P: Mike Phillips P: Mike Phillips
M: mikep@linuxtr.net M: mikep@linuxtr.net
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
L: linux-tr@linuxtr.net L: linux-tr@linuxtr.net
W: http://www.linuxtr.net W: http://www.linuxtr.net
S: Maintained S: Maintained
...@@ -1783,7 +1783,7 @@ S: Unmaintained ...@@ -1783,7 +1783,7 @@ S: Unmaintained
PCNET32 NETWORK DRIVER PCNET32 NETWORK DRIVER
P: Thomas Bogendrfer P: Thomas Bogendrfer
M: tsbogend@alpha.franken.de M: tsbogend@alpha.franken.de
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
PHRAM MTD DRIVER PHRAM MTD DRIVER
...@@ -1795,7 +1795,7 @@ S: Maintained ...@@ -1795,7 +1795,7 @@ S: Maintained
POSIX CLOCKS and TIMERS POSIX CLOCKS and TIMERS
P: George Anzinger P: George Anzinger
M: george@mvista.com M: george@mvista.com
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Supported S: Supported
PNP SUPPORT PNP SUPPORT
...@@ -1830,7 +1830,7 @@ S: Supported ...@@ -1830,7 +1830,7 @@ S: Supported
PRISM54 WIRELESS DRIVER PRISM54 WIRELESS DRIVER
P: Prism54 Development Team P: Prism54 Development Team
M: prism54-private@prism54.org M: prism54-private@prism54.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
W: http://prism54.org W: http://prism54.org
S: Maintained S: Maintained
...@@ -2047,7 +2047,7 @@ SIS 900/7016 FAST ETHERNET DRIVER ...@@ -2047,7 +2047,7 @@ SIS 900/7016 FAST ETHERNET DRIVER
P: Daniele Venzano P: Daniele Venzano
M: venza@brownhat.org M: venza@brownhat.org
W: http://www.brownhat.org/sis900.html W: http://www.brownhat.org/sis900.html
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
SIS FRAMEBUFFER DRIVER SIS FRAMEBUFFER DRIVER
...@@ -2106,7 +2106,7 @@ S: Maintained ...@@ -2106,7 +2106,7 @@ S: Maintained
SONIC NETWORK DRIVER SONIC NETWORK DRIVER
P: Thomas Bogendoerfer P: Thomas Bogendoerfer
M: tsbogend@alpha.franken.de M: tsbogend@alpha.franken.de
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Maintained S: Maintained
SONY VAIO CONTROL DEVICE DRIVER SONY VAIO CONTROL DEVICE DRIVER
...@@ -2163,7 +2163,7 @@ S: Supported ...@@ -2163,7 +2163,7 @@ S: Supported
SPX NETWORK LAYER SPX NETWORK LAYER
P: Jay Schulist P: Jay Schulist
M: jschlst@samba.org M: jschlst@samba.org
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
S: Supported S: Supported
SRM (Alpha) environment access SRM (Alpha) environment access
...@@ -2242,7 +2242,7 @@ S: Maintained ...@@ -2242,7 +2242,7 @@ S: Maintained
TOKEN-RING NETWORK DRIVER TOKEN-RING NETWORK DRIVER
P: Mike Phillips P: Mike Phillips
M: mikep@linuxtr.net M: mikep@linuxtr.net
L: netdev@oss.sgi.com L: netdev@vger.kernel.org
L: linux-tr@linuxtr.net L: linux-tr@linuxtr.net
W: http://www.linuxtr.net W: http://www.linuxtr.net
S: Maintained S: Maintained
......
...@@ -415,7 +415,7 @@ struct rtl8169_private { ...@@ -415,7 +415,7 @@ struct rtl8169_private {
struct work_struct task; struct work_struct task;
}; };
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@oss.sgi.com>"); MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver"); MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
module_param_array(media, int, &num_media, 0); module_param_array(media, int, &num_media, 0);
module_param(rx_copybreak, int, 0); module_param(rx_copybreak, int, 0);
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#ifndef _LINUX_IF_TR_H #ifndef _LINUX_IF_TR_H
#define _LINUX_IF_TR_H #define _LINUX_IF_TR_H
#include <asm/byteorder.h> /* For __be16 */
/* IEEE 802.5 Token-Ring magic constants. The frame sizes omit the preamble /* IEEE 802.5 Token-Ring magic constants. The frame sizes omit the preamble
and FCS/CRC (frame check sequence). */ and FCS/CRC (frame check sequence). */
#define TR_ALEN 6 /* Octets in one token-ring addr */ #define TR_ALEN 6 /* Octets in one token-ring addr */
......
...@@ -346,6 +346,7 @@ enum ...@@ -346,6 +346,7 @@ enum
NET_TCP_MODERATE_RCVBUF=106, NET_TCP_MODERATE_RCVBUF=106,
NET_TCP_TSO_WIN_DIVISOR=107, NET_TCP_TSO_WIN_DIVISOR=107,
NET_TCP_BIC_BETA=108, NET_TCP_BIC_BETA=108,
NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
}; };
enum { enum {
......
...@@ -163,6 +163,7 @@ DECLARE_SNMP_STAT(struct linux_mib, net_statistics); ...@@ -163,6 +163,7 @@ DECLARE_SNMP_STAT(struct linux_mib, net_statistics);
extern int sysctl_local_port_range[2]; extern int sysctl_local_port_range[2];
extern int sysctl_ip_default_ttl; extern int sysctl_ip_default_ttl;
extern int sysctl_ip_nonlocal_bind;
#ifdef CONFIG_INET #ifdef CONFIG_INET
/* The function in 2.2 was invalid, producing wrong result for /* The function in 2.2 was invalid, producing wrong result for
......
...@@ -1181,6 +1181,7 @@ EXPORT_SYMBOL(inet_stream_connect); ...@@ -1181,6 +1181,7 @@ EXPORT_SYMBOL(inet_stream_connect);
EXPORT_SYMBOL(inet_stream_ops); EXPORT_SYMBOL(inet_stream_ops);
EXPORT_SYMBOL(inet_unregister_protosw); EXPORT_SYMBOL(inet_unregister_protosw);
EXPORT_SYMBOL(net_statistics); EXPORT_SYMBOL(net_statistics);
EXPORT_SYMBOL(sysctl_ip_nonlocal_bind);
#ifdef INET_REFCNT_DEBUG #ifdef INET_REFCNT_DEBUG
EXPORT_SYMBOL(inet_sock_nr); EXPORT_SYMBOL(inet_sock_nr);
......
...@@ -207,6 +207,7 @@ int sysctl_icmp_ignore_bogus_error_responses; ...@@ -207,6 +207,7 @@ int sysctl_icmp_ignore_bogus_error_responses;
int sysctl_icmp_ratelimit = 1 * HZ; int sysctl_icmp_ratelimit = 1 * HZ;
int sysctl_icmp_ratemask = 0x1818; int sysctl_icmp_ratemask = 0x1818;
int sysctl_icmp_errors_use_inbound_ifaddr;
/* /*
* ICMP control array. This specifies what to do with each ICMP. * ICMP control array. This specifies what to do with each ICMP.
...@@ -511,8 +512,12 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info) ...@@ -511,8 +512,12 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info)
*/ */
saddr = iph->daddr; saddr = iph->daddr;
if (!(rt->rt_flags & RTCF_LOCAL)) if (!(rt->rt_flags & RTCF_LOCAL)) {
saddr = 0; if (sysctl_icmp_errors_use_inbound_ifaddr)
saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK);
else
saddr = 0;
}
tos = icmp_pointers[type].error ? ((iph->tos & IPTOS_TOS_MASK) | tos = icmp_pointers[type].error ? ((iph->tos & IPTOS_TOS_MASK) |
IPTOS_PREC_INTERNETCONTROL) : IPTOS_PREC_INTERNETCONTROL) :
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/igmp.h> #include <linux/igmp.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/mroute.h> #include <linux/mroute.h>
#include <linux/init.h> #include <linux/init.h>
#include <net/ip.h> #include <net/ip.h>
...@@ -247,3 +248,4 @@ static void __exit drr_exit(void) ...@@ -247,3 +248,4 @@ static void __exit drr_exit(void)
module_init(drr_init); module_init(drr_init);
module_exit(drr_exit); module_exit(drr_exit);
MODULE_LICENSE("GPL");
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/igmp.h> #include <linux/igmp.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/mroute.h> #include <linux/mroute.h>
#include <linux/init.h> #include <linux/init.h>
#include <net/ip.h> #include <net/ip.h>
...@@ -126,3 +127,4 @@ static void __exit random_exit(void) ...@@ -126,3 +127,4 @@ static void __exit random_exit(void)
module_init(random_init); module_init(random_init);
module_exit(random_exit); module_exit(random_exit);
MODULE_LICENSE("GPL");
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/igmp.h> #include <linux/igmp.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/mroute.h> #include <linux/mroute.h>
#include <linux/init.h> #include <linux/init.h>
#include <net/ip.h> #include <net/ip.h>
...@@ -93,3 +94,4 @@ static void __exit rr_exit(void) ...@@ -93,3 +94,4 @@ static void __exit rr_exit(void)
module_init(rr_init); module_init(rr_init);
module_exit(rr_exit); module_exit(rr_exit);
MODULE_LICENSE("GPL");
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/igmp.h> #include <linux/igmp.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/mroute.h> #include <linux/mroute.h>
#include <linux/init.h> #include <linux/init.h>
#include <net/ip.h> #include <net/ip.h>
...@@ -342,3 +343,4 @@ static void __exit wrandom_exit(void) ...@@ -342,3 +343,4 @@ static void __exit wrandom_exit(void)
module_init(wrandom_init); module_init(wrandom_init);
module_exit(wrandom_exit); module_exit(wrandom_exit);
MODULE_LICENSE("GPL");
...@@ -23,6 +23,7 @@ extern int sysctl_ip_nonlocal_bind; ...@@ -23,6 +23,7 @@ extern int sysctl_ip_nonlocal_bind;
extern int sysctl_icmp_echo_ignore_all; extern int sysctl_icmp_echo_ignore_all;
extern int sysctl_icmp_echo_ignore_broadcasts; extern int sysctl_icmp_echo_ignore_broadcasts;
extern int sysctl_icmp_ignore_bogus_error_responses; extern int sysctl_icmp_ignore_bogus_error_responses;
extern int sysctl_icmp_errors_use_inbound_ifaddr;
/* From ip_fragment.c */ /* From ip_fragment.c */
extern int sysctl_ipfrag_low_thresh; extern int sysctl_ipfrag_low_thresh;
...@@ -395,6 +396,14 @@ ctl_table ipv4_table[] = { ...@@ -395,6 +396,14 @@ ctl_table ipv4_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec .proc_handler = &proc_dointvec
}, },
{
.ctl_name = NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR,
.procname = "icmp_errors_use_inbound_ifaddr",
.data = &sysctl_icmp_errors_use_inbound_ifaddr,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_dointvec
},
{ {
.ctl_name = NET_IPV4_ROUTE, .ctl_name = NET_IPV4_ROUTE,
.procname = "route", .procname = "route",
......
...@@ -2338,7 +2338,7 @@ void __init tcp_init(void) ...@@ -2338,7 +2338,7 @@ void __init tcp_init(void)
(tcp_bhash_size * sizeof(struct tcp_bind_hashbucket)); (tcp_bhash_size * sizeof(struct tcp_bind_hashbucket));
order++) order++)
; ;
if (order > 4) { if (order >= 4) {
sysctl_local_port_range[0] = 32768; sysctl_local_port_range[0] = 32768;
sysctl_local_port_range[1] = 61000; sysctl_local_port_range[1] = 61000;
sysctl_tcp_max_tw_buckets = 180000; sysctl_tcp_max_tw_buckets = 180000;
......
...@@ -372,6 +372,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) ...@@ -372,6 +372,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
ndev->regen_timer.data = (unsigned long) ndev; ndev->regen_timer.data = (unsigned long) ndev;
if ((dev->flags&IFF_LOOPBACK) || if ((dev->flags&IFF_LOOPBACK) ||
dev->type == ARPHRD_TUNNEL || dev->type == ARPHRD_TUNNEL ||
dev->type == ARPHRD_NONE ||
dev->type == ARPHRD_SIT) { dev->type == ARPHRD_SIT) {
printk(KERN_INFO printk(KERN_INFO
"Disabled Privacy Extensions on device %p(%s)\n", "Disabled Privacy Extensions on device %p(%s)\n",
......
...@@ -277,8 +277,8 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, ...@@ -277,8 +277,8 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
{ {
struct inet6_dev *idev = NULL; struct inet6_dev *idev = NULL;
struct ipv6hdr *hdr = skb->nh.ipv6h; struct ipv6hdr *hdr = skb->nh.ipv6h;
struct sock *sk = icmpv6_socket->sk; struct sock *sk;
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np;
struct in6_addr *saddr = NULL; struct in6_addr *saddr = NULL;
struct dst_entry *dst; struct dst_entry *dst;
struct icmp6hdr tmp_hdr; struct icmp6hdr tmp_hdr;
...@@ -358,6 +358,9 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, ...@@ -358,6 +358,9 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
if (icmpv6_xmit_lock()) if (icmpv6_xmit_lock())
return; return;
sk = icmpv6_socket->sk;
np = inet6_sk(sk);
if (!icmpv6_xrlim_allow(sk, type, &fl)) if (!icmpv6_xrlim_allow(sk, type, &fl))
goto out; goto out;
...@@ -423,9 +426,9 @@ out: ...@@ -423,9 +426,9 @@ out:
static void icmpv6_echo_reply(struct sk_buff *skb) static void icmpv6_echo_reply(struct sk_buff *skb)
{ {
struct sock *sk = icmpv6_socket->sk; struct sock *sk;
struct inet6_dev *idev; struct inet6_dev *idev;
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np;
struct in6_addr *saddr = NULL; struct in6_addr *saddr = NULL;
struct icmp6hdr *icmph = (struct icmp6hdr *) skb->h.raw; struct icmp6hdr *icmph = (struct icmp6hdr *) skb->h.raw;
struct icmp6hdr tmp_hdr; struct icmp6hdr tmp_hdr;
...@@ -454,6 +457,9 @@ static void icmpv6_echo_reply(struct sk_buff *skb) ...@@ -454,6 +457,9 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
if (icmpv6_xmit_lock()) if (icmpv6_xmit_lock())
return; return;
sk = icmpv6_socket->sk;
np = inet6_sk(sk);
if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst)) if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
fl.oif = np->mcast_oif; fl.oif = np->mcast_oif;
......
...@@ -881,7 +881,7 @@ static int __init tc_action_init(void) ...@@ -881,7 +881,7 @@ static int __init tc_action_init(void)
link_p[RTM_GETACTION-RTM_BASE].dumpit = tc_dump_action; link_p[RTM_GETACTION-RTM_BASE].dumpit = tc_dump_action;
} }
printk("TC classifier action (bugs to netdev@oss.sgi.com cc " printk("TC classifier action (bugs to netdev@vger.kernel.org cc "
"hadi@cyberus.ca)\n"); "hadi@cyberus.ca)\n");
return 0; return 0;
} }
......
...@@ -178,6 +178,37 @@ int sctp_rcv(struct sk_buff *skb) ...@@ -178,6 +178,37 @@ int sctp_rcv(struct sk_buff *skb)
asoc = __sctp_rcv_lookup(skb, &src, &dest, &transport); asoc = __sctp_rcv_lookup(skb, &src, &dest, &transport);
if (!asoc)
ep = __sctp_rcv_lookup_endpoint(&dest);
/* Retrieve the common input handling substructure. */
rcvr = asoc ? &asoc->base : &ep->base;
sk = rcvr->sk;
/*
* If a frame arrives on an interface and the receiving socket is
* bound to another interface, via SO_BINDTODEVICE, treat it as OOTB
*/
if (sk->sk_bound_dev_if && (sk->sk_bound_dev_if != af->skb_iif(skb)))
{
sock_put(sk);
if (asoc) {
sctp_association_put(asoc);
asoc = NULL;
} else {
sctp_endpoint_put(ep);
ep = NULL;
}
sk = sctp_get_ctl_sock();
ep = sctp_sk(sk)->ep;
sctp_endpoint_hold(ep);
sock_hold(sk);
rcvr = &ep->base;
}
if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
goto discard_release;
/* /*
* RFC 2960, 8.4 - Handle "Out of the blue" Packets. * RFC 2960, 8.4 - Handle "Out of the blue" Packets.
* An SCTP packet is called an "out of the blue" (OOTB) * An SCTP packet is called an "out of the blue" (OOTB)
...@@ -187,22 +218,12 @@ int sctp_rcv(struct sk_buff *skb) ...@@ -187,22 +218,12 @@ int sctp_rcv(struct sk_buff *skb)
* packet belongs. * packet belongs.
*/ */
if (!asoc) { if (!asoc) {
ep = __sctp_rcv_lookup_endpoint(&dest);
if (sctp_rcv_ootb(skb)) { if (sctp_rcv_ootb(skb)) {
SCTP_INC_STATS_BH(SCTP_MIB_OUTOFBLUES); SCTP_INC_STATS_BH(SCTP_MIB_OUTOFBLUES);
goto discard_release; goto discard_release;
} }
} }
/* Retrieve the common input handling substructure. */
rcvr = asoc ? &asoc->base : &ep->base;
sk = rcvr->sk;
if ((sk) && (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)) {
goto discard_release;
}
/* SCTP seems to always need a timestamp right now (FIXME) */ /* SCTP seems to always need a timestamp right now (FIXME) */
if (skb->stamp.tv_sec == 0) { if (skb->stamp.tv_sec == 0) {
do_gettimeofday(&skb->stamp); do_gettimeofday(&skb->stamp);
...@@ -265,13 +286,11 @@ discard_it: ...@@ -265,13 +286,11 @@ discard_it:
discard_release: discard_release:
/* Release any structures we may be holding. */ /* Release any structures we may be holding. */
if (asoc) { sock_put(sk);
sock_put(asoc->base.sk); if (asoc)
sctp_association_put(asoc); sctp_association_put(asoc);
} else { else
sock_put(ep->base.sk);
sctp_endpoint_put(ep); sctp_endpoint_put(ep);
}
goto discard_it; goto discard_it;
} }
......
...@@ -812,26 +812,23 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr) ...@@ -812,26 +812,23 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
if (addr->sa.sa_family != AF_INET6) if (addr->sa.sa_family != AF_INET6)
af = sctp_get_af_specific(addr->sa.sa_family); af = sctp_get_af_specific(addr->sa.sa_family);
else { else {
struct sock *sk;
int type = ipv6_addr_type(&addr->v6.sin6_addr); int type = ipv6_addr_type(&addr->v6.sin6_addr);
sk = sctp_opt2sk(opt); struct net_device *dev;
if (type & IPV6_ADDR_LINKLOCAL) { if (type & IPV6_ADDR_LINKLOCAL) {
/* Note: Behavior similar to af_inet6.c: if (!addr->v6.sin6_scope_id)
* 1) Overrides previous bound_dev_if return 0;
* 2) Destructive even if bind isn't successful. dev = dev_get_by_index(addr->v6.sin6_scope_id);
*/ if (!dev)
if (addr->v6.sin6_scope_id)
sk->sk_bound_dev_if = addr->v6.sin6_scope_id;
if (!sk->sk_bound_dev_if)
return 0; return 0;
dev_put(dev);
} }
af = opt->pf->af; af = opt->pf->af;
} }
return af->available(addr, opt); return af->available(addr, opt);
} }
/* Verify that the provided sockaddr looks bindable. Common verification, /* Verify that the provided sockaddr looks sendable. Common verification,
* has already been taken care of. * has already been taken care of.
*/ */
static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr) static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
...@@ -842,19 +839,16 @@ static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr) ...@@ -842,19 +839,16 @@ static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
if (addr->sa.sa_family != AF_INET6) if (addr->sa.sa_family != AF_INET6)
af = sctp_get_af_specific(addr->sa.sa_family); af = sctp_get_af_specific(addr->sa.sa_family);
else { else {
struct sock *sk;
int type = ipv6_addr_type(&addr->v6.sin6_addr); int type = ipv6_addr_type(&addr->v6.sin6_addr);
sk = sctp_opt2sk(opt); struct net_device *dev;
if (type & IPV6_ADDR_LINKLOCAL) { if (type & IPV6_ADDR_LINKLOCAL) {
/* Note: Behavior similar to af_inet6.c: if (!addr->v6.sin6_scope_id)
* 1) Overrides previous bound_dev_if return 0;
* 2) Destructive even if bind isn't successful. dev = dev_get_by_index(addr->v6.sin6_scope_id);
*/ if (!dev)
if (addr->v6.sin6_scope_id)
sk->sk_bound_dev_if = addr->v6.sin6_scope_id;
if (!sk->sk_bound_dev_if)
return 0; return 0;
dev_put(dev);
} }
af = opt->pf->af; af = opt->pf->af;
} }
......
...@@ -132,14 +132,25 @@ void sctp_snmp_proc_exit(void) ...@@ -132,14 +132,25 @@ void sctp_snmp_proc_exit(void)
static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_common *epb) static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_common *epb)
{ {
struct list_head *pos; struct list_head *pos;
struct sctp_association *asoc;
struct sctp_sockaddr_entry *laddr; struct sctp_sockaddr_entry *laddr;
union sctp_addr *addr; struct sctp_transport *peer;
union sctp_addr *addr, *primary = NULL;
struct sctp_af *af; struct sctp_af *af;
if (epb->type == SCTP_EP_TYPE_ASSOCIATION) {
asoc = sctp_assoc(epb);
peer = asoc->peer.primary_path;
primary = &peer->saddr;
}
list_for_each(pos, &epb->bind_addr.address_list) { list_for_each(pos, &epb->bind_addr.address_list) {
laddr = list_entry(pos, struct sctp_sockaddr_entry, list); laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
addr = (union sctp_addr *)&laddr->a; addr = (union sctp_addr *)&laddr->a;
af = sctp_get_af_specific(addr->sa.sa_family); af = sctp_get_af_specific(addr->sa.sa_family);
if (primary && af->cmp_addr(addr, primary)) {
seq_printf(seq, "*");
}
af->seq_dump_addr(seq, addr); af->seq_dump_addr(seq, addr);
} }
} }
...@@ -149,17 +160,54 @@ static void sctp_seq_dump_remote_addrs(struct seq_file *seq, struct sctp_associa ...@@ -149,17 +160,54 @@ static void sctp_seq_dump_remote_addrs(struct seq_file *seq, struct sctp_associa
{ {
struct list_head *pos; struct list_head *pos;
struct sctp_transport *transport; struct sctp_transport *transport;
union sctp_addr *addr; union sctp_addr *addr, *primary;
struct sctp_af *af; struct sctp_af *af;
primary = &(assoc->peer.primary_addr);
list_for_each(pos, &assoc->peer.transport_addr_list) { list_for_each(pos, &assoc->peer.transport_addr_list) {
transport = list_entry(pos, struct sctp_transport, transports); transport = list_entry(pos, struct sctp_transport, transports);
addr = (union sctp_addr *)&transport->ipaddr; addr = (union sctp_addr *)&transport->ipaddr;
af = sctp_get_af_specific(addr->sa.sa_family); af = sctp_get_af_specific(addr->sa.sa_family);
if (af->cmp_addr(addr, primary)) {
seq_printf(seq, "*");
}
af->seq_dump_addr(seq, addr); af->seq_dump_addr(seq, addr);
} }
} }
static void * sctp_eps_seq_start(struct seq_file *seq, loff_t *pos)
{
if (*pos > sctp_ep_hashsize)
return NULL;
if (*pos < 0)
*pos = 0;
if (*pos == 0)
seq_printf(seq, " ENDPT SOCK STY SST HBKT LPORT UID INODE LADDRS\n");
++*pos;
return (void *)pos;
}
static void sctp_eps_seq_stop(struct seq_file *seq, void *v)
{
return;
}
static void * sctp_eps_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{
if (*pos > sctp_ep_hashsize)
return NULL;
++*pos;
return pos;
}
/* Display sctp endpoints (/proc/net/sctp/eps). */ /* Display sctp endpoints (/proc/net/sctp/eps). */
static int sctp_eps_seq_show(struct seq_file *seq, void *v) static int sctp_eps_seq_show(struct seq_file *seq, void *v)
{ {
...@@ -167,38 +215,50 @@ static int sctp_eps_seq_show(struct seq_file *seq, void *v) ...@@ -167,38 +215,50 @@ static int sctp_eps_seq_show(struct seq_file *seq, void *v)
struct sctp_ep_common *epb; struct sctp_ep_common *epb;
struct sctp_endpoint *ep; struct sctp_endpoint *ep;
struct sock *sk; struct sock *sk;
int hash; int hash = *(int *)v;
seq_printf(seq, " ENDPT SOCK STY SST HBKT LPORT LADDRS\n"); if (hash > sctp_ep_hashsize)
for (hash = 0; hash < sctp_ep_hashsize; hash++) { return -ENOMEM;
head = &sctp_ep_hashtable[hash];
read_lock(&head->lock); head = &sctp_ep_hashtable[hash-1];
for (epb = head->chain; epb; epb = epb->next) { sctp_local_bh_disable();
ep = sctp_ep(epb); read_lock(&head->lock);
sk = epb->sk; for (epb = head->chain; epb; epb = epb->next) {
seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d ", ep, sk, ep = sctp_ep(epb);
sctp_sk(sk)->type, sk->sk_state, hash, sk = epb->sk;
epb->bind_addr.port); seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d %5d %5lu ", ep, sk,
sctp_seq_dump_local_addrs(seq, epb); sctp_sk(sk)->type, sk->sk_state, hash-1,
seq_printf(seq, "\n"); epb->bind_addr.port,
} sock_i_uid(sk), sock_i_ino(sk));
read_unlock(&head->lock);
sctp_seq_dump_local_addrs(seq, epb);
seq_printf(seq, "\n");
} }
read_unlock(&head->lock);
sctp_local_bh_enable();
return 0; return 0;
} }
static struct seq_operations sctp_eps_ops = {
.start = sctp_eps_seq_start,
.next = sctp_eps_seq_next,
.stop = sctp_eps_seq_stop,
.show = sctp_eps_seq_show,
};
/* Initialize the seq file operations for 'eps' object. */ /* Initialize the seq file operations for 'eps' object. */
static int sctp_eps_seq_open(struct inode *inode, struct file *file) static int sctp_eps_seq_open(struct inode *inode, struct file *file)
{ {
return single_open(file, sctp_eps_seq_show, NULL); return seq_open(file, &sctp_eps_ops);
} }
static struct file_operations sctp_eps_seq_fops = { static struct file_operations sctp_eps_seq_fops = {
.open = sctp_eps_seq_open, .open = sctp_eps_seq_open,
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = single_release, .release = seq_release,
}; };
/* Set up the proc fs entry for 'eps' object. */ /* Set up the proc fs entry for 'eps' object. */
...@@ -221,6 +281,40 @@ void sctp_eps_proc_exit(void) ...@@ -221,6 +281,40 @@ void sctp_eps_proc_exit(void)
remove_proc_entry("eps", proc_net_sctp); remove_proc_entry("eps", proc_net_sctp);
} }
static void * sctp_assocs_seq_start(struct seq_file *seq, loff_t *pos)
{
if (*pos > sctp_assoc_hashsize)
return NULL;
if (*pos < 0)
*pos = 0;
if (*pos == 0)
seq_printf(seq, " ASSOC SOCK STY SST ST HBKT ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT "
"RPORT LADDRS <-> RADDRS\n");
++*pos;
return (void *)pos;
}
static void sctp_assocs_seq_stop(struct seq_file *seq, void *v)
{
return;
}
static void * sctp_assocs_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{
if (*pos > sctp_assoc_hashsize)
return NULL;
++*pos;
return pos;
}
/* Display sctp associations (/proc/net/sctp/assocs). */ /* Display sctp associations (/proc/net/sctp/assocs). */
static int sctp_assocs_seq_show(struct seq_file *seq, void *v) static int sctp_assocs_seq_show(struct seq_file *seq, void *v)
{ {
...@@ -228,43 +322,57 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v) ...@@ -228,43 +322,57 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v)
struct sctp_ep_common *epb; struct sctp_ep_common *epb;
struct sctp_association *assoc; struct sctp_association *assoc;
struct sock *sk; struct sock *sk;
int hash; int hash = *(int *)v;
seq_printf(seq, " ASSOC SOCK STY SST ST HBKT LPORT RPORT " if (hash > sctp_assoc_hashsize)
"LADDRS <-> RADDRS\n"); return -ENOMEM;
for (hash = 0; hash < sctp_assoc_hashsize; hash++) {
head = &sctp_assoc_hashtable[hash]; head = &sctp_assoc_hashtable[hash-1];
read_lock(&head->lock); sctp_local_bh_disable();
for (epb = head->chain; epb; epb = epb->next) { read_lock(&head->lock);
assoc = sctp_assoc(epb); for (epb = head->chain; epb; epb = epb->next) {
sk = epb->sk; assoc = sctp_assoc(epb);
seq_printf(seq, sk = epb->sk;
"%8p %8p %-3d %-3d %-2d %-4d %-5d %-5d ", seq_printf(seq,
assoc, sk, sctp_sk(sk)->type, sk->sk_state, "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ",
assoc->state, hash, epb->bind_addr.port, assoc, sk, sctp_sk(sk)->type, sk->sk_state,
assoc->peer.port); assoc->state, hash-1, assoc->assoc_id,
sctp_seq_dump_local_addrs(seq, epb); (sk->sk_rcvbuf - assoc->rwnd),
seq_printf(seq, "<-> "); assoc->sndbuf_used,
sctp_seq_dump_remote_addrs(seq, assoc); sock_i_uid(sk), sock_i_ino(sk),
seq_printf(seq, "\n"); epb->bind_addr.port,
} assoc->peer.port);
read_unlock(&head->lock);
seq_printf(seq, " ");
sctp_seq_dump_local_addrs(seq, epb);
seq_printf(seq, "<-> ");
sctp_seq_dump_remote_addrs(seq, assoc);
seq_printf(seq, "\n");
} }
read_unlock(&head->lock);
sctp_local_bh_enable();
return 0; return 0;
} }
static struct seq_operations sctp_assoc_ops = {
.start = sctp_assocs_seq_start,
.next = sctp_assocs_seq_next,
.stop = sctp_assocs_seq_stop,
.show = sctp_assocs_seq_show,
};
/* Initialize the seq file operations for 'assocs' object. */ /* Initialize the seq file operations for 'assocs' object. */
static int sctp_assocs_seq_open(struct inode *inode, struct file *file) static int sctp_assocs_seq_open(struct inode *inode, struct file *file)
{ {
return single_open(file, sctp_assocs_seq_show, NULL); return seq_open(file, &sctp_assoc_ops);
} }
static struct file_operations sctp_assocs_seq_fops = { static struct file_operations sctp_assocs_seq_fops = {
.open = sctp_assocs_seq_open, .open = sctp_assocs_seq_open,
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = single_release, .release = seq_release,
}; };
/* Set up the proc fs entry for 'assocs' object. */ /* Set up the proc fs entry for 'assocs' object. */
......
...@@ -378,10 +378,13 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp) ...@@ -378,10 +378,13 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
{ {
int ret = inet_addr_type(addr->v4.sin_addr.s_addr); int ret = inet_addr_type(addr->v4.sin_addr.s_addr);
/* FIXME: ip_nonlocal_bind sysctl support. */
if (addr->v4.sin_addr.s_addr != INADDR_ANY && ret != RTN_LOCAL) if (addr->v4.sin_addr.s_addr != INADDR_ANY &&
ret != RTN_LOCAL &&
!sp->inet.freebind &&
!sysctl_ip_nonlocal_bind)
return 0; return 0;
return 1; return 1;
} }
......
...@@ -4686,6 +4686,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, ...@@ -4686,6 +4686,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
struct sctp_endpoint *newep = newsp->ep; struct sctp_endpoint *newep = newsp->ep;
struct sk_buff *skb, *tmp; struct sk_buff *skb, *tmp;
struct sctp_ulpevent *event; struct sctp_ulpevent *event;
int flags = 0;
/* Migrate socket buffer sizes and all the socket level options to the /* Migrate socket buffer sizes and all the socket level options to the
* new socket. * new socket.
...@@ -4707,6 +4708,17 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, ...@@ -4707,6 +4708,17 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
sctp_sk(newsk)->bind_hash = pp; sctp_sk(newsk)->bind_hash = pp;
inet_sk(newsk)->num = inet_sk(oldsk)->num; inet_sk(newsk)->num = inet_sk(oldsk)->num;
/* Copy the bind_addr list from the original endpoint to the new
* endpoint so that we can handle restarts properly
*/
if (assoc->peer.ipv4_address)
flags |= SCTP_ADDR4_PEERSUPP;
if (assoc->peer.ipv6_address)
flags |= SCTP_ADDR6_PEERSUPP;
sctp_bind_addr_copy(&newsp->ep->base.bind_addr,
&oldsp->ep->base.bind_addr,
SCTP_SCOPE_GLOBAL, GFP_KERNEL, flags);
/* Move any messages in the old socket's receive queue that are for the /* Move any messages in the old socket's receive queue that are for the
* peeled off association to the new socket's receive queue. * peeled off association to the new socket's receive queue.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment