Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 8 Jul 2017 19:01:22 +0000 (12:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 8 Jul 2017 19:01:22 +0000 (12:01 -0700)
Pull networking fixes from David Miller:
 "Mostly fixing some light fallout from the changes that went into the
  merge window.

   1) Fix memory leaks on network namespace teardown in netfilter, from
      Liping Zhang.

   2) When comparing ipv6 nexthops, we have to take the lightweight
      tunnel state into account as well. From David Ahern.

   3) Fix socket option object length check in the new TLS code, from
      Matthias Rosenfelder.

   4) Fix memory leak in nfp driver flower support, from Jakub Kicinski.

   5) Several netlink attribute validation fixes in cfg80211, from
      Srinivas Dasari.

   6) Fix context array leak in virtio_net, from Jason Wang.

   7) SKB use after free in hns driver, from Yusheng Lin.

   8) Fix socket leak on accept() in RDS, from Sowmini Varadhan. Also
      add a WARN_ON() to sock_graft() so other protocol stacks don't
      trip over this as well"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (26 commits)
  net: ethernet: mediatek: remove useless code in mtk_probe()
  mpls: fix uninitialized in_label var warning in mpls_getroute
  doc: SKB_GSO_[IPIP|SIT] have been replaced
  bonding: avoid NETDEV_CHANGEMTU event when unregistering slave
  net/sock: add WARN_ON(parent->sk) in sock_graft()
  rds: tcp: use sock_create_lite() to create the accept socket
  net: hns: Fix a skb used after free bug
  net: hns: Fix a wrong op phy C45 code
  net: macb: Adding Support for Jumbo Frames up to 10240 Bytes in SAMA5D3
  net: Update networking MAINTAINERS entry.
  virtio-net: fix leaking of ctx array
  cfg80211: Validate frequencies nested in NL80211_ATTR_SCAN_FREQUENCIES
  cfg80211: Define nla_policy for NL80211_ATTR_LOCAL_MESH_POWER_MODE
  cfg80211: Check if NAN service ID is of expected size
  cfg80211: Check if PMKID attribute is of expected size
  arcnet: com20020-pci: Fix an error handling path in 'com20020pci_probe()'
  nfp: flower: add missing clean up call to avoid memory leaks
  vrf: fix bug_on triggered by rx when destroying a vrf
  ptp: dte: Use LL suffix for 64-bit constants
  sctp: set the value of flowi6_oif to sk_bound_dev_if to make sctp_v6_get_dst to find the correct route entry.
  ...

30 files changed:
Documentation/networking/segmentation-offloads.txt
MAINTAINERS
drivers/net/arcnet/com20020-pci.c
drivers/net/bonding/bond_main.c
drivers/net/ethernet/cadence/macb_main.c
drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
drivers/net/ethernet/cavium/liquidio/cn66xx_device.c
drivers/net/ethernet/hisilicon/hns/hns_enet.c
drivers/net/ethernet/hisilicon/hns/hns_enet.h
drivers/net/ethernet/hisilicon/hns_mdio.c
drivers/net/ethernet/mediatek/mtk_eth_soc.c
drivers/net/ethernet/netronome/nfp/flower/main.c
drivers/net/virtio_net.c
drivers/net/vrf.c
drivers/ptp/ptp_dte.c
include/linux/netdevice.h
include/net/ip6_route.h
include/net/sock.h
net/bridge/netfilter/ebt_nflog.c
net/core/dev.c
net/ipv4/tcp_ipv4.c
net/ipv6/ip6_fib.c
net/ipv6/route.c
net/mpls/af_mpls.c
net/netfilter/nf_conntrack_proto_dccp.c
net/netfilter/nf_conntrack_proto_sctp.c
net/rds/tcp_listen.c
net/sctp/ipv6.c
net/tls/tls_main.c
net/wireless/nl80211.c

index f200467ade38b530a88e4c0ee88e6676402f10fc..2f09455a993a13eb8e1774e1317f9ef31bd2dacf 100644 (file)
@@ -55,7 +55,7 @@ IPIP, SIT, GRE, UDP Tunnel, and Remote Checksum Offloads
 In addition to the offloads described above it is possible for a frame to
 contain additional headers such as an outer tunnel.  In order to account
 for such instances an additional set of segmentation offload types were
