Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Merge networking fixes from David Miller: 1) Revert Johannes Berg's genetlink locking fix, because it causes regressions. Johannes and Pravin Shelar are working on fixing things properly. 2) Do not drop ipv6 ICMP messages without a redirected header option, they are legal. From Duan Jiong. 3) Missing error return propagation in probing of via-ircc driver. From Alexey Khoroshilov. 4) Do not clear out broadcast/multicast/unicast/WOL bits in r8169 when initializing, from Peter Wu. 5) realtek phy driver programs wrong interrupt status bit, from Giuseppe CAVALLARO. 6) Fix statistics regression in AF_PACKET code, from Willem de Bruijn. 7) Bridge code uses wrong bitmap length, from Toshiaki Makita. 8) SFC driver uses wrong indexes to look up MAC filters, from Ben Hutchings. 9) Don't pass stack buffers into usb control operations in hso driver, from Daniel Gimpelevich. 10) Multiple ipv6 fragmentation headers in one packet is illegal and such packets should be dropped, from Hannes Frederic Sowa. 11) When TCP sockets are "repaired" as part of checkpoint/restart, the timestamp field of SKBs need to be refreshed otherwise RTOs can be wildly off. From Andrey Vagin. 12) Fix memcpy args (uses 'address of pointer' instead of 'pointer') in hostp driver. From Dan Carpenter. 13) nl80211hdr_put() doesn't return an ERR_PTR, but some code believes it does. From Dan Carpenter. 14) Fix regression in wireless SME disconnects, from Johannes Berg. 15) Don't use a stack buffer for DMA in zd1201 USB wireless driver, from Jussi Kivilinna. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (33 commits) ipv4: expose IPV4_DEVCONF ipv6: handle Redirect ICMP Message with no Redirected Header option be2net: fix disabling TX in be_close() Revert "genetlink: fix family dump race" hso: Fix stack corruption on some architectures hso: Earlier catch of error condition sfc: Fix lookup of default RX MAC filters when steered using ethtool bridge: Use the correct bit length for bitmap functions in the VLAN code packet: restore packet statistics tp_packets to include drops net: phy: rtl8211: fix interrupt on status link change r8169: remember WOL preferences on driver load via-ircc: don't return zero if via_ircc_open() failed macvtap: Ignore tap features when VNET_HDR is off macvtap: Correctly set tap features when IFF_VNET_HDR is disabled. macvtap: simplify usage of tap_features tcp: set timestamps for restored skb-s bnx2x: set VF DMAE when first function has 0 supported VFs bnx2x: Protect against VFs' ndos when SR-IOV is disabled bnx2x: prevent VF benign attentions bnx2x: Consider DCBX remote error ...
This commit is contained in:
Коммит
41a00f7950
|
@ -1333,6 +1333,8 @@ enum {
|
|||
BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
|
||||
BNX2X_SP_RTNL_VFPF_STORM_RX_MODE,
|
||||
BNX2X_SP_RTNL_HYPERVISOR_VLAN,
|
||||
BNX2X_SP_RTNL_TX_STOP,
|
||||
BNX2X_SP_RTNL_TX_RESUME,
|
||||
};
|
||||
|
||||
struct bnx2x_prev_path_list {
|
||||
|
|
|
@ -30,10 +30,8 @@
|
|||
#include "bnx2x_dcb.h"
|
||||
|
||||
/* forward declarations of dcbx related functions */
|
||||
static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp);
|
||||
static void bnx2x_pfc_set_pfc(struct bnx2x *bp);
|
||||
static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp);
|
||||
static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp);
|
||||
static void bnx2x_dcbx_get_ets_pri_pg_tbl(struct bnx2x *bp,
|
||||
u32 *set_configuration_ets_pg,
|
||||
u32 *pri_pg_tbl);
|
||||
|
@ -425,30 +423,52 @@ static void bnx2x_pfc_set_pfc(struct bnx2x *bp)
|
|||
bnx2x_pfc_clear(bp);
|
||||
}
|
||||
|
||||
static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp)
|
||||
int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp)
|
||||
{
|
||||
struct bnx2x_func_state_params func_params = {NULL};
|
||||
int rc;
|
||||
|
||||
func_params.f_obj = &bp->func_obj;
|
||||
func_params.cmd = BNX2X_F_CMD_TX_STOP;
|
||||
|
||||
__set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
|
||||
__set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
|
||||
|
||||
DP(BNX2X_MSG_DCB, "STOP TRAFFIC\n");
|
||||
return bnx2x_func_state_change(bp, &func_params);
|
||||
|
||||
rc = bnx2x_func_state_change(bp, &func_params);
|
||||
if (rc) {
|
||||
BNX2X_ERR("Unable to hold traffic for HW configuration\n");
|
||||
bnx2x_panic();
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
|
||||
int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
|
||||
{
|
||||
struct bnx2x_func_state_params func_params = {NULL};
|
||||
struct bnx2x_func_tx_start_params *tx_params =
|
||||
&func_params.params.tx_start;
|
||||
int rc;
|
||||
|
||||
func_params.f_obj = &bp->func_obj;
|
||||
func_params.cmd = BNX2X_F_CMD_TX_START;
|
||||
|
||||
__set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
|
||||
__set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
|
||||
|
||||
bnx2x_dcbx_fw_struct(bp, tx_params);
|
||||
|
||||
DP(BNX2X_MSG_DCB, "START TRAFFIC\n");
|
||||
return bnx2x_func_state_change(bp, &func_params);
|
||||
|
||||
rc = bnx2x_func_state_change(bp, &func_params);
|
||||
if (rc) {
|
||||
BNX2X_ERR("Unable to resume traffic after HW configuration\n");
|
||||
bnx2x_panic();
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void bnx2x_dcbx_2cos_limit_update_ets_config(struct bnx2x *bp)
|
||||
|
@ -744,7 +764,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
|||
if (IS_MF(bp))
|
||||
bnx2x_link_sync_notify(bp);
|
||||
|
||||
bnx2x_dcbx_stop_hw_tx(bp);
|
||||
set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state);
|
||||
|
||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -757,7 +779,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
|||
/* ets may affect cmng configuration: reinit it in hw */
|
||||
bnx2x_set_local_cmng(bp);
|
||||
|
||||
bnx2x_dcbx_resume_hw_tx(bp);
|
||||
set_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state);
|
||||
|
||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
||||
|
||||
return;
|
||||
case BNX2X_DCBX_STATE_TX_RELEASED:
|
||||
|
@ -2367,21 +2391,24 @@ static u8 bnx2x_dcbnl_get_featcfg(struct net_device *netdev, int featid,
|
|||
case DCB_FEATCFG_ATTR_PG:
|
||||
if (bp->dcbx_local_feat.ets.enabled)
|
||||
*flags |= DCB_FEATCFG_ENABLE;
|
||||
if (bp->dcbx_error & DCBX_LOCAL_ETS_ERROR)
|
||||
if (bp->dcbx_error & (DCBX_LOCAL_ETS_ERROR |
|
||||
DCBX_REMOTE_MIB_ERROR))
|
||||
*flags |= DCB_FEATCFG_ERROR;
|
||||
break;
|
||||
case DCB_FEATCFG_ATTR_PFC:
|
||||
if (bp->dcbx_local_feat.pfc.enabled)
|
||||
*flags |= DCB_FEATCFG_ENABLE;
|
||||
if (bp->dcbx_error & (DCBX_LOCAL_PFC_ERROR |
|
||||
DCBX_LOCAL_PFC_MISMATCH))
|
||||
DCBX_LOCAL_PFC_MISMATCH |
|
||||
DCBX_REMOTE_MIB_ERROR))
|
||||
*flags |= DCB_FEATCFG_ERROR;
|
||||
break;
|
||||
case DCB_FEATCFG_ATTR_APP:
|
||||
if (bp->dcbx_local_feat.app.enabled)
|
||||
*flags |= DCB_FEATCFG_ENABLE;
|
||||
if (bp->dcbx_error & (DCBX_LOCAL_APP_ERROR |
|
||||
DCBX_LOCAL_APP_MISMATCH))
|
||||
DCBX_LOCAL_APP_MISMATCH |
|
||||
DCBX_REMOTE_MIB_ERROR))
|
||||
*flags |= DCB_FEATCFG_ERROR;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -199,4 +199,7 @@ extern const struct dcbnl_rtnl_ops bnx2x_dcbnl_ops;
|
|||
int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall);
|
||||
#endif /* BCM_DCBNL */
|
||||
|
||||
int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp);
|
||||
int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp);
|
||||
|
||||
#endif /* BNX2X_DCB_H */
|
||||
|
|
|
@ -2261,6 +2261,23 @@ static void bnx2x_set_requested_fc(struct bnx2x *bp)
|
|||
bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH;
|
||||
}
|
||||
|
||||
static void bnx2x_init_dropless_fc(struct bnx2x *bp)
|
||||
{
|
||||
u32 pause_enabled = 0;
|
||||
|
||||
if (!CHIP_IS_E1(bp) && bp->dropless_fc && bp->link_vars.link_up) {
|
||||
if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
|
||||
pause_enabled = 1;
|
||||
|
||||
REG_WR(bp, BAR_USTRORM_INTMEM +
|
||||
USTORM_ETH_PAUSE_ENABLED_OFFSET(BP_PORT(bp)),
|
||||
pause_enabled);
|
||||
}
|
||||
|
||||
DP(NETIF_MSG_IFUP | NETIF_MSG_LINK, "dropless_fc is %s\n",
|
||||
pause_enabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
|
||||
{
|
||||
int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp);
|
||||
|
@ -2294,6 +2311,8 @@ int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
|
|||
|
||||
bnx2x_release_phy_lock(bp);
|
||||
|
||||
bnx2x_init_dropless_fc(bp);
|
||||
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
|
||||
if (bp->link_vars.link_up) {
|
||||
|
@ -2315,6 +2334,8 @@ void bnx2x_link_set(struct bnx2x *bp)
|
|||
bnx2x_phy_init(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_release_phy_lock(bp);
|
||||
|
||||
bnx2x_init_dropless_fc(bp);
|
||||
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
} else
|
||||
BNX2X_ERR("Bootcode is missing - can not set link\n");
|
||||
|
@ -2556,21 +2577,10 @@ static void bnx2x_link_attn(struct bnx2x *bp)
|
|||
|
||||
bnx2x_link_update(&bp->link_params, &bp->link_vars);
|
||||
|
||||
bnx2x_init_dropless_fc(bp);
|
||||
|
||||
if (bp->link_vars.link_up) {
|
||||
|
||||
/* dropless flow control */
|
||||
if (!CHIP_IS_E1(bp) && bp->dropless_fc) {
|
||||
int port = BP_PORT(bp);
|
||||
u32 pause_enabled = 0;
|
||||
|
||||
if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
|
||||
pause_enabled = 1;
|
||||
|
||||
REG_WR(bp, BAR_USTRORM_INTMEM +
|
||||
USTORM_ETH_PAUSE_ENABLED_OFFSET(port),
|
||||
pause_enabled);
|
||||
}
|
||||
|
||||
if (bp->link_vars.mac_type != MAC_TYPE_EMAC) {
|
||||
struct host_port_stats *pstats;
|
||||
|
||||
|
@ -9645,6 +9655,12 @@ sp_rtnl_not_reset:
|
|||
&bp->sp_rtnl_state))
|
||||
bnx2x_pf_set_vfs_vlan(bp);
|
||||
|
||||
if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state))
|
||||
bnx2x_dcbx_stop_hw_tx(bp);
|
||||
|
||||
if (test_and_clear_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state))
|
||||
bnx2x_dcbx_resume_hw_tx(bp);
|
||||
|
||||
/* work which needs rtnl lock not-taken (as it takes the lock itself and
|
||||
* can be called from other contexts as well)
|
||||
*/
|
||||
|
@ -11147,6 +11163,9 @@ static bool bnx2x_get_dropless_info(struct bnx2x *bp)
|
|||
int tmp;
|
||||
u32 cfg;
|
||||
|
||||
if (IS_VF(bp))
|
||||
return 0;
|
||||
|
||||
if (IS_MF(bp) && !CHIP_IS_E1x(bp)) {
|
||||
/* Take function: tmp = func */
|
||||
tmp = BP_ABS_FUNC(bp);
|
||||
|
|
|
@ -1747,11 +1747,8 @@ void bnx2x_iov_init_dq(struct bnx2x *bp)
|
|||
|
||||
void bnx2x_iov_init_dmae(struct bnx2x *bp)
|
||||
{
|
||||
DP(BNX2X_MSG_IOV, "SRIOV is %s\n", IS_SRIOV(bp) ? "ON" : "OFF");
|
||||
if (!IS_SRIOV(bp))
|
||||
return;
|
||||
|
||||
REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0);
|
||||
if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV))
|
||||
REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0);
|
||||
}
|
||||
|
||||
static int bnx2x_vf_bus(struct bnx2x *bp, int vfid)
|
||||
|
@ -3084,8 +3081,9 @@ void bnx2x_disable_sriov(struct bnx2x *bp)
|
|||
pci_disable_sriov(bp->pdev);
|
||||
}
|
||||
|
||||
static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx,
|
||||
struct bnx2x_virtf *vf)
|
||||
static int bnx2x_vf_ndo_prep(struct bnx2x *bp, int vfidx,
|
||||
struct bnx2x_virtf **vf,
|
||||
struct pf_vf_bulletin_content **bulletin)
|
||||
{
|
||||
if (bp->state != BNX2X_STATE_OPEN) {
|
||||
BNX2X_ERR("vf ndo called though PF is down\n");
|
||||
|
@ -3103,12 +3101,22 @@ static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!vf) {
|
||||
/* init members */
|
||||
*vf = BP_VF(bp, vfidx);
|
||||
*bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
|
||||
if (!*vf) {
|
||||
BNX2X_ERR("vf ndo called but vf was null. vfidx was %d\n",
|
||||
vfidx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!*bulletin) {
|
||||
BNX2X_ERR("vf ndo called but Bulletin Board struct is null. vfidx was %d\n",
|
||||
vfidx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3116,17 +3124,19 @@ int bnx2x_get_vf_config(struct net_device *dev, int vfidx,
|
|||
struct ifla_vf_info *ivi)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
|
||||
struct bnx2x_vlan_mac_obj *mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
|
||||
struct bnx2x_vlan_mac_obj *vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj);
|
||||
struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
struct bnx2x_virtf *vf = NULL;
|
||||
struct pf_vf_bulletin_content *bulletin = NULL;
|
||||
struct bnx2x_vlan_mac_obj *mac_obj;
|
||||
struct bnx2x_vlan_mac_obj *vlan_obj;
|
||||
int rc;
|
||||
|
||||
/* sanity */
|
||||
rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf);
|
||||
/* sanity and init */
|
||||
rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (!mac_obj || !vlan_obj || !bulletin) {
|
||||
mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
|
||||
vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj);
|
||||
if (!mac_obj || !vlan_obj) {
|
||||
BNX2X_ERR("VF partially initialized\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -3183,11 +3193,11 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac)
|
|||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
int rc, q_logical_state;
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
|
||||
struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
struct bnx2x_virtf *vf = NULL;
|
||||
struct pf_vf_bulletin_content *bulletin = NULL;
|
||||
|
||||
/* sanity */
|
||||
rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf);
|
||||
/* sanity and init */
|
||||
rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
|
@ -3249,11 +3259,11 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos)
|
|||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
int rc, q_logical_state;
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
|
||||
struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
struct bnx2x_virtf *vf = NULL;
|
||||
struct pf_vf_bulletin_content *bulletin = NULL;
|
||||
|
||||
/* sanity */
|
||||
rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf);
|
||||
/* sanity and init */
|
||||
rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
|
|
@ -2563,8 +2563,8 @@ static int be_close(struct net_device *netdev)
|
|||
/* Wait for all pending tx completions to arrive so that
|
||||
* all tx skbs are freed.
|
||||
*/
|
||||
be_tx_compl_clean(adapter);
|
||||
netif_tx_disable(netdev);
|
||||
be_tx_compl_clean(adapter);
|
||||
|
||||
be_rx_qs_destroy(adapter);
|
||||
|
||||
|
|
|
@ -7088,7 +7088,7 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||
RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & (BWF | MWF | UWF | LanWake | PMEStatus));
|
||||
if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
|
||||
tp->features |= RTL_FEATURE_WOL;
|
||||
if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
|
||||
|
|
|
@ -675,7 +675,7 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
|
|||
BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0);
|
||||
BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF !=
|
||||
EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF);
|
||||
rep_index = spec->type - EFX_FILTER_INDEX_UC_DEF;
|
||||
rep_index = spec->type - EFX_FILTER_UC_DEF;
|
||||
ins_index = rep_index;
|
||||
|
||||
spin_lock_bh(&state->lock);
|
||||
|
|
|
@ -210,8 +210,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
|
|||
pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0));
|
||||
pci_write_config_byte(pcidev,0x5a,0xc0);
|
||||
WriteLPCReg(0x28, 0x70 );
|
||||
if (via_ircc_open(pcidev, &info, 0x3076) == 0)
|
||||
rc=0;
|
||||
rc = via_ircc_open(pcidev, &info, 0x3076);
|
||||
} else
|
||||
rc = -ENODEV; //IR not turn on
|
||||
} else { //Not VT1211
|
||||
|
@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
|
|||
info.irq=FirIRQ;
|
||||
info.dma=FirDRQ1;
|
||||
info.dma2=FirDRQ0;
|
||||
if (via_ircc_open(pcidev, &info, 0x3096) == 0)
|
||||
rc=0;
|
||||
rc = via_ircc_open(pcidev, &info, 0x3096);
|
||||
} else
|
||||
rc = -ENODEV; //IR not turn on !!!!!
|
||||
}//Not VT1211
|
||||
|
|
|
@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops;
|
|||
#define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \
|
||||
NETIF_F_TSO6 | NETIF_F_UFO)
|
||||
#define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO)
|
||||
#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG)
|
||||
|
||||
/*
|
||||
* RCU usage:
|
||||
* The macvtap_queue and the macvlan_dev are loosely coupled, the
|
||||
|
@ -278,7 +280,8 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
|
|||
{
|
||||
struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
struct macvtap_queue *q = macvtap_get_queue(dev, skb);
|
||||
netdev_features_t features;
|
||||
netdev_features_t features = TAP_FEATURES;
|
||||
|
||||
if (!q)
|
||||
goto drop;
|
||||
|
||||
|
@ -287,9 +290,11 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
|
|||
|
||||
skb->dev = dev;
|
||||
/* Apply the forward feature mask so that we perform segmentation
|
||||
* according to users wishes.
|
||||
* according to users wishes. This only works if VNET_HDR is
|
||||
* enabled.
|
||||
*/
|
||||
features = netif_skb_features(skb) & vlan->tap_features;
|
||||
if (q->flags & IFF_VNET_HDR)
|
||||
features |= vlan->tap_features;
|
||||
if (netif_needs_gso(skb, features)) {
|
||||
struct sk_buff *segs = __skb_gso_segment(skb, features, false);
|
||||
|
||||
|
@ -1064,8 +1069,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg)
|
|||
/* tap_features are the same as features on tun/tap and
|
||||
* reflect user expectations.
|
||||
*/
|
||||
vlan->tap_features = vlan->dev->features &
|
||||
(feature_mask | ~TUN_OFFLOADS);
|
||||
vlan->tap_features = feature_mask;
|
||||
vlan->set_features = features;
|
||||
netdev_update_features(vlan->dev);
|
||||
|
||||
|
@ -1161,10 +1165,6 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
|||
TUN_F_TSO_ECN | TUN_F_UFO))
|
||||
return -EINVAL;
|
||||
|
||||
/* TODO: only accept frames with the features that
|
||||
got enabled for forwarded frames */
|
||||
if (!(q->flags & IFF_VNET_HDR))
|
||||
return -EINVAL;
|
||||
rtnl_lock();
|
||||
ret = set_offload(q, arg);
|
||||
rtnl_unlock();
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#define RTL821x_INER_INIT 0x6400
|
||||
#define RTL821x_INSR 0x13
|
||||
|
||||
#define RTL8211E_INER_LINK_STAT 0x10
|
||||
#define RTL8211E_INER_LINK_STATUS 0x400
|
||||
|
||||
MODULE_DESCRIPTION("Realtek PHY driver");
|
||||
MODULE_AUTHOR("Johnson Leung");
|
||||
|
@ -57,7 +57,7 @@ static int rtl8211e_config_intr(struct phy_device *phydev)
|
|||
|
||||
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
|
||||
err = phy_write(phydev, RTL821x_INER,
|
||||
RTL8211E_INER_LINK_STAT);
|
||||
RTL8211E_INER_LINK_STATUS);
|
||||
else
|
||||
err = phy_write(phydev, RTL821x_INER, 0);
|
||||
|
||||
|
|
|
@ -2816,13 +2816,16 @@ exit:
|
|||
static int hso_get_config_data(struct usb_interface *interface)
|
||||
{
|
||||
struct usb_device *usbdev = interface_to_usbdev(interface);
|
||||
u8 config_data[17];
|
||||
u8 *config_data = kmalloc(17, GFP_KERNEL);
|
||||
u32 if_num = interface->altsetting->desc.bInterfaceNumber;
|
||||
s32 result;
|
||||
|
||||
if (!config_data)
|
||||
return -ENOMEM;
|
||||
if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
|
||||
0x86, 0xC0, 0, 0, config_data, 17,
|
||||
USB_CTRL_SET_TIMEOUT) != 0x11) {
|
||||
kfree(config_data);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -2873,6 +2876,7 @@ static int hso_get_config_data(struct usb_interface *interface)
|
|||
if (config_data[16] & 0x1)
|
||||
result |= HSO_INFO_CRC_BUG;
|
||||
|
||||
kfree(config_data);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -2886,6 +2890,11 @@ static int hso_probe(struct usb_interface *interface,
|
|||
struct hso_shared_int *shared_int;
|
||||
struct hso_device *tmp_dev = NULL;
|
||||
|
||||
if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
|
||||
dev_err(&interface->dev, "Not our interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if_num = interface->altsetting->desc.bInterfaceNumber;
|
||||
|
||||
/* Get the interface/port specification from either driver_info or from
|
||||
|
@ -2895,10 +2904,6 @@ static int hso_probe(struct usb_interface *interface,
|
|||
else
|
||||
port_spec = hso_get_config_data(interface);
|
||||
|
||||
if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
|
||||
dev_err(&interface->dev, "Not our interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Check if we need to switch to alt interfaces prior to port
|
||||
* configuration */
|
||||
if (interface->num_altsetting > 1)
|
||||
|
|
|
@ -523,9 +523,9 @@ static int prism2_ioctl_giwaplist(struct net_device *dev,
|
|||
|
||||
data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1);
|
||||
|
||||
memcpy(extra, &addr, sizeof(struct sockaddr) * data->length);
|
||||
memcpy(extra, addr, sizeof(struct sockaddr) * data->length);
|
||||
data->flags = 1; /* has quality information */
|
||||
memcpy(extra + sizeof(struct sockaddr) * data->length, &qual,
|
||||
memcpy(extra + sizeof(struct sockaddr) * data->length, qual,
|
||||
sizeof(struct iw_quality) * data->length);
|
||||
|
||||
kfree(addr);
|
||||
|
|
|
@ -1068,7 +1068,10 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success)
|
|||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
|
||||
if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status))
|
||||
if (!test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status))
|
||||
return;
|
||||
|
||||
if (ctx->vif)
|
||||
ieee80211_chswitch_done(ctx->vif, is_success);
|
||||
}
|
||||
|
||||
|
|
|
@ -97,8 +97,6 @@
|
|||
|
||||
#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
|
||||
|
||||
#define APMG_RTC_INT_STT_RFKILL (0x10000000)
|
||||
|
||||
/* Device system time */
|
||||
#define DEVICE_SYSTEM_TIME_REG 0xA0206C
|
||||
|
||||
|
|
|
@ -138,6 +138,20 @@ static void iwl_mvm_roc_finished(struct iwl_mvm *mvm)
|
|||
schedule_work(&mvm->roc_done_wk);
|
||||
}
|
||||
|
||||
static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
const char *errmsg)
|
||||
{
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return false;
|
||||
if (vif->bss_conf.assoc && vif->bss_conf.dtim_period)
|
||||
return false;
|
||||
if (errmsg)
|
||||
IWL_ERR(mvm, "%s\n", errmsg);
|
||||
ieee80211_connection_loss(vif);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handles a FW notification for an event that is known to the driver.
|
||||
*
|
||||
|
@ -163,8 +177,13 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
|
|||
* P2P Device discoveribility, while there are other higher priority
|
||||
* events in the system).
|
||||
*/
|
||||
WARN_ONCE(!le32_to_cpu(notif->status),
|
||||
"Failed to schedule time event\n");
|
||||
if (WARN_ONCE(!le32_to_cpu(notif->status),
|
||||
"Failed to schedule time event\n")) {
|
||||
if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, NULL)) {
|
||||
iwl_mvm_te_clear_data(mvm, te_data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) {
|
||||
IWL_DEBUG_TE(mvm,
|
||||
|
@ -180,14 +199,8 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
|
|||
* By now, we should have finished association
|
||||
* and know the dtim period.
|
||||
*/
|
||||
if (te_data->vif->type == NL80211_IFTYPE_STATION &&
|
||||
(!te_data->vif->bss_conf.assoc ||
|
||||
!te_data->vif->bss_conf.dtim_period)) {
|
||||
IWL_ERR(mvm,
|
||||
"No assocation and the time event is over already...\n");
|
||||
ieee80211_connection_loss(te_data->vif);
|
||||
}
|
||||
|
||||
iwl_mvm_te_check_disconnect(mvm, te_data->vif,
|
||||
"No assocation and the time event is over already...");
|
||||
iwl_mvm_te_clear_data(mvm, te_data);
|
||||
} else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) {
|
||||
te_data->running = true;
|
||||
|
|
|
@ -888,14 +888,6 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id)
|
|||
|
||||
iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
|
||||
if (hw_rfkill) {
|
||||
/*
|
||||
* Clear the interrupt in APMG if the NIC is going down.
|
||||
* Note that when the NIC exits RFkill (else branch), we
|
||||
* can't access prph and the NIC will be reset in
|
||||
* start_hw anyway.
|
||||
*/
|
||||
iwl_write_prph(trans, APMG_RTC_INT_STT_REG,
|
||||
APMG_RTC_INT_STT_RFKILL);
|
||||
set_bit(STATUS_RFKILL, &trans_pcie->status);
|
||||
if (test_and_clear_bit(STATUS_HCMD_ACTIVE,
|
||||
&trans_pcie->status))
|
||||
|
|
|
@ -1502,16 +1502,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
|||
spin_lock_init(&trans_pcie->reg_lock);
|
||||
init_waitqueue_head(&trans_pcie->ucode_write_waitq);
|
||||
|
||||
/* W/A - seems to solve weird behavior. We need to remove this if we
|
||||
* don't want to stay in L1 all the time. This wastes a lot of power */
|
||||
pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
|
||||
PCIE_LINK_STATE_CLKPM);
|
||||
|
||||
if (pci_enable_device(pdev)) {
|
||||
err = -ENODEV;
|
||||
goto out_no_pci;
|
||||
}
|
||||
|
||||
/* W/A - seems to solve weird behavior. We need to remove this if we
|
||||
* don't want to stay in L1 all the time. This wastes a lot of power */
|
||||
pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
|
||||
PCIE_LINK_STATE_CLKPM);
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
|
||||
|
|
|
@ -98,10 +98,12 @@ static int zd1201_fw_upload(struct usb_device *dev, int apfw)
|
|||
goto exit;
|
||||
|
||||
err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4,
|
||||
USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT);
|
||||
USB_DIR_IN | 0x40, 0, 0, buf, sizeof(ret), ZD1201_FW_TIMEOUT);
|
||||
if (err < 0)
|
||||
goto exit;
|
||||
|
||||
memcpy(&ret, buf, sizeof(ret));
|
||||
|
||||
if (ret & 0x80) {
|
||||
err = -EIO;
|
||||
goto exit;
|
||||
|
|
|
@ -5,45 +5,13 @@
|
|||
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
enum
|
||||
{
|
||||
IPV4_DEVCONF_FORWARDING=1,
|
||||
IPV4_DEVCONF_MC_FORWARDING,
|
||||
IPV4_DEVCONF_PROXY_ARP,
|
||||
IPV4_DEVCONF_ACCEPT_REDIRECTS,
|
||||
IPV4_DEVCONF_SECURE_REDIRECTS,
|
||||
IPV4_DEVCONF_SEND_REDIRECTS,
|
||||
IPV4_DEVCONF_SHARED_MEDIA,
|
||||
IPV4_DEVCONF_RP_FILTER,
|
||||
IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
|
||||
IPV4_DEVCONF_BOOTP_RELAY,
|
||||
IPV4_DEVCONF_LOG_MARTIANS,
|
||||
IPV4_DEVCONF_TAG,
|
||||
IPV4_DEVCONF_ARPFILTER,
|
||||
IPV4_DEVCONF_MEDIUM_ID,
|
||||
IPV4_DEVCONF_NOXFRM,
|
||||
IPV4_DEVCONF_NOPOLICY,
|
||||
IPV4_DEVCONF_FORCE_IGMP_VERSION,
|
||||
IPV4_DEVCONF_ARP_ANNOUNCE,
|
||||
IPV4_DEVCONF_ARP_IGNORE,
|
||||
IPV4_DEVCONF_PROMOTE_SECONDARIES,
|
||||
IPV4_DEVCONF_ARP_ACCEPT,
|
||||
IPV4_DEVCONF_ARP_NOTIFY,
|
||||
IPV4_DEVCONF_ACCEPT_LOCAL,
|
||||
IPV4_DEVCONF_SRC_VMARK,
|
||||
IPV4_DEVCONF_PROXY_ARP_PVLAN,
|
||||
IPV4_DEVCONF_ROUTE_LOCALNET,
|
||||
__IPV4_DEVCONF_MAX
|
||||
};
|
||||
|
||||
#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
|
||||
|
||||
struct ipv4_devconf {
|
||||
void *sysctl;
|
||||
int data[IPV4_DEVCONF_MAX];
|
||||
|
|
|
@ -101,6 +101,7 @@ struct inet6_skb_parm {
|
|||
#define IP6SKB_FORWARDED 2
|
||||
#define IP6SKB_REROUTED 4
|
||||
#define IP6SKB_ROUTERALERT 8
|
||||
#define IP6SKB_FRAGMENTED 16
|
||||
};
|
||||
|
||||
#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
|
||||
|
|
|
@ -135,6 +135,8 @@ extern void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
|
|||
extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk,
|
||||
__be32 mtu);
|
||||
extern void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark);
|
||||
extern void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif,
|
||||
u32 mark);
|
||||
extern void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk);
|
||||
|
||||
struct netlink_callback;
|
||||
|
|
|
@ -133,4 +133,38 @@ struct ip_beet_phdr {
|
|||
__u8 reserved;
|
||||
};
|
||||
|
||||
/* index values for the variables in ipv4_devconf */
|
||||
enum
|
||||
{
|
||||
IPV4_DEVCONF_FORWARDING=1,
|
||||
IPV4_DEVCONF_MC_FORWARDING,
|
||||
IPV4_DEVCONF_PROXY_ARP,
|
||||
IPV4_DEVCONF_ACCEPT_REDIRECTS,
|
||||
IPV4_DEVCONF_SECURE_REDIRECTS,
|
||||
IPV4_DEVCONF_SEND_REDIRECTS,
|
||||
IPV4_DEVCONF_SHARED_MEDIA,
|
||||
IPV4_DEVCONF_RP_FILTER,
|
||||
IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
|
||||
IPV4_DEVCONF_BOOTP_RELAY,
|
||||
IPV4_DEVCONF_LOG_MARTIANS,
|
||||
IPV4_DEVCONF_TAG,
|
||||
IPV4_DEVCONF_ARPFILTER,
|
||||
IPV4_DEVCONF_MEDIUM_ID,
|
||||
IPV4_DEVCONF_NOXFRM,
|
||||
IPV4_DEVCONF_NOPOLICY,
|
||||
IPV4_DEVCONF_FORCE_IGMP_VERSION,
|
||||
IPV4_DEVCONF_ARP_ANNOUNCE,
|
||||
IPV4_DEVCONF_ARP_IGNORE,
|
||||
IPV4_DEVCONF_PROMOTE_SECONDARIES,
|
||||
IPV4_DEVCONF_ARP_ACCEPT,
|
||||
IPV4_DEVCONF_ARP_NOTIFY,
|
||||
IPV4_DEVCONF_ACCEPT_LOCAL,
|
||||
IPV4_DEVCONF_SRC_VMARK,
|
||||
IPV4_DEVCONF_PROXY_ARP_PVLAN,
|
||||
IPV4_DEVCONF_ROUTE_LOCALNET,
|
||||
__IPV4_DEVCONF_MAX
|
||||
};
|
||||
|
||||
#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
|
||||
|
||||
#endif /* _UAPI_LINUX_IP_H */
|
||||
|
|
|
@ -432,12 +432,16 @@ find_router:
|
|||
|
||||
switch (packet_type) {
|
||||
case BATADV_UNICAST:
|
||||
batadv_unicast_prepare_skb(skb, orig_node);
|
||||
if (!batadv_unicast_prepare_skb(skb, orig_node))
|
||||
goto out;
|
||||
|
||||
header_len = sizeof(struct batadv_unicast_packet);
|
||||
break;
|
||||
case BATADV_UNICAST_4ADDR:
|
||||
batadv_unicast_4addr_prepare_skb(bat_priv, skb, orig_node,
|
||||
packet_subtype);
|
||||
if (!batadv_unicast_4addr_prepare_skb(bat_priv, skb, orig_node,
|
||||
packet_subtype))
|
||||
goto out;
|
||||
|
||||
header_len = sizeof(struct batadv_unicast_4addr_packet);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -161,7 +161,7 @@ void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr)
|
|||
if (!pv)
|
||||
return;
|
||||
|
||||
for_each_set_bit_from(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) {
|
||||
for_each_set_bit_from(vid, pv->vlan_bitmap, VLAN_N_VID) {
|
||||
f = __br_fdb_get(br, br->dev->dev_addr, vid);
|
||||
if (f && f->is_local && !f->dst)
|
||||
fdb_delete(br, f);
|
||||
|
@ -730,7 +730,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
|
|||
/* VID was specified, so use it. */
|
||||
err = __br_fdb_add(ndm, p, addr, nlh_flags, vid);
|
||||
} else {
|
||||
if (!pv || bitmap_empty(pv->vlan_bitmap, BR_VLAN_BITMAP_LEN)) {
|
||||
if (!pv || bitmap_empty(pv->vlan_bitmap, VLAN_N_VID)) {
|
||||
err = __br_fdb_add(ndm, p, addr, nlh_flags, 0);
|
||||
goto out;
|
||||
}
|
||||
|
@ -739,7 +739,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
|
|||
* specify a VLAN. To be nice, add/update entry for every
|
||||
* vlan on this port.
|
||||
*/
|
||||
for_each_set_bit(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) {
|
||||
for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) {
|
||||
err = __br_fdb_add(ndm, p, addr, nlh_flags, vid);
|
||||
if (err)
|
||||
goto out;
|
||||
|
@ -817,7 +817,7 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
|
|||
|
||||
err = __br_fdb_delete(p, addr, vid);
|
||||
} else {
|
||||
if (!pv || bitmap_empty(pv->vlan_bitmap, BR_VLAN_BITMAP_LEN)) {
|
||||
if (!pv || bitmap_empty(pv->vlan_bitmap, VLAN_N_VID)) {
|
||||
err = __br_fdb_delete(p, addr, 0);
|
||||
goto out;
|
||||
}
|
||||
|
@ -827,7 +827,7 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
|
|||
* vlan on this port.
|
||||
*/
|
||||
err = -ENOENT;
|
||||
for_each_set_bit(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) {
|
||||
for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) {
|
||||
err &= __br_fdb_delete(p, addr, vid);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,7 +132,7 @@ static int br_fill_ifinfo(struct sk_buff *skb,
|
|||
else
|
||||
pv = br_get_vlan_info(br);
|
||||
|
||||
if (!pv || bitmap_empty(pv->vlan_bitmap, BR_VLAN_BITMAP_LEN))
|
||||
if (!pv || bitmap_empty(pv->vlan_bitmap, VLAN_N_VID))
|
||||
goto done;
|
||||
|
||||
af = nla_nest_start(skb, IFLA_AF_SPEC);
|
||||
|
@ -140,7 +140,7 @@ static int br_fill_ifinfo(struct sk_buff *skb,
|
|||
goto nla_put_failure;
|
||||
|
||||
pvid = br_get_pvid(pv);
|
||||
for_each_set_bit(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) {
|
||||
for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) {
|
||||
vinfo.vid = vid;
|
||||
vinfo.flags = 0;
|
||||
if (vid == pvid)
|
||||
|
|
|
@ -108,7 +108,7 @@ static int __vlan_del(struct net_port_vlans *v, u16 vid)
|
|||
|
||||
clear_bit(vid, v->vlan_bitmap);
|
||||
v->num_vlans--;
|
||||
if (bitmap_empty(v->vlan_bitmap, BR_VLAN_BITMAP_LEN)) {
|
||||
if (bitmap_empty(v->vlan_bitmap, VLAN_N_VID)) {
|
||||
if (v->port_idx)
|
||||
rcu_assign_pointer(v->parent.port->vlan_info, NULL);
|
||||
else
|
||||
|
@ -122,7 +122,7 @@ static void __vlan_flush(struct net_port_vlans *v)
|
|||
{
|
||||
smp_wmb();
|
||||
v->pvid = 0;
|
||||
bitmap_zero(v->vlan_bitmap, BR_VLAN_BITMAP_LEN);
|
||||
bitmap_zero(v->vlan_bitmap, VLAN_N_VID);
|
||||
if (v->port_idx)
|
||||
rcu_assign_pointer(v->parent.port->vlan_info, NULL);
|
||||
else
|
||||
|
|
|
@ -1120,6 +1120,13 @@ new_segment:
|
|||
if (!skb)
|
||||
goto wait_for_memory;
|
||||
|
||||
/*
|
||||
* All packets are restored as if they have
|
||||
* already been sent.
|
||||
*/
|
||||
if (tp->repair)
|
||||
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
||||
|
||||
/*
|
||||
* Check whether we can use HW checksum.
|
||||
*/
|
||||
|
|
|
@ -1126,12 +1126,10 @@ retry:
|
|||
if (ifp->flags & IFA_F_OPTIMISTIC)
|
||||
addr_flags |= IFA_F_OPTIMISTIC;
|
||||
|
||||
ift = !max_addresses ||
|
||||
ipv6_count_addresses(idev) < max_addresses ?
|
||||
ipv6_add_addr(idev, &addr, NULL, tmp_plen,
|
||||
ipv6_addr_scope(&addr), addr_flags,
|
||||
tmp_valid_lft, tmp_prefered_lft) : NULL;
|
||||
if (IS_ERR_OR_NULL(ift)) {
|
||||
ift = ipv6_add_addr(idev, &addr, NULL, tmp_plen,
|
||||
ipv6_addr_scope(&addr), addr_flags,
|
||||
tmp_valid_lft, tmp_prefered_lft);
|
||||
if (IS_ERR(ift)) {
|
||||
in6_ifa_put(ifp);
|
||||
in6_dev_put(idev);
|
||||
pr_info("%s: retry temporary address regeneration\n", __func__);
|
||||
|
|
|
@ -1369,8 +1369,10 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
|
|||
if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
|
||||
return;
|
||||
|
||||
if (!ndopts.nd_opts_rh)
|
||||
if (!ndopts.nd_opts_rh) {
|
||||
ip6_redirect_no_header(skb, dev_net(skb->dev), 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
hdr = (u8 *)ndopts.nd_opts_rh;
|
||||
hdr += 8;
|
||||
|
|
|
@ -490,6 +490,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
|
|||
ipv6_hdr(head)->payload_len = htons(payload_len);
|
||||
ipv6_change_dsfield(ipv6_hdr(head), 0xff, ecn);
|
||||
IP6CB(head)->nhoff = nhoff;
|
||||
IP6CB(head)->flags |= IP6SKB_FRAGMENTED;
|
||||
|
||||
/* Yes, and fold redundant checksum back. 8) */
|
||||
if (head->ip_summed == CHECKSUM_COMPLETE)
|
||||
|
@ -524,6 +525,9 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
|
|||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
int evicted;
|
||||
|
||||
if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED)
|
||||
goto fail_hdr;
|
||||
|
||||
IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMREQDS);
|
||||
|
||||
/* Jumbo payload inhibits frag. header */
|
||||
|
@ -544,6 +548,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
|
|||
ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMOKS);
|
||||
|
||||
IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb);
|
||||
IP6CB(skb)->flags |= IP6SKB_FRAGMENTED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1178,6 +1178,27 @@ void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_redirect);
|
||||
|
||||
void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif,
|
||||
u32 mark)
|
||||
{
|
||||
const struct ipv6hdr *iph = ipv6_hdr(skb);
|
||||
const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb);
|
||||
struct dst_entry *dst;
|
||||
struct flowi6 fl6;
|
||||
|
||||
memset(&fl6, 0, sizeof(fl6));
|
||||
fl6.flowi6_oif = oif;
|
||||
fl6.flowi6_mark = mark;
|
||||
fl6.flowi6_flags = 0;
|
||||
fl6.daddr = msg->dest;
|
||||
fl6.saddr = iph->daddr;
|
||||
|
||||
dst = ip6_route_output(net, NULL, &fl6);
|
||||
if (!dst->error)
|
||||
rt6_do_redirect(dst, NULL, skb);
|
||||
dst_release(dst);
|
||||
}
|
||||
|
||||
void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk)
|
||||
{
|
||||
ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark);
|
||||
|
|
|
@ -789,10 +789,6 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
struct net *net = sock_net(skb->sk);
|
||||
int chains_to_skip = cb->args[0];
|
||||
int fams_to_skip = cb->args[1];
|
||||
bool need_locking = chains_to_skip || fams_to_skip;
|
||||
|
||||
if (need_locking)
|
||||
genl_lock();
|
||||
|
||||
for (i = chains_to_skip; i < GENL_FAM_TAB_SIZE; i++) {
|
||||
n = 0;
|
||||
|
@ -814,9 +810,6 @@ errout:
|
|||
cb->args[0] = i;
|
||||
cb->args[1] = n;
|
||||
|
||||
if (need_locking)
|
||||
genl_unlock();
|
||||
|
||||
return skb->len;
|
||||
}
|
||||
|
||||
|
|
|
@ -3259,9 +3259,11 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
|
|||
|
||||
if (po->tp_version == TPACKET_V3) {
|
||||
lv = sizeof(struct tpacket_stats_v3);
|
||||
st.stats3.tp_packets += st.stats3.tp_drops;
|
||||
data = &st.stats3;
|
||||
} else {
|
||||
lv = sizeof(struct tpacket_stats);
|
||||
st.stats1.tp_packets += st.stats1.tp_drops;
|
||||
data = &st.stats1;
|
||||
}
|
||||
|
||||
|
|
|
@ -2622,8 +2622,8 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
|
||||
NL80211_CMD_NEW_KEY);
|
||||
if (IS_ERR(hdr))
|
||||
return PTR_ERR(hdr);
|
||||
if (!hdr)
|
||||
return -ENOBUFS;
|
||||
|
||||
cookie.msg = msg;
|
||||
cookie.idx = key_idx;
|
||||
|
@ -6507,6 +6507,9 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
|||
NL80211_CMD_TESTMODE);
|
||||
struct nlattr *tmdata;
|
||||
|
||||
if (!hdr)
|
||||
break;
|
||||
|
||||
if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
|
||||
genlmsg_cancel(skb, hdr);
|
||||
break;
|
||||
|
@ -6951,9 +6954,8 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
|
|||
|
||||
hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
|
||||
NL80211_CMD_REMAIN_ON_CHANNEL);
|
||||
|
||||
if (IS_ERR(hdr)) {
|
||||
err = PTR_ERR(hdr);
|
||||
if (!hdr) {
|
||||
err = -ENOBUFS;
|
||||
goto free_msg;
|
||||
}
|
||||
|
||||
|
@ -7251,9 +7253,8 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
|
||||
NL80211_CMD_FRAME);
|
||||
|
||||
if (IS_ERR(hdr)) {
|
||||
err = PTR_ERR(hdr);
|
||||
if (!hdr) {
|
||||
err = -ENOBUFS;
|
||||
goto free_msg;
|
||||
}
|
||||
}
|
||||
|
@ -8132,9 +8133,8 @@ static int nl80211_probe_client(struct sk_buff *skb,
|
|||
|
||||
hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
|
||||
NL80211_CMD_PROBE_CLIENT);
|
||||
|
||||
if (IS_ERR(hdr)) {
|
||||
err = PTR_ERR(hdr);
|
||||
if (!hdr) {
|
||||
err = -ENOBUFS;
|
||||
goto free_msg;
|
||||
}
|
||||
|
||||
|
|
|
@ -976,21 +976,19 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
|
|||
struct net_device *dev, u16 reason, bool wextev)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
||||
kfree(wdev->connect_keys);
|
||||
wdev->connect_keys = NULL;
|
||||
|
||||
if (wdev->conn) {
|
||||
if (wdev->conn)
|
||||
err = cfg80211_sme_disconnect(wdev, reason);
|
||||
} else if (!rdev->ops->disconnect) {
|
||||
else if (!rdev->ops->disconnect)
|
||||
cfg80211_mlme_down(rdev, dev);
|
||||
err = 0;
|
||||
} else {
|
||||
else if (wdev->current_bss)
|
||||
err = rdev_disconnect(rdev, dev, reason);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче