Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (30 commits) [TIPC]: Initial activation message now includes TIPC version number [TIPC]: Improve response to requests for node/link information [TIPC]: Fixed skb_under_panic caused by tipc_link_bundle_buf [IrDA]: Fix the AU1000 FIR dependencies [IrDA]: Fix RCU lock pairing on error path [XFRM]: unexport xfrm_state_mtu [NET]: make skb_release_data() static [NETFILTE] ipv4: Fix typo (Bugzilla #6753) [IrDA]: MCS7780 usb_driver struct should be static [BNX2]: Turn off link during shutdown [BNX2]: Use dev_kfree_skb() instead of the _irq version [ATM]: basic sysfs support for ATM devices [ATM]: [suni] change suni_init to __devinit [ATM]: [iphase] should be __devinit not __init [ATM]: [idt77105] should be __devinit not __init [BNX2]: Add NETIF_F_TSO_ECN [NET]: Add ECN support for TSO [AF_UNIX]: Datagram getpeersec [NET]: Fix logical error in skb_gso_ok [PKT_SCHED]: PSCHED_TADD() and PSCHED_TADD2() can result,tv_usec >= 1000000 ...
This commit is contained in:
commit
74e651f0aa
89 changed files with 520 additions and 148 deletions
|
@ -384,7 +384,6 @@
|
||||||
*(.text.__end_that_request_first)
|
*(.text.__end_that_request_first)
|
||||||
*(.text.wake_up_bit)
|
*(.text.wake_up_bit)
|
||||||
*(.text.unuse_mm)
|
*(.text.unuse_mm)
|
||||||
*(.text.skb_release_data)
|
|
||||||
*(.text.shrink_icache_memory)
|
*(.text.shrink_icache_memory)
|
||||||
*(.text.sched_balance_self)
|
*(.text.sched_balance_self)
|
||||||
*(.text.__pmd_alloc)
|
*(.text.__pmd_alloc)
|
||||||
|
|
|
@ -1018,7 +1018,7 @@ he_init_irq(struct he_dev *he_dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
he_start(struct atm_dev *dev)
|
he_start(struct atm_dev *dev)
|
||||||
{
|
{
|
||||||
struct he_dev *he_dev;
|
struct he_dev *he_dev;
|
||||||
|
|
|
@ -358,7 +358,7 @@ static const struct atmphy_ops idt77105_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int idt77105_init(struct atm_dev *dev)
|
int __devinit idt77105_init(struct atm_dev *dev)
|
||||||
{
|
{
|
||||||
dev->phy = &idt77105_ops;
|
dev->phy = &idt77105_ops;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
#define IDT77105_CTRSEL_RHEC 0x01 /* W, Rx HEC Error Counter */
|
#define IDT77105_CTRSEL_RHEC 0x01 /* W, Rx HEC Error Counter */
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
int idt77105_init(struct atm_dev *dev) __init;
|
int idt77105_init(struct atm_dev *dev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2284,7 +2284,7 @@ static int reset_sar(struct atm_dev *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init ia_init(struct atm_dev *dev)
|
static int __devinit ia_init(struct atm_dev *dev)
|
||||||
{
|
{
|
||||||
IADEV *iadev;
|
IADEV *iadev;
|
||||||
unsigned long real_base;
|
unsigned long real_base;
|
||||||
|
@ -2480,7 +2480,7 @@ static void ia_free_rx(IADEV *iadev)
|
||||||
iadev->rx_dle_dma);
|
iadev->rx_dle_dma);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init ia_start(struct atm_dev *dev)
|
static int __devinit ia_start(struct atm_dev *dev)
|
||||||
{
|
{
|
||||||
IADEV *iadev;
|
IADEV *iadev;
|
||||||
int error;
|
int error;
|
||||||
|
|
|
@ -289,7 +289,7 @@ static const struct atmphy_ops suni_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int suni_init(struct atm_dev *dev)
|
int __devinit suni_init(struct atm_dev *dev)
|
||||||
{
|
{
|
||||||
unsigned char mri;
|
unsigned char mri;
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
|
|
||||||
#define DRV_MODULE_NAME "bnx2"
|
#define DRV_MODULE_NAME "bnx2"
|
||||||
#define PFX DRV_MODULE_NAME ": "
|
#define PFX DRV_MODULE_NAME ": "
|
||||||
#define DRV_MODULE_VERSION "1.4.42"
|
#define DRV_MODULE_VERSION "1.4.43"
|
||||||
#define DRV_MODULE_RELDATE "June 12, 2006"
|
#define DRV_MODULE_RELDATE "June 28, 2006"
|
||||||
|
|
||||||
#define RUN_AT(x) (jiffies + (x))
|
#define RUN_AT(x) (jiffies + (x))
|
||||||
|
|
||||||
|
@ -1676,7 +1676,7 @@ bnx2_tx_int(struct bnx2 *bp)
|
||||||
|
|
||||||
tx_free_bd += last + 1;
|
tx_free_bd += last + 1;
|
||||||
|
|
||||||
dev_kfree_skb_irq(skb);
|
dev_kfree_skb(skb);
|
||||||
|
|
||||||
hw_cons = bp->hw_tx_cons =
|
hw_cons = bp->hw_tx_cons =
|
||||||
sblk->status_tx_quick_consumer_index0;
|
sblk->status_tx_quick_consumer_index0;
|
||||||
|
@ -1824,7 +1824,7 @@ reuse_rx:
|
||||||
if ((len > (bp->dev->mtu + ETH_HLEN)) &&
|
if ((len > (bp->dev->mtu + ETH_HLEN)) &&
|
||||||
(ntohs(skb->protocol) != 0x8100)) {
|
(ntohs(skb->protocol) != 0x8100)) {
|
||||||
|
|
||||||
dev_kfree_skb_irq(skb);
|
dev_kfree_skb(skb);
|
||||||
goto next_rx;
|
goto next_rx;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3643,7 +3643,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp)
|
||||||
skb_shinfo(skb)->frags[j].size,
|
skb_shinfo(skb)->frags[j].size,
|
||||||
PCI_DMA_TODEVICE);
|
PCI_DMA_TODEVICE);
|
||||||
}
|
}
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb(skb);
|
||||||
i += j + 1;
|
i += j + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3669,7 +3669,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp)
|
||||||
|
|
||||||
rx_buf->skb = NULL;
|
rx_buf->skb = NULL;
|
||||||
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb(skb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3999,7 +3999,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
|
||||||
udelay(5);
|
udelay(5);
|
||||||
|
|
||||||
pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
|
pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
|
||||||
dev_kfree_skb_irq(skb);
|
dev_kfree_skb(skb);
|
||||||
|
|
||||||
if (bp->status_blk->status_tx_quick_consumer_index0 != bp->tx_prod) {
|
if (bp->status_blk->status_tx_quick_consumer_index0 != bp->tx_prod) {
|
||||||
goto loopback_test_done;
|
goto loopback_test_done;
|
||||||
|
@ -4541,7 +4541,7 @@ bnx2_close(struct net_device *dev)
|
||||||
bnx2_netif_stop(bp);
|
bnx2_netif_stop(bp);
|
||||||
del_timer_sync(&bp->timer);
|
del_timer_sync(&bp->timer);
|
||||||
if (bp->flags & NO_WOL_FLAG)
|
if (bp->flags & NO_WOL_FLAG)
|
||||||
reset_code = BNX2_DRV_MSG_CODE_UNLOAD;
|
reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
|
||||||
else if (bp->wol)
|
else if (bp->wol)
|
||||||
reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
|
reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
|
||||||
else
|
else
|
||||||
|
@ -5128,6 +5128,16 @@ bnx2_set_rx_csum(struct net_device *dev, u32 data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bnx2_set_tso(struct net_device *dev, u32 data)
|
||||||
|
{
|
||||||
|
if (data)
|
||||||
|
dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
|
||||||
|
else
|
||||||
|
dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO_ECN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define BNX2_NUM_STATS 46
|
#define BNX2_NUM_STATS 46
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
|
@ -5445,7 +5455,7 @@ static struct ethtool_ops bnx2_ethtool_ops = {
|
||||||
.set_sg = ethtool_op_set_sg,
|
.set_sg = ethtool_op_set_sg,
|
||||||
#ifdef BCM_TSO
|
#ifdef BCM_TSO
|
||||||
.get_tso = ethtool_op_get_tso,
|
.get_tso = ethtool_op_get_tso,
|
||||||
.set_tso = ethtool_op_set_tso,
|
.set_tso = bnx2_set_tso,
|
||||||
#endif
|
#endif
|
||||||
.self_test_count = bnx2_self_test_count,
|
.self_test_count = bnx2_self_test_count,
|
||||||
.self_test = bnx2_self_test,
|
.self_test = bnx2_self_test,
|
||||||
|
@ -5926,7 +5936,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
|
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BCM_TSO
|
#ifdef BCM_TSO
|
||||||
dev->features |= NETIF_F_TSO;
|
dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
netif_carrier_off(bp->dev);
|
netif_carrier_off(bp->dev);
|
||||||
|
@ -5968,7 +5978,7 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||||
netif_device_detach(dev);
|
netif_device_detach(dev);
|
||||||
del_timer_sync(&bp->timer);
|
del_timer_sync(&bp->timer);
|
||||||
if (bp->flags & NO_WOL_FLAG)
|
if (bp->flags & NO_WOL_FLAG)
|
||||||
reset_code = BNX2_DRV_MSG_CODE_UNLOAD;
|
reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
|
||||||
else if (bp->wol)
|
else if (bp->wol)
|
||||||
reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
|
reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
|
||||||
else
|
else
|
||||||
|
|
|
@ -4174,6 +4174,7 @@ struct fw_info {
|
||||||
#define BNX2_DRV_MSG_CODE_PULSE 0x06000000
|
#define BNX2_DRV_MSG_CODE_PULSE 0x06000000
|
||||||
#define BNX2_DRV_MSG_CODE_DIAG 0x07000000
|
#define BNX2_DRV_MSG_CODE_DIAG 0x07000000
|
||||||
#define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000
|
#define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000
|
||||||
|
#define BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000
|
||||||
|
|
||||||
#define BNX2_DRV_MSG_DATA 0x00ff0000
|
#define BNX2_DRV_MSG_DATA 0x00ff0000
|
||||||
#define BNX2_DRV_MSG_DATA_WAIT0 0x00010000
|
#define BNX2_DRV_MSG_DATA_WAIT0 0x00010000
|
||||||
|
|
|
@ -350,7 +350,7 @@ config TOSHIBA_FIR
|
||||||
|
|
||||||
config AU1000_FIR
|
config AU1000_FIR
|
||||||
tristate "Alchemy Au1000 SIR/FIR"
|
tristate "Alchemy Au1000 SIR/FIR"
|
||||||
depends on MIPS_AU1000 && IRDA
|
depends on SOC_AU1000 && IRDA
|
||||||
|
|
||||||
config SMC_IRCC_FIR
|
config SMC_IRCC_FIR
|
||||||
tristate "SMSC IrCC (EXPERIMENTAL)"
|
tristate "SMSC IrCC (EXPERIMENTAL)"
|
||||||
|
|
|
@ -101,7 +101,7 @@ static int transceiver_type = MCS_TSC_VISHAY;
|
||||||
module_param(transceiver_type, int, 0444);
|
module_param(transceiver_type, int, 0444);
|
||||||
MODULE_PARM_DESC(transceiver_type, "IR transceiver type, see mcs7780.h.");
|
MODULE_PARM_DESC(transceiver_type, "IR transceiver type, see mcs7780.h.");
|
||||||
|
|
||||||
struct usb_driver mcs_driver = {
|
static struct usb_driver mcs_driver = {
|
||||||
.name = "mcs7780",
|
.name = "mcs7780",
|
||||||
.probe = mcs_probe,
|
.probe = mcs_probe,
|
||||||
.disconnect = mcs_disconnect,
|
.disconnect = mcs_disconnect,
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#define SCM_TIMESTAMP SO_TIMESTAMP
|
#define SCM_TIMESTAMP SO_TIMESTAMP
|
||||||
|
|
||||||
#define SO_PEERSEC 30
|
#define SO_PEERSEC 30
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
||||||
#define SO_SECURITY_AUTHENTICATION 19
|
#define SO_SECURITY_AUTHENTICATION 19
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -57,5 +57,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_IA64_SOCKET_H */
|
#endif /* _ASM_IA64_SOCKET_H */
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_M32R_SOCKET_H */
|
#endif /* _ASM_M32R_SOCKET_H */
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -69,6 +69,7 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */
|
||||||
#define SO_PEERSEC 30
|
#define SO_PEERSEC 30
|
||||||
#define SO_SNDBUFFORCE 31
|
#define SO_SNDBUFFORCE 31
|
||||||
#define SO_RCVBUFFORCE 33
|
#define SO_RCVBUFFORCE 33
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 0x401c
|
#define SO_ACCEPTCONN 0x401c
|
||||||
|
|
||||||
#define SO_PEERSEC 0x401d
|
#define SO_PEERSEC 0x401d
|
||||||
|
#define SO_PASSSEC 0x401e
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -55,5 +55,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_POWERPC_SOCKET_H */
|
#endif /* _ASM_POWERPC_SOCKET_H */
|
||||||
|
|
|
@ -56,5 +56,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* __ASM_SH_SOCKET_H */
|
#endif /* __ASM_SH_SOCKET_H */
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#define SCM_TIMESTAMP SO_TIMESTAMP
|
#define SCM_TIMESTAMP SO_TIMESTAMP
|
||||||
|
|
||||||
#define SO_PEERSEC 0x001e
|
#define SO_PEERSEC 0x001e
|
||||||
|
#define SO_PASSSEC 0x001f
|
||||||
|
|
||||||
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
||||||
#define SO_SECURITY_AUTHENTICATION 0x5001
|
#define SO_SECURITY_AUTHENTICATION 0x5001
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#define SCM_TIMESTAMP SO_TIMESTAMP
|
#define SCM_TIMESTAMP SO_TIMESTAMP
|
||||||
|
|
||||||
#define SO_PEERSEC 0x001e
|
#define SO_PEERSEC 0x001e
|
||||||
|
#define SO_PASSSEC 0x001f
|
||||||
|
|
||||||
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
||||||
#define SO_SECURITY_AUTHENTICATION 0x5001
|
#define SO_SECURITY_AUTHENTICATION 0x5001
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* __V850_SOCKET_H__ */
|
#endif /* __V850_SOCKET_H__ */
|
||||||
|
|
|
@ -48,5 +48,6 @@
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
|
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _ASM_SOCKET_H */
|
#endif /* _ASM_SOCKET_H */
|
||||||
|
|
|
@ -59,5 +59,6 @@
|
||||||
|
|
||||||
#define SO_ACCEPTCONN 30
|
#define SO_ACCEPTCONN 30
|
||||||
#define SO_PEERSEC 31
|
#define SO_PEERSEC 31
|
||||||
|
#define SO_PASSSEC 34
|
||||||
|
|
||||||
#endif /* _XTENSA_SOCKET_H */
|
#endif /* _XTENSA_SOCKET_H */
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#define LINUX_ATMDEV_H
|
#define LINUX_ATMDEV_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <linux/device.h>
|
||||||
#include <linux/atmapi.h>
|
#include <linux/atmapi.h>
|
||||||
#include <linux/atm.h>
|
#include <linux/atm.h>
|
||||||
#include <linux/atmioc.h>
|
#include <linux/atmioc.h>
|
||||||
|
@ -358,6 +359,7 @@ struct atm_dev {
|
||||||
struct proc_dir_entry *proc_entry; /* proc entry */
|
struct proc_dir_entry *proc_entry; /* proc entry */
|
||||||
char *proc_name; /* proc entry name */
|
char *proc_name; /* proc entry name */
|
||||||
#endif
|
#endif
|
||||||
|
struct class_device class_dev; /* sysfs class device */
|
||||||
struct list_head dev_list; /* linkage */
|
struct list_head dev_list; /* linkage */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -459,7 +461,7 @@ static inline void atm_dev_put(struct atm_dev *dev)
|
||||||
BUG_ON(!test_bit(ATM_DF_REMOVED, &dev->flags));
|
BUG_ON(!test_bit(ATM_DF_REMOVED, &dev->flags));
|
||||||
if (dev->ops->dev_close)
|
if (dev->ops->dev_close)
|
||||||
dev->ops->dev_close(dev);
|
dev->ops->dev_close(dev);
|
||||||
kfree(dev);
|
class_device_put(&dev->class_dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,7 @@ typedef enum {
|
||||||
#define SOCK_ASYNC_WAITDATA 1
|
#define SOCK_ASYNC_WAITDATA 1
|
||||||
#define SOCK_NOSPACE 2
|
#define SOCK_NOSPACE 2
|
||||||
#define SOCK_PASSCRED 3
|
#define SOCK_PASSCRED 3
|
||||||
|
#define SOCK_PASSSEC 4
|
||||||
|
|
||||||
#ifndef ARCH_HAS_SOCKET_TYPES
|
#ifndef ARCH_HAS_SOCKET_TYPES
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -315,6 +315,8 @@ struct net_device
|
||||||
#define NETIF_F_GSO_SHIFT 16
|
#define NETIF_F_GSO_SHIFT 16
|
||||||
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
|
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
|
||||||
#define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT)
|
#define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT)
|
||||||
|
#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
|
||||||
|
#define NETIF_F_TSO_ECN (SKB_GSO_TCPV4_ECN << NETIF_F_GSO_SHIFT)
|
||||||
|
|
||||||
#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
|
#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
|
||||||
#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM)
|
#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM)
|
||||||
|
@ -543,7 +545,8 @@ struct packet_type {
|
||||||
struct net_device *,
|
struct net_device *,
|
||||||
struct packet_type *,
|
struct packet_type *,
|
||||||
struct net_device *);
|
struct net_device *);
|
||||||
struct sk_buff *(*gso_segment)(struct sk_buff *skb, int sg);
|
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
|
||||||
|
int features);
|
||||||
void *af_packet_priv;
|
void *af_packet_priv;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
};
|
};
|
||||||
|
@ -968,7 +971,7 @@ extern int netdev_max_backlog;
|
||||||
extern int weight_p;
|
extern int weight_p;
|
||||||
extern int netdev_set_master(struct net_device *dev, struct net_device *master);
|
extern int netdev_set_master(struct net_device *dev, struct net_device *master);
|
||||||
extern int skb_checksum_help(struct sk_buff *skb, int inward);
|
extern int skb_checksum_help(struct sk_buff *skb, int inward);
|
||||||
extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int sg);
|
extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features);
|
||||||
#ifdef CONFIG_BUG
|
#ifdef CONFIG_BUG
|
||||||
extern void netdev_rx_csum_fault(struct net_device *dev);
|
extern void netdev_rx_csum_fault(struct net_device *dev);
|
||||||
#else
|
#else
|
||||||
|
@ -988,11 +991,16 @@ extern void dev_seq_stop(struct seq_file *seq, void *v);
|
||||||
|
|
||||||
extern void linkwatch_run_queue(void);
|
extern void linkwatch_run_queue(void);
|
||||||
|
|
||||||
|
static inline int skb_gso_ok(struct sk_buff *skb, int features)
|
||||||
|
{
|
||||||
|
int feature = skb_shinfo(skb)->gso_size ?
|
||||||
|
skb_shinfo(skb)->gso_type << NETIF_F_GSO_SHIFT : 0;
|
||||||
|
return (features & feature) == feature;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
|
static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
int feature = skb_shinfo(skb)->gso_type << NETIF_F_GSO_SHIFT;
|
return !skb_gso_ok(skb, dev->features);
|
||||||
return skb_shinfo(skb)->gso_size &&
|
|
||||||
(dev->features & feature) != feature;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
|
@ -67,7 +67,7 @@ struct xfrm_state;
|
||||||
struct xfrm_user_sec_ctx;
|
struct xfrm_user_sec_ctx;
|
||||||
|
|
||||||
extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb);
|
extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb);
|
||||||
extern int cap_netlink_recv(struct sk_buff *skb);
|
extern int cap_netlink_recv(struct sk_buff *skb, int cap);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Values used in the task_security_ops calls
|
* Values used in the task_security_ops calls
|
||||||
|
@ -656,6 +656,7 @@ struct swap_info_struct;
|
||||||
* Check permission before processing the received netlink message in
|
* Check permission before processing the received netlink message in
|
||||||
* @skb.
|
* @skb.
|
||||||
* @skb contains the sk_buff structure for the netlink message.
|
* @skb contains the sk_buff structure for the netlink message.
|
||||||
|
* @cap indicates the capability required
|
||||||
* Return 0 if permission is granted.
|
* Return 0 if permission is granted.
|
||||||
*
|
*
|
||||||
* Security hooks for Unix domain networking.
|
* Security hooks for Unix domain networking.
|
||||||
|
@ -1266,7 +1267,7 @@ struct security_operations {
|
||||||
struct sembuf * sops, unsigned nsops, int alter);
|
struct sembuf * sops, unsigned nsops, int alter);
|
||||||
|
|
||||||
int (*netlink_send) (struct sock * sk, struct sk_buff * skb);
|
int (*netlink_send) (struct sock * sk, struct sk_buff * skb);
|
||||||
int (*netlink_recv) (struct sk_buff * skb);
|
int (*netlink_recv) (struct sk_buff * skb, int cap);
|
||||||
|
|
||||||
/* allow module stacking */
|
/* allow module stacking */
|
||||||
int (*register_security) (const char *name,
|
int (*register_security) (const char *name,
|
||||||
|
@ -2032,9 +2033,9 @@ static inline int security_netlink_send(struct sock *sk, struct sk_buff * skb)
|
||||||
return security_ops->netlink_send(sk, skb);
|
return security_ops->netlink_send(sk, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int security_netlink_recv(struct sk_buff * skb)
|
static inline int security_netlink_recv(struct sk_buff * skb, int cap)
|
||||||
{
|
{
|
||||||
return security_ops->netlink_recv(skb);
|
return security_ops->netlink_recv(skb, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prototypes */
|
/* prototypes */
|
||||||
|
@ -2670,9 +2671,9 @@ static inline int security_netlink_send (struct sock *sk, struct sk_buff *skb)
|
||||||
return cap_netlink_send (sk, skb);
|
return cap_netlink_send (sk, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int security_netlink_recv (struct sk_buff *skb)
|
static inline int security_netlink_recv (struct sk_buff *skb, int cap)
|
||||||
{
|
{
|
||||||
return cap_netlink_recv (skb);
|
return cap_netlink_recv (skb, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct dentry *securityfs_create_dir(const char *name,
|
static inline struct dentry *securityfs_create_dir(const char *name,
|
||||||
|
|
|
@ -172,6 +172,12 @@ enum {
|
||||||
enum {
|
enum {
|
||||||
SKB_GSO_TCPV4 = 1 << 0,
|
SKB_GSO_TCPV4 = 1 << 0,
|
||||||
SKB_GSO_UDPV4 = 1 << 1,
|
SKB_GSO_UDPV4 = 1 << 1,
|
||||||
|
|
||||||
|
/* This indicates the skb is from an untrusted source. */
|
||||||
|
SKB_GSO_DODGY = 1 << 2,
|
||||||
|
|
||||||
|
/* This indicates the tcp segment has CWR set. */
|
||||||
|
SKB_GSO_TCPV4_ECN = 1 << 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1298,8 +1304,7 @@ extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
|
||||||
extern void skb_split(struct sk_buff *skb,
|
extern void skb_split(struct sk_buff *skb,
|
||||||
struct sk_buff *skb1, const u32 len);
|
struct sk_buff *skb1, const u32 len);
|
||||||
|
|
||||||
extern void skb_release_data(struct sk_buff *skb);
|
extern struct sk_buff *skb_segment(struct sk_buff *skb, int features);
|
||||||
extern struct sk_buff *skb_segment(struct sk_buff *skb, int sg);
|
|
||||||
|
|
||||||
static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
|
static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
|
||||||
int len, void *buffer)
|
int len, void *buffer)
|
||||||
|
|
|
@ -53,10 +53,16 @@ struct unix_address {
|
||||||
struct unix_skb_parms {
|
struct unix_skb_parms {
|
||||||
struct ucred creds; /* Skb credentials */
|
struct ucred creds; /* Skb credentials */
|
||||||
struct scm_fp_list *fp; /* Passed files */
|
struct scm_fp_list *fp; /* Passed files */
|
||||||
|
#ifdef CONFIG_SECURITY_NETWORK
|
||||||
|
char *secdata; /* Security context */
|
||||||
|
u32 seclen; /* Security length */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb))
|
#define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb))
|
||||||
#define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
|
#define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
|
||||||
|
#define UNIXSECDATA(skb) (&UNIXCB((skb)).secdata)
|
||||||
|
#define UNIXSECLEN(skb) (&UNIXCB((skb)).seclen)
|
||||||
|
|
||||||
#define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock)
|
#define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock)
|
||||||
#define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock)
|
#define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock)
|
||||||
|
|
|
@ -169,17 +169,23 @@ psched_tod_diff(int delta_sec, int bound)
|
||||||
|
|
||||||
#define PSCHED_TADD2(tv, delta, tv_res) \
|
#define PSCHED_TADD2(tv, delta, tv_res) \
|
||||||
({ \
|
({ \
|
||||||
int __delta = (tv).tv_usec + (delta); \
|
int __delta = (delta); \
|
||||||
(tv_res).tv_sec = (tv).tv_sec; \
|
(tv_res) = (tv); \
|
||||||
if (__delta > USEC_PER_SEC) { (tv_res).tv_sec++; __delta -= USEC_PER_SEC; } \
|
while(__delta >= USEC_PER_SEC){ \
|
||||||
|
(tv_res).tv_sec++; \
|
||||||
|
__delta -= USEC_PER_SEC; \
|
||||||
|
} \
|
||||||
(tv_res).tv_usec = __delta; \
|
(tv_res).tv_usec = __delta; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define PSCHED_TADD(tv, delta) \
|
#define PSCHED_TADD(tv, delta) \
|
||||||
({ \
|
({ \
|
||||||
(tv).tv_usec += (delta); \
|
int __delta = (delta); \
|
||||||
if ((tv).tv_usec > USEC_PER_SEC) { (tv).tv_sec++; \
|
while(__delta >= USEC_PER_SEC){ \
|
||||||
(tv).tv_usec -= USEC_PER_SEC; } \
|
(tv).tv_sec++; \
|
||||||
|
__delta -= USEC_PER_SEC; \
|
||||||
|
} \
|
||||||
|
(tv).tv_usec = __delta; \
|
||||||
})
|
})
|
||||||
|
|
||||||
/* Set/check that time is in the "past perfect";
|
/* Set/check that time is in the "past perfect";
|
||||||
|
|
|
@ -36,7 +36,8 @@
|
||||||
struct net_protocol {
|
struct net_protocol {
|
||||||
int (*handler)(struct sk_buff *skb);
|
int (*handler)(struct sk_buff *skb);
|
||||||
void (*err_handler)(struct sk_buff *skb, u32 info);
|
void (*err_handler)(struct sk_buff *skb, u32 info);
|
||||||
struct sk_buff *(*gso_segment)(struct sk_buff *skb, int sg);
|
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
|
||||||
|
int features);
|
||||||
int no_policy;
|
int no_policy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,10 @@ struct scm_cookie
|
||||||
{
|
{
|
||||||
struct ucred creds; /* Skb credentials */
|
struct ucred creds; /* Skb credentials */
|
||||||
struct scm_fp_list *fp; /* Passed files */
|
struct scm_fp_list *fp; /* Passed files */
|
||||||
|
#ifdef CONFIG_SECURITY_NETWORK
|
||||||
|
char *secdata; /* Security context */
|
||||||
|
u32 seclen; /* Security length */
|
||||||
|
#endif
|
||||||
unsigned long seq; /* Connection seqno */
|
unsigned long seq; /* Connection seqno */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,6 +52,17 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
|
||||||
return __scm_send(sock, msg, scm);
|
return __scm_send(sock, msg, scm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SECURITY_NETWORK
|
||||||
|
static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)
|
||||||
|
{
|
||||||
|
if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL)
|
||||||
|
put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, scm->seclen, scm->secdata);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)
|
||||||
|
{ }
|
||||||
|
#endif /* CONFIG_SECURITY_NETWORK */
|
||||||
|
|
||||||
static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
|
static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
|
||||||
struct scm_cookie *scm, int flags)
|
struct scm_cookie *scm, int flags)
|
||||||
{
|
{
|
||||||
|
@ -62,6 +77,8 @@ static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
|
||||||
if (test_bit(SOCK_PASSCRED, &sock->flags))
|
if (test_bit(SOCK_PASSCRED, &sock->flags))
|
||||||
put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds);
|
put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds);
|
||||||
|
|
||||||
|
scm_passec(sock, msg, scm);
|
||||||
|
|
||||||
if (!scm->fp)
|
if (!scm->fp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -383,7 +383,6 @@ enum sock_flags {
|
||||||
SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */
|
SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */
|
||||||
SOCK_DBG, /* %SO_DEBUG setting */
|
SOCK_DBG, /* %SO_DEBUG setting */
|
||||||
SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */
|
SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */
|
||||||
SOCK_NO_LARGESEND, /* whether to sent large segments or not */
|
|
||||||
SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
|
SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
|
||||||
SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
|
SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
|
||||||
};
|
};
|
||||||
|
@ -1033,7 +1032,7 @@ static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
|
||||||
if (sk->sk_route_caps & NETIF_F_GSO)
|
if (sk->sk_route_caps & NETIF_F_GSO)
|
||||||
sk->sk_route_caps |= NETIF_F_TSO;
|
sk->sk_route_caps |= NETIF_F_TSO;
|
||||||
if (sk->sk_route_caps & NETIF_F_TSO) {
|
if (sk->sk_route_caps & NETIF_F_TSO) {
|
||||||
if (sock_flag(sk, SOCK_NO_LARGESEND) || dst->header_len)
|
if (dst->header_len)
|
||||||
sk->sk_route_caps &= ~NETIF_F_TSO;
|
sk->sk_route_caps &= ~NETIF_F_TSO;
|
||||||
else
|
else
|
||||||
sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
||||||
|
|
|
@ -1086,7 +1086,7 @@ extern struct request_sock_ops tcp_request_sock_ops;
|
||||||
|
|
||||||
extern int tcp_v4_destroy_sock(struct sock *sk);
|
extern int tcp_v4_destroy_sock(struct sock *sk);
|
||||||
|
|
||||||
extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int sg);
|
extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features);
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
extern int tcp4_proc_init(void);
|
extern int tcp4_proc_init(void);
|
||||||
|
|
|
@ -31,10 +31,9 @@ static inline void TCP_ECN_send_syn(struct sock *sk, struct tcp_sock *tp,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
tp->ecn_flags = 0;
|
tp->ecn_flags = 0;
|
||||||
if (sysctl_tcp_ecn && !(sk->sk_route_caps & NETIF_F_TSO)) {
|
if (sysctl_tcp_ecn) {
|
||||||
TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR;
|
TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR;
|
||||||
tp->ecn_flags = TCP_ECN_OK;
|
tp->ecn_flags = TCP_ECN_OK;
|
||||||
sock_set_flag(sk, SOCK_NO_LARGESEND);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +55,9 @@ static inline void TCP_ECN_send(struct sock *sk, struct tcp_sock *tp,
|
||||||
if (tp->ecn_flags&TCP_ECN_QUEUE_CWR) {
|
if (tp->ecn_flags&TCP_ECN_QUEUE_CWR) {
|
||||||
tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;
|
tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;
|
||||||
skb->h.th->cwr = 1;
|
skb->h.th->cwr = 1;
|
||||||
|
if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4)
|
||||||
|
skb_shinfo(skb)->gso_type |=
|
||||||
|
SKB_GSO_TCPV4_ECN;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* ACK or retransmitted segment: clear ECT|CE */
|
/* ACK or retransmitted segment: clear ECT|CE */
|
||||||
|
|
|
@ -445,7 +445,7 @@ void audit_send_reply(int pid, int seq, int type, int done, int multi,
|
||||||
* Check for appropriate CAP_AUDIT_ capabilities on incoming audit
|
* Check for appropriate CAP_AUDIT_ capabilities on incoming audit
|
||||||
* control messages.
|
* control messages.
|
||||||
*/
|
*/
|
||||||
static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type)
|
static int audit_netlink_ok(struct sk_buff *skb, u16 msg_type)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
@ -459,13 +459,13 @@ static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type)
|
||||||
case AUDIT_DEL:
|
case AUDIT_DEL:
|
||||||
case AUDIT_DEL_RULE:
|
case AUDIT_DEL_RULE:
|
||||||
case AUDIT_SIGNAL_INFO:
|
case AUDIT_SIGNAL_INFO:
|
||||||
if (!cap_raised(eff_cap, CAP_AUDIT_CONTROL))
|
if (security_netlink_recv(skb, CAP_AUDIT_CONTROL))
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
break;
|
break;
|
||||||
case AUDIT_USER:
|
case AUDIT_USER:
|
||||||
case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
|
case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
|
||||||
case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2:
|
case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2:
|
||||||
if (!cap_raised(eff_cap, CAP_AUDIT_WRITE))
|
if (security_netlink_recv(skb, CAP_AUDIT_WRITE))
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
break;
|
break;
|
||||||
default: /* bad msg */
|
default: /* bad msg */
|
||||||
|
@ -488,7 +488,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
||||||
char *ctx;
|
char *ctx;
|
||||||
u32 len;
|
u32 len;
|
||||||
|
|
||||||
err = audit_netlink_ok(NETLINK_CB(skb).eff_cap, msg_type);
|
err = audit_netlink_ok(skb, msg_type);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# Makefile for the ATM Protocol Families.
|
# Makefile for the ATM Protocol Families.
|
||||||
#
|
#
|
||||||
|
|
||||||
atm-y := addr.o pvc.o signaling.o svc.o ioctl.o common.o atm_misc.o raw.o resources.o
|
atm-y := addr.o pvc.o signaling.o svc.o ioctl.o common.o atm_misc.o raw.o resources.o atm_sysfs.o
|
||||||
mpoa-objs := mpc.o mpoa_caches.o mpoa_proc.o
|
mpoa-objs := mpc.o mpoa_caches.o mpoa_proc.o
|
||||||
|
|
||||||
obj-$(CONFIG_ATM) += atm.o
|
obj-$(CONFIG_ATM) += atm.o
|
||||||
|
|
176
net/atm/atm_sysfs.c
Normal file
176
net/atm/atm_sysfs.c
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
/* ATM driver model support. */
|
||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/kobject.h>
|
||||||
|
#include <linux/atmdev.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "resources.h"
|
||||||
|
|
||||||
|
#define to_atm_dev(cldev) container_of(cldev, struct atm_dev, class_dev)
|
||||||
|
|
||||||
|
static ssize_t show_type(struct class_device *cdev, char *buf)
|
||||||
|
{
|
||||||
|
struct atm_dev *adev = to_atm_dev(cdev);
|
||||||
|
return sprintf(buf, "%s\n", adev->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_address(struct class_device *cdev, char *buf)
|
||||||
|
{
|
||||||
|
char *pos = buf;
|
||||||
|
struct atm_dev *adev = to_atm_dev(cdev);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < (ESI_LEN - 1); i++)
|
||||||
|
pos += sprintf(pos, "%02x:", adev->esi[i]);
|
||||||
|
pos += sprintf(pos, "%02x\n", adev->esi[i]);
|
||||||
|
|
||||||
|
return pos - buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_atmaddress(struct class_device *cdev, char *buf)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
char *pos = buf;
|
||||||
|
struct atm_dev *adev = to_atm_dev(cdev);
|
||||||
|
struct atm_dev_addr *aaddr;
|
||||||
|
int bin[] = { 1, 2, 10, 6, 1 }, *fmt = bin;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&adev->lock, flags);
|
||||||
|
list_for_each_entry(aaddr, &adev->local, entry) {
|
||||||
|
for(i = 0, j = 0; i < ATM_ESA_LEN; ++i, ++j) {
|
||||||
|
if (j == *fmt) {
|
||||||
|
pos += sprintf(pos, ".");
|
||||||
|
++fmt;
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
pos += sprintf(pos, "%02x", aaddr->addr.sas_addr.prv[i]);
|
||||||
|
}
|
||||||
|
pos += sprintf(pos, "\n");
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&adev->lock, flags);
|
||||||
|
|
||||||
|
return pos - buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_carrier(struct class_device *cdev, char *buf)
|
||||||
|
{
|
||||||
|
char *pos = buf;
|
||||||
|
struct atm_dev *adev = to_atm_dev(cdev);
|
||||||
|
|
||||||
|
pos += sprintf(pos, "%d\n",
|
||||||
|
adev->signal == ATM_PHY_SIG_LOST ? 0 : 1);
|
||||||
|
|
||||||
|
return pos - buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_link_rate(struct class_device *cdev, char *buf)
|
||||||
|
{
|
||||||
|
char *pos = buf;
|
||||||
|
struct atm_dev *adev = to_atm_dev(cdev);
|
||||||
|
int link_rate;
|
||||||
|
|
||||||
|
/* show the link rate, not the data rate */
|
||||||
|
switch (adev->link_rate) {
|
||||||
|
case ATM_OC3_PCR:
|
||||||
|
link_rate = 155520000;
|
||||||
|
break;
|
||||||
|
case ATM_OC12_PCR:
|
||||||
|
link_rate = 622080000;
|
||||||
|
break;
|
||||||
|
case ATM_25_PCR:
|
||||||
|
link_rate = 25600000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
link_rate = adev->link_rate * 8 * 53;
|
||||||
|
}
|
||||||
|
pos += sprintf(pos, "%d\n", link_rate);
|
||||||
|
|
||||||
|
return pos - buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CLASS_DEVICE_ATTR(address, S_IRUGO, show_address, NULL);
|
||||||
|
static CLASS_DEVICE_ATTR(atmaddress, S_IRUGO, show_atmaddress, NULL);
|
||||||
|
static CLASS_DEVICE_ATTR(carrier, S_IRUGO, show_carrier, NULL);
|
||||||
|
static CLASS_DEVICE_ATTR(type, S_IRUGO, show_type, NULL);
|
||||||
|
static CLASS_DEVICE_ATTR(link_rate, S_IRUGO, show_link_rate, NULL);
|
||||||
|
|
||||||
|
static struct class_device_attribute *atm_attrs[] = {
|
||||||
|
&class_device_attr_atmaddress,
|
||||||
|
&class_device_attr_address,
|
||||||
|
&class_device_attr_carrier,
|
||||||
|
&class_device_attr_type,
|
||||||
|
&class_device_attr_link_rate,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int atm_uevent(struct class_device *cdev, char **envp, int num_envp, char *buf, int size)
|
||||||
|
{
|
||||||
|
struct atm_dev *adev;
|
||||||
|
int i = 0, len = 0;
|
||||||
|
|
||||||
|
if (!cdev)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
adev = to_atm_dev(cdev);
|
||||||
|
if (!adev)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (add_uevent_var(envp, num_envp, &i, buf, size, &len,
|
||||||
|
"NAME=%s%d", adev->type, adev->number))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
envp[i] = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void atm_release(struct class_device *cdev)
|
||||||
|
{
|
||||||
|
struct atm_dev *adev = to_atm_dev(cdev);
|
||||||
|
|
||||||
|
kfree(adev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct class atm_class = {
|
||||||
|
.name = "atm",
|
||||||
|
.release = atm_release,
|
||||||
|
.uevent = atm_uevent,
|
||||||
|
};
|
||||||
|
|
||||||
|
int atm_register_sysfs(struct atm_dev *adev)
|
||||||
|
{
|
||||||
|
struct class_device *cdev = &adev->class_dev;
|
||||||
|
int i, err;
|
||||||
|
|
||||||
|
cdev->class = &atm_class;
|
||||||
|
class_set_devdata(cdev, adev);
|
||||||
|
|
||||||
|
snprintf(cdev->class_id, BUS_ID_SIZE, "%s%d", adev->type, adev->number);
|
||||||
|
err = class_device_register(cdev);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
for (i = 0; atm_attrs[i]; i++)
|
||||||
|
class_device_create_file(cdev, atm_attrs[i]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atm_unregister_sysfs(struct atm_dev *adev)
|
||||||
|
{
|
||||||
|
struct class_device *cdev = &adev->class_dev;
|
||||||
|
|
||||||
|
class_device_del(cdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __init atm_sysfs_init(void)
|
||||||
|
{
|
||||||
|
return class_register(&atm_class);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __exit atm_sysfs_exit(void)
|
||||||
|
{
|
||||||
|
class_unregister(&atm_class);
|
||||||
|
}
|
|
@ -791,8 +791,14 @@ static int __init atm_init(void)
|
||||||
printk(KERN_ERR "atm_proc_init() failed with %d\n",error);
|
printk(KERN_ERR "atm_proc_init() failed with %d\n",error);
|
||||||
goto out_atmsvc_exit;
|
goto out_atmsvc_exit;
|
||||||
}
|
}
|
||||||
|
if ((error = atm_sysfs_init()) < 0) {
|
||||||
|
printk(KERN_ERR "atm_sysfs_init() failed with %d\n",error);
|
||||||
|
goto out_atmproc_exit;
|
||||||
|
}
|
||||||
out:
|
out:
|
||||||
return error;
|
return error;
|
||||||
|
out_atmproc_exit:
|
||||||
|
atm_proc_exit();
|
||||||
out_atmsvc_exit:
|
out_atmsvc_exit:
|
||||||
atmsvc_exit();
|
atmsvc_exit();
|
||||||
out_atmpvc_exit:
|
out_atmpvc_exit:
|
||||||
|
@ -805,6 +811,7 @@ out_unregister_vcc_proto:
|
||||||
static void __exit atm_exit(void)
|
static void __exit atm_exit(void)
|
||||||
{
|
{
|
||||||
atm_proc_exit();
|
atm_proc_exit();
|
||||||
|
atm_sysfs_exit();
|
||||||
atmsvc_exit();
|
atmsvc_exit();
|
||||||
atmpvc_exit();
|
atmpvc_exit();
|
||||||
proto_unregister(&vcc_proto);
|
proto_unregister(&vcc_proto);
|
||||||
|
|
|
@ -28,6 +28,8 @@ int atmpvc_init(void);
|
||||||
void atmpvc_exit(void);
|
void atmpvc_exit(void);
|
||||||
int atmsvc_init(void);
|
int atmsvc_init(void);
|
||||||
void atmsvc_exit(void);
|
void atmsvc_exit(void);
|
||||||
|
int atm_sysfs_init(void);
|
||||||
|
void atm_sysfs_exit(void);
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
int atm_proc_init(void);
|
int atm_proc_init(void);
|
||||||
|
|
|
@ -114,14 +114,27 @@ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
|
||||||
printk(KERN_ERR "atm_dev_register: "
|
printk(KERN_ERR "atm_dev_register: "
|
||||||
"atm_proc_dev_register failed for dev %s\n",
|
"atm_proc_dev_register failed for dev %s\n",
|
||||||
type);
|
type);
|
||||||
mutex_unlock(&atm_dev_mutex);
|
goto out_fail;
|
||||||
kfree(dev);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
list_add_tail(&dev->dev_list, &atm_devs);
|
|
||||||
mutex_unlock(&atm_dev_mutex);
|
|
||||||
|
|
||||||
|
if (atm_register_sysfs(dev) < 0) {
|
||||||
|
printk(KERN_ERR "atm_dev_register: "
|
||||||
|
"atm_register_sysfs failed for dev %s\n",
|
||||||
|
type);
|
||||||
|
atm_proc_dev_deregister(dev);
|
||||||
|
goto out_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_add_tail(&dev->dev_list, &atm_devs);
|
||||||
|
|
||||||
|
out:
|
||||||
|
mutex_unlock(&atm_dev_mutex);
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
|
out_fail:
|
||||||
|
kfree(dev);
|
||||||
|
dev = NULL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,6 +153,7 @@ void atm_dev_deregister(struct atm_dev *dev)
|
||||||
mutex_unlock(&atm_dev_mutex);
|
mutex_unlock(&atm_dev_mutex);
|
||||||
|
|
||||||
atm_dev_release_vccs(dev);
|
atm_dev_release_vccs(dev);
|
||||||
|
atm_unregister_sysfs(dev);
|
||||||
atm_proc_dev_deregister(dev);
|
atm_proc_dev_deregister(dev);
|
||||||
|
|
||||||
atm_dev_put(dev);
|
atm_dev_put(dev);
|
||||||
|
|
|
@ -43,4 +43,6 @@ static inline void atm_proc_dev_deregister(struct atm_dev *dev)
|
||||||
|
|
||||||
#endif /* CONFIG_PROC_FS */
|
#endif /* CONFIG_PROC_FS */
|
||||||
|
|
||||||
|
int atm_register_sysfs(struct atm_dev *adev);
|
||||||
|
void atm_unregister_sysfs(struct atm_dev *adev);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -184,6 +184,6 @@ void br_dev_setup(struct net_device *dev)
|
||||||
dev->set_mac_address = br_set_mac_address;
|
dev->set_mac_address = br_set_mac_address;
|
||||||
dev->priv_flags = IFF_EBRIDGE;
|
dev->priv_flags = IFF_EBRIDGE;
|
||||||
|
|
||||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
|
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
|
||||||
| NETIF_F_HIGHDMA | NETIF_F_TSO | NETIF_F_NO_CSUM;
|
NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_GSO_ROBUST;
|
||||||
}
|
}
|
||||||
|
|
|
@ -392,7 +392,8 @@ void br_features_recompute(struct net_bridge *br)
|
||||||
features &= feature;
|
features &= feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
br->dev->features = features | checksum | NETIF_F_LLTX;
|
br->dev->features = features | checksum | NETIF_F_LLTX |
|
||||||
|
NETIF_F_GSO_ROBUST;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called with RTNL */
|
/* called with RTNL */
|
||||||
|
|
|
@ -1190,11 +1190,14 @@ out:
|
||||||
/**
|
/**
|
||||||
* skb_gso_segment - Perform segmentation on skb.
|
* skb_gso_segment - Perform segmentation on skb.
|
||||||
* @skb: buffer to segment
|
* @skb: buffer to segment
|
||||||
* @sg: whether scatter-gather is supported on the target.
|
* @features: features for the output path (see dev->features)
|
||||||
*
|
*
|
||||||
* This function segments the given skb and returns a list of segments.
|
* This function segments the given skb and returns a list of segments.
|
||||||
|
*
|
||||||
|
* It may return NULL if the skb requires no segmentation. This is
|
||||||
|
* only possible when GSO is used for verifying header integrity.
|
||||||
*/
|
*/
|
||||||
struct sk_buff *skb_gso_segment(struct sk_buff *skb, int sg)
|
struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
|
||||||
{
|
{
|
||||||
struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT);
|
struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT);
|
||||||
struct packet_type *ptype;
|
struct packet_type *ptype;
|
||||||
|
@ -1210,12 +1213,14 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int sg)
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) {
|
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) {
|
||||||
if (ptype->type == type && !ptype->dev && ptype->gso_segment) {
|
if (ptype->type == type && !ptype->dev && ptype->gso_segment) {
|
||||||
segs = ptype->gso_segment(skb, sg);
|
segs = ptype->gso_segment(skb, features);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
__skb_push(skb, skb->data - skb->mac.raw);
|
||||||
|
|
||||||
return segs;
|
return segs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1234,7 +1239,6 @@ void netdev_rx_csum_fault(struct net_device *dev)
|
||||||
EXPORT_SYMBOL(netdev_rx_csum_fault);
|
EXPORT_SYMBOL(netdev_rx_csum_fault);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_HIGHMEM
|
|
||||||
/* Actually, we should eliminate this check as soon as we know, that:
|
/* Actually, we should eliminate this check as soon as we know, that:
|
||||||
* 1. IOMMU is present and allows to map all the memory.
|
* 1. IOMMU is present and allows to map all the memory.
|
||||||
* 2. No high memory really exists on this machine.
|
* 2. No high memory really exists on this machine.
|
||||||
|
@ -1242,6 +1246,7 @@ EXPORT_SYMBOL(netdev_rx_csum_fault);
|
||||||
|
|
||||||
static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
|
static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_HIGHMEM
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (dev->features & NETIF_F_HIGHDMA)
|
if (dev->features & NETIF_F_HIGHDMA)
|
||||||
|
@ -1251,11 +1256,9 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
|
||||||
if (PageHighMem(skb_shinfo(skb)->frags[i].page))
|
if (PageHighMem(skb_shinfo(skb)->frags[i].page))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define illegal_highdma(dev, skb) (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct dev_gso_cb {
|
struct dev_gso_cb {
|
||||||
void (*destructor)(struct sk_buff *skb);
|
void (*destructor)(struct sk_buff *skb);
|
||||||
|
@ -1291,9 +1294,15 @@ static int dev_gso_segment(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct net_device *dev = skb->dev;
|
struct net_device *dev = skb->dev;
|
||||||
struct sk_buff *segs;
|
struct sk_buff *segs;
|
||||||
|
int features = dev->features & ~(illegal_highdma(dev, skb) ?
|
||||||
|
NETIF_F_SG : 0);
|
||||||
|
|
||||||
|
segs = skb_gso_segment(skb, features);
|
||||||
|
|
||||||
|
/* Verifying header integrity only. */
|
||||||
|
if (!segs)
|
||||||
|
return 0;
|
||||||
|
|
||||||
segs = skb_gso_segment(skb, dev->features & NETIF_F_SG &&
|
|
||||||
!illegal_highdma(dev, skb));
|
|
||||||
if (unlikely(IS_ERR(segs)))
|
if (unlikely(IS_ERR(segs)))
|
||||||
return PTR_ERR(segs);
|
return PTR_ERR(segs);
|
||||||
|
|
||||||
|
@ -1310,13 +1319,17 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
if (netdev_nit)
|
if (netdev_nit)
|
||||||
dev_queue_xmit_nit(skb, dev);
|
dev_queue_xmit_nit(skb, dev);
|
||||||
|
|
||||||
if (!netif_needs_gso(dev, skb))
|
if (netif_needs_gso(dev, skb)) {
|
||||||
return dev->hard_start_xmit(skb, dev);
|
if (unlikely(dev_gso_segment(skb)))
|
||||||
|
goto out_kfree_skb;
|
||||||
|
if (skb->next)
|
||||||
|
goto gso;
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely(dev_gso_segment(skb)))
|
return dev->hard_start_xmit(skb, dev);
|
||||||
goto out_kfree_skb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gso:
|
||||||
do {
|
do {
|
||||||
struct sk_buff *nskb = skb->next;
|
struct sk_buff *nskb = skb->next;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
|
@ -663,7 +663,7 @@ rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *errp)
|
||||||
sz_idx = type>>2;
|
sz_idx = type>>2;
|
||||||
kind = type&3;
|
kind = type&3;
|
||||||
|
|
||||||
if (kind != 2 && security_netlink_recv(skb)) {
|
if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) {
|
||||||
*errp = -EPERM;
|
*errp = -EPERM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,7 +272,7 @@ static void skb_clone_fraglist(struct sk_buff *skb)
|
||||||
skb_get(list);
|
skb_get(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
void skb_release_data(struct sk_buff *skb)
|
static void skb_release_data(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
if (!skb->cloned ||
|
if (!skb->cloned ||
|
||||||
!atomic_sub_return(skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1,
|
!atomic_sub_return(skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1,
|
||||||
|
@ -1848,13 +1848,13 @@ EXPORT_SYMBOL_GPL(skb_pull_rcsum);
|
||||||
/**
|
/**
|
||||||
* skb_segment - Perform protocol segmentation on skb.
|
* skb_segment - Perform protocol segmentation on skb.
|
||||||
* @skb: buffer to segment
|
* @skb: buffer to segment
|
||||||
* @sg: whether scatter-gather can be used for generated segments
|
* @features: features for the output path (see dev->features)
|
||||||
*
|
*
|
||||||
* This function performs segmentation on the given skb. It returns
|
* This function performs segmentation on the given skb. It returns
|
||||||
* the segment at the given position. It returns NULL if there are
|
* the segment at the given position. It returns NULL if there are
|
||||||
* no more segments to generate, or when an error is encountered.
|
* no more segments to generate, or when an error is encountered.
|
||||||
*/
|
*/
|
||||||
struct sk_buff *skb_segment(struct sk_buff *skb, int sg)
|
struct sk_buff *skb_segment(struct sk_buff *skb, int features)
|
||||||
{
|
{
|
||||||
struct sk_buff *segs = NULL;
|
struct sk_buff *segs = NULL;
|
||||||
struct sk_buff *tail = NULL;
|
struct sk_buff *tail = NULL;
|
||||||
|
@ -1863,6 +1863,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int sg)
|
||||||
unsigned int offset = doffset;
|
unsigned int offset = doffset;
|
||||||
unsigned int headroom;
|
unsigned int headroom;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
|
int sg = features & NETIF_F_SG;
|
||||||
int nfrags = skb_shinfo(skb)->nr_frags;
|
int nfrags = skb_shinfo(skb)->nr_frags;
|
||||||
int err = -ENOMEM;
|
int err = -ENOMEM;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
|
@ -565,6 +565,13 @@ set_rcvbuf:
|
||||||
ret = -ENONET;
|
ret = -ENONET;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SO_PASSSEC:
|
||||||
|
if (valbool)
|
||||||
|
set_bit(SOCK_PASSSEC, &sock->flags);
|
||||||
|
else
|
||||||
|
clear_bit(SOCK_PASSSEC, &sock->flags);
|
||||||
|
break;
|
||||||
|
|
||||||
/* We implement the SO_SNDLOWAT etc to
|
/* We implement the SO_SNDLOWAT etc to
|
||||||
not be settable (1003.1g 5.3) */
|
not be settable (1003.1g 5.3) */
|
||||||
default:
|
default:
|
||||||
|
@ -723,6 +730,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
||||||
v.val = sk->sk_state == TCP_LISTEN;
|
v.val = sk->sk_state == TCP_LISTEN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SO_PASSSEC:
|
||||||
|
v.val = test_bit(SOCK_PASSSEC, &sock->flags) ? 1 : 0;
|
||||||
|
break;
|
||||||
|
|
||||||
case SO_PEERSEC:
|
case SO_PEERSEC:
|
||||||
return security_socket_getpeersec_stream(sock, optval, optlen, len);
|
return security_socket_getpeersec_stream(sock, optval, optlen, len);
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb)
|
||||||
if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
|
if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN))
|
if (security_netlink_recv(skb, CAP_NET_ADMIN))
|
||||||
RCV_SKB_FAIL(-EPERM);
|
RCV_SKB_FAIL(-EPERM);
|
||||||
|
|
||||||
/* Eventually we might send routing messages too */
|
/* Eventually we might send routing messages too */
|
||||||
|
|
|
@ -1097,7 +1097,7 @@ int inet_sk_rebuild_header(struct sock *sk)
|
||||||
|
|
||||||
EXPORT_SYMBOL(inet_sk_rebuild_header);
|
EXPORT_SYMBOL(inet_sk_rebuild_header);
|
||||||
|
|
||||||
static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int sg)
|
static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
|
||||||
{
|
{
|
||||||
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
||||||
struct iphdr *iph;
|
struct iphdr *iph;
|
||||||
|
@ -1126,10 +1126,10 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int sg)
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
ops = rcu_dereference(inet_protos[proto]);
|
ops = rcu_dereference(inet_protos[proto]);
|
||||||
if (ops && ops->gso_segment)
|
if (ops && ops->gso_segment)
|
||||||
segs = ops->gso_segment(skb, sg);
|
segs = ops->gso_segment(skb, features);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (IS_ERR(segs))
|
if (!segs || unlikely(IS_ERR(segs)))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
skb = segs;
|
skb = segs;
|
||||||
|
|
|
@ -332,7 +332,7 @@ config IP_NF_MATCH_HASHLIMIT
|
||||||
help
|
help
|
||||||
This option adds a new iptables `hashlimit' match.
|
This option adds a new iptables `hashlimit' match.
|
||||||
|
|
||||||
As opposed to `limit', this match dynamically crates a hash table
|
As opposed to `limit', this match dynamically creates a hash table
|
||||||
of limit buckets, based on your selection of source/destination
|
of limit buckets, based on your selection of source/destination
|
||||||
ip addresses and/or ports.
|
ip addresses and/or ports.
|
||||||
|
|
||||||
|
|
|
@ -1120,7 +1120,8 @@ int arpt_register_table(struct arpt_table *table,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xt_register_table(table, &bootstrap, newinfo) != 0) {
|
ret = xt_register_table(table, &bootstrap, newinfo);
|
||||||
|
if (ret != 0) {
|
||||||
xt_free_table_info(newinfo);
|
xt_free_table_info(newinfo);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -457,11 +457,19 @@ dev_cmp(struct ipq_queue_entry *entry, unsigned long ifindex)
|
||||||
if (entry->info->indev)
|
if (entry->info->indev)
|
||||||
if (entry->info->indev->ifindex == ifindex)
|
if (entry->info->indev->ifindex == ifindex)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (entry->info->outdev)
|
if (entry->info->outdev)
|
||||||
if (entry->info->outdev->ifindex == ifindex)
|
if (entry->info->outdev->ifindex == ifindex)
|
||||||
return 1;
|
return 1;
|
||||||
|
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||||
|
if (entry->skb->nf_bridge) {
|
||||||
|
if (entry->skb->nf_bridge->physindev &&
|
||||||
|
entry->skb->nf_bridge->physindev->ifindex == ifindex)
|
||||||
|
return 1;
|
||||||
|
if (entry->skb->nf_bridge->physoutdev &&
|
||||||
|
entry->skb->nf_bridge->physoutdev->ifindex == ifindex)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,7 +515,7 @@ ipq_rcv_skb(struct sk_buff *skb)
|
||||||
if (type <= IPQM_BASE)
|
if (type <= IPQM_BASE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (security_netlink_recv(skb))
|
if (security_netlink_recv(skb, CAP_NET_ADMIN))
|
||||||
RCV_SKB_FAIL(-EPERM);
|
RCV_SKB_FAIL(-EPERM);
|
||||||
|
|
||||||
write_lock_bh(&queue_lock);
|
write_lock_bh(&queue_lock);
|
||||||
|
|
|
@ -2113,7 +2113,8 @@ int ipt_register_table(struct xt_table *table, const struct ipt_replace *repl)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xt_register_table(table, &bootstrap, newinfo) != 0) {
|
ret = xt_register_table(table, &bootstrap, newinfo);
|
||||||
|
if (ret != 0) {
|
||||||
xt_free_table_info(newinfo);
|
xt_free_table_info(newinfo);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2145,7 +2145,7 @@ int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
|
||||||
EXPORT_SYMBOL(compat_tcp_getsockopt);
|
EXPORT_SYMBOL(compat_tcp_getsockopt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int sg)
|
struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features)
|
||||||
{
|
{
|
||||||
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
||||||
struct tcphdr *th;
|
struct tcphdr *th;
|
||||||
|
@ -2166,10 +2166,14 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int sg)
|
||||||
if (!pskb_may_pull(skb, thlen))
|
if (!pskb_may_pull(skb, thlen))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
segs = NULL;
|
||||||
|
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST))
|
||||||
|
goto out;
|
||||||
|
|
||||||
oldlen = (u16)~skb->len;
|
oldlen = (u16)~skb->len;
|
||||||
__skb_pull(skb, thlen);
|
__skb_pull(skb, thlen);
|
||||||
|
|
||||||
segs = skb_segment(skb, sg);
|
segs = skb_segment(skb, features);
|
||||||
if (IS_ERR(segs))
|
if (IS_ERR(segs))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,10 @@ static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
|
||||||
const struct tcp_sock *tp = tcp_sk(sk);
|
const struct tcp_sock *tp = tcp_sk(sk);
|
||||||
struct tcp_info *info = _info;
|
struct tcp_info *info = _info;
|
||||||
|
|
||||||
r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq;
|
if (sk->sk_state == TCP_LISTEN)
|
||||||
|
r->idiag_rqueue = sk->sk_ack_backlog;
|
||||||
|
else
|
||||||
|
r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq;
|
||||||
r->idiag_wqueue = tp->write_seq - tp->snd_una;
|
r->idiag_wqueue = tp->write_seq - tp->snd_una;
|
||||||
if (info != NULL)
|
if (info != NULL)
|
||||||
tcp_get_info(sk, info);
|
tcp_get_info(sk, info);
|
||||||
|
|
|
@ -4178,8 +4178,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TCP_ECN_rcv_synack(tp, th);
|
TCP_ECN_rcv_synack(tp, th);
|
||||||
if (tp->ecn_flags&TCP_ECN_OK)
|
|
||||||
sock_set_flag(sk, SOCK_NO_LARGESEND);
|
|
||||||
|
|
||||||
tp->snd_wl1 = TCP_SKB_CB(skb)->seq;
|
tp->snd_wl1 = TCP_SKB_CB(skb)->seq;
|
||||||
tcp_ack(sk, skb, FLAG_SLOWPATH);
|
tcp_ack(sk, skb, FLAG_SLOWPATH);
|
||||||
|
@ -4322,8 +4320,6 @@ discard:
|
||||||
tp->max_window = tp->snd_wnd;
|
tp->max_window = tp->snd_wnd;
|
||||||
|
|
||||||
TCP_ECN_rcv_syn(tp, th);
|
TCP_ECN_rcv_syn(tp, th);
|
||||||
if (tp->ecn_flags&TCP_ECN_OK)
|
|
||||||
sock_set_flag(sk, SOCK_NO_LARGESEND);
|
|
||||||
|
|
||||||
tcp_mtup_init(sk);
|
tcp_mtup_init(sk);
|
||||||
tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
||||||
|
|
|
@ -1726,7 +1726,8 @@ static void get_tcp4_sock(struct sock *sp, char *tmpbuf, int i)
|
||||||
sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "
|
sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "
|
||||||
"%08X %5d %8d %lu %d %p %u %u %u %u %d",
|
"%08X %5d %8d %lu %d %p %u %u %u %u %d",
|
||||||
i, src, srcp, dest, destp, sp->sk_state,
|
i, src, srcp, dest, destp, sp->sk_state,
|
||||||
tp->write_seq - tp->snd_una, tp->rcv_nxt - tp->copied_seq,
|
tp->write_seq - tp->snd_una,
|
||||||
|
(sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
|
||||||
timer_active,
|
timer_active,
|
||||||
jiffies_to_clock_t(timer_expires - jiffies),
|
jiffies_to_clock_t(timer_expires - jiffies),
|
||||||
icsk->icsk_retransmits,
|
icsk->icsk_retransmits,
|
||||||
|
|
|
@ -440,8 +440,6 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
|
||||||
newicsk->icsk_ack.last_seg_size = skb->len - newtp->tcp_header_len;
|
newicsk->icsk_ack.last_seg_size = skb->len - newtp->tcp_header_len;
|
||||||
newtp->rx_opt.mss_clamp = req->mss;
|
newtp->rx_opt.mss_clamp = req->mss;
|
||||||
TCP_ECN_openreq_child(newtp, req);
|
TCP_ECN_openreq_child(newtp, req);
|
||||||
if (newtp->ecn_flags&TCP_ECN_OK)
|
|
||||||
sock_set_flag(newsk, SOCK_NO_LARGESEND);
|
|
||||||
|
|
||||||
TCP_INC_STATS_BH(TCP_MIB_PASSIVEOPENS);
|
TCP_INC_STATS_BH(TCP_MIB_PASSIVEOPENS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2044,8 +2044,6 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
||||||
memset(th, 0, sizeof(struct tcphdr));
|
memset(th, 0, sizeof(struct tcphdr));
|
||||||
th->syn = 1;
|
th->syn = 1;
|
||||||
th->ack = 1;
|
th->ack = 1;
|
||||||
if (dst->dev->features&NETIF_F_TSO)
|
|
||||||
ireq->ecn_ok = 0;
|
|
||||||
TCP_ECN_make_synack(req, th);
|
TCP_ECN_make_synack(req, th);
|
||||||
th->source = inet_sk(sk)->sport;
|
th->source = inet_sk(sk)->sport;
|
||||||
th->dest = ireq->rmt_port;
|
th->dest = ireq->rmt_port;
|
||||||
|
|
|
@ -505,7 +505,7 @@ ipq_rcv_skb(struct sk_buff *skb)
|
||||||
if (type <= IPQM_BASE)
|
if (type <= IPQM_BASE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (security_netlink_recv(skb))
|
if (security_netlink_recv(skb, CAP_NET_ADMIN))
|
||||||
RCV_SKB_FAIL(-EPERM);
|
RCV_SKB_FAIL(-EPERM);
|
||||||
|
|
||||||
write_lock_bh(&queue_lock);
|
write_lock_bh(&queue_lock);
|
||||||
|
|
|
@ -1281,7 +1281,8 @@ int ip6t_register_table(struct xt_table *table,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xt_register_table(table, &bootstrap, newinfo) != 0) {
|
ret = xt_register_table(table, &bootstrap, newinfo);
|
||||||
|
if (ret != 0) {
|
||||||
xt_free_table_info(newinfo);
|
xt_free_table_info(newinfo);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1469,7 +1469,8 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
|
||||||
dest->s6_addr32[0], dest->s6_addr32[1],
|
dest->s6_addr32[0], dest->s6_addr32[1],
|
||||||
dest->s6_addr32[2], dest->s6_addr32[3], destp,
|
dest->s6_addr32[2], dest->s6_addr32[3], destp,
|
||||||
sp->sk_state,
|
sp->sk_state,
|
||||||
tp->write_seq-tp->snd_una, tp->rcv_nxt-tp->copied_seq,
|
tp->write_seq-tp->snd_una,
|
||||||
|
(sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
|
||||||
timer_active,
|
timer_active,
|
||||||
jiffies_to_clock_t(timer_expires - jiffies),
|
jiffies_to_clock_t(timer_expires - jiffies),
|
||||||
icsk->icsk_retransmits,
|
icsk->icsk_retransmits,
|
||||||
|
|
|
@ -173,13 +173,14 @@ void irlan_client_discovery_indication(discinfo_t *discovery,
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
self = irlan_get_any();
|
self = irlan_get_any();
|
||||||
if (self) {
|
if (self) {
|
||||||
IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
|
IRDA_ASSERT(self->magic == IRLAN_MAGIC, goto out;);
|
||||||
|
|
||||||
IRDA_DEBUG(1, "%s(), Found instance (%08x)!\n", __FUNCTION__ ,
|
IRDA_DEBUG(1, "%s(), Found instance (%08x)!\n", __FUNCTION__ ,
|
||||||
daddr);
|
daddr);
|
||||||
|
|
||||||
irlan_client_wakeup(self, saddr, daddr);
|
irlan_client_wakeup(self, saddr, daddr);
|
||||||
}
|
}
|
||||||
|
IRDA_ASSERT_LABEL(out:)
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -411,7 +411,10 @@ config NETFILTER_XT_MATCH_STATISTIC
|
||||||
tristate '"statistic" match support'
|
tristate '"statistic" match support'
|
||||||
depends on NETFILTER_XTABLES
|
depends on NETFILTER_XTABLES
|
||||||
help
|
help
|
||||||
statistic module
|
This option adds a `statistic' match, which allows you to match
|
||||||
|
on packets periodically or randomly with a given percentage.
|
||||||
|
|
||||||
|
To compile it as a module, choose M here. If unsure, say N.
|
||||||
|
|
||||||
config NETFILTER_XT_MATCH_STRING
|
config NETFILTER_XT_MATCH_STRING
|
||||||
tristate '"string" match support'
|
tristate '"string" match support'
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/netlink.h>
|
#include <linux/netlink.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
|
|
||||||
#include <linux/netfilter.h>
|
#include <linux/netfilter.h>
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
#include <linux/sctp.h>
|
#include <linux/sctp.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include <net/netfilter/nf_conntrack.h>
|
#include <net/netfilter/nf_conntrack.h>
|
||||||
#include <net/netfilter/nf_conntrack_protocol.h>
|
#include <net/netfilter/nf_conntrack_protocol.h>
|
||||||
|
|
|
@ -229,7 +229,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb,
|
||||||
NFNL_SUBSYS_ID(nlh->nlmsg_type),
|
NFNL_SUBSYS_ID(nlh->nlmsg_type),
|
||||||
NFNL_MSG_TYPE(nlh->nlmsg_type));
|
NFNL_MSG_TYPE(nlh->nlmsg_type));
|
||||||
|
|
||||||
if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) {
|
if (security_netlink_recv(skb, CAP_NET_ADMIN)) {
|
||||||
DEBUGP("missing CAP_NET_ADMIN\n");
|
DEBUGP("missing CAP_NET_ADMIN\n");
|
||||||
*errp = -EPERM;
|
*errp = -EPERM;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -680,11 +680,19 @@ dev_cmp(struct nfqnl_queue_entry *entry, unsigned long ifindex)
|
||||||
if (entinf->indev)
|
if (entinf->indev)
|
||||||
if (entinf->indev->ifindex == ifindex)
|
if (entinf->indev->ifindex == ifindex)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (entinf->outdev)
|
if (entinf->outdev)
|
||||||
if (entinf->outdev->ifindex == ifindex)
|
if (entinf->outdev->ifindex == ifindex)
|
||||||
return 1;
|
return 1;
|
||||||
|
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||||
|
if (entry->skb->nf_bridge) {
|
||||||
|
if (entry->skb->nf_bridge->physindev &&
|
||||||
|
entry->skb->nf_bridge->physindev->ifindex == ifindex)
|
||||||
|
return 1;
|
||||||
|
if (entry->skb->nf_bridge->physoutdev &&
|
||||||
|
entry->skb->nf_bridge->physoutdev->ifindex == ifindex)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ match(const struct sk_buff *skb,
|
||||||
&& SCCHECK(((ntohs(sh->dest) >= info->dpts[0])
|
&& SCCHECK(((ntohs(sh->dest) >= info->dpts[0])
|
||||||
&& (ntohs(sh->dest) <= info->dpts[1])),
|
&& (ntohs(sh->dest) <= info->dpts[1])),
|
||||||
XT_SCTP_DEST_PORTS, info->flags, info->invflags)
|
XT_SCTP_DEST_PORTS, info->flags, info->invflags)
|
||||||
&& SCCHECK(match_packet(skb, protoff,
|
&& SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t),
|
||||||
info->chunkmap, info->chunk_match_type,
|
info->chunkmap, info->chunk_match_type,
|
||||||
info->flag_info, info->flag_count,
|
info->flag_info, info->flag_count,
|
||||||
hotdrop),
|
hotdrop),
|
||||||
|
|
|
@ -260,7 +260,7 @@ static int __init xt_tcpudp_init(void)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
out_unreg_udp:
|
out_unreg_udp:
|
||||||
xt_unregister_match(&tcp_matchstruct);
|
xt_unregister_match(&udp_matchstruct);
|
||||||
out_unreg_tcp6:
|
out_unreg_tcp6:
|
||||||
xt_unregister_match(&tcp6_matchstruct);
|
xt_unregister_match(&tcp6_matchstruct);
|
||||||
out_unreg_tcp:
|
out_unreg_tcp:
|
||||||
|
|
|
@ -320,7 +320,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ops->flags & GENL_ADMIN_PERM) && security_netlink_recv(skb)) {
|
if ((ops->flags & GENL_ADMIN_PERM) && security_netlink_recv(skb, CAP_NET_ADMIN)) {
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,7 +191,8 @@ static int __init tipc_init(void)
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
tipc_log_reinit(CONFIG_TIPC_LOG);
|
tipc_log_reinit(CONFIG_TIPC_LOG);
|
||||||
info("Activated (compiled " __DATE__ " " __TIME__ ")\n");
|
info("Activated (version " TIPC_MOD_VER
|
||||||
|
" compiled " __DATE__ " " __TIME__ ")\n");
|
||||||
|
|
||||||
tipc_own_addr = 0;
|
tipc_own_addr = 0;
|
||||||
tipc_remote_management = 1;
|
tipc_remote_management = 1;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* net/tipc/link.c: TIPC link code
|
* net/tipc/link.c: TIPC link code
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2006, Ericsson AB
|
* Copyright (c) 1996-2006, Ericsson AB
|
||||||
* Copyright (c) 2004-2005, Wind River Systems
|
* Copyright (c) 2004-2006, Wind River Systems
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -988,17 +988,18 @@ static int link_bundle_buf(struct link *l_ptr,
|
||||||
struct tipc_msg *bundler_msg = buf_msg(bundler);
|
struct tipc_msg *bundler_msg = buf_msg(bundler);
|
||||||
struct tipc_msg *msg = buf_msg(buf);
|
struct tipc_msg *msg = buf_msg(buf);
|
||||||
u32 size = msg_size(msg);
|
u32 size = msg_size(msg);
|
||||||
u32 to_pos = align(msg_size(bundler_msg));
|
u32 bundle_size = msg_size(bundler_msg);
|
||||||
u32 rest = link_max_pkt(l_ptr) - to_pos;
|
u32 to_pos = align(bundle_size);
|
||||||
|
u32 pad = to_pos - bundle_size;
|
||||||
|
|
||||||
if (msg_user(bundler_msg) != MSG_BUNDLER)
|
if (msg_user(bundler_msg) != MSG_BUNDLER)
|
||||||
return 0;
|
return 0;
|
||||||
if (msg_type(bundler_msg) != OPEN_MSG)
|
if (msg_type(bundler_msg) != OPEN_MSG)
|
||||||
return 0;
|
return 0;
|
||||||
if (rest < align(size))
|
if (skb_tailroom(bundler) < (pad + size))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
skb_put(bundler, (to_pos - msg_size(bundler_msg)) + size);
|
skb_put(bundler, pad + size);
|
||||||
memcpy(bundler->data + to_pos, buf->data, size);
|
memcpy(bundler->data + to_pos, buf->data, size);
|
||||||
msg_set_size(bundler_msg, to_pos + size);
|
msg_set_size(bundler_msg, to_pos + size);
|
||||||
msg_set_msgcnt(bundler_msg, msg_msgcnt(bundler_msg) + 1);
|
msg_set_msgcnt(bundler_msg, msg_msgcnt(bundler_msg) + 1);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* net/tipc/node.c: TIPC node management routines
|
* net/tipc/node.c: TIPC node management routines
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000-2006, Ericsson AB
|
* Copyright (c) 2000-2006, Ericsson AB
|
||||||
* Copyright (c) 2005, Wind River Systems
|
* Copyright (c) 2005-2006, Wind River Systems
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -592,6 +592,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
|
||||||
struct sk_buff *buf;
|
struct sk_buff *buf;
|
||||||
struct node *n_ptr;
|
struct node *n_ptr;
|
||||||
struct tipc_node_info node_info;
|
struct tipc_node_info node_info;
|
||||||
|
u32 payload_size;
|
||||||
|
|
||||||
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
|
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
|
||||||
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
|
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
|
||||||
|
@ -608,8 +609,11 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
|
||||||
/* For now, get space for all other nodes
|
/* For now, get space for all other nodes
|
||||||
(will need to modify this when slave nodes are supported */
|
(will need to modify this when slave nodes are supported */
|
||||||
|
|
||||||
buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(node_info)) *
|
payload_size = TLV_SPACE(sizeof(node_info)) * (tipc_max_nodes - 1);
|
||||||
(tipc_max_nodes - 1));
|
if (payload_size > 32768u)
|
||||||
|
return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
|
||||||
|
" (too many nodes)");
|
||||||
|
buf = tipc_cfg_reply_alloc(payload_size);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -633,6 +637,7 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
|
||||||
struct sk_buff *buf;
|
struct sk_buff *buf;
|
||||||
struct node *n_ptr;
|
struct node *n_ptr;
|
||||||
struct tipc_link_info link_info;
|
struct tipc_link_info link_info;
|
||||||
|
u32 payload_size;
|
||||||
|
|
||||||
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
|
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
|
||||||
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
|
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
|
||||||
|
@ -646,11 +651,14 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
|
||||||
if (!tipc_nodes)
|
if (!tipc_nodes)
|
||||||
return tipc_cfg_reply_none();
|
return tipc_cfg_reply_none();
|
||||||
|
|
||||||
/* For now, get space for 2 links to all other nodes + bcast link
|
/* Get space for all unicast links + multicast link */
|
||||||
(will need to modify this when slave nodes are supported */
|
|
||||||
|
|
||||||
buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(link_info)) *
|
payload_size = TLV_SPACE(sizeof(link_info)) *
|
||||||
(2 * (tipc_max_nodes - 1) + 1));
|
(tipc_net.zones[tipc_zone(tipc_own_addr)]->links + 1);
|
||||||
|
if (payload_size > 32768u)
|
||||||
|
return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
|
||||||
|
" (too many links)");
|
||||||
|
buf = tipc_cfg_reply_alloc(payload_size);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* net/tipc/zone.h: Include file for TIPC zone management routines
|
* net/tipc/zone.h: Include file for TIPC zone management routines
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000-2006, Ericsson AB
|
* Copyright (c) 2000-2006, Ericsson AB
|
||||||
* Copyright (c) 2005, Wind River Systems
|
* Copyright (c) 2005-2006, Wind River Systems
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
* struct _zone - TIPC zone structure
|
* struct _zone - TIPC zone structure
|
||||||
* @addr: network address of zone
|
* @addr: network address of zone
|
||||||
* @clusters: array of pointers to all clusters within zone
|
* @clusters: array of pointers to all clusters within zone
|
||||||
* @links: (used for inter-zone communication)
|
* @links: number of (unicast) links to zone
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct _zone {
|
struct _zone {
|
||||||
|
|
|
@ -128,6 +128,30 @@ static atomic_t unix_nr_socks = ATOMIC_INIT(0);
|
||||||
|
|
||||||
#define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE)
|
#define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE)
|
||||||
|
|
||||||
|
#ifdef CONFIG_SECURITY_NETWORK
|
||||||
|
static void unix_get_peersec_dgram(struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = security_socket_getpeersec_dgram(skb, UNIXSECDATA(skb),
|
||||||
|
UNIXSECLEN(skb));
|
||||||
|
if (err)
|
||||||
|
*(UNIXSECDATA(skb)) = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
scm->secdata = *UNIXSECDATA(skb);
|
||||||
|
scm->seclen = *UNIXSECLEN(skb);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void unix_get_peersec_dgram(struct sk_buff *skb)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
|
||||||
|
{ }
|
||||||
|
#endif /* CONFIG_SECURITY_NETWORK */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SMP locking strategy:
|
* SMP locking strategy:
|
||||||
* hash table is protected with spinlock unix_table_lock
|
* hash table is protected with spinlock unix_table_lock
|
||||||
|
@ -1291,6 +1315,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||||
if (siocb->scm->fp)
|
if (siocb->scm->fp)
|
||||||
unix_attach_fds(siocb->scm, skb);
|
unix_attach_fds(siocb->scm, skb);
|
||||||
|
|
||||||
|
unix_get_peersec_dgram(skb);
|
||||||
|
|
||||||
skb->h.raw = skb->data;
|
skb->h.raw = skb->data;
|
||||||
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
|
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -1570,6 +1596,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||||
memset(&tmp_scm, 0, sizeof(tmp_scm));
|
memset(&tmp_scm, 0, sizeof(tmp_scm));
|
||||||
}
|
}
|
||||||
siocb->scm->creds = *UNIXCREDS(skb);
|
siocb->scm->creds = *UNIXCREDS(skb);
|
||||||
|
unix_set_secdata(siocb->scm, skb);
|
||||||
|
|
||||||
if (!(flags & MSG_PEEK))
|
if (!(flags & MSG_PEEK))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1164,8 +1164,6 @@ int xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(xfrm_state_mtu);
|
|
||||||
|
|
||||||
int xfrm_init_state(struct xfrm_state *x)
|
int xfrm_init_state(struct xfrm_state *x)
|
||||||
{
|
{
|
||||||
struct xfrm_state_afinfo *afinfo;
|
struct xfrm_state_afinfo *afinfo;
|
||||||
|
|
|
@ -1435,7 +1435,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *err
|
||||||
link = &xfrm_dispatch[type];
|
link = &xfrm_dispatch[type];
|
||||||
|
|
||||||
/* All operations require privileges, even GET */
|
/* All operations require privileges, even GET */
|
||||||
if (security_netlink_recv(skb)) {
|
if (security_netlink_recv(skb, CAP_NET_ADMIN)) {
|
||||||
*errp = -EPERM;
|
*errp = -EPERM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,9 +33,9 @@ int cap_netlink_send(struct sock *sk, struct sk_buff *skb)
|
||||||
|
|
||||||
EXPORT_SYMBOL(cap_netlink_send);
|
EXPORT_SYMBOL(cap_netlink_send);
|
||||||
|
|
||||||
int cap_netlink_recv(struct sk_buff *skb)
|
int cap_netlink_recv(struct sk_buff *skb, int cap)
|
||||||
{
|
{
|
||||||
if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN))
|
if (!cap_raised(NETLINK_CB(skb).eff_cap, cap))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -675,9 +675,9 @@ static int dummy_netlink_send (struct sock *sk, struct sk_buff *skb)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dummy_netlink_recv (struct sk_buff *skb)
|
static int dummy_netlink_recv (struct sk_buff *skb, int cap)
|
||||||
{
|
{
|
||||||
if (!cap_raised (NETLINK_CB (skb).eff_cap, CAP_NET_ADMIN))
|
if (!cap_raised (NETLINK_CB (skb).eff_cap, cap))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
#include <linux/sysctl.h>
|
#include <linux/sysctl.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/selinux.h>
|
||||||
|
|
||||||
#include "avc.h"
|
#include "avc.h"
|
||||||
#include "objsec.h"
|
#include "objsec.h"
|
||||||
|
@ -3420,7 +3421,13 @@ out:
|
||||||
static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, u32 *seclen)
|
static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, u32 *seclen)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
u32 peer_sid = selinux_socket_getpeer_dgram(skb);
|
u32 peer_sid;
|
||||||
|
|
||||||
|
if (skb->sk->sk_family == PF_UNIX)
|
||||||
|
selinux_get_inode_sid(SOCK_INODE(skb->sk->sk_socket),
|
||||||
|
&peer_sid);
|
||||||
|
else
|
||||||
|
peer_sid = selinux_socket_getpeer_dgram(skb);
|
||||||
|
|
||||||
if (peer_sid == SECSID_NULL)
|
if (peer_sid == SECSID_NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -3432,8 +3439,6 @@ static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
|
static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
|
||||||
{
|
{
|
||||||
return sk_alloc_security(sk, family, priority);
|
return sk_alloc_security(sk, family, priority);
|
||||||
|
@ -3641,32 +3646,32 @@ static unsigned int selinux_ipv6_postroute_last(unsigned int hooknum,
|
||||||
|
|
||||||
static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
|
static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct task_security_struct *tsec;
|
|
||||||
struct av_decision avd;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = secondary_ops->netlink_send(sk, skb);
|
err = secondary_ops->netlink_send(sk, skb);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
tsec = current->security;
|
|
||||||
|
|
||||||
avd.allowed = 0;
|
|
||||||
avc_has_perm_noaudit(tsec->sid, tsec->sid,
|
|
||||||
SECCLASS_CAPABILITY, ~0, &avd);
|
|
||||||
cap_mask(NETLINK_CB(skb).eff_cap, avd.allowed);
|
|
||||||
|
|
||||||
if (policydb_loaded_version >= POLICYDB_VERSION_NLCLASS)
|
if (policydb_loaded_version >= POLICYDB_VERSION_NLCLASS)
|
||||||
err = selinux_nlmsg_perm(sk, skb);
|
err = selinux_nlmsg_perm(sk, skb);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int selinux_netlink_recv(struct sk_buff *skb)
|
static int selinux_netlink_recv(struct sk_buff *skb, int capability)
|
||||||
{
|
{
|
||||||
if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN))
|
int err;
|
||||||
return -EPERM;
|
struct avc_audit_data ad;
|
||||||
return 0;
|
|
||||||
|
err = secondary_ops->netlink_recv(skb, capability);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
AVC_AUDIT_DATA_INIT(&ad, CAP);
|
||||||
|
ad.u.cap = capability;
|
||||||
|
|
||||||
|
return avc_has_perm(NETLINK_CB(skb).sid, NETLINK_CB(skb).sid,
|
||||||
|
SECCLASS_CAPABILITY, CAP_TO_MASK(capability), &ad);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipc_alloc_security(struct task_struct *task,
|
static int ipc_alloc_security(struct task_struct *task,
|
||||||
|
|
Loading…
Add table
Reference in a new issue