Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (25 commits)
  [XFRM]: Allow packet drops during larval state resolution.
  [CASSINI]: Check pci_set_mwi() return value.
  [NET]: "wrong timeout value" in sk_wait_data() v2
  [NETFILTER]: nf_nat_h323: call set_h225_addr instead of set_h225_addr_hook
  [NETFILTER]: nf_conntrack_h323: add missing T.120 address in OLCA
  [NETFILTER]: nf_conntrack_h323: remove unnecessary process of Information signal
  [NETFILTER]: nf_conntrack_h323: fix get_h225_addr() for IPv6 address access
  [NETFILTER]: nf_conntrack_h323: fix ASN.1 types
  [NETFILTER]: nf_conntrack_ftp: fix newline sequence number calculation
  [NETFILTER]: nf_conntrack_ftp: fix newline sequence number update
  [NET_SCHED]: sch_htb: fix event cache time calculation
  [DCCP]: Fix build warning when debugging is disabled.
  [TIPC]: Fixed erroneous introduction of for_each_netdev
  [RTNETLINK]: Fix sending netlink message when replace route.
  [TR]: Use menuconfig objects.
  [ARCNET]: Use menuconfig objects.
  [TIPC]: Use menuconfig objects.
  [SCTP]: Use menuconfig objects.
  [IPVS]: Use menuconfig objects.
  [DCCP]: Use menuconfig objects.
  ...
This commit is contained in:
Linus Torvalds 2007-05-24 18:41:28 -07:00
commit 1c1ee4c3e7
40 changed files with 473 additions and 307 deletions

View file

@ -47,7 +47,8 @@ static char const rcsid[] =
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <asm/semaphore.h> #include <linux/mutex.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/atomic.h> #include <asm/atomic.h>
@ -2435,7 +2436,7 @@ idt77252_open(struct atm_vcc *vcc)
set_bit(ATM_VF_ADDR, &vcc->flags); set_bit(ATM_VF_ADDR, &vcc->flags);
down(&card->mutex); mutex_lock(&card->mutex);
OPRINTK("%s: opening vpi.vci: %d.%d\n", card->name, vpi, vci); OPRINTK("%s: opening vpi.vci: %d.%d\n", card->name, vpi, vci);
@ -2446,7 +2447,7 @@ idt77252_open(struct atm_vcc *vcc)
break; break;
default: default:
printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal); printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal);
up(&card->mutex); mutex_unlock(&card->mutex);
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
} }
@ -2455,7 +2456,7 @@ idt77252_open(struct atm_vcc *vcc)
card->vcs[index] = kzalloc(sizeof(struct vc_map), GFP_KERNEL); card->vcs[index] = kzalloc(sizeof(struct vc_map), GFP_KERNEL);
if (!card->vcs[index]) { if (!card->vcs[index]) {
printk("%s: can't alloc vc in open()\n", card->name); printk("%s: can't alloc vc in open()\n", card->name);
up(&card->mutex); mutex_unlock(&card->mutex);
return -ENOMEM; return -ENOMEM;
} }
card->vcs[index]->card = card; card->vcs[index]->card = card;
@ -2484,14 +2485,14 @@ idt77252_open(struct atm_vcc *vcc)
if (inuse) { if (inuse) {
printk("%s: %s vci already in use.\n", card->name, printk("%s: %s vci already in use.\n", card->name,
inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx"); inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx");
up(&card->mutex); mutex_unlock(&card->mutex);
return -EADDRINUSE; return -EADDRINUSE;
} }
if (vcc->qos.txtp.traffic_class != ATM_NONE) { if (vcc->qos.txtp.traffic_class != ATM_NONE) {
error = idt77252_init_tx(card, vc, vcc, &vcc->qos); error = idt77252_init_tx(card, vc, vcc, &vcc->qos);
if (error) { if (error) {
up(&card->mutex); mutex_unlock(&card->mutex);
return error; return error;
} }
} }
@ -2499,14 +2500,14 @@ idt77252_open(struct atm_vcc *vcc)
if (vcc->qos.rxtp.traffic_class != ATM_NONE) { if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
error = idt77252_init_rx(card, vc, vcc, &vcc->qos); error = idt77252_init_rx(card, vc, vcc, &vcc->qos);
if (error) { if (error) {
up(&card->mutex); mutex_unlock(&card->mutex);
return error; return error;
} }
} }
set_bit(ATM_VF_READY, &vcc->flags); set_bit(ATM_VF_READY, &vcc->flags);
up(&card->mutex); mutex_unlock(&card->mutex);
return 0; return 0;
} }
@ -2520,7 +2521,7 @@ idt77252_close(struct atm_vcc *vcc)
unsigned long addr; unsigned long addr;
unsigned long timeout; unsigned long timeout;
down(&card->mutex); mutex_lock(&card->mutex);
IPRINTK("%s: idt77252_close: vc = %d (%d.%d)\n", IPRINTK("%s: idt77252_close: vc = %d (%d.%d)\n",
card->name, vc->index, vcc->vpi, vcc->vci); card->name, vc->index, vcc->vpi, vcc->vci);
@ -2591,7 +2592,7 @@ idt77252_close(struct atm_vcc *vcc)
free_scq(card, vc->scq); free_scq(card, vc->scq);
} }
up(&card->mutex); mutex_unlock(&card->mutex);
} }
static int static int
@ -2602,7 +2603,7 @@ idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags)
struct vc_map *vc = vcc->dev_data; struct vc_map *vc = vcc->dev_data;
int error = 0; int error = 0;
down(&card->mutex); mutex_lock(&card->mutex);
if (qos->txtp.traffic_class != ATM_NONE) { if (qos->txtp.traffic_class != ATM_NONE) {
if (!test_bit(VCF_TX, &vc->flags)) { if (!test_bit(VCF_TX, &vc->flags)) {
@ -2648,7 +2649,7 @@ idt77252_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags)
set_bit(ATM_VF_HASQOS, &vcc->flags); set_bit(ATM_VF_HASQOS, &vcc->flags);
out: out:
up(&card->mutex); mutex_unlock(&card->mutex);
return error; return error;
} }
@ -3709,7 +3710,7 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
membase = pci_resource_start(pcidev, 1); membase = pci_resource_start(pcidev, 1);
srambase = pci_resource_start(pcidev, 2); srambase = pci_resource_start(pcidev, 2);
init_MUTEX(&card->mutex); mutex_init(&card->mutex);
spin_lock_init(&card->cmd_lock); spin_lock_init(&card->cmd_lock);
spin_lock_init(&card->tst_lock); spin_lock_init(&card->tst_lock);

View file

@ -37,7 +37,7 @@
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mutex.h>
/*****************************************************************************/ /*****************************************************************************/
/* */ /* */
@ -359,7 +359,7 @@ struct idt77252_dev
unsigned long srambase; /* SAR's sram base address */ unsigned long srambase; /* SAR's sram base address */
void __iomem *fbq[4]; /* FBQ fill addresses */ void __iomem *fbq[4]; /* FBQ fill addresses */
struct semaphore mutex; struct mutex mutex;
spinlock_t cmd_lock; /* for r/w utility/sram */ spinlock_t cmd_lock; /* for r/w utility/sram */
unsigned long softstat; unsigned long softstat;

View file

@ -115,11 +115,11 @@ static struct usb_device_id blacklist_ids[] = {
{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 },
/* Broadcom BCM2045 */ /* Broadcom BCM2045 */
{ USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
/* IBM/Lenovo ThinkPad with Broadcom chip */ /* IBM/Lenovo ThinkPad with Broadcom chip */
{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
{ USB_DEVICE(0x0a5c, 0x2110), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x2110), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
/* Targus ACB10US */ /* Targus ACB10US */
{ USB_DEVICE(0x0a5c, 0x2100), .driver_info = HCI_RESET }, { USB_DEVICE(0x0a5c, 0x2100), .driver_info = HCI_RESET },
@ -128,17 +128,17 @@ static struct usb_device_id blacklist_ids[] = {
{ USB_DEVICE(0x0a5c, 0x2111), .driver_info = HCI_RESET }, { USB_DEVICE(0x0a5c, 0x2111), .driver_info = HCI_RESET },
/* HP laptop with Broadcom chip */ /* HP laptop with Broadcom chip */
{ USB_DEVICE(0x03f0, 0x171d), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x03f0, 0x171d), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
/* Dell laptop with Broadcom chip */ /* Dell laptop with Broadcom chip */
{ USB_DEVICE(0x413c, 0x8126), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x413c, 0x8126), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
/* Microsoft Wireless Transceiver for Bluetooth 2.0 */ /* Microsoft Wireless Transceiver for Bluetooth 2.0 */
{ USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET }, { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET },
/* Kensington Bluetooth USB adapter */ /* Kensington Bluetooth USB adapter */
{ USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET }, { USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET },
{ USB_DEVICE(0x047d, 0x105e), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x047d, 0x105e), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
/* ISSC Bluetooth Adapter v3.1 */ /* ISSC Bluetooth Adapter v3.1 */
{ USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET }, { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET },
@ -148,8 +148,8 @@ static struct usb_device_id blacklist_ids[] = {
{ USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC }, { USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC },
/* Belkin F8T012 and F8T013 devices */ /* Belkin F8T012 and F8T013 devices */
{ USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
{ USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_WRONG_SCO_MTU }, { USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
/* Digianswer devices */ /* Digianswer devices */
{ USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER }, { USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },

View file

@ -2,10 +2,8 @@
# Arcnet configuration # Arcnet configuration
# #
menu "ARCnet devices" menuconfig ARCNET
depends on NETDEVICES && (ISA || PCI) depends on NETDEVICES && (ISA || PCI)
config ARCNET
tristate "ARCnet support" tristate "ARCnet support"
---help--- ---help---
If you have a network card of this type, say Y and check out the If you have a network card of this type, say Y and check out the
@ -25,9 +23,10 @@ config ARCNET
<file:Documentation/networking/net-modules.txt>. The module will <file:Documentation/networking/net-modules.txt>. The module will
be called arcnet. be called arcnet.
if ARCNET
config ARCNET_1201 config ARCNET_1201
tristate "Enable standard ARCNet packet format (RFC 1201)" tristate "Enable standard ARCNet packet format (RFC 1201)"
depends on ARCNET
help help
This allows you to use RFC1201 with your ARCnet card via the virtual This allows you to use RFC1201 with your ARCnet card via the virtual
arc0 device. You need to say Y here to communicate with arc0 device. You need to say Y here to communicate with
@ -38,7 +37,6 @@ config ARCNET_1201
config ARCNET_1051 config ARCNET_1051
tristate "Enable old ARCNet packet format (RFC 1051)" tristate "Enable old ARCNet packet format (RFC 1051)"
depends on ARCNET
---help--- ---help---
This allows you to use RFC1051 with your ARCnet card via the virtual This allows you to use RFC1051 with your ARCnet card via the virtual
arc0s device. You only need arc0s if you want to talk to ARCnet arc0s device. You only need arc0s if you want to talk to ARCnet
@ -53,7 +51,6 @@ config ARCNET_1051
config ARCNET_RAW config ARCNET_RAW
tristate "Enable raw mode packet interface" tristate "Enable raw mode packet interface"
depends on ARCNET
help help
ARCnet "raw mode" packet encapsulation, no soft headers. Unlikely ARCnet "raw mode" packet encapsulation, no soft headers. Unlikely
to work unless talking to a copy of the same Linux arcnet driver, to work unless talking to a copy of the same Linux arcnet driver,
@ -61,7 +58,6 @@ config ARCNET_RAW
config ARCNET_CAP config ARCNET_CAP
tristate "Enable CAP mode packet interface" tristate "Enable CAP mode packet interface"
depends on ARCNET
help help
ARCnet "cap mode" packet encapsulation. Used to get the hardware ARCnet "cap mode" packet encapsulation. Used to get the hardware
acknowledge back to userspace. After the initial protocol byte every acknowledge back to userspace. After the initial protocol byte every
@ -80,7 +76,6 @@ config ARCNET_CAP
config ARCNET_COM90xx config ARCNET_COM90xx
tristate "ARCnet COM90xx (normal) chipset driver" tristate "ARCnet COM90xx (normal) chipset driver"
depends on ARCNET
help help
This is the chipset driver for the standard COM90xx cards. If you This is the chipset driver for the standard COM90xx cards. If you
have always used the old ARCnet driver without knowing what type of have always used the old ARCnet driver without knowing what type of
@ -92,7 +87,6 @@ config ARCNET_COM90xx
config ARCNET_COM90xxIO config ARCNET_COM90xxIO
tristate "ARCnet COM90xx (IO mapped) chipset driver" tristate "ARCnet COM90xx (IO mapped) chipset driver"
depends on ARCNET
---help--- ---help---
This is the chipset driver for the COM90xx cards, using them in This is the chipset driver for the COM90xx cards, using them in
IO-mapped mode instead of memory-mapped mode. This is slower than IO-mapped mode instead of memory-mapped mode. This is slower than
@ -105,7 +99,6 @@ config ARCNET_COM90xxIO
config ARCNET_RIM_I config ARCNET_RIM_I
tristate "ARCnet COM90xx (RIM I) chipset driver" tristate "ARCnet COM90xx (RIM I) chipset driver"
depends on ARCNET
---help--- ---help---
This is yet another chipset driver for the COM90xx cards, but this This is yet another chipset driver for the COM90xx cards, but this
time only using memory-mapped mode, and no IO ports at all. This time only using memory-mapped mode, and no IO ports at all. This
@ -118,7 +111,6 @@ config ARCNET_RIM_I
config ARCNET_COM20020 config ARCNET_COM20020
tristate "ARCnet COM20020 chipset driver" tristate "ARCnet COM20020 chipset driver"
depends on ARCNET
help help
This is the driver for the new COM20020 chipset. It supports such This is the driver for the new COM20020 chipset. It supports such
things as promiscuous mode, so packet sniffing is possible, and things as promiscuous mode, so packet sniffing is possible, and
@ -136,5 +128,4 @@ config ARCNET_COM20020_PCI
tristate "Support for COM20020 on PCI" tristate "Support for COM20020 on PCI"
depends on ARCNET_COM20020 && PCI depends on ARCNET_COM20020 && PCI
endmenu endif # ARCNET

View file

@ -4919,7 +4919,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
pci_cmd &= ~PCI_COMMAND_SERR; pci_cmd &= ~PCI_COMMAND_SERR;
pci_cmd |= PCI_COMMAND_PARITY; pci_cmd |= PCI_COMMAND_PARITY;
pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
pci_set_mwi(pdev); if (pci_set_mwi(pdev))
printk(KERN_WARNING PFX "Could enable MWI for %s\n",
pci_name(pdev));
/* /*
* On some architectures, the default cache line size set * On some architectures, the default cache line size set
* by pci_set_mwi reduces perforamnce. We have to increase * by pci_set_mwi reduces perforamnce. We have to increase

View file

@ -2,12 +2,10 @@
# Token Ring driver configuration # Token Ring driver configuration
# #
menu "Token Ring devices"
depends on NETDEVICES && !UML
# So far, we only have PCI, ISA, and MCA token ring devices # So far, we only have PCI, ISA, and MCA token ring devices
config TR menuconfig TR
bool "Token Ring driver support" bool "Token Ring driver support"
depends on NETDEVICES && !UML
depends on (PCI || ISA || MCA || CCW) depends on (PCI || ISA || MCA || CCW)
select LLC select LLC
help help
@ -20,9 +18,11 @@ config TR
from <http://www.tldp.org/docs.html#howto>. Most people can from <http://www.tldp.org/docs.html#howto>. Most people can
say N here. say N here.
if TR
config IBMTR config IBMTR
tristate "IBM Tropic chipset based adapter support" tristate "IBM Tropic chipset based adapter support"
depends on TR && (ISA || MCA) depends on ISA || MCA
---help--- ---help---
This is support for all IBM Token Ring cards that don't use DMA. If This is support for all IBM Token Ring cards that don't use DMA. If
you have such a beast, say Y and read the Token-Ring mini-HOWTO, you have such a beast, say Y and read the Token-Ring mini-HOWTO,
@ -36,7 +36,7 @@ config IBMTR
config IBMOL config IBMOL
tristate "IBM Olympic chipset PCI adapter support" tristate "IBM Olympic chipset PCI adapter support"
depends on TR && PCI depends on PCI
---help--- ---help---
This is support for all non-Lanstreamer IBM PCI Token Ring Cards. This is support for all non-Lanstreamer IBM PCI Token Ring Cards.
Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
@ -54,7 +54,7 @@ config IBMOL
config IBMLS config IBMLS
tristate "IBM Lanstreamer chipset PCI adapter support" tristate "IBM Lanstreamer chipset PCI adapter support"
depends on TR && PCI && !64BIT depends on PCI && !64BIT
help help
This is support for IBM Lanstreamer PCI Token Ring Cards. This is support for IBM Lanstreamer PCI Token Ring Cards.
@ -66,7 +66,7 @@ config IBMLS
config 3C359 config 3C359
tristate "3Com 3C359 Token Link Velocity XL adapter support" tristate "3Com 3C359 Token Link Velocity XL adapter support"
depends on TR && PCI depends on PCI
---help--- ---help---
This is support for the 3Com PCI Velocity XL cards, specifically This is support for the 3Com PCI Velocity XL cards, specifically
the 3Com 3C359, please note this is not for the 3C339 cards, you the 3Com 3C359, please note this is not for the 3C339 cards, you
@ -84,7 +84,7 @@ config 3C359
config TMS380TR config TMS380TR
tristate "Generic TMS380 Token Ring ISA/PCI adapter support" tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
depends on TR && (PCI || ISA && ISA_DMA_API || MCA) depends on PCI || ISA && ISA_DMA_API || MCA
select FW_LOADER select FW_LOADER
---help--- ---help---
This driver provides generic support for token ring adapters This driver provides generic support for token ring adapters
@ -108,7 +108,7 @@ config TMS380TR
config TMSPCI config TMSPCI
tristate "Generic TMS380 PCI support" tristate "Generic TMS380 PCI support"
depends on TR && TMS380TR && PCI depends on TMS380TR && PCI
---help--- ---help---
This tms380 module supports generic TMS380-based PCI cards. This tms380 module supports generic TMS380-based PCI cards.
@ -123,7 +123,7 @@ config TMSPCI
config SKISA config SKISA
tristate "SysKonnect TR4/16 ISA support" tristate "SysKonnect TR4/16 ISA support"
depends on TR && TMS380TR && ISA depends on TMS380TR && ISA
help help
This tms380 module supports SysKonnect TR4/16 ISA cards. This tms380 module supports SysKonnect TR4/16 ISA cards.
@ -135,7 +135,7 @@ config SKISA
config PROTEON config PROTEON
tristate "Proteon ISA support" tristate "Proteon ISA support"
depends on TR && TMS380TR && ISA depends on TMS380TR && ISA
help help
This tms380 module supports Proteon ISA cards. This tms380 module supports Proteon ISA cards.
@ -148,7 +148,7 @@ config PROTEON
config ABYSS config ABYSS
tristate "Madge Smart 16/4 PCI Mk2 support" tristate "Madge Smart 16/4 PCI Mk2 support"
depends on TR && TMS380TR && PCI depends on TMS380TR && PCI
help help
This tms380 module supports the Madge Smart 16/4 PCI Mk2 This tms380 module supports the Madge Smart 16/4 PCI Mk2
cards (51-02). cards (51-02).
@ -158,7 +158,7 @@ config ABYSS
config MADGEMC config MADGEMC
tristate "Madge Smart 16/4 Ringnode MicroChannel" tristate "Madge Smart 16/4 Ringnode MicroChannel"
depends on TR && TMS380TR && MCA depends on TMS380TR && MCA
help help
This tms380 module supports the Madge Smart 16/4 MC16 and MC32 This tms380 module supports the Madge Smart 16/4 MC16 and MC32
MicroChannel adapters. MicroChannel adapters.
@ -168,7 +168,7 @@ config MADGEMC
config SMCTR config SMCTR
tristate "SMC ISA/MCA adapter support" tristate "SMC ISA/MCA adapter support"
depends on TR && (ISA || MCA_LEGACY) && (BROKEN || !64BIT) depends on (ISA || MCA_LEGACY) && (BROKEN || !64BIT)
---help--- ---help---
This is support for the ISA and MCA SMC Token Ring cards, This is support for the ISA and MCA SMC Token Ring cards,
specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A
@ -182,5 +182,4 @@ config SMCTR
To compile this driver as a module, choose M here: the module will be To compile this driver as a module, choose M here: the module will be
called smctr. called smctr.
endmenu endif # TR

View file

@ -37,8 +37,7 @@ extern unsigned int (*nf_nat_ftp_hook)(struct sk_buff **pskb,
enum nf_ct_ftp_type type, enum nf_ct_ftp_type type,
unsigned int matchoff, unsigned int matchoff,
unsigned int matchlen, unsigned int matchlen,
struct nf_conntrack_expect *exp, struct nf_conntrack_expect *exp);
u32 *seq);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _NF_CONNTRACK_FTP_H */ #endif /* _NF_CONNTRACK_FTP_H */

View file

@ -1,4 +1,4 @@
/* Generated by Jing Min Zhao's ASN.1 parser, Apr 20 2006 /* Generated by Jing Min Zhao's ASN.1 parser, May 16 2007
* *
* Copyright (c) 2006 Jing Min Zhao <zhaojingmin@users.sourceforge.net> * Copyright (c) 2006 Jing Min Zhao <zhaojingmin@users.sourceforge.net>
* *
@ -12,7 +12,7 @@ typedef struct TransportAddress_ipAddress { /* SEQUENCE */
typedef struct TransportAddress_ip6Address { /* SEQUENCE */ typedef struct TransportAddress_ip6Address { /* SEQUENCE */
int options; /* No use */ int options; /* No use */
unsigned ip6; unsigned ip;
} TransportAddress_ip6Address; } TransportAddress_ip6Address;
typedef struct TransportAddress { /* CHOICE */ typedef struct TransportAddress { /* CHOICE */
@ -364,23 +364,6 @@ typedef struct Alerting_UUIE { /* SEQUENCE */
Alerting_UUIE_fastStart fastStart; Alerting_UUIE_fastStart fastStart;
} Alerting_UUIE; } Alerting_UUIE;
typedef struct Information_UUIE_fastStart { /* SEQUENCE OF */
int count;
OpenLogicalChannel item[30];
} Information_UUIE_fastStart;
typedef struct Information_UUIE { /* SEQUENCE */
enum {
eInformation_UUIE_callIdentifier = (1 << 31),
eInformation_UUIE_tokens = (1 << 30),
eInformation_UUIE_cryptoTokens = (1 << 29),
eInformation_UUIE_fastStart = (1 << 28),
eInformation_UUIE_fastConnectRefused = (1 << 27),
eInformation_UUIE_circuitInfo = (1 << 26),
} options;
Information_UUIE_fastStart fastStart;
} Information_UUIE;
typedef struct FacilityReason { /* CHOICE */ typedef struct FacilityReason { /* CHOICE */
enum { enum {
eFacilityReason_routeCallToGatekeeper, eFacilityReason_routeCallToGatekeeper,
@ -471,7 +454,6 @@ typedef struct H323_UU_PDU_h323_message_body { /* CHOICE */
CallProceeding_UUIE callProceeding; CallProceeding_UUIE callProceeding;
Connect_UUIE connect; Connect_UUIE connect;
Alerting_UUIE alerting; Alerting_UUIE alerting;
Information_UUIE information;
Facility_UUIE facility; Facility_UUIE facility;
Progress_UUIE progress; Progress_UUIE progress;
}; };
@ -561,6 +543,7 @@ typedef struct OpenLogicalChannelAck { /* SEQUENCE */
} options; } options;
OpenLogicalChannelAck_reverseLogicalChannelParameters OpenLogicalChannelAck_reverseLogicalChannelParameters
reverseLogicalChannelParameters; reverseLogicalChannelParameters;
NetworkAccessParameters separateStack;
OpenLogicalChannelAck_forwardMultiplexAckParameters OpenLogicalChannelAck_forwardMultiplexAckParameters
forwardMultiplexAckParameters; forwardMultiplexAckParameters;
} OpenLogicalChannelAck; } OpenLogicalChannelAck;

View file

@ -129,8 +129,10 @@ struct l2cap_conf_rsp {
__u8 data[0]; __u8 data[0];
} __attribute__ ((packed)); } __attribute__ ((packed));
#define L2CAP_CONF_SUCCESS 0x00 #define L2CAP_CONF_SUCCESS 0x0000
#define L2CAP_CONF_UNACCEPT 0x01 #define L2CAP_CONF_UNACCEPT 0x0001
#define L2CAP_CONF_REJECT 0x0002
#define L2CAP_CONF_UNKNOWN 0x0003
struct l2cap_conf_opt { struct l2cap_conf_opt {
__u8 type; __u8 type;
@ -215,6 +217,8 @@ struct l2cap_pinfo {
__u32 link_mode; __u32 link_mode;
__u8 conf_req[64];
__u8 conf_len;
__u8 conf_state; __u8 conf_state;
__u8 conf_retry; __u8 conf_retry;
__u16 conf_mtu; __u16 conf_mtu;

View file

@ -265,9 +265,16 @@ static inline int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
{ {
return 0; return 0;
} }
static inline int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
struct sock *sk, int flags)
{
return 0;
}
#else #else
extern int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, extern int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
struct sock *sk, int flags); struct sock *sk, int flags);
extern int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
struct sock *sk, int flags);
#endif #endif
#endif #endif

View file

@ -469,6 +469,9 @@ extern void ip6_flush_pending_frames(struct sock *sk);
extern int ip6_dst_lookup(struct sock *sk, extern int ip6_dst_lookup(struct sock *sk,
struct dst_entry **dst, struct dst_entry **dst,
struct flowi *fl); struct flowi *fl);
extern int ip6_dst_blackhole(struct sock *sk,
struct dst_entry **dst,
struct flowi *fl);
extern int ip6_sk_dst_lookup(struct sock *sk, extern int ip6_sk_dst_lookup(struct sock *sk,
struct dst_entry **dst, struct dst_entry **dst,
struct flowi *fl); struct flowi *fl);

View file

@ -507,6 +507,7 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent)
} }
/* Default config options */ /* Default config options */
pi->conf_len = 0;
pi->conf_mtu = L2CAP_DEFAULT_MTU; pi->conf_mtu = L2CAP_DEFAULT_MTU;
pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
} }
@ -1271,42 +1272,6 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned
return len; return len;
} }
static inline void l2cap_parse_conf_req(struct sock *sk, void *data, int len)
{
int type, hint, olen;
unsigned long val;
void *ptr = data;
BT_DBG("sk %p len %d", sk, len);
while (len >= L2CAP_CONF_OPT_SIZE) {
len -= l2cap_get_conf_opt(&ptr, &type, &olen, &val);
hint = type & 0x80;
type &= 0x7f;
switch (type) {
case L2CAP_CONF_MTU:
l2cap_pi(sk)->conf_mtu = val;
break;
case L2CAP_CONF_FLUSH_TO:
l2cap_pi(sk)->flush_to = val;
break;
case L2CAP_CONF_QOS:
break;
default:
if (hint)
break;
/* FIXME: Reject unknown option */
break;
}
}
}
static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
{ {
struct l2cap_conf_opt *opt = *ptr; struct l2cap_conf_opt *opt = *ptr;
@ -1358,39 +1323,75 @@ static int l2cap_build_conf_req(struct sock *sk, void *data)
return ptr - data; return ptr - data;
} }
static inline int l2cap_conf_output(struct sock *sk, void **ptr) static int l2cap_parse_conf_req(struct sock *sk, void *data)
{ {
struct l2cap_pinfo *pi = l2cap_pi(sk); struct l2cap_pinfo *pi = l2cap_pi(sk);
int result = 0; struct l2cap_conf_rsp *rsp = data;
void *ptr = rsp->data;
void *req = pi->conf_req;
int len = pi->conf_len;
int type, hint, olen;
unsigned long val;
u16 result = L2CAP_CONF_SUCCESS;
/* Configure output options and let the other side know BT_DBG("sk %p", sk);
* which ones we don't like. */
if (pi->conf_mtu < pi->omtu)
result = L2CAP_CONF_UNACCEPT;
else
pi->omtu = pi->conf_mtu;
l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); while (len >= L2CAP_CONF_OPT_SIZE) {
len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
BT_DBG("sk %p result %d", sk, result); hint = type & 0x80;
return result; type &= 0x7f;
switch (type) {
case L2CAP_CONF_MTU:
pi->conf_mtu = val;
break;
case L2CAP_CONF_FLUSH_TO:
pi->flush_to = val;
break;
case L2CAP_CONF_QOS:
break;
default:
if (hint)
break;
result = L2CAP_CONF_UNKNOWN;
*((u8 *) ptr++) = type;
break;
}
}
if (result == L2CAP_CONF_SUCCESS) {
/* Configure output options and let the other side know
* which ones we don't like. */
if (pi->conf_mtu < pi->omtu)
result = L2CAP_CONF_UNACCEPT;
else
pi->omtu = pi->conf_mtu;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
}
rsp->scid = cpu_to_le16(pi->dcid);
rsp->result = cpu_to_le16(result);
rsp->flags = cpu_to_le16(0x0000);
return ptr - data;
} }
static int l2cap_build_conf_rsp(struct sock *sk, void *data, int *result) static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags)
{ {
struct l2cap_conf_rsp *rsp = data; struct l2cap_conf_rsp *rsp = data;
void *ptr = rsp->data; void *ptr = rsp->data;
u16 flags = 0;
BT_DBG("sk %p complete %d", sk, result ? 1 : 0); BT_DBG("sk %p", sk);
if (result)
*result = l2cap_conf_output(sk, &ptr);
else
flags = 0x0001;
rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid);
rsp->result = cpu_to_le16(result ? *result : 0); rsp->result = cpu_to_le16(result);
rsp->flags = cpu_to_le16(flags); rsp->flags = cpu_to_le16(flags);
return ptr - data; return ptr - data;
@ -1535,7 +1536,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
u16 dcid, flags; u16 dcid, flags;
u8 rsp[64]; u8 rsp[64];
struct sock *sk; struct sock *sk;
int result; int len;
dcid = __le16_to_cpu(req->dcid); dcid = __le16_to_cpu(req->dcid);
flags = __le16_to_cpu(req->flags); flags = __le16_to_cpu(req->flags);
@ -1548,25 +1549,40 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
if (sk->sk_state == BT_DISCONN) if (sk->sk_state == BT_DISCONN)
goto unlock; goto unlock;
l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); /* Reject if config buffer is too small. */
len = cmd->len - sizeof(*req);
if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) {
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
l2cap_build_conf_rsp(sk, rsp,
L2CAP_CONF_REJECT, flags), rsp);
goto unlock;
}
/* Store config. */
memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len);
l2cap_pi(sk)->conf_len += len;
if (flags & 0x0001) { if (flags & 0x0001) {
/* Incomplete config. Send empty response. */ /* Incomplete config. Send empty response. */
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
l2cap_build_conf_rsp(sk, rsp, NULL), rsp); l2cap_build_conf_rsp(sk, rsp,
L2CAP_CONF_SUCCESS, 0x0001), rsp);
goto unlock; goto unlock;
} }
/* Complete config. */ /* Complete config. */
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len = l2cap_parse_conf_req(sk, rsp);
l2cap_build_conf_rsp(sk, rsp, &result), rsp); if (len < 0)
if (result)
goto unlock; goto unlock;
/* Output config done */ l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
/* Output config done. */
l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE;
/* Reset config buffer. */
l2cap_pi(sk)->conf_len = 0;
if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
sk->sk_state = BT_CONNECTED; sk->sk_state = BT_CONNECTED;
l2cap_chan_ready(sk); l2cap_chan_ready(sk);

View file

@ -206,7 +206,19 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
return -EINVAL; return -EINVAL;
if (copy_from_user(&tv, optval, sizeof(tv))) if (copy_from_user(&tv, optval, sizeof(tv)))
return -EFAULT; return -EFAULT;
if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC)
return -EDOM;
if (tv.tv_sec < 0) {
static int warned = 0;
*timeo_p = 0;
if (warned < 10 && net_ratelimit())
warned++;
printk(KERN_INFO "sock_set_timeout: `%s' (pid %d) "
"tries to set negative timeout\n",
current->comm, current->pid);
return 0;
}
*timeo_p = MAX_SCHEDULE_TIMEOUT; *timeo_p = MAX_SCHEDULE_TIMEOUT;
if (tv.tv_sec == 0 && tv.tv_usec == 0) if (tv.tv_sec == 0 && tv.tv_usec == 0)
return 0; return 0;

View file

@ -24,6 +24,7 @@ extern int sysctl_core_destroy_delay;
#ifdef CONFIG_XFRM #ifdef CONFIG_XFRM
extern u32 sysctl_xfrm_aevent_etime; extern u32 sysctl_xfrm_aevent_etime;
extern u32 sysctl_xfrm_aevent_rseqth; extern u32 sysctl_xfrm_aevent_rseqth;
extern int sysctl_xfrm_larval_drop;
#endif #endif
ctl_table core_table[] = { ctl_table core_table[] = {
@ -118,6 +119,14 @@ ctl_table core_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec .proc_handler = &proc_dointvec
}, },
{
.ctl_name = CTL_UNNUMBERED,
.procname = "xfrm_larval_drop",
.data = &sysctl_xfrm_larval_drop,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_dointvec
},
#endif /* CONFIG_XFRM */ #endif /* CONFIG_XFRM */
#endif /* CONFIG_NET */ #endif /* CONFIG_NET */
{ {

View file

@ -1,8 +1,6 @@
menu "DCCP Configuration (EXPERIMENTAL)" menuconfig IP_DCCP
depends on INET && EXPERIMENTAL
config IP_DCCP
tristate "The DCCP Protocol (EXPERIMENTAL)" tristate "The DCCP Protocol (EXPERIMENTAL)"
depends on INET && EXPERIMENTAL
---help--- ---help---
Datagram Congestion Control Protocol (RFC 4340) Datagram Congestion Control Protocol (RFC 4340)
@ -19,19 +17,20 @@ config IP_DCCP
If in doubt, say N. If in doubt, say N.
if IP_DCCP
config INET_DCCP_DIAG config INET_DCCP_DIAG
depends on IP_DCCP && INET_DIAG depends on INET_DIAG
def_tristate y if (IP_DCCP = y && INET_DIAG = y) def_tristate y if (IP_DCCP = y && INET_DIAG = y)
def_tristate m def_tristate m
config IP_DCCP_ACKVEC config IP_DCCP_ACKVEC
depends on IP_DCCP
bool bool
source "net/dccp/ccids/Kconfig" source "net/dccp/ccids/Kconfig"
menu "DCCP Kernel Hacking" menu "DCCP Kernel Hacking"
depends on IP_DCCP && DEBUG_KERNEL=y depends on DEBUG_KERNEL=y
config IP_DCCP_DEBUG config IP_DCCP_DEBUG
bool "DCCP debug messages" bool "DCCP debug messages"
@ -61,4 +60,4 @@ config NET_DCCPPROBE
endmenu endmenu
endmenu endif # IP_DDCP

View file

@ -419,7 +419,6 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more,
static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
{ {
const struct dccp_sock *dp = dccp_sk(sk);
struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
struct ccid3_options_received *opt_recv; struct ccid3_options_received *opt_recv;
struct dccp_tx_hist_entry *packet; struct dccp_tx_hist_entry *packet;
@ -491,7 +490,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
ccid3_pr_debug("%s(%p), s=%u, MSS=%u, " ccid3_pr_debug("%s(%p), s=%u, MSS=%u, "
"R_sample=%uus, X=%u\n", dccp_role(sk), "R_sample=%uus, X=%u\n", dccp_role(sk),
sk, hctx->ccid3hctx_s, sk, hctx->ccid3hctx_s,
dp->dccps_mss_cache, r_sample, dccp_sk(sk)->dccps_mss_cache, r_sample,
(unsigned)(hctx->ccid3hctx_x >> 6)); (unsigned)(hctx->ccid3hctx_x >> 6));
ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK); ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK);

View file

@ -1043,9 +1043,13 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
if (final_p) if (final_p)
ipv6_addr_copy(&fl.fl6_dst, final_p); ipv6_addr_copy(&fl.fl6_dst, final_p);
err = xfrm_lookup(&dst, &fl, sk, 1); err = __xfrm_lookup(&dst, &fl, sk, 1);
if (err < 0) if (err < 0) {
goto failure; if (err == -EREMOTE)
err = ip6_dst_blackhole(sk, &dst, &fl);
if (err < 0)
goto failure;
}
if (saddr == NULL) { if (saddr == NULL) {
saddr = &fl.fl6_src; saddr = &fl.fl6_src;

View file

@ -456,6 +456,8 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg)
fib_release_info(fi_drop); fib_release_info(fi_drop);
if (state & FA_S_ACCESSED) if (state & FA_S_ACCESSED)
rt_cache_flush(-1); rt_cache_flush(-1);
rtmsg_fib(RTM_NEWROUTE, key, fa, cfg->fc_dst_len, tb->tb_id,
&cfg->fc_nlinfo, NLM_F_REPLACE);
return 0; return 0;
} }
@ -523,7 +525,7 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg)
rt_cache_flush(-1); rt_cache_flush(-1);
rtmsg_fib(RTM_NEWROUTE, key, new_fa, cfg->fc_dst_len, tb->tb_id, rtmsg_fib(RTM_NEWROUTE, key, new_fa, cfg->fc_dst_len, tb->tb_id,
&cfg->fc_nlinfo); &cfg->fc_nlinfo, 0);
return 0; return 0;
out_free_new_fa: out_free_new_fa:
@ -589,7 +591,7 @@ static int fn_hash_delete(struct fib_table *tb, struct fib_config *cfg)
fa = fa_to_delete; fa = fa_to_delete;
rtmsg_fib(RTM_DELROUTE, key, fa, cfg->fc_dst_len, rtmsg_fib(RTM_DELROUTE, key, fa, cfg->fc_dst_len,
tb->tb_id, &cfg->fc_nlinfo); tb->tb_id, &cfg->fc_nlinfo, 0);
kill_fn = 0; kill_fn = 0;
write_lock_bh(&fib_hash_lock); write_lock_bh(&fib_hash_lock);

View file

@ -30,7 +30,8 @@ extern int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
int dst_len, u8 tos, struct fib_info *fi, int dst_len, u8 tos, struct fib_info *fi,
unsigned int); unsigned int);
extern void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, extern void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,
int dst_len, u32 tb_id, struct nl_info *info); int dst_len, u32 tb_id, struct nl_info *info,
unsigned int nlm_flags);
extern struct fib_alias *fib_find_alias(struct list_head *fah, extern struct fib_alias *fib_find_alias(struct list_head *fah,
u8 tos, u32 prio); u8 tos, u32 prio);
extern int fib_detect_death(struct fib_info *fi, int order, extern int fib_detect_death(struct fib_info *fi, int order,

View file

@ -301,7 +301,8 @@ static inline size_t fib_nlmsg_size(struct fib_info *fi)
} }
void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,
int dst_len, u32 tb_id, struct nl_info *info) int dst_len, u32 tb_id, struct nl_info *info,
unsigned int nlm_flags)
{ {
struct sk_buff *skb; struct sk_buff *skb;
u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0; u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
@ -313,7 +314,7 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,
err = fib_dump_info(skb, info->pid, seq, event, tb_id, err = fib_dump_info(skb, info->pid, seq, event, tb_id,
fa->fa_type, fa->fa_scope, key, dst_len, fa->fa_type, fa->fa_scope, key, dst_len,
fa->fa_tos, fa->fa_info, 0); fa->fa_tos, fa->fa_info, nlm_flags);
if (err < 0) { if (err < 0) {
/* -EMSGSIZE implies BUG in fib_nlmsg_size() */ /* -EMSGSIZE implies BUG in fib_nlmsg_size() */
WARN_ON(err == -EMSGSIZE); WARN_ON(err == -EMSGSIZE);

View file

@ -1226,6 +1226,8 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg)
fib_release_info(fi_drop); fib_release_info(fi_drop);
if (state & FA_S_ACCESSED) if (state & FA_S_ACCESSED)
rt_cache_flush(-1); rt_cache_flush(-1);
rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE);
goto succeeded; goto succeeded;
} }
@ -1278,7 +1280,7 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg)
rt_cache_flush(-1); rt_cache_flush(-1);
rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id,
&cfg->fc_nlinfo); &cfg->fc_nlinfo, 0);
succeeded: succeeded:
return 0; return 0;
@ -1624,7 +1626,7 @@ static int fn_trie_delete(struct fib_table *tb, struct fib_config *cfg)
fa = fa_to_delete; fa = fa_to_delete;
rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id, rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id,
&cfg->fc_nlinfo); &cfg->fc_nlinfo, 0);
l = fib_find_node(t, key); l = fib_find_node(t, key);
li = find_leaf_info(l, plen); li = find_leaf_info(l, plen);

View file

@ -1,10 +1,7 @@
# #
# IP Virtual Server configuration # IP Virtual Server configuration
# #
menu "IP: Virtual Server Configuration" menuconfig IP_VS
depends on NETFILTER
config IP_VS
tristate "IP virtual server support (EXPERIMENTAL)" tristate "IP virtual server support (EXPERIMENTAL)"
depends on NETFILTER depends on NETFILTER
---help--- ---help---
@ -25,9 +22,10 @@ config IP_VS
If you want to compile it in kernel, say Y. To compile it as a If you want to compile it in kernel, say Y. To compile it as a
module, choose M here. If unsure, say N. module, choose M here. If unsure, say N.
if IP_VS
config IP_VS_DEBUG config IP_VS_DEBUG
bool "IP virtual server debugging" bool "IP virtual server debugging"
depends on IP_VS
---help--- ---help---
Say Y here if you want to get additional messages useful in Say Y here if you want to get additional messages useful in
debugging the IP virtual server code. You can change the debug debugging the IP virtual server code. You can change the debug
@ -35,7 +33,6 @@ config IP_VS_DEBUG
config IP_VS_TAB_BITS config IP_VS_TAB_BITS
int "IPVS connection table size (the Nth power of 2)" int "IPVS connection table size (the Nth power of 2)"
depends on IP_VS
default "12" default "12"
---help--- ---help---
The IPVS connection hash table uses the chaining scheme to handle The IPVS connection hash table uses the chaining scheme to handle
@ -61,42 +58,35 @@ config IP_VS_TAB_BITS
needed for your box. needed for your box.
comment "IPVS transport protocol load balancing support" comment "IPVS transport protocol load balancing support"
depends on IP_VS
config IP_VS_PROTO_TCP config IP_VS_PROTO_TCP
bool "TCP load balancing support" bool "TCP load balancing support"
depends on IP_VS
---help--- ---help---
This option enables support for load balancing TCP transport This option enables support for load balancing TCP transport
protocol. Say Y if unsure. protocol. Say Y if unsure.
config IP_VS_PROTO_UDP config IP_VS_PROTO_UDP
bool "UDP load balancing support" bool "UDP load balancing support"
depends on IP_VS
---help--- ---help---
This option enables support for load balancing UDP transport This option enables support for load balancing UDP transport
protocol. Say Y if unsure. protocol. Say Y if unsure.
config IP_VS_PROTO_ESP config IP_VS_PROTO_ESP
bool "ESP load balancing support" bool "ESP load balancing support"
depends on IP_VS
---help--- ---help---
This option enables support for load balancing ESP (Encapsulation This option enables support for load balancing ESP (Encapsulation
Security Payload) transport protocol. Say Y if unsure. Security Payload) transport protocol. Say Y if unsure.
config IP_VS_PROTO_AH config IP_VS_PROTO_AH
bool "AH load balancing support" bool "AH load balancing support"
depends on IP_VS
---help--- ---help---
This option enables support for load balancing AH (Authentication This option enables support for load balancing AH (Authentication
Header) transport protocol. Say Y if unsure. Header) transport protocol. Say Y if unsure.
comment "IPVS scheduler" comment "IPVS scheduler"
depends on IP_VS
config IP_VS_RR config IP_VS_RR
tristate "round-robin scheduling" tristate "round-robin scheduling"
depends on IP_VS
---help--- ---help---
The robin-robin scheduling algorithm simply directs network The robin-robin scheduling algorithm simply directs network
connections to different real servers in a round-robin manner. connections to different real servers in a round-robin manner.
@ -106,7 +96,6 @@ config IP_VS_RR
config IP_VS_WRR config IP_VS_WRR
tristate "weighted round-robin scheduling" tristate "weighted round-robin scheduling"
depends on IP_VS
---help--- ---help---
The weighted robin-robin scheduling algorithm directs network The weighted robin-robin scheduling algorithm directs network
connections to different real servers based on server weights connections to different real servers based on server weights
@ -120,7 +109,6 @@ config IP_VS_WRR
config IP_VS_LC config IP_VS_LC
tristate "least-connection scheduling" tristate "least-connection scheduling"
depends on IP_VS
---help--- ---help---
The least-connection scheduling algorithm directs network The least-connection scheduling algorithm directs network
connections to the server with the least number of active connections to the server with the least number of active
@ -131,7 +119,6 @@ config IP_VS_LC
config IP_VS_WLC config IP_VS_WLC
tristate "weighted least-connection scheduling" tristate "weighted least-connection scheduling"
depends on IP_VS
---help--- ---help---
The weighted least-connection scheduling algorithm directs network The weighted least-connection scheduling algorithm directs network
connections to the server with the least active connections connections to the server with the least active connections
@ -142,7 +129,6 @@ config IP_VS_WLC
config IP_VS_LBLC config IP_VS_LBLC
tristate "locality-based least-connection scheduling" tristate "locality-based least-connection scheduling"
depends on IP_VS
---help--- ---help---
The locality-based least-connection scheduling algorithm is for The locality-based least-connection scheduling algorithm is for
destination IP load balancing. It is usually used in cache cluster. destination IP load balancing. It is usually used in cache cluster.
@ -157,7 +143,6 @@ config IP_VS_LBLC
config IP_VS_LBLCR config IP_VS_LBLCR
tristate "locality-based least-connection with replication scheduling" tristate "locality-based least-connection with replication scheduling"
depends on IP_VS
---help--- ---help---
The locality-based least-connection with replication scheduling The locality-based least-connection with replication scheduling
algorithm is also for destination IP load balancing. It is algorithm is also for destination IP load balancing. It is
@ -176,7 +161,6 @@ config IP_VS_LBLCR
config IP_VS_DH config IP_VS_DH
tristate "destination hashing scheduling" tristate "destination hashing scheduling"
depends on IP_VS
---help--- ---help---
The destination hashing scheduling algorithm assigns network The destination hashing scheduling algorithm assigns network
connections to the servers through looking up a statically assigned connections to the servers through looking up a statically assigned
@ -187,7 +171,6 @@ config IP_VS_DH
config IP_VS_SH config IP_VS_SH
tristate "source hashing scheduling" tristate "source hashing scheduling"
depends on IP_VS
---help--- ---help---
The source hashing scheduling algorithm assigns network The source hashing scheduling algorithm assigns network
connections to the servers through looking up a statically assigned connections to the servers through looking up a statically assigned
@ -198,7 +181,6 @@ config IP_VS_SH
config IP_VS_SED config IP_VS_SED
tristate "shortest expected delay scheduling" tristate "shortest expected delay scheduling"
depends on IP_VS
---help--- ---help---
The shortest expected delay scheduling algorithm assigns network The shortest expected delay scheduling algorithm assigns network
connections to the server with the shortest expected delay. The connections to the server with the shortest expected delay. The
@ -212,7 +194,6 @@ config IP_VS_SED
config IP_VS_NQ config IP_VS_NQ
tristate "never queue scheduling" tristate "never queue scheduling"
depends on IP_VS
---help--- ---help---
The never queue scheduling algorithm adopts a two-speed model. The never queue scheduling algorithm adopts a two-speed model.
When there is an idle server available, the job will be sent to When there is an idle server available, the job will be sent to
@ -225,11 +206,10 @@ config IP_VS_NQ
module, choose M here. If unsure, say N. module, choose M here. If unsure, say N.
comment 'IPVS application helper' comment 'IPVS application helper'
depends on IP_VS
config IP_VS_FTP config IP_VS_FTP
tristate "FTP protocol helper" tristate "FTP protocol helper"
depends on IP_VS && IP_VS_PROTO_TCP depends on IP_VS_PROTO_TCP
---help--- ---help---
FTP is a protocol that transfers IP address and/or port number in FTP is a protocol that transfers IP address and/or port number in
the payload. In the virtual server via Network Address Translation, the payload. In the virtual server via Network Address Translation,
@ -241,4 +221,4 @@ config IP_VS_FTP
If you want to compile it in kernel, say Y. To compile it as a If you want to compile it in kernel, say Y. To compile it as a
module, choose M here. If unsure, say N. module, choose M here. If unsure, say N.
endmenu endif # IP_VS

View file

@ -40,8 +40,7 @@ mangle_rfc959_packet(struct sk_buff **pskb,
unsigned int matchoff, unsigned int matchoff,
unsigned int matchlen, unsigned int matchlen,
struct nf_conn *ct, struct nf_conn *ct,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo)
u32 *seq)
{ {
char buffer[sizeof("nnn,nnn,nnn,nnn,nnn,nnn")]; char buffer[sizeof("nnn,nnn,nnn,nnn,nnn,nnn")];
@ -50,7 +49,6 @@ mangle_rfc959_packet(struct sk_buff **pskb,
DEBUGP("calling nf_nat_mangle_tcp_packet\n"); DEBUGP("calling nf_nat_mangle_tcp_packet\n");
*seq += strlen(buffer) - matchlen;
return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff,
matchlen, buffer, strlen(buffer)); matchlen, buffer, strlen(buffer));
} }
@ -63,8 +61,7 @@ mangle_eprt_packet(struct sk_buff **pskb,
unsigned int matchoff, unsigned int matchoff,
unsigned int matchlen, unsigned int matchlen,
struct nf_conn *ct, struct nf_conn *ct,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo)
u32 *seq)
{ {
char buffer[sizeof("|1|255.255.255.255|65535|")]; char buffer[sizeof("|1|255.255.255.255|65535|")];
@ -72,7 +69,6 @@ mangle_eprt_packet(struct sk_buff **pskb,
DEBUGP("calling nf_nat_mangle_tcp_packet\n"); DEBUGP("calling nf_nat_mangle_tcp_packet\n");
*seq += strlen(buffer) - matchlen;
return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff,
matchlen, buffer, strlen(buffer)); matchlen, buffer, strlen(buffer));
} }
@ -85,8 +81,7 @@ mangle_epsv_packet(struct sk_buff **pskb,
unsigned int matchoff, unsigned int matchoff,
unsigned int matchlen, unsigned int matchlen,
struct nf_conn *ct, struct nf_conn *ct,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo)
u32 *seq)
{ {
char buffer[sizeof("|||65535|")]; char buffer[sizeof("|||65535|")];
@ -94,14 +89,13 @@ mangle_epsv_packet(struct sk_buff **pskb,
DEBUGP("calling nf_nat_mangle_tcp_packet\n"); DEBUGP("calling nf_nat_mangle_tcp_packet\n");
*seq += strlen(buffer) - matchlen;
return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff,
matchlen, buffer, strlen(buffer)); matchlen, buffer, strlen(buffer));
} }
static int (*mangle[])(struct sk_buff **, __be32, u_int16_t, static int (*mangle[])(struct sk_buff **, __be32, u_int16_t,
unsigned int, unsigned int, struct nf_conn *, unsigned int, unsigned int, struct nf_conn *,
enum ip_conntrack_info, u32 *seq) enum ip_conntrack_info)
= { = {
[NF_CT_FTP_PORT] = mangle_rfc959_packet, [NF_CT_FTP_PORT] = mangle_rfc959_packet,
[NF_CT_FTP_PASV] = mangle_rfc959_packet, [NF_CT_FTP_PASV] = mangle_rfc959_packet,
@ -116,8 +110,7 @@ static unsigned int nf_nat_ftp(struct sk_buff **pskb,
enum nf_ct_ftp_type type, enum nf_ct_ftp_type type,
unsigned int matchoff, unsigned int matchoff,
unsigned int matchlen, unsigned int matchlen,
struct nf_conntrack_expect *exp, struct nf_conntrack_expect *exp)
u32 *seq)
{ {
__be32 newip; __be32 newip;
u_int16_t port; u_int16_t port;
@ -145,8 +138,7 @@ static unsigned int nf_nat_ftp(struct sk_buff **pskb,
if (port == 0) if (port == 0)
return NF_DROP; return NF_DROP;
if (!mangle[type](pskb, newip, port, matchoff, matchlen, ct, ctinfo, if (!mangle[type](pskb, newip, port, matchoff, matchlen, ct, ctinfo)) {
seq)) {
nf_conntrack_unexpect_related(exp); nf_conntrack_unexpect_related(exp);
return NF_DROP; return NF_DROP;
} }

View file

@ -455,9 +455,9 @@ static int nat_q931(struct sk_buff **pskb, struct nf_conn *ct,
if (idx > 0 && if (idx > 0 &&
get_h225_addr(ct, *data, &taddr[0], &addr, &port) && get_h225_addr(ct, *data, &taddr[0], &addr, &port) &&
(ntohl(addr.ip) & 0xff000000) == 0x7f000000) { (ntohl(addr.ip) & 0xff000000) == 0x7f000000) {
set_h225_addr_hook(pskb, data, 0, &taddr[0], set_h225_addr(pskb, data, 0, &taddr[0],
&ct->tuplehash[!dir].tuple.dst.u3, &ct->tuplehash[!dir].tuple.dst.u3,
info->sig_port[!dir]); info->sig_port[!dir]);
} }
} else { } else {
nf_conntrack_unexpect_related(exp); nf_conntrack_unexpect_related(exp);

View file

@ -2598,6 +2598,69 @@ int __ip_route_output_key(struct rtable **rp, const struct flowi *flp)
EXPORT_SYMBOL_GPL(__ip_route_output_key); EXPORT_SYMBOL_GPL(__ip_route_output_key);
static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
{
}
static struct dst_ops ipv4_dst_blackhole_ops = {
.family = AF_INET,
.protocol = __constant_htons(ETH_P_IP),
.destroy = ipv4_dst_destroy,
.check = ipv4_dst_check,
.update_pmtu = ipv4_rt_blackhole_update_pmtu,
.entry_size = sizeof(struct rtable),
};
static int ipv4_blackhole_output(struct sk_buff *skb)
{
kfree_skb(skb);
return 0;
}
static int ipv4_dst_blackhole(struct rtable **rp, struct flowi *flp, struct sock *sk)
{
struct rtable *ort = *rp;
struct rtable *rt = (struct rtable *)
dst_alloc(&ipv4_dst_blackhole_ops);
if (rt) {
struct dst_entry *new = &rt->u.dst;
atomic_set(&new->__refcnt, 1);
new->__use = 1;
new->input = ipv4_blackhole_output;
new->output = ipv4_blackhole_output;
memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32));
new->dev = ort->u.dst.dev;
if (new->dev)
dev_hold(new->dev);
rt->fl = ort->fl;
rt->idev = ort->idev;
if (rt->idev)
in_dev_hold(rt->idev);
rt->rt_flags = ort->rt_flags;
rt->rt_type = ort->rt_type;
rt->rt_dst = ort->rt_dst;
rt->rt_src = ort->rt_src;
rt->rt_iif = ort->rt_iif;
rt->rt_gateway = ort->rt_gateway;
rt->rt_spec_dst = ort->rt_spec_dst;
rt->peer = ort->peer;
if (rt->peer)
atomic_inc(&rt->peer->refcnt);
dst_free(new);
}
dst_release(&(*rp)->u.dst);
*rp = rt;
return (rt ? 0 : -ENOMEM);
}
int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, int flags) int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, int flags)
{ {
int err; int err;
@ -2610,7 +2673,11 @@ int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk,
flp->fl4_src = (*rp)->rt_src; flp->fl4_src = (*rp)->rt_src;
if (!flp->fl4_dst) if (!flp->fl4_dst)
flp->fl4_dst = (*rp)->rt_dst; flp->fl4_dst = (*rp)->rt_dst;
return xfrm_lookup((struct dst_entry **)rp, flp, sk, flags); err = __xfrm_lookup((struct dst_entry **)rp, flp, sk, flags);
if (err == -EREMOTE)
err = ipv4_dst_blackhole(rp, flp, sk);
return err;
} }
return 0; return 0;
@ -3139,6 +3206,8 @@ int __init ip_rt_init(void)
kmem_cache_create("ip_dst_cache", sizeof(struct rtable), 0, kmem_cache_create("ip_dst_cache", sizeof(struct rtable), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
ipv4_dst_blackhole_ops.kmem_cachep = ipv4_dst_ops.kmem_cachep;
rt_hash_table = (struct rt_hash_bucket *) rt_hash_table = (struct rt_hash_bucket *)
alloc_large_system_hash("IP route cache", alloc_large_system_hash("IP route cache",
sizeof(struct rt_hash_bucket), sizeof(struct rt_hash_bucket),

View file

@ -2154,15 +2154,6 @@ static void addrconf_dev_config(struct net_device *dev)
ASSERT_RTNL(); ASSERT_RTNL();
if ((dev->type != ARPHRD_ETHER) &&
(dev->type != ARPHRD_FDDI) &&
(dev->type != ARPHRD_IEEE802_TR) &&
(dev->type != ARPHRD_ARCNET) &&
(dev->type != ARPHRD_INFINIBAND)) {
/* Alas, we support only Ethernet autoconfiguration. */
return;
}
idev = addrconf_add_dev(dev); idev = addrconf_add_dev(dev);
if (idev == NULL) if (idev == NULL)
return; return;
@ -2250,13 +2241,33 @@ static void addrconf_ip6_tnl_config(struct net_device *dev)
ip6_tnl_add_linklocal(idev); ip6_tnl_add_linklocal(idev);
} }
static int ipv6_hwtype(struct net_device *dev)
{
if ((dev->type == ARPHRD_ETHER) ||
(dev->type == ARPHRD_LOOPBACK) ||
(dev->type == ARPHRD_SIT) ||
(dev->type == ARPHRD_TUNNEL6) ||
(dev->type == ARPHRD_FDDI) ||
(dev->type == ARPHRD_IEEE802_TR) ||
(dev->type == ARPHRD_ARCNET) ||
(dev->type == ARPHRD_INFINIBAND))
return 1;
return 0;
}
static int addrconf_notify(struct notifier_block *this, unsigned long event, static int addrconf_notify(struct notifier_block *this, unsigned long event,
void * data) void * data)
{ {
struct net_device *dev = (struct net_device *) data; struct net_device *dev = (struct net_device *) data;
struct inet6_dev *idev = __in6_dev_get(dev); struct inet6_dev *idev;
int run_pending = 0; int run_pending = 0;
if (!ipv6_hwtype(dev))
return NOTIFY_OK;
idev = __in6_dev_get(dev);
switch(event) { switch(event) {
case NETDEV_REGISTER: case NETDEV_REGISTER:
if (!idev) { if (!idev) {

View file

@ -177,8 +177,12 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
if (final_p) if (final_p)
ipv6_addr_copy(&fl.fl6_dst, final_p); ipv6_addr_copy(&fl.fl6_dst, final_p);
if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) {
goto out; if (err == -EREMOTE)
err = ip6_dst_blackhole(sk, &dst, &fl);
if (err < 0)
goto out;
}
/* source address lookup done in ip6_dst_lookup */ /* source address lookup done in ip6_dst_lookup */

View file

@ -818,8 +818,12 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
if (final_p) if (final_p)
ipv6_addr_copy(&fl.fl6_dst, final_p); ipv6_addr_copy(&fl.fl6_dst, final_p);
if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) {
goto out; if (err == -EREMOTE)
err = ip6_dst_blackhole(sk, &dst, &fl);
if (err < 0)
goto out;
}
if (hlimit < 0) { if (hlimit < 0) {
if (ipv6_addr_is_multicast(&fl.fl6_dst)) if (ipv6_addr_is_multicast(&fl.fl6_dst))

View file

@ -119,6 +119,19 @@ static struct dst_ops ip6_dst_ops = {
.entry_size = sizeof(struct rt6_info), .entry_size = sizeof(struct rt6_info),
}; };
static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
{
}
static struct dst_ops ip6_dst_blackhole_ops = {
.family = AF_INET6,
.protocol = __constant_htons(ETH_P_IPV6),
.destroy = ip6_dst_destroy,
.check = ip6_dst_check,
.update_pmtu = ip6_rt_blackhole_update_pmtu,
.entry_size = sizeof(struct rt6_info),
};
struct rt6_info ip6_null_entry = { struct rt6_info ip6_null_entry = {
.u = { .u = {
.dst = { .dst = {
@ -833,6 +846,54 @@ struct dst_entry * ip6_route_output(struct sock *sk, struct flowi *fl)
EXPORT_SYMBOL(ip6_route_output); EXPORT_SYMBOL(ip6_route_output);
static int ip6_blackhole_output(struct sk_buff *skb)
{
kfree_skb(skb);
return 0;
}
int ip6_dst_blackhole(struct sock *sk, struct dst_entry **dstp, struct flowi *fl)
{
struct rt6_info *ort = (struct rt6_info *) *dstp;
struct rt6_info *rt = (struct rt6_info *)
dst_alloc(&ip6_dst_blackhole_ops);
struct dst_entry *new = NULL;
if (rt) {
new = &rt->u.dst;
atomic_set(&new->__refcnt, 1);
new->__use = 1;
new->input = ip6_blackhole_output;
new->output = ip6_blackhole_output;
memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32));
new->dev = ort->u.dst.dev;
if (new->dev)
dev_hold(new->dev);
rt->rt6i_idev = ort->rt6i_idev;
if (rt->rt6i_idev)
in6_dev_hold(rt->rt6i_idev);
rt->rt6i_expires = 0;
ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway);
rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES;
rt->rt6i_metric = 0;
memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
#ifdef CONFIG_IPV6_SUBTREES
memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
#endif
dst_free(new);
}
dst_release(*dstp);
*dstp = new;
return (new ? 0 : -ENOMEM);
}
EXPORT_SYMBOL_GPL(ip6_dst_blackhole);
/* /*
* Destination cache support functions * Destination cache support functions
*/ */
@ -2495,6 +2556,8 @@ void __init ip6_route_init(void)
ip6_dst_ops.kmem_cachep = ip6_dst_ops.kmem_cachep =
kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0, kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops.kmem_cachep;
fib6_init(); fib6_init();
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
p = proc_net_create("ipv6_route", 0, rt6_proc_info); p = proc_net_create("ipv6_route", 0, rt6_proc_info);

View file

@ -265,8 +265,12 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
if (final_p) if (final_p)
ipv6_addr_copy(&fl.fl6_dst, final_p); ipv6_addr_copy(&fl.fl6_dst, final_p);
if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) {
goto failure; if (err == -EREMOTE)
err = ip6_dst_blackhole(sk, &dst, &fl);
if (err < 0)
goto failure;
}
if (saddr == NULL) { if (saddr == NULL) {
saddr = &fl.fl6_src; saddr = &fl.fl6_src;

View file

@ -767,8 +767,12 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
if (final_p) if (final_p)
ipv6_addr_copy(&fl.fl6_dst, final_p); ipv6_addr_copy(&fl.fl6_dst, final_p);
if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) {
goto out; if (err == -EREMOTE)
err = ip6_dst_blackhole(sk, &dst, &fl);
if (err < 0)
goto out;
}
if (hlimit < 0) { if (hlimit < 0) {
if (ipv6_addr_is_multicast(&fl.fl6_dst)) if (ipv6_addr_is_multicast(&fl.fl6_dst))

View file

@ -48,8 +48,7 @@ unsigned int (*nf_nat_ftp_hook)(struct sk_buff **pskb,
enum nf_ct_ftp_type type, enum nf_ct_ftp_type type,
unsigned int matchoff, unsigned int matchoff,
unsigned int matchlen, unsigned int matchlen,
struct nf_conntrack_expect *exp, struct nf_conntrack_expect *exp);
u32 *seq);
EXPORT_SYMBOL_GPL(nf_nat_ftp_hook); EXPORT_SYMBOL_GPL(nf_nat_ftp_hook);
#if 0 #if 0
@ -335,15 +334,17 @@ static void update_nl_seq(u32 nl_seq, struct nf_ct_ftp_master *info, int dir,
if (info->seq_aft_nl[dir][i] == nl_seq) if (info->seq_aft_nl[dir][i] == nl_seq)
return; return;
if (oldest == info->seq_aft_nl_num[dir] if (oldest == info->seq_aft_nl_num[dir] ||
|| before(info->seq_aft_nl[dir][i], oldest)) before(info->seq_aft_nl[dir][i],
info->seq_aft_nl[dir][oldest]))
oldest = i; oldest = i;
} }
if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) { if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) {
info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq; info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq;
nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb); nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb);
} else if (oldest != NUM_SEQ_TO_REMEMBER) { } else if (oldest != NUM_SEQ_TO_REMEMBER &&
after(nl_seq, info->seq_aft_nl[dir][oldest])) {
info->seq_aft_nl[dir][oldest] = nl_seq; info->seq_aft_nl[dir][oldest] = nl_seq;
nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb); nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb);
} }
@ -519,7 +520,7 @@ static int help(struct sk_buff **pskb,
nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook); nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook);
if (nf_nat_ftp && ct->status & IPS_NAT_MASK) if (nf_nat_ftp && ct->status & IPS_NAT_MASK)
ret = nf_nat_ftp(pskb, ctinfo, search[dir][i].ftptype, ret = nf_nat_ftp(pskb, ctinfo, search[dir][i].ftptype,
matchoff, matchlen, exp, &seq); matchoff, matchlen, exp);
else { else {
/* Can't expect this? Best to drop packet now. */ /* Can't expect this? Best to drop packet now. */
if (nf_conntrack_expect_related(exp) != 0) if (nf_conntrack_expect_related(exp) != 0)

View file

@ -520,6 +520,16 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
} }
} }
if ((olca->options & eOpenLogicalChannelAck_separateStack) &&
olca->separateStack.networkAddress.choice ==
eNetworkAccessParameters_networkAddress_localAreaAddress) {
ret = expect_t120(pskb, ct, ctinfo, data, dataoff,
&olca->separateStack.networkAddress.
localAreaAddress);
if (ret < 0)
return -1;
}
return 0; return 0;
} }
@ -640,7 +650,7 @@ int get_h225_addr(struct nf_conn *ct, unsigned char *data,
case eTransportAddress_ip6Address: case eTransportAddress_ip6Address:
if (family != AF_INET6) if (family != AF_INET6)
return 0; return 0;
p = data + taddr->ip6Address.ip6; p = data + taddr->ip6Address.ip;
len = 16; len = 16;
break; break;
default: default:
@ -976,30 +986,6 @@ static int process_alerting(struct sk_buff **pskb, struct nf_conn *ct,
return 0; return 0;
} }
/****************************************************************************/
static int process_information(struct sk_buff **pskb,
struct nf_conn *ct,
enum ip_conntrack_info ctinfo,
unsigned char **data, int dataoff,
Information_UUIE *info)
{
int ret;
int i;
DEBUGP("nf_ct_q931: Information\n");
if (info->options & eInformation_UUIE_fastStart) {
for (i = 0; i < info->fastStart.count; i++) {
ret = process_olc(pskb, ct, ctinfo, data, dataoff,
&info->fastStart.item[i]);
if (ret < 0)
return -1;
}
}
return 0;
}
/****************************************************************************/ /****************************************************************************/
static int process_facility(struct sk_buff **pskb, struct nf_conn *ct, static int process_facility(struct sk_buff **pskb, struct nf_conn *ct,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
@ -1096,11 +1082,6 @@ static int process_q931(struct sk_buff **pskb, struct nf_conn *ct,
ret = process_alerting(pskb, ct, ctinfo, data, dataoff, ret = process_alerting(pskb, ct, ctinfo, data, dataoff,
&pdu->h323_message_body.alerting); &pdu->h323_message_body.alerting);
break; break;
case eH323_UU_PDU_h323_message_body_information:
ret = process_information(pskb, ct, ctinfo, data, dataoff,
&pdu->h323_message_body.
information);
break;
case eH323_UU_PDU_h323_message_body_facility: case eH323_UU_PDU_h323_message_body_facility:
ret = process_facility(pskb, ct, ctinfo, data, dataoff, ret = process_facility(pskb, ct, ctinfo, data, dataoff,
&pdu->h323_message_body.facility); &pdu->h323_message_body.facility);

View file

@ -1,4 +1,4 @@
/* Generated by Jing Min Zhao's ASN.1 parser, Apr 20 2006 /* Generated by Jing Min Zhao's ASN.1 parser, May 16 2007
* *
* Copyright (c) 2006 Jing Min Zhao <zhaojingmin@users.sourceforge.net> * Copyright (c) 2006 Jing Min Zhao <zhaojingmin@users.sourceforge.net>
* *
@ -37,7 +37,7 @@ static field_t _TransportAddress_ipxAddress[] = { /* SEQUENCE */
static field_t _TransportAddress_ip6Address[] = { /* SEQUENCE */ static field_t _TransportAddress_ip6Address[] = { /* SEQUENCE */
{FNAME("ip") OCTSTR, FIXD, 16, 0, DECODE, {FNAME("ip") OCTSTR, FIXD, 16, 0, DECODE,
offsetof(TransportAddress_ip6Address, ip6), NULL}, offsetof(TransportAddress_ip6Address, ip), NULL},
{FNAME("port") INT, WORD, 0, 0, SKIP, 0, NULL}, {FNAME("port") INT, WORD, 0, 0, SKIP, 0, NULL},
}; };
@ -67,7 +67,8 @@ static field_t _TransportAddress[] = { /* CHOICE */
{FNAME("ipxAddress") SEQ, 0, 3, 3, SKIP, 0, {FNAME("ipxAddress") SEQ, 0, 3, 3, SKIP, 0,
_TransportAddress_ipxAddress}, _TransportAddress_ipxAddress},
{FNAME("ip6Address") SEQ, 0, 2, 2, DECODE | EXT, {FNAME("ip6Address") SEQ, 0, 2, 2, DECODE | EXT,
offsetof(TransportAddress, ip6Address), _TransportAddress_ip6Address}, offsetof(TransportAddress, ip6Address),
_TransportAddress_ip6Address},
{FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, {FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL},
{FNAME("nsap") OCTSTR, 5, 1, 0, SKIP, 0, NULL}, {FNAME("nsap") OCTSTR, 5, 1, 0, SKIP, 0, NULL},
{FNAME("nonStandardAddress") SEQ, 0, 2, 2, SKIP, 0, {FNAME("nonStandardAddress") SEQ, 0, 2, 2, SKIP, 0,
@ -638,7 +639,8 @@ static field_t _UnicastAddress_iPXAddress[] = { /* SEQUENCE */
}; };
static field_t _UnicastAddress_iP6Address[] = { /* SEQUENCE */ static field_t _UnicastAddress_iP6Address[] = { /* SEQUENCE */
{FNAME("network") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, {FNAME("network") OCTSTR, FIXD, 16, 0, DECODE,
offsetof(UnicastAddress_iP6Address, network), NULL},
{FNAME("tsapIdentifier") INT, WORD, 0, 0, SKIP, 0, NULL}, {FNAME("tsapIdentifier") INT, WORD, 0, 0, SKIP, 0, NULL},
}; };
@ -665,8 +667,8 @@ static field_t _UnicastAddress[] = { /* CHOICE */
offsetof(UnicastAddress, iPAddress), _UnicastAddress_iPAddress}, offsetof(UnicastAddress, iPAddress), _UnicastAddress_iPAddress},
{FNAME("iPXAddress") SEQ, 0, 3, 3, SKIP | EXT, 0, {FNAME("iPXAddress") SEQ, 0, 3, 3, SKIP | EXT, 0,
_UnicastAddress_iPXAddress}, _UnicastAddress_iPXAddress},
{FNAME("iP6Address") SEQ, 0, 2, 2, SKIP | EXT, 0, {FNAME("iP6Address") SEQ, 0, 2, 2, DECODE | EXT,
_UnicastAddress_iP6Address}, offsetof(UnicastAddress, iP6Address), _UnicastAddress_iP6Address},
{FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, {FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL},
{FNAME("iPSourceRouteAddress") SEQ, 0, 4, 4, SKIP | EXT, 0, {FNAME("iPSourceRouteAddress") SEQ, 0, 4, 4, SKIP | EXT, 0,
_UnicastAddress_iPSourceRouteAddress}, _UnicastAddress_iPSourceRouteAddress},
@ -984,19 +986,12 @@ static field_t _Alerting_UUIE[] = { /* SEQUENCE */
{FNAME("featureSet") SEQ, 3, 4, 4, SKIP | EXT | OPT, 0, NULL}, {FNAME("featureSet") SEQ, 3, 4, 4, SKIP | EXT | OPT, 0, NULL},
}; };
static field_t _Information_UUIE_fastStart[] = { /* SEQUENCE OF */
{FNAME("item") SEQ, 1, 3, 5, DECODE | OPEN | EXT,
sizeof(OpenLogicalChannel), _OpenLogicalChannel}
,
};
static field_t _Information_UUIE[] = { /* SEQUENCE */ static field_t _Information_UUIE[] = { /* SEQUENCE */
{FNAME("protocolIdentifier") OID, BYTE, 0, 0, SKIP, 0, NULL}, {FNAME("protocolIdentifier") OID, BYTE, 0, 0, SKIP, 0, NULL},
{FNAME("callIdentifier") SEQ, 0, 1, 1, SKIP | EXT, 0, NULL}, {FNAME("callIdentifier") SEQ, 0, 1, 1, SKIP | EXT, 0, NULL},
{FNAME("tokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL}, {FNAME("tokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL},
{FNAME("cryptoTokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL}, {FNAME("cryptoTokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL},
{FNAME("fastStart") SEQOF, SEMI, 0, 30, DECODE | OPT, {FNAME("fastStart") SEQOF, SEMI, 0, 30, SKIP | OPT, 0, NULL},
offsetof(Information_UUIE, fastStart), _Information_UUIE_fastStart},
{FNAME("fastConnectRefused") NUL, FIXD, 0, 0, SKIP | OPT, 0, NULL}, {FNAME("fastConnectRefused") NUL, FIXD, 0, 0, SKIP | OPT, 0, NULL},
{FNAME("circuitInfo") SEQ, 3, 3, 3, SKIP | EXT | OPT, 0, NULL}, {FNAME("circuitInfo") SEQ, 3, 3, 3, SKIP | EXT | OPT, 0, NULL},
}; };
@ -1343,9 +1338,7 @@ static field_t _H323_UU_PDU_h323_message_body[] = { /* CHOICE */
offsetof(H323_UU_PDU_h323_message_body, connect), _Connect_UUIE}, offsetof(H323_UU_PDU_h323_message_body, connect), _Connect_UUIE},
{FNAME("alerting") SEQ, 1, 3, 17, DECODE | EXT, {FNAME("alerting") SEQ, 1, 3, 17, DECODE | EXT,
offsetof(H323_UU_PDU_h323_message_body, alerting), _Alerting_UUIE}, offsetof(H323_UU_PDU_h323_message_body, alerting), _Alerting_UUIE},
{FNAME("information") SEQ, 0, 1, 7, DECODE | EXT, {FNAME("information") SEQ, 0, 1, 7, SKIP | EXT, 0, _Information_UUIE},
offsetof(H323_UU_PDU_h323_message_body, information),
_Information_UUIE},
{FNAME("releaseComplete") SEQ, 1, 2, 11, SKIP | EXT, 0, {FNAME("releaseComplete") SEQ, 1, 2, 11, SKIP | EXT, 0,
_ReleaseComplete_UUIE}, _ReleaseComplete_UUIE},
{FNAME("facility") SEQ, 3, 5, 21, DECODE | EXT, {FNAME("facility") SEQ, 3, 5, 21, DECODE | EXT,
@ -1430,7 +1423,9 @@ static field_t _OpenLogicalChannelAck[] = { /* SEQUENCE */
DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck, DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck,
reverseLogicalChannelParameters), reverseLogicalChannelParameters),
_OpenLogicalChannelAck_reverseLogicalChannelParameters}, _OpenLogicalChannelAck_reverseLogicalChannelParameters},
{FNAME("separateStack") SEQ, 2, 4, 5, SKIP | EXT | OPT, 0, NULL}, {FNAME("separateStack") SEQ, 2, 4, 5, DECODE | EXT | OPT,
offsetof(OpenLogicalChannelAck, separateStack),
_NetworkAccessParameters},
{FNAME("forwardMultiplexAckParameters") CHOICE, 0, 1, 1, {FNAME("forwardMultiplexAckParameters") CHOICE, 0, 1, 1,
DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck, DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck,
forwardMultiplexAckParameters), forwardMultiplexAckParameters),

View file

@ -169,8 +169,8 @@ static inline int qdisc_restart(struct net_device *dev)
else else
q->ops->requeue(skb, q); q->ops->requeue(skb, q);
netif_schedule(dev); netif_schedule(dev);
return 0;
} }
return 0;
out: out:
BUG_ON((int) q->q.qlen < 0); BUG_ON((int) q->q.qlen < 0);

View file

@ -976,8 +976,9 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch)
if (q->now >= q->near_ev_cache[level]) { if (q->now >= q->near_ev_cache[level]) {
event = htb_do_events(q, level); event = htb_do_events(q, level);
q->near_ev_cache[level] = event ? event : if (!event)
PSCHED_TICKS_PER_SEC; event = q->now + PSCHED_TICKS_PER_SEC;
q->near_ev_cache[level] = event;
} else } else
event = q->near_ev_cache[level]; event = q->near_ev_cache[level];

View file

@ -2,11 +2,9 @@
# SCTP configuration # SCTP configuration
# #
menu "SCTP Configuration (EXPERIMENTAL)" menuconfig IP_SCTP
depends on INET && EXPERIMENTAL
config IP_SCTP
tristate "The SCTP Protocol (EXPERIMENTAL)" tristate "The SCTP Protocol (EXPERIMENTAL)"
depends on INET && EXPERIMENTAL
depends on IPV6 || IPV6=n depends on IPV6 || IPV6=n
select CRYPTO if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 select CRYPTO if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5
select CRYPTO_HMAC if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 select CRYPTO_HMAC if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5
@ -36,9 +34,10 @@ config IP_SCTP
If in doubt, say N. If in doubt, say N.
if IP_SCTP
config SCTP_DBG_MSG config SCTP_DBG_MSG
bool "SCTP: Debug messages" bool "SCTP: Debug messages"
depends on IP_SCTP
help help
If you say Y, this will enable verbose debugging messages. If you say Y, this will enable verbose debugging messages.
@ -47,7 +46,6 @@ config SCTP_DBG_MSG
config SCTP_DBG_OBJCNT config SCTP_DBG_OBJCNT
bool "SCTP: Debug object counts" bool "SCTP: Debug object counts"
depends on IP_SCTP
help help
If you say Y, this will enable debugging support for counting the If you say Y, this will enable debugging support for counting the
type of objects that are currently allocated. This is useful for type of objects that are currently allocated. This is useful for
@ -59,7 +57,6 @@ config SCTP_DBG_OBJCNT
choice choice
prompt "SCTP: Cookie HMAC Algorithm" prompt "SCTP: Cookie HMAC Algorithm"
depends on IP_SCTP
default SCTP_HMAC_MD5 default SCTP_HMAC_MD5
help help
HMAC algorithm to be used during association initialization. It HMAC algorithm to be used during association initialization. It
@ -86,4 +83,5 @@ config SCTP_HMAC_MD5
advised to use either HMAC-MD5 or HMAC-SHA1. advised to use either HMAC-MD5 or HMAC-SHA1.
endchoice endchoice
endmenu
endif # IP_SCTP

View file

@ -2,11 +2,9 @@
# TIPC configuration # TIPC configuration
# #
menu "TIPC Configuration (EXPERIMENTAL)" menuconfig TIPC
depends on INET && EXPERIMENTAL
config TIPC
tristate "The TIPC Protocol (EXPERIMENTAL)" tristate "The TIPC Protocol (EXPERIMENTAL)"
depends on INET && EXPERIMENTAL
---help--- ---help---
The Transparent Inter Process Communication (TIPC) protocol is The Transparent Inter Process Communication (TIPC) protocol is
specially designed for intra cluster communication. This protocol specially designed for intra cluster communication. This protocol
@ -22,9 +20,10 @@ config TIPC
If in doubt, say N. If in doubt, say N.
if TIPC
config TIPC_ADVANCED config TIPC_ADVANCED
bool "TIPC: Advanced configuration" bool "TIPC: Advanced configuration"
depends on TIPC
default n default n
help help
Saying Y here will open some advanced configuration Saying Y here will open some advanced configuration
@ -33,7 +32,7 @@ config TIPC_ADVANCED
config TIPC_ZONES config TIPC_ZONES
int "Maximum number of zones in network" int "Maximum number of zones in network"
depends on TIPC && TIPC_ADVANCED depends on TIPC_ADVANCED
default "3" default "3"
help help
Max number of zones inside TIPC network. Max supported value Max number of zones inside TIPC network. Max supported value
@ -44,7 +43,7 @@ config TIPC_ZONES
config TIPC_CLUSTERS config TIPC_CLUSTERS
int "Maximum number of clusters in a zone" int "Maximum number of clusters in a zone"
depends on TIPC && TIPC_ADVANCED depends on TIPC_ADVANCED
default "1" default "1"
help help
***Only 1 (one cluster in a zone) is supported by current code. ***Only 1 (one cluster in a zone) is supported by current code.
@ -59,7 +58,7 @@ config TIPC_CLUSTERS
config TIPC_NODES config TIPC_NODES
int "Maximum number of nodes in cluster" int "Maximum number of nodes in cluster"
depends on TIPC && TIPC_ADVANCED depends on TIPC_ADVANCED
default "255" default "255"
help help
Maximum number of nodes inside a TIPC cluster. Maximum Maximum number of nodes inside a TIPC cluster. Maximum
@ -70,7 +69,7 @@ config TIPC_NODES
config TIPC_SLAVE_NODES config TIPC_SLAVE_NODES
int "Maximum number of slave nodes in cluster" int "Maximum number of slave nodes in cluster"
depends on TIPC && TIPC_ADVANCED depends on TIPC_ADVANCED
default "0" default "0"
help help
***This capability is not supported by current code.*** ***This capability is not supported by current code.***
@ -83,7 +82,7 @@ config TIPC_SLAVE_NODES
config TIPC_PORTS config TIPC_PORTS
int "Maximum number of ports in a node" int "Maximum number of ports in a node"
depends on TIPC && TIPC_ADVANCED depends on TIPC_ADVANCED
default "8191" default "8191"
help help
Maximum number of ports within a node. Maximum Maximum number of ports within a node. Maximum
@ -94,7 +93,7 @@ config TIPC_PORTS
config TIPC_LOG config TIPC_LOG
int "Size of log buffer" int "Size of log buffer"
depends on TIPC && TIPC_ADVANCED depends on TIPC_ADVANCED
default 0 default 0
help help
Size (in bytes) of TIPC's internal log buffer, which records the Size (in bytes) of TIPC's internal log buffer, which records the
@ -106,7 +105,6 @@ config TIPC_LOG
config TIPC_DEBUG config TIPC_DEBUG
bool "Enable debugging support" bool "Enable debugging support"
depends on TIPC
default n default n
help help
This will enable debugging of TIPC. This will enable debugging of TIPC.
@ -114,4 +112,4 @@ config TIPC_DEBUG
Only say Y here if you are having trouble with TIPC. It will Only say Y here if you are having trouble with TIPC. It will
enable the display of detailed information about what is going on. enable the display of detailed information about what is going on.
endmenu endif # TIPC

View file

@ -120,18 +120,20 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
static int enable_bearer(struct tipc_bearer *tb_ptr) static int enable_bearer(struct tipc_bearer *tb_ptr)
{ {
struct net_device *dev, *pdev; struct net_device *dev = NULL;
struct net_device *pdev = NULL;
struct eth_bearer *eb_ptr = &eth_bearers[0]; struct eth_bearer *eb_ptr = &eth_bearers[0];
struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS]; struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS];
char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1;
/* Find device with specified name */ /* Find device with specified name */
dev = NULL;
for_each_netdev(pdev) for_each_netdev(pdev){
if (!strncmp(dev->name, driver_name, IFNAMSIZ)) { if (!strncmp(pdev->name, driver_name, IFNAMSIZ)) {
dev = pdev; dev = pdev;
break; break;
} }
}
if (!dev) if (!dev)
return -ENODEV; return -ENODEV;

View file

@ -29,6 +29,8 @@
#include "xfrm_hash.h" #include "xfrm_hash.h"
int sysctl_xfrm_larval_drop;
DEFINE_MUTEX(xfrm_cfg_mutex); DEFINE_MUTEX(xfrm_cfg_mutex);
EXPORT_SYMBOL(xfrm_cfg_mutex); EXPORT_SYMBOL(xfrm_cfg_mutex);
@ -1390,8 +1392,8 @@ static int stale_bundle(struct dst_entry *dst);
* At the moment we eat a raw IP route. Mostly to speed up lookups * At the moment we eat a raw IP route. Mostly to speed up lookups
* on interfaces with disabled IPsec. * on interfaces with disabled IPsec.
*/ */
int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
struct sock *sk, int flags) struct sock *sk, int flags)
{ {
struct xfrm_policy *policy; struct xfrm_policy *policy;
struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX]; struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX];
@ -1509,6 +1511,13 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
if (unlikely(nx<0)) { if (unlikely(nx<0)) {
err = nx; err = nx;
if (err == -EAGAIN && sysctl_xfrm_larval_drop) {
/* EREMOTE tells the caller to generate
* a one-shot blackhole route.
*/
xfrm_pol_put(policy);
return -EREMOTE;
}
if (err == -EAGAIN && flags) { if (err == -EAGAIN && flags) {
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
@ -1598,6 +1607,21 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
*dst_p = NULL; *dst_p = NULL;
return err; return err;
} }
EXPORT_SYMBOL(__xfrm_lookup);
int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
struct sock *sk, int flags)
{
int err = __xfrm_lookup(dst_p, fl, sk, flags);
if (err == -EREMOTE) {
dst_release(*dst_p);
*dst_p = NULL;
err = -EAGAIN;
}
return err;
}
EXPORT_SYMBOL(xfrm_lookup); EXPORT_SYMBOL(xfrm_lookup);
static inline int static inline int