aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-11-17 23:18:37 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-11-17 23:18:37 -0500
commit817002475046737877915d87889a012d851650fa (patch)
tree1d0148791856595b7731b66702f59796ef9c75ab
parent27eabfaaf4a3049a1592d69ad9969577bcb62791 (diff)
parent461ee7f3286dd50be4726606819c4228bc485a17 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Revert regression inducing change to the IPSEC template resolver, from Steffen Klassert. 2) Peeloffs can cause the wrong sk to be waken up in SCTP, fix from Xin Long. 3) Min packet MTU size is wrong in cpsw driver, from Grygorii Strashko. 4) Fix build failure in netfilter ctnetlink, from Arnd Bergmann. 5) ISDN hisax driver checks pnp_irq() for errors incorrectly, from Arvind Yadav. 6) Fix fealnx driver build failure on MIPS, from Huacai Chen. 7) Fix into leak in SCTP, the scope_id of socket addresses is not always filled in. From Eric W. Biederman. 8) MTU inheritance between physical function and representor fix in nfp driver, from Dirk van der Merwe. 9) Fix memory leak in rsi driver, from Colin Ian King. 10) Fix expiration and generation ID handling of cached ipv4 redirect routes, from Xin Long. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (40 commits) net: usb: hso.c: remove unneeded DRIVER_LICENSE #define ibmvnic: fix dma_mapping_error call ipvlan: NULL pointer dereference panic in ipvlan_port_destroy route: also update fnhe_genid when updating a route cache route: update fnhe_expires for redirect when the fnhe exists sctp: set frag_point in sctp_setsockopt_maxseg correctly rsi: fix memory leak on buf and usb_reg_buf net/netlabel: Add list_next_rcu() in rcu_dereference(). nfp: remove false positive offloads in flower vxlan nfp: register flower reprs for egress dev offload nfp: inherit the max_mtu from the PF netdev nfp: fix vlan receive MAC statistics typo nfp: fix flower offload metadata flag usage virto_net: remove empty file 'virtio_net.' net/sctp: Always set scope_id in sctp_inet6_skb_msgname fealnx: Fix building error on MIPS isdn: hisax: Fix pnp_irq's error checking for setup_teles3 isdn: hisax: Fix pnp_irq's error checking for setup_sedlbauer_isapnp isdn: hisax: Fix pnp_irq's error checking for setup_niccy isdn: hisax: Fix pnp_irq's error checking for setup_ix1micro ...
-rw-r--r--drivers/isdn/hisax/asuscom.c2
-rw-r--r--drivers/isdn/hisax/avm_pci.c2
-rw-r--r--drivers/isdn/hisax/diva.c2
-rw-r--r--drivers/isdn/hisax/elsa.c2
-rw-r--r--drivers/isdn/hisax/hfc_sx.c2
-rw-r--r--drivers/isdn/hisax/hfcscard.c2
-rw-r--r--drivers/isdn/hisax/hisax_fcpcipnp.c2
-rw-r--r--drivers/isdn/hisax/isurf.c2
-rw-r--r--drivers/isdn/hisax/ix1_micro.c2
-rw-r--r--drivers/isdn/hisax/niccy.c2
-rw-r--r--drivers/isdn/hisax/sedlbauer.c2
-rw-r--r--drivers/isdn/hisax/teles3.c2
-rw-r--r--drivers/net/ethernet/fealnx.c6
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c3
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/main.c18
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/main.h5
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/metadata.c7
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/offload.c36
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_app.h20
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c2
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_repr.c11
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_port.h2
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_dcbx.c3
-rw-r--r--drivers/net/ethernet/ti/cpsw.c4
-rw-r--r--drivers/net/hyperv/hyperv_net.h4
-rw-r--r--drivers/net/hyperv/netvsc_drv.c2
-rw-r--r--drivers/net/hyperv/rndis_filter.c136
-rw-r--r--drivers/net/ipvlan/ipvlan_main.c104
-rw-r--r--drivers/net/macsec.c2
-rw-r--r--drivers/net/usb/hso.c3
-rw-r--r--drivers/net/virtio_net.0
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c2
-rw-r--r--drivers/net/wireless/rsi/rsi_91x_usb.c12
-rw-r--r--include/net/genetlink.h11
-rw-r--r--include/net/sctp/sctp.h3
-rw-r--r--include/uapi/linux/seg6.h4
-rw-r--r--net/ipv4/route.c14
-rw-r--r--net/netfilter/nf_conntrack_netlink.c2
-rw-r--r--net/netlabel/netlabel_addrlist.h4
-rw-r--r--net/nfc/netlink.c6
-rw-r--r--net/sctp/ipv6.c5
-rw-r--r--net/sctp/sm_make_chunk.c2
-rw-r--r--net/sctp/socket.c67
-rw-r--r--net/sctp/stream.c32
-rw-r--r--net/tipc/msg.c24
-rw-r--r--net/tipc/msg.h7
-rw-r--r--net/tipc/node.c2
-rw-r--r--net/wireless/nl80211.c4
-rw-r--r--net/xfrm/xfrm_policy.c30
49 files changed, 395 insertions, 228 deletions
diff --git a/drivers/isdn/hisax/asuscom.c b/drivers/isdn/hisax/asuscom.c
index 62f9c43e2377..74c871495e81 100644
--- a/drivers/isdn/hisax/asuscom.c
+++ b/drivers/isdn/hisax/asuscom.c
@@ -348,7 +348,7 @@ int setup_asuscom(struct IsdnCard *card)
348 } 348 }
349 card->para[1] = pnp_port_start(pnp_d, 0); 349 card->para[1] = pnp_port_start(pnp_d, 0);
350 card->para[0] = pnp_irq(pnp_d, 0); 350 card->para[0] = pnp_irq(pnp_d, 0);
351 if (!card->para[0] || !card->para[1]) { 351 if (card->para[0] == -1 || !card->para[1]) {
352 printk(KERN_ERR "AsusPnP:some resources are missing %ld/%lx\n", 352 printk(KERN_ERR "AsusPnP:some resources are missing %ld/%lx\n",
353 card->para[0], card->para[1]); 353 card->para[0], card->para[1]);
354 pnp_disable_dev(pnp_d); 354 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/avm_pci.c b/drivers/isdn/hisax/avm_pci.c
index daf3742cdef6..a18b605fb4f2 100644
--- a/drivers/isdn/hisax/avm_pci.c
+++ b/drivers/isdn/hisax/avm_pci.c
@@ -805,7 +805,7 @@ static int avm_pnp_setup(struct IsdnCardState *cs)
805 cs->hw.avm.cfg_reg = 805 cs->hw.avm.cfg_reg =
806 pnp_port_start(pnp_avm_d, 0); 806 pnp_port_start(pnp_avm_d, 0);
807 cs->irq = pnp_irq(pnp_avm_d, 0); 807 cs->irq = pnp_irq(pnp_avm_d, 0);
808 if (!cs->irq) { 808 if (cs->irq == -1) {
809 printk(KERN_ERR "FritzPnP:No IRQ\n"); 809 printk(KERN_ERR "FritzPnP:No IRQ\n");
810 return (0); 810 return (0);
811 } 811 }
diff --git a/drivers/isdn/hisax/diva.c b/drivers/isdn/hisax/diva.c
index 38bdd3f7b960..d23df7a7784d 100644
--- a/drivers/isdn/hisax/diva.c
+++ b/drivers/isdn/hisax/diva.c
@@ -1093,7 +1093,7 @@ static int setup_diva_isapnp(struct IsdnCard *card)
1093 } 1093 }
1094 card->para[1] = pnp_port_start(pnp_d, 0); 1094 card->para[1] = pnp_port_start(pnp_d, 0);
1095 card->para[0] = pnp_irq(pnp_d, 0); 1095 card->para[0] = pnp_irq(pnp_d, 0);
1096 if (!card->para[0] || !card->para[1]) { 1096 if (card->para[0] == -1 || !card->para[1]) {
1097 printk(KERN_ERR "Diva PnP:some resources are missing %ld/%lx\n", 1097 printk(KERN_ERR "Diva PnP:some resources are missing %ld/%lx\n",
1098 card->para[0], card->para[1]); 1098 card->para[0], card->para[1]);
1099 pnp_disable_dev(pnp_d); 1099 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/elsa.c b/drivers/isdn/hisax/elsa.c
index b21c05820f44..0754c0743790 100644
--- a/drivers/isdn/hisax/elsa.c
+++ b/drivers/isdn/hisax/elsa.c
@@ -945,7 +945,7 @@ static int setup_elsa_isapnp(struct IsdnCard *card)
945 card->para[1] = pnp_port_start(pnp_d, 0); 945 card->para[1] = pnp_port_start(pnp_d, 0);
946 card->para[0] = pnp_irq(pnp_d, 0); 946 card->para[0] = pnp_irq(pnp_d, 0);
947 947
948 if (!card->para[0] || !card->para[1]) { 948 if (card->para[0] == -1 || !card->para[1]) {
949 printk(KERN_ERR "Elsa PnP:some resources are missing %ld/%lx\n", 949 printk(KERN_ERR "Elsa PnP:some resources are missing %ld/%lx\n",
950 card->para[0], card->para[1]); 950 card->para[0], card->para[1]);
951 pnp_disable_dev(pnp_d); 951 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/hfc_sx.c b/drivers/isdn/hisax/hfc_sx.c
index d925f579bc80..4d3b4b2f2612 100644
--- a/drivers/isdn/hisax/hfc_sx.c
+++ b/drivers/isdn/hisax/hfc_sx.c
@@ -1423,7 +1423,7 @@ int setup_hfcsx(struct IsdnCard *card)
1423 } 1423 }
1424 card->para[1] = pnp_port_start(pnp_d, 0); 1424 card->para[1] = pnp_port_start(pnp_d, 0);
1425 card->para[0] = pnp_irq(pnp_d, 0); 1425 card->para[0] = pnp_irq(pnp_d, 0);
1426 if (!card->para[0] || !card->para[1]) { 1426 if (card->para[0] == -1 || !card->para[1]) {
1427 printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n", 1427 printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n",
1428 card->para[0], card->para[1]); 1428 card->para[0], card->para[1]);
1429 pnp_disable_dev(pnp_d); 1429 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/hfcscard.c b/drivers/isdn/hisax/hfcscard.c
index 380bbeda9c74..91b5219499ca 100644
--- a/drivers/isdn/hisax/hfcscard.c
+++ b/drivers/isdn/hisax/hfcscard.c
@@ -196,7 +196,7 @@ int setup_hfcs(struct IsdnCard *card)
196 } 196 }
197 card->para[1] = pnp_port_start(pnp_d, 0); 197 card->para[1] = pnp_port_start(pnp_d, 0);
198 card->para[0] = pnp_irq(pnp_d, 0); 198 card->para[0] = pnp_irq(pnp_d, 0);
199 if (!card->para[0] || !card->para[1]) { 199 if (card->para[0] == -1 || !card->para[1]) {
200 printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n", 200 printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n",
201 card->para[0], card->para[1]); 201 card->para[0], card->para[1]);
202 pnp_disable_dev(pnp_d); 202 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/hisax_fcpcipnp.c b/drivers/isdn/hisax/hisax_fcpcipnp.c
index e4f7573ba9bf..7a7137d8664b 100644
--- a/drivers/isdn/hisax/hisax_fcpcipnp.c
+++ b/drivers/isdn/hisax/hisax_fcpcipnp.c
@@ -940,6 +940,8 @@ static int fcpnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
940 } 940 }
941 adapter->io = pnp_port_start(pdev, 0); 941 adapter->io = pnp_port_start(pdev, 0);
942 adapter->irq = pnp_irq(pdev, 0); 942 adapter->irq = pnp_irq(pdev, 0);
943 if (!adapter->io || adapter->irq == -1)
944 goto err_free;
943 945
944 printk(KERN_INFO "hisax_fcpcipnp: found adapter %s at IO %#x irq %d\n", 946 printk(KERN_INFO "hisax_fcpcipnp: found adapter %s at IO %#x irq %d\n",
945 (char *) dev_id->driver_data, adapter->io, adapter->irq); 947 (char *) dev_id->driver_data, adapter->io, adapter->irq);
diff --git a/drivers/isdn/hisax/isurf.c b/drivers/isdn/hisax/isurf.c
index 1399ddd4f6cb..53e299be4304 100644
--- a/drivers/isdn/hisax/isurf.c
+++ b/drivers/isdn/hisax/isurf.c
@@ -238,7 +238,7 @@ int setup_isurf(struct IsdnCard *card)
238 cs->hw.isurf.reset = pnp_port_start(pnp_d, 0); 238 cs->hw.isurf.reset = pnp_port_start(pnp_d, 0);
239 cs->hw.isurf.phymem = pnp_mem_start(pnp_d, 1); 239 cs->hw.isurf.phymem = pnp_mem_start(pnp_d, 1);
240 cs->irq = pnp_irq(pnp_d, 0); 240 cs->irq = pnp_irq(pnp_d, 0);
241 if (!cs->irq || !cs->hw.isurf.reset || !cs->hw.isurf.phymem) { 241 if (cs->irq == -1 || !cs->hw.isurf.reset || !cs->hw.isurf.phymem) {
242 printk(KERN_ERR "ISurfPnP:some resources are missing %d/%x/%lx\n", 242 printk(KERN_ERR "ISurfPnP:some resources are missing %d/%x/%lx\n",
243 cs->irq, cs->hw.isurf.reset, cs->hw.isurf.phymem); 243 cs->irq, cs->hw.isurf.reset, cs->hw.isurf.phymem);
244 pnp_disable_dev(pnp_d); 244 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/ix1_micro.c b/drivers/isdn/hisax/ix1_micro.c
index 7ae39f5e865d..bfb79f3f0a49 100644
--- a/drivers/isdn/hisax/ix1_micro.c
+++ b/drivers/isdn/hisax/ix1_micro.c
@@ -256,7 +256,7 @@ int setup_ix1micro(struct IsdnCard *card)
256 } 256 }
257 card->para[1] = pnp_port_start(pnp_d, 0); 257 card->para[1] = pnp_port_start(pnp_d, 0);
258 card->para[0] = pnp_irq(pnp_d, 0); 258 card->para[0] = pnp_irq(pnp_d, 0);
259 if (!card->para[0] || !card->para[1]) { 259 if (card->para[0] == -1 || !card->para[1]) {
260 printk(KERN_ERR "ITK PnP:some resources are missing %ld/%lx\n", 260 printk(KERN_ERR "ITK PnP:some resources are missing %ld/%lx\n",
261 card->para[0], card->para[1]); 261 card->para[0], card->para[1]);
262 pnp_disable_dev(pnp_d); 262 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/niccy.c b/drivers/isdn/hisax/niccy.c
index e4c33cfe3ef4..dfbcd2eaa81a 100644
--- a/drivers/isdn/hisax/niccy.c
+++ b/drivers/isdn/hisax/niccy.c
@@ -261,7 +261,7 @@ int setup_niccy(struct IsdnCard *card)
261 card->para[1] = pnp_port_start(pnp_d, 0); 261 card->para[1] = pnp_port_start(pnp_d, 0);
262 card->para[2] = pnp_port_start(pnp_d, 1); 262 card->para[2] = pnp_port_start(pnp_d, 1);
263 card->para[0] = pnp_irq(pnp_d, 0); 263 card->para[0] = pnp_irq(pnp_d, 0);
264 if (!card->para[0] || !card->para[1] || 264 if (card->para[0] == -1 || !card->para[1] ||
265 !card->para[2]) { 265 !card->para[2]) {
266 printk(KERN_ERR "NiccyPnP:some resources are " 266 printk(KERN_ERR "NiccyPnP:some resources are "
267 "missing %ld/%lx/%lx\n", 267 "missing %ld/%lx/%lx\n",
diff --git a/drivers/isdn/hisax/sedlbauer.c b/drivers/isdn/hisax/sedlbauer.c
index f16a47bcef48..c0b97b893495 100644
--- a/drivers/isdn/hisax/sedlbauer.c
+++ b/drivers/isdn/hisax/sedlbauer.c
@@ -558,7 +558,7 @@ static int setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
558 card->para[1] = pnp_port_start(pnp_d, 0); 558 card->para[1] = pnp_port_start(pnp_d, 0);
559 card->para[0] = pnp_irq(pnp_d, 0); 559 card->para[0] = pnp_irq(pnp_d, 0);
560 560
561 if (!card->para[0] || !card->para[1]) { 561 if (card->para[0] == -1 || !card->para[1]) {
562 printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n", 562 printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n",
563 card->para[0], card->para[1]); 563 card->para[0], card->para[1]);
564 pnp_disable_dev(pnp_d); 564 pnp_disable_dev(pnp_d);
diff --git a/drivers/isdn/hisax/teles3.c b/drivers/isdn/hisax/teles3.c
index 38fb2c1a3f0f..1eef693f04f0 100644
--- a/drivers/isdn/hisax/teles3.c
+++ b/drivers/isdn/hisax/teles3.c
@@ -306,7 +306,7 @@ int setup_teles3(struct IsdnCard *card)
306 card->para[2] = pnp_port_start(pnp_d, 1); 306 card->para[2] = pnp_port_start(pnp_d, 1);
307 card->para[1] = pnp_port_start(pnp_d, 0); 307 card->para[1] = pnp_port_start(pnp_d, 0);
308 card->para[0] = pnp_irq(pnp_d, 0); 308 card->para[0] = pnp_irq(pnp_d, 0);
309 if (!card->para[0] || !card->para[1] || !card->para[2]) { 309 if (card->para[0] == -1 || !card->para[1] || !card->para[2]) {
310 printk(KERN_ERR "Teles PnP:some resources are missing %ld/%lx/%lx\n", 310 printk(KERN_ERR "Teles PnP:some resources are missing %ld/%lx/%lx\n",
311 card->para[0], card->para[1], card->para[2]); 311 card->para[0], card->para[1], card->para[2]);
312 pnp_disable_dev(pnp_d); 312 pnp_disable_dev(pnp_d);
diff --git a/drivers/net/ethernet/fealnx.c b/drivers/net/ethernet/fealnx.c
index 23053919ebf5..ae55da60ed0e 100644
--- a/drivers/net/ethernet/fealnx.c
+++ b/drivers/net/ethernet/fealnx.c
@@ -257,8 +257,8 @@ enum rx_desc_status_bits {
257 RXFSD = 0x00000800, /* first descriptor */ 257 RXFSD = 0x00000800, /* first descriptor */
258 RXLSD = 0x00000400, /* last descriptor */ 258 RXLSD = 0x00000400, /* last descriptor */
259 ErrorSummary = 0x80, /* error summary */ 259 ErrorSummary = 0x80, /* error summary */
260 RUNT = 0x40, /* runt packet received */ 260 RUNTPKT = 0x40, /* runt packet received */
261 LONG = 0x20, /* long packet received */ 261 LONGPKT = 0x20, /* long packet received */
262 FAE = 0x10, /* frame align error */ 262 FAE = 0x10, /* frame align error */
263 CRC = 0x08, /* crc error */ 263 CRC = 0x08, /* crc error */
264 RXER = 0x04, /* receive error */ 264 RXER = 0x04, /* receive error */
@@ -1628,7 +1628,7 @@ static int netdev_rx(struct net_device *dev)
1628 dev->name, rx_status); 1628 dev->name, rx_status);
1629 1629
1630 dev->stats.rx_errors++; /* end of a packet. */ 1630 dev->stats.rx_errors++; /* end of a packet. */
1631 if (rx_status & (LONG | RUNT)) 1631 if (rx_status & (LONGPKT | RUNTPKT))
1632 dev->stats.rx_length_errors++; 1632 dev->stats.rx_length_errors++;
1633 if (rx_status & RXER) 1633 if (rx_status & RXER)
1634 dev->stats.rx_frame_errors++; 1634 dev->stats.rx_frame_errors++;
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 04aaacbc3d45..1dc4aef37d3a 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -849,7 +849,6 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
849{ 849{
850 struct device *dev = &adapter->vdev->dev; 850 struct device *dev = &adapter->vdev->dev;
851 union ibmvnic_crq crq; 851 union ibmvnic_crq crq;
852 dma_addr_t dma_addr;
853 int len = 0; 852 int len = 0;
854 853
855 if (adapter->vpd->buff) 854 if (adapter->vpd->buff)
@@ -879,7 +878,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
879 adapter->vpd->dma_addr = 878 adapter->vpd->dma_addr =
880 dma_map_single(dev, adapter->vpd->buff, adapter->vpd->len, 879 dma_map_single(dev, adapter->vpd->buff, adapter->vpd->len,
881 DMA_FROM_DEVICE); 880 DMA_FROM_DEVICE);
882 if (dma_mapping_error(dev, dma_addr)) { 881 if (dma_mapping_error(dev, adapter->vpd->dma_addr)) {
883 dev_err(dev, "Could not map VPD buffer\n"); 882 dev_err(dev, "Could not map VPD buffer\n");
884 kfree(adapter->vpd->buff); 883 kfree(adapter->vpd->buff);
885 return -ENOMEM; 884 return -ENOMEM;
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c
index e0283bb24f06..8fcc90c0d2d3 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.c
@@ -125,6 +125,21 @@ nfp_flower_repr_netdev_stop(struct nfp_app *app, struct nfp_repr *repr)
125 return nfp_flower_cmsg_portmod(repr, false); 125 return nfp_flower_cmsg_portmod(repr, false);
126} 126}
127 127
128static int
129nfp_flower_repr_netdev_init(struct nfp_app *app, struct net_device *netdev)
130{
131 return tc_setup_cb_egdev_register(netdev,
132 nfp_flower_setup_tc_egress_cb,
133 netdev_priv(netdev));
134}
135
136static void
137nfp_flower_repr_netdev_clean(struct nfp_app *app, struct net_device *netdev)
138{
139 tc_setup_cb_egdev_unregister(netdev, nfp_flower_setup_tc_egress_cb,
140 netdev_priv(netdev));
141}
142
128static void nfp_flower_sriov_disable(struct nfp_app *app) 143static void nfp_flower_sriov_disable(struct nfp_app *app)
129{ 144{
130 struct nfp_flower_priv *priv = app->priv; 145 struct nfp_flower_priv *priv = app->priv;
@@ -452,6 +467,9 @@ const struct nfp_app_type app_flower = {
452 .vnic_init = nfp_flower_vnic_init, 467 .vnic_init = nfp_flower_vnic_init,
453 .vnic_clean = nfp_flower_vnic_clean, 468 .vnic_clean = nfp_flower_vnic_clean,
454 469
470 .repr_init = nfp_flower_repr_netdev_init,
471 .repr_clean = nfp_flower_repr_netdev_clean,
472
455 .repr_open = nfp_flower_repr_netdev_open, 473 .repr_open = nfp_flower_repr_netdev_open,
456 .repr_stop = nfp_flower_repr_netdev_stop, 474 .repr_stop = nfp_flower_repr_netdev_stop,
457 475
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.h b/drivers/net/ethernet/netronome/nfp/flower/main.h
index c90e72b7ff5a..e6b26c5ae6e0 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.h
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.h
@@ -52,8 +52,7 @@ struct nfp_app;
52#define NFP_FLOWER_MASK_ELEMENT_RS 1 52#define NFP_FLOWER_MASK_ELEMENT_RS 1
53#define NFP_FLOWER_MASK_HASH_BITS 10 53#define NFP_FLOWER_MASK_HASH_BITS 10
54 54
55#define NFP_FL_META_FLAG_NEW_MASK 128 55#define NFP_FL_META_FLAG_MANAGE_MASK BIT(7)
56#define NFP_FL_META_FLAG_LAST_MASK 1
57 56
58#define NFP_FL_MASK_REUSE_TIME_NS 40000 57#define NFP_FL_MASK_REUSE_TIME_NS 40000
59#define NFP_FL_MASK_ID_LOCATION 1 58#define NFP_FL_MASK_ID_LOCATION 1
@@ -197,5 +196,7 @@ void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
197void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4); 196void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
198void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb); 197void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb);
199void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb); 198void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb);
199int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
200 void *cb_priv);
200 201
201#endif 202#endif
diff --git a/drivers/net/ethernet/netronome/nfp/flower/metadata.c b/drivers/net/ethernet/netronome/nfp/flower/metadata.c
index 193520ef23f0..db977cf8e933 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/metadata.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/metadata.c
@@ -282,7 +282,7 @@ nfp_check_mask_add(struct nfp_app *app, char *mask_data, u32 mask_len,
282 id = nfp_add_mask_table(app, mask_data, mask_len); 282 id = nfp_add_mask_table(app, mask_data, mask_len);
283 if (id < 0) 283 if (id < 0)
284 return false; 284 return false;
285 *meta_flags |= NFP_FL_META_FLAG_NEW_MASK; 285 *meta_flags |= NFP_FL_META_FLAG_MANAGE_MASK;
286 } 286 }
287 *mask_id = id; 287 *mask_id = id;
288 288
@@ -299,6 +299,9 @@ nfp_check_mask_remove(struct nfp_app *app, char *mask_data, u32 mask_len,
299 if (!mask_entry) 299 if (!mask_entry)
300 return false; 300 return false;
301 301
302 if (meta_flags)
303 *meta_flags &= ~NFP_FL_META_FLAG_MANAGE_MASK;
304
302 *mask_id = mask_entry->mask_id; 305 *mask_id = mask_entry->mask_id;
303 mask_entry->ref_cnt--; 306 mask_entry->ref_cnt--;
304 if (!mask_entry->ref_cnt) { 307 if (!mask_entry->ref_cnt) {
@@ -306,7 +309,7 @@ nfp_check_mask_remove(struct nfp_app *app, char *mask_data, u32 mask_len,
306 nfp_release_mask_id(app, *mask_id); 309 nfp_release_mask_id(app, *mask_id);
307 kfree(mask_entry); 310 kfree(mask_entry);
308 if (meta_flags) 311 if (meta_flags)
309 *meta_flags |= NFP_FL_META_FLAG_LAST_MASK; 312 *meta_flags |= NFP_FL_META_FLAG_MANAGE_MASK;
310 } 313 }
311 314
312 return true; 315 return true;
diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c
index cdbb5464b790..f5d73b83dcc2 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c
@@ -131,7 +131,8 @@ static bool nfp_flower_check_higher_than_mac(struct tc_cls_flower_offload *f)
131 131
132static int 132static int
133nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls, 133nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
134 struct tc_cls_flower_offload *flow) 134 struct tc_cls_flower_offload *flow,
135 bool egress)
135{ 136{
136 struct flow_dissector_key_basic *mask_basic = NULL; 137 struct flow_dissector_key_basic *mask_basic = NULL;
137 struct flow_dissector_key_basic *key_basic = NULL; 138 struct flow_dissector_key_basic *key_basic = NULL;
@@ -167,6 +168,9 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
167 skb_flow_dissector_target(flow->dissector, 168 skb_flow_dissector_target(flow->dissector,
168 FLOW_DISSECTOR_KEY_ENC_CONTROL, 169 FLOW_DISSECTOR_KEY_ENC_CONTROL,
169 flow->key); 170 flow->key);
171 if (!egress)
172 return -EOPNOTSUPP;
173
170 if (mask_enc_ctl->addr_type != 0xffff || 174 if (mask_enc_ctl->addr_type != 0xffff ||
171 enc_ctl->addr_type != FLOW_DISSECTOR_KEY_IPV4_ADDRS) 175 enc_ctl->addr_type != FLOW_DISSECTOR_KEY_IPV4_ADDRS)
172 return -EOPNOTSUPP; 176 return -EOPNOTSUPP;
@@ -194,6 +198,9 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
194 198
195 key_layer |= NFP_FLOWER_LAYER_VXLAN; 199 key_layer |= NFP_FLOWER_LAYER_VXLAN;
196 key_size += sizeof(struct nfp_flower_vxlan); 200 key_size += sizeof(struct nfp_flower_vxlan);
201 } else if (egress) {
202 /* Reject non tunnel matches offloaded to egress repr. */
203 return -EOPNOTSUPP;
197 } 204 }
198 205
199 if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) { 206 if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
@@ -315,7 +322,7 @@ err_free_flow:
315 */ 322 */
316static int 323static int
317nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev, 324nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
318 struct tc_cls_flower_offload *flow) 325 struct tc_cls_flower_offload *flow, bool egress)
319{ 326{
320 struct nfp_flower_priv *priv = app->priv; 327 struct nfp_flower_priv *priv = app->priv;
321 struct nfp_fl_payload *flow_pay; 328 struct nfp_fl_payload *flow_pay;
@@ -326,7 +333,7 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
326 if (!key_layer) 333 if (!key_layer)
327 return -ENOMEM; 334 return -ENOMEM;
328 335
329 err = nfp_flower_calculate_key_layers(key_layer, flow); 336 err = nfp_flower_calculate_key_layers(key_layer, flow, egress);
330 if (err) 337 if (err)
331 goto err_free_key_ls; 338 goto err_free_key_ls;
332 339
@@ -447,7 +454,7 @@ nfp_flower_get_stats(struct nfp_app *app, struct tc_cls_flower_offload *flow)
447 454
448static int 455static int
449nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev, 456nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
450 struct tc_cls_flower_offload *flower) 457 struct tc_cls_flower_offload *flower, bool egress)
451{ 458{
452 if (!eth_proto_is_802_3(flower->common.protocol) || 459 if (!eth_proto_is_802_3(flower->common.protocol) ||
453 flower->common.chain_index) 460 flower->common.chain_index)
@@ -455,7 +462,7 @@ nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
455 462
456 switch (flower->command) { 463 switch (flower->command) {
457 case TC_CLSFLOWER_REPLACE: 464 case TC_CLSFLOWER_REPLACE:
458 return nfp_flower_add_offload(app, netdev, flower); 465 return nfp_flower_add_offload(app, netdev, flower, egress);
459 case TC_CLSFLOWER_DESTROY: 466 case TC_CLSFLOWER_DESTROY:
460 return nfp_flower_del_offload(app, netdev, flower); 467 return nfp_flower_del_offload(app, netdev, flower);
461 case TC_CLSFLOWER_STATS: 468 case TC_CLSFLOWER_STATS:
@@ -465,6 +472,23 @@ nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
465 return -EOPNOTSUPP; 472 return -EOPNOTSUPP;
466} 473}
467 474
475int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
476 void *cb_priv)
477{
478 struct nfp_repr *repr = cb_priv;
479
480 if (!tc_can_offload(repr->netdev))
481 return -EOPNOTSUPP;
482
483 switch (type) {
484 case TC_SETUP_CLSFLOWER:
485 return nfp_flower_repr_offload(repr->app, repr->netdev,
486 type_data, true);
487 default:
488 return -EOPNOTSUPP;
489 }
490}
491
468static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type, 492static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
469 void *type_data, void *cb_priv) 493 void *type_data, void *cb_priv)
470{ 494{
@@ -476,7 +500,7 @@ static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
476 switch (type) { 500 switch (type) {
477 case TC_SETUP_CLSFLOWER: 501 case TC_SETUP_CLSFLOWER:
478 return nfp_flower_repr_offload(repr->app, repr->netdev, 502 return nfp_flower_repr_offload(repr->app, repr->netdev,
479 type_data); 503 type_data, false);
480 default: 504 default:
481 return -EOPNOTSUPP; 505 return -EOPNOTSUPP;
482 } 506 }
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h
index 54b67c9b8d5b..0e5e0305ad1c 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_app.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h
@@ -76,6 +76,8 @@ extern const struct nfp_app_type app_flower;
76 * @vnic_free: free up app's vNIC state 76 * @vnic_free: free up app's vNIC state
77 * @vnic_init: vNIC netdev was registered 77 * @vnic_init: vNIC netdev was registered
78 * @vnic_clean: vNIC netdev about to be unregistered 78 * @vnic_clean: vNIC netdev about to be unregistered
79 * @repr_init: representor about to be registered
80 * @repr_clean: representor about to be unregistered
79 * @repr_open: representor netdev open callback 81 * @repr_open: representor netdev open callback
80 * @repr_stop: representor netdev stop callback 82 * @repr_stop: representor netdev stop callback
81 * @start: start application logic 83 * @start: start application logic
@@ -109,6 +111,9 @@ struct nfp_app_type {
109 int (*vnic_init)(struct nfp_app *app, struct nfp_net *nn); 111 int (*vnic_init)(struct nfp_app *app, struct nfp_net *nn);
110 void (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn); 112 void (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn);
111 113
114 int (*repr_init)(struct nfp_app *app, struct net_device *netdev);
115 void (*repr_clean)(struct nfp_app *app, struct net_device *netdev);
116
112 int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr); 117 int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr);
113 int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr); 118 int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr);
114 119
@@ -212,6 +217,21 @@ static inline int nfp_app_repr_stop(struct nfp_app *app, struct nfp_repr *repr)
212 return app->type->repr_stop(app, repr); 217 return app->type->repr_stop(app, repr);
213} 218}
214 219
220static inline int
221nfp_app_repr_init(struct nfp_app *app, struct net_device *netdev)
222{
223 if (!app->type->repr_init)
224 return 0;
225 return app->type->repr_init(app, netdev);
226}
227
228static inline void
229nfp_app_repr_clean(struct nfp_app *app, struct net_device *netdev)
230{
231 if (app->type->repr_clean)
232 app->type->repr_clean(app, netdev);
233}
234
215static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl) 235static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl)
216{ 236{
217 app->ctrl = ctrl; 237 app->ctrl = ctrl;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
index 60c8d733a37d..2801ecd09eab 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
@@ -104,7 +104,7 @@ static const struct nfp_et_stat nfp_mac_et_stats[] = {
104 { "rx_frame_too_long_errors", 104 { "rx_frame_too_long_errors",
105 NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS, }, 105 NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS, },
106 { "rx_range_length_errors", NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS, }, 106 { "rx_range_length_errors", NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS, },
107 { "rx_vlan_reveive_ok", NFP_MAC_STATS_RX_VLAN_REVEIVE_OK, }, 107 { "rx_vlan_received_ok", NFP_MAC_STATS_RX_VLAN_RECEIVED_OK, },
108 { "rx_errors", NFP_MAC_STATS_RX_IN_ERRORS, }, 108 { "rx_errors", NFP_MAC_STATS_RX_IN_ERRORS, },
109 { "rx_broadcast_pkts", NFP_MAC_STATS_RX_IN_BROADCAST_PKTS, }, 109 { "rx_broadcast_pkts", NFP_MAC_STATS_RX_IN_BROADCAST_PKTS, },
110 { "rx_drop_events", NFP_MAC_STATS_RX_DROP_EVENTS, }, 110 { "rx_drop_events", NFP_MAC_STATS_RX_DROP_EVENTS, },
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
index 1bce8c131bb9..924a05e05da0 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
@@ -258,6 +258,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
258static void nfp_repr_clean(struct nfp_repr *repr) 258static void nfp_repr_clean(struct nfp_repr *repr)
259{ 259{
260 unregister_netdev(repr->netdev); 260 unregister_netdev(repr->netdev);
261 nfp_app_repr_clean(repr->app, repr->netdev);
261 dst_release((struct dst_entry *)repr->dst); 262 dst_release((struct dst_entry *)repr->dst);
262 nfp_port_free(repr->port); 263 nfp_port_free(repr->port);
263} 264}
@@ -297,6 +298,8 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
297 netdev->netdev_ops = &nfp_repr_netdev_ops; 298 netdev->netdev_ops = &nfp_repr_netdev_ops;
298 netdev->ethtool_ops = &nfp_port_ethtool_ops; 299 netdev->ethtool_ops = &nfp_port_ethtool_ops;
299 300
301 netdev->max_mtu = pf_netdev->max_mtu;
302
300 SWITCHDEV_SET_OPS(netdev, &nfp_port_switchdev_ops); 303 SWITCHDEV_SET_OPS(netdev, &nfp_port_switchdev_ops);
301 304
302 if (nfp_app_has_tc(app)) { 305 if (nfp_app_has_tc(app)) {
@@ -304,12 +307,18 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
304 netdev->hw_features |= NETIF_F_HW_TC; 307 netdev->hw_features |= NETIF_F_HW_TC;
305 } 308 }
306 309
307 err = register_netdev(netdev); 310 err = nfp_app_repr_init(app, netdev);
308 if (err) 311 if (err)
309 goto err_clean; 312 goto err_clean;
310 313
314 err = register_netdev(netdev);
315 if (err)
316 goto err_repr_clean;
317
311 return 0; 318 return 0;
312 319
320err_repr_clean:
321 nfp_app_repr_clean(app, netdev);
313err_clean: 322err_clean:
314 dst_release((struct dst_entry *)repr->dst); 323 dst_release((struct dst_entry *)repr->dst);
315 return err; 324 return err;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.h b/drivers/net/ethernet/netronome/nfp/nfp_port.h
index 51dcb9c603ee..21bd4aa32646 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_port.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_port.h
@@ -157,7 +157,7 @@ void nfp_devlink_port_unregister(struct nfp_port *port);
157 /* unused 0x008 */ 157 /* unused 0x008 */
158#define NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS (NFP_MAC_STATS_BASE + 0x010) 158#define NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS (NFP_MAC_STATS_BASE + 0x010)
159#define NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS (NFP_MAC_STATS_BASE + 0x018) 159#define NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS (NFP_MAC_STATS_BASE + 0x018)
160#define NFP_MAC_STATS_RX_VLAN_REVEIVE_OK (NFP_MAC_STATS_BASE + 0x020) 160#define NFP_MAC_STATS_RX_VLAN_RECEIVED_OK (NFP_MAC_STATS_BASE + 0x020)
161#define NFP_MAC_STATS_RX_IN_ERRORS (NFP_MAC_STATS_BASE + 0x028) 161#define NFP_MAC_STATS_RX_IN_ERRORS (NFP_MAC_STATS_BASE + 0x028)
162#define NFP_MAC_STATS_RX_IN_BROADCAST_PKTS (NFP_MAC_STATS_BASE + 0x030) 162#define NFP_MAC_STATS_RX_IN_BROADCAST_PKTS (NFP_MAC_STATS_BASE + 0x030)
163#define NFP_MAC_STATS_RX_DROP_EVENTS (NFP_MAC_STATS_BASE + 0x038) 163#define NFP_MAC_STATS_RX_DROP_EVENTS (NFP_MAC_STATS_BASE + 0x038)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
index 6e15d3c10ebf..fe7c1f230028 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
@@ -1277,11 +1277,10 @@ static struct qed_dcbx_get *qed_dcbnl_get_dcbx(struct qed_hwfn *hwfn,
1277{ 1277{
1278 struct qed_dcbx_get *dcbx_info; 1278 struct qed_dcbx_get *dcbx_info;
1279 1279
1280 dcbx_info = kmalloc(sizeof(*dcbx_info), GFP_ATOMIC); 1280 dcbx_info = kzalloc(sizeof(*dcbx_info), GFP_ATOMIC);
1281 if (!dcbx_info) 1281 if (!dcbx_info)
1282 return NULL; 1282 return NULL;
1283 1283
1284 memset(dcbx_info, 0, sizeof(*dcbx_info));
1285 if (qed_dcbx_query_params(hwfn, dcbx_info, type)) { 1284 if (qed_dcbx_query_params(hwfn, dcbx_info, type)) {
1286 kfree(dcbx_info); 1285 kfree(dcbx_info);
1287 return NULL; 1286 return NULL;
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index db8a4bcfc6c7..a73600dceb8b 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -119,8 +119,8 @@ do { \
119#define CPDMA_RXCP 0x60 119#define CPDMA_RXCP 0x60
120 120
121#define CPSW_POLL_WEIGHT 64 121#define CPSW_POLL_WEIGHT 64
122#define CPSW_MIN_PACKET_SIZE 60 122#define CPSW_MIN_PACKET_SIZE (VLAN_ETH_ZLEN)
123#define CPSW_MAX_PACKET_SIZE (1500 + 14 + 4 + 4) 123#define CPSW_MAX_PACKET_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
124 124
125#define RX_PRIORITY_MAPPING 0x76543210 125#define RX_PRIORITY_MAPPING 0x76543210
126#define TX_PRIORITY_MAPPING 0x33221100 126#define TX_PRIORITY_MAPPING 0x33221100
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index 4958bb6b7376..88ddfb92122b 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -646,6 +646,10 @@ struct nvsp_message {
646#define NETVSC_RECEIVE_BUFFER_ID 0xcafe 646#define NETVSC_RECEIVE_BUFFER_ID 0xcafe
647#define NETVSC_SEND_BUFFER_ID 0 647#define NETVSC_SEND_BUFFER_ID 0
648 648
649#define NETVSC_SUPPORTED_HW_FEATURES (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | \
650 NETIF_F_TSO | NETIF_F_IPV6_CSUM | \
651 NETIF_F_TSO6)
652
649#define VRSS_SEND_TAB_SIZE 16 /* must be power of 2 */ 653#define VRSS_SEND_TAB_SIZE 16 /* must be power of 2 */
650#define VRSS_CHANNEL_MAX 64 654#define VRSS_CHANNEL_MAX 64
651#define VRSS_CHANNEL_DEFAULT 8 655#define VRSS_CHANNEL_DEFAULT 8
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index da216ca4f2b2..5129647d420c 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -2011,7 +2011,7 @@ static int netvsc_probe(struct hv_device *dev,
2011 2011
2012 memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); 2012 memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN);
2013 2013
2014 /* hw_features computed in rndis_filter_device_add */ 2014 /* hw_features computed in rndis_netdev_set_hwcaps() */
2015 net->features = net->hw_features | 2015 net->features = net->hw_features |
2016 NETIF_F_HIGHDMA | NETIF_F_SG | 2016 NETIF_F_HIGHDMA | NETIF_F_SG |
2017 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX; 2017 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index 8b1242b8d8ef..7b637c7dd1e5 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -1131,69 +1131,20 @@ unlock:
1131 rtnl_unlock(); 1131 rtnl_unlock();
1132} 1132}
1133 1133
1134struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, 1134static int rndis_netdev_set_hwcaps(struct rndis_device *rndis_device,
1135 struct netvsc_device_info *device_info) 1135 struct netvsc_device *nvdev)
1136{ 1136{
1137 struct net_device *net = hv_get_drvdata(dev); 1137 struct net_device *net = rndis_device->ndev;
1138 struct net_device_context *net_device_ctx = netdev_priv(net); 1138 struct net_device_context *net_device_ctx = netdev_priv(net);
1139 struct netvsc_device *net_device;
1140 struct rndis_device *rndis_device;
1141 struct ndis_offload hwcaps; 1139 struct ndis_offload hwcaps;
1142 struct ndis_offload_params offloads; 1140 struct ndis_offload_params offloads;
1143 struct ndis_recv_scale_cap rsscap;
1144 u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
1145 unsigned int gso_max_size = GSO_MAX_SIZE; 1141 unsigned int gso_max_size = GSO_MAX_SIZE;
1146 u32 mtu, size; 1142 int ret;
1147 const struct cpumask *node_cpu_mask;
1148 u32 num_possible_rss_qs;
1149 int i, ret;
1150
1151 rndis_device = get_rndis_device();
1152 if (!rndis_device)
1153 return ERR_PTR(-ENODEV);
1154
1155 /*
1156 * Let the inner driver handle this first to create the netvsc channel
1157 * NOTE! Once the channel is created, we may get a receive callback
1158 * (RndisFilterOnReceive()) before this call is completed
1159 */
1160 net_device = netvsc_device_add(dev, device_info);
1161 if (IS_ERR(net_device)) {
1162 kfree(rndis_device);
1163 return net_device;
1164 }
1165
1166 /* Initialize the rndis device */
1167 net_device->max_chn = 1;
1168 net_device->num_chn = 1;
1169
1170 net_device->extension = rndis_device;
1171 rndis_device->ndev = net;
1172
1173 /* Send the rndis initialization message */
1174 ret = rndis_filter_init_device(rndis_device, net_device);
1175 if (ret != 0)
1176 goto err_dev_remv;
1177
1178 /* Get the MTU from the host */
1179 size = sizeof(u32);
1180 ret = rndis_filter_query_device(rndis_device, net_device,
1181 RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
1182 &mtu, &size);
1183 if (ret == 0 && size == sizeof(u32) && mtu < net->mtu)
1184 net->mtu = mtu;
1185
1186 /* Get the mac address */
1187 ret = rndis_filter_query_device_mac(rndis_device, net_device);
1188 if (ret != 0)
1189 goto err_dev_remv;
1190
1191 memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
1192 1143
1193 /* Find HW offload capabilities */ 1144 /* Find HW offload capabilities */
1194 ret = rndis_query_hwcaps(rndis_device, net_device, &hwcaps); 1145 ret = rndis_query_hwcaps(rndis_device, nvdev, &hwcaps);
1195 if (ret != 0) 1146 if (ret != 0)
1196 goto err_dev_remv; 1147 return ret;
1197 1148
1198 /* A value of zero means "no change"; now turn on what we want. */ 1149 /* A value of zero means "no change"; now turn on what we want. */
1199 memset(&offloads, 0, sizeof(struct ndis_offload_params)); 1150 memset(&offloads, 0, sizeof(struct ndis_offload_params));
@@ -1201,8 +1152,12 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
1201 /* Linux does not care about IP checksum, always does in kernel */ 1152 /* Linux does not care about IP checksum, always does in kernel */
1202 offloads.ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED; 1153 offloads.ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED;
1203 1154
1155 /* Reset previously set hw_features flags */
1156 net->hw_features &= ~NETVSC_SUPPORTED_HW_FEATURES;
1157 net_device_ctx->tx_checksum_mask = 0;
1158
1204 /* Compute tx offload settings based on hw capabilities */ 1159 /* Compute tx offload settings based on hw capabilities */
1205 net->hw_features = NETIF_F_RXCSUM; 1160 net->hw_features |= NETIF_F_RXCSUM;
1206 1161
1207 if ((hwcaps.csum.ip4_txcsum & NDIS_TXCSUM_ALL_TCP4) == NDIS_TXCSUM_ALL_TCP4) { 1162 if ((hwcaps.csum.ip4_txcsum & NDIS_TXCSUM_ALL_TCP4) == NDIS_TXCSUM_ALL_TCP4) {
1208 /* Can checksum TCP */ 1163 /* Can checksum TCP */
@@ -1246,10 +1201,75 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
1246 } 1201 }
1247 } 1202 }
1248 1203
1204 /* In case some hw_features disappeared we need to remove them from
1205 * net->features list as they're no longer supported.
1206 */
1207 net->features &= ~NETVSC_SUPPORTED_HW_FEATURES | net->hw_features;
1208
1249 netif_set_gso_max_size(net, gso_max_size); 1209 netif_set_gso_max_size(net, gso_max_size);
1250 1210
1251 ret = rndis_filter_set_offload_params(net, net_device, &offloads); 1211 ret = rndis_filter_set_offload_params(net, nvdev, &offloads);
1252 if (ret) 1212
1213 return ret;
1214}
1215
1216struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
1217 struct netvsc_device_info *device_info)
1218{
1219 struct net_device *net = hv_get_drvdata(dev);
1220 struct netvsc_device *net_device;
1221 struct rndis_device *rndis_device;
1222 struct ndis_recv_scale_cap rsscap;
1223 u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
1224 u32 mtu, size;
1225 const struct cpumask *node_cpu_mask;
1226 u32 num_possible_rss_qs;
1227 int i, ret;
1228
1229 rndis_device = get_rndis_device();
1230 if (!rndis_device)
1231 return ERR_PTR(-ENODEV);
1232
1233 /* Let the inner driver handle this first to create the netvsc channel
1234 * NOTE! Once the channel is created, we may get a receive callback
1235 * (RndisFilterOnReceive()) before this call is completed
1236 */
1237 net_device = netvsc_device_add(dev, device_info);
1238 if (IS_ERR(net_device)) {
1239 kfree(rndis_device);
1240 return net_device;
1241 }
1242
1243 /* Initialize the rndis device */
1244 net_device->max_chn = 1;
1245 net_device->num_chn = 1;
1246
1247 net_device->extension = rndis_device;
1248 rndis_device->ndev = net;
1249
1250 /* Send the rndis initialization message */
1251 ret = rndis_filter_init_device(rndis_device, net_device);
1252 if (ret != 0)
1253 goto err_dev_remv;
1254
1255 /* Get the MTU from the host */
1256 size = sizeof(u32);
1257 ret = rndis_filter_query_device(rndis_device, net_device,
1258 RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
1259 &mtu, &size);
1260 if (ret == 0 && size == sizeof(u32) && mtu < net->mtu)
1261 net->mtu = mtu;
1262
1263 /* Get the mac address */
1264 ret = rndis_filter_query_device_mac(rndis_device, net_device);
1265 if (ret != 0)
1266 goto err_dev_remv;
1267
1268 memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
1269
1270 /* Query and set hardware capabilities */
1271 ret = rndis_netdev_set_hwcaps(rndis_device, net_device);
1272 if (ret != 0)
1253 goto err_dev_remv; 1273 goto err_dev_remv;
1254 1274
1255 rndis_filter_query_device_link_status(rndis_device, net_device); 1275 rndis_filter_query_device_link_status(rndis_device, net_device);
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index a266aa435d4d..30cb803e2fe5 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -107,16 +107,6 @@ static int ipvlan_port_create(struct net_device *dev)
107 struct ipvl_port *port; 107 struct ipvl_port *port;
108 int err, idx; 108 int err, idx;
109 109
110 if (dev->type != ARPHRD_ETHER || dev->flags & IFF_LOOPBACK) {
111 netdev_err(dev, "Master is either lo or non-ether device\n");
112 return -EINVAL;
113 }
114
115 if (netdev_is_rx_handler_busy(dev)) {
116 netdev_err(dev, "Device is already in use.\n");
117 return -EBUSY;
118 }
119
120 port = kzalloc(sizeof(struct ipvl_port), GFP_KERNEL); 110 port = kzalloc(sizeof(struct ipvl_port), GFP_KERNEL);
121 if (!port) 111 if (!port)
122 return -ENOMEM; 112 return -ENOMEM;
@@ -179,8 +169,9 @@ static void ipvlan_port_destroy(struct net_device *dev)
179static int ipvlan_init(struct net_device *dev) 169static int ipvlan_init(struct net_device *dev)
180{ 170{
181 struct ipvl_dev *ipvlan = netdev_priv(dev); 171 struct ipvl_dev *ipvlan = netdev_priv(dev);
182 const struct net_device *phy_dev = ipvlan->phy_dev; 172 struct net_device *phy_dev = ipvlan->phy_dev;
183 struct ipvl_port *port = ipvlan->port; 173 struct ipvl_port *port;
174 int err;
184 175
185 dev->state = (dev->state & ~IPVLAN_STATE_MASK) | 176 dev->state = (dev->state & ~IPVLAN_STATE_MASK) |
186 (phy_dev->state & IPVLAN_STATE_MASK); 177 (phy_dev->state & IPVLAN_STATE_MASK);
@@ -196,18 +187,27 @@ static int ipvlan_init(struct net_device *dev)
196 if (!ipvlan->pcpu_stats) 187 if (!ipvlan->pcpu_stats)
197 return -ENOMEM; 188 return -ENOMEM;
198 189
190 if (!netif_is_ipvlan_port(phy_dev)) {
191 err = ipvlan_port_create(phy_dev);
192 if (err < 0) {
193 free_percpu(ipvlan->pcpu_stats);
194 return err;
195 }
196 }
197 port = ipvlan_port_get_rtnl(phy_dev);
199 port->count += 1; 198 port->count += 1;
200
201 return 0; 199 return 0;
202} 200}
203 201
204static void ipvlan_uninit(struct net_device *dev) 202static void ipvlan_uninit(struct net_device *dev)
205{ 203{
206 struct ipvl_dev *ipvlan = netdev_priv(dev); 204 struct ipvl_dev *ipvlan = netdev_priv(dev);
207 struct ipvl_port *port = ipvlan->port; 205 struct net_device *phy_dev = ipvlan->phy_dev;
206 struct ipvl_port *port;
208 207
209 free_percpu(ipvlan->pcpu_stats); 208 free_percpu(ipvlan->pcpu_stats);
210 209
210 port = ipvlan_port_get_rtnl(phy_dev);
211 port->count -= 1; 211 port->count -= 1;
212 if (!port->count) 212 if (!port->count)
213 ipvlan_port_destroy(port->dev); 213 ipvlan_port_destroy(port->dev);
@@ -554,7 +554,6 @@ int ipvlan_link_new(struct net *src_net, struct net_device *dev,
554 struct net_device *phy_dev; 554 struct net_device *phy_dev;
555 int err; 555 int err;
556 u16 mode = IPVLAN_MODE_L3; 556 u16 mode = IPVLAN_MODE_L3;
557 bool create = false;
558 557
559 if (!tb[IFLA_LINK]) 558 if (!tb[IFLA_LINK])
560 return -EINVAL; 559 return -EINVAL;
@@ -568,28 +567,41 @@ int ipvlan_link_new(struct net *src_net, struct net_device *dev,
568 567
569 phy_dev = tmp->phy_dev; 568 phy_dev = tmp->phy_dev;
570 } else if (!netif_is_ipvlan_port(phy_dev)) { 569 } else if (!netif_is_ipvlan_port(phy_dev)) {
571 err = ipvlan_port_create(phy_dev); 570 /* Exit early if the underlying link is invalid or busy */
572 if (err < 0) 571 if (phy_dev->type != ARPHRD_ETHER ||
573 return err; 572 phy_dev->flags & IFF_LOOPBACK) {
574 create = true; 573 netdev_err(phy_dev,
575 } 574 "Master is either lo or non-ether device\n");
575 return -EINVAL;
576 }
576 577
577 if (data && data[IFLA_IPVLAN_MODE]) 578 if (netdev_is_rx_handler_busy(phy_dev)) {
578 mode = nla_get_u16(data[IFLA_IPVLAN_MODE]); 579 netdev_err(phy_dev, "Device is already in use.\n");
580 return -EBUSY;
581 }
582 }
579 583
580 port = ipvlan_port_get_rtnl(phy_dev);
581 ipvlan->phy_dev = phy_dev; 584 ipvlan->phy_dev = phy_dev;
582 ipvlan->dev = dev; 585 ipvlan->dev = dev;
583 ipvlan->port = port;
584 ipvlan->sfeatures = IPVLAN_FEATURES; 586 ipvlan->sfeatures = IPVLAN_FEATURES;
585 ipvlan_adjust_mtu(ipvlan, phy_dev); 587 ipvlan_adjust_mtu(ipvlan, phy_dev);
586 INIT_LIST_HEAD(&ipvlan->addrs); 588 INIT_LIST_HEAD(&ipvlan->addrs);
587 589
588 /* Flags are per port and latest update overrides. User has 590 /* TODO Probably put random address here to be presented to the
589 * to be consistent in setting it just like the mode attribute. 591 * world but keep using the physical-dev address for the outgoing
592 * packets.
590 */ 593 */
591 if (data && data[IFLA_IPVLAN_FLAGS]) 594 memcpy(dev->dev_addr, phy_dev->dev_addr, ETH_ALEN);
592 ipvlan->port->flags = nla_get_u16(data[IFLA_IPVLAN_FLAGS]); 595
596 dev->priv_flags |= IFF_IPVLAN_SLAVE;
597
598 err = register_netdevice(dev);
599 if (err < 0)
600 return err;
601
602 /* ipvlan_init() would have created the port, if required */
603 port = ipvlan_port_get_rtnl(phy_dev);
604 ipvlan->port = port;
593 605
594 /* If the port-id base is at the MAX value, then wrap it around and 606 /* If the port-id base is at the MAX value, then wrap it around and
595 * begin from 0x1 again. This may be due to a busy system where lots 607 * begin from 0x1 again. This may be due to a busy system where lots
@@ -609,31 +621,28 @@ int ipvlan_link_new(struct net *src_net, struct net_device *dev,
609 err = ida_simple_get(&port->ida, 0x1, port->dev_id_start, 621 err = ida_simple_get(&port->ida, 0x1, port->dev_id_start,
610 GFP_KERNEL); 622 GFP_KERNEL);
611 if (err < 0) 623 if (err < 0)
612 goto destroy_ipvlan_port; 624 goto unregister_netdev;
613 dev->dev_id = err; 625 dev->dev_id = err;
626
614 /* Increment id-base to the next slot for the future assignment */ 627 /* Increment id-base to the next slot for the future assignment */
615 port->dev_id_start = err + 1; 628 port->dev_id_start = err + 1;
616 629
617 /* TODO Probably put random address here to be presented to the 630 err = netdev_upper_dev_link(phy_dev, dev, extack);
618 * world but keep using the physical-dev address for the outgoing 631 if (err)
619 * packets. 632 goto remove_ida;
620 */
621 memcpy(dev->dev_addr, phy_dev->dev_addr, ETH_ALEN);
622 633
623 dev->priv_flags |= IFF_IPVLAN_SLAVE; 634 /* Flags are per port and latest update overrides. User has
635 * to be consistent in setting it just like the mode attribute.
636 */
637 if (data && data[IFLA_IPVLAN_FLAGS])
638 port->flags = nla_get_u16(data[IFLA_IPVLAN_FLAGS]);
624 639
625 err = register_netdevice(dev); 640 if (data && data[IFLA_IPVLAN_MODE])
626 if (err < 0) 641 mode = nla_get_u16(data[IFLA_IPVLAN_MODE]);
627 goto remove_ida;
628 642
629 err = netdev_upper_dev_link(phy_dev, dev, extack);
630 if (err) {
631 goto unregister_netdev;
632 }
633 err = ipvlan_set_port_mode(port, mode); 643 err = ipvlan_set_port_mode(port, mode);
634 if (err) { 644 if (err)
635 goto unlink_netdev; 645 goto unlink_netdev;
636 }
637 646
638 list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans); 647 list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
639 netif_stacked_transfer_operstate(phy_dev, dev); 648 netif_stacked_transfer_operstate(phy_dev, dev);
@@ -641,13 +650,10 @@ int ipvlan_link_new(struct net *src_net, struct net_device *dev,
641 650
642unlink_netdev: 651unlink_netdev:
643 netdev_upper_dev_unlink(phy_dev, dev); 652 netdev_upper_dev_unlink(phy_dev, dev);
644unregister_netdev:
645 unregister_netdevice(dev);
646remove_ida: 653remove_ida:
647 ida_simple_remove(&port->ida, dev->dev_id); 654 ida_simple_remove(&port->ida, dev->dev_id);
648destroy_ipvlan_port: 655unregister_netdev:
649 if (create) 656 unregister_netdevice(dev);
650 ipvlan_port_destroy(phy_dev);
651 return err; 657 return err;
652} 658}
653EXPORT_SYMBOL_GPL(ipvlan_link_new); 659EXPORT_SYMBOL_GPL(ipvlan_link_new);
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 2c98152d1e1b..1d025ab9568f 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -2411,7 +2411,7 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,
2411 if (!hdr) 2411 if (!hdr)
2412 return -EMSGSIZE; 2412 return -EMSGSIZE;
2413 2413
2414 genl_dump_check_consistent(cb, hdr, &macsec_fam); 2414 genl_dump_check_consistent(cb, hdr);
2415 2415
2416 if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex)) 2416 if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex))
2417 goto nla_put_failure; 2417 goto nla_put_failure;
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 42d7edcc3106..981c931a7a1f 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -76,7 +76,6 @@
76 76
77#define MOD_AUTHOR "Option Wireless" 77#define MOD_AUTHOR "Option Wireless"
78#define MOD_DESCRIPTION "USB High Speed Option driver" 78#define MOD_DESCRIPTION "USB High Speed Option driver"
79#define MOD_LICENSE "GPL"
80 79
81#define HSO_MAX_NET_DEVICES 10 80#define HSO_MAX_NET_DEVICES 10
82#define HSO__MAX_MTU 2048 81#define HSO__MAX_MTU 2048
@@ -3286,7 +3285,7 @@ module_exit(hso_exit);
3286 3285
3287MODULE_AUTHOR(MOD_AUTHOR); 3286MODULE_AUTHOR(MOD_AUTHOR);
3288MODULE_DESCRIPTION(MOD_DESCRIPTION); 3287MODULE_DESCRIPTION(MOD_DESCRIPTION);
3289MODULE_LICENSE(MOD_LICENSE); 3288MODULE_LICENSE("GPL");
3290 3289
3291/* change the debug level (eg: insmod hso.ko debug=0x04) */ 3290/* change the debug level (eg: insmod hso.ko debug=0x04) */
3292MODULE_PARM_DESC(debug, "debug level mask [0x01 | 0x02 | 0x04 | 0x08 | 0x10]"); 3291MODULE_PARM_DESC(debug, "debug level mask [0x01 | 0x02 | 0x04 | 0x08 | 0x10]");
diff --git a/drivers/net/virtio_net. b/drivers/net/virtio_net.
deleted file mode 100644
index e69de29bb2d1..000000000000
--- a/drivers/net/virtio_net.
+++ /dev/null
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 07a49f58070a..7c3600643c7f 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -2805,7 +2805,7 @@ static int mac80211_hwsim_get_radio(struct sk_buff *skb,
2805 return -EMSGSIZE; 2805 return -EMSGSIZE;
2806 2806
2807 if (cb) 2807 if (cb)
2808 genl_dump_check_consistent(cb, hdr, &hwsim_genl_family); 2808 genl_dump_check_consistent(cb, hdr);
2809 2809
2810 if (data->alpha2[0] && data->alpha2[1]) 2810 if (data->alpha2[0] && data->alpha2[1])
2811 param.reg_alpha2 = data->alpha2; 2811 param.reg_alpha2 = data->alpha2;
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 08730227cd18..8f8443833348 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -162,13 +162,13 @@ static int rsi_usb_reg_read(struct usb_device *usbdev,
162 u8 *buf; 162 u8 *buf;
163 int status = -ENOMEM; 163 int status = -ENOMEM;
164 164
165 if (len > RSI_USB_CTRL_BUF_SIZE)
166 return -EINVAL;
167
165 buf = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL); 168 buf = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL);
166 if (!buf) 169 if (!buf)
167 return status; 170 return status;
168 171
169 if (len > RSI_USB_CTRL_BUF_SIZE)
170 return -EINVAL;
171
172 status = usb_control_msg(usbdev, 172 status = usb_control_msg(usbdev,
173 usb_rcvctrlpipe(usbdev, 0), 173 usb_rcvctrlpipe(usbdev, 0),
174 USB_VENDOR_REGISTER_READ, 174 USB_VENDOR_REGISTER_READ,
@@ -207,13 +207,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
207 u8 *usb_reg_buf; 207 u8 *usb_reg_buf;
208 int status = -ENOMEM; 208 int status = -ENOMEM;
209 209
210 if (len > RSI_USB_CTRL_BUF_SIZE)
211 return -EINVAL;
212
210 usb_reg_buf = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL); 213 usb_reg_buf = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL);
211 if (!usb_reg_buf) 214 if (!usb_reg_buf)
212 return status; 215 return status;
213 216
214 if (len > RSI_USB_CTRL_BUF_SIZE)
215 return -EINVAL;
216
217 usb_reg_buf[0] = (value & 0x00ff); 217 usb_reg_buf[0] = (value & 0x00ff);
218 usb_reg_buf[1] = (value & 0xff00) >> 8; 218 usb_reg_buf[1] = (value & 0xff00) >> 8;
219 usb_reg_buf[2] = 0x0; 219 usb_reg_buf[2] = 0x0;
diff --git a/include/net/genetlink.h b/include/net/genetlink.h
index 5ac169a735f4..decf6012a401 100644
--- a/include/net/genetlink.h
+++ b/include/net/genetlink.h
@@ -154,15 +154,12 @@ void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
154/** 154/**
155 * genlmsg_nlhdr - Obtain netlink header from user specified header 155 * genlmsg_nlhdr - Obtain netlink header from user specified header
156 * @user_hdr: user header as returned from genlmsg_put() 156 * @user_hdr: user header as returned from genlmsg_put()
157 * @family: generic netlink family
158 * 157 *
159 * Returns pointer to netlink header. 158 * Returns pointer to netlink header.
160 */ 159 */
161static inline struct nlmsghdr * 160static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr)
162genlmsg_nlhdr(void *user_hdr, const struct genl_family *family)
163{ 161{
164 return (struct nlmsghdr *)((char *)user_hdr - 162 return (struct nlmsghdr *)((char *)user_hdr -
165 family->hdrsize -
166 GENL_HDRLEN - 163 GENL_HDRLEN -
167 NLMSG_HDRLEN); 164 NLMSG_HDRLEN);
168} 165}
@@ -190,16 +187,14 @@ static inline int genlmsg_parse(const struct nlmsghdr *nlh,
190 * genl_dump_check_consistent - check if sequence is consistent and advertise if not 187 * genl_dump_check_consistent - check if sequence is consistent and advertise if not
191 * @cb: netlink callback structure that stores the sequence number 188 * @cb: netlink callback structure that stores the sequence number
192 * @user_hdr: user header as returned from genlmsg_put() 189 * @user_hdr: user header as returned from genlmsg_put()
193 * @family: generic netlink family
194 * 190 *
195 * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it 191 * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
196 * simpler to use with generic netlink. 192 * simpler to use with generic netlink.
197 */ 193 */
198static inline void genl_dump_check_consistent(struct netlink_callback *cb, 194static inline void genl_dump_check_consistent(struct netlink_callback *cb,
199 void *user_hdr, 195 void *user_hdr)
200 const struct genl_family *family)
201{ 196{
202 nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family)); 197 nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr));
203} 198}
204 199
205/** 200/**
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index d7d8cba01469..749a42882437 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -444,7 +444,8 @@ static inline int sctp_frag_point(const struct sctp_association *asoc, int pmtu)
444 if (asoc->user_frag) 444 if (asoc->user_frag)
445 frag = min_t(int, frag, asoc->user_frag); 445 frag = min_t(int, frag, asoc->user_frag);
446 446
447 frag = SCTP_TRUNC4(min_t(int, frag, SCTP_MAX_CHUNK_LEN)); 447 frag = SCTP_TRUNC4(min_t(int, frag, SCTP_MAX_CHUNK_LEN -
448 sizeof(struct sctp_data_chunk)));
448 449
449 return frag; 450 return frag;
450} 451}
diff --git a/include/uapi/linux/seg6.h b/include/uapi/linux/seg6.h
index 2f6fb0dd613c..286e8d6a8e98 100644
--- a/include/uapi/linux/seg6.h
+++ b/include/uapi/linux/seg6.h
@@ -26,9 +26,9 @@ struct ipv6_sr_hdr {
26 __u8 hdrlen; 26 __u8 hdrlen;
27 __u8 type; 27 __u8 type;
28 __u8 segments_left; 28 __u8 segments_left;
29 __u8 first_segment; 29 __u8 first_segment; /* Represents the last_entry field of SRH */
30 __u8 flags; 30 __u8 flags;
31 __u16 reserved; 31 __u16 tag;
32 32
33 struct in6_addr segments[0]; 33 struct in6_addr segments[0];
34}; 34};
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 3b427757b1f8..43b69af242e1 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -651,9 +651,12 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
651 struct fnhe_hash_bucket *hash; 651 struct fnhe_hash_bucket *hash;
652 struct fib_nh_exception *fnhe; 652 struct fib_nh_exception *fnhe;
653 struct rtable *rt; 653 struct rtable *rt;
654 u32 genid, hval;
654 unsigned int i; 655 unsigned int i;
655 int depth; 656 int depth;
656 u32 hval = fnhe_hashfun(daddr); 657
658 genid = fnhe_genid(dev_net(nh->nh_dev));
659 hval = fnhe_hashfun(daddr);
657 660
658 spin_lock_bh(&fnhe_lock); 661 spin_lock_bh(&fnhe_lock);
659 662
@@ -676,12 +679,13 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
676 } 679 }
677 680
678 if (fnhe) { 681 if (fnhe) {
682 if (fnhe->fnhe_genid != genid)
683 fnhe->fnhe_genid = genid;
679 if (gw) 684 if (gw)
680 fnhe->fnhe_gw = gw; 685 fnhe->fnhe_gw = gw;
681 if (pmtu) { 686 if (pmtu)
682 fnhe->fnhe_pmtu = pmtu; 687 fnhe->fnhe_pmtu = pmtu;
683 fnhe->fnhe_expires = max(1UL, expires); 688 fnhe->fnhe_expires = max(1UL, expires);
684 }
685 /* Update all cached dsts too */ 689 /* Update all cached dsts too */
686 rt = rcu_dereference(fnhe->fnhe_rth_input); 690 rt = rcu_dereference(fnhe->fnhe_rth_input);
687 if (rt) 691 if (rt)
@@ -700,7 +704,7 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
700 fnhe->fnhe_next = hash->chain; 704 fnhe->fnhe_next = hash->chain;
701 rcu_assign_pointer(hash->chain, fnhe); 705 rcu_assign_pointer(hash->chain, fnhe);
702 } 706 }
703 fnhe->fnhe_genid = fnhe_genid(dev_net(nh->nh_dev)); 707 fnhe->fnhe_genid = genid;
704 fnhe->fnhe_daddr = daddr; 708 fnhe->fnhe_daddr = daddr;
705 fnhe->fnhe_gw = gw; 709 fnhe->fnhe_gw = gw;
706 fnhe->fnhe_pmtu = pmtu; 710 fnhe->fnhe_pmtu = pmtu;
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index 6e0adfefb9ed..59c08997bfdf 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -533,6 +533,7 @@ nla_put_failure:
533 return -1; 533 return -1;
534} 534}
535 535
536#if defined(CONFIG_NETFILTER_NETLINK_GLUE_CT) || defined(CONFIG_NF_CONNTRACK_EVENTS)
536static size_t ctnetlink_proto_size(const struct nf_conn *ct) 537static size_t ctnetlink_proto_size(const struct nf_conn *ct)
537{ 538{
538 const struct nf_conntrack_l3proto *l3proto; 539 const struct nf_conntrack_l3proto *l3proto;
@@ -552,6 +553,7 @@ static size_t ctnetlink_proto_size(const struct nf_conn *ct)
552 553
553 return len + len4; 554 return len + len4;
554} 555}
556#endif
555 557
556static inline size_t ctnetlink_acct_size(const struct nf_conn *ct) 558static inline size_t ctnetlink_acct_size(const struct nf_conn *ct)
557{ 559{
diff --git a/net/netlabel/netlabel_addrlist.h b/net/netlabel/netlabel_addrlist.h
index d0f38bc9af6d..ac709f0f197b 100644
--- a/net/netlabel/netlabel_addrlist.h
+++ b/net/netlabel/netlabel_addrlist.h
@@ -87,7 +87,7 @@ static inline struct netlbl_af4list *__af4list_valid_rcu(struct list_head *s,
87 struct list_head *i = s; 87 struct list_head *i = s;
88 struct netlbl_af4list *n = __af4list_entry(s); 88 struct netlbl_af4list *n = __af4list_entry(s);
89 while (i != h && !n->valid) { 89 while (i != h && !n->valid) {
90 i = rcu_dereference(i->next); 90 i = rcu_dereference(list_next_rcu(i));
91 n = __af4list_entry(i); 91 n = __af4list_entry(i);
92 } 92 }
93 return n; 93 return n;
@@ -154,7 +154,7 @@ static inline struct netlbl_af6list *__af6list_valid_rcu(struct list_head *s,
154 struct list_head *i = s; 154 struct list_head *i = s;
155 struct netlbl_af6list *n = __af6list_entry(s); 155 struct netlbl_af6list *n = __af6list_entry(s);
156 while (i != h && !n->valid) { 156 while (i != h && !n->valid) {
157 i = rcu_dereference(i->next); 157 i = rcu_dereference(list_next_rcu(i));
158 n = __af6list_entry(i); 158 n = __af6list_entry(i);
159 } 159 }
160 return n; 160 return n;
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
index f6359c277212..c0b83dc9d993 100644
--- a/net/nfc/netlink.c
+++ b/net/nfc/netlink.c
@@ -75,7 +75,7 @@ static int nfc_genl_send_target(struct sk_buff *msg, struct nfc_target *target,
75 if (!hdr) 75 if (!hdr)
76 return -EMSGSIZE; 76 return -EMSGSIZE;
77 77
78 genl_dump_check_consistent(cb, hdr, &nfc_genl_family); 78 genl_dump_check_consistent(cb, hdr);
79 79
80 if (nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target->idx) || 80 if (nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target->idx) ||
81 nla_put_u32(msg, NFC_ATTR_PROTOCOLS, target->supported_protocols) || 81 nla_put_u32(msg, NFC_ATTR_PROTOCOLS, target->supported_protocols) ||
@@ -603,7 +603,7 @@ static int nfc_genl_send_device(struct sk_buff *msg, struct nfc_dev *dev,
603 return -EMSGSIZE; 603 return -EMSGSIZE;
604 604
605 if (cb) 605 if (cb)
606 genl_dump_check_consistent(cb, hdr, &nfc_genl_family); 606 genl_dump_check_consistent(cb, hdr);
607 607
608 if (nfc_genl_setup_device_added(dev, msg)) 608 if (nfc_genl_setup_device_added(dev, msg))
609 goto nla_put_failure; 609 goto nla_put_failure;
@@ -1356,7 +1356,7 @@ static int nfc_genl_send_se(struct sk_buff *msg, struct nfc_dev *dev,
1356 goto nla_put_failure; 1356 goto nla_put_failure;
1357 1357
1358 if (cb) 1358 if (cb)
1359 genl_dump_check_consistent(cb, hdr, &nfc_genl_family); 1359 genl_dump_check_consistent(cb, hdr);
1360 1360
1361 if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) || 1361 if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
1362 nla_put_u32(msg, NFC_ATTR_SE_INDEX, se->idx) || 1362 nla_put_u32(msg, NFC_ATTR_SE_INDEX, se->idx) ||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index a6dfa86c0201..3b18085e3b10 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -807,9 +807,10 @@ static void sctp_inet6_skb_msgname(struct sk_buff *skb, char *msgname,
807 addr->v6.sin6_flowinfo = 0; 807 addr->v6.sin6_flowinfo = 0;
808 addr->v6.sin6_port = sh->source; 808 addr->v6.sin6_port = sh->source;
809 addr->v6.sin6_addr = ipv6_hdr(skb)->saddr; 809 addr->v6.sin6_addr = ipv6_hdr(skb)->saddr;
810 if (ipv6_addr_type(&addr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) { 810 if (ipv6_addr_type(&addr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
811 addr->v6.sin6_scope_id = sctp_v6_skb_iif(skb); 811 addr->v6.sin6_scope_id = sctp_v6_skb_iif(skb);
812 } 812 else
813 addr->v6.sin6_scope_id = 0;
813 } 814 }
814 815
815 *addr_len = sctp_v6_addr_to_user(sctp_sk(skb->sk), addr); 816 *addr_len = sctp_v6_addr_to_user(sctp_sk(skb->sk), addr);
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index 514465b03829..9bf575f2e8ed 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -3594,8 +3594,8 @@ struct sctp_chunk *sctp_make_strreset_req(
3594 __u16 stream_num, __be16 *stream_list, 3594 __u16 stream_num, __be16 *stream_list,
3595 bool out, bool in) 3595 bool out, bool in)
3596{ 3596{
3597 __u16 stream_len = stream_num * sizeof(__u16);
3597 struct sctp_strreset_outreq outreq; 3598 struct sctp_strreset_outreq outreq;
3598 __u16 stream_len = stream_num * 2;
3599 struct sctp_strreset_inreq inreq; 3599 struct sctp_strreset_inreq inreq;
3600 struct sctp_chunk *retval; 3600 struct sctp_chunk *retval;
3601 __u16 outlen, inlen; 3601 __u16 outlen, inlen;
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index b029757bea03..3204a9b29407 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -84,8 +84,8 @@
84/* Forward declarations for internal helper functions. */ 84/* Forward declarations for internal helper functions. */
85static int sctp_writeable(struct sock *sk); 85static int sctp_writeable(struct sock *sk);
86static void sctp_wfree(struct sk_buff *skb); 86static void sctp_wfree(struct sk_buff *skb);
87static int sctp_wait_for_sndbuf(struct sctp_association *, long *timeo_p, 87static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
88 size_t msg_len); 88 size_t msg_len, struct sock **orig_sk);
89static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p); 89static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p);
90static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p); 90static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p);
91static int sctp_wait_for_accept(struct sock *sk, long timeo); 91static int sctp_wait_for_accept(struct sock *sk, long timeo);
@@ -1970,9 +1970,16 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)
1970 1970
1971 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); 1971 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1972 if (!sctp_wspace(asoc)) { 1972 if (!sctp_wspace(asoc)) {
1973 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); 1973 /* sk can be changed by peel off when waiting for buf. */
1974 if (err) 1974 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len, &sk);
1975 if (err) {
1976 if (err == -ESRCH) {
1977 /* asoc is already dead. */
1978 new_asoc = NULL;
1979 err = -EPIPE;
1980 }
1975 goto out_free; 1981 goto out_free;
1982 }
1976 } 1983 }
1977 1984
1978 /* If an address is passed with the sendto/sendmsg call, it is used 1985 /* If an address is passed with the sendto/sendmsg call, it is used
@@ -3133,9 +3140,9 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsign
3133 */ 3140 */
3134static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen) 3141static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen)
3135{ 3142{
3143 struct sctp_sock *sp = sctp_sk(sk);
3136 struct sctp_assoc_value params; 3144 struct sctp_assoc_value params;
3137 struct sctp_association *asoc; 3145 struct sctp_association *asoc;
3138 struct sctp_sock *sp = sctp_sk(sk);
3139 int val; 3146 int val;
3140 3147
3141 if (optlen == sizeof(int)) { 3148 if (optlen == sizeof(int)) {
@@ -3151,26 +3158,35 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned
3151 if (copy_from_user(&params, optval, optlen)) 3158 if (copy_from_user(&params, optval, optlen))
3152 return -EFAULT; 3159 return -EFAULT;
3153 val = params.assoc_value; 3160 val = params.assoc_value;
3154 } else 3161 } else {
3155 return -EINVAL; 3162 return -EINVAL;
3163 }
3156 3164
3157 if ((val != 0) && ((val < 8) || (val > SCTP_MAX_CHUNK_LEN))) 3165 if (val) {
3158 return -EINVAL; 3166 int min_len, max_len;
3159 3167
3160 asoc = sctp_id2assoc(sk, params.assoc_id); 3168 min_len = SCTP_DEFAULT_MINSEGMENT - sp->pf->af->net_header_len;
3161 if (!asoc && params.assoc_id && sctp_style(sk, UDP)) 3169 min_len -= sizeof(struct sctphdr) +
3162 return -EINVAL; 3170 sizeof(struct sctp_data_chunk);
3171
3172 max_len = SCTP_MAX_CHUNK_LEN - sizeof(struct sctp_data_chunk);
3163 3173
3174 if (val < min_len || val > max_len)
3175 return -EINVAL;
3176 }
3177
3178 asoc = sctp_id2assoc(sk, params.assoc_id);
3164 if (asoc) { 3179 if (asoc) {
3165 if (val == 0) { 3180 if (val == 0) {
3166 val = asoc->pathmtu; 3181 val = asoc->pathmtu - sp->pf->af->net_header_len;
3167 val -= sp->pf->af->net_header_len;
3168 val -= sizeof(struct sctphdr) + 3182 val -= sizeof(struct sctphdr) +
3169 sizeof(struct sctp_data_chunk); 3183 sizeof(struct sctp_data_chunk);
3170 } 3184 }
3171 asoc->user_frag = val; 3185 asoc->user_frag = val;
3172 asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu); 3186 asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu);
3173 } else { 3187 } else {
3188 if (params.assoc_id && sctp_style(sk, UDP))
3189 return -EINVAL;
3174 sp->user_frag = val; 3190 sp->user_frag = val;
3175 } 3191 }
3176 3192
@@ -5015,12 +5031,6 @@ int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)
5015 if (!asoc) 5031 if (!asoc)
5016 return -EINVAL; 5032 return -EINVAL;
5017 5033
5018 /* If there is a thread waiting on more sndbuf space for
5019 * sending on this asoc, it cannot be peeled.
5020 */
5021 if (waitqueue_active(&asoc->wait))
5022 return -EBUSY;
5023
5024 /* An association cannot be branched off from an already peeled-off 5034 /* An association cannot be branched off from an already peeled-off
5025 * socket, nor is this supported for tcp style sockets. 5035 * socket, nor is this supported for tcp style sockets.
5026 */ 5036 */
@@ -7989,7 +7999,7 @@ void sctp_sock_rfree(struct sk_buff *skb)
7989 7999
7990/* Helper function to wait for space in the sndbuf. */ 8000/* Helper function to wait for space in the sndbuf. */
7991static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, 8001static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
7992 size_t msg_len) 8002 size_t msg_len, struct sock **orig_sk)
7993{ 8003{
7994 struct sock *sk = asoc->base.sk; 8004 struct sock *sk = asoc->base.sk;
7995 int err = 0; 8005 int err = 0;
@@ -8006,10 +8016,11 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
8006 for (;;) { 8016 for (;;) {
8007 prepare_to_wait_exclusive(&asoc->wait, &wait, 8017 prepare_to_wait_exclusive(&asoc->wait, &wait,
8008 TASK_INTERRUPTIBLE); 8018 TASK_INTERRUPTIBLE);
8019 if (asoc->base.dead)
8020 goto do_dead;
8009 if (!*timeo_p) 8021 if (!*timeo_p)
8010 goto do_nonblock; 8022 goto do_nonblock;
8011 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || 8023 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING)
8012 asoc->base.dead)
8013 goto do_error; 8024 goto do_error;
8014 if (signal_pending(current)) 8025 if (signal_pending(current))
8015 goto do_interrupted; 8026 goto do_interrupted;
@@ -8022,11 +8033,17 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
8022 release_sock(sk); 8033 release_sock(sk);
8023 current_timeo = schedule_timeout(current_timeo); 8034 current_timeo = schedule_timeout(current_timeo);
8024 lock_sock(sk); 8035 lock_sock(sk);
8036 if (sk != asoc->base.sk) {
8037 release_sock(sk);
8038 sk = asoc->base.sk;
8039 lock_sock(sk);
8040 }
8025 8041
8026 *timeo_p = current_timeo; 8042 *timeo_p = current_timeo;
8027 } 8043 }
8028 8044
8029out: 8045out:
8046 *orig_sk = sk;
8030 finish_wait(&asoc->wait, &wait); 8047 finish_wait(&asoc->wait, &wait);
8031 8048
8032 /* Release the association's refcnt. */ 8049 /* Release the association's refcnt. */
@@ -8034,6 +8051,10 @@ out:
8034 8051
8035 return err; 8052 return err;
8036 8053
8054do_dead:
8055 err = -ESRCH;
8056 goto out;
8057
8037do_error: 8058do_error:
8038 err = -EPIPE; 8059 err = -EPIPE;
8039 goto out; 8060 goto out;
diff --git a/net/sctp/stream.c b/net/sctp/stream.c
index b8c8cabb1a58..a11db21dc8a0 100644
--- a/net/sctp/stream.c
+++ b/net/sctp/stream.c
@@ -282,15 +282,31 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
282 282
283 str_nums = params->srs_number_streams; 283 str_nums = params->srs_number_streams;
284 str_list = params->srs_stream_list; 284 str_list = params->srs_stream_list;
285 if (out && str_nums) 285 if (str_nums) {
286 for (i = 0; i < str_nums; i++) 286 int param_len = 0;
287 if (str_list[i] >= stream->outcnt)
288 goto out;
289 287
290 if (in && str_nums) 288 if (out) {
291 for (i = 0; i < str_nums; i++) 289 for (i = 0; i < str_nums; i++)
292 if (str_list[i] >= stream->incnt) 290 if (str_list[i] >= stream->outcnt)
293 goto out; 291 goto out;
292
293 param_len = str_nums * sizeof(__u16) +
294 sizeof(struct sctp_strreset_outreq);
295 }
296
297 if (in) {
298 for (i = 0; i < str_nums; i++)
299 if (str_list[i] >= stream->incnt)
300 goto out;
301
302 param_len += str_nums * sizeof(__u16) +
303 sizeof(struct sctp_strreset_inreq);
304 }
305
306 if (param_len > SCTP_MAX_CHUNK_LEN -
307 sizeof(struct sctp_reconf_chunk))
308 goto out;
309 }
294 310
295 nstr_list = kcalloc(str_nums, sizeof(__be16), GFP_KERNEL); 311 nstr_list = kcalloc(str_nums, sizeof(__be16), GFP_KERNEL);
296 if (!nstr_list) { 312 if (!nstr_list) {
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 1649d456e22d..b0d07b35909d 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -174,7 +174,7 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)
174 174
175 if (fragid == LAST_FRAGMENT) { 175 if (fragid == LAST_FRAGMENT) {
176 TIPC_SKB_CB(head)->validated = false; 176 TIPC_SKB_CB(head)->validated = false;
177 if (unlikely(!tipc_msg_validate(head))) 177 if (unlikely(!tipc_msg_validate(&head)))
178 goto err; 178 goto err;
179 *buf = head; 179 *buf = head;
180 TIPC_SKB_CB(head)->tail = NULL; 180 TIPC_SKB_CB(head)->tail = NULL;
@@ -201,11 +201,21 @@ err:
201 * TIPC will ignore the excess, under the assumption that it is optional info 201 * TIPC will ignore the excess, under the assumption that it is optional info
202 * introduced by a later release of the protocol. 202 * introduced by a later release of the protocol.
203 */ 203 */
204bool tipc_msg_validate(struct sk_buff *skb) 204bool tipc_msg_validate(struct sk_buff **_skb)
205{ 205{
206 struct tipc_msg *msg; 206 struct sk_buff *skb = *_skb;
207 struct tipc_msg *hdr;
207 int msz, hsz; 208 int msz, hsz;
208 209
210 /* Ensure that flow control ratio condition is satisfied */
211 if (unlikely(skb->truesize / buf_roundup_len(skb) > 4)) {
212 skb = skb_copy(skb, GFP_ATOMIC);
213 if (!skb)
214 return false;
215 kfree_skb(*_skb);
216 *_skb = skb;
217 }
218
209 if (unlikely(TIPC_SKB_CB(skb)->validated)) 219 if (unlikely(TIPC_SKB_CB(skb)->validated))
210 return true; 220 return true;
211 if (unlikely(!pskb_may_pull(skb, MIN_H_SIZE))) 221 if (unlikely(!pskb_may_pull(skb, MIN_H_SIZE)))
@@ -217,11 +227,11 @@ bool tipc_msg_validate(struct sk_buff *skb)
217 if (unlikely(!pskb_may_pull(skb, hsz))) 227 if (unlikely(!pskb_may_pull(skb, hsz)))
218 return false; 228 return false;
219 229
220 msg = buf_msg(skb); 230 hdr = buf_msg(skb);
221 if (unlikely(msg_version(msg) != TIPC_VERSION)) 231 if (unlikely(msg_version(hdr) != TIPC_VERSION))
222 return false; 232 return false;
223 233
224 msz = msg_size(msg); 234 msz = msg_size(hdr);
225 if (unlikely(msz < hsz)) 235 if (unlikely(msz < hsz))
226 return false; 236 return false;
227 if (unlikely((msz - hsz) > TIPC_MAX_USER_MSG_SIZE)) 237 if (unlikely((msz - hsz) > TIPC_MAX_USER_MSG_SIZE))
@@ -411,7 +421,7 @@ bool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos)
411 skb_pull(*iskb, offset); 421 skb_pull(*iskb, offset);
412 imsz = msg_size(buf_msg(*iskb)); 422 imsz = msg_size(buf_msg(*iskb));
413 skb_trim(*iskb, imsz); 423 skb_trim(*iskb, imsz);
414 if (unlikely(!tipc_msg_validate(*iskb))) 424 if (unlikely(!tipc_msg_validate(iskb)))
415 goto none; 425 goto none;
416 *pos += align(imsz); 426 *pos += align(imsz);
417 return true; 427 return true;
diff --git a/net/tipc/msg.h b/net/tipc/msg.h
index bf8f57ccc70c..3e4384c222f7 100644
--- a/net/tipc/msg.h
+++ b/net/tipc/msg.h
@@ -926,7 +926,7 @@ static inline bool msg_is_reset(struct tipc_msg *hdr)
926} 926}
927 927
928struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp); 928struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp);
929bool tipc_msg_validate(struct sk_buff *skb); 929bool tipc_msg_validate(struct sk_buff **_skb);
930bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); 930bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
931void tipc_skb_reject(struct net *net, int err, struct sk_buff *skb, 931void tipc_skb_reject(struct net *net, int err, struct sk_buff *skb,
932 struct sk_buff_head *xmitq); 932 struct sk_buff_head *xmitq);
@@ -954,6 +954,11 @@ static inline u16 buf_seqno(struct sk_buff *skb)
954 return msg_seqno(buf_msg(skb)); 954 return msg_seqno(buf_msg(skb));
955} 955}
956 956
957static inline int buf_roundup_len(struct sk_buff *skb)
958{
959 return (skb->len / 1024 + 1) * 1024;
960}
961
957/* tipc_skb_peek(): peek and reserve first buffer in list 962/* tipc_skb_peek(): peek and reserve first buffer in list
958 * @list: list to be peeked in 963 * @list: list to be peeked in
959 * Returns pointer to first buffer in list, if any 964 * Returns pointer to first buffer in list, if any
diff --git a/net/tipc/node.c b/net/tipc/node.c
index 009a81631280..507017fe0f1b 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -1539,7 +1539,7 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
1539 __skb_queue_head_init(&xmitq); 1539 __skb_queue_head_init(&xmitq);
1540 1540
1541 /* Ensure message is well-formed before touching the header */ 1541 /* Ensure message is well-formed before touching the header */
1542 if (unlikely(!tipc_msg_validate(skb))) 1542 if (unlikely(!tipc_msg_validate(&skb)))
1543 goto discard; 1543 goto discard;
1544 hdr = buf_msg(skb); 1544 hdr = buf_msg(skb);
1545 usr = msg_user(hdr); 1545 usr = msg_user(hdr);
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index bb16f1ec766e..a0e1951227fa 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6291,7 +6291,7 @@ static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
6291 if (!hdr) 6291 if (!hdr)
6292 return -1; 6292 return -1;
6293 6293
6294 genl_dump_check_consistent(cb, hdr, &nl80211_fam); 6294 genl_dump_check_consistent(cb, hdr);
6295 6295
6296 if (nl80211_put_regdom(regdom, msg)) 6296 if (nl80211_put_regdom(regdom, msg))
6297 goto nla_put_failure; 6297 goto nla_put_failure;
@@ -7722,7 +7722,7 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
7722 if (!hdr) 7722 if (!hdr)
7723 return -1; 7723 return -1;
7724 7724
7725 genl_dump_check_consistent(cb, hdr, &nl80211_fam); 7725 genl_dump_check_consistent(cb, hdr);
7726 7726
7727 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 7727 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
7728 goto nla_put_failure; 7728 goto nla_put_failure;
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 2f57722f5d03..9542975eb2f9 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1305,6 +1305,7 @@ static struct xfrm_policy *clone_policy(const struct xfrm_policy *old, int dir)
1305 newp->xfrm_nr = old->xfrm_nr; 1305 newp->xfrm_nr = old->xfrm_nr;
1306 newp->index = old->index; 1306 newp->index = old->index;
1307 newp->type = old->type; 1307 newp->type = old->type;
1308 newp->family = old->family;
1308 memcpy(newp->xfrm_vec, old->xfrm_vec, 1309 memcpy(newp->xfrm_vec, old->xfrm_vec,
1309 newp->xfrm_nr*sizeof(struct xfrm_tmpl)); 1310 newp->xfrm_nr*sizeof(struct xfrm_tmpl));
1310 spin_lock_bh(&net->xfrm.xfrm_policy_lock); 1311 spin_lock_bh(&net->xfrm.xfrm_policy_lock);
@@ -1360,29 +1361,36 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, const struct flowi *fl,
1360 struct net *net = xp_net(policy); 1361 struct net *net = xp_net(policy);
1361 int nx; 1362 int nx;
1362 int i, error; 1363 int i, error;
1364 xfrm_address_t *daddr = xfrm_flowi_daddr(fl, family);
1365 xfrm_address_t *saddr = xfrm_flowi_saddr(fl, family);
1363 xfrm_address_t tmp; 1366 xfrm_address_t tmp;
1364 1367
1365 for (nx = 0, i = 0; i < policy->xfrm_nr; i++) { 1368 for (nx = 0, i = 0; i < policy->xfrm_nr; i++) {
1366 struct xfrm_state *x; 1369 struct xfrm_state *x;
1367 xfrm_address_t *local; 1370 xfrm_address_t *remote = daddr;
1368 xfrm_address_t *remote; 1371 xfrm_address_t *local = saddr;
1369 struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i]; 1372 struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i];
1370 1373
1371 remote = &tmpl->id.daddr; 1374 if (tmpl->mode == XFRM_MODE_TUNNEL ||
1372 local = &tmpl->saddr; 1375 tmpl->mode == XFRM_MODE_BEET) {
1373 if (xfrm_addr_any(local, tmpl->encap_family)) { 1376 remote = &tmpl->id.daddr;
1374 error = xfrm_get_saddr(net, fl->flowi_oif, 1377 local = &tmpl->saddr;
1375 &tmp, remote, 1378 if (xfrm_addr_any(local, tmpl->encap_family)) {
1376 tmpl->encap_family, 0); 1379 error = xfrm_get_saddr(net, fl->flowi_oif,
1377 if (error) 1380 &tmp, remote,
1378 goto fail; 1381 tmpl->encap_family, 0);
1379 local = &tmp; 1382 if (error)
1383 goto fail;
1384 local = &tmp;
1385 }
1380 } 1386 }
1381 1387
1382 x = xfrm_state_find(remote, local, fl, tmpl, policy, &error, family); 1388 x = xfrm_state_find(remote, local, fl, tmpl, policy, &error, family);
1383 1389
1384 if (x && x->km.state == XFRM_STATE_VALID) { 1390 if (x && x->km.state == XFRM_STATE_VALID) {
1385 xfrm[nx++] = x; 1391 xfrm[nx++] = x;
1392 daddr = remote;
1393 saddr = local;
1386 continue; 1394 continue;
1387 } 1395 }
1388 if (x) { 1396 if (x) {