diff options
55 files changed, 345 insertions, 167 deletions
diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c index c502c139d3bc..47a8103610bc 100644 --- a/drivers/net/bonding/bond_netlink.c +++ b/drivers/net/bonding/bond_netlink.c | |||
@@ -549,7 +549,8 @@ static int bond_fill_info(struct sk_buff *skb, | |||
549 | targets_added = 0; | 549 | targets_added = 0; |
550 | for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) { | 550 | for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) { |
551 | if (bond->params.arp_targets[i]) { | 551 | if (bond->params.arp_targets[i]) { |
552 | nla_put_be32(skb, i, bond->params.arp_targets[i]); | 552 | if (nla_put_be32(skb, i, bond->params.arp_targets[i])) |
553 | goto nla_put_failure; | ||
553 | targets_added = 1; | 554 | targets_added = 1; |
554 | } | 555 | } |
555 | } | 556 | } |
diff --git a/drivers/net/dsa/dsa_loop.c b/drivers/net/dsa/dsa_loop.c index f0fc4de4fc9a..a19e1781e9bb 100644 --- a/drivers/net/dsa/dsa_loop.c +++ b/drivers/net/dsa/dsa_loop.c | |||
@@ -256,6 +256,9 @@ static int dsa_loop_drv_probe(struct mdio_device *mdiodev) | |||
256 | return -ENOMEM; | 256 | return -ENOMEM; |
257 | 257 | ||
258 | ps = devm_kzalloc(&mdiodev->dev, sizeof(*ps), GFP_KERNEL); | 258 | ps = devm_kzalloc(&mdiodev->dev, sizeof(*ps), GFP_KERNEL); |
259 | if (!ps) | ||
260 | return -ENOMEM; | ||
261 | |||
259 | ps->netdev = dev_get_by_name(&init_net, pdata->netdev); | 262 | ps->netdev = dev_get_by_name(&init_net, pdata->netdev); |
260 | if (!ps->netdev) | 263 | if (!ps->netdev) |
261 | return -EPROBE_DEFER; | 264 | return -EPROBE_DEFER; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index cdb02991f249..9ee1c5016784 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c | |||
@@ -755,7 +755,7 @@ void aq_nic_get_stats(struct aq_nic_s *self, u64 *data) | |||
755 | count = 0U; | 755 | count = 0U; |
756 | 756 | ||
757 | for (i = 0U, aq_vec = self->aq_vec[0]; | 757 | for (i = 0U, aq_vec = self->aq_vec[0]; |
758 | self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) { | 758 | aq_vec && self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) { |
759 | data += count; | 759 | data += count; |
760 | aq_vec_get_sw_stats(aq_vec, data, &count); | 760 | aq_vec_get_sw_stats(aq_vec, data, &count); |
761 | } | 761 | } |
@@ -959,8 +959,10 @@ void aq_nic_free_hot_resources(struct aq_nic_s *self) | |||
959 | goto err_exit; | 959 | goto err_exit; |
960 | 960 | ||
961 | for (i = AQ_DIMOF(self->aq_vec); i--;) { | 961 | for (i = AQ_DIMOF(self->aq_vec); i--;) { |
962 | if (self->aq_vec[i]) | 962 | if (self->aq_vec[i]) { |
963 | aq_vec_free(self->aq_vec[i]); | 963 | aq_vec_free(self->aq_vec[i]); |
964 | self->aq_vec[i] = NULL; | ||
965 | } | ||
964 | } | 966 | } |
965 | 967 | ||
966 | err_exit:; | 968 | err_exit:; |
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c index a8c2db881b75..567ee54504bc 100644 --- a/drivers/net/ethernet/atheros/alx/main.c +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
@@ -838,7 +838,7 @@ static int alx_enable_msix(struct alx_priv *alx) | |||
838 | 838 | ||
839 | err = pci_alloc_irq_vectors(alx->hw.pdev, num_vec, num_vec, | 839 | err = pci_alloc_irq_vectors(alx->hw.pdev, num_vec, num_vec, |
840 | PCI_IRQ_MSIX); | 840 | PCI_IRQ_MSIX); |
841 | if (err) { | 841 | if (err < 0) { |
842 | netdev_warn(alx->dev, "Enabling MSI-X interrupts failed!\n"); | 842 | netdev_warn(alx->dev, "Enabling MSI-X interrupts failed!\n"); |
843 | return err; | 843 | return err; |
844 | } | 844 | } |
@@ -904,7 +904,7 @@ static int alx_init_intr(struct alx_priv *alx) | |||
904 | 904 | ||
905 | ret = pci_alloc_irq_vectors(alx->hw.pdev, 1, 1, | 905 | ret = pci_alloc_irq_vectors(alx->hw.pdev, 1, 1, |
906 | PCI_IRQ_MSI | PCI_IRQ_LEGACY); | 906 | PCI_IRQ_MSI | PCI_IRQ_LEGACY); |
907 | if (ret) | 907 | if (ret < 0) |
908 | return ret; | 908 | return ret; |
909 | 909 | ||
910 | alx->num_vec = 1; | 910 | alx->num_vec = 1; |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index b3ba66032980..b56c54d68d5e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
@@ -3000,7 +3000,8 @@ static int bnxt_alloc_ntp_fltrs(struct bnxt *bp) | |||
3000 | INIT_HLIST_HEAD(&bp->ntp_fltr_hash_tbl[i]); | 3000 | INIT_HLIST_HEAD(&bp->ntp_fltr_hash_tbl[i]); |
3001 | 3001 | ||
3002 | bp->ntp_fltr_count = 0; | 3002 | bp->ntp_fltr_count = 0; |
3003 | bp->ntp_fltr_bmap = kzalloc(BITS_TO_LONGS(BNXT_NTP_FLTR_MAX_FLTR), | 3003 | bp->ntp_fltr_bmap = kcalloc(BITS_TO_LONGS(BNXT_NTP_FLTR_MAX_FLTR), |
3004 | sizeof(long), | ||
3004 | GFP_KERNEL); | 3005 | GFP_KERNEL); |
3005 | 3006 | ||
3006 | if (!bp->ntp_fltr_bmap) | 3007 | if (!bp->ntp_fltr_bmap) |
diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c b/drivers/net/ethernet/brocade/bna/bfa_ioc.c index 0f6811860ad5..a36e38676640 100644 --- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c +++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c | |||
@@ -2845,7 +2845,7 @@ bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver) | |||
2845 | static void | 2845 | static void |
2846 | bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer) | 2846 | bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer) |
2847 | { | 2847 | { |
2848 | memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); | 2848 | strncpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); |
2849 | } | 2849 | } |
2850 | 2850 | ||
2851 | static void | 2851 | static void |
diff --git a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c index 286593922139..31032de5843b 100644 --- a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c +++ b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c | |||
@@ -547,8 +547,8 @@ bnad_get_strings(struct net_device *netdev, u32 stringset, u8 *string) | |||
547 | for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) { | 547 | for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) { |
548 | BUG_ON(!(strlen(bnad_net_stats_strings[i]) < | 548 | BUG_ON(!(strlen(bnad_net_stats_strings[i]) < |
549 | ETH_GSTRING_LEN)); | 549 | ETH_GSTRING_LEN)); |
550 | memcpy(string, bnad_net_stats_strings[i], | 550 | strncpy(string, bnad_net_stats_strings[i], |
551 | ETH_GSTRING_LEN); | 551 | ETH_GSTRING_LEN); |
552 | string += ETH_GSTRING_LEN; | 552 | string += ETH_GSTRING_LEN; |
553 | } | 553 | } |
554 | bmap = bna_tx_rid_mask(&bnad->bna); | 554 | bmap = bna_tx_rid_mask(&bnad->bna); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index 1d2be2dd19dd..e88c1808e46f 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | |||
@@ -108,6 +108,12 @@ enum { | |||
108 | PAUSE_AUTONEG = 1 << 2 | 108 | PAUSE_AUTONEG = 1 << 2 |
109 | }; | 109 | }; |
110 | 110 | ||
111 | enum { | ||
112 | FEC_AUTO = 1 << 0, /* IEEE 802.3 "automatic" */ | ||
113 | FEC_RS = 1 << 1, /* Reed-Solomon */ | ||
114 | FEC_BASER_RS = 1 << 2 /* BaseR/Reed-Solomon */ | ||
115 | }; | ||
116 | |||
111 | struct port_stats { | 117 | struct port_stats { |
112 | u64 tx_octets; /* total # of octets in good frames */ | 118 | u64 tx_octets; /* total # of octets in good frames */ |
113 | u64 tx_frames; /* all good frames */ | 119 | u64 tx_frames; /* all good frames */ |
@@ -432,6 +438,9 @@ struct link_config { | |||
432 | unsigned int speed; /* actual link speed */ | 438 | unsigned int speed; /* actual link speed */ |
433 | unsigned char requested_fc; /* flow control user has requested */ | 439 | unsigned char requested_fc; /* flow control user has requested */ |
434 | unsigned char fc; /* actual link flow control */ | 440 | unsigned char fc; /* actual link flow control */ |
441 | unsigned char auto_fec; /* Forward Error Correction: */ | ||
442 | unsigned char requested_fec; /* "automatic" (IEEE 802.3), */ | ||
443 | unsigned char fec; /* requested, and actual in use */ | ||
435 | unsigned char autoneg; /* autonegotiating? */ | 444 | unsigned char autoneg; /* autonegotiating? */ |
436 | unsigned char link_ok; /* link up? */ | 445 | unsigned char link_ok; /* link up? */ |
437 | unsigned char link_down_rc; /* link down reason */ | 446 | unsigned char link_down_rc; /* link down reason */ |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 0de8eb72325c..aded42b96f6d 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
@@ -3707,7 +3707,8 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port, | |||
3707 | struct link_config *lc) | 3707 | struct link_config *lc) |
3708 | { | 3708 | { |
3709 | struct fw_port_cmd c; | 3709 | struct fw_port_cmd c; |
3710 | unsigned int fc = 0, mdi = FW_PORT_CAP_MDI_V(FW_PORT_CAP_MDI_AUTO); | 3710 | unsigned int mdi = FW_PORT_CAP_MDI_V(FW_PORT_CAP_MDI_AUTO); |
3711 | unsigned int fc = 0, fec = 0, fw_fec = 0; | ||
3711 | 3712 | ||
3712 | lc->link_ok = 0; | 3713 | lc->link_ok = 0; |
3713 | if (lc->requested_fc & PAUSE_RX) | 3714 | if (lc->requested_fc & PAUSE_RX) |
@@ -3715,6 +3716,13 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port, | |||
3715 | if (lc->requested_fc & PAUSE_TX) | 3716 | if (lc->requested_fc & PAUSE_TX) |
3716 | fc |= FW_PORT_CAP_FC_TX; | 3717 | fc |= FW_PORT_CAP_FC_TX; |
3717 | 3718 | ||
3719 | fec = lc->requested_fec & FEC_AUTO ? lc->auto_fec : lc->requested_fec; | ||
3720 | |||
3721 | if (fec & FEC_RS) | ||
3722 | fw_fec |= FW_PORT_CAP_FEC_RS; | ||
3723 | if (fec & FEC_BASER_RS) | ||
3724 | fw_fec |= FW_PORT_CAP_FEC_BASER_RS; | ||
3725 | |||
3718 | memset(&c, 0, sizeof(c)); | 3726 | memset(&c, 0, sizeof(c)); |
3719 | c.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | | 3727 | c.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | |
3720 | FW_CMD_REQUEST_F | FW_CMD_EXEC_F | | 3728 | FW_CMD_REQUEST_F | FW_CMD_EXEC_F | |
@@ -3725,13 +3733,15 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port, | |||
3725 | 3733 | ||
3726 | if (!(lc->supported & FW_PORT_CAP_ANEG)) { | 3734 | if (!(lc->supported & FW_PORT_CAP_ANEG)) { |
3727 | c.u.l1cfg.rcap = cpu_to_be32((lc->supported & ADVERT_MASK) | | 3735 | c.u.l1cfg.rcap = cpu_to_be32((lc->supported & ADVERT_MASK) | |
3728 | fc); | 3736 | fc | fw_fec); |
3729 | lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX); | 3737 | lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX); |
3730 | } else if (lc->autoneg == AUTONEG_DISABLE) { | 3738 | } else if (lc->autoneg == AUTONEG_DISABLE) { |
3731 | c.u.l1cfg.rcap = cpu_to_be32(lc->requested_speed | fc | mdi); | 3739 | c.u.l1cfg.rcap = cpu_to_be32(lc->requested_speed | fc | |
3740 | fw_fec | mdi); | ||
3732 | lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX); | 3741 | lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX); |
3733 | } else | 3742 | } else |
3734 | c.u.l1cfg.rcap = cpu_to_be32(lc->advertising | fc | mdi); | 3743 | c.u.l1cfg.rcap = cpu_to_be32(lc->advertising | fc | |
3744 | fw_fec | mdi); | ||
3735 | 3745 | ||
3736 | return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); | 3746 | return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); |
3737 | } | 3747 | } |
@@ -7407,13 +7417,26 @@ static void get_pci_mode(struct adapter *adapter, struct pci_params *p) | |||
7407 | * Initializes the SW state maintained for each link, including the link's | 7417 | * Initializes the SW state maintained for each link, including the link's |
7408 | * capabilities and default speed/flow-control/autonegotiation settings. | 7418 | * capabilities and default speed/flow-control/autonegotiation settings. |
7409 | */ | 7419 | */ |
7410 | static void init_link_config(struct link_config *lc, unsigned int caps) | 7420 | static void init_link_config(struct link_config *lc, unsigned int pcaps, |
7421 | unsigned int acaps) | ||
7411 | { | 7422 | { |
7412 | lc->supported = caps; | 7423 | lc->supported = pcaps; |
7413 | lc->lp_advertising = 0; | 7424 | lc->lp_advertising = 0; |
7414 | lc->requested_speed = 0; | 7425 | lc->requested_speed = 0; |
7415 | lc->speed = 0; | 7426 | lc->speed = 0; |
7416 | lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX; | 7427 | lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX; |
7428 | lc->auto_fec = 0; | ||
7429 | |||
7430 | /* For Forward Error Control, we default to whatever the Firmware | ||
7431 | * tells us the Link is currently advertising. | ||
7432 | */ | ||
7433 | if (acaps & FW_PORT_CAP_FEC_RS) | ||
7434 | lc->auto_fec |= FEC_RS; | ||
7435 | if (acaps & FW_PORT_CAP_FEC_BASER_RS) | ||
7436 | lc->auto_fec |= FEC_BASER_RS; | ||
7437 | lc->requested_fec = FEC_AUTO; | ||
7438 | lc->fec = lc->auto_fec; | ||
7439 | |||
7417 | if (lc->supported & FW_PORT_CAP_ANEG) { | 7440 | if (lc->supported & FW_PORT_CAP_ANEG) { |
7418 | lc->advertising = lc->supported & ADVERT_MASK; | 7441 | lc->advertising = lc->supported & ADVERT_MASK; |
7419 | lc->autoneg = AUTONEG_ENABLE; | 7442 | lc->autoneg = AUTONEG_ENABLE; |
@@ -7991,7 +8014,8 @@ int t4_init_portinfo(struct port_info *pi, int mbox, | |||
7991 | pi->port_type = FW_PORT_CMD_PTYPE_G(ret); | 8014 | pi->port_type = FW_PORT_CMD_PTYPE_G(ret); |
7992 | pi->mod_type = FW_PORT_MOD_TYPE_NA; | 8015 | pi->mod_type = FW_PORT_MOD_TYPE_NA; |
7993 | 8016 | ||
7994 | init_link_config(&pi->link_cfg, be16_to_cpu(c.u.info.pcap)); | 8017 | init_link_config(&pi->link_cfg, be16_to_cpu(c.u.info.pcap), |
8018 | be16_to_cpu(c.u.info.acap)); | ||
7995 | return 0; | 8019 | return 0; |
7996 | } | 8020 | } |
7997 | 8021 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h index 8f8c079d0d2b..251a35e9795c 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h +++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h | |||
@@ -2263,9 +2263,9 @@ enum fw_port_cap { | |||
2263 | FW_PORT_CAP_ANEG = 0x0100, | 2263 | FW_PORT_CAP_ANEG = 0x0100, |
2264 | FW_PORT_CAP_MDIX = 0x0200, | 2264 | FW_PORT_CAP_MDIX = 0x0200, |
2265 | FW_PORT_CAP_MDIAUTO = 0x0400, | 2265 | FW_PORT_CAP_MDIAUTO = 0x0400, |
2266 | FW_PORT_CAP_FEC = 0x0800, | 2266 | FW_PORT_CAP_FEC_RS = 0x0800, |
2267 | FW_PORT_CAP_TECHKR = 0x1000, | 2267 | FW_PORT_CAP_FEC_BASER_RS = 0x1000, |
2268 | FW_PORT_CAP_TECHKX4 = 0x2000, | 2268 | FW_PORT_CAP_FEC_RESERVED = 0x2000, |
2269 | FW_PORT_CAP_802_3_PAUSE = 0x4000, | 2269 | FW_PORT_CAP_802_3_PAUSE = 0x4000, |
2270 | FW_PORT_CAP_802_3_ASM_DIR = 0x8000, | 2270 | FW_PORT_CAP_802_3_ASM_DIR = 0x8000, |
2271 | }; | 2271 | }; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index 0e0fa7030565..c1af47e45d3f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
@@ -1789,9 +1789,17 @@ static int mlx4_master_process_vhcr(struct mlx4_dev *dev, int slave, | |||
1789 | } | 1789 | } |
1790 | 1790 | ||
1791 | if (err) { | 1791 | if (err) { |
1792 | if (!(dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR)) | 1792 | if (!(dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR)) { |
1793 | mlx4_warn(dev, "vhcr command:0x%x slave:%d failed with error:%d, status %d\n", | 1793 | if (vhcr->op == MLX4_CMD_ALLOC_RES && |
1794 | vhcr->op, slave, vhcr->errno, err); | 1794 | (vhcr->in_modifier & 0xff) == RES_COUNTER && |
1795 | err == -EDQUOT) | ||
1796 | mlx4_dbg(dev, | ||
1797 | "Unable to allocate counter for slave %d (%d)\n", | ||
1798 | slave, err); | ||
1799 | else | ||
1800 | mlx4_warn(dev, "vhcr command:0x%x slave:%d failed with error:%d, status %d\n", | ||
1801 | vhcr->op, slave, vhcr->errno, err); | ||
1802 | } | ||
1795 | vhcr_cmd->status = mlx4_errno_to_status(err); | 1803 | vhcr_cmd->status = mlx4_errno_to_status(err); |
1796 | goto out_status; | 1804 | goto out_status; |
1797 | } | 1805 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index ffbcb27c05e5..ae5fdc2df654 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
@@ -1562,6 +1562,11 @@ static int mlx4_en_flow_replace(struct net_device *dev, | |||
1562 | qpn = priv->drop_qp.qpn; | 1562 | qpn = priv->drop_qp.qpn; |
1563 | else if (cmd->fs.ring_cookie & EN_ETHTOOL_QP_ATTACH) { | 1563 | else if (cmd->fs.ring_cookie & EN_ETHTOOL_QP_ATTACH) { |
1564 | qpn = cmd->fs.ring_cookie & (EN_ETHTOOL_QP_ATTACH - 1); | 1564 | qpn = cmd->fs.ring_cookie & (EN_ETHTOOL_QP_ATTACH - 1); |
1565 | if (qpn < priv->rss_map.base_qpn || | ||
1566 | qpn >= priv->rss_map.base_qpn + priv->rx_ring_num) { | ||
1567 | en_warn(priv, "rxnfc: QP (0x%x) doesn't exist\n", qpn); | ||
1568 | return -EINVAL; | ||
1569 | } | ||
1565 | } else { | 1570 | } else { |
1566 | if (cmd->fs.ring_cookie >= priv->rx_ring_num) { | 1571 | if (cmd->fs.ring_cookie >= priv->rx_ring_num) { |
1567 | en_warn(priv, "rxnfc: RX ring (%llu) doesn't exist\n", | 1572 | en_warn(priv, "rxnfc: RX ring (%llu) doesn't exist\n", |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index aa074e57ce06..77abd1813047 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | |||
@@ -997,7 +997,8 @@ void mlx4_en_calc_rx_buf(struct net_device *dev) | |||
997 | en_dbg(DRV, priv, "Rx buffer scatter-list (effective-mtu:%d num_frags:%d):\n", | 997 | en_dbg(DRV, priv, "Rx buffer scatter-list (effective-mtu:%d num_frags:%d):\n", |
998 | eff_mtu, priv->num_frags); | 998 | eff_mtu, priv->num_frags); |
999 | for (i = 0; i < priv->num_frags; i++) { | 999 | for (i = 0; i < priv->num_frags; i++) { |
1000 | en_err(priv, | 1000 | en_dbg(DRV, |
1001 | priv, | ||
1001 | " frag:%d - size:%d stride:%d\n", | 1002 | " frag:%d - size:%d stride:%d\n", |
1002 | i, | 1003 | i, |
1003 | priv->frag_info[i].frag_size, | 1004 | priv->frag_info[i].frag_size, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 4aa29ee93013..07516545474f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -311,7 +311,7 @@ static inline int mlx4_grant_resource(struct mlx4_dev *dev, int slave, | |||
311 | struct mlx4_priv *priv = mlx4_priv(dev); | 311 | struct mlx4_priv *priv = mlx4_priv(dev); |
312 | struct resource_allocator *res_alloc = | 312 | struct resource_allocator *res_alloc = |
313 | &priv->mfunc.master.res_tracker.res_alloc[res_type]; | 313 | &priv->mfunc.master.res_tracker.res_alloc[res_type]; |
314 | int err = -EINVAL; | 314 | int err = -EDQUOT; |
315 | int allocated, free, reserved, guaranteed, from_free; | 315 | int allocated, free, reserved, guaranteed, from_free; |
316 | int from_rsvd; | 316 | int from_rsvd; |
317 | 317 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c index b3aaa985956e..694845793af2 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c | |||
@@ -1460,6 +1460,7 @@ void qed_qm_init_pf(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) | |||
1460 | params.is_first_pf = p_hwfn->first_on_engine; | 1460 | params.is_first_pf = p_hwfn->first_on_engine; |
1461 | params.num_pf_cids = iids.cids; | 1461 | params.num_pf_cids = iids.cids; |
1462 | params.num_vf_cids = iids.vf_cids; | 1462 | params.num_vf_cids = iids.vf_cids; |
1463 | params.num_tids = iids.tids; | ||
1463 | params.start_pq = qm_info->start_pq; | 1464 | params.start_pq = qm_info->start_pq; |
1464 | params.num_pf_pqs = qm_info->num_pqs - qm_info->num_vf_pqs; | 1465 | params.num_pf_pqs = qm_info->num_pqs - qm_info->num_vf_pqs; |
1465 | params.num_vf_pqs = qm_info->num_vf_pqs; | 1466 | params.num_vf_pqs = qm_info->num_vf_pqs; |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c index bb70522ad362..463927f17032 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c | |||
@@ -1370,7 +1370,7 @@ qed_hw_init_pf_doorbell_bar(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) | |||
1370 | NULL) + | 1370 | NULL) + |
1371 | qed_cxt_get_proto_cid_count(p_hwfn, PROTOCOLID_ETH, | 1371 | qed_cxt_get_proto_cid_count(p_hwfn, PROTOCOLID_ETH, |
1372 | NULL); | 1372 | NULL); |
1373 | norm_regsize = roundup(QED_PF_DEMS_SIZE * non_pwm_conn, 4096); | 1373 | norm_regsize = roundup(QED_PF_DEMS_SIZE * non_pwm_conn, PAGE_SIZE); |
1374 | min_addr_reg1 = norm_regsize / 4096; | 1374 | min_addr_reg1 = norm_regsize / 4096; |
1375 | pwm_regsize = db_bar_size - norm_regsize; | 1375 | pwm_regsize = db_bar_size - norm_regsize; |
1376 | 1376 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index c67ff1411799..537d1236a4fe 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c | |||
@@ -1093,10 +1093,12 @@ static int qed_slowpath_stop(struct qed_dev *cdev) | |||
1093 | qed_free_stream_mem(cdev); | 1093 | qed_free_stream_mem(cdev); |
1094 | if (IS_QED_ETH_IF(cdev)) | 1094 | if (IS_QED_ETH_IF(cdev)) |
1095 | qed_sriov_disable(cdev, true); | 1095 | qed_sriov_disable(cdev, true); |
1096 | } | ||
1097 | |||
1098 | qed_nic_stop(cdev); | ||
1096 | 1099 | ||
1097 | qed_nic_stop(cdev); | 1100 | if (IS_PF(cdev)) |
1098 | qed_slowpath_irq_free(cdev); | 1101 | qed_slowpath_irq_free(cdev); |
1099 | } | ||
1100 | 1102 | ||
1101 | qed_disable_msix(cdev); | 1103 | qed_disable_msix(cdev); |
1102 | 1104 | ||
diff --git a/drivers/net/ethernet/qlogic/qede/qede_filter.c b/drivers/net/ethernet/qlogic/qede/qede_filter.c index eb5652073ca8..333876c19d7d 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_filter.c +++ b/drivers/net/ethernet/qlogic/qede/qede_filter.c | |||
@@ -1028,11 +1028,6 @@ int qede_xdp(struct net_device *dev, struct netdev_xdp *xdp) | |||
1028 | { | 1028 | { |
1029 | struct qede_dev *edev = netdev_priv(dev); | 1029 | struct qede_dev *edev = netdev_priv(dev); |
1030 | 1030 | ||
1031 | if (IS_VF(edev)) { | ||
1032 | DP_NOTICE(edev, "VFs don't support XDP\n"); | ||
1033 | return -EOPNOTSUPP; | ||
1034 | } | ||
1035 | |||
1036 | switch (xdp->command) { | 1031 | switch (xdp->command) { |
1037 | case XDP_SETUP_PROG: | 1032 | case XDP_SETUP_PROG: |
1038 | return qede_xdp_set(edev, xdp->prog); | 1033 | return qede_xdp_set(edev, xdp->prog); |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index b9ba23d71c61..38b77bbfe4ee 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c | |||
@@ -563,6 +563,23 @@ static const struct net_device_ops qede_netdev_ops = { | |||
563 | #endif | 563 | #endif |
564 | }; | 564 | }; |
565 | 565 | ||
566 | static const struct net_device_ops qede_netdev_vf_ops = { | ||
567 | .ndo_open = qede_open, | ||
568 | .ndo_stop = qede_close, | ||
569 | .ndo_start_xmit = qede_start_xmit, | ||
570 | .ndo_set_rx_mode = qede_set_rx_mode, | ||
571 | .ndo_set_mac_address = qede_set_mac_addr, | ||
572 | .ndo_validate_addr = eth_validate_addr, | ||
573 | .ndo_change_mtu = qede_change_mtu, | ||
574 | .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid, | ||
575 | .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid, | ||
576 | .ndo_set_features = qede_set_features, | ||
577 | .ndo_get_stats64 = qede_get_stats64, | ||
578 | .ndo_udp_tunnel_add = qede_udp_tunnel_add, | ||
579 | .ndo_udp_tunnel_del = qede_udp_tunnel_del, | ||
580 | .ndo_features_check = qede_features_check, | ||
581 | }; | ||
582 | |||
566 | /* ------------------------------------------------------------------------- | 583 | /* ------------------------------------------------------------------------- |
567 | * START OF PROBE / REMOVE | 584 | * START OF PROBE / REMOVE |
568 | * ------------------------------------------------------------------------- | 585 | * ------------------------------------------------------------------------- |
@@ -622,7 +639,10 @@ static void qede_init_ndev(struct qede_dev *edev) | |||
622 | 639 | ||
623 | ndev->watchdog_timeo = TX_TIMEOUT; | 640 | ndev->watchdog_timeo = TX_TIMEOUT; |
624 | 641 | ||
625 | ndev->netdev_ops = &qede_netdev_ops; | 642 | if (IS_VF(edev)) |
643 | ndev->netdev_ops = &qede_netdev_vf_ops; | ||
644 | else | ||
645 | ndev->netdev_ops = &qede_netdev_ops; | ||
626 | 646 | ||
627 | qede_set_ethtool_ops(ndev); | 647 | qede_set_ethtool_ops(ndev); |
628 | 648 | ||
@@ -1313,6 +1333,9 @@ static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) | |||
1313 | if (fp->type & QEDE_FASTPATH_RX) | 1333 | if (fp->type & QEDE_FASTPATH_RX) |
1314 | qede_free_mem_rxq(edev, fp->rxq); | 1334 | qede_free_mem_rxq(edev, fp->rxq); |
1315 | 1335 | ||
1336 | if (fp->type & QEDE_FASTPATH_XDP) | ||
1337 | qede_free_mem_txq(edev, fp->xdp_tx); | ||
1338 | |||
1316 | if (fp->type & QEDE_FASTPATH_TX) | 1339 | if (fp->type & QEDE_FASTPATH_TX) |
1317 | qede_free_mem_txq(edev, fp->txq); | 1340 | qede_free_mem_txq(edev, fp->txq); |
1318 | } | 1341 | } |
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c b/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c index 829be21f97b2..28ea0af89aef 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c | |||
@@ -765,7 +765,7 @@ int ql_core_dump(struct ql_adapter *qdev, struct ql_mpi_coredump *mpi_coredump) | |||
765 | sizeof(struct mpi_coredump_global_header); | 765 | sizeof(struct mpi_coredump_global_header); |
766 | mpi_coredump->mpi_global_header.imageSize = | 766 | mpi_coredump->mpi_global_header.imageSize = |
767 | sizeof(struct ql_mpi_coredump); | 767 | sizeof(struct ql_mpi_coredump); |
768 | memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump", | 768 | strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump", |
769 | sizeof(mpi_coredump->mpi_global_header.idString)); | 769 | sizeof(mpi_coredump->mpi_global_header.idString)); |
770 | 770 | ||
771 | /* Get generic NIC reg dump */ | 771 | /* Get generic NIC reg dump */ |
@@ -1255,7 +1255,7 @@ static void ql_gen_reg_dump(struct ql_adapter *qdev, | |||
1255 | sizeof(struct mpi_coredump_global_header); | 1255 | sizeof(struct mpi_coredump_global_header); |
1256 | mpi_coredump->mpi_global_header.imageSize = | 1256 | mpi_coredump->mpi_global_header.imageSize = |
1257 | sizeof(struct ql_reg_dump); | 1257 | sizeof(struct ql_reg_dump); |
1258 | memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump", | 1258 | strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump", |
1259 | sizeof(mpi_coredump->mpi_global_header.idString)); | 1259 | sizeof(mpi_coredump->mpi_global_header.idString)); |
1260 | 1260 | ||
1261 | 1261 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index 39be96779145..22f910795be4 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | |||
@@ -70,11 +70,8 @@ static int stmmac_pci_find_phy_addr(struct stmmac_pci_info *info) | |||
70 | return -ENODEV; | 70 | return -ENODEV; |
71 | } | 71 | } |
72 | 72 | ||
73 | static void stmmac_default_data(struct plat_stmmacenet_data *plat) | 73 | static void common_default_data(struct plat_stmmacenet_data *plat) |
74 | { | 74 | { |
75 | plat->bus_id = 1; | ||
76 | plat->phy_addr = 0; | ||
77 | plat->interface = PHY_INTERFACE_MODE_GMII; | ||
78 | plat->clk_csr = 2; /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */ | 75 | plat->clk_csr = 2; /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */ |
79 | plat->has_gmac = 1; | 76 | plat->has_gmac = 1; |
80 | plat->force_sf_dma_mode = 1; | 77 | plat->force_sf_dma_mode = 1; |
@@ -82,10 +79,6 @@ static void stmmac_default_data(struct plat_stmmacenet_data *plat) | |||
82 | plat->mdio_bus_data->phy_reset = NULL; | 79 | plat->mdio_bus_data->phy_reset = NULL; |
83 | plat->mdio_bus_data->phy_mask = 0; | 80 | plat->mdio_bus_data->phy_mask = 0; |
84 | 81 | ||
85 | plat->dma_cfg->pbl = 32; | ||
86 | plat->dma_cfg->pblx8 = true; | ||
87 | /* TODO: AXI */ | ||
88 | |||
89 | /* Set default value for multicast hash bins */ | 82 | /* Set default value for multicast hash bins */ |
90 | plat->multicast_filter_bins = HASH_TABLE_SIZE; | 83 | plat->multicast_filter_bins = HASH_TABLE_SIZE; |
91 | 84 | ||
@@ -107,12 +100,29 @@ static void stmmac_default_data(struct plat_stmmacenet_data *plat) | |||
107 | plat->rx_queues_cfg[0].pkt_route = 0x0; | 100 | plat->rx_queues_cfg[0].pkt_route = 0x0; |
108 | } | 101 | } |
109 | 102 | ||
103 | static void stmmac_default_data(struct plat_stmmacenet_data *plat) | ||
104 | { | ||
105 | /* Set common default data first */ | ||
106 | common_default_data(plat); | ||
107 | |||
108 | plat->bus_id = 1; | ||
109 | plat->phy_addr = 0; | ||
110 | plat->interface = PHY_INTERFACE_MODE_GMII; | ||
111 | |||
112 | plat->dma_cfg->pbl = 32; | ||
113 | plat->dma_cfg->pblx8 = true; | ||
114 | /* TODO: AXI */ | ||
115 | } | ||
116 | |||
110 | static int quark_default_data(struct plat_stmmacenet_data *plat, | 117 | static int quark_default_data(struct plat_stmmacenet_data *plat, |
111 | struct stmmac_pci_info *info) | 118 | struct stmmac_pci_info *info) |
112 | { | 119 | { |
113 | struct pci_dev *pdev = info->pdev; | 120 | struct pci_dev *pdev = info->pdev; |
114 | int ret; | 121 | int ret; |
115 | 122 | ||
123 | /* Set common default data first */ | ||
124 | common_default_data(plat); | ||
125 | |||
116 | /* | 126 | /* |
117 | * Refuse to load the driver and register net device if MAC controller | 127 | * Refuse to load the driver and register net device if MAC controller |
118 | * does not connect to any PHY interface. | 128 | * does not connect to any PHY interface. |
@@ -124,27 +134,12 @@ static int quark_default_data(struct plat_stmmacenet_data *plat, | |||
124 | plat->bus_id = PCI_DEVID(pdev->bus->number, pdev->devfn); | 134 | plat->bus_id = PCI_DEVID(pdev->bus->number, pdev->devfn); |
125 | plat->phy_addr = ret; | 135 | plat->phy_addr = ret; |
126 | plat->interface = PHY_INTERFACE_MODE_RMII; | 136 | plat->interface = PHY_INTERFACE_MODE_RMII; |
127 | plat->clk_csr = 2; | ||
128 | plat->has_gmac = 1; | ||
129 | plat->force_sf_dma_mode = 1; | ||
130 | |||
131 | plat->mdio_bus_data->phy_reset = NULL; | ||
132 | plat->mdio_bus_data->phy_mask = 0; | ||
133 | 137 | ||
134 | plat->dma_cfg->pbl = 16; | 138 | plat->dma_cfg->pbl = 16; |
135 | plat->dma_cfg->pblx8 = true; | 139 | plat->dma_cfg->pblx8 = true; |
136 | plat->dma_cfg->fixed_burst = 1; | 140 | plat->dma_cfg->fixed_burst = 1; |
137 | /* AXI (TODO) */ | 141 | /* AXI (TODO) */ |
138 | 142 | ||
139 | /* Set default value for multicast hash bins */ | ||
140 | plat->multicast_filter_bins = HASH_TABLE_SIZE; | ||
141 | |||
142 | /* Set default value for unicast filter entries */ | ||
143 | plat->unicast_filter_entries = 1; | ||
144 | |||
145 | /* Set the maxmtu to a default of JUMBO_LEN */ | ||
146 | plat->maxmtu = JUMBO_LEN; | ||
147 | |||
148 | return 0; | 143 | return 0; |
149 | } | 144 | } |
150 | 145 | ||
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index fa674a8bda0c..f4d7aec50479 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -287,6 +287,10 @@ struct cpsw_ss_regs { | |||
287 | /* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */ | 287 | /* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */ |
288 | #define CPSW_V1_SEQ_ID_OFS_SHIFT 16 | 288 | #define CPSW_V1_SEQ_ID_OFS_SHIFT 16 |
289 | 289 | ||
290 | #define CPSW_MAX_BLKS_TX 15 | ||
291 | #define CPSW_MAX_BLKS_TX_SHIFT 4 | ||
292 | #define CPSW_MAX_BLKS_RX 5 | ||
293 | |||
290 | struct cpsw_host_regs { | 294 | struct cpsw_host_regs { |
291 | u32 max_blks; | 295 | u32 max_blks; |
292 | u32 blk_cnt; | 296 | u32 blk_cnt; |
@@ -1278,11 +1282,23 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv) | |||
1278 | switch (cpsw->version) { | 1282 | switch (cpsw->version) { |
1279 | case CPSW_VERSION_1: | 1283 | case CPSW_VERSION_1: |
1280 | slave_write(slave, TX_PRIORITY_MAPPING, CPSW1_TX_PRI_MAP); | 1284 | slave_write(slave, TX_PRIORITY_MAPPING, CPSW1_TX_PRI_MAP); |
1285 | /* Increase RX FIFO size to 5 for supporting fullduplex | ||
1286 | * flow control mode | ||
1287 | */ | ||
1288 | slave_write(slave, | ||
1289 | (CPSW_MAX_BLKS_TX << CPSW_MAX_BLKS_TX_SHIFT) | | ||
1290 | CPSW_MAX_BLKS_RX, CPSW1_MAX_BLKS); | ||
1281 | break; | 1291 | break; |
1282 | case CPSW_VERSION_2: | 1292 | case CPSW_VERSION_2: |
1283 | case CPSW_VERSION_3: | 1293 | case CPSW_VERSION_3: |
1284 | case CPSW_VERSION_4: | 1294 | case CPSW_VERSION_4: |
1285 | slave_write(slave, TX_PRIORITY_MAPPING, CPSW2_TX_PRI_MAP); | 1295 | slave_write(slave, TX_PRIORITY_MAPPING, CPSW2_TX_PRI_MAP); |
1296 | /* Increase RX FIFO size to 5 for supporting fullduplex | ||
1297 | * flow control mode | ||
1298 | */ | ||
1299 | slave_write(slave, | ||
1300 | (CPSW_MAX_BLKS_TX << CPSW_MAX_BLKS_TX_SHIFT) | | ||
1301 | CPSW_MAX_BLKS_RX, CPSW2_MAX_BLKS); | ||
1286 | break; | 1302 | break; |
1287 | } | 1303 | } |
1288 | 1304 | ||
diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c index b6891ada1d7b..7a7c5224a336 100644 --- a/drivers/net/hamradio/yam.c +++ b/drivers/net/hamradio/yam.c | |||
@@ -976,12 +976,10 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
976 | case SIOCYAMSMCS: | 976 | case SIOCYAMSMCS: |
977 | if (netif_running(dev)) | 977 | if (netif_running(dev)) |
978 | return -EINVAL; /* Cannot change this parameter when up */ | 978 | return -EINVAL; /* Cannot change this parameter when up */ |
979 | if ((ym = kmalloc(sizeof(struct yamdrv_ioctl_mcs), GFP_KERNEL)) == NULL) | 979 | ym = memdup_user(ifr->ifr_data, |
980 | return -ENOBUFS; | 980 | sizeof(struct yamdrv_ioctl_mcs)); |
981 | if (copy_from_user(ym, ifr->ifr_data, sizeof(struct yamdrv_ioctl_mcs))) { | 981 | if (IS_ERR(ym)) |
982 | kfree(ym); | 982 | return PTR_ERR(ym); |
983 | return -EFAULT; | ||
984 | } | ||
985 | if (ym->bitrate > YAM_MAXBITRATE) { | 983 | if (ym->bitrate > YAM_MAXBITRATE) { |
986 | kfree(ym); | 984 | kfree(ym); |
987 | return -EINVAL; | 985 | return -EINVAL; |
diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c index 9b0d6148e994..1ce6239a4849 100644 --- a/drivers/net/hippi/rrunner.c +++ b/drivers/net/hippi/rrunner.c | |||
@@ -1616,17 +1616,14 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
1616 | return -EPERM; | 1616 | return -EPERM; |
1617 | } | 1617 | } |
1618 | 1618 | ||
1619 | image = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL); | 1619 | image = memdup_user(rq->ifr_data, EEPROM_BYTES); |
1620 | oldimage = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL); | 1620 | if (IS_ERR(image)) |
1621 | if (!image || !oldimage) { | 1621 | return PTR_ERR(image); |
1622 | error = -ENOMEM; | ||
1623 | goto wf_out; | ||
1624 | } | ||
1625 | 1622 | ||
1626 | error = copy_from_user(image, rq->ifr_data, EEPROM_BYTES); | 1623 | oldimage = kmalloc(EEPROM_BYTES, GFP_KERNEL); |
1627 | if (error) { | 1624 | if (!oldimage) { |
1628 | error = -EFAULT; | 1625 | kfree(image); |
1629 | goto wf_out; | 1626 | return -ENOMEM; |
1630 | } | 1627 | } |
1631 | 1628 | ||
1632 | if (rrpriv->fw_running){ | 1629 | if (rrpriv->fw_running){ |
diff --git a/drivers/net/phy/mdio-mux-bcm-iproc.c b/drivers/net/phy/mdio-mux-bcm-iproc.c index 0a0412524cec..0a5f62e0efcc 100644 --- a/drivers/net/phy/mdio-mux-bcm-iproc.c +++ b/drivers/net/phy/mdio-mux-bcm-iproc.c | |||
@@ -203,11 +203,14 @@ static int mdio_mux_iproc_probe(struct platform_device *pdev) | |||
203 | &md->mux_handle, md, md->mii_bus); | 203 | &md->mux_handle, md, md->mii_bus); |
204 | if (rc) { | 204 | if (rc) { |
205 | dev_info(md->dev, "mdiomux initialization failed\n"); | 205 | dev_info(md->dev, "mdiomux initialization failed\n"); |
206 | goto out; | 206 | goto out_register; |
207 | } | 207 | } |
208 | 208 | ||
209 | dev_info(md->dev, "iProc mdiomux registered\n"); | 209 | dev_info(md->dev, "iProc mdiomux registered\n"); |
210 | return 0; | 210 | return 0; |
211 | |||
212 | out_register: | ||
213 | mdiobus_unregister(bus); | ||
211 | out: | 214 | out: |
212 | mdiobus_free(bus); | 215 | mdiobus_free(bus); |
213 | return rc; | 216 | return rc; |
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index bb3f71f9fbde..b5cec1824a78 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -1088,6 +1088,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) | |||
1088 | u16 n = 0, index, ndplen; | 1088 | u16 n = 0, index, ndplen; |
1089 | u8 ready2send = 0; | 1089 | u8 ready2send = 0; |
1090 | u32 delayed_ndp_size; | 1090 | u32 delayed_ndp_size; |
1091 | size_t padding_count; | ||
1091 | 1092 | ||
1092 | /* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated | 1093 | /* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated |
1093 | * accordingly. Otherwise, we should check here. | 1094 | * accordingly. Otherwise, we should check here. |
@@ -1244,11 +1245,13 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) | |||
1244 | * a ZLP after full sized NTBs. | 1245 | * a ZLP after full sized NTBs. |
1245 | */ | 1246 | */ |
1246 | if (!(dev->driver_info->flags & FLAG_SEND_ZLP) && | 1247 | if (!(dev->driver_info->flags & FLAG_SEND_ZLP) && |
1247 | skb_out->len > ctx->min_tx_pkt) | 1248 | skb_out->len > ctx->min_tx_pkt) { |
1248 | memset(skb_put(skb_out, ctx->tx_max - skb_out->len), 0, | 1249 | padding_count = ctx->tx_max - skb_out->len; |
1249 | ctx->tx_max - skb_out->len); | 1250 | memset(skb_put(skb_out, padding_count), 0, padding_count); |
1250 | else if (skb_out->len < ctx->tx_max && (skb_out->len % dev->maxpacket) == 0) | 1251 | } else if (skb_out->len < ctx->tx_max && |
1252 | (skb_out->len % dev->maxpacket) == 0) { | ||
1251 | *skb_put(skb_out, 1) = 0; /* force short packet */ | 1253 | *skb_put(skb_out, 1) = 0; /* force short packet */ |
1254 | } | ||
1252 | 1255 | ||
1253 | /* set final frame length */ | 1256 | /* set final frame length */ |
1254 | nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data; | 1257 | nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data; |
diff --git a/drivers/net/wimax/i2400m/i2400m-usb.h b/drivers/net/wimax/i2400m/i2400m-usb.h index 649ecad6844c..eff4f464a23e 100644 --- a/drivers/net/wimax/i2400m/i2400m-usb.h +++ b/drivers/net/wimax/i2400m/i2400m-usb.h | |||
@@ -131,7 +131,7 @@ static inline int edc_inc(struct edc *edc, u16 max_err, u16 timeframe) | |||
131 | unsigned long now; | 131 | unsigned long now; |
132 | 132 | ||
133 | now = jiffies; | 133 | now = jiffies; |
134 | if (now - edc->timestart > timeframe) { | 134 | if (time_after(now, edc->timestart + timeframe)) { |
135 | edc->errorcount = 1; | 135 | edc->errorcount = 1; |
136 | edc->timestart = now; | 136 | edc->timestart = now; |
137 | } else if (++edc->errorcount > max_err) { | 137 | } else if (++edc->errorcount > max_err) { |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index 68fcbe03bce2..b3f20b3c0210 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | |||
@@ -522,7 +522,7 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs, | |||
522 | rxs->rs_moreaggr = (rxsp->status11 & AR_RxMoreAggr) ? 1 : 0; | 522 | rxs->rs_moreaggr = (rxsp->status11 & AR_RxMoreAggr) ? 1 : 0; |
523 | rxs->rs_antenna = (MS(rxsp->status4, AR_RxAntenna) & 0x7); | 523 | rxs->rs_antenna = (MS(rxsp->status4, AR_RxAntenna) & 0x7); |
524 | rxs->enc_flags |= (rxsp->status4 & AR_GI) ? RX_ENC_FLAG_SHORT_GI : 0; | 524 | rxs->enc_flags |= (rxsp->status4 & AR_GI) ? RX_ENC_FLAG_SHORT_GI : 0; |
525 | rxs->enc_flags |= (rxsp->status4 & AR_2040) ? RX_ENC_FLAG_40MHZ : 0; | 525 | rxs->bw = (rxsp->status4 & AR_2040) ? RATE_INFO_BW_40 : RATE_INFO_BW_20; |
526 | 526 | ||
527 | rxs->evm0 = rxsp->status6; | 527 | rxs->evm0 = rxsp->status6; |
528 | rxs->evm1 = rxsp->status7; | 528 | rxs->evm1 = rxsp->status7; |
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 6128c2bb23d8..77c94f9e7b61 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c | |||
@@ -580,8 +580,8 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, | |||
580 | /* directly mapped flags for ieee80211_rx_status */ | 580 | /* directly mapped flags for ieee80211_rx_status */ |
581 | rs->enc_flags |= | 581 | rs->enc_flags |= |
582 | (ads.ds_rxstatus3 & AR_GI) ? RX_ENC_FLAG_SHORT_GI : 0; | 582 | (ads.ds_rxstatus3 & AR_GI) ? RX_ENC_FLAG_SHORT_GI : 0; |
583 | rs->enc_flags |= | 583 | rs->bw = (ads.ds_rxstatus3 & AR_2040) ? RATE_INFO_BW_40 : |
584 | (ads.ds_rxstatus3 & AR_2040) ? RX_ENC_FLAG_40MHZ : 0; | 584 | RATE_INFO_BW_20; |
585 | if (AR_SREV_9280_20_OR_LATER(ah)) | 585 | if (AR_SREV_9280_20_OR_LATER(ah)) |
586 | rs->enc_flags |= | 586 | rs->enc_flags |= |
587 | (ads.ds_rxstatus3 & AR_STBC) ? | 587 | (ads.ds_rxstatus3 & AR_STBC) ? |
diff --git a/drivers/net/wireless/intel/iwlegacy/4965-mac.c b/drivers/net/wireless/intel/iwlegacy/4965-mac.c index 5d5faa3cad24..49a2ff15ddae 100644 --- a/drivers/net/wireless/intel/iwlegacy/4965-mac.c +++ b/drivers/net/wireless/intel/iwlegacy/4965-mac.c | |||
@@ -734,7 +734,9 @@ il4965_hdl_rx(struct il_priv *il, struct il_rx_buf *rxb) | |||
734 | if (rate_n_flags & RATE_MCS_HT_MSK) | 734 | if (rate_n_flags & RATE_MCS_HT_MSK) |
735 | rx_status.encoding = RX_ENC_HT; | 735 | rx_status.encoding = RX_ENC_HT; |
736 | if (rate_n_flags & RATE_MCS_HT40_MSK) | 736 | if (rate_n_flags & RATE_MCS_HT40_MSK) |
737 | rx_status.enc_flags |= RX_ENC_FLAG_40MHZ; | 737 | rx_status.bw = RATE_INFO_BW_40; |
738 | else | ||
739 | rx_status.bw = RATE_INFO_BW_20; | ||
738 | if (rate_n_flags & RATE_MCS_SGI_MSK) | 740 | if (rate_n_flags & RATE_MCS_SGI_MSK) |
739 | rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI; | 741 | rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI; |
740 | 742 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rx.c b/drivers/net/wireless/intel/iwlwifi/dvm/rx.c index 1ee1ba9931a7..adfd6307edca 100644 --- a/drivers/net/wireless/intel/iwlwifi/dvm/rx.c +++ b/drivers/net/wireless/intel/iwlwifi/dvm/rx.c | |||
@@ -889,7 +889,9 @@ static void iwlagn_rx_reply_rx(struct iwl_priv *priv, | |||
889 | if (rate_n_flags & RATE_MCS_HT_MSK) | 889 | if (rate_n_flags & RATE_MCS_HT_MSK) |
890 | rx_status.encoding = RX_ENC_HT; | 890 | rx_status.encoding = RX_ENC_HT; |
891 | if (rate_n_flags & RATE_MCS_HT40_MSK) | 891 | if (rate_n_flags & RATE_MCS_HT40_MSK) |
892 | rx_status.enc_flags |= RX_ENC_FLAG_40MHZ; | 892 | rx_status.bw = RATE_INFO_BW_40; |
893 | else | ||
894 | rx_status.bw = RATE_INFO_BW_20; | ||
893 | if (rate_n_flags & RATE_MCS_SGI_MSK) | 895 | if (rate_n_flags & RATE_MCS_SGI_MSK) |
894 | rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI; | 896 | rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI; |
895 | if (rate_n_flags & RATE_MCS_GF_MSK) | 897 | if (rate_n_flags & RATE_MCS_GF_MSK) |
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 87444af20fc5..002b25cff5b6 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
@@ -1201,7 +1201,13 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw, | |||
1201 | rx_status.encoding = RX_ENC_HT; | 1201 | rx_status.encoding = RX_ENC_HT; |
1202 | } | 1202 | } |
1203 | if (info->control.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) | 1203 | if (info->control.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) |
1204 | rx_status.enc_flags |= RX_ENC_FLAG_40MHZ; | 1204 | rx_status.bw = RATE_INFO_BW_40; |
1205 | else if (info->control.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH) | ||
1206 | rx_status.bw = RATE_INFO_BW_80; | ||
1207 | else if (info->control.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH) | ||
1208 | rx_status.bw = RATE_INFO_BW_160; | ||
1209 | else | ||
1210 | rx_status.bw = RATE_INFO_BW_20; | ||
1205 | if (info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI) | 1211 | if (info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI) |
1206 | rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI; | 1212 | rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI; |
1207 | /* TODO: simulate real signal strength (and optional packet loss) */ | 1213 | /* TODO: simulate real signal strength (and optional packet loss) */ |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 2452e6449532..b43a4eec3cec 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
@@ -20,6 +20,8 @@ | |||
20 | #define ADDRCONF_TIMER_FUZZ (HZ / 4) | 20 | #define ADDRCONF_TIMER_FUZZ (HZ / 4) |
21 | #define ADDRCONF_TIMER_FUZZ_MAX (HZ) | 21 | #define ADDRCONF_TIMER_FUZZ_MAX (HZ) |
22 | 22 | ||
23 | #define ADDRCONF_NOTIFY_PRIORITY 0 | ||
24 | |||
23 | #include <linux/in.h> | 25 | #include <linux/in.h> |
24 | #include <linux/in6.h> | 26 | #include <linux/in6.h> |
25 | 27 | ||
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 15d6599b8bc6..b083e6cbae8c 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -1666,7 +1666,7 @@ struct cfg80211_bss_select_adjust { | |||
1666 | * (others are filtered out). | 1666 | * (others are filtered out). |
1667 | * If ommited, all results are passed. | 1667 | * If ommited, all results are passed. |
1668 | * @n_match_sets: number of match sets | 1668 | * @n_match_sets: number of match sets |
1669 | * @results_wk: worker for processing results notification. | 1669 | * @report_results: indicates that results were reported for this request |
1670 | * @wiphy: the wiphy this was for | 1670 | * @wiphy: the wiphy this was for |
1671 | * @dev: the interface | 1671 | * @dev: the interface |
1672 | * @scan_start: start time of the scheduled scan | 1672 | * @scan_start: start time of the scheduled scan |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 4d05a9443344..76ed24a201eb 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1141,7 +1141,6 @@ enum mac80211_rx_flags { | |||
1141 | * enum mac80211_rx_encoding_flags - MCS & bandwidth flags | 1141 | * enum mac80211_rx_encoding_flags - MCS & bandwidth flags |
1142 | * | 1142 | * |
1143 | * @RX_ENC_FLAG_SHORTPRE: Short preamble was used for this frame | 1143 | * @RX_ENC_FLAG_SHORTPRE: Short preamble was used for this frame |
1144 | * @RX_ENC_FLAG_40MHZ: HT40 (40 MHz) was used | ||
1145 | * @RX_ENC_FLAG_SHORT_GI: Short guard interval was used | 1144 | * @RX_ENC_FLAG_SHORT_GI: Short guard interval was used |
1146 | * @RX_ENC_FLAG_HT_GF: This frame was received in a HT-greenfield transmission, | 1145 | * @RX_ENC_FLAG_HT_GF: This frame was received in a HT-greenfield transmission, |
1147 | * if the driver fills this value it should add | 1146 | * if the driver fills this value it should add |
@@ -1153,7 +1152,6 @@ enum mac80211_rx_flags { | |||
1153 | */ | 1152 | */ |
1154 | enum mac80211_rx_encoding_flags { | 1153 | enum mac80211_rx_encoding_flags { |
1155 | RX_ENC_FLAG_SHORTPRE = BIT(0), | 1154 | RX_ENC_FLAG_SHORTPRE = BIT(0), |
1156 | RX_ENC_FLAG_40MHZ = BIT(1), | ||
1157 | RX_ENC_FLAG_SHORT_GI = BIT(2), | 1155 | RX_ENC_FLAG_SHORT_GI = BIT(2), |
1158 | RX_ENC_FLAG_HT_GF = BIT(3), | 1156 | RX_ENC_FLAG_HT_GF = BIT(3), |
1159 | RX_ENC_FLAG_STBC_MASK = BIT(4) | BIT(5), | 1157 | RX_ENC_FLAG_STBC_MASK = BIT(4) | BIT(5), |
diff --git a/include/net/secure_seq.h b/include/net/secure_seq.h index fe236b3429f0..b94006f6fbdd 100644 --- a/include/net/secure_seq.h +++ b/include/net/secure_seq.h | |||
@@ -6,10 +6,12 @@ | |||
6 | u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); | 6 | u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); |
7 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | 7 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, |
8 | __be16 dport); | 8 | __be16 dport); |
9 | u32 secure_tcp_seq_and_tsoff(__be32 saddr, __be32 daddr, | 9 | u32 secure_tcp_seq(__be32 saddr, __be32 daddr, |
10 | __be16 sport, __be16 dport, u32 *tsoff); | 10 | __be16 sport, __be16 dport); |
11 | u32 secure_tcpv6_seq_and_tsoff(const __be32 *saddr, const __be32 *daddr, | 11 | u32 secure_tcp_ts_off(__be32 saddr, __be32 daddr); |
12 | __be16 sport, __be16 dport, u32 *tsoff); | 12 | u32 secure_tcpv6_seq(const __be32 *saddr, const __be32 *daddr, |
13 | __be16 sport, __be16 dport); | ||
14 | u32 secure_tcpv6_ts_off(const __be32 *saddr, const __be32 *daddr); | ||
13 | u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | 15 | u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, |
14 | __be16 sport, __be16 dport); | 16 | __be16 sport, __be16 dport); |
15 | u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr, | 17 | u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr, |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 270e5cc43c99..38a7427ae902 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -470,7 +470,7 @@ void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb); | |||
470 | /* From syncookies.c */ | 470 | /* From syncookies.c */ |
471 | struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, | 471 | struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, |
472 | struct request_sock *req, | 472 | struct request_sock *req, |
473 | struct dst_entry *dst); | 473 | struct dst_entry *dst, u32 tsoff); |
474 | int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th, | 474 | int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th, |
475 | u32 cookie); | 475 | u32 cookie); |
476 | struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb); | 476 | struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb); |
@@ -1234,10 +1234,12 @@ void tcp_cwnd_restart(struct sock *sk, s32 delta); | |||
1234 | 1234 | ||
1235 | static inline void tcp_slow_start_after_idle_check(struct sock *sk) | 1235 | static inline void tcp_slow_start_after_idle_check(struct sock *sk) |
1236 | { | 1236 | { |
1237 | const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; | ||
1237 | struct tcp_sock *tp = tcp_sk(sk); | 1238 | struct tcp_sock *tp = tcp_sk(sk); |
1238 | s32 delta; | 1239 | s32 delta; |
1239 | 1240 | ||
1240 | if (!sysctl_tcp_slow_start_after_idle || tp->packets_out) | 1241 | if (!sysctl_tcp_slow_start_after_idle || tp->packets_out || |
1242 | ca_ops->cong_control) | ||
1241 | return; | 1243 | return; |
1242 | delta = tcp_time_stamp - tp->lsndtime; | 1244 | delta = tcp_time_stamp - tp->lsndtime; |
1243 | if (delta > inet_csk(sk)->icsk_rto) | 1245 | if (delta > inet_csk(sk)->icsk_rto) |
@@ -1822,7 +1824,8 @@ struct tcp_request_sock_ops { | |||
1822 | #endif | 1824 | #endif |
1823 | struct dst_entry *(*route_req)(const struct sock *sk, struct flowi *fl, | 1825 | struct dst_entry *(*route_req)(const struct sock *sk, struct flowi *fl, |
1824 | const struct request_sock *req); | 1826 | const struct request_sock *req); |
1825 | __u32 (*init_seq_tsoff)(const struct sk_buff *skb, u32 *tsoff); | 1827 | u32 (*init_seq)(const struct sk_buff *skb); |
1828 | u32 (*init_ts_off)(const struct sk_buff *skb); | ||
1826 | int (*send_synack)(const struct sock *sk, struct dst_entry *dst, | 1829 | int (*send_synack)(const struct sock *sk, struct dst_entry *dst, |
1827 | struct flowi *fl, struct request_sock *req, | 1830 | struct flowi *fl, struct request_sock *req, |
1828 | struct tcp_fastopen_cookie *foc, | 1831 | struct tcp_fastopen_cookie *foc, |
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index c2ff608c1984..c5b56c92f8e2 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
@@ -298,7 +298,8 @@ static const char *const bpf_jmp_string[16] = { | |||
298 | [BPF_EXIT >> 4] = "exit", | 298 | [BPF_EXIT >> 4] = "exit", |
299 | }; | 299 | }; |
300 | 300 | ||
301 | static void print_bpf_insn(struct bpf_insn *insn) | 301 | static void print_bpf_insn(const struct bpf_verifier_env *env, |
302 | const struct bpf_insn *insn) | ||
302 | { | 303 | { |
303 | u8 class = BPF_CLASS(insn->code); | 304 | u8 class = BPF_CLASS(insn->code); |
304 | 305 | ||
@@ -362,9 +363,19 @@ static void print_bpf_insn(struct bpf_insn *insn) | |||
362 | insn->code, | 363 | insn->code, |
363 | bpf_ldst_string[BPF_SIZE(insn->code) >> 3], | 364 | bpf_ldst_string[BPF_SIZE(insn->code) >> 3], |
364 | insn->src_reg, insn->imm); | 365 | insn->src_reg, insn->imm); |
365 | } else if (BPF_MODE(insn->code) == BPF_IMM) { | 366 | } else if (BPF_MODE(insn->code) == BPF_IMM && |
366 | verbose("(%02x) r%d = 0x%x\n", | 367 | BPF_SIZE(insn->code) == BPF_DW) { |
367 | insn->code, insn->dst_reg, insn->imm); | 368 | /* At this point, we already made sure that the second |
369 | * part of the ldimm64 insn is accessible. | ||
370 | */ | ||
371 | u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm; | ||
372 | bool map_ptr = insn->src_reg == BPF_PSEUDO_MAP_FD; | ||
373 | |||
374 | if (map_ptr && !env->allow_ptr_leaks) | ||
375 | imm = 0; | ||
376 | |||
377 | verbose("(%02x) r%d = 0x%llx\n", insn->code, | ||
378 | insn->dst_reg, (unsigned long long)imm); | ||
368 | } else { | 379 | } else { |
369 | verbose("BUG_ld_%02x\n", insn->code); | 380 | verbose("BUG_ld_%02x\n", insn->code); |
370 | return; | 381 | return; |
@@ -2853,7 +2864,7 @@ static int do_check(struct bpf_verifier_env *env) | |||
2853 | 2864 | ||
2854 | if (log_level) { | 2865 | if (log_level) { |
2855 | verbose("%d: ", insn_idx); | 2866 | verbose("%d: ", insn_idx); |
2856 | print_bpf_insn(insn); | 2867 | print_bpf_insn(env, insn); |
2857 | } | 2868 | } |
2858 | 2869 | ||
2859 | err = ext_analyzer_insn_hook(env, insn_idx, prev_insn_idx); | 2870 | err = ext_analyzer_insn_hook(env, insn_idx, prev_insn_idx); |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 9ee5787634e5..953b6728bd00 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -626,11 +626,18 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev, | |||
626 | { | 626 | { |
627 | struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; | 627 | struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; |
628 | netdev_features_t old_features = features; | 628 | netdev_features_t old_features = features; |
629 | netdev_features_t lower_features; | ||
629 | 630 | ||
630 | features = netdev_intersect_features(features, real_dev->vlan_features); | 631 | lower_features = netdev_intersect_features((real_dev->vlan_features | |
631 | features |= NETIF_F_RXCSUM; | 632 | NETIF_F_RXCSUM), |
632 | features = netdev_intersect_features(features, real_dev->features); | 633 | real_dev->features); |
633 | 634 | ||
635 | /* Add HW_CSUM setting to preserve user ability to control | ||
636 | * checksum offload on the vlan device. | ||
637 | */ | ||
638 | if (lower_features & (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM)) | ||
639 | lower_features |= NETIF_F_HW_CSUM; | ||
640 | features = netdev_intersect_features(features, lower_features); | ||
634 | features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE); | 641 | features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE); |
635 | features |= NETIF_F_LLTX; | 642 | features |= NETIF_F_LLTX; |
636 | 643 | ||
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index a572db710d4e..c5ce7745b230 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -133,6 +133,8 @@ static inline size_t br_port_info_size(void) | |||
133 | + nla_total_size(1) /* IFLA_BRPORT_MCAST_TO_UCAST */ | 133 | + nla_total_size(1) /* IFLA_BRPORT_MCAST_TO_UCAST */ |
134 | + nla_total_size(1) /* IFLA_BRPORT_LEARNING */ | 134 | + nla_total_size(1) /* IFLA_BRPORT_LEARNING */ |
135 | + nla_total_size(1) /* IFLA_BRPORT_UNICAST_FLOOD */ | 135 | + nla_total_size(1) /* IFLA_BRPORT_UNICAST_FLOOD */ |
136 | + nla_total_size(1) /* IFLA_BRPORT_MCAST_FLOOD */ | ||
137 | + nla_total_size(1) /* IFLA_BRPORT_BCAST_FLOOD */ | ||
136 | + nla_total_size(1) /* IFLA_BRPORT_PROXYARP */ | 138 | + nla_total_size(1) /* IFLA_BRPORT_PROXYARP */ |
137 | + nla_total_size(1) /* IFLA_BRPORT_PROXYARP_WIFI */ | 139 | + nla_total_size(1) /* IFLA_BRPORT_PROXYARP_WIFI */ |
138 | + nla_total_size(1) /* IFLA_BRPORT_VLAN_TUNNEL */ | 140 | + nla_total_size(1) /* IFLA_BRPORT_VLAN_TUNNEL */ |
@@ -633,6 +635,8 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = { | |||
633 | [IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 }, | 635 | [IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 }, |
634 | [IFLA_BRPORT_MULTICAST_ROUTER] = { .type = NLA_U8 }, | 636 | [IFLA_BRPORT_MULTICAST_ROUTER] = { .type = NLA_U8 }, |
635 | [IFLA_BRPORT_MCAST_TO_UCAST] = { .type = NLA_U8 }, | 637 | [IFLA_BRPORT_MCAST_TO_UCAST] = { .type = NLA_U8 }, |
638 | [IFLA_BRPORT_MCAST_FLOOD] = { .type = NLA_U8 }, | ||
639 | [IFLA_BRPORT_BCAST_FLOOD] = { .type = NLA_U8 }, | ||
636 | }; | 640 | }; |
637 | 641 | ||
638 | /* Change the state of the port and notify spanning tree */ | 642 | /* Change the state of the port and notify spanning tree */ |
diff --git a/net/core/secure_seq.c b/net/core/secure_seq.c index 6bd2f8fb0476..ae35cce3a40d 100644 --- a/net/core/secure_seq.c +++ b/net/core/secure_seq.c | |||
@@ -24,9 +24,13 @@ static siphash_key_t ts_secret __read_mostly; | |||
24 | 24 | ||
25 | static __always_inline void net_secret_init(void) | 25 | static __always_inline void net_secret_init(void) |
26 | { | 26 | { |
27 | net_get_random_once(&ts_secret, sizeof(ts_secret)); | ||
28 | net_get_random_once(&net_secret, sizeof(net_secret)); | 27 | net_get_random_once(&net_secret, sizeof(net_secret)); |
29 | } | 28 | } |
29 | |||
30 | static __always_inline void ts_secret_init(void) | ||
31 | { | ||
32 | net_get_random_once(&ts_secret, sizeof(ts_secret)); | ||
33 | } | ||
30 | #endif | 34 | #endif |
31 | 35 | ||
32 | #ifdef CONFIG_INET | 36 | #ifdef CONFIG_INET |
@@ -47,7 +51,7 @@ static u32 seq_scale(u32 seq) | |||
47 | #endif | 51 | #endif |
48 | 52 | ||
49 | #if IS_ENABLED(CONFIG_IPV6) | 53 | #if IS_ENABLED(CONFIG_IPV6) |
50 | static u32 secure_tcpv6_ts_off(const __be32 *saddr, const __be32 *daddr) | 54 | u32 secure_tcpv6_ts_off(const __be32 *saddr, const __be32 *daddr) |
51 | { | 55 | { |
52 | const struct { | 56 | const struct { |
53 | struct in6_addr saddr; | 57 | struct in6_addr saddr; |
@@ -60,12 +64,14 @@ static u32 secure_tcpv6_ts_off(const __be32 *saddr, const __be32 *daddr) | |||
60 | if (sysctl_tcp_timestamps != 1) | 64 | if (sysctl_tcp_timestamps != 1) |
61 | return 0; | 65 | return 0; |
62 | 66 | ||
67 | ts_secret_init(); | ||
63 | return siphash(&combined, offsetofend(typeof(combined), daddr), | 68 | return siphash(&combined, offsetofend(typeof(combined), daddr), |
64 | &ts_secret); | 69 | &ts_secret); |
65 | } | 70 | } |
71 | EXPORT_SYMBOL(secure_tcpv6_ts_off); | ||
66 | 72 | ||
67 | u32 secure_tcpv6_seq_and_tsoff(const __be32 *saddr, const __be32 *daddr, | 73 | u32 secure_tcpv6_seq(const __be32 *saddr, const __be32 *daddr, |
68 | __be16 sport, __be16 dport, u32 *tsoff) | 74 | __be16 sport, __be16 dport) |
69 | { | 75 | { |
70 | const struct { | 76 | const struct { |
71 | struct in6_addr saddr; | 77 | struct in6_addr saddr; |
@@ -78,14 +84,14 @@ u32 secure_tcpv6_seq_and_tsoff(const __be32 *saddr, const __be32 *daddr, | |||
78 | .sport = sport, | 84 | .sport = sport, |
79 | .dport = dport | 85 | .dport = dport |
80 | }; | 86 | }; |
81 | u64 hash; | 87 | u32 hash; |
88 | |||
82 | net_secret_init(); | 89 | net_secret_init(); |
83 | hash = siphash(&combined, offsetofend(typeof(combined), dport), | 90 | hash = siphash(&combined, offsetofend(typeof(combined), dport), |
84 | &net_secret); | 91 | &net_secret); |
85 | *tsoff = secure_tcpv6_ts_off(saddr, daddr); | ||
86 | return seq_scale(hash); | 92 | return seq_scale(hash); |
87 | } | 93 | } |
88 | EXPORT_SYMBOL(secure_tcpv6_seq_and_tsoff); | 94 | EXPORT_SYMBOL(secure_tcpv6_seq); |
89 | 95 | ||
90 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | 96 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, |
91 | __be16 dport) | 97 | __be16 dport) |
@@ -107,11 +113,12 @@ EXPORT_SYMBOL(secure_ipv6_port_ephemeral); | |||
107 | #endif | 113 | #endif |
108 | 114 | ||
109 | #ifdef CONFIG_INET | 115 | #ifdef CONFIG_INET |
110 | static u32 secure_tcp_ts_off(__be32 saddr, __be32 daddr) | 116 | u32 secure_tcp_ts_off(__be32 saddr, __be32 daddr) |
111 | { | 117 | { |
112 | if (sysctl_tcp_timestamps != 1) | 118 | if (sysctl_tcp_timestamps != 1) |
113 | return 0; | 119 | return 0; |
114 | 120 | ||
121 | ts_secret_init(); | ||
115 | return siphash_2u32((__force u32)saddr, (__force u32)daddr, | 122 | return siphash_2u32((__force u32)saddr, (__force u32)daddr, |
116 | &ts_secret); | 123 | &ts_secret); |
117 | } | 124 | } |
@@ -121,15 +128,15 @@ static u32 secure_tcp_ts_off(__be32 saddr, __be32 daddr) | |||
121 | * it would be easy enough to have the former function use siphash_4u32, passing | 128 | * it would be easy enough to have the former function use siphash_4u32, passing |
122 | * the arguments as separate u32. | 129 | * the arguments as separate u32. |
123 | */ | 130 | */ |
124 | u32 secure_tcp_seq_and_tsoff(__be32 saddr, __be32 daddr, | 131 | u32 secure_tcp_seq(__be32 saddr, __be32 daddr, |
125 | __be16 sport, __be16 dport, u32 *tsoff) | 132 | __be16 sport, __be16 dport) |
126 | { | 133 | { |
127 | u64 hash; | 134 | u32 hash; |
135 | |||
128 | net_secret_init(); | 136 | net_secret_init(); |
129 | hash = siphash_3u32((__force u32)saddr, (__force u32)daddr, | 137 | hash = siphash_3u32((__force u32)saddr, (__force u32)daddr, |
130 | (__force u32)sport << 16 | (__force u32)dport, | 138 | (__force u32)sport << 16 | (__force u32)dport, |
131 | &net_secret); | 139 | &net_secret); |
132 | *tsoff = secure_tcp_ts_off(saddr, daddr); | ||
133 | return seq_scale(hash); | 140 | return seq_scale(hash); |
134 | } | 141 | } |
135 | 142 | ||
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 482730cd8a56..eeb5fc561f80 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c | |||
@@ -110,7 +110,7 @@ struct neigh_table dn_neigh_table = { | |||
110 | static int dn_neigh_construct(struct neighbour *neigh) | 110 | static int dn_neigh_construct(struct neighbour *neigh) |
111 | { | 111 | { |
112 | struct net_device *dev = neigh->dev; | 112 | struct net_device *dev = neigh->dev; |
113 | struct dn_neigh *dn = (struct dn_neigh *)neigh; | 113 | struct dn_neigh *dn = container_of(neigh, struct dn_neigh, n); |
114 | struct dn_dev *dn_db; | 114 | struct dn_dev *dn_db; |
115 | struct neigh_parms *parms; | 115 | struct neigh_parms *parms; |
116 | 116 | ||
@@ -339,7 +339,7 @@ int dn_to_neigh_output(struct net *net, struct sock *sk, struct sk_buff *skb) | |||
339 | struct dst_entry *dst = skb_dst(skb); | 339 | struct dst_entry *dst = skb_dst(skb); |
340 | struct dn_route *rt = (struct dn_route *) dst; | 340 | struct dn_route *rt = (struct dn_route *) dst; |
341 | struct neighbour *neigh = rt->n; | 341 | struct neighbour *neigh = rt->n; |
342 | struct dn_neigh *dn = (struct dn_neigh *)neigh; | 342 | struct dn_neigh *dn = container_of(neigh, struct dn_neigh, n); |
343 | struct dn_dev *dn_db; | 343 | struct dn_dev *dn_db; |
344 | bool use_long; | 344 | bool use_long; |
345 | 345 | ||
@@ -391,7 +391,7 @@ int dn_neigh_router_hello(struct net *net, struct sock *sk, struct sk_buff *skb) | |||
391 | 391 | ||
392 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); | 392 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); |
393 | 393 | ||
394 | dn = (struct dn_neigh *)neigh; | 394 | dn = container_of(neigh, struct dn_neigh, n); |
395 | 395 | ||
396 | if (neigh) { | 396 | if (neigh) { |
397 | write_lock(&neigh->lock); | 397 | write_lock(&neigh->lock); |
@@ -451,7 +451,7 @@ int dn_neigh_endnode_hello(struct net *net, struct sock *sk, struct sk_buff *skb | |||
451 | 451 | ||
452 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); | 452 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); |
453 | 453 | ||
454 | dn = (struct dn_neigh *)neigh; | 454 | dn = container_of(neigh, struct dn_neigh, n); |
455 | 455 | ||
456 | if (neigh) { | 456 | if (neigh) { |
457 | write_lock(&neigh->lock); | 457 | write_lock(&neigh->lock); |
@@ -510,7 +510,7 @@ static void neigh_elist_cb(struct neighbour *neigh, void *_info) | |||
510 | if (neigh->dev != s->dev) | 510 | if (neigh->dev != s->dev) |
511 | return; | 511 | return; |
512 | 512 | ||
513 | dn = (struct dn_neigh *) neigh; | 513 | dn = container_of(neigh, struct dn_neigh, n); |
514 | if (!(dn->flags & (DN_NDFLAG_R1|DN_NDFLAG_R2))) | 514 | if (!(dn->flags & (DN_NDFLAG_R1|DN_NDFLAG_R2))) |
515 | return; | 515 | return; |
516 | 516 | ||
@@ -549,7 +549,7 @@ int dn_neigh_elist(struct net_device *dev, unsigned char *ptr, int n) | |||
549 | static inline void dn_neigh_format_entry(struct seq_file *seq, | 549 | static inline void dn_neigh_format_entry(struct seq_file *seq, |
550 | struct neighbour *n) | 550 | struct neighbour *n) |
551 | { | 551 | { |
552 | struct dn_neigh *dn = (struct dn_neigh *) n; | 552 | struct dn_neigh *dn = container_of(n, struct dn_neigh, n); |
553 | char buf[DN_ASCBUF_LEN]; | 553 | char buf[DN_ASCBUF_LEN]; |
554 | 554 | ||
555 | read_lock(&n->lock); | 555 | read_lock(&n->lock); |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 5e313c1ac94f..1054d330bf9d 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -794,6 +794,8 @@ struct sock *inet_csk_clone_lock(const struct sock *sk, | |||
794 | /* listeners have SOCK_RCU_FREE, not the children */ | 794 | /* listeners have SOCK_RCU_FREE, not the children */ |
795 | sock_reset_flag(newsk, SOCK_RCU_FREE); | 795 | sock_reset_flag(newsk, SOCK_RCU_FREE); |
796 | 796 | ||
797 | inet_sk(newsk)->mc_list = NULL; | ||
798 | |||
797 | newsk->sk_mark = inet_rsk(req)->ir_mark; | 799 | newsk->sk_mark = inet_rsk(req)->ir_mark; |
798 | atomic64_set(&newsk->sk_cookie, | 800 | atomic64_set(&newsk->sk_cookie, |
799 | atomic64_read(&inet_rsk(req)->ir_cookie)); | 801 | atomic64_read(&inet_rsk(req)->ir_cookie)); |
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 40977413fd48..4ec9affb2252 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
@@ -546,12 +546,13 @@ static int vti_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
546 | struct ip_tunnel *t = netdev_priv(dev); | 546 | struct ip_tunnel *t = netdev_priv(dev); |
547 | struct ip_tunnel_parm *p = &t->parms; | 547 | struct ip_tunnel_parm *p = &t->parms; |
548 | 548 | ||
549 | nla_put_u32(skb, IFLA_VTI_LINK, p->link); | 549 | if (nla_put_u32(skb, IFLA_VTI_LINK, p->link) || |
550 | nla_put_be32(skb, IFLA_VTI_IKEY, p->i_key); | 550 | nla_put_be32(skb, IFLA_VTI_IKEY, p->i_key) || |
551 | nla_put_be32(skb, IFLA_VTI_OKEY, p->o_key); | 551 | nla_put_be32(skb, IFLA_VTI_OKEY, p->o_key) || |
552 | nla_put_in_addr(skb, IFLA_VTI_LOCAL, p->iph.saddr); | 552 | nla_put_in_addr(skb, IFLA_VTI_LOCAL, p->iph.saddr) || |
553 | nla_put_in_addr(skb, IFLA_VTI_REMOTE, p->iph.daddr); | 553 | nla_put_in_addr(skb, IFLA_VTI_REMOTE, p->iph.daddr) || |
554 | nla_put_u32(skb, IFLA_VTI_FWMARK, t->fwmark); | 554 | nla_put_u32(skb, IFLA_VTI_FWMARK, t->fwmark)) |
555 | return -EMSGSIZE; | ||
555 | 556 | ||
556 | return 0; | 557 | return 0; |
557 | } | 558 | } |
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index 496b97e17aaf..0257d965f111 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/siphash.h> | 16 | #include <linux/siphash.h> |
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/export.h> | 18 | #include <linux/export.h> |
19 | #include <net/secure_seq.h> | ||
19 | #include <net/tcp.h> | 20 | #include <net/tcp.h> |
20 | #include <net/route.h> | 21 | #include <net/route.h> |
21 | 22 | ||
@@ -203,7 +204,7 @@ EXPORT_SYMBOL_GPL(__cookie_v4_check); | |||
203 | 204 | ||
204 | struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, | 205 | struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, |
205 | struct request_sock *req, | 206 | struct request_sock *req, |
206 | struct dst_entry *dst) | 207 | struct dst_entry *dst, u32 tsoff) |
207 | { | 208 | { |
208 | struct inet_connection_sock *icsk = inet_csk(sk); | 209 | struct inet_connection_sock *icsk = inet_csk(sk); |
209 | struct sock *child; | 210 | struct sock *child; |
@@ -213,6 +214,7 @@ struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, | |||
213 | NULL, &own_req); | 214 | NULL, &own_req); |
214 | if (child) { | 215 | if (child) { |
215 | atomic_set(&req->rsk_refcnt, 1); | 216 | atomic_set(&req->rsk_refcnt, 1); |
217 | tcp_sk(child)->tsoffset = tsoff; | ||
216 | sock_rps_save_rxhash(child, skb); | 218 | sock_rps_save_rxhash(child, skb); |
217 | inet_csk_reqsk_queue_add(sk, req, child); | 219 | inet_csk_reqsk_queue_add(sk, req, child); |
218 | } else { | 220 | } else { |
@@ -292,6 +294,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) | |||
292 | struct rtable *rt; | 294 | struct rtable *rt; |
293 | __u8 rcv_wscale; | 295 | __u8 rcv_wscale; |
294 | struct flowi4 fl4; | 296 | struct flowi4 fl4; |
297 | u32 tsoff = 0; | ||
295 | 298 | ||
296 | if (!sock_net(sk)->ipv4.sysctl_tcp_syncookies || !th->ack || th->rst) | 299 | if (!sock_net(sk)->ipv4.sysctl_tcp_syncookies || !th->ack || th->rst) |
297 | goto out; | 300 | goto out; |
@@ -311,6 +314,11 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) | |||
311 | memset(&tcp_opt, 0, sizeof(tcp_opt)); | 314 | memset(&tcp_opt, 0, sizeof(tcp_opt)); |
312 | tcp_parse_options(skb, &tcp_opt, 0, NULL); | 315 | tcp_parse_options(skb, &tcp_opt, 0, NULL); |
313 | 316 | ||
317 | if (tcp_opt.saw_tstamp && tcp_opt.rcv_tsecr) { | ||
318 | tsoff = secure_tcp_ts_off(ip_hdr(skb)->daddr, ip_hdr(skb)->saddr); | ||
319 | tcp_opt.rcv_tsecr -= tsoff; | ||
320 | } | ||
321 | |||
314 | if (!cookie_timestamp_decode(&tcp_opt)) | 322 | if (!cookie_timestamp_decode(&tcp_opt)) |
315 | goto out; | 323 | goto out; |
316 | 324 | ||
@@ -381,7 +389,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) | |||
381 | ireq->rcv_wscale = rcv_wscale; | 389 | ireq->rcv_wscale = rcv_wscale; |
382 | ireq->ecn_ok = cookie_ecn_ok(&tcp_opt, sock_net(sk), &rt->dst); | 390 | ireq->ecn_ok = cookie_ecn_ok(&tcp_opt, sock_net(sk), &rt->dst); |
383 | 391 | ||
384 | ret = tcp_get_cookie_sock(sk, skb, req, &rt->dst); | 392 | ret = tcp_get_cookie_sock(sk, skb, req, &rt->dst, tsoff); |
385 | /* ip_queue_xmit() depends on our flow being setup | 393 | /* ip_queue_xmit() depends on our flow being setup |
386 | * Normal sockets get it right from inet_csk_route_child_sock() | 394 | * Normal sockets get it right from inet_csk_route_child_sock() |
387 | */ | 395 | */ |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9739962bfb3f..5a3ad09e2786 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -85,7 +85,6 @@ int sysctl_tcp_dsack __read_mostly = 1; | |||
85 | int sysctl_tcp_app_win __read_mostly = 31; | 85 | int sysctl_tcp_app_win __read_mostly = 31; |
86 | int sysctl_tcp_adv_win_scale __read_mostly = 1; | 86 | int sysctl_tcp_adv_win_scale __read_mostly = 1; |
87 | EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); | 87 | EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); |
88 | EXPORT_SYMBOL(sysctl_tcp_timestamps); | ||
89 | 88 | ||
90 | /* rfc5961 challenge ack rate limiting */ | 89 | /* rfc5961 challenge ack rate limiting */ |
91 | int sysctl_tcp_challenge_ack_limit = 1000; | 90 | int sysctl_tcp_challenge_ack_limit = 1000; |
@@ -6347,8 +6346,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, | |||
6347 | if (security_inet_conn_request(sk, skb, req)) | 6346 | if (security_inet_conn_request(sk, skb, req)) |
6348 | goto drop_and_free; | 6347 | goto drop_and_free; |
6349 | 6348 | ||
6350 | if (isn && tmp_opt.tstamp_ok) | 6349 | if (tmp_opt.tstamp_ok) |
6351 | af_ops->init_seq_tsoff(skb, &tcp_rsk(req)->ts_off); | 6350 | tcp_rsk(req)->ts_off = af_ops->init_ts_off(skb); |
6352 | 6351 | ||
6353 | if (!want_cookie && !isn) { | 6352 | if (!want_cookie && !isn) { |
6354 | /* Kill the following clause, if you dislike this way. */ | 6353 | /* Kill the following clause, if you dislike this way. */ |
@@ -6368,7 +6367,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, | |||
6368 | goto drop_and_release; | 6367 | goto drop_and_release; |
6369 | } | 6368 | } |
6370 | 6369 | ||
6371 | isn = af_ops->init_seq_tsoff(skb, &tcp_rsk(req)->ts_off); | 6370 | isn = af_ops->init_seq(skb); |
6372 | } | 6371 | } |
6373 | if (!dst) { | 6372 | if (!dst) { |
6374 | dst = af_ops->route_req(sk, &fl, req); | 6373 | dst = af_ops->route_req(sk, &fl, req); |
@@ -6380,7 +6379,6 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, | |||
6380 | 6379 | ||
6381 | if (want_cookie) { | 6380 | if (want_cookie) { |
6382 | isn = cookie_init_sequence(af_ops, sk, skb, &req->mss); | 6381 | isn = cookie_init_sequence(af_ops, sk, skb, &req->mss); |
6383 | tcp_rsk(req)->ts_off = 0; | ||
6384 | req->cookie_ts = tmp_opt.tstamp_ok; | 6382 | req->cookie_ts = tmp_opt.tstamp_ok; |
6385 | if (!tmp_opt.tstamp_ok) | 6383 | if (!tmp_opt.tstamp_ok) |
6386 | inet_rsk(req)->ecn_ok = 0; | 6384 | inet_rsk(req)->ecn_ok = 0; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index cbbafe546c0f..3a51582bef55 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -94,12 +94,18 @@ static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key, | |||
94 | struct inet_hashinfo tcp_hashinfo; | 94 | struct inet_hashinfo tcp_hashinfo; |
95 | EXPORT_SYMBOL(tcp_hashinfo); | 95 | EXPORT_SYMBOL(tcp_hashinfo); |
96 | 96 | ||
97 | static u32 tcp_v4_init_seq_and_tsoff(const struct sk_buff *skb, u32 *tsoff) | 97 | static u32 tcp_v4_init_seq(const struct sk_buff *skb) |
98 | { | 98 | { |
99 | return secure_tcp_seq_and_tsoff(ip_hdr(skb)->daddr, | 99 | return secure_tcp_seq(ip_hdr(skb)->daddr, |
100 | ip_hdr(skb)->saddr, | 100 | ip_hdr(skb)->saddr, |
101 | tcp_hdr(skb)->dest, | 101 | tcp_hdr(skb)->dest, |
102 | tcp_hdr(skb)->source, tsoff); | 102 | tcp_hdr(skb)->source); |
103 | } | ||
104 | |||
105 | static u32 tcp_v4_init_ts_off(const struct sk_buff *skb) | ||
106 | { | ||
107 | return secure_tcp_ts_off(ip_hdr(skb)->daddr, | ||
108 | ip_hdr(skb)->saddr); | ||
103 | } | 109 | } |
104 | 110 | ||
105 | int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) | 111 | int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) |
@@ -145,7 +151,6 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
145 | struct flowi4 *fl4; | 151 | struct flowi4 *fl4; |
146 | struct rtable *rt; | 152 | struct rtable *rt; |
147 | int err; | 153 | int err; |
148 | u32 seq; | ||
149 | struct ip_options_rcu *inet_opt; | 154 | struct ip_options_rcu *inet_opt; |
150 | struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; | 155 | struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; |
151 | 156 | ||
@@ -232,13 +237,13 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
232 | rt = NULL; | 237 | rt = NULL; |
233 | 238 | ||
234 | if (likely(!tp->repair)) { | 239 | if (likely(!tp->repair)) { |
235 | seq = secure_tcp_seq_and_tsoff(inet->inet_saddr, | ||
236 | inet->inet_daddr, | ||
237 | inet->inet_sport, | ||
238 | usin->sin_port, | ||
239 | &tp->tsoffset); | ||
240 | if (!tp->write_seq) | 240 | if (!tp->write_seq) |
241 | tp->write_seq = seq; | 241 | tp->write_seq = secure_tcp_seq(inet->inet_saddr, |
242 | inet->inet_daddr, | ||
243 | inet->inet_sport, | ||
244 | usin->sin_port); | ||
245 | tp->tsoffset = secure_tcp_ts_off(inet->inet_saddr, | ||
246 | inet->inet_daddr); | ||
242 | } | 247 | } |
243 | 248 | ||
244 | inet->inet_id = tp->write_seq ^ jiffies; | 249 | inet->inet_id = tp->write_seq ^ jiffies; |
@@ -1239,7 +1244,8 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = { | |||
1239 | .cookie_init_seq = cookie_v4_init_sequence, | 1244 | .cookie_init_seq = cookie_v4_init_sequence, |
1240 | #endif | 1245 | #endif |
1241 | .route_req = tcp_v4_route_req, | 1246 | .route_req = tcp_v4_route_req, |
1242 | .init_seq_tsoff = tcp_v4_init_seq_and_tsoff, | 1247 | .init_seq = tcp_v4_init_seq, |
1248 | .init_ts_off = tcp_v4_init_ts_off, | ||
1243 | .send_synack = tcp_v4_send_synack, | 1249 | .send_synack = tcp_v4_send_synack, |
1244 | }; | 1250 | }; |
1245 | 1251 | ||
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 60111a0fc201..4858e190f6ac 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -1514,6 +1514,7 @@ static void tcp_cwnd_application_limited(struct sock *sk) | |||
1514 | 1514 | ||
1515 | static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited) | 1515 | static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited) |
1516 | { | 1516 | { |
1517 | const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; | ||
1517 | struct tcp_sock *tp = tcp_sk(sk); | 1518 | struct tcp_sock *tp = tcp_sk(sk); |
1518 | 1519 | ||
1519 | /* Track the maximum number of outstanding packets in each | 1520 | /* Track the maximum number of outstanding packets in each |
@@ -1536,7 +1537,8 @@ static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited) | |||
1536 | tp->snd_cwnd_used = tp->packets_out; | 1537 | tp->snd_cwnd_used = tp->packets_out; |
1537 | 1538 | ||
1538 | if (sysctl_tcp_slow_start_after_idle && | 1539 | if (sysctl_tcp_slow_start_after_idle && |
1539 | (s32)(tcp_time_stamp - tp->snd_cwnd_stamp) >= inet_csk(sk)->icsk_rto) | 1540 | (s32)(tcp_time_stamp - tp->snd_cwnd_stamp) >= inet_csk(sk)->icsk_rto && |
1541 | !ca_ops->cong_control) | ||
1540 | tcp_cwnd_application_limited(sk); | 1542 | tcp_cwnd_application_limited(sk); |
1541 | 1543 | ||
1542 | /* The following conditions together indicate the starvation | 1544 | /* The following conditions together indicate the starvation |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 77a4bd526d6e..8d297a79b568 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -3548,6 +3548,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
3548 | */ | 3548 | */ |
3549 | static struct notifier_block ipv6_dev_notf = { | 3549 | static struct notifier_block ipv6_dev_notf = { |
3550 | .notifier_call = addrconf_notify, | 3550 | .notifier_call = addrconf_notify, |
3551 | .priority = ADDRCONF_NOTIFY_PRIORITY, | ||
3551 | }; | 3552 | }; |
3552 | 3553 | ||
3553 | static void addrconf_type_change(struct net_device *dev, unsigned long event) | 3554 | static void addrconf_type_change(struct net_device *dev, unsigned long event) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 2f1136627dcb..dc61b0b5e64e 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -3709,7 +3709,10 @@ static int ip6_route_dev_notify(struct notifier_block *this, | |||
3709 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); | 3709 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); |
3710 | struct net *net = dev_net(dev); | 3710 | struct net *net = dev_net(dev); |
3711 | 3711 | ||
3712 | if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) { | 3712 | if (!(dev->flags & IFF_LOOPBACK)) |
3713 | return NOTIFY_OK; | ||
3714 | |||
3715 | if (event == NETDEV_REGISTER) { | ||
3713 | net->ipv6.ip6_null_entry->dst.dev = dev; | 3716 | net->ipv6.ip6_null_entry->dst.dev = dev; |
3714 | net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev); | 3717 | net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev); |
3715 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 3718 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
@@ -3718,6 +3721,12 @@ static int ip6_route_dev_notify(struct notifier_block *this, | |||
3718 | net->ipv6.ip6_blk_hole_entry->dst.dev = dev; | 3721 | net->ipv6.ip6_blk_hole_entry->dst.dev = dev; |
3719 | net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); | 3722 | net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); |
3720 | #endif | 3723 | #endif |
3724 | } else if (event == NETDEV_UNREGISTER) { | ||
3725 | in6_dev_put(net->ipv6.ip6_null_entry->rt6i_idev); | ||
3726 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | ||
3727 | in6_dev_put(net->ipv6.ip6_prohibit_entry->rt6i_idev); | ||
3728 | in6_dev_put(net->ipv6.ip6_blk_hole_entry->rt6i_idev); | ||
3729 | #endif | ||
3721 | } | 3730 | } |
3722 | 3731 | ||
3723 | return NOTIFY_OK; | 3732 | return NOTIFY_OK; |
@@ -4024,7 +4033,7 @@ static struct pernet_operations ip6_route_net_late_ops = { | |||
4024 | 4033 | ||
4025 | static struct notifier_block ip6_route_dev_notifier = { | 4034 | static struct notifier_block ip6_route_dev_notifier = { |
4026 | .notifier_call = ip6_route_dev_notify, | 4035 | .notifier_call = ip6_route_dev_notify, |
4027 | .priority = 0, | 4036 | .priority = ADDRCONF_NOTIFY_PRIORITY - 10, |
4028 | }; | 4037 | }; |
4029 | 4038 | ||
4030 | void __init ip6_route_init_special_entries(void) | 4039 | void __init ip6_route_init_special_entries(void) |
diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c index 895ff650db43..5abc3692b901 100644 --- a/net/ipv6/syncookies.c +++ b/net/ipv6/syncookies.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/random.h> | 18 | #include <linux/random.h> |
19 | #include <linux/siphash.h> | 19 | #include <linux/siphash.h> |
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <net/secure_seq.h> | ||
21 | #include <net/ipv6.h> | 22 | #include <net/ipv6.h> |
22 | #include <net/tcp.h> | 23 | #include <net/tcp.h> |
23 | 24 | ||
@@ -143,6 +144,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
143 | int mss; | 144 | int mss; |
144 | struct dst_entry *dst; | 145 | struct dst_entry *dst; |
145 | __u8 rcv_wscale; | 146 | __u8 rcv_wscale; |
147 | u32 tsoff = 0; | ||
146 | 148 | ||
147 | if (!sock_net(sk)->ipv4.sysctl_tcp_syncookies || !th->ack || th->rst) | 149 | if (!sock_net(sk)->ipv4.sysctl_tcp_syncookies || !th->ack || th->rst) |
148 | goto out; | 150 | goto out; |
@@ -162,6 +164,12 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
162 | memset(&tcp_opt, 0, sizeof(tcp_opt)); | 164 | memset(&tcp_opt, 0, sizeof(tcp_opt)); |
163 | tcp_parse_options(skb, &tcp_opt, 0, NULL); | 165 | tcp_parse_options(skb, &tcp_opt, 0, NULL); |
164 | 166 | ||
167 | if (tcp_opt.saw_tstamp && tcp_opt.rcv_tsecr) { | ||
168 | tsoff = secure_tcpv6_ts_off(ipv6_hdr(skb)->daddr.s6_addr32, | ||
169 | ipv6_hdr(skb)->saddr.s6_addr32); | ||
170 | tcp_opt.rcv_tsecr -= tsoff; | ||
171 | } | ||
172 | |||
165 | if (!cookie_timestamp_decode(&tcp_opt)) | 173 | if (!cookie_timestamp_decode(&tcp_opt)) |
166 | goto out; | 174 | goto out; |
167 | 175 | ||
@@ -242,7 +250,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
242 | ireq->rcv_wscale = rcv_wscale; | 250 | ireq->rcv_wscale = rcv_wscale; |
243 | ireq->ecn_ok = cookie_ecn_ok(&tcp_opt, sock_net(sk), dst); | 251 | ireq->ecn_ok = cookie_ecn_ok(&tcp_opt, sock_net(sk), dst); |
244 | 252 | ||
245 | ret = tcp_get_cookie_sock(sk, skb, req, dst); | 253 | ret = tcp_get_cookie_sock(sk, skb, req, dst, tsoff); |
246 | out: | 254 | out: |
247 | return ret; | 255 | return ret; |
248 | out_free: | 256 | out_free: |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 8e42e8f54b70..aeb9497b5bb7 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -101,12 +101,18 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) | |||
101 | } | 101 | } |
102 | } | 102 | } |
103 | 103 | ||
104 | static u32 tcp_v6_init_seq_and_tsoff(const struct sk_buff *skb, u32 *tsoff) | 104 | static u32 tcp_v6_init_seq(const struct sk_buff *skb) |
105 | { | 105 | { |
106 | return secure_tcpv6_seq_and_tsoff(ipv6_hdr(skb)->daddr.s6_addr32, | 106 | return secure_tcpv6_seq(ipv6_hdr(skb)->daddr.s6_addr32, |
107 | ipv6_hdr(skb)->saddr.s6_addr32, | 107 | ipv6_hdr(skb)->saddr.s6_addr32, |
108 | tcp_hdr(skb)->dest, | 108 | tcp_hdr(skb)->dest, |
109 | tcp_hdr(skb)->source, tsoff); | 109 | tcp_hdr(skb)->source); |
110 | } | ||
111 | |||
112 | static u32 tcp_v6_init_ts_off(const struct sk_buff *skb) | ||
113 | { | ||
114 | return secure_tcpv6_ts_off(ipv6_hdr(skb)->daddr.s6_addr32, | ||
115 | ipv6_hdr(skb)->saddr.s6_addr32); | ||
110 | } | 116 | } |
111 | 117 | ||
112 | static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | 118 | static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, |
@@ -122,7 +128,6 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
122 | struct flowi6 fl6; | 128 | struct flowi6 fl6; |
123 | struct dst_entry *dst; | 129 | struct dst_entry *dst; |
124 | int addr_type; | 130 | int addr_type; |
125 | u32 seq; | ||
126 | int err; | 131 | int err; |
127 | struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; | 132 | struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; |
128 | 133 | ||
@@ -282,13 +287,13 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
282 | sk_set_txhash(sk); | 287 | sk_set_txhash(sk); |
283 | 288 | ||
284 | if (likely(!tp->repair)) { | 289 | if (likely(!tp->repair)) { |
285 | seq = secure_tcpv6_seq_and_tsoff(np->saddr.s6_addr32, | ||
286 | sk->sk_v6_daddr.s6_addr32, | ||
287 | inet->inet_sport, | ||
288 | inet->inet_dport, | ||
289 | &tp->tsoffset); | ||
290 | if (!tp->write_seq) | 290 | if (!tp->write_seq) |
291 | tp->write_seq = seq; | 291 | tp->write_seq = secure_tcpv6_seq(np->saddr.s6_addr32, |
292 | sk->sk_v6_daddr.s6_addr32, | ||
293 | inet->inet_sport, | ||
294 | inet->inet_dport); | ||
295 | tp->tsoffset = secure_tcpv6_ts_off(np->saddr.s6_addr32, | ||
296 | sk->sk_v6_daddr.s6_addr32); | ||
292 | } | 297 | } |
293 | 298 | ||
294 | if (tcp_fastopen_defer_connect(sk, &err)) | 299 | if (tcp_fastopen_defer_connect(sk, &err)) |
@@ -749,7 +754,8 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = { | |||
749 | .cookie_init_seq = cookie_v6_init_sequence, | 754 | .cookie_init_seq = cookie_v6_init_sequence, |
750 | #endif | 755 | #endif |
751 | .route_req = tcp_v6_route_req, | 756 | .route_req = tcp_v6_route_req, |
752 | .init_seq_tsoff = tcp_v6_init_seq_and_tsoff, | 757 | .init_seq = tcp_v6_init_seq, |
758 | .init_ts_off = tcp_v6_init_ts_off, | ||
753 | .send_synack = tcp_v6_send_synack, | 759 | .send_synack = tcp_v6_send_synack, |
754 | }; | 760 | }; |
755 | 761 | ||
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 6db09fa18269..364d4e137649 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -66,6 +66,8 @@ ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata, | |||
66 | 2 + (IEEE80211_MAX_SUPP_RATES - 8) + | 66 | 2 + (IEEE80211_MAX_SUPP_RATES - 8) + |
67 | 2 + sizeof(struct ieee80211_ht_cap) + | 67 | 2 + sizeof(struct ieee80211_ht_cap) + |
68 | 2 + sizeof(struct ieee80211_ht_operation) + | 68 | 2 + sizeof(struct ieee80211_ht_operation) + |
69 | 2 + sizeof(struct ieee80211_vht_cap) + | ||
70 | 2 + sizeof(struct ieee80211_vht_operation) + | ||
69 | ifibss->ie_len; | 71 | ifibss->ie_len; |
70 | presp = kzalloc(sizeof(*presp) + frame_len, GFP_KERNEL); | 72 | presp = kzalloc(sizeof(*presp) + frame_len, GFP_KERNEL); |
71 | if (!presp) | 73 | if (!presp) |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 89dff563b1ec..0ea9712bd99e 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -4382,6 +4382,10 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, | |||
4382 | if (WARN_ON(!ifmgd->auth_data && !ifmgd->assoc_data)) | 4382 | if (WARN_ON(!ifmgd->auth_data && !ifmgd->assoc_data)) |
4383 | return -EINVAL; | 4383 | return -EINVAL; |
4384 | 4384 | ||
4385 | /* If a reconfig is happening, bail out */ | ||
4386 | if (local->in_reconfig) | ||
4387 | return -EBUSY; | ||
4388 | |||
4385 | if (assoc) { | 4389 | if (assoc) { |
4386 | rcu_read_lock(); | 4390 | rcu_read_lock(); |
4387 | have_sta = sta_info_get(sdata, cbss->bssid); | 4391 | have_sta = sta_info_get(sdata, cbss->bssid); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 570fc95dc507..c3bc9da30cff 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2764,8 +2764,8 @@ static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, | |||
2764 | nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); | 2764 | nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); |
2765 | 2765 | ||
2766 | /* bits 0 and 63 are reserved and must be zero */ | 2766 | /* bits 0 and 63 are reserved and must be zero */ |
2767 | if ((mumimo_groups[0] & BIT(7)) || | 2767 | if ((mumimo_groups[0] & BIT(0)) || |
2768 | (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(0))) | 2768 | (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) |
2769 | return -EINVAL; | 2769 | return -EINVAL; |
2770 | 2770 | ||
2771 | params->vht_mumimo_groups = mumimo_groups; | 2771 | params->vht_mumimo_groups = mumimo_groups; |