-introduced including SKB_GSO_IPIP, SKB_GSO_SIT, SKB_GSO_GRE, and
+introduced including SKB_GSO_IPXIP4, SKB_GSO_IPXIP6, SKB_GSO_GRE, and
 SKB_GSO_UDP_TUNNEL.  These extra segmentation types are used to identify
 cases where there are more than just 1 set of headers.  For example in the
 case of IPIP and SIT we should have the network and transport headers moved
index 71d438072d57d072f4e23b0b90dc47c757ef0329..154bf8fbf6837902b0d59f8466f0a720ad7276f4 100644 (file)
@@ -9129,9 +9129,7 @@ F:        lib/random32.c
 NETWORKING [IPv4/IPv6]
 M:     "David S. Miller" <davem@davemloft.net>
 M:     Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
-M:     James Morris <jmorris@namei.org>
 M:     Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
-M:     Patrick McHardy <kaber@trash.net>
 L:     netdev@vger.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
 S:     Maintained
index 2d956cb59d06d33c2f605a988a5884b1c21a1012..01cab95487858f094319e4c3ca4748b33e4b9ff7 100644 (file)
@@ -225,8 +225,10 @@ static int com20020pci_probe(struct pci_dev *pdev,
 
                card = devm_kzalloc(&pdev->dev, sizeof(struct com20020_dev),
                                    GFP_KERNEL);
-               if (!card)
-                       return -ENOMEM;
+               if (!card) {
+                       ret = -ENOMEM;
+                       goto out_port;
+               }
 
                card->index = i;
                card->pci_priv = priv;
index 2865f31c607626a9956f7aaa2dce3544403c4279..14ff622190a5b90c827c1be8a0bd9ca54821ec4f 100644 (file)
@@ -1820,7 +1820,7 @@ err_undo_flags:
  */
 static int __bond_release_one(struct net_device *bond_dev,
                              struct net_device *slave_dev,
-                             bool all)
+                             bool all, bool unregister)
 {
        struct bonding *bond = netdev_priv(bond_dev);
        struct slave *slave, *oldcurrent;
@@ -1965,7 +1965,10 @@ static int __bond_release_one(struct net_device *bond_dev,
                dev_set_mac_address(slave_dev, (struct sockaddr *)&ss);
        }
 
-       dev_set_mtu(slave_dev, slave->original_mtu);
+       if (unregister)
+               __dev_set_mtu(slave_dev, slave->original_mtu);
+       else
+               dev_set_mtu(slave_dev, slave->original_mtu);
 
        slave_dev->priv_flags &= ~IFF_BONDING;
 
@@ -1977,7 +1980,7 @@ static int __bond_release_one(struct net_device *bond_dev,
 /* A wrapper used because of ndo_del_link */
 int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
 {
-       return __bond_release_one(bond_dev, slave_dev, false);
+       return __bond_release_one(bond_dev, slave_dev, false, false);
 }
 
 /* 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,
        struct bonding *bond = netdev_priv(bond_dev);
        int ret;
 
-       ret = bond_release(bond_dev, slave_dev);
+       ret = __bond_release_one(bond_dev, slave_dev, false, true);
        if (ret == 0 && !bond_has_slaves(bond)) {
                bond_dev->priv_flags |= IFF_DISABLE_NETPOLL;
                netdev_info(bond_dev, "Destroying bond %s\n",
@@ -3060,7 +3063,7 @@ static int bond_slave_netdev_event(unsigned long event,
                if (bond_dev->type != ARPHRD_ETHER)
                        bond_release_and_destroy(bond_dev, slave_dev);
                else
-                       bond_release(bond_dev, slave_dev);
+                       __bond_release_one(bond_dev, slave_dev, false, true);
                break;
        case NETDEV_UP:
        case NETDEV_CHANGE:
@@ -4252,7 +4255,7 @@ static void bond_uninit(struct net_device *bond_dev)
 
        /* Release the bonded slaves */
        bond_for_each_slave(bond, slave, iter)
-               __bond_release_one(bond_dev, slave->dev, true);
+               __bond_release_one(bond_dev, slave->dev, true, true);
        netdev_info(bond_dev, "Released all slaves\n");
 
        arr = rtnl_dereference(bond->slave_arr);
index e69ebdd65658d0e147c6587a356b873f2f523c54..26d25749c3e41c79b8e0f47ea32e0fb0fe3a657e 100644 (file)
@@ -3314,10 +3314,11 @@ static const struct macb_config sama5d2_config = {
 
 static const struct macb_config sama5d3_config = {
        .caps = MACB_CAPS_SG_DISABLED | MACB_CAPS_GIGABIT_MODE_AVAILABLE
-             | MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII,
+             | MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII | MACB_CAPS_JUMBO,
        .dma_burst_length = 16,
        .clk_init = macb_clk_init,
        .init = macb_init,
+       .jumbo_max_len = 10240,
 };
 
 static const struct macb_config sama5d4_config = {
index 6081c3132135f78215357a15b443db8c94350dce..4b0ca9fb2cb4578b9c74b775d33d4fa638beb21a 100644 (file)
@@ -221,7 +221,7 @@ static int cn23xx_pf_soft_reset(struct octeon_device *oct)
        /* Wait for 100ms as Octeon resets. */
        mdelay(100);
 
-       if (octeon_read_csr64(oct, CN23XX_SLI_SCRATCH1) == 0x1234ULL) {
+       if (octeon_read_csr64(oct, CN23XX_SLI_SCRATCH1)) {
                dev_err(&oct->pci_dev->dev, "OCTEON[%d]: Soft reset failed\n",
                        oct->octeon_id);
                return 1;
index b28253c96d9751f65db3a6e8b4683c918a200bfd..2df7440f58df556d0a8f0fb14f8525d196a2a122 100644 (file)
@@ -44,7 +44,7 @@ int lio_cn6xxx_soft_reset(struct octeon_device *oct)
        /* Wait for 10ms as Octeon resets. */
        mdelay(100);
 
-       if (octeon_read_csr64(oct, CN6XXX_SLI_SCRATCH1) == 0x1234ULL) {
+       if (octeon_read_csr64(oct, CN6XXX_SLI_SCRATCH1)) {
                dev_err(&oct->pci_dev->dev, "Soft reset failed\n");
                return 1;
        }
index c6700b91a2dfd3da02dc8a4b6728fbf92beff4c1..fe166e0f678101bb8b0eee7dfab32380e0a0f3a7 100644 (file)
@@ -300,9 +300,9 @@ static void fill_tso_desc(struct hnae_ring *ring, void *priv,
                             mtu);
 }
 
-int hns_nic_net_xmit_hw(struct net_device *ndev,
-                       struct sk_buff *skb,
-                       struct hns_nic_ring_data *ring_data)
+netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev,
+                               struct sk_buff *skb,
+                               struct hns_nic_ring_data *ring_data)
 {
        struct hns_nic_priv *priv = netdev_priv(ndev);
        struct hnae_ring *ring = ring_data->ring;
@@ -361,6 +361,10 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
        dev_queue = netdev_get_tx_queue(ndev, skb->queue_mapping);
        netdev_tx_sent_queue(dev_queue, skb->len);
 
+       netif_trans_update(ndev);
+       ndev->stats.tx_bytes += skb->len;
+       ndev->stats.tx_packets++;
+
        wmb(); /* commit all data before submit */
        assert(skb->queue_mapping < priv->ae_handle->q_num);
        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,
                                    struct net_device *ndev)
 {
        struct hns_nic_priv *priv = netdev_priv(ndev);
-       int ret;
 
        assert(skb->queue_mapping < ndev->ae_handle->q_num);
-       ret = hns_nic_net_xmit_hw(ndev, skb,
-                                 &tx_ring_data(priv, skb->queue_mapping));
-       if (ret == NETDEV_TX_OK) {
-               netif_trans_update(ndev);
-               ndev->stats.tx_bytes += skb->len;
-               ndev->stats.tx_packets++;
-       }
-       return (netdev_tx_t)ret;
+
+       return hns_nic_net_xmit_hw(ndev, skb,
+                                  &tx_ring_data(priv, skb->queue_mapping));
 }
 
 static void hns_nic_drop_rx_fetch(struct hns_nic_ring_data *ring_data,
index 1b83232082b2a22244b77a05f4125a69cc4a5f32..9cb4c7884201e1eb4c1c160a85517f62f397646a 100644 (file)
@@ -92,8 +92,8 @@ void hns_ethtool_set_ops(struct net_device *ndev);
 void hns_nic_net_reset(struct net_device *ndev);
 void hns_nic_net_reinit(struct net_device *netdev);
 int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h);
-int hns_nic_net_xmit_hw(struct net_device *ndev,
-                       struct sk_buff *skb,
-                       struct hns_nic_ring_data *ring_data);
+netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev,
+                               struct sk_buff *skb,
+                               struct hns_nic_ring_data *ring_data);
 
 #endif /**__HNS_ENET_H */
index e5221d95afe195583b7496130cf1a544d1b1f97f..017e08452d8c0b2ae9b1117e182b099aa36c0447 100644 (file)
@@ -261,7 +261,7 @@ static int hns_mdio_write(struct mii_bus *bus,
 
                /* config the data needed writing */
                cmd_reg_cfg = devad;
-               op = MDIO_C45_WRITE_ADDR;
+               op = MDIO_C45_WRITE_DATA;
        }
 
        MDIO_SET_REG_FIELD(mdio_dev, MDIO_WDATA_REG, MDIO_WDATA_DATA_M,
index 41a5c5d2ac892fe4cf253a5d40ace003ccdab7a3..b3d0c2e6347a636aa23a6f637233d27d7b55f646 100644 (file)
@@ -2401,15 +2401,10 @@ static int mtk_probe(struct platform_device *pdev)
 {
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        struct device_node *mac_np;
-       const struct of_device_id *match;
-       struct mtk_soc_data *soc;
        struct mtk_eth *eth;
        int err;
        int i;
 
-       match = of_match_device(of_mtk_match, &pdev->dev);
-       soc = (struct mtk_soc_data *)match->data;
-
        eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL);
        if (!eth)
                return -ENOMEM;
index fc10f27e0a0cad2f9675f0aedcb662ab6e687630..6a65c8b33807ccb6b7f9394c6f60e0222e2ae396 100644 (file)
@@ -356,6 +356,7 @@ err_free_app_priv:
 
 static void nfp_flower_clean(struct nfp_app *app)
 {
+       nfp_flower_metadata_cleanup(app);
        vfree(app->priv);
        app->priv = NULL;
 }
index 2e69bcdc5b0754827ebcada5b16f39710cab3cf1..99a26a9efec1ab695bae833a1f9dca437e9dde5c 100644 (file)
@@ -2229,6 +2229,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
        kfree(names);
        kfree(callbacks);
        kfree(vqs);
+       kfree(ctx);
 
        return 0;
 
index f4d0054981c63a5d0a6540c1fc1d40c3096ad726..8a1eaf3c302a6d68b7a03356bf418e90dca215e7 100644 (file)
@@ -922,15 +922,10 @@ static int vrf_del_slave(struct net_device *dev, struct net_device *port_dev)
 static void vrf_dev_uninit(struct net_device *dev)
 {
        struct net_vrf *vrf = netdev_priv(dev);
-       struct net_device *port_dev;
-       struct list_head *iter;
 
        vrf_rtable_release(dev, vrf);
        vrf_rt6_release(dev, vrf);
 
-       netdev_for_each_lower_dev(dev, port_dev, iter)
-               vrf_del_slave(dev, port_dev);
-
        free_percpu(dev->dstats);
        dev->dstats = NULL;
 }
@@ -1386,6 +1381,12 @@ static int vrf_validate(struct nlattr *tb[], struct nlattr *data[],
 
 static void vrf_dellink(struct net_device *dev, struct list_head *head)
 {
+       struct net_device *port_dev;
+       struct list_head *iter;
+
+       netdev_for_each_lower_dev(dev, port_dev, iter)
+               vrf_del_slave(dev, port_dev);
+
        unregister_netdevice_queue(dev, head);
 }
 
index 00145a3f1e7074518a3d54b5888a056872e4878e..faf6f7a8371374081177543b15caea50af768fe4 100644 (file)
@@ -40,7 +40,7 @@
 #define DTE_WRAP_AROUND_NSEC_SHIFT 44
 
 /* 44 bits NCO */
-#define DTE_NCO_MAX_NS 0xFFFFFFFFFFF
+#define DTE_NCO_MAX_NS 0xFFFFFFFFFFFLL
 
 /* 125MHz with 3.29 reg cfg */
 #define DTE_PPB_ADJ(ppb) (u32)(div64_u64((((u64)abs(ppb) * BIT(28)) +\
index e48ee2eaaa3e6dd8c35d0e867bcb95bbb5f1c2b9..779b235955968353a926709436483bc3ea63dde9 100644 (file)
@@ -3284,6 +3284,7 @@ void __dev_notify_flags(struct net_device *, unsigned int old_flags,
 int dev_change_name(struct net_device *, const char *);
 int dev_set_alias(struct net_device *, const char *, size_t);
 int dev_change_net_namespace(struct net_device *, struct net *, const char *);
+int __dev_set_mtu(struct net_device *, int);
 int dev_set_mtu(struct net_device *, int);
 void dev_set_group(struct net_device *, int);
 int dev_set_mac_address(struct net_device *, struct sockaddr *);
index 0fbf73dd531a76d6e5ad06528991a301786099df..199056933dcbf44cf25c00619cf4af8db66997da 100644 (file)
@@ -22,6 +22,7 @@ struct route_info {
 #include <net/flow.h>
 #include <net/ip6_fib.h>
 #include <net/sock.h>
+#include <net/lwtunnel.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/route.h>
@@ -232,4 +233,11 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt,
                return daddr;
 }
 
+static inline bool rt6_duplicate_nexthop(struct rt6_info *a, struct rt6_info *b)
+{
+       return a->dst.dev == b->dst.dev &&
+              a->rt6i_idev == b->rt6i_idev &&
+              ipv6_addr_equal(&a->rt6i_gateway, &b->rt6i_gateway) &&
+              !lwtunnel_cmp_encap(a->dst.lwtstate, b->dst.lwtstate);
+}
 #endif
index 48e4d5c38f855433c4e41af9b4ebac6eea8bb754..8c85791fc196c90d0ca52f8a6fadc65cf2faa479 100644 (file)
@@ -1697,6 +1697,7 @@ static inline void sock_orphan(struct sock *sk)
 
 static inline void sock_graft(struct sock *sk, struct socket *parent)
 {
+       WARN_ON(parent->sk);
        write_lock_bh(&sk->sk_callback_lock);
        sk->sk_wq = parent->wq;
        parent->sk = sk;
index c1dc486862002f4f492d81d91e2165c4e9084ed2..da1c2fdc08c8915ba6a3cfeb1cdc148fc10d7523 100644 (file)
@@ -30,6 +30,7 @@ ebt_nflog_tg(struct sk_buff *skb, const struct xt_action_param *par)
        li.u.ulog.copy_len = info->len;
        li.u.ulog.group = info->group;
        li.u.ulog.qthreshold = info->threshold;
+       li.u.ulog.flags = 0;
 
        nf_log_packet(net, PF_BRIDGE, xt_hooknum(par), skb, xt_in(par),
                      xt_out(par), &li, "%s", info->prefix);
index 7098fba52be1aae749e198b3c2ef999efbd986cd..02440518dd69eafb1594981749678ce78c2c57e0 100644 (file)
@@ -6765,7 +6765,7 @@ int dev_change_flags(struct net_device *dev, unsigned int flags)
 }
 EXPORT_SYMBOL(dev_change_flags);
 
-static int __dev_set_mtu(struct net_device *dev, int new_mtu)
+int __dev_set_mtu(struct net_device *dev, int new_mtu)
 {
        const struct net_device_ops *ops = dev->netdev_ops;
 
@@ -6775,6 +6775,7 @@ static int __dev_set_mtu(struct net_device *dev, int new_mtu)
        dev->mtu = new_mtu;
        return 0;
 }
+EXPORT_SYMBOL(__dev_set_mtu);
 
 /**
  *     dev_set_mtu - Change maximum transfer unit
index 6ec6900eb300364bc908de8707b2a175abf04b77..a20e7f03d5f7d81ccf7e92de9bfbbcc3e2df6718 100644 (file)
@@ -943,9 +943,9 @@ struct tcp_md5sig_key *tcp_md5_do_lookup(const struct sock *sk,
 }
 EXPORT_SYMBOL(tcp_md5_do_lookup);
 
-struct tcp_md5sig_key *tcp_md5_do_lookup_exact(const struct sock *sk,
-                                              const union tcp_md5_addr *addr,
-                                              int family, u8 prefixlen)
+static struct tcp_md5sig_key *tcp_md5_do_lookup_exact(const struct sock *sk,
+                                                     const union tcp_md5_addr *addr,
+                                                     int family, u8 prefixlen)
 {
        const struct tcp_sock *tp = tcp_sk(sk);
        struct tcp_md5sig_key *key;
index 5477ba729c362ce1556a2f2a508b71f0b48b2561..ebb299cf72b7e81b77999d43d2e7f83212386f73 100644 (file)
@@ -786,10 +786,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
                                goto next_iter;
                        }
 
-                       if (iter->dst.dev == rt->dst.dev &&
-                           iter->rt6i_idev == rt->rt6i_idev &&
-                           ipv6_addr_equal(&iter->rt6i_gateway,
-                                           &rt->rt6i_gateway)) {
+                       if (rt6_duplicate_nexthop(iter, rt)) {
                                if (rt->rt6i_nsiblings)
                                        rt->rt6i_nsiblings = 0;
                                if (!(iter->rt6i_flags & RTF_EXPIRES))
index 0488a24c2a4425657f2e851aa3cd78fcd1dcea98..4d30c96a819dee548ec34704a34b22774fac5da1 100644 (file)
@@ -3036,17 +3036,11 @@ static int ip6_route_info_append(struct list_head *rt6_nh_list,
                                 struct rt6_info *rt, struct fib6_config *r_cfg)
 {
        struct rt6_nh *nh;
-       struct rt6_info *rtnh;
        int err = -EEXIST;
 
        list_for_each_entry(nh, rt6_nh_list, next) {
                /* check if rt6_info already exists */
-               rtnh = nh->rt6_info;
-
-               if (rtnh->dst.dev == rt->dst.dev &&
-                   rtnh->rt6i_idev == rt->rt6i_idev &&
-                   ipv6_addr_equal(&rtnh->rt6i_gateway,
-                                   &rt->rt6i_gateway))
+               if (rt6_duplicate_nexthop(nh->rt6_info, rt))
                        return err;
        }
 
index bdcfb2d04cd292c4099977f3b09be1ae47e1d3ce..ea4f481839dd9a3d16ec2e87922e87e2684d094c 100644 (file)
@@ -2076,6 +2076,7 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh,
 {
        struct net *net = sock_net(in_skb->sk);
        u32 portid = NETLINK_CB(in_skb).portid;
+       u32 in_label = LABEL_NOT_SPECIFIED;
        struct nlattr *tb[RTA_MAX + 1];
        u32 labels[MAX_NEW_LABELS];
        struct mpls_shim_hdr *hdr;
@@ -2086,9 +2087,8 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh,
        struct nlmsghdr *nlh;
        struct sk_buff *skb;
        struct mpls_nh *nh;
-       int err = -EINVAL;
-       u32 in_label;
        u8 n_labels;
+       int err;
 
        err = nlmsg_parse(in_nlh, sizeof(*rtm), tb, RTA_MAX,
                          rtm_mpls_policy, extack);
@@ -2101,11 +2101,15 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh,
                u8 label_count;
 
                if (nla_get_labels(tb[RTA_DST], 1, &label_count,
-                                  &in_label, extack))
+                                  &in_label, extack)) {
+                       err = -EINVAL;
                        goto errout;
+               }
 
-               if (in_label < MPLS_LABEL_FIRST_UNRESERVED)
+               if (!mpls_label_ok(net, in_label, extack)) {
+                       err = -EINVAL;
                        goto errout;
+               }
        }
 
        rt = mpls_route_input_rcu(net, in_label);
index b553fdd68816b98a0f6f58cba3bd7363959479cf..4707d997558af98a2057c418348f1776667ec606 100644 (file)
@@ -872,6 +872,11 @@ static int dccp_init_net(struct net *net, u_int16_t proto)
        return dccp_kmemdup_sysctl_table(net, pn, dn);
 }
 
+static struct nf_proto_net *dccp_get_net_proto(struct net *net)
+{
+       return &net->ct.nf_ct_proto.dccp.pn;
+}
+
 struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 __read_mostly = {
        .l3proto                = AF_INET,
        .l4proto                = IPPROTO_DCCP,
@@ -904,6 +909,7 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 __read_mostly = {
        },
 #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
        .init_net               = dccp_init_net,
+       .get_net_proto          = dccp_get_net_proto,
 };
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp4);
 
@@ -939,5 +945,6 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp6 __read_mostly = {
        },
 #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
        .init_net               = dccp_init_net,
+       .get_net_proto          = dccp_get_net_proto,
 };
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_dccp6);
index 31c6c8ee9d5d40c50b1e0451001051a3dc06d1bf..6eef29d2eec4090efbe654baf4190137417fd943 100644 (file)
@@ -783,6 +783,11 @@ static int sctp_init_net(struct net *net, u_int16_t proto)
        return sctp_kmemdup_sysctl_table(pn, sn);
 }
 
+static struct nf_proto_net *sctp_get_net_proto(struct net *net)
+{
+       return &net->ct.nf_ct_proto.sctp.pn;
+}
+
 struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 __read_mostly = {
        .l3proto                = PF_INET,
        .l4proto                = IPPROTO_SCTP,
@@ -816,6 +821,7 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 __read_mostly = {
        },
 #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
        .init_net               = sctp_init_net,
+       .get_net_proto          = sctp_get_net_proto,
 };
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_sctp4);
 
@@ -852,5 +858,6 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp6 __read_mostly = {
 #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
 #endif
        .init_net               = sctp_init_net,
+       .get_net_proto          = sctp_get_net_proto,
 };
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_sctp6);
index c6dc8caaf5caba922bd2d2975ae05766a0d706f5..c061d6eb465d528966a513173950463ded396c5e 100644 (file)
@@ -136,7 +136,7 @@ int rds_tcp_accept_one(struct socket *sock)
        if (!sock) /* module unload or netns delete in progress */
                return -ENETUNREACH;
 
-       ret = sock_create_kern(sock_net(sock->sk), sock->sk->sk_family,
+       ret = sock_create_lite(sock->sk->sk_family,
                               sock->sk->sk_type, sock->sk->sk_protocol,
                               &new_sock);
        if (ret)
index f5b45b8b8b16e6965d24cd79b150828a608c2121..2a186b201ad2c20594169633b241dacd0cc971c0 100644 (file)
@@ -252,6 +252,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
        fl6->flowi6_proto = IPPROTO_SCTP;
        if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
                fl6->flowi6_oif = daddr->v6.sin6_scope_id;
+       else if (asoc)
+               fl6->flowi6_oif = asoc->base.sk->sk_bound_dev_if;
 
        pr_debug("%s: dst=%pI6 ", __func__, &fl6->daddr);
 
index a03130a47b852cff3fddf174d9cf8ce921e3fe86..60aff60e30ad41380b58fd83b1b79ae5a876513e 100644 (file)
@@ -272,7 +272,7 @@ static int do_tls_getsockopt_tx(struct sock *sk, char __user *optval,
                goto out;
        }
 
-       if (len == sizeof(crypto_info)) {
+       if (len == sizeof(*crypto_info)) {
                if (copy_to_user(optval, crypto_info, sizeof(*crypto_info)))
                        rc = -EFAULT;
                goto out;
index 45ba3d0872cca715dbd7b93843eb47b57053df6b..8ce85420ecb0a7e45567c9c576c6bb9691eb267d 100644 (file)
@@ -291,8 +291,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
        [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
        [NL80211_ATTR_PID] = { .type = NLA_U32 },
        [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
-       [NL80211_ATTR_PMKID] = { .type = NLA_BINARY,
-                                .len = WLAN_PMKID_LEN },
+       [NL80211_ATTR_PMKID] = { .len = WLAN_PMKID_LEN },
        [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
        [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
        [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
@@ -348,6 +347,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
        [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
        [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
        [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
+       [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 },
        [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
        [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
        [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
@@ -520,7 +520,7 @@ nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
 static const struct nla_policy
 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
        [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 },
-       [NL80211_NAN_FUNC_SERVICE_ID] = { .type = NLA_BINARY,
+       [NL80211_NAN_FUNC_SERVICE_ID] = {
                                    .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
        [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
        [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
@@ -6469,6 +6469,10 @@ static int validate_scan_freqs(struct nlattr *freqs)
        struct nlattr *attr1, *attr2;
        int n_channels = 0, tmp1, tmp2;
 
+       nla_for_each_nested(attr1, freqs, tmp1)
+               if (nla_len(attr1) != sizeof(u32))
+                       return 0;
+
        nla_for_each_nested(attr1, freqs, tmp1) {
                n_channels++;
                /*