Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/tg3.c
This commit is contained in:
commit
7143b7d412
28 changed files with 170 additions and 66 deletions
|
@ -6551,7 +6551,7 @@ S: Maintained
|
|||
F: drivers/usb/host/uhci*
|
||||
|
||||
USB "USBNET" DRIVER FRAMEWORK
|
||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||
M: Oliver Neukum <oneukum@suse.de>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.linux-usb.org/usbnet
|
||||
S: Maintained
|
||||
|
|
|
@ -106,7 +106,7 @@ MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "M
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
||||
module_param_array(speed_duplex, int, NULL, 0);
|
||||
MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotitate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex");
|
||||
MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotiate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex");
|
||||
module_param_array(coalesce, bool, NULL, 0);
|
||||
MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable");
|
||||
module_param_array(dynamic_ipg, bool, NULL, 0);
|
||||
|
|
|
@ -8357,6 +8357,8 @@ bnx2_remove_one(struct pci_dev *pdev)
|
|||
|
||||
unregister_netdev(dev);
|
||||
|
||||
del_timer_sync(&bp->timer);
|
||||
|
||||
if (bp->mips_firmware)
|
||||
release_firmware(bp->mips_firmware);
|
||||
if (bp->rv2p_firmware)
|
||||
|
|
|
@ -346,10 +346,10 @@ static void sja1000_rx(struct net_device *dev)
|
|||
| (priv->read_reg(priv, REG_ID2) >> 5);
|
||||
}
|
||||
|
||||
cf->can_dlc = get_can_dlc(fi & 0x0F);
|
||||
if (fi & FI_RTR) {
|
||||
id |= CAN_RTR_FLAG;
|
||||
} else {
|
||||
cf->can_dlc = get_can_dlc(fi & 0x0F);
|
||||
for (i = 0; i < cf->can_dlc; i++)
|
||||
cf->data[i] = priv->read_reg(priv, dreg++);
|
||||
}
|
||||
|
|
|
@ -139,11 +139,11 @@ static int ftmac100_reset(struct ftmac100 *priv)
|
|||
* that hardware reset completed (what the f*ck).
|
||||
* We still need to wait for a while.
|
||||
*/
|
||||
usleep_range(500, 1000);
|
||||
udelay(500);
|
||||
return 0;
|
||||
}
|
||||
|
||||
usleep_range(1000, 10000);
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
netdev_err(netdev, "software reset failed\n");
|
||||
|
@ -772,7 +772,7 @@ static int ftmac100_mdio_read(struct net_device *netdev, int phy_id, int reg)
|
|||
if ((phycr & FTMAC100_PHYCR_MIIRD) == 0)
|
||||
return phycr & FTMAC100_PHYCR_MIIRDATA;
|
||||
|
||||
usleep_range(100, 1000);
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
netdev_err(netdev, "mdio read timed out\n");
|
||||
|
@ -801,7 +801,7 @@ static void ftmac100_mdio_write(struct net_device *netdev, int phy_id, int reg,
|
|||
if ((phycr & FTMAC100_PHYCR_MIIWR) == 0)
|
||||
return;
|
||||
|
||||
usleep_range(100, 1000);
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
netdev_err(netdev, "mdio write timed out\n");
|
||||
|
|
|
@ -49,6 +49,10 @@ static u32 mii_get_an(struct mii_if_info *mii, u16 addr)
|
|||
result |= ADVERTISED_100baseT_Half;
|
||||
if (advert & ADVERTISE_100FULL)
|
||||
result |= ADVERTISED_100baseT_Full;
|
||||
if (advert & ADVERTISE_PAUSE_CAP)
|
||||
result |= ADVERTISED_Pause;
|
||||
if (advert & ADVERTISE_PAUSE_ASYM)
|
||||
result |= ADVERTISED_Asym_Pause;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -12747,8 +12747,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
|||
if (val & VCPU_CFGSHDW_ASPM_DBNC)
|
||||
tg3_flag_set(tp, ASPM_WORKAROUND);
|
||||
if ((val & VCPU_CFGSHDW_WOL_ENABLE) &&
|
||||
(val & VCPU_CFGSHDW_WOL_MAGPKT))
|
||||
(val & VCPU_CFGSHDW_WOL_MAGPKT)) {
|
||||
tg3_flag_set(tp, WOL_ENABLE);
|
||||
device_set_wakeup_enable(&tp->pdev->dev, true);
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -12881,8 +12883,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
|||
tg3_flag_clear(tp, WOL_CAP);
|
||||
|
||||
if (tg3_flag(tp, WOL_CAP) &&
|
||||
(nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE))
|
||||
(nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) {
|
||||
tg3_flag_set(tp, WOL_ENABLE);
|
||||
device_set_wakeup_enable(&tp->pdev->dev, true);
|
||||
}
|
||||
|
||||
if (cfg2 & (1 << 17))
|
||||
tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING;
|
||||
|
|
|
@ -460,7 +460,7 @@ static const struct driver_info cdc_info = {
|
|||
.manage_power = cdc_manage_power,
|
||||
};
|
||||
|
||||
static const struct driver_info mbm_info = {
|
||||
static const struct driver_info wwan_info = {
|
||||
.description = "Mobile Broadband Network Device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = usbnet_cdc_bind,
|
||||
|
@ -471,6 +471,7 @@ static const struct driver_info mbm_info = {
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#define HUAWEI_VENDOR_ID 0x12D1
|
||||
|
||||
static const struct usb_device_id products [] = {
|
||||
/*
|
||||
|
@ -587,8 +588,17 @@ static const struct usb_device_id products [] = {
|
|||
}, {
|
||||
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
|
||||
USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&mbm_info,
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
|
||||
}, {
|
||||
/* Various Huawei modems with a network port like the UMG1831 */
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = HUAWEI_VENDOR_ID,
|
||||
.bInterfaceClass = USB_CLASS_COMM,
|
||||
.bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET,
|
||||
.bInterfaceProtocol = 255,
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
},
|
||||
{ }, // END
|
||||
};
|
||||
|
|
|
@ -690,7 +690,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev)
|
|||
msleep(10);
|
||||
bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR);
|
||||
timeout++;
|
||||
} while ((bmcr & MII_BMCR) && (timeout < 100));
|
||||
} while ((bmcr & BMCR_RESET) && (timeout < 100));
|
||||
|
||||
if (timeout >= 100) {
|
||||
netdev_warn(dev->net, "timeout on PHY Reset");
|
||||
|
|
|
@ -645,6 +645,7 @@ int usbnet_stop (struct net_device *net)
|
|||
struct driver_info *info = dev->driver_info;
|
||||
int retval;
|
||||
|
||||
clear_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||
netif_stop_queue (net);
|
||||
|
||||
netif_info(dev, ifdown, dev->net,
|
||||
|
@ -736,6 +737,7 @@ int usbnet_open (struct net_device *net)
|
|||
}
|
||||
}
|
||||
|
||||
set_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||
netif_start_queue (net);
|
||||
netif_info(dev, ifup, dev->net,
|
||||
"open: enable queueing (rx %d, tx %d) mtu %d %s framing\n",
|
||||
|
@ -1259,6 +1261,9 @@ void usbnet_disconnect (struct usb_interface *intf)
|
|||
if (dev->driver_info->unbind)
|
||||
dev->driver_info->unbind (dev, intf);
|
||||
|
||||
usb_kill_urb(dev->interrupt);
|
||||
usb_free_urb(dev->interrupt);
|
||||
|
||||
free_netdev(net);
|
||||
usb_put_dev (xdev);
|
||||
}
|
||||
|
@ -1498,6 +1503,10 @@ int usbnet_resume (struct usb_interface *intf)
|
|||
int retval;
|
||||
|
||||
if (!--dev->suspend_count) {
|
||||
/* resume interrupt URBs */
|
||||
if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags))
|
||||
usb_submit_urb(dev->interrupt, GFP_NOIO);
|
||||
|
||||
spin_lock_irq(&dev->txq.lock);
|
||||
while ((res = usb_get_from_anchor(&dev->deferred))) {
|
||||
|
||||
|
@ -1516,9 +1525,12 @@ int usbnet_resume (struct usb_interface *intf)
|
|||
smp_mb();
|
||||
clear_bit(EVENT_DEV_ASLEEP, &dev->flags);
|
||||
spin_unlock_irq(&dev->txq.lock);
|
||||
if (!(dev->txq.qlen >= TX_QLEN(dev)))
|
||||
netif_start_queue(dev->net);
|
||||
tasklet_schedule (&dev->bh);
|
||||
|
||||
if (test_bit(EVENT_DEV_OPEN, &dev->flags)) {
|
||||
if (!(dev->txq.qlen >= TX_QLEN(dev)))
|
||||
netif_start_queue(dev->net);
|
||||
tasklet_schedule (&dev->bh);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -368,6 +368,17 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
|||
if (tb[IFLA_ADDRESS] == NULL)
|
||||
random_ether_addr(dev->dev_addr);
|
||||
|
||||
if (tb[IFLA_IFNAME])
|
||||
nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ);
|
||||
else
|
||||
snprintf(dev->name, IFNAMSIZ, DRV_NAME "%%d");
|
||||
|
||||
if (strchr(dev->name, '%')) {
|
||||
err = dev_alloc_name(dev, dev->name);
|
||||
if (err < 0)
|
||||
goto err_alloc_name;
|
||||
}
|
||||
|
||||
err = register_netdevice(dev);
|
||||
if (err < 0)
|
||||
goto err_register_dev;
|
||||
|
@ -387,6 +398,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
|||
|
||||
err_register_dev:
|
||||
/* nothing to do */
|
||||
err_alloc_name:
|
||||
err_configure_peer:
|
||||
unregister_netdevice(peer);
|
||||
return err;
|
||||
|
|
|
@ -72,6 +72,7 @@ MODULE_FIRMWARE("b43/ucode11.fw");
|
|||
MODULE_FIRMWARE("b43/ucode13.fw");
|
||||
MODULE_FIRMWARE("b43/ucode14.fw");
|
||||
MODULE_FIRMWARE("b43/ucode15.fw");
|
||||
MODULE_FIRMWARE("b43/ucode16_mimo.fw");
|
||||
MODULE_FIRMWARE("b43/ucode5.fw");
|
||||
MODULE_FIRMWARE("b43/ucode9.fw");
|
||||
|
||||
|
|
|
@ -316,12 +316,18 @@ int iwl4965_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
|
||||
hdr_len = ieee80211_hdrlen(fc);
|
||||
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
/* For management frames use broadcast id to do not break aggregation */
|
||||
if (!ieee80211_is_data(fc))
|
||||
sta_id = ctx->bcast_sta_id;
|
||||
else {
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||
|
|
|
@ -48,8 +48,21 @@ module_param(led_mode, int, S_IRUGO);
|
|||
MODULE_PARM_DESC(led_mode, "0=system default, "
|
||||
"1=On(RF On)/Off(RF Off), 2=blinking");
|
||||
|
||||
/* Throughput OFF time(ms) ON time (ms)
|
||||
* >300 25 25
|
||||
* >200 to 300 40 40
|
||||
* >100 to 200 55 55
|
||||
* >70 to 100 65 65
|
||||
* >50 to 70 75 75
|
||||
* >20 to 50 85 85
|
||||
* >10 to 20 95 95
|
||||
* >5 to 10 110 110
|
||||
* >1 to 5 130 130
|
||||
* >0 to 1 167 167
|
||||
* <=0 SOLID ON
|
||||
*/
|
||||
static const struct ieee80211_tpt_blink iwl_blink[] = {
|
||||
{ .throughput = 0 * 1024 - 1, .blink_time = 334 },
|
||||
{ .throughput = 0, .blink_time = 334 },
|
||||
{ .throughput = 1 * 1024 - 1, .blink_time = 260 },
|
||||
{ .throughput = 5 * 1024 - 1, .blink_time = 220 },
|
||||
{ .throughput = 10 * 1024 - 1, .blink_time = 190 },
|
||||
|
@ -101,6 +114,11 @@ static int iwl_legacy_led_cmd(struct iwl_priv *priv,
|
|||
if (priv->blink_on == on && priv->blink_off == off)
|
||||
return 0;
|
||||
|
||||
if (off == 0) {
|
||||
/* led is SOLID_ON */
|
||||
on = IWL_LED_SOLID;
|
||||
}
|
||||
|
||||
IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n",
|
||||
priv->cfg->base_params->led_compensation);
|
||||
led_cmd.on = iwl_legacy_blink_compensation(priv, on,
|
||||
|
|
|
@ -2992,15 +2992,15 @@ static void iwl4965_bg_txpower_work(struct work_struct *work)
|
|||
struct iwl_priv *priv = container_of(work, struct iwl_priv,
|
||||
txpower_work);
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
/* If a scan happened to start before we got here
|
||||
* then just return; the statistics notification will
|
||||
* kick off another scheduled work to compensate for
|
||||
* any temperature delta we missed here. */
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
|
||||
test_bit(STATUS_SCANNING, &priv->status))
|
||||
return;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
goto out;
|
||||
|
||||
/* Regardless of if we are associated, we must reconfigure the
|
||||
* TX power since frames can be sent on non-radar channels while
|
||||
|
@ -3010,7 +3010,7 @@ static void iwl4965_bg_txpower_work(struct work_struct *work)
|
|||
/* Update last_temperature to keep is_calib_needed from running
|
||||
* when it isn't needed... */
|
||||
priv->last_temperature = priv->temperature;
|
||||
|
||||
out:
|
||||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
|
||||
|
|
|
@ -582,12 +582,17 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
|
||||
hdr_len = ieee80211_hdrlen(fc);
|
||||
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
/* For management frames use broadcast id to do not break aggregation */
|
||||
if (!ieee80211_is_data(fc))
|
||||
sta_id = ctx->bcast_sta_id;
|
||||
else {
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||
|
|
|
@ -68,6 +68,7 @@ struct usbnet {
|
|||
# define EVENT_RX_PAUSED 5
|
||||
# define EVENT_DEV_WAKING 6
|
||||
# define EVENT_DEV_ASLEEP 7
|
||||
# define EVENT_DEV_OPEN 8
|
||||
};
|
||||
|
||||
static inline struct usb_driver *driver_of(struct usb_interface *intf)
|
||||
|
|
|
@ -4783,7 +4783,7 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm
|
|||
* is never reached
|
||||
*/
|
||||
WARN_ON(1);
|
||||
err = -EINVAL;
|
||||
err = -ENOTTY;
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -5051,7 +5051,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
|||
/* Set the per device memory buffer space.
|
||||
* Not applicable in our case */
|
||||
case SIOCSIFLINK:
|
||||
return -EINVAL;
|
||||
return -ENOTTY;
|
||||
|
||||
/*
|
||||
* Unknown or private ioctl.
|
||||
|
@ -5072,7 +5072,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
|||
/* Take care of Wireless Extensions */
|
||||
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
|
||||
return wext_handle_ioctl(net, &ifr, cmd, arg);
|
||||
return -EINVAL;
|
||||
return -ENOTTY;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,12 +41,12 @@ config NET_DSA_MV88E6XXX_NEED_PPU
|
|||
default n
|
||||
|
||||
config NET_DSA_MV88E6131
|
||||
bool "Marvell 88E6095/6095F/6131 ethernet switch chip support"
|
||||
bool "Marvell 88E6085/6095/6095F/6131 ethernet switch chip support"
|
||||
select NET_DSA_MV88E6XXX
|
||||
select NET_DSA_MV88E6XXX_NEED_PPU
|
||||
select NET_DSA_TAG_DSA
|
||||
---help---
|
||||
This enables support for the Marvell 88E6095/6095F/6131
|
||||
This enables support for the Marvell 88E6085/6095/6095F/6131
|
||||
ethernet switch chips.
|
||||
|
||||
config NET_DSA_MV88E6123_61_65
|
||||
|
|
|
@ -207,8 +207,15 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
|
|||
* mode, but do not enable forwarding of unknown unicasts.
|
||||
*/
|
||||
val = 0x0433;
|
||||
if (p == dsa_upstream_port(ds))
|
||||
if (p == dsa_upstream_port(ds)) {
|
||||
val |= 0x0104;
|
||||
/*
|
||||
* On 6085, unknown multicast forward is controlled
|
||||
* here rather than in Port Control 2 register.
|
||||
*/
|
||||
if (ps->id == ID_6085)
|
||||
val |= 0x0008;
|
||||
}
|
||||
if (ds->dsa_port_mask & (1 << p))
|
||||
val |= 0x0100;
|
||||
REG_WRITE(addr, 0x04, val);
|
||||
|
@ -251,10 +258,19 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
|
|||
* If this is the upstream port for this switch, enable
|
||||
* forwarding of unknown multicast addresses.
|
||||
*/
|
||||
val = 0x0080 | dsa_upstream_port(ds);
|
||||
if (p == dsa_upstream_port(ds))
|
||||
val |= 0x0040;
|
||||
REG_WRITE(addr, 0x08, val);
|
||||
if (ps->id == ID_6085)
|
||||
/*
|
||||
* on 6085, bits 3:0 are reserved, bit 6 control ARP
|
||||
* mirroring, and multicast forward is handled in
|
||||
* Port Control register.
|
||||
*/
|
||||
REG_WRITE(addr, 0x08, 0x0080);
|
||||
else {
|
||||
val = 0x0080 | dsa_upstream_port(ds);
|
||||
if (p == dsa_upstream_port(ds))
|
||||
val |= 0x0040;
|
||||
REG_WRITE(addr, 0x08, val);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rate Control: disable ingress rate limiting.
|
||||
|
|
|
@ -1680,7 +1680,7 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf)
|
|||
return;
|
||||
|
||||
cnf->sysctl = NULL;
|
||||
unregister_sysctl_table(t->sysctl_header);
|
||||
unregister_net_sysctl_table(t->sysctl_header);
|
||||
kfree(t->dev_name);
|
||||
kfree(t);
|
||||
}
|
||||
|
|
|
@ -1998,9 +1998,6 @@ struct fib_table *fib_trie_table(u32 id)
|
|||
t = (struct trie *) tb->tb_data;
|
||||
memset(t, 0, sizeof(*t));
|
||||
|
||||
if (id == RT_TABLE_LOCAL)
|
||||
pr_info("IPv4 FIB: Using LC-trie version %s\n", VERSION);
|
||||
|
||||
return tb;
|
||||
}
|
||||
|
||||
|
|
|
@ -223,31 +223,30 @@ static void ip_expire(unsigned long arg)
|
|||
|
||||
if ((qp->q.last_in & INET_FRAG_FIRST_IN) && qp->q.fragments != NULL) {
|
||||
struct sk_buff *head = qp->q.fragments;
|
||||
const struct iphdr *iph;
|
||||
int err;
|
||||
|
||||
rcu_read_lock();
|
||||
head->dev = dev_get_by_index_rcu(net, qp->iif);
|
||||
if (!head->dev)
|
||||
goto out_rcu_unlock;
|
||||
|
||||
/* skb dst is stale, drop it, and perform route lookup again */
|
||||
skb_dst_drop(head);
|
||||
iph = ip_hdr(head);
|
||||
err = ip_route_input_noref(head, iph->daddr, iph->saddr,
|
||||
iph->tos, head->dev);
|
||||
if (err)
|
||||
goto out_rcu_unlock;
|
||||
|
||||
/*
|
||||
* Only search router table for the head fragment,
|
||||
* when defraging timeout at PRE_ROUTING HOOK.
|
||||
* Only an end host needs to send an ICMP
|
||||
* "Fragment Reassembly Timeout" message, per RFC792.
|
||||
*/
|
||||
if (qp->user == IP_DEFRAG_CONNTRACK_IN && !skb_dst(head)) {
|
||||
const struct iphdr *iph = ip_hdr(head);
|
||||
int err = ip_route_input(head, iph->daddr, iph->saddr,
|
||||
iph->tos, head->dev);
|
||||
if (unlikely(err))
|
||||
goto out_rcu_unlock;
|
||||
if (qp->user == IP_DEFRAG_CONNTRACK_IN &&
|
||||
skb_rtable(head)->rt_type != RTN_LOCAL)
|
||||
goto out_rcu_unlock;
|
||||
|
||||
/*
|
||||
* Only an end host needs to send an ICMP
|
||||
* "Fragment Reassembly Timeout" message, per RFC792.
|
||||
*/
|
||||
if (skb_rtable(head)->rt_type != RTN_LOCAL)
|
||||
goto out_rcu_unlock;
|
||||
|
||||
}
|
||||
|
||||
/* Send an ICMP "Fragment Reassembly Timeout" message. */
|
||||
icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
|
||||
|
|
|
@ -4539,7 +4539,7 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p)
|
|||
|
||||
t = p->sysctl;
|
||||
p->sysctl = NULL;
|
||||
unregister_sysctl_table(t->sysctl_header);
|
||||
unregister_net_sysctl_table(t->sysctl_header);
|
||||
kfree(t->dev_name);
|
||||
kfree(t);
|
||||
}
|
||||
|
|
|
@ -371,7 +371,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
|
|||
iv = esp_tmp_iv(aead, tmp, seqhilen);
|
||||
req = esp_tmp_req(aead, iv);
|
||||
asg = esp_req_sg(aead, req);
|
||||
sg = asg + 1;
|
||||
sg = asg + sglists;
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
|
|
|
@ -524,6 +524,8 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *,
|
|||
int, int);
|
||||
static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
|
||||
struct msghdr *, size_t);
|
||||
static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *,
|
||||
struct msghdr *, size_t, int);
|
||||
|
||||
static const struct proto_ops unix_stream_ops = {
|
||||
.family = PF_UNIX,
|
||||
|
@ -583,7 +585,7 @@ static const struct proto_ops unix_seqpacket_ops = {
|
|||
.setsockopt = sock_no_setsockopt,
|
||||
.getsockopt = sock_no_getsockopt,
|
||||
.sendmsg = unix_seqpacket_sendmsg,
|
||||
.recvmsg = unix_dgram_recvmsg,
|
||||
.recvmsg = unix_seqpacket_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
.sendpage = sock_no_sendpage,
|
||||
};
|
||||
|
@ -1699,6 +1701,18 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
|||
return unix_dgram_sendmsg(kiocb, sock, msg, len);
|
||||
}
|
||||
|
||||
static int unix_seqpacket_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t size,
|
||||
int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (sk->sk_state != TCP_ESTABLISHED)
|
||||
return -ENOTCONN;
|
||||
|
||||
return unix_dgram_recvmsg(iocb, sock, msg, size, flags);
|
||||
}
|
||||
|
||||
static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
|
||||
{
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
|
|
|
@ -532,7 +532,7 @@ int xfrm_init_replay(struct xfrm_state *x)
|
|||
|
||||
if (replay_esn) {
|
||||
if (replay_esn->replay_window >
|
||||
replay_esn->bmp_len * sizeof(__u32))
|
||||
replay_esn->bmp_len * sizeof(__u32) * 8)
|
||||
return -EINVAL;
|
||||
|
||||
if ((x->props.flags & XFRM_STATE_ESN) && x->replay_esn)
|
||||
|
|
|
@ -124,6 +124,9 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
|
|||
{
|
||||
struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];
|
||||
|
||||
if ((p->flags & XFRM_STATE_ESN) && !rt)
|
||||
return -EINVAL;
|
||||
|
||||
if (!rt)
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Reference in a new issue