diff options
| author | Linus Torvalds <[email protected]> | 2019-06-28 08:24:37 +0800 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2019-06-28 08:24:37 +0800 | 
| commit | c84afab02c311b08b5cb8ea758cc177f81c95d11 (patch) | |
| tree | 6ef80077188ee8ace092e1f740f4712c5a520484 /drivers/net | |
| parent | 249155c20f9b0754bc1b932a33344cfb4e0c2101 (diff) | |
| parent | 89ed5b519004a7706f50b70f611edbd3aaacff2c (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
 1) Fix ppp_mppe crypto soft dependencies, from Takashi Iawi.
 2) Fix TX completion to be finite, from Sergej Benilov.
 3) Use register_pernet_device to avoid a dst leak in tipc, from Xin
    Long.
 4) Double free of TX cleanup in Dirk van der Merwe.
 5) Memory leak in packet_set_ring(), from Eric Dumazet.
 6) Out of bounds read in qmi_wwan, from Bjørn Mork.
 7) Fix iif used in mcast/bcast looped back packets, from Stephen
    Suryaputra.
 8) Fix neighbour resolution on raw ipv6 sockets, from Nicolas Dichtel.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (25 commits)
  af_packet: Block execution of tasks waiting for transmit to complete in AF_PACKET
  sctp: change to hold sk after auth shkey is created successfully
  ipv6: fix neighbour resolution with raw socket
  ipv6: constify rt6_nexthop()
  net: dsa: microchip: Use gpiod_set_value_cansleep()
  net: aquantia: fix vlans not working over bridged network
  ipv4: reset rt_iif for recirculated mcast/bcast out pkts
  team: Always enable vlan tx offload
  net/smc: Fix error path in smc_init
  net/smc: hold conns_lock before calling smc_lgr_register_conn()
  bonding: Always enable vlan tx offload
  net/ipv6: Fix misuse of proc_dointvec "skip_notify_on_dev_down"
  ipv4: Use return value of inet_iif() for __raw_v4_lookup in the while loop
  qmi_wwan: Fix out-of-bounds read
  tipc: check msg->req data len in tipc_nl_compat_bearer_disable
  net: macb: do not copy the mac address if NULL
  net/packet: fix memory leak in packet_set_ring()
  net/tls: fix page double free on TX cleanup
  net/sched: cbs: Fix error path of cbs_module_init
  tipc: change to use register_pernet_device
  ...
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz_common.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_filters.c | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_nic.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 19 | ||||
| -rw-r--r-- | drivers/net/ethernet/cadence/macb_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 28 | ||||
| -rw-r--r-- | drivers/net/ethernet/sis/sis900.c | 16 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 22 | ||||
| -rw-r--r-- | drivers/net/ppp/ppp_mppe.c | 1 | ||||
| -rw-r--r-- | drivers/net/team/team.c | 2 | ||||
| -rw-r--r-- | drivers/net/usb/qmi_wwan.c | 2 | ||||
| -rw-r--r-- | drivers/net/vrf.c | 2 | 
15 files changed, 77 insertions, 39 deletions
| diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 407f4095a37a..799fc38c5c34 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -4320,12 +4320,12 @@ void bond_setup(struct net_device *bond_dev)  	bond_dev->features |= NETIF_F_NETNS_LOCAL;  	bond_dev->hw_features = BOND_VLAN_FEATURES | -				NETIF_F_HW_VLAN_CTAG_TX |  				NETIF_F_HW_VLAN_CTAG_RX |  				NETIF_F_HW_VLAN_CTAG_FILTER;  	bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;  	bond_dev->features |= bond_dev->hw_features; +	bond_dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;  }  /* Destroy a bonding device. diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index f46086fa9064..db91b213eae1 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -436,9 +436,9 @@ int ksz_switch_register(struct ksz_device *dev,  		return PTR_ERR(dev->reset_gpio);  	if (dev->reset_gpio) { -		gpiod_set_value(dev->reset_gpio, 1); +		gpiod_set_value_cansleep(dev->reset_gpio, 1);  		mdelay(10); -		gpiod_set_value(dev->reset_gpio, 0); +		gpiod_set_value_cansleep(dev->reset_gpio, 0);  	}  	mutex_init(&dev->dev_mutex); @@ -487,7 +487,7 @@ void ksz_switch_remove(struct ksz_device *dev)  	dsa_unregister_switch(dev->ds);  	if (dev->reset_gpio) -		gpiod_set_value(dev->reset_gpio, 1); +		gpiod_set_value_cansleep(dev->reset_gpio, 1);  }  EXPORT_SYMBOL(ksz_switch_remove); diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_filters.c b/drivers/net/ethernet/aquantia/atlantic/aq_filters.c index 18bc035da850..1fff462a4175 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_filters.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_filters.c @@ -843,9 +843,14 @@ int aq_filters_vlans_update(struct aq_nic_s *aq_nic)  		return err;  	if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) { -		if (hweight < AQ_VLAN_MAX_FILTERS) -			err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, true); +		if (hweight < AQ_VLAN_MAX_FILTERS && hweight > 0) { +			err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, +				!(aq_nic->packet_filter & IFF_PROMISC)); +			aq_nic->aq_nic_cfg.is_vlan_force_promisc = false; +		} else {  		/* otherwise left in promiscue mode */ +			aq_nic->aq_nic_cfg.is_vlan_force_promisc = true; +		}  	}  	return err; @@ -866,6 +871,7 @@ int aq_filters_vlan_offload_off(struct aq_nic_s *aq_nic)  	if (unlikely(!aq_hw_ops->hw_filter_vlan_ctrl))  		return -EOPNOTSUPP; +	aq_nic->aq_nic_cfg.is_vlan_force_promisc = true;  	err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, false);  	if (err)  		return err; diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 0da5e161ec5d..41172fbebddd 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -126,6 +126,7 @@ void aq_nic_cfg_start(struct aq_nic_s *self)  	cfg->link_speed_msk &= cfg->aq_hw_caps->link_speed_msk;  	cfg->features = cfg->aq_hw_caps->hw_features; +	cfg->is_vlan_force_promisc = true;  }  static int aq_nic_update_link_status(struct aq_nic_s *self) diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h index eb2e3c7c36f9..0f22f5d5691b 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h @@ -35,6 +35,7 @@ struct aq_nic_cfg_s {  	u32 flow_control;  	u32 link_speed_msk;  	u32 wol; +	bool is_vlan_force_promisc;  	u16 is_mc_list_enabled;  	u16 mc_list_count;  	bool is_autoneg; diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c index 1c7593d54035..13ac2661a473 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c @@ -778,8 +778,15 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self,  					  unsigned int packet_filter)  {  	unsigned int i = 0U; +	struct aq_nic_cfg_s *cfg = self->aq_nic_cfg; + +	hw_atl_rpfl2promiscuous_mode_en_set(self, +					    IS_FILTER_ENABLED(IFF_PROMISC)); + +	hw_atl_rpf_vlan_prom_mode_en_set(self, +				     IS_FILTER_ENABLED(IFF_PROMISC) || +				     cfg->is_vlan_force_promisc); -	hw_atl_rpfl2promiscuous_mode_en_set(self, IS_FILTER_ENABLED(IFF_PROMISC));  	hw_atl_rpfl2multicast_flr_en_set(self,  					 IS_FILTER_ENABLED(IFF_ALLMULTI), 0); @@ -788,13 +795,13 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self,  	hw_atl_rpfl2broadcast_en_set(self, IS_FILTER_ENABLED(IFF_BROADCAST)); -	self->aq_nic_cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST); +	cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST);  	for (i = HW_ATL_B0_MAC_MIN; i < HW_ATL_B0_MAC_MAX; ++i)  		hw_atl_rpfl2_uc_flr_en_set(self, -					   (self->aq_nic_cfg->is_mc_list_enabled && -				    (i <= self->aq_nic_cfg->mc_list_count)) ? -				    1U : 0U, i); +					   (cfg->is_mc_list_enabled && +					    (i <= cfg->mc_list_count)) ? +					   1U : 0U, i);  	return aq_hw_err_from_flags(self);  } @@ -1086,7 +1093,7 @@ static int hw_atl_b0_hw_vlan_set(struct aq_hw_s *self,  static int hw_atl_b0_hw_vlan_ctrl(struct aq_hw_s *self, bool enable)  {  	/* set promisc in case of disabing the vland filter */ -	hw_atl_rpf_vlan_prom_mode_en_set(self, !!!enable); +	hw_atl_rpf_vlan_prom_mode_en_set(self, !enable);  	return aq_hw_err_from_flags(self);  } diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index 2375a13bb446..262a28ff81fc 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -4180,7 +4180,7 @@ static int macb_probe(struct platform_device *pdev)  	if (PTR_ERR(mac) == -EPROBE_DEFER) {  		err = -EPROBE_DEFER;  		goto err_out_free_netdev; -	} else if (!IS_ERR(mac)) { +	} else if (!IS_ERR_OR_NULL(mac)) {  		ether_addr_copy(bp->dev->dev_addr, mac);  	} else {  		macb_get_hwaddr(bp); diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c index 8a6785173228..492f8769ac12 100644 --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c @@ -891,7 +891,7 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,  			 u64 *data)  {  	struct be_adapter *adapter = netdev_priv(netdev); -	int status; +	int status, cnt;  	u8 link_status = 0;  	if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) { @@ -902,6 +902,9 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,  	memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM); +	/* check link status before offline tests */ +	link_status = netif_carrier_ok(netdev); +  	if (test->flags & ETH_TEST_FL_OFFLINE) {  		if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0)  			test->flags |= ETH_TEST_FL_FAILED; @@ -922,13 +925,26 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test,  		test->flags |= ETH_TEST_FL_FAILED;  	} -	status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); -	if (status) { -		test->flags |= ETH_TEST_FL_FAILED; -		data[4] = -1; -	} else if (!link_status) { +	/* link status was down prior to test */ +	if (!link_status) {  		test->flags |= ETH_TEST_FL_FAILED;  		data[4] = 1; +		return; +	} + +	for (cnt = 10; cnt; cnt--) { +		status = be_cmd_link_status_query(adapter, NULL, &link_status, +						  0); +		if (status) { +			test->flags |= ETH_TEST_FL_FAILED; +			data[4] = -1; +			break; +		} + +		if (link_status) +			break; + +		msleep_interruptible(500);  	}  } diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c index 67f9bb6e941b..9b036c857b1d 100644 --- a/drivers/net/ethernet/sis/sis900.c +++ b/drivers/net/ethernet/sis/sis900.c @@ -1057,7 +1057,7 @@ sis900_open(struct net_device *net_dev)  	sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);  	/* Enable all known interrupts by setting the interrupt mask. */ -	sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); +	sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC);  	sw32(cr, RxENA | sr32(cr));  	sw32(ier, IE); @@ -1578,7 +1578,7 @@ static void sis900_tx_timeout(struct net_device *net_dev)  	sw32(txdp, sis_priv->tx_ring_dma);  	/* Enable all known interrupts by setting the interrupt mask. */ -	sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); +	sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC);  }  /** @@ -1618,7 +1618,7 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)  			spin_unlock_irqrestore(&sis_priv->lock, flags);  			return NETDEV_TX_OK;  	} -	sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len); +	sis_priv->tx_ring[entry].cmdsts = (OWN | INTR | skb->len);  	sw32(cr, TxENA | sr32(cr));  	sis_priv->cur_tx ++; @@ -1674,7 +1674,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)  	do {  		status = sr32(isr); -		if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) +		if ((status & (HIBERR|TxURN|TxERR|TxIDLE|TxDESC|RxORN|RxERR|RxOK)) == 0)  			/* nothing intresting happened */  			break;  		handled = 1; @@ -1684,7 +1684,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance)  			/* Rx interrupt */  			sis900_rx(net_dev); -		if (status & (TxURN | TxERR | TxIDLE)) +		if (status & (TxURN | TxERR | TxIDLE | TxDESC))  			/* Tx interrupt */  			sis900_finish_xmit(net_dev); @@ -1896,8 +1896,8 @@ static void sis900_finish_xmit (struct net_device *net_dev)  		if (tx_status & OWN) {  			/* The packet is not transmitted yet (owned by hardware) ! -			 * Note: the interrupt is generated only when Tx Machine -			 * is idle, so this is an almost impossible case */ +			 * Note: this is an almost impossible condition +			 * in case of TxDESC ('descriptor interrupt') */  			break;  		} @@ -2473,7 +2473,7 @@ static int sis900_resume(struct pci_dev *pci_dev)  	sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);  	/* Enable all known interrupts by setting the interrupt mask. */ -	sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); +	sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC);  	sw32(cr, RxENA | sr32(cr));  	sw32(ier, IE); diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c index 2dcdf761d525..020159622559 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c @@ -112,7 +112,7 @@ static int adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,  		 * programmed with (2^32 – <new_sec_value>)  		 */  		if (gmac4) -			sec = (100000000ULL - sec); +			sec = -sec;  		value = readl(ioaddr + PTP_TCR);  		if (value & PTP_TCR_TSCTRLSSR) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 06dd51f47cfd..06358fe5b245 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -2947,12 +2947,15 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)  	/* Manage tx mitigation */  	tx_q->tx_count_frames += nfrags + 1; -	if (priv->tx_coal_frames <= tx_q->tx_count_frames) { +	if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) && +	    !(priv->synopsys_id >= DWMAC_CORE_4_00 && +	    (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && +	    priv->hwts_tx_en)) { +		stmmac_tx_timer_arm(priv, queue); +	} else { +		tx_q->tx_count_frames = 0;  		stmmac_set_tx_ic(priv, desc);  		priv->xstats.tx_set_ic_bit++; -		tx_q->tx_count_frames = 0; -	} else { -		stmmac_tx_timer_arm(priv, queue);  	}  	skb_tx_timestamp(skb); @@ -3166,12 +3169,15 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)  	 * element in case of no SG.  	 */  	tx_q->tx_count_frames += nfrags + 1; -	if (priv->tx_coal_frames <= tx_q->tx_count_frames) { +	if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) && +	    !(priv->synopsys_id >= DWMAC_CORE_4_00 && +	    (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && +	    priv->hwts_tx_en)) { +		stmmac_tx_timer_arm(priv, queue); +	} else { +		tx_q->tx_count_frames = 0;  		stmmac_set_tx_ic(priv, desc);  		priv->xstats.tx_set_ic_bit++; -		tx_q->tx_count_frames = 0; -	} else { -		stmmac_tx_timer_arm(priv, queue);  	}  	skb_tx_timestamp(skb); diff --git a/drivers/net/ppp/ppp_mppe.c b/drivers/net/ppp/ppp_mppe.c index ff61dd8748de..66c8e65f6872 100644 --- a/drivers/net/ppp/ppp_mppe.c +++ b/drivers/net/ppp/ppp_mppe.c @@ -63,6 +63,7 @@ MODULE_AUTHOR("Frank Cusack <[email protected]>");  MODULE_DESCRIPTION("Point-to-Point Protocol Microsoft Point-to-Point Encryption support");  MODULE_LICENSE("Dual BSD/GPL");  MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE)); +MODULE_SOFTDEP("pre: arc4");  MODULE_VERSION("1.0.2");  static unsigned int diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index b48006e7fa2f..36916bf51ee6 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -2128,12 +2128,12 @@ static void team_setup(struct net_device *dev)  	dev->features |= NETIF_F_NETNS_LOCAL;  	dev->hw_features = TEAM_VLAN_FEATURES | -			   NETIF_F_HW_VLAN_CTAG_TX |  			   NETIF_F_HW_VLAN_CTAG_RX |  			   NETIF_F_HW_VLAN_CTAG_FILTER;  	dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4;  	dev->features |= dev->hw_features; +	dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;  }  static int team_newlink(struct net *src_net, struct net_device *dev, diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index d080f8048e52..8b4ad10cf940 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -1482,7 +1482,7 @@ static int qmi_wwan_probe(struct usb_interface *intf,  	 * different. Ignore the current interface if the number of endpoints  	 * equals the number for the diag interface (two).  	 */ -	info = (void *)&id->driver_info; +	info = (void *)id->driver_info;  	if (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) {  		if (desc->bNumEndpoints == 2) diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 11b9525dff27..311b0cc6eb98 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -350,8 +350,8 @@ static int vrf_finish_output6(struct net *net, struct sock *sk,  {  	struct dst_entry *dst = skb_dst(skb);  	struct net_device *dev = dst->dev; +	const struct in6_addr *nexthop;  	struct neighbour *neigh; -	struct in6_addr *nexthop;  	int ret;  	nf_reset(skb); |