diff options
30 files changed, 92 insertions, 65 deletions
diff --git a/Documentation/networking/segmentation-offloads.txt b/Documentation/networking/segmentation-offloads.txt index f200467ade38..2f09455a993a 100644 --- a/Documentation/networking/segmentation-offloads.txt +++ b/Documentation/networking/segmentation-offloads.txt | |||
@@ -55,7 +55,7 @@ IPIP, SIT, GRE, UDP Tunnel, and Remote Checksum Offloads | |||
55 | In addition to the offloads described above it is possible for a frame to | 55 | In addition to the offloads described above it is possible for a frame to |
56 | contain additional headers such as an outer tunnel. In order to account | 56 | contain additional headers such as an outer tunnel. In order to account |
57 | for such instances an additional set of segmentation offload types were | 57 | for such instances an additional set of segmentation offload types were |
58 | introduced including SKB_GSO_IPIP, SKB_GSO_SIT, SKB_GSO_GRE, and | 58 | introduced including SKB_GSO_IPXIP4, SKB_GSO_IPXIP6, SKB_GSO_GRE, and |
59 | SKB_GSO_UDP_TUNNEL. These extra segmentation types are used to identify | 59 | SKB_GSO_UDP_TUNNEL. These extra segmentation types are used to identify |
60 | cases where there are more than just 1 set of headers. For example in the | 60 | cases where there are more than just 1 set of headers. For example in the |
61 | case of IPIP and SIT we should have the network and transport headers moved | 61 | case of IPIP and SIT we should have the network and transport headers moved |
diff --git a/MAINTAINERS b/MAINTAINERS index 71d438072d57..154bf8fbf683 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -9129,9 +9129,7 @@ F: lib/random32.c | |||
9129 | NETWORKING [IPv4/IPv6] | 9129 | NETWORKING [IPv4/IPv6] |
9130 | M: "David S. Miller" <davem@davemloft.net> | 9130 | M: "David S. Miller" <davem@davemloft.net> |
9131 | M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> | 9131 | M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> |
9132 | M: James Morris <jmorris@namei.org> | ||
9133 | M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> | 9132 | M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> |
9134 | M: Patrick McHardy <kaber@trash.net> | ||
9135 | L: netdev@vger.kernel.org | 9133 | L: netdev@vger.kernel.org |
9136 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git | 9134 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git |
9137 | S: Maintained | 9135 | S: Maintained |
diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c index 2d956cb59d06..01cab9548785 100644 --- a/drivers/net/arcnet/com20020-pci.c +++ b/drivers/net/arcnet/com20020-pci.c | |||
@@ -225,8 +225,10 @@ static int com20020pci_probe(struct pci_dev *pdev, | |||
225 | 225 | ||
226 | card = devm_kzalloc(&pdev->dev, sizeof(struct com20020_dev), | 226 | card = devm_kzalloc(&pdev->dev, sizeof(struct com20020_dev), |
227 | GFP_KERNEL); | 227 | GFP_KERNEL); |
228 | if (!card) | 228 | if (!card) { |
229 | return -ENOMEM; | 229 | ret = -ENOMEM; |
230 | goto out_port; | ||
231 | } | ||
230 | 232 | ||
231 | card->index = i; | 233 | card->index = i; |
232 | card->pci_priv = priv; | 234 | card->pci_priv = priv; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 2865f31c6076..14ff622190a5 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1820,7 +1820,7 @@ err_undo_flags: | |||
1820 | */ | 1820 | */ |
1821 | static int __bond_release_one(struct net_device *bond_dev, | 1821 | static int __bond_release_one(struct net_device *bond_dev, |
1822 | struct net_device *slave_dev, | 1822 | struct net_device *slave_dev, |
1823 | bool all) | 1823 | bool all, bool unregister) |
1824 | { | 1824 | { |
1825 | struct bonding *bond = netdev_priv(bond_dev); | 1825 | struct bonding *bond = netdev_priv(bond_dev); |
1826 | struct slave *slave, *oldcurrent; | 1826 | struct slave *slave, *oldcurrent; |
@@ -1965,7 +1965,10 @@ static int __bond_release_one(struct net_device *bond_dev, | |||
1965 | dev_set_mac_address(slave_dev, (struct sockaddr *)&ss); | 1965 | dev_set_mac_address(slave_dev, (struct sockaddr *)&ss); |
1966 | } | 1966 | } |
1967 | 1967 | ||
1968 | dev_set_mtu(slave_dev, slave->original_mtu); | 1968 | if (unregister) |
1969 | __dev_set_mtu(slave_dev, slave->original_mtu); | ||
1970 | else | ||
1971 | dev_set_mtu(slave_dev, slave->original_mtu); | ||
1969 | 1972 | ||
1970 | slave_dev->priv_flags &= ~IFF_BONDING; | 1973 | slave_dev->priv_flags &= ~IFF_BONDING; |
1971 | 1974 | ||
@@ -1977,7 +1980,7 @@ static int __bond_release_one(struct net_device *bond_dev, | |||
1977 | /* A wrapper used because of ndo_del_link */ | 1980 | /* A wrapper used because of ndo_del_link */ |
1978 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) | 1981 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) |
1979 | { | 1982 | { |
1980 | return __bond_release_one(bond_dev, slave_dev, false); | 1983 | return __bond_release_one(bond_dev, slave_dev, false, false); |
1981 | } | 1984 | } |
1982 | 1985 | ||
1983 | /* First release a slave and then destroy the bond if no more slaves are left. | 1986 | /* First release a slave and then destroy the bond if no more slaves are left. |
@@ -1989,7 +1992,7 @@ static int bond_release_and_destroy(struct net_device *bond_dev, | |||
1989 | struct bonding *bond = netdev_priv(bond_dev); | 1992 | struct bonding *bond = netdev_priv(bond_dev); |
1990 | int ret; | 1993 | int ret; |
1991 | 1994 | ||
1992 | ret = bond_release(bond_dev, slave_dev); | 1995 | ret = __bond_release_one(bond_dev, slave_dev, false, true); |
1993 | if (ret == 0 && !bond_has_slaves(bond)) { | 1996 | if (ret == 0 && !bond_has_slaves(bond)) { |
1994 | bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; | 1997 | bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; |
1995 | netdev_info(bond_dev, "Destroying bond %s\n", | 1998 | netdev_info(bond_dev, "Destroying bond %s\n", |
@@ -3060,7 +3063,7 @@ static int bond_slave_netdev_event(unsigned long event, | |||
3060 | if (bond_dev->type != ARPHRD_ETHER) | 3063 | if (bond_dev->type != ARPHRD_ETHER) |
3061 | bond_release_and_destroy(bond_dev, slave_dev); | 3064 | bond_release_and_destroy(bond_dev, slave_dev); |
3062 | else | 3065 | else |
3063 | bond_release(bond_dev, slave_dev); | 3066 | __bond_release_one(bond_dev, slave_dev, false, true); |
3064 | break; | 3067 | break; |
3065 | case NETDEV_UP: | 3068 | case NETDEV_UP: |
3066 | case NETDEV_CHANGE: | 3069 | case NETDEV_CHANGE: |
@@ -4252,7 +4255,7 @@ static void bond_uninit(struct net_device *bond_dev) | |||
4252 | 4255 | ||
4253 | /* Release the bonded slaves */ | 4256 | /* Release the bonded slaves */ |
4254 | bond_for_each_slave(bond, slave, iter) | 4257 | bond_for_each_slave(bond, slave, iter) |
4255 | __bond_release_one(bond_dev, slave->dev, true); | 4258 | __bond_release_one(bond_dev, slave->dev, true, true); |
4256 | netdev_info(bond_dev, "Released all slaves\n"); | 4259 | netdev_info(bond_dev, "Released all slaves\n"); |
4257 | 4260 | ||
4258 | arr = rtnl_dereference(bond->slave_arr); | 4261 | arr = rtnl_dereference(bond->slave_arr); |
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index e69ebdd65658..26d25749c3e4 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c | |||
@@ -3314,10 +3314,11 @@ static const struct macb_config sama5d2_config = { | |||
3314 | 3314 | ||
3315 | static const struct macb_config sama5d3_config = { | 3315 | static const struct macb_config sama5d3_config = { |
3316 | .caps = MACB_CAPS_SG_DISABLED | MACB_CAPS_GIGABIT_MODE_AVAILABLE | 3316 | .caps = MACB_CAPS_SG_DISABLED | MACB_CAPS_GIGABIT_MODE_AVAILABLE |
3317 | | MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII, | 3317 | | MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII | MACB_CAPS_JUMBO, |
3318 | .dma_burst_length = 16, | 3318 | .dma_burst_length = 16, |
3319 | .clk_init = macb_clk_init, | 3319 | .clk_init = macb_clk_init, |
3320 | .init = macb_init, | 3320 | .init = macb_init, |
3321 | .jumbo_max_len = 10240, | ||
3321 | }; | 3322 | }; |
3322 | 3323 | ||
3323 | static const struct macb_config sama5d4_config = { | 3324 | static const struct macb_config sama5d4_config = { |
diff --git a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c index 6081c3132135..4b0ca9fb2cb4 100644 --- a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c +++ b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c | |||
@@ -221,7 +221,7 @@ static int cn23xx_pf_soft_reset(struct octeon_device *oct) | |||
221 | /* Wait for 100ms as Octeon resets. */ | 221 | /* Wait for 100ms as Octeon resets. */ |
222 | mdelay(100); | 222 | mdelay(100); |
223 | 223 | ||
224 | if (octeon_read_csr64(oct, CN23XX_SLI_SCRATCH1) == 0x1234ULL) { | 224 | if (octeon_read_csr64(oct, CN23XX_SLI_SCRATCH1)) { |
225 | dev_err(&oct->pci_dev->dev, "OCTEON[%d]: Soft reset failed\n", | 225 | dev_err(&oct->pci_dev->dev, "OCTEON[%d]: Soft reset failed\n", |
226 | oct->octeon_id); | 226 | oct->octeon_id); |
227 | return 1; | 227 | return 1; |
diff --git a/drivers/net/ethernet/cavium/liquidio/cn66xx_device.c b/drivers/net/ethernet/cavium/liquidio/cn66xx_device.c index b28253c96d97..2df7440f58df 100644 --- a/drivers/net/ethernet/cavium/liquidio/cn66xx_device.c +++ b/drivers/net/ethernet/cavium/liquidio/cn66xx_device.c | |||
@@ -44,7 +44,7 @@ int lio_cn6xxx_soft_reset(struct octeon_device *oct) | |||
44 | /* Wait for 10ms as Octeon resets. */ | 44 | /* Wait for 10ms as Octeon resets. */ |
45 | mdelay(100); | 45 | mdelay(100); |
46 | 46 | ||
47 | if (octeon_read_csr64(oct, CN6XXX_SLI_SCRATCH1) == 0x1234ULL) { | 47 | if (octeon_read_csr64(oct, CN6XXX_SLI_SCRATCH1)) { |
48 | dev_err(&oct->pci_dev->dev, "Soft reset failed\n"); | 48 | dev_err(&oct->pci_dev->dev, "Soft reset failed\n"); |
49 | return 1; | 49 | return 1; |
50 | } | 50 | } |
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c index c6700b91a2df..fe166e0f6781 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c | |||
@@ -300,9 +300,9 @@ static void fill_tso_desc(struct hnae_ring *ring, void *priv, | |||
300 | mtu); | 300 | mtu); |
301 | } | 301 | } |
302 | 302 | ||
303 | int hns_nic_net_xmit_hw(struct net_device *ndev, | 303 | netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev, |
304 | struct sk_buff *skb, | 304 | struct sk_buff *skb, |
305 | struct hns_nic_ring_data *ring_data) | 305 | struct hns_nic_ring_data *ring_data) |
306 | { | 306 | { |
307 | struct hns_nic_priv *priv = netdev_priv(ndev); | 307 | struct hns_nic_priv *priv = netdev_priv(ndev); |
308 | struct hnae_ring *ring = ring_data->ring; | 308 | struct hnae_ring *ring = ring_data->ring; |
@@ -361,6 +361,10 @@ int hns_nic_net_xmit_hw(struct net_device *ndev, | |||
361 | dev_queue = netdev_get_tx_queue(ndev, skb->queue_mapping); | 361 | dev_queue = netdev_get_tx_queue(ndev, skb->queue_mapping); |
362 | netdev_tx_sent_queue(dev_queue, skb->len); | 362 | netdev_tx_sent_queue(dev_queue, skb->len); |
363 | 363 | ||
364 | netif_trans_update(ndev); | ||
365 | ndev->stats.tx_bytes += skb->len; | ||
366 | ndev->stats.tx_packets++; | ||
367 | |||
364 | wmb(); /* commit all data before submit */ | 368 | wmb(); /* commit all data before submit */ |
365 | assert(skb->queue_mapping < priv->ae_handle->q_num); | 369 | assert(skb->queue_mapping < priv->ae_handle->q_num); |
366 | hnae_queue_xmit(priv->ae_handle->qs[skb->queue_mapping], buf_num); | 370 | hnae_queue_xmit(priv->ae_handle->qs[skb->queue_mapping], buf_num); |
@@ -1469,17 +1473,11 @@ static netdev_tx_t hns_nic_net_xmit(struct sk_buff *skb, | |||
1469 | struct net_device *ndev) | 1473 | struct net_device *ndev) |
1470 | { | 1474 | { |
1471 | struct hns_nic_priv *priv = netdev_priv(ndev); | 1475 | struct hns_nic_priv *priv = netdev_priv(ndev); |
1472 | int ret; | ||
1473 | 1476 | ||
1474 | assert(skb->queue_mapping < ndev->ae_handle->q_num); | 1477 | assert(skb->queue_mapping < ndev->ae_handle->q_num); |
1475 | ret = hns_nic_net_xmit_hw(ndev, skb, | 1478 | |
1476 | &tx_ring_data(priv, skb->queue_mapping)); | 1479 | return hns_nic_net_xmit_hw(ndev, skb, |
1477 | if (ret == NETDEV_TX_OK) { | 1480 | &tx_ring_data(priv, skb->queue_mapping)); |
1478 | netif_trans_update(ndev); | ||
1479 | ndev->stats.tx_bytes += skb->len; | ||
1480 | ndev->stats.tx_packets++; | ||
1481 | } | ||
1482 | return (netdev_tx_t)ret; | ||
1483 | } | 1481 | } |
1484 | 1482 | ||
1485 | static void hns_nic_drop_rx_fetch(struct hns_nic_ring_data *ring_data, | 1483 | static void hns_nic_drop_rx_fetch(struct hns_nic_ring_data *ring_data, |
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.h b/drivers/net/ethernet/hisilicon/hns/hns_enet.h index 1b83232082b2..9cb4c7884201 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.h +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.h | |||
@@ -92,8 +92,8 @@ void hns_ethtool_set_ops(struct net_device *ndev); | |||
92 | void hns_nic_net_reset(struct net_device *ndev); | 92 | void hns_nic_net_reset(struct net_device *ndev); |
93 | void hns_nic_net_reinit(struct net_device *netdev); | 93 | void hns_nic_net_reinit(struct net_device *netdev); |
94 | int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h); | 94 | int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h); |
95 | int hns_nic_net_xmit_hw(struct net_device *ndev, | 95 | netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev, |
96 | struct sk_buff *skb, | 96 | struct sk_buff *skb, |
97 | struct hns_nic_ring_data *ring_data); | 97 | struct hns_nic_ring_data *ring_data); |
98 | 98 | ||
99 | #endif /**__HNS_ENET_H */ | 99 | #endif /**__HNS_ENET_H */ |
diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c b/drivers/net/ethernet/hisilicon/hns_mdio.c index e5221d95afe1..017e08452d8c 100644 --- a/drivers/net/ethernet/hisilicon/hns_mdio.c +++ b/drivers/net/ethernet/hisilicon/hns_mdio.c | |||
@@ -261,7 +261,7 @@ static int hns_mdio_write(struct mii_bus *bus, | |||
261 | 261 | ||
262 | /* config the data needed writing */ | 262 | /* config the data needed writing */ |
263 | cmd_reg_cfg = devad; | 263 | cmd_reg_cfg = devad; |
264 | op = MDIO_C45_WRITE_ADDR; | 264 | op = MDIO_C45_WRITE_DATA; |
265 | } | 265 | } |
266 | 266 | ||
267 | MDIO_SET_REG_FIELD(mdio_dev, MDIO_WDATA_REG, MDIO_WDATA_DATA_M, | 267 | MDIO_SET_REG_FIELD(mdio_dev, MDIO_WDATA_REG, MDIO_WDATA_DATA_M, |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 41a5c5d2ac89..b3d0c2e6347a 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | |||
@@ -2401,15 +2401,10 @@ static int mtk_probe(struct platform_device *pdev) | |||
2401 | { | 2401 | { |
2402 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2402 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
2403 | struct device_node *mac_np; | 2403 | struct device_node *mac_np; |
2404 | const struct of_device_id *match; | ||
2405 | struct mtk_soc_data *soc; | ||
2406 | struct mtk_eth *eth; | 2404 | struct mtk_eth *eth; |
2407 | int err; | 2405 | int err; |
2408 | int i; | 2406 | int i; |
2409 | 2407 | ||
2410 | match = of_match_device(of_mtk_match, &pdev->dev); | ||
2411 | soc = (struct mtk_soc_data *)match->data; | ||
2412 | |||
2413 | eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL); | 2408 | eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL); |
2414 | if (!eth) | 2409 | if (!eth) |
2415 | return -ENOMEM; | 2410 | return -ENOMEM; |
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c index fc10f27e0a0c..6a65c8b33807 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/main.c +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c | |||
@@ -356,6 +356,7 @@ err_free_app_priv: | |||
356 | 356 | ||
357 | static void nfp_flower_clean(struct nfp_app *app) | 357 | static void nfp_flower_clean(struct nfp_app *app) |
358 | { | 358 | { |
359 | nfp_flower_metadata_cleanup(app); | ||
359 | vfree(app->priv); | 360 | vfree(app->priv); |
360 | app->priv = NULL; | 361 | app->priv = NULL; |
361 | } | 362 | } |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 2e69bcdc5b07..99a26a9efec1 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -2229,6 +2229,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi) | |||
2229 | kfree(names); | 2229 | kfree(names); |
2230 | kfree(callbacks); | 2230 | kfree(callbacks); |
2231 | kfree(vqs); | 2231 | kfree(vqs); |
2232 | kfree(ctx); | ||
2232 | 2233 | ||
2233 | return 0; | 2234 | return 0; |
2234 | 2235 | ||
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index f4d0054981c6..8a1eaf3c302a 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c | |||
@@ -922,15 +922,10 @@ static int vrf_del_slave(struct net_device *dev, struct net_device *port_dev) | |||
922 | static void vrf_dev_uninit(struct net_device *dev) | 922 | static void vrf_dev_uninit(struct net_device *dev) |
923 | { | 923 | { |
924 | struct net_vrf *vrf = netdev_priv(dev); | 924 | struct net_vrf *vrf = netdev_priv(dev); |
925 | struct net_device *port_dev; | ||
926 | struct list_head *iter; | ||
927 | 925 | ||
928 | vrf_rtable_release(dev, vrf); | 926 | vrf_rtable_release(dev, vrf); |
929 | vrf_rt6_release(dev, vrf); | 927 | vrf_rt6_release(dev, vrf); |
930 | 928 | ||
931 | netdev_for_each_lower_dev(dev, port_dev, iter) | ||
932 | vrf_del_slave(dev, port_dev); | ||
933 | |||
934 | free_percpu(dev->dstats); | 929 | free_percpu(dev->dstats); |
935 | dev->dstats = NULL; | 930 | dev->dstats = NULL; |
936 | } | 931 | } |
@@ -1386,6 +1381,12 @@ static int vrf_validate(struct nlattr *tb[], struct nlattr *data[], | |||
1386 | 1381 | ||
1387 | static void vrf_dellink(struct net_device *dev, struct list_head *head) | 1382 | static void vrf_dellink(struct net_device *dev, struct list_head *head) |
1388 | { | 1383 | { |
1384 | struct net_device *port_dev; | ||
1385 | struct list_head *iter; | ||
1386 | |||
1387 | netdev_for_each_lower_dev(dev, port_dev, iter) | ||
1388 | vrf_del_slave(dev, port_dev); | ||
1389 | |||
1389 | unregister_netdevice_queue(dev, head); | 1390 | unregister_netdevice_queue(dev, head); |
1390 | } | 1391 | } |
1391 | 1392 | ||
diff --git a/drivers/ptp/ptp_dte.c b/drivers/ptp/ptp_dte.c index 00145a3f1e70..faf6f7a83713 100644 --- a/drivers/ptp/ptp_dte.c +++ b/drivers/ptp/ptp_dte.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #define DTE_WRAP_AROUND_NSEC_SHIFT 44 | 40 | #define DTE_WRAP_AROUND_NSEC_SHIFT 44 |
41 | 41 | ||
42 | /* 44 bits NCO */ | 42 | /* 44 bits NCO */ |
43 | #define DTE_NCO_MAX_NS 0xFFFFFFFFFFF | 43 | #define DTE_NCO_MAX_NS 0xFFFFFFFFFFFLL |
44 | 44 | ||
45 | /* 125MHz with 3.29 reg cfg */ | 45 | /* 125MHz with 3.29 reg cfg */ |
46 | #define DTE_PPB_ADJ(ppb) (u32)(div64_u64((((u64)abs(ppb) * BIT(28)) +\ | 46 | #define DTE_PPB_ADJ(ppb) (u32)(div64_u64((((u64)abs(ppb) * BIT(28)) +\ |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index e48ee2eaaa3e..779b23595596 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -3284,6 +3284,7 @@ void __dev_notify_flags(struct net_device *, unsigned int old_flags, | |||
3284 | int dev_change_name(struct net_device *, const char *); | 3284 | int dev_change_name(struct net_device *, const char *); |
3285 | int dev_set_alias(struct net_device *, const char *, size_t); | 3285 | int dev_set_alias(struct net_device *, const char *, size_t); |
3286 | int dev_change_net_namespace(struct net_device *, struct net *, const char *); | 3286 | int dev_change_net_namespace(struct net_device *, struct net *, const char *); |
3287 | int __dev_set_mtu(struct net_device *, int); | ||
3287 | int dev_set_mtu(struct net_device *, int); | 3288 | int dev_set_mtu(struct net_device *, int); |
3288 | void dev_set_group(struct net_device *, int); | 3289 | void dev_set_group(struct net_device *, int); |
3289 | int dev_set_mac_address(struct net_device *, struct sockaddr *); | 3290 | int dev_set_mac_address(struct net_device *, struct sockaddr *); |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 0fbf73dd531a..199056933dcb 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -22,6 +22,7 @@ struct route_info { | |||
22 | #include <net/flow.h> | 22 | #include <net/flow.h> |
23 | #include <net/ip6_fib.h> | 23 | #include <net/ip6_fib.h> |
24 | #include <net/sock.h> | 24 | #include <net/sock.h> |
25 | #include <net/lwtunnel.h> | ||
25 | #include <linux/ip.h> | 26 | #include <linux/ip.h> |
26 | #include <linux/ipv6.h> | 27 | #include <linux/ipv6.h> |
27 | #include <linux/route.h> | 28 | #include <linux/route.h> |
@@ -232,4 +233,11 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, | |||
232 | return daddr; | 233 | return daddr; |
233 | } | 234 | } |
234 | 235 | ||
236 | static inline bool rt6_duplicate_nexthop(struct rt6_info *a, struct rt6_info *b) | ||
237 | { | ||
238 | return a->dst.dev == b->dst.dev && | ||
239 | a->rt6i_idev == b->rt6i_idev && | ||
240 | ipv6_addr_equal(&a->rt6i_gateway, &b->rt6i_gateway) && | ||
241 | !lwtunnel_cmp_encap(a->dst.lwtstate, b->dst.lwtstate); | ||
242 | } | ||
235 | #endif | 243 | #endif |
diff --git a/include/net/sock.h b/include/net/sock.h index 48e4d5c38f85..8c85791fc196 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -1697,6 +1697,7 @@ static inline void sock_orphan(struct sock *sk) | |||
1697 | 1697 | ||
1698 | static inline void sock_graft(struct sock *sk, struct socket *parent) | 1698 | static inline void sock_graft(struct sock *sk, struct socket *parent) |
1699 | { | 1699 | { |
1700 | WARN_ON(parent->sk); | ||
1700 | write_lock_bh(&sk->sk_callback_lock); | 1701 | write_lock_bh(&sk->sk_callback_lock); |
1701 | sk->sk_wq = parent->wq; | 1702 | sk->sk_wq = parent->wq; |
1702 | parent->sk = sk; | 1703 | parent->sk = sk; |
diff --git a/net/bridge/netfilter/ebt_nflog.c b/net/bridge/netfilter/ebt_nflog.c index c1dc48686200..da1c2fdc08c8 100644 --- a/net/bridge/netfilter/ebt_nflog.c +++ b/net/bridge/netfilter/ebt_nflog.c | |||
@@ -30,6 +30,7 @@ ebt_nflog_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
30 | li.u.ulog.copy_len = info->len; | 30 | li.u.ulog.copy_len = info->len; |
31 | li.u.ulog.group = info->group; | 31 | li.u.ulog.group = info->group; |
32 | li.u.ulog.qthreshold = info->threshold; | 32 | li.u.ulog.qthreshold = info->threshold; |
33 | li.u.ulog.flags = 0; | ||
33 | 34 | ||
34 | nf_log_packet(net, PF_BRIDGE, xt_hooknum(par), skb, xt_in(par), | 35 | nf_log_packet(net, PF_BRIDGE, xt_hooknum(par), skb, xt_in(par), |
35 | xt_out(par), &li, "%s", info->prefix); | 36 | xt_out(par), &li, "%s", info->prefix); |
diff --git a/net/core/dev.c b/net/core/dev.c index 7098fba52be1..02440518dd69 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -6765,7 +6765,7 @@ int dev_change_flags(struct net_device *dev, unsigned int flags) | |||
6765 | } | 6765 | } |
6766 | EXPORT_SYMBOL(dev_change_flags); | 6766 | EXPORT_SYMBOL(dev_change_flags); |
6767 | 6767 | ||
6768 | static int __dev_set_mtu(struct net_device *dev, int new_mtu) | 6768 | int __dev_set_mtu(struct net_device *dev, int new_mtu) |
6769 | { | 6769 | { |
6770 | const struct net_device_ops *ops = dev->netdev_ops; | 6770 | const struct net_device_ops *ops = dev->netdev_ops; |
6771 | 6771 | ||
@@ -6775,6 +6775,7 @@ static int __dev_set_mtu(struct net_device *dev, int new_mtu) | |||
6775 | dev->mtu = new_mtu; | 6775 | dev->mtu = new_mtu; |
6776 | return 0; | 6776 | return 0; |
6777 | } | 6777 | } |
6778 | EXPORT_SYMBOL(__dev_set_mtu); | ||
6778 | 6779 | ||
6779 | /** | 6780 | /** |
6780 | * dev_set_mtu - Change maximum transfer unit | 6781 | * dev_set_mtu - Change maximum transfer unit |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 6ec6900eb300..a20e7f03d5f7 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -943,9 +943,9 @@ struct tcp_md5sig_key *tcp_md5_do_lookup(const struct sock *sk, | |||
943 | } | 943 | } |
944 | EXPORT_SYMBOL(tcp_md5_do_lookup); | 944 | EXPORT_SYMBOL(tcp_md5_do_lookup); |
945 | 945 | ||
946 | struct tcp_md5sig_key *tcp_md5_do_lookup_exact(const struct sock *sk, | 946 | static struct tcp_md5sig_key *tcp_md5_do_lookup_exact(const struct sock *sk, |
947 | const union tcp_md5_addr *addr, | 947 | const union tcp_md5_addr *addr, |
948 | int family, u8 prefixlen) | 948 | int family, u8 prefixlen) |
949 | { | 949 | { |
950 | const struct tcp_sock *tp = tcp_sk(sk); | 950 | const struct tcp_sock *tp = tcp_sk(sk); |
951 | struct tcp_md5sig_key *key; | 951 | struct tcp_md5sig_key *key; |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 5477ba729c36..ebb299cf72b7 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -786,10 +786,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
786 | goto next_iter; | 786 | goto next_iter; |
787 | } | 787 | } |
788 | 788 | ||
789 | if (iter->dst.dev == rt->dst.dev && | 789 | if (rt6_duplicate_nexthop(iter, rt)) { |
790 | iter->rt6i_idev == rt->rt6i_idev && | ||
791 | ipv6_addr_equal(&iter->rt6i_gateway, | ||
792 | &rt->rt6i_gateway)) { | ||
793 | if (rt->rt6i_nsiblings) | 790 | if (rt->rt6i_nsiblings) |
794 | rt->rt6i_nsiblings = 0; | 791 | rt->rt6i_nsiblings = 0; |
795 | if (!(iter->rt6i_flags & RTF_EXPIRES)) | 792 | if (!(iter->rt6i_flags & RTF_EXPIRES)) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 0488a24c2a44..4d30c96a819d 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -3036,17 +3036,11 @@ static int ip6_route_info_append(struct list_head *rt6_nh_list, | |||
3036 | struct rt6_info *rt, struct fib6_config *r_cfg) | 3036 | struct rt6_info *rt, struct fib6_config *r_cfg) |
3037 | { | 3037 | { |
3038 | struct rt6_nh *nh; | 3038 | struct rt6_nh *nh; |
3039 | struct rt6_info *rtnh; | ||
3040 | int err = -EEXIST; | 3039 | int err = -EEXIST; |
3041 | 3040 | ||
3042 | list_for_each_entry(nh, rt6_nh_list, next) { | 3041 | list_for_each_entry(nh, rt6_nh_list, next) { |
3043 | /* check if rt6_info already exists */ | 3042 | /* check if rt6_info already exists */ |
3044 | rtnh = nh->rt6_info; | 3043 | if (rt6_duplicate_nexthop(nh->rt6_info, rt)) |
3045 | |||
3046 | if (rtnh->dst.dev == rt->dst.dev && | ||
3047 | rtnh->rt6i_idev == rt->rt6i_idev && | ||
3048 | ipv6_addr_equal(&rtnh->rt6i_gateway, | ||
3049 | &rt->rt6i_gateway)) | ||
3050 | return err; | 3044 | return err; |
3051 | } | 3045 | } |
3052 | 3046 | ||
diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index bdcfb2d04cd2..ea4f481839dd 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c | |||
@@ -2076,6 +2076,7 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, | |||
2076 | { | 2076 | { |
2077 | struct net *net = sock_net(in_skb->sk); | 2077 | struct net *net = sock_net(in_skb->sk); |
2078 | u32 portid = NETLINK_CB(in_skb).portid; | 2078 | u32 portid = NETLINK_CB(in_skb).portid; |
2079 | u32 in_label = LABEL_NOT_SPECIFIED; | ||
2079 | struct nlattr *tb[RTA_MAX + 1]; | 2080 | struct nlattr *tb[RTA_MAX + 1]; |
2080 | u32 labels[MAX_NEW_LABELS]; | 2081 | u32 labels[MAX_NEW_LABELS]; |
2081 | struct mpls_shim_hdr *hdr; | 2082 | struct mpls_shim_hdr *hdr; |
@@ -2086,9 +2087,8 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, | |||
2086 | struct nlmsghdr *nlh; | 2087 | struct nlmsghdr *nlh; |
2087 | struct sk_buff *skb; | 2088 | struct sk_buff *skb; |
2088 | struct mpls_nh *nh; | 2089 | struct mpls_nh *nh; |
2089 | int err = -EINVAL; | ||
2090 | u32 in_label; | ||
2091 | u8 n_labels; | 2090 | u8 n_labels; |
2091 | int err; | ||
2092 | 2092 | ||
2093 | err = nlmsg_parse(in_nlh, sizeof(*rtm), tb, RTA_MAX, | 2093 | err = nlmsg_parse(in_nlh, sizeof(*rtm), tb, RTA_MAX, |
2094 | rtm_mpls_policy, extack); | 2094 | rtm_mpls_policy, extack); |
@@ -2101,11 +2101,15 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, | |||
2101 | u8 label_count; | 2101 | u8 label_count; |
2102 | 2102 | ||
2103 | if (nla_get_labels(tb[RTA_DST], 1, &label_count, | 2103 | if (nla_get_labels(tb[RTA_DST], 1, &label_count, |
2104 | &in_label, extack)) | 2104 | &in_label, extack)) { |
2105 | err = -EINVAL; | ||
2105 | goto errout; | 2106 | goto errout; |
2107 | } | ||
2106 | 2108 | ||
2107 | if (in_label < MPLS_LABEL_FIRST_UNRESERVED) | 2109 | if (!mpls_label_ok(net, in_label, extack)) { |
2110 | err = -EINVAL; | ||
2108 | goto errout; | 2111 | goto errout; |
2112 | } | ||
2109 | } | 2113 | } |
2110 | 2114 | ||
2111 | rt = mpls_route_input_rcu(net, in_label); | 2115 | rt = mpls_route_input_rcu(net, in_label); |
diff --git a/net/netfilter/nf_conntrack_proto_dccp.c b/net/netfilter/nf_conntrack_proto_dccp.c index b553fdd68816..4707d997558a 100644 --- a/net/netfilter/nf_conntrack_proto_dccp.c +++ b/net/netfilter/nf_conntrack_proto_dccp.c | |||
@@ -872,6 +872,11 @@ static int dccp_init_net(struct net *net, u_int16_t proto) | |||
872 | return dccp_kmemdup_sysctl_table(net, pn, dn); | 872 | return dccp_kmemdup_sysctl_table(net, pn, dn); |
873 | } | 873 | } |
874 | 874 | ||
875 | static struct nf_proto_net *dccp_get_net_proto(struct net *net) | ||
876 | { | ||
877 | return &net->ct.nf_ct_proto.dccp.pn; | ||
878 | } | ||
879 | |||
875 | struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 __read_mostly = { | 880 | struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 __read_mostly = { |
876 | .l3proto = AF_INET, | 881 | .l3proto = AF_INET, |
877 | .l4proto = IPPROTO_DCCP, | 882 | .l4proto = IPPROTO_DCCP, |
@@ -904,6 +909,7 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 __read_mostly = { | |||
904 | }, | 909 | }, |
905 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 910 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
906 | .init_net = dccp_init_net, | 911 | .init_net = dccp_init_net, |
912 | .get_net_proto = dccp_get_net_proto, | ||
907 | }; | 913 | }; |
908 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp4); | 914 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp4); |
909 | 915 | ||
@@ -939,5 +945,6 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp6 __read_mostly = { | |||
939 | }, | 945 | }, |
940 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 946 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
941 | .init_net = dccp_init_net, | 947 | .init_net = dccp_init_net, |
948 | .get_net_proto = dccp_get_net_proto, | ||
942 | }; | 949 | }; |
943 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp6); | 950 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp6); |
diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c index 31c6c8ee9d5d..6eef29d2eec4 100644 --- a/net/netfilter/nf_conntrack_proto_sctp.c +++ b/net/netfilter/nf_conntrack_proto_sctp.c | |||
@@ -783,6 +783,11 @@ static int sctp_init_net(struct net *net, u_int16_t proto) | |||
783 | return sctp_kmemdup_sysctl_table(pn, sn); | 783 | return sctp_kmemdup_sysctl_table(pn, sn); |
784 | } | 784 | } |
785 | 785 | ||
786 | static struct nf_proto_net *sctp_get_net_proto(struct net *net) | ||
787 | { | ||
788 | return &net->ct.nf_ct_proto.sctp.pn; | ||
789 | } | ||
790 | |||
786 | struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 __read_mostly = { | 791 | struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 __read_mostly = { |
787 | .l3proto = PF_INET, | 792 | .l3proto = PF_INET, |
788 | .l4proto = IPPROTO_SCTP, | 793 | .l4proto = IPPROTO_SCTP, |
@@ -816,6 +821,7 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 __read_mostly = { | |||
816 | }, | 821 | }, |
817 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 822 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
818 | .init_net = sctp_init_net, | 823 | .init_net = sctp_init_net, |
824 | .get_net_proto = sctp_get_net_proto, | ||
819 | }; | 825 | }; |
820 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_sctp4); | 826 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_sctp4); |
821 | 827 | ||
@@ -852,5 +858,6 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp6 __read_mostly = { | |||
852 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 858 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
853 | #endif | 859 | #endif |
854 | .init_net = sctp_init_net, | 860 | .init_net = sctp_init_net, |
861 | .get_net_proto = sctp_get_net_proto, | ||
855 | }; | 862 | }; |
856 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_sctp6); | 863 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_sctp6); |
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c index c6dc8caaf5ca..c061d6eb465d 100644 --- a/net/rds/tcp_listen.c +++ b/net/rds/tcp_listen.c | |||
@@ -136,7 +136,7 @@ int rds_tcp_accept_one(struct socket *sock) | |||
136 | if (!sock) /* module unload or netns delete in progress */ | 136 | if (!sock) /* module unload or netns delete in progress */ |
137 | return -ENETUNREACH; | 137 | return -ENETUNREACH; |
138 | 138 | ||
139 | ret = sock_create_kern(sock_net(sock->sk), sock->sk->sk_family, | 139 | ret = sock_create_lite(sock->sk->sk_family, |
140 | sock->sk->sk_type, sock->sk->sk_protocol, | 140 | sock->sk->sk_type, sock->sk->sk_protocol, |
141 | &new_sock); | 141 | &new_sock); |
142 | if (ret) | 142 | if (ret) |
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index f5b45b8b8b16..2a186b201ad2 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -252,6 +252,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | |||
252 | fl6->flowi6_proto = IPPROTO_SCTP; | 252 | fl6->flowi6_proto = IPPROTO_SCTP; |
253 | if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) | 253 | if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) |
254 | fl6->flowi6_oif = daddr->v6.sin6_scope_id; | 254 | fl6->flowi6_oif = daddr->v6.sin6_scope_id; |
255 | else if (asoc) | ||
256 | fl6->flowi6_oif = asoc->base.sk->sk_bound_dev_if; | ||
255 | 257 | ||
256 | pr_debug("%s: dst=%pI6 ", __func__, &fl6->daddr); | 258 | pr_debug("%s: dst=%pI6 ", __func__, &fl6->daddr); |
257 | 259 | ||
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c index a03130a47b85..60aff60e30ad 100644 --- a/net/tls/tls_main.c +++ b/net/tls/tls_main.c | |||
@@ -272,7 +272,7 @@ static int do_tls_getsockopt_tx(struct sock *sk, char __user *optval, | |||
272 | goto out; | 272 | goto out; |
273 | } | 273 | } |
274 | 274 | ||
275 | if (len == sizeof(crypto_info)) { | 275 | if (len == sizeof(*crypto_info)) { |
276 | if (copy_to_user(optval, crypto_info, sizeof(*crypto_info))) | 276 | if (copy_to_user(optval, crypto_info, sizeof(*crypto_info))) |
277 | rc = -EFAULT; | 277 | rc = -EFAULT; |
278 | goto out; | 278 | goto out; |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 45ba3d0872cc..8ce85420ecb0 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -291,8 +291,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | |||
291 | [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, | 291 | [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, |
292 | [NL80211_ATTR_PID] = { .type = NLA_U32 }, | 292 | [NL80211_ATTR_PID] = { .type = NLA_U32 }, |
293 | [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, | 293 | [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, |
294 | [NL80211_ATTR_PMKID] = { .type = NLA_BINARY, | 294 | [NL80211_ATTR_PMKID] = { .len = WLAN_PMKID_LEN }, |
295 | .len = WLAN_PMKID_LEN }, | ||
296 | [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, | 295 | [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, |
297 | [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, | 296 | [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, |
298 | [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, | 297 | [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, |
@@ -348,6 +347,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | |||
348 | [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, | 347 | [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, |
349 | [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 }, | 348 | [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 }, |
350 | [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 }, | 349 | [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 }, |
350 | [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 }, | ||
351 | [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, | 351 | [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, |
352 | [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, | 352 | [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, |
353 | [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, | 353 | [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, |
@@ -520,7 +520,7 @@ nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { | |||
520 | static const struct nla_policy | 520 | static const struct nla_policy |
521 | nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { | 521 | nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { |
522 | [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 }, | 522 | [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 }, |
523 | [NL80211_NAN_FUNC_SERVICE_ID] = { .type = NLA_BINARY, | 523 | [NL80211_NAN_FUNC_SERVICE_ID] = { |
524 | .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, | 524 | .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, |
525 | [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, | 525 | [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, |
526 | [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, | 526 | [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, |
@@ -6469,6 +6469,10 @@ static int validate_scan_freqs(struct nlattr *freqs) | |||
6469 | struct nlattr *attr1, *attr2; | 6469 | struct nlattr *attr1, *attr2; |
6470 | int n_channels = 0, tmp1, tmp2; | 6470 | int n_channels = 0, tmp1, tmp2; |
6471 | 6471 | ||
6472 | nla_for_each_nested(attr1, freqs, tmp1) | ||
6473 | if (nla_len(attr1) != sizeof(u32)) | ||
6474 | return 0; | ||
6475 | |||
6472 | nla_for_each_nested(attr1, freqs, tmp1) { | 6476 | nla_for_each_nested(attr1, freqs, tmp1) { |
6473 | n_channels++; | 6477 | n_channels++; |
6474 | /* | 6478 | /* |