Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
Коммит
bd4a6974cc
|
@ -187,7 +187,7 @@ tcp_cookie_size - INTEGER
|
|||
tcp_dsack - BOOLEAN
|
||||
Allows TCP to send "duplicate" SACKs.
|
||||
|
||||
tcp_ecn - BOOLEAN
|
||||
tcp_ecn - INTEGER
|
||||
Enable Explicit Congestion Notification (ECN) in TCP. ECN is only
|
||||
used when both ends of the TCP flow support it. It is useful to
|
||||
avoid losses due to congestion (when the bottleneck router supports
|
||||
|
|
|
@ -5544,12 +5544,11 @@ S: Supported
|
|||
F: drivers/scsi/be2iscsi/
|
||||
|
||||
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
|
||||
M: Sathya Perla <sathyap@serverengines.com>
|
||||
M: Subbu Seetharaman <subbus@serverengines.com>
|
||||
M: Sarveshwar Bandi <sarveshwarb@serverengines.com>
|
||||
M: Ajit Khaparde <ajitk@serverengines.com>
|
||||
M: Sathya Perla <sathya.perla@emulex.com>
|
||||
M: Subbu Seetharaman <subbu.seetharaman@emulex.com>
|
||||
M: Ajit Khaparde <ajit.khaparde@emulex.com>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.serverengines.com
|
||||
W: http://www.emulex.com
|
||||
S: Supported
|
||||
F: drivers/net/benet/
|
||||
|
||||
|
|
|
@ -1627,7 +1627,7 @@ __setup("icn=", icn_setup);
|
|||
static int __init icn_init(void)
|
||||
{
|
||||
char *p;
|
||||
char rev[20];
|
||||
char rev[21];
|
||||
|
||||
memset(&dev, 0, sizeof(icn_dev));
|
||||
dev.memaddr = (membase & 0x0ffc000);
|
||||
|
@ -1638,6 +1638,7 @@ static int __init icn_init(void)
|
|||
|
||||
if ((p = strchr(revision, ':'))) {
|
||||
strncpy(rev, p + 1, 20);
|
||||
rev[20] = '\0';
|
||||
p = strchr(rev, '$');
|
||||
if (p)
|
||||
*p = 0;
|
||||
|
|
|
@ -48,6 +48,7 @@ static DEFINE_PCI_DEVICE_TABLE(atl1c_pci_tbl) = {
|
|||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L2C_B)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L2C_B2)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L1D)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L1D_2_0)},
|
||||
/* required last entry */
|
||||
{ 0 }
|
||||
};
|
||||
|
|
|
@ -313,11 +313,9 @@ void be_link_status_update(struct be_adapter *adapter, bool link_up)
|
|||
if (adapter->link_up != link_up) {
|
||||
adapter->link_speed = -1;
|
||||
if (link_up) {
|
||||
netif_start_queue(netdev);
|
||||
netif_carrier_on(netdev);
|
||||
printk(KERN_INFO "%s: Link up\n", netdev->name);
|
||||
} else {
|
||||
netif_stop_queue(netdev);
|
||||
netif_carrier_off(netdev);
|
||||
printk(KERN_INFO "%s: Link down\n", netdev->name);
|
||||
}
|
||||
|
@ -2628,8 +2626,6 @@ static void be_netdev_init(struct net_device *netdev)
|
|||
|
||||
netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx_mcc,
|
||||
BE_NAPI_WEIGHT);
|
||||
|
||||
netif_stop_queue(netdev);
|
||||
}
|
||||
|
||||
static void be_unmap_pci_bars(struct be_adapter *adapter)
|
||||
|
|
|
@ -2301,15 +2301,10 @@ static void bnx2x_rxq_set_mac_filters(struct bnx2x *bp, u16 cl_id, u32 filters)
|
|||
/* accept matched ucast */
|
||||
drop_all_ucast = 0;
|
||||
}
|
||||
if (filters & BNX2X_ACCEPT_MULTICAST) {
|
||||
if (filters & BNX2X_ACCEPT_MULTICAST)
|
||||
/* accept matched mcast */
|
||||
drop_all_mcast = 0;
|
||||
if (IS_MF_SI(bp))
|
||||
/* since mcast addresses won't arrive with ovlan,
|
||||
* fw needs to accept all of them in
|
||||
* switch-independent mode */
|
||||
accp_all_mcast = 1;
|
||||
}
|
||||
|
||||
if (filters & BNX2X_ACCEPT_ALL_UNICAST) {
|
||||
/* accept all mcast */
|
||||
drop_all_ucast = 0;
|
||||
|
|
|
@ -1109,7 +1109,7 @@ static ssize_t at91_sysfs_set_mb0_id(struct device *dev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(mb0_id, S_IWUGO | S_IRUGO,
|
||||
static DEVICE_ATTR(mb0_id, S_IWUSR | S_IRUGO,
|
||||
at91_sysfs_show_mb0_id, at91_sysfs_set_mb0_id);
|
||||
|
||||
static struct attribute *at91_sysfs_attrs[] = {
|
||||
|
|
|
@ -1618,7 +1618,7 @@ static ssize_t ican3_sysfs_set_term(struct device *dev,
|
|||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(termination, S_IWUGO | S_IRUGO, ican3_sysfs_show_term,
|
||||
static DEVICE_ATTR(termination, S_IWUSR | S_IRUGO, ican3_sysfs_show_term,
|
||||
ican3_sysfs_set_term);
|
||||
|
||||
static struct attribute *ican3_sysfs_attrs[] = {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config CAN_SOFTING
|
||||
tristate "Softing Gmbh CAN generic support"
|
||||
depends on CAN_DEV
|
||||
depends on CAN_DEV && HAS_IOMEM
|
||||
---help---
|
||||
Support for CAN cards from Softing Gmbh & some cards
|
||||
from Vector Gmbh.
|
||||
|
|
|
@ -1094,7 +1094,7 @@ static int depca_rx(struct net_device *dev)
|
|||
}
|
||||
}
|
||||
/* Change buffer ownership for this last frame, back to the adapter */
|
||||
for (; lp->rx_old != entry; lp->rx_old = (++lp->rx_old) & lp->rxRingMask) {
|
||||
for (; lp->rx_old != entry; lp->rx_old = (lp->rx_old + 1) & lp->rxRingMask) {
|
||||
writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, &lp->rx_ring[lp->rx_old].base);
|
||||
}
|
||||
writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
|
||||
|
@ -1103,7 +1103,7 @@ static int depca_rx(struct net_device *dev)
|
|||
/*
|
||||
** Update entry information
|
||||
*/
|
||||
lp->rx_new = (++lp->rx_new) & lp->rxRingMask;
|
||||
lp->rx_new = (lp->rx_new + 1) & lp->rxRingMask;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1148,7 +1148,7 @@ static int depca_tx(struct net_device *dev)
|
|||
}
|
||||
|
||||
/* Update all the pointers */
|
||||
lp->tx_old = (++lp->tx_old) & lp->txRingMask;
|
||||
lp->tx_old = (lp->tx_old + 1) & lp->txRingMask;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -812,7 +812,7 @@ static void enc28j60_read_tsv(struct enc28j60_net *priv, u8 tsv[TSV_SIZE])
|
|||
if (netif_msg_hw(priv))
|
||||
printk(KERN_DEBUG DRV_NAME ": reading TSV at addr:0x%04x\n",
|
||||
endptr + 1);
|
||||
enc28j60_mem_read(priv, endptr + 1, sizeof(tsv), tsv);
|
||||
enc28j60_mem_read(priv, endptr + 1, TSV_SIZE, tsv);
|
||||
}
|
||||
|
||||
static void enc28j60_dump_tsv(struct enc28j60_net *priv, const char *msg,
|
||||
|
|
|
@ -4489,6 +4489,9 @@ static int niu_alloc_channels(struct niu *np)
|
|||
{
|
||||
struct niu_parent *parent = np->parent;
|
||||
int first_rx_channel, first_tx_channel;
|
||||
int num_rx_rings, num_tx_rings;
|
||||
struct rx_ring_info *rx_rings;
|
||||
struct tx_ring_info *tx_rings;
|
||||
int i, port, err;
|
||||
|
||||
port = np->port;
|
||||
|
@ -4498,18 +4501,21 @@ static int niu_alloc_channels(struct niu *np)
|
|||
first_tx_channel += parent->txchan_per_port[i];
|
||||
}
|
||||
|
||||
np->num_rx_rings = parent->rxchan_per_port[port];
|
||||
np->num_tx_rings = parent->txchan_per_port[port];
|
||||
num_rx_rings = parent->rxchan_per_port[port];
|
||||
num_tx_rings = parent->txchan_per_port[port];
|
||||
|
||||
netif_set_real_num_rx_queues(np->dev, np->num_rx_rings);
|
||||
netif_set_real_num_tx_queues(np->dev, np->num_tx_rings);
|
||||
|
||||
np->rx_rings = kcalloc(np->num_rx_rings, sizeof(struct rx_ring_info),
|
||||
GFP_KERNEL);
|
||||
rx_rings = kcalloc(num_rx_rings, sizeof(struct rx_ring_info),
|
||||
GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!np->rx_rings)
|
||||
if (!rx_rings)
|
||||
goto out_err;
|
||||
|
||||
np->num_rx_rings = num_rx_rings;
|
||||
smp_wmb();
|
||||
np->rx_rings = rx_rings;
|
||||
|
||||
netif_set_real_num_rx_queues(np->dev, num_rx_rings);
|
||||
|
||||
for (i = 0; i < np->num_rx_rings; i++) {
|
||||
struct rx_ring_info *rp = &np->rx_rings[i];
|
||||
|
||||
|
@ -4538,12 +4544,18 @@ static int niu_alloc_channels(struct niu *np)
|
|||
return err;
|
||||
}
|
||||
|
||||
np->tx_rings = kcalloc(np->num_tx_rings, sizeof(struct tx_ring_info),
|
||||
GFP_KERNEL);
|
||||
tx_rings = kcalloc(num_tx_rings, sizeof(struct tx_ring_info),
|
||||
GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!np->tx_rings)
|
||||
if (!tx_rings)
|
||||
goto out_err;
|
||||
|
||||
np->num_tx_rings = num_tx_rings;
|
||||
smp_wmb();
|
||||
np->tx_rings = tx_rings;
|
||||
|
||||
netif_set_real_num_tx_queues(np->dev, num_tx_rings);
|
||||
|
||||
for (i = 0; i < np->num_tx_rings; i++) {
|
||||
struct tx_ring_info *rp = &np->tx_rings[i];
|
||||
|
||||
|
@ -6246,11 +6258,17 @@ static void niu_sync_mac_stats(struct niu *np)
|
|||
static void niu_get_rx_stats(struct niu *np)
|
||||
{
|
||||
unsigned long pkts, dropped, errors, bytes;
|
||||
struct rx_ring_info *rx_rings;
|
||||
int i;
|
||||
|
||||
pkts = dropped = errors = bytes = 0;
|
||||
|
||||
rx_rings = ACCESS_ONCE(np->rx_rings);
|
||||
if (!rx_rings)
|
||||
goto no_rings;
|
||||
|
||||
for (i = 0; i < np->num_rx_rings; i++) {
|
||||
struct rx_ring_info *rp = &np->rx_rings[i];
|
||||
struct rx_ring_info *rp = &rx_rings[i];
|
||||
|
||||
niu_sync_rx_discard_stats(np, rp, 0);
|
||||
|
||||
|
@ -6259,6 +6277,8 @@ static void niu_get_rx_stats(struct niu *np)
|
|||
dropped += rp->rx_dropped;
|
||||
errors += rp->rx_errors;
|
||||
}
|
||||
|
||||
no_rings:
|
||||
np->dev->stats.rx_packets = pkts;
|
||||
np->dev->stats.rx_bytes = bytes;
|
||||
np->dev->stats.rx_dropped = dropped;
|
||||
|
@ -6268,16 +6288,24 @@ static void niu_get_rx_stats(struct niu *np)
|
|||
static void niu_get_tx_stats(struct niu *np)
|
||||
{
|
||||
unsigned long pkts, errors, bytes;
|
||||
struct tx_ring_info *tx_rings;
|
||||
int i;
|
||||
|
||||
pkts = errors = bytes = 0;
|
||||
|
||||
tx_rings = ACCESS_ONCE(np->tx_rings);
|
||||
if (!tx_rings)
|
||||
goto no_rings;
|
||||
|
||||
for (i = 0; i < np->num_tx_rings; i++) {
|
||||
struct tx_ring_info *rp = &np->tx_rings[i];
|
||||
struct tx_ring_info *rp = &tx_rings[i];
|
||||
|
||||
pkts += rp->tx_packets;
|
||||
bytes += rp->tx_bytes;
|
||||
errors += rp->tx_errors;
|
||||
}
|
||||
|
||||
no_rings:
|
||||
np->dev->stats.tx_packets = pkts;
|
||||
np->dev->stats.tx_bytes = bytes;
|
||||
np->dev->stats.tx_errors = errors;
|
||||
|
@ -6287,9 +6315,10 @@ static struct net_device_stats *niu_get_stats(struct net_device *dev)
|
|||
{
|
||||
struct niu *np = netdev_priv(dev);
|
||||
|
||||
niu_get_rx_stats(np);
|
||||
niu_get_tx_stats(np);
|
||||
|
||||
if (netif_running(dev)) {
|
||||
niu_get_rx_stats(np);
|
||||
niu_get_tx_stats(np);
|
||||
}
|
||||
return &dev->stats;
|
||||
}
|
||||
|
||||
|
|
|
@ -1488,12 +1488,10 @@ static void ei_rx_overrun(struct net_device *dev)
|
|||
|
||||
/*
|
||||
* Wait a full Tx time (1.2ms) + some guard time, NS says 1.6ms total.
|
||||
* Early datasheets said to poll the reset bit, but now they say that
|
||||
* it "is not a reliable indicator and subsequently should be ignored."
|
||||
* We wait at least 10ms.
|
||||
* We wait at least 2ms.
|
||||
*/
|
||||
|
||||
mdelay(10);
|
||||
mdelay(2);
|
||||
|
||||
/*
|
||||
* Reset RBCR[01] back to zero as per magic incantation.
|
||||
|
|
|
@ -973,7 +973,8 @@ static void __rtl8169_check_link_status(struct net_device *dev,
|
|||
if (pm)
|
||||
pm_request_resume(&tp->pci_dev->dev);
|
||||
netif_carrier_on(dev);
|
||||
netif_info(tp, ifup, dev, "link up\n");
|
||||
if (net_ratelimit())
|
||||
netif_info(tp, ifup, dev, "link up\n");
|
||||
} else {
|
||||
netif_carrier_off(dev);
|
||||
netif_info(tp, ifdown, dev, "link down\n");
|
||||
|
@ -3757,7 +3758,8 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
|||
RTL_W16(IntrMitigate, 0x5151);
|
||||
|
||||
/* Work around for RxFIFO overflow. */
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_11 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_22) {
|
||||
tp->intr_event |= RxFIFOOver | PCSTimeout;
|
||||
tp->intr_event &= ~RxOverflow;
|
||||
}
|
||||
|
@ -4639,12 +4641,33 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Work around for rx fifo overflow */
|
||||
if (unlikely(status & RxFIFOOver) &&
|
||||
(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
break;
|
||||
if (unlikely(status & RxFIFOOver)) {
|
||||
switch (tp->mac_version) {
|
||||
/* Work around for rx fifo overflow */
|
||||
case RTL_GIGA_MAC_VER_11:
|
||||
case RTL_GIGA_MAC_VER_22:
|
||||
case RTL_GIGA_MAC_VER_26:
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
goto done;
|
||||
/* Testers needed. */
|
||||
case RTL_GIGA_MAC_VER_17:
|
||||
case RTL_GIGA_MAC_VER_19:
|
||||
case RTL_GIGA_MAC_VER_20:
|
||||
case RTL_GIGA_MAC_VER_21:
|
||||
case RTL_GIGA_MAC_VER_23:
|
||||
case RTL_GIGA_MAC_VER_24:
|
||||
case RTL_GIGA_MAC_VER_27:
|
||||
case RTL_GIGA_MAC_VER_28:
|
||||
/* Experimental science. Pktgen proof. */
|
||||
case RTL_GIGA_MAC_VER_12:
|
||||
case RTL_GIGA_MAC_VER_25:
|
||||
if (status == RxFIFOOver)
|
||||
goto done;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(status & SYSErr)) {
|
||||
|
@ -4680,7 +4703,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
(status & RxFIFOOver) ? (status | RxOverflow) : status);
|
||||
status = RTL_R16(IntrStatus);
|
||||
}
|
||||
|
||||
done:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
|
|
|
@ -3694,7 +3694,7 @@ __vxge_hw_vpath_rts_table_get(struct __vxge_hw_vpath_handle *vp,
|
|||
if (status != VXGE_HW_OK)
|
||||
goto exit;
|
||||
|
||||
if ((rts_table != VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) ||
|
||||
if ((rts_table != VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) &&
|
||||
(rts_table !=
|
||||
VXGE_HW_RTS_ACS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT))
|
||||
*data1 = 0;
|
||||
|
|
|
@ -565,7 +565,7 @@ static int netiucv_callback_connreq(struct iucv_path *path,
|
|||
struct iucv_event ev;
|
||||
int rc;
|
||||
|
||||
if (memcmp(iucvMagic, ipuser, sizeof(ipuser)))
|
||||
if (memcmp(iucvMagic, ipuser, 16))
|
||||
/* ipuser must match iucvMagic. */
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
|
|
|
@ -988,16 +988,30 @@ static void qeth_get_channel_path_desc(struct qeth_card *card)
|
|||
chp_dsc = (struct channelPath_dsc *)ccw_device_get_chp_desc(ccwdev, 0);
|
||||
if (chp_dsc != NULL) {
|
||||
/* CHPP field bit 6 == 1 -> single queue */
|
||||
if ((chp_dsc->chpp & 0x02) == 0x02)
|
||||
if ((chp_dsc->chpp & 0x02) == 0x02) {
|
||||
if ((atomic_read(&card->qdio.state) !=
|
||||
QETH_QDIO_UNINITIALIZED) &&
|
||||
(card->qdio.no_out_queues == 4))
|
||||
/* change from 4 to 1 outbound queues */
|
||||
qeth_free_qdio_buffers(card);
|
||||
card->qdio.no_out_queues = 1;
|
||||
if (card->qdio.default_out_queue != 0)
|
||||
dev_info(&card->gdev->dev,
|
||||
"Priority Queueing not supported\n");
|
||||
card->qdio.default_out_queue = 0;
|
||||
} else {
|
||||
if ((atomic_read(&card->qdio.state) !=
|
||||
QETH_QDIO_UNINITIALIZED) &&
|
||||
(card->qdio.no_out_queues == 1)) {
|
||||
/* change from 1 to 4 outbound queues */
|
||||
qeth_free_qdio_buffers(card);
|
||||
card->qdio.default_out_queue = 2;
|
||||
}
|
||||
card->qdio.no_out_queues = 4;
|
||||
}
|
||||
card->info.func_level = 0x4100 + chp_dsc->desc;
|
||||
kfree(chp_dsc);
|
||||
}
|
||||
if (card->qdio.no_out_queues == 1) {
|
||||
card->qdio.default_out_queue = 0;
|
||||
dev_info(&card->gdev->dev,
|
||||
"Priority Queueing not supported\n");
|
||||
}
|
||||
QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level);
|
||||
return;
|
||||
|
@ -1832,33 +1846,6 @@ static inline int qeth_get_initial_mtu_for_card(struct qeth_card *card)
|
|||
}
|
||||
}
|
||||
|
||||
static inline int qeth_get_max_mtu_for_card(int cardtype)
|
||||
{
|
||||
switch (cardtype) {
|
||||
|
||||
case QETH_CARD_TYPE_UNKNOWN:
|
||||
case QETH_CARD_TYPE_OSD:
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
case QETH_CARD_TYPE_OSM:
|
||||
case QETH_CARD_TYPE_OSX:
|
||||
return 61440;
|
||||
case QETH_CARD_TYPE_IQD:
|
||||
return 57344;
|
||||
default:
|
||||
return 1500;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int qeth_get_mtu_out_of_mpc(int cardtype)
|
||||
{
|
||||
switch (cardtype) {
|
||||
case QETH_CARD_TYPE_IQD:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int qeth_get_mtu_outof_framesize(int framesize)
|
||||
{
|
||||
switch (framesize) {
|
||||
|
@ -1881,10 +1868,9 @@ static inline int qeth_mtu_is_valid(struct qeth_card *card, int mtu)
|
|||
case QETH_CARD_TYPE_OSD:
|
||||
case QETH_CARD_TYPE_OSM:
|
||||
case QETH_CARD_TYPE_OSX:
|
||||
return ((mtu >= 576) && (mtu <= 61440));
|
||||
case QETH_CARD_TYPE_IQD:
|
||||
return ((mtu >= 576) &&
|
||||
(mtu <= card->info.max_mtu + 4096 - 32));
|
||||
(mtu <= card->info.max_mtu));
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
case QETH_CARD_TYPE_UNKNOWN:
|
||||
default:
|
||||
|
@ -1907,7 +1893,7 @@ static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
|
|||
memcpy(&card->token.ulp_filter_r,
|
||||
QETH_ULP_ENABLE_RESP_FILTER_TOKEN(iob->data),
|
||||
QETH_MPC_TOKEN_LENGTH);
|
||||
if (qeth_get_mtu_out_of_mpc(card->info.type)) {
|
||||
if (card->info.type == QETH_CARD_TYPE_IQD) {
|
||||
memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data), 2);
|
||||
mtu = qeth_get_mtu_outof_framesize(framesize);
|
||||
if (!mtu) {
|
||||
|
@ -1915,12 +1901,21 @@ static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
|
|||
QETH_DBF_TEXT_(SETUP, 2, " rc%d", iob->rc);
|
||||
return 0;
|
||||
}
|
||||
card->info.max_mtu = mtu;
|
||||
if (card->info.initial_mtu && (card->info.initial_mtu != mtu)) {
|
||||
/* frame size has changed */
|
||||
if (card->dev &&
|
||||
((card->dev->mtu == card->info.initial_mtu) ||
|
||||
(card->dev->mtu > mtu)))
|
||||
card->dev->mtu = mtu;
|
||||
qeth_free_qdio_buffers(card);
|
||||
}
|
||||
card->info.initial_mtu = mtu;
|
||||
card->info.max_mtu = mtu;
|
||||
card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
|
||||
} else {
|
||||
card->info.initial_mtu = qeth_get_initial_mtu_for_card(card);
|
||||
card->info.max_mtu = qeth_get_max_mtu_for_card(card->info.type);
|
||||
card->info.max_mtu = *(__u16 *)QETH_ULP_ENABLE_RESP_MAX_MTU(
|
||||
iob->data);
|
||||
card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
|
||||
}
|
||||
|
||||
|
@ -3775,6 +3770,47 @@ static inline int qeth_get_qdio_q_format(struct qeth_card *card)
|
|||
}
|
||||
}
|
||||
|
||||
static void qeth_determine_capabilities(struct qeth_card *card)
|
||||
{
|
||||
int rc;
|
||||
int length;
|
||||
char *prcd;
|
||||
struct ccw_device *ddev;
|
||||
int ddev_offline = 0;
|
||||
|
||||
QETH_DBF_TEXT(SETUP, 2, "detcapab");
|
||||
ddev = CARD_DDEV(card);
|
||||
if (!ddev->online) {
|
||||
ddev_offline = 1;
|
||||
rc = ccw_device_set_online(ddev);
|
||||
if (rc) {
|
||||
QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
rc = qeth_read_conf_data(card, (void **) &prcd, &length);
|
||||
if (rc) {
|
||||
QETH_DBF_MESSAGE(2, "%s qeth_read_conf_data returned %i\n",
|
||||
dev_name(&card->gdev->dev), rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
|
||||
goto out_offline;
|
||||
}
|
||||
qeth_configure_unitaddr(card, prcd);
|
||||
qeth_configure_blkt_default(card, prcd);
|
||||
kfree(prcd);
|
||||
|
||||
rc = qdio_get_ssqd_desc(ddev, &card->ssqd);
|
||||
if (rc)
|
||||
QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
|
||||
|
||||
out_offline:
|
||||
if (ddev_offline == 1)
|
||||
ccw_device_set_offline(ddev);
|
||||
out:
|
||||
return;
|
||||
}
|
||||
|
||||
static int qeth_qdio_establish(struct qeth_card *card)
|
||||
{
|
||||
struct qdio_initialize init_data;
|
||||
|
@ -3905,6 +3941,7 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
|
|||
|
||||
QETH_DBF_TEXT(SETUP, 2, "hrdsetup");
|
||||
atomic_set(&card->force_alloc_skb, 0);
|
||||
qeth_get_channel_path_desc(card);
|
||||
retry:
|
||||
if (retries)
|
||||
QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n",
|
||||
|
@ -3933,6 +3970,7 @@ retriable:
|
|||
else
|
||||
goto retry;
|
||||
}
|
||||
qeth_determine_capabilities(card);
|
||||
qeth_init_tokens(card);
|
||||
qeth_init_func_level(card);
|
||||
rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
|
||||
|
@ -4202,41 +4240,6 @@ void qeth_core_free_discipline(struct qeth_card *card)
|
|||
card->discipline.ccwgdriver = NULL;
|
||||
}
|
||||
|
||||
static void qeth_determine_capabilities(struct qeth_card *card)
|
||||
{
|
||||
int rc;
|
||||
int length;
|
||||
char *prcd;
|
||||
|
||||
QETH_DBF_TEXT(SETUP, 2, "detcapab");
|
||||
rc = ccw_device_set_online(CARD_DDEV(card));
|
||||
if (rc) {
|
||||
QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
rc = qeth_read_conf_data(card, (void **) &prcd, &length);
|
||||
if (rc) {
|
||||
QETH_DBF_MESSAGE(2, "%s qeth_read_conf_data returned %i\n",
|
||||
dev_name(&card->gdev->dev), rc);
|
||||
QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
|
||||
goto out_offline;
|
||||
}
|
||||
qeth_configure_unitaddr(card, prcd);
|
||||
qeth_configure_blkt_default(card, prcd);
|
||||
kfree(prcd);
|
||||
|
||||
rc = qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd);
|
||||
if (rc)
|
||||
QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
|
||||
|
||||
out_offline:
|
||||
ccw_device_set_offline(CARD_DDEV(card));
|
||||
out:
|
||||
return;
|
||||
}
|
||||
|
||||
static int qeth_core_probe_device(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card;
|
||||
|
|
|
@ -573,13 +573,13 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card,
|
|||
case IPA_RC_L2_DUP_LAYER3_MAC:
|
||||
dev_warn(&card->gdev->dev,
|
||||
"MAC address %pM already exists\n",
|
||||
card->dev->dev_addr);
|
||||
cmd->data.setdelmac.mac);
|
||||
break;
|
||||
case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
|
||||
case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
|
||||
dev_warn(&card->gdev->dev,
|
||||
"MAC address %pM is not authorized\n",
|
||||
card->dev->dev_addr);
|
||||
cmd->data.setdelmac.mac);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -60,7 +60,7 @@ static struct iucv_handler smsg_handler = {
|
|||
static int smsg_path_pending(struct iucv_path *path, u8 ipvmid[8],
|
||||
u8 ipuser[16])
|
||||
{
|
||||
if (strncmp(ipvmid, "*MSG ", sizeof(ipvmid)) != 0)
|
||||
if (strncmp(ipvmid, "*MSG ", 8) != 0)
|
||||
return -EINVAL;
|
||||
/* Path pending from *MSG. */
|
||||
return iucv_path_accept(path, &smsg_handler, "SMSGIUCV ", NULL);
|
||||
|
|
|
@ -128,8 +128,7 @@ static void handle_tx(struct vhost_net *net)
|
|||
size_t hdr_size;
|
||||
struct socket *sock;
|
||||
|
||||
/* TODO: check that we are running from vhost_worker?
|
||||
* Not sure it's worth it, it's straight-forward enough. */
|
||||
/* TODO: check that we are running from vhost_worker? */
|
||||
sock = rcu_dereference_check(vq->private_data, 1);
|
||||
if (!sock)
|
||||
return;
|
||||
|
@ -306,7 +305,8 @@ static void handle_rx_big(struct vhost_net *net)
|
|||
size_t len, total_len = 0;
|
||||
int err;
|
||||
size_t hdr_size;
|
||||
struct socket *sock = rcu_dereference(vq->private_data);
|
||||
/* TODO: check that we are running from vhost_worker? */
|
||||
struct socket *sock = rcu_dereference_check(vq->private_data, 1);
|
||||
if (!sock || skb_queue_empty(&sock->sk->sk_receive_queue))
|
||||
return;
|
||||
|
||||
|
@ -415,7 +415,8 @@ static void handle_rx_mergeable(struct vhost_net *net)
|
|||
int err, headcount;
|
||||
size_t vhost_hlen, sock_hlen;
|
||||
size_t vhost_len, sock_len;
|
||||
struct socket *sock = rcu_dereference(vq->private_data);
|
||||
/* TODO: check that we are running from vhost_worker? */
|
||||
struct socket *sock = rcu_dereference_check(vq->private_data, 1);
|
||||
if (!sock || skb_queue_empty(&sock->sk->sk_receive_queue))
|
||||
return;
|
||||
|
||||
|
|
|
@ -173,9 +173,9 @@ static inline int vhost_has_feature(struct vhost_dev *dev, int bit)
|
|||
{
|
||||
unsigned acked_features;
|
||||
|
||||
acked_features =
|
||||
rcu_dereference_index_check(dev->acked_features,
|
||||
lockdep_is_held(&dev->mutex));
|
||||
/* TODO: check that we are running from vhost_worker or dev mutex is
|
||||
* held? */
|
||||
acked_features = rcu_dereference_index_check(dev->acked_features, 1);
|
||||
return acked_features & (1 << bit);
|
||||
}
|
||||
|
||||
|
|
|
@ -136,6 +136,7 @@ extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, unsigned int
|
|||
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||
extern int ip6_mr_input(struct sk_buff *skb);
|
||||
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||
extern int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
|
||||
extern int ip6_mr_init(void);
|
||||
extern void ip6_mr_cleanup(void);
|
||||
#else
|
||||
|
|
|
@ -195,7 +195,8 @@ static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
|
|||
*/
|
||||
static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
|
||||
{
|
||||
nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
|
||||
if (hdr)
|
||||
nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -85,9 +85,6 @@ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
|
|||
if (e == NULL)
|
||||
return;
|
||||
|
||||
if (!(e->ctmask & (1 << event)))
|
||||
return;
|
||||
|
||||
set_bit(event, &e->cache);
|
||||
}
|
||||
|
||||
|
|
|
@ -328,12 +328,12 @@ static struct net_bridge_fdb_entry *fdb_create(struct hlist_head *head,
|
|||
fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC);
|
||||
if (fdb) {
|
||||
memcpy(fdb->addr.addr, addr, ETH_ALEN);
|
||||
hlist_add_head_rcu(&fdb->hlist, head);
|
||||
|
||||
fdb->dst = source;
|
||||
fdb->is_local = is_local;
|
||||
fdb->is_static = is_local;
|
||||
fdb->ageing_timer = jiffies;
|
||||
|
||||
hlist_add_head_rcu(&fdb->hlist, head);
|
||||
}
|
||||
return fdb;
|
||||
}
|
||||
|
|
|
@ -2666,7 +2666,8 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
|
|||
|
||||
map = rcu_dereference(rxqueue->rps_map);
|
||||
if (map) {
|
||||
if (map->len == 1) {
|
||||
if (map->len == 1 &&
|
||||
!rcu_dereference_raw(rxqueue->rps_flow_table)) {
|
||||
tcpu = map->cpus[0];
|
||||
if (cpu_online(tcpu))
|
||||
cpu = tcpu;
|
||||
|
@ -3565,6 +3566,7 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
|
|||
skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb));
|
||||
skb->vlan_tci = 0;
|
||||
skb->dev = napi->dev;
|
||||
skb->skb_iif = 0;
|
||||
|
||||
napi->skb = skb;
|
||||
}
|
||||
|
|
|
@ -1444,9 +1444,19 @@ struct compat_sioc_sg_req {
|
|||
compat_ulong_t wrong_if;
|
||||
};
|
||||
|
||||
struct compat_sioc_vif_req {
|
||||
vifi_t vifi; /* Which iface */
|
||||
compat_ulong_t icount;
|
||||
compat_ulong_t ocount;
|
||||
compat_ulong_t ibytes;
|
||||
compat_ulong_t obytes;
|
||||
};
|
||||
|
||||
int ipmr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
|
||||
{
|
||||
struct sioc_sg_req sr;
|
||||
struct compat_sioc_sg_req sr;
|
||||
struct compat_sioc_vif_req vr;
|
||||
struct vif_device *vif;
|
||||
struct mfc_cache *c;
|
||||
struct net *net = sock_net(sk);
|
||||
struct mr_table *mrt;
|
||||
|
@ -1456,6 +1466,26 @@ int ipmr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
|
|||
return -ENOENT;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCGETVIFCNT:
|
||||
if (copy_from_user(&vr, arg, sizeof(vr)))
|
||||
return -EFAULT;
|
||||
if (vr.vifi >= mrt->maxvif)
|
||||
return -EINVAL;
|
||||
read_lock(&mrt_lock);
|
||||
vif = &mrt->vif_table[vr.vifi];
|
||||
if (VIF_EXISTS(mrt, vr.vifi)) {
|
||||
vr.icount = vif->pkt_in;
|
||||
vr.ocount = vif->pkt_out;
|
||||
vr.ibytes = vif->bytes_in;
|
||||
vr.obytes = vif->bytes_out;
|
||||
read_unlock(&mrt_lock);
|
||||
|
||||
if (copy_to_user(arg, &vr, sizeof(vr)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
read_unlock(&mrt_lock);
|
||||
return -EADDRNOTAVAIL;
|
||||
case SIOCGETSGCNT:
|
||||
if (copy_from_user(&sr, arg, sizeof(sr)))
|
||||
return -EFAULT;
|
||||
|
|
|
@ -60,12 +60,12 @@ static int checkentry(const struct xt_tgchk_param *par)
|
|||
|
||||
if (mangle->flags & ~ARPT_MANGLE_MASK ||
|
||||
!(mangle->flags & ARPT_MANGLE_MASK))
|
||||
return false;
|
||||
return -EINVAL;
|
||||
|
||||
if (mangle->target != NF_DROP && mangle->target != NF_ACCEPT &&
|
||||
mangle->target != XT_CONTINUE)
|
||||
return false;
|
||||
return true;
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_target arpt_mangle_reg __read_mostly = {
|
||||
|
|
|
@ -2773,6 +2773,11 @@ static struct dst_entry *ipv4_blackhole_dst_check(struct dst_entry *dst, u32 coo
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static unsigned int ipv4_blackhole_default_mtu(const struct dst_entry *dst)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
{
|
||||
}
|
||||
|
@ -2782,6 +2787,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
|
|||
.protocol = cpu_to_be16(ETH_P_IP),
|
||||
.destroy = ipv4_dst_destroy,
|
||||
.check = ipv4_blackhole_dst_check,
|
||||
.default_mtu = ipv4_blackhole_default_mtu,
|
||||
.update_pmtu = ipv4_rt_blackhole_update_pmtu,
|
||||
};
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/compat.h>
|
||||
#include <net/protocol.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/sock.h>
|
||||
|
@ -1804,6 +1805,80 @@ int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
struct compat_sioc_sg_req6 {
|
||||
struct sockaddr_in6 src;
|
||||
struct sockaddr_in6 grp;
|
||||
compat_ulong_t pktcnt;
|
||||
compat_ulong_t bytecnt;
|
||||
compat_ulong_t wrong_if;
|
||||
};
|
||||
|
||||
struct compat_sioc_mif_req6 {
|
||||
mifi_t mifi;
|
||||
compat_ulong_t icount;
|
||||
compat_ulong_t ocount;
|
||||
compat_ulong_t ibytes;
|
||||
compat_ulong_t obytes;
|
||||
};
|
||||
|
||||
int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
|
||||
{
|
||||
struct compat_sioc_sg_req6 sr;
|
||||
struct compat_sioc_mif_req6 vr;
|
||||
struct mif_device *vif;
|
||||
struct mfc6_cache *c;
|
||||
struct net *net = sock_net(sk);
|
||||
struct mr6_table *mrt;
|
||||
|
||||
mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
|
||||
if (mrt == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCGETMIFCNT_IN6:
|
||||
if (copy_from_user(&vr, arg, sizeof(vr)))
|
||||
return -EFAULT;
|
||||
if (vr.mifi >= mrt->maxvif)
|
||||
return -EINVAL;
|
||||
read_lock(&mrt_lock);
|
||||
vif = &mrt->vif6_table[vr.mifi];
|
||||
if (MIF_EXISTS(mrt, vr.mifi)) {
|
||||
vr.icount = vif->pkt_in;
|
||||
vr.ocount = vif->pkt_out;
|
||||
vr.ibytes = vif->bytes_in;
|
||||
vr.obytes = vif->bytes_out;
|
||||
read_unlock(&mrt_lock);
|
||||
|
||||
if (copy_to_user(arg, &vr, sizeof(vr)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
read_unlock(&mrt_lock);
|
||||
return -EADDRNOTAVAIL;
|
||||
case SIOCGETSGCNT_IN6:
|
||||
if (copy_from_user(&sr, arg, sizeof(sr)))
|
||||
return -EFAULT;
|
||||
|
||||
read_lock(&mrt_lock);
|
||||
c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr);
|
||||
if (c) {
|
||||
sr.pktcnt = c->mfc_un.res.pkt;
|
||||
sr.bytecnt = c->mfc_un.res.bytes;
|
||||
sr.wrong_if = c->mfc_un.res.wrong_if;
|
||||
read_unlock(&mrt_lock);
|
||||
|
||||
if (copy_to_user(arg, &sr, sizeof(sr)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
read_unlock(&mrt_lock);
|
||||
return -EADDRNOTAVAIL;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int ip6mr_forward2_finish(struct sk_buff *skb)
|
||||
{
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter_ipv6.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/compat.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
|
@ -1157,6 +1158,23 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static int compat_rawv6_ioctl(struct sock *sk, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case SIOCOUTQ:
|
||||
case SIOCINQ:
|
||||
return -ENOIOCTLCMD;
|
||||
default:
|
||||
#ifdef CONFIG_IPV6_MROUTE
|
||||
return ip6mr_compat_ioctl(sk, cmd, compat_ptr(arg));
|
||||
#else
|
||||
return -ENOIOCTLCMD;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void rawv6_close(struct sock *sk, long timeout)
|
||||
{
|
||||
if (inet_sk(sk)->inet_num == IPPROTO_RAW)
|
||||
|
@ -1215,6 +1233,7 @@ struct proto rawv6_prot = {
|
|||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_rawv6_setsockopt,
|
||||
.compat_getsockopt = compat_rawv6_getsockopt,
|
||||
.compat_ioctl = compat_rawv6_ioctl,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -144,6 +144,11 @@ static struct dst_ops ip6_dst_ops_template = {
|
|||
.local_out = __ip6_local_out,
|
||||
};
|
||||
|
||||
static unsigned int ip6_blackhole_default_mtu(const struct dst_entry *dst)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
{
|
||||
}
|
||||
|
@ -153,6 +158,7 @@ static struct dst_ops ip6_dst_blackhole_ops = {
|
|||
.protocol = cpu_to_be16(ETH_P_IPV6),
|
||||
.destroy = ip6_dst_destroy,
|
||||
.check = ip6_dst_check,
|
||||
.default_mtu = ip6_blackhole_default_mtu,
|
||||
.update_pmtu = ip6_rt_blackhole_update_pmtu,
|
||||
};
|
||||
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
#include <net/addrconf.h>
|
||||
#include <net/inet_frag.h>
|
||||
|
||||
static struct ctl_table empty[1];
|
||||
|
||||
static ctl_table ipv6_table_template[] = {
|
||||
{
|
||||
.procname = "route",
|
||||
|
@ -35,6 +37,12 @@ static ctl_table ipv6_table_template[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec
|
||||
},
|
||||
{
|
||||
.procname = "neigh",
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = empty,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -152,7 +160,6 @@ static struct ctl_table_header *ip6_base;
|
|||
|
||||
int ipv6_static_sysctl_register(void)
|
||||
{
|
||||
static struct ctl_table empty[1];
|
||||
ip6_base = register_sysctl_paths(net_ipv6_ctl_path, empty);
|
||||
if (ip6_base == NULL)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -63,6 +63,9 @@ void nf_ct_deliver_cached_events(struct nf_conn *ct)
|
|||
* this does not harm and it happens very rarely. */
|
||||
unsigned long missed = e->missed;
|
||||
|
||||
if (!((events | missed) & e->ctmask))
|
||||
goto out_unlock;
|
||||
|
||||
ret = notify->fcn(events | missed, &item);
|
||||
if (unlikely(ret < 0 || missed)) {
|
||||
spin_lock_bh(&ct->lock);
|
||||
|
|
|
@ -710,6 +710,7 @@ restart:
|
|||
if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid,
|
||||
cb->nlh->nlmsg_seq,
|
||||
IPCTNL_MSG_CT_NEW, ct) < 0) {
|
||||
nf_conntrack_get(&ct->ct_general);
|
||||
cb->args[1] = (unsigned long)ct;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -53,15 +53,13 @@ iprange_mt4(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
}
|
||||
|
||||
static inline int
|
||||
iprange_ipv6_sub(const struct in6_addr *a, const struct in6_addr *b)
|
||||
iprange_ipv6_lt(const struct in6_addr *a, const struct in6_addr *b)
|
||||
{
|
||||
unsigned int i;
|
||||
int r;
|
||||
|
||||
for (i = 0; i < 4; ++i) {
|
||||
r = ntohl(a->s6_addr32[i]) - ntohl(b->s6_addr32[i]);
|
||||
if (r != 0)
|
||||
return r;
|
||||
if (a->s6_addr32[i] != b->s6_addr32[i])
|
||||
return ntohl(a->s6_addr32[i]) < ntohl(b->s6_addr32[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -75,8 +73,8 @@ iprange_mt6(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
bool m;
|
||||
|
||||
if (info->flags & IPRANGE_SRC) {
|
||||
m = iprange_ipv6_sub(&iph->saddr, &info->src_min.in6) < 0;
|
||||
m |= iprange_ipv6_sub(&iph->saddr, &info->src_max.in6) > 0;
|
||||
m = iprange_ipv6_lt(&iph->saddr, &info->src_min.in6);
|
||||
m |= iprange_ipv6_lt(&info->src_max.in6, &iph->saddr);
|
||||
m ^= !!(info->flags & IPRANGE_SRC_INV);
|
||||
if (m) {
|
||||
pr_debug("src IP %pI6 NOT in range %s%pI6-%pI6\n",
|
||||
|
@ -88,8 +86,8 @@ iprange_mt6(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
}
|
||||
}
|
||||
if (info->flags & IPRANGE_DST) {
|
||||
m = iprange_ipv6_sub(&iph->daddr, &info->dst_min.in6) < 0;
|
||||
m |= iprange_ipv6_sub(&iph->daddr, &info->dst_max.in6) > 0;
|
||||
m = iprange_ipv6_lt(&iph->daddr, &info->dst_min.in6);
|
||||
m |= iprange_ipv6_lt(&info->dst_max.in6, &iph->daddr);
|
||||
m ^= !!(info->flags & IPRANGE_DST_INV);
|
||||
if (m) {
|
||||
pr_debug("dst IP %pI6 NOT in range %s%pI6-%pI6\n",
|
||||
|
|
Загрузка…
Ссылка в новой задаче