mirror of https://gitee.com/openkylin/linux.git
Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
commit
814d8ffd50
|
@ -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:
|
||||
|
||||
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>
|
||||
|
||||
Please note the 'Reporting and Diagnosing Problems' section at the end
|
||||
|
|
48
MAINTAINERS
48
MAINTAINERS
|
@ -73,7 +73,7 @@ S: Status, one of the following:
|
|||
3C359 NETWORK DRIVER
|
||||
P: Mike Phillips
|
||||
M: mikep@linuxtr.net
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
S: Maintained
|
||||
|
@ -81,13 +81,13 @@ S: Maintained
|
|||
3C505 NETWORK DRIVER
|
||||
P: Philip Blundell
|
||||
M: philb@gnu.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
3CR990 NETWORK DRIVER
|
||||
P: David Dillow
|
||||
M: dave@thedillows.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
3W-XXXX ATA-RAID CONTROLLER DRIVER
|
||||
|
@ -130,7 +130,7 @@ S: Maintained
|
|||
8169 10/100/1000 GIGABIT ETHERNET DRIVER
|
||||
P: Francois Romieu
|
||||
M: romieu@fr.zoreil.com
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
|
||||
|
@ -143,7 +143,7 @@ S: Maintained
|
|||
8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
|
||||
P: Paul Gortmaker
|
||||
M: p_gortmaker@yahoo.com
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
A2232 SERIAL BOARD DRIVER
|
||||
|
@ -332,7 +332,7 @@ S: Maintained
|
|||
|
||||
ARPD SUPPORT
|
||||
P: Jonathan Layes
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
ASUS ACPI EXTRAS DRIVER
|
||||
|
@ -706,7 +706,7 @@ S: Orphaned
|
|||
|
||||
DIGI RIGHTSWITCH NETWORK DRIVER
|
||||
P: Rick Richardson
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.digi.com
|
||||
S: Orphaned
|
||||
|
||||
|
@ -812,7 +812,7 @@ S: Maintained
|
|||
ETHEREXPRESS-16 NETWORK DRIVER
|
||||
P: Philip Blundell
|
||||
M: philb@gnu.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
ETHERNET BRIDGE
|
||||
|
@ -875,7 +875,7 @@ S: Maintained
|
|||
FRAME RELAY DLCI/FRAD (Sangoma drivers too)
|
||||
P: Mike McLagan
|
||||
M: mike.mclagan@linux.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
FREEVXFS FILESYSTEM
|
||||
|
@ -1215,7 +1215,7 @@ S: Maintained
|
|||
IPX NETWORK LAYER
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@conectiva.com.br
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
IRDA SUBSYSTEM
|
||||
|
@ -1482,7 +1482,7 @@ MARVELL MV64340 ETHERNET DRIVER
|
|||
P: Manish Lachwani
|
||||
M: Manish_Lachwani@pmc-sierra.com
|
||||
L: linux-mips@linux-mips.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
MATROX FRAMEBUFFER DRIVER
|
||||
|
@ -1592,13 +1592,13 @@ P: Andrew Morton
|
|||
M: akpm@osdl.org
|
||||
P: Jeff Garzik
|
||||
M: jgarzik@pobox.com
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
NETWORKING [GENERAL]
|
||||
P: Networking Team
|
||||
M: netdev@oss.sgi.com
|
||||
L: netdev@oss.sgi.com
|
||||
M: netdev@vger.kernel.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
NETWORKING [IPv4/IPv6]
|
||||
|
@ -1614,7 +1614,7 @@ P: Hideaki YOSHIFUJI
|
|||
M: yoshfuji@linux-ipv6.org
|
||||
P: Patrick McHardy
|
||||
M: kaber@coreworks.de
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
IPVS
|
||||
|
@ -1634,7 +1634,7 @@ NI5010 NETWORK DRIVER
|
|||
P: Jan-Pascal van Best and Andreas Mohr
|
||||
M: Jan-Pascal van Best <jvbest@qv3pluto.leidenuniv.nl>
|
||||
M: Andreas Mohr <100.30936@germany.net>
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER
|
||||
|
@ -1676,7 +1676,7 @@ P: Peter De Shrijver
|
|||
M: p2@ace.ulyssis.student.kuleuven.ac.be
|
||||
P: Mike Phillips
|
||||
M: mikep@linuxtr.net
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
S: Maintained
|
||||
|
@ -1783,7 +1783,7 @@ S: Unmaintained
|
|||
PCNET32 NETWORK DRIVER
|
||||
P: Thomas Bogendörfer
|
||||
M: tsbogend@alpha.franken.de
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
PHRAM MTD DRIVER
|
||||
|
@ -1795,7 +1795,7 @@ S: Maintained
|
|||
POSIX CLOCKS and TIMERS
|
||||
P: George Anzinger
|
||||
M: george@mvista.com
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
PNP SUPPORT
|
||||
|
@ -1830,7 +1830,7 @@ S: Supported
|
|||
PRISM54 WIRELESS DRIVER
|
||||
P: Prism54 Development Team
|
||||
M: prism54-private@prism54.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://prism54.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -2047,7 +2047,7 @@ SIS 900/7016 FAST ETHERNET DRIVER
|
|||
P: Daniele Venzano
|
||||
M: venza@brownhat.org
|
||||
W: http://www.brownhat.org/sis900.html
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SIS FRAMEBUFFER DRIVER
|
||||
|
@ -2106,7 +2106,7 @@ S: Maintained
|
|||
SONIC NETWORK DRIVER
|
||||
P: Thomas Bogendoerfer
|
||||
M: tsbogend@alpha.franken.de
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SONY VAIO CONTROL DEVICE DRIVER
|
||||
|
@ -2163,7 +2163,7 @@ S: Supported
|
|||
SPX NETWORK LAYER
|
||||
P: Jay Schulist
|
||||
M: jschlst@samba.org
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
SRM (Alpha) environment access
|
||||
|
@ -2242,7 +2242,7 @@ S: Maintained
|
|||
TOKEN-RING NETWORK DRIVER
|
||||
P: Mike Phillips
|
||||
M: mikep@linuxtr.net
|
||||
L: netdev@oss.sgi.com
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
S: Maintained
|
||||
|
|
|
@ -415,7 +415,7 @@ struct rtl8169_private {
|
|||
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_param_array(media, int, &num_media, 0);
|
||||
module_param(rx_copybreak, int, 0);
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#ifndef _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
|
||||
and FCS/CRC (frame check sequence). */
|
||||
#define TR_ALEN 6 /* Octets in one token-ring addr */
|
||||
|
|
|
@ -346,6 +346,7 @@ enum
|
|||
NET_TCP_MODERATE_RCVBUF=106,
|
||||
NET_TCP_TSO_WIN_DIVISOR=107,
|
||||
NET_TCP_BIC_BETA=108,
|
||||
NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
@ -163,6 +163,7 @@ DECLARE_SNMP_STAT(struct linux_mib, net_statistics);
|
|||
|
||||
extern int sysctl_local_port_range[2];
|
||||
extern int sysctl_ip_default_ttl;
|
||||
extern int sysctl_ip_nonlocal_bind;
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
/* The function in 2.2 was invalid, producing wrong result for
|
||||
|
|
|
@ -1181,6 +1181,7 @@ EXPORT_SYMBOL(inet_stream_connect);
|
|||
EXPORT_SYMBOL(inet_stream_ops);
|
||||
EXPORT_SYMBOL(inet_unregister_protosw);
|
||||
EXPORT_SYMBOL(net_statistics);
|
||||
EXPORT_SYMBOL(sysctl_ip_nonlocal_bind);
|
||||
|
||||
#ifdef INET_REFCNT_DEBUG
|
||||
EXPORT_SYMBOL(inet_sock_nr);
|
||||
|
|
|
@ -207,6 +207,7 @@ int sysctl_icmp_ignore_bogus_error_responses;
|
|||
|
||||
int sysctl_icmp_ratelimit = 1 * HZ;
|
||||
int sysctl_icmp_ratemask = 0x1818;
|
||||
int sysctl_icmp_errors_use_inbound_ifaddr;
|
||||
|
||||
/*
|
||||
* 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)
|
|||
*/
|
||||
|
||||
saddr = iph->daddr;
|
||||
if (!(rt->rt_flags & RTCF_LOCAL))
|
||||
saddr = 0;
|
||||
if (!(rt->rt_flags & RTCF_LOCAL)) {
|
||||
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) |
|
||||
IPTOS_PREC_INTERNETCONTROL) :
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/igmp.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mroute.h>
|
||||
#include <linux/init.h>
|
||||
#include <net/ip.h>
|
||||
|
@ -247,3 +248,4 @@ static void __exit drr_exit(void)
|
|||
|
||||
module_init(drr_init);
|
||||
module_exit(drr_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/igmp.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mroute.h>
|
||||
#include <linux/init.h>
|
||||
#include <net/ip.h>
|
||||
|
@ -126,3 +127,4 @@ static void __exit random_exit(void)
|
|||
|
||||
module_init(random_init);
|
||||
module_exit(random_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/igmp.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mroute.h>
|
||||
#include <linux/init.h>
|
||||
#include <net/ip.h>
|
||||
|
@ -93,3 +94,4 @@ static void __exit rr_exit(void)
|
|||
|
||||
module_init(rr_init);
|
||||
module_exit(rr_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/igmp.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mroute.h>
|
||||
#include <linux/init.h>
|
||||
#include <net/ip.h>
|
||||
|
@ -342,3 +343,4 @@ static void __exit wrandom_exit(void)
|
|||
|
||||
module_init(wrandom_init);
|
||||
module_exit(wrandom_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -23,6 +23,7 @@ extern int sysctl_ip_nonlocal_bind;
|
|||
extern int sysctl_icmp_echo_ignore_all;
|
||||
extern int sysctl_icmp_echo_ignore_broadcasts;
|
||||
extern int sysctl_icmp_ignore_bogus_error_responses;
|
||||
extern int sysctl_icmp_errors_use_inbound_ifaddr;
|
||||
|
||||
/* From ip_fragment.c */
|
||||
extern int sysctl_ipfrag_low_thresh;
|
||||
|
@ -395,6 +396,14 @@ ctl_table ipv4_table[] = {
|
|||
.mode = 0644,
|
||||
.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,
|
||||
.procname = "route",
|
||||
|
|
|
@ -2338,7 +2338,7 @@ void __init tcp_init(void)
|
|||
(tcp_bhash_size * sizeof(struct tcp_bind_hashbucket));
|
||||
order++)
|
||||
;
|
||||
if (order > 4) {
|
||||
if (order >= 4) {
|
||||
sysctl_local_port_range[0] = 32768;
|
||||
sysctl_local_port_range[1] = 61000;
|
||||
sysctl_tcp_max_tw_buckets = 180000;
|
||||
|
|
|
@ -372,6 +372,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
|
|||
ndev->regen_timer.data = (unsigned long) ndev;
|
||||
if ((dev->flags&IFF_LOOPBACK) ||
|
||||
dev->type == ARPHRD_TUNNEL ||
|
||||
dev->type == ARPHRD_NONE ||
|
||||
dev->type == ARPHRD_SIT) {
|
||||
printk(KERN_INFO
|
||||
"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,
|
|||
{
|
||||
struct inet6_dev *idev = NULL;
|
||||
struct ipv6hdr *hdr = skb->nh.ipv6h;
|
||||
struct sock *sk = icmpv6_socket->sk;
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct sock *sk;
|
||||
struct ipv6_pinfo *np;
|
||||
struct in6_addr *saddr = NULL;
|
||||
struct dst_entry *dst;
|
||||
struct icmp6hdr tmp_hdr;
|
||||
|
@ -358,6 +358,9 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
|
|||
if (icmpv6_xmit_lock())
|
||||
return;
|
||||
|
||||
sk = icmpv6_socket->sk;
|
||||
np = inet6_sk(sk);
|
||||
|
||||
if (!icmpv6_xrlim_allow(sk, type, &fl))
|
||||
goto out;
|
||||
|
||||
|
@ -423,9 +426,9 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
|
|||
|
||||
static void icmpv6_echo_reply(struct sk_buff *skb)
|
||||
{
|
||||
struct sock *sk = icmpv6_socket->sk;
|
||||
struct sock *sk;
|
||||
struct inet6_dev *idev;
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct ipv6_pinfo *np;
|
||||
struct in6_addr *saddr = NULL;
|
||||
struct icmp6hdr *icmph = (struct icmp6hdr *) skb->h.raw;
|
||||
struct icmp6hdr tmp_hdr;
|
||||
|
@ -454,6 +457,9 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
|
|||
if (icmpv6_xmit_lock())
|
||||
return;
|
||||
|
||||
sk = icmpv6_socket->sk;
|
||||
np = inet6_sk(sk);
|
||||
|
||||
if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
|
||||
fl.oif = np->mcast_oif;
|
||||
|
||||
|
|
|
@ -881,7 +881,7 @@ static int __init tc_action_init(void)
|
|||
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");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -178,6 +178,37 @@ int sctp_rcv(struct sk_buff *skb)
|
|||
|
||||
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.
|
||||
* An SCTP packet is called an "out of the blue" (OOTB)
|
||||
|
@ -187,22 +218,12 @@ int sctp_rcv(struct sk_buff *skb)
|
|||
* packet belongs.
|
||||
*/
|
||||
if (!asoc) {
|
||||
ep = __sctp_rcv_lookup_endpoint(&dest);
|
||||
if (sctp_rcv_ootb(skb)) {
|
||||
SCTP_INC_STATS_BH(SCTP_MIB_OUTOFBLUES);
|
||||
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) */
|
||||
if (skb->stamp.tv_sec == 0) {
|
||||
do_gettimeofday(&skb->stamp);
|
||||
|
@ -265,13 +286,11 @@ int sctp_rcv(struct sk_buff *skb)
|
|||
|
||||
discard_release:
|
||||
/* Release any structures we may be holding. */
|
||||
if (asoc) {
|
||||
sock_put(asoc->base.sk);
|
||||
sock_put(sk);
|
||||
if (asoc)
|
||||
sctp_association_put(asoc);
|
||||
} else {
|
||||
sock_put(ep->base.sk);
|
||||
else
|
||||
sctp_endpoint_put(ep);
|
||||
}
|
||||
|
||||
goto discard_it;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
af = sctp_get_af_specific(addr->sa.sa_family);
|
||||
else {
|
||||
struct sock *sk;
|
||||
int type = ipv6_addr_type(&addr->v6.sin6_addr);
|
||||
sk = sctp_opt2sk(opt);
|
||||
if (type & IPV6_ADDR_LINKLOCAL) {
|
||||
/* Note: Behavior similar to af_inet6.c:
|
||||
* 1) Overrides previous bound_dev_if
|
||||
* 2) Destructive even if bind isn't successful.
|
||||
*/
|
||||
struct net_device *dev;
|
||||
|
||||
if (addr->v6.sin6_scope_id)
|
||||
sk->sk_bound_dev_if = addr->v6.sin6_scope_id;
|
||||
if (!sk->sk_bound_dev_if)
|
||||
if (type & IPV6_ADDR_LINKLOCAL) {
|
||||
if (!addr->v6.sin6_scope_id)
|
||||
return 0;
|
||||
dev = dev_get_by_index(addr->v6.sin6_scope_id);
|
||||
if (!dev)
|
||||
return 0;
|
||||
dev_put(dev);
|
||||
}
|
||||
af = opt->pf->af;
|
||||
}
|
||||
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.
|
||||
*/
|
||||
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)
|
||||
af = sctp_get_af_specific(addr->sa.sa_family);
|
||||
else {
|
||||
struct sock *sk;
|
||||
int type = ipv6_addr_type(&addr->v6.sin6_addr);
|
||||
sk = sctp_opt2sk(opt);
|
||||
if (type & IPV6_ADDR_LINKLOCAL) {
|
||||
/* Note: Behavior similar to af_inet6.c:
|
||||
* 1) Overrides previous bound_dev_if
|
||||
* 2) Destructive even if bind isn't successful.
|
||||
*/
|
||||
struct net_device *dev;
|
||||
|
||||
if (addr->v6.sin6_scope_id)
|
||||
sk->sk_bound_dev_if = addr->v6.sin6_scope_id;
|
||||
if (!sk->sk_bound_dev_if)
|
||||
if (type & IPV6_ADDR_LINKLOCAL) {
|
||||
if (!addr->v6.sin6_scope_id)
|
||||
return 0;
|
||||
dev = dev_get_by_index(addr->v6.sin6_scope_id);
|
||||
if (!dev)
|
||||
return 0;
|
||||
dev_put(dev);
|
||||
}
|
||||
af = opt->pf->af;
|
||||
}
|
||||
|
|
190
net/sctp/proc.c
190
net/sctp/proc.c
|
@ -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)
|
||||
{
|
||||
struct list_head *pos;
|
||||
struct sctp_association *asoc;
|
||||
struct sctp_sockaddr_entry *laddr;
|
||||
union sctp_addr *addr;
|
||||
struct sctp_transport *peer;
|
||||
union sctp_addr *addr, *primary = NULL;
|
||||
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) {
|
||||
laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
|
||||
addr = (union sctp_addr *)&laddr->a;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -149,17 +160,54 @@ static void sctp_seq_dump_remote_addrs(struct seq_file *seq, struct sctp_associa
|
|||
{
|
||||
struct list_head *pos;
|
||||
struct sctp_transport *transport;
|
||||
union sctp_addr *addr;
|
||||
union sctp_addr *addr, *primary;
|
||||
struct sctp_af *af;
|
||||
|
||||
primary = &(assoc->peer.primary_addr);
|
||||
list_for_each(pos, &assoc->peer.transport_addr_list) {
|
||||
transport = list_entry(pos, struct sctp_transport, transports);
|
||||
addr = (union sctp_addr *)&transport->ipaddr;
|
||||
af = sctp_get_af_specific(addr->sa.sa_family);
|
||||
if (af->cmp_addr(addr, primary)) {
|
||||
seq_printf(seq, "*");
|
||||
}
|
||||
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). */
|
||||
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_endpoint *ep;
|
||||
struct sock *sk;
|
||||
int hash;
|
||||
int hash = *(int *)v;
|
||||
|
||||
seq_printf(seq, " ENDPT SOCK STY SST HBKT LPORT LADDRS\n");
|
||||
for (hash = 0; hash < sctp_ep_hashsize; hash++) {
|
||||
head = &sctp_ep_hashtable[hash];
|
||||
read_lock(&head->lock);
|
||||
for (epb = head->chain; epb; epb = epb->next) {
|
||||
ep = sctp_ep(epb);
|
||||
sk = epb->sk;
|
||||
seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d ", ep, sk,
|
||||
sctp_sk(sk)->type, sk->sk_state, hash,
|
||||
epb->bind_addr.port);
|
||||
sctp_seq_dump_local_addrs(seq, epb);
|
||||
seq_printf(seq, "\n");
|
||||
}
|
||||
read_unlock(&head->lock);
|
||||
if (hash > sctp_ep_hashsize)
|
||||
return -ENOMEM;
|
||||
|
||||
head = &sctp_ep_hashtable[hash-1];
|
||||
sctp_local_bh_disable();
|
||||
read_lock(&head->lock);
|
||||
for (epb = head->chain; epb; epb = epb->next) {
|
||||
ep = sctp_ep(epb);
|
||||
sk = epb->sk;
|
||||
seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d %5d %5lu ", ep, sk,
|
||||
sctp_sk(sk)->type, sk->sk_state, hash-1,
|
||||
epb->bind_addr.port,
|
||||
sock_i_uid(sk), sock_i_ino(sk));
|
||||
|
||||
sctp_seq_dump_local_addrs(seq, epb);
|
||||
seq_printf(seq, "\n");
|
||||
}
|
||||
read_unlock(&head->lock);
|
||||
sctp_local_bh_enable();
|
||||
|
||||
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. */
|
||||
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 = {
|
||||
.open = sctp_eps_seq_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
/* Set up the proc fs entry for 'eps' object. */
|
||||
|
@ -221,6 +281,40 @@ void sctp_eps_proc_exit(void)
|
|||
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). */
|
||||
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_association *assoc;
|
||||
struct sock *sk;
|
||||
int hash;
|
||||
int hash = *(int *)v;
|
||||
|
||||
seq_printf(seq, " ASSOC SOCK STY SST ST HBKT LPORT RPORT "
|
||||
"LADDRS <-> RADDRS\n");
|
||||
for (hash = 0; hash < sctp_assoc_hashsize; hash++) {
|
||||
head = &sctp_assoc_hashtable[hash];
|
||||
read_lock(&head->lock);
|
||||
for (epb = head->chain; epb; epb = epb->next) {
|
||||
assoc = sctp_assoc(epb);
|
||||
sk = epb->sk;
|
||||
seq_printf(seq,
|
||||
"%8p %8p %-3d %-3d %-2d %-4d %-5d %-5d ",
|
||||
assoc, sk, sctp_sk(sk)->type, sk->sk_state,
|
||||
assoc->state, hash, epb->bind_addr.port,
|
||||
assoc->peer.port);
|
||||
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);
|
||||
if (hash > sctp_assoc_hashsize)
|
||||
return -ENOMEM;
|
||||
|
||||
head = &sctp_assoc_hashtable[hash-1];
|
||||
sctp_local_bh_disable();
|
||||
read_lock(&head->lock);
|
||||
for (epb = head->chain; epb; epb = epb->next) {
|
||||
assoc = sctp_assoc(epb);
|
||||
sk = epb->sk;
|
||||
seq_printf(seq,
|
||||
"%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ",
|
||||
assoc, sk, sctp_sk(sk)->type, sk->sk_state,
|
||||
assoc->state, hash-1, assoc->assoc_id,
|
||||
(sk->sk_rcvbuf - assoc->rwnd),
|
||||
assoc->sndbuf_used,
|
||||
sock_i_uid(sk), sock_i_ino(sk),
|
||||
epb->bind_addr.port,
|
||||
assoc->peer.port);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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. */
|
||||
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 = {
|
||||
.open = sctp_assocs_seq_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
/* 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)
|
|||
{
|
||||
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 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -4686,6 +4686,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
|
|||
struct sctp_endpoint *newep = newsp->ep;
|
||||
struct sk_buff *skb, *tmp;
|
||||
struct sctp_ulpevent *event;
|
||||
int flags = 0;
|
||||
|
||||
/* Migrate socket buffer sizes and all the socket level options to the
|
||||
* new socket.
|
||||
|
@ -4707,6 +4708,17 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
|
|||
sctp_sk(newsk)->bind_hash = pp;
|
||||
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
|
||||
* peeled off association to the new socket's receive queue.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue