]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'net-next/master'
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 11 Feb 2016 00:54:03 +0000 (11:54 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 11 Feb 2016 00:54:03 +0000 (11:54 +1100)
1  2 
MAINTAINERS
drivers/net/vxlan.c
include/net/tcp.h
net/ipv4/tcp.c
net/ipv4/tcp_ipv4.c
net/unix/af_unix.c

diff --combined MAINTAINERS
index df28b91f4311e29dd7e260b42ef4dab40af0e0a6,1e216aa4d25c649f6ae86dc625c3343f2c7ad531..74dfe572c21ed3b0140d15fdf9c048396339aa11
@@@ -223,7 -223,9 +223,7 @@@ F: drivers/scsi/aacraid
  
  ABI/API
  L:    linux-api@vger.kernel.org
 -F:    Documentation/ABI/
  F:    include/linux/syscalls.h
 -F:    include/uapi/
  F:    kernel/sys_ni.c
  
  ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
@@@ -673,25 -675,24 +673,25 @@@ F:      drivers/gpu/drm/radeon/radeon_kfd.
  F:    drivers/gpu/drm/radeon/radeon_kfd.h
  F:    include/uapi/linux/kfd_ioctl.h
  
 +AMD SEATTLE DEVICE TREE SUPPORT
 +M:    Brijesh Singh <brijeshkumar.singh@amd.com>
 +M:    Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
 +M:    Tom Lendacky <thomas.lendacky@amd.com>
 +S:    Supported
 +F:    arch/arm64/boot/dts/amd/
 +
  AMD XGBE DRIVER
  M:    Tom Lendacky <thomas.lendacky@amd.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/amd/xgbe/
 +F:    arch/arm64/boot/dts/amd/amd-seattle-xgbe*.dtsi
  
  AMS (Apple Motion Sensor) DRIVER
  M:    Michael Hanselmann <linux-kernel@hansmi.ch>
  S:    Supported
  F:    drivers/macintosh/ams/
  
 -AMSO1100 RNIC DRIVER
 -M:    Tom Tucker <tom@opengridcomputing.com>
 -M:    Steve Wise <swise@opengridcomputing.com>
 -L:    linux-rdma@vger.kernel.org
 -S:    Maintained
 -F:    drivers/infiniband/hw/amso1100/
 -
  ANALOG DEVICES INC AD9389B DRIVER
  M:    Hans Verkuil <hans.verkuil@cisco.com>
  L:    linux-media@vger.kernel.org
@@@ -966,8 -967,6 +966,8 @@@ M: Rob Herring <robh@kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-highbank/
 +F:    arch/arm/boot/dts/highbank.dts
 +F:    arch/arm/boot/dts/ecx-*.dts*
  
  ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT
  M:    Krzysztof Halasa <khalasa@piap.pl>
@@@ -1043,7 -1042,6 +1043,7 @@@ M:      Barry Song <baohua@kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/baohua/linux.git
  S:    Maintained
 +F:    arch/arm/boot/dts/prima2*
  F:    arch/arm/mach-prima2/
  F:    drivers/clk/sirf/
  F:    drivers/clocksource/timer-prima2.c
@@@ -1145,10 -1143,6 +1145,10 @@@ W:    http://www.hisilicon.co
  S:    Supported
  T:    git git://github.com/hisilicon/linux-hisi.git
  F:    arch/arm/mach-hisi/
 +F:    arch/arm/boot/dts/hi3*
 +F:    arch/arm/boot/dts/hip*
 +F:    arch/arm/boot/dts/hisi*
 +F:    arch/arm64/boot/dts/hisilicon/
  
  ARM/HP JORNADA 7XX MACHINE SUPPORT
  M:    Kristoffer Ericson <kristoffer.ericson@gmail.com>
@@@ -1225,7 -1219,6 +1225,7 @@@ M:      Santosh Shilimkar <ssantosh@kernel.o
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-keystone/
 +F:    arch/arm/boot/dts/k2*
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone.git
  
  ARM/TEXAS INSTRUMENT KEYSTONE CLOCK FRAMEWORK
@@@ -1294,7 -1287,6 +1294,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/mach-berlin/
  F:    arch/arm/boot/dts/berlin*
 +F:    arch/arm64/boot/dts/marvell/berlin*
  
  
  ARM/Marvell Dove/MV78xx0/Orion SOC support
@@@ -1433,10 -1425,7 +1433,10 @@@ S:    Maintaine
  F:    arch/arm/boot/dts/qcom-*.dts
  F:    arch/arm/boot/dts/qcom-*.dtsi
  F:    arch/arm/mach-qcom/
 +F:    arch/arm64/boot/dts/qcom/*
 +F:    drivers/i2c/busses/i2c-qup.c
  F:    drivers/soc/qcom/
 +F:    drivers/spi/spi-qup.c
  F:    drivers/tty/serial/msm_serial.h
  F:    drivers/tty/serial/msm_serial.c
  F:    drivers/*/pm8???-*
@@@ -1495,8 -1484,6 +1495,8 @@@ L:      linux-arm-kernel@lists.infradead.or
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/s3c*
 +F:    arch/arm/boot/dts/s5p*
 +F:    arch/arm/boot/dts/samsung*
  F:    arch/arm/boot/dts/exynos*
  F:    arch/arm64/boot/dts/exynos/
  F:    arch/arm/plat-samsung/
@@@ -1506,7 -1493,6 +1506,7 @@@ F:      arch/arm/mach-s5p*
  F:    arch/arm/mach-exynos*/
  F:    drivers/*/*s3c2410*
  F:    drivers/*/*/*s3c2410*
 +F:    drivers/soc/samsung/*
  F:    drivers/spi/spi-s3c*
  F:    sound/soc/samsung/*
  F:    Documentation/arm/Samsung/
@@@ -1577,7 -1563,6 +1577,7 @@@ S:      Maintaine
  F:    arch/arm/mach-socfpga/
  F:    arch/arm/boot/dts/socfpga*
  F:    arch/arm/configs/socfpga_defconfig
 +F:    arch/arm64/boot/dts/altera/
  W:    http://www.rocketboards.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
  
@@@ -1731,7 -1716,7 +1731,7 @@@ M:      Lorenzo Pieralisi <lorenzo.pieralisi
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/vexpress*
 -F:    arch/arm64/boot/dts/arm/vexpress*
 +F:    arch/arm64/boot/dts/arm/
  F:    arch/arm/mach-vexpress/
  F:    */*/vexpress*
  F:    */*/*/vexpress*
@@@ -2162,7 -2147,7 +2162,7 @@@ M:      Marek Lindner <mareklindner@neomailb
  M:    Simon Wunderlich <sw@simonwunderlich.de>
  M:    Antonio Quartulli <a@unstable.cc>
  L:    b.a.t.m.a.n@lists.open-mesh.org
- W:    http://www.open-mesh.org/
+ W:    https://www.open-mesh.org/
  S:    Maintained
  F:    net/batman-adv/
  
@@@ -2358,7 -2343,6 +2358,7 @@@ F:      arch/arm/mach-bcm
  F:    arch/arm/boot/dts/bcm113*
  F:    arch/arm/boot/dts/bcm216*
  F:    arch/arm/boot/dts/bcm281*
 +F:    arch/arm64/boot/dts/broadcom/
  F:    arch/arm/configs/bcm_defconfig
  F:    drivers/mmc/host/sdhci-bcm-kona.c
  F:    drivers/clocksource/bcm_kona_timer.c
@@@ -3461,7 -3445,7 +3461,7 @@@ S:      Maintaine
  F:    drivers/usb/dwc2/
  
  DESIGNWARE USB3 DRD IP DRIVER
 -M:    Felipe Balbi <balbi@ti.com>
 +M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
  L:    linux-omap@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
@@@ -4200,6 -4184,13 +4200,6 @@@ W:     http://aeschi.ch.eu.org/efs
  S:    Orphan
  F:    fs/efs/
  
 -EHCA (IBM GX bus InfiniBand adapter) DRIVER
 -M:    Hoang-Nam Nguyen <hnguyen@de.ibm.com>
 -M:    Christoph Raisch <raisch@de.ibm.com>
 -L:    linux-rdma@vger.kernel.org
 -S:    Supported
 -F:    drivers/infiniband/hw/ehca/
 -
  EHEA (IBM pSeries eHEA 10Gb ethernet adapter) DRIVER
  M:    Thadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com>
  L:    netdev@vger.kernel.org
@@@ -5818,6 -5809,12 +5818,6 @@@ M:     Juanjo Ciarlante <jjciarla@raiz.uncu
  S:    Maintained
  F:    net/ipv4/netfilter/ipt_MASQUERADE.c
  
 -IPATH DRIVER
 -M:    Mike Marciniszyn <infinipath@intel.com>
 -L:    linux-rdma@vger.kernel.org
 -S:    Maintained
 -F:    drivers/staging/rdma/ipath/
 -
  IPMI SUBSYSTEM
  M:    Corey Minyard <minyard@acm.org>
  L:    openipmi-developer@lists.sourceforge.net (moderated for non-subscribers)
@@@ -7373,7 -7370,7 +7373,7 @@@ F:      drivers/tty/isicom.
  F:    include/linux/isicom.h
  
  MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
 -M:    Felipe Balbi <balbi@ti.com>
 +M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
@@@ -7942,7 -7939,7 +7942,7 @@@ F:      drivers/media/platform/omap3isp
  F:    drivers/staging/media/omap4iss/
  
  OMAP USB SUPPORT
 -M:    Felipe Balbi <balbi@ti.com>
 +M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
  L:    linux-omap@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
@@@ -8130,14 -8127,6 +8130,14 @@@ S:    Supporte
  F:    fs/overlayfs/
  F:    Documentation/filesystems/overlayfs.txt
  
 +ORANGEFS FILESYSTEM
 +M:    Mike Marshall <hubcap@omnibond.com>
 +L:    pvfs2-developers@beowulf-underground.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hubcap/linux.git
 +S:    Supported
 +F:    fs/orangefs/
 +F:    Documentation/filesystems/orangefs.txt
 +
  P54 WIRELESS DRIVER
  M:    Christian Lamparter <chunkeey@googlemail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -8829,7 -8818,6 +8829,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  T:    git git://github.com/hzhuang1/linux.git
  T:    git git://github.com/rjarzmik/linux.git
  S:    Maintained
 +F:    arch/arm/boot/dts/pxa*
  F:    arch/arm/mach-pxa/
  F:    drivers/dma/pxa*
  F:    drivers/pcmcia/pxa2xx*
@@@ -8859,7 -8847,6 +8859,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  T:    git git://github.com/hzhuang1/linux.git
  T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
  S:    Maintained
 +F:    arch/arm/boot/dts/mmp*
  F:    arch/arm/mach-mmp/
  
  PXA MMCI DRIVER
@@@ -9806,11 -9793,10 +9806,11 @@@ S:   Supporte
  F:    drivers/scsi/be2iscsi/
  
  Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER
 -M:    Sathya Perla <sathya.perla@avagotech.com>
 -M:    Ajit Khaparde <ajit.khaparde@avagotech.com>
 -M:    Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
 -M:    Sriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
 +M:    Sathya Perla <sathya.perla@broadcom.com>
 +M:    Ajit Khaparde <ajit.khaparde@broadcom.com>
 +M:    Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
 +M:    Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
 +M:    Somnath Kotur <somnath.kotur@broadcom.com>
  L:    netdev@vger.kernel.org
  W:    http://www.emulex.com
  S:    Supported
@@@ -10172,7 -10158,6 +10172,7 @@@ S:   Supporte
  F:    drivers/media/pci/solo6x10/
  
  SOFTWARE RAID (Multiple Disks) SUPPORT
 +M:    Shaohua Li <shli@kernel.org>
  L:    linux-raid@vger.kernel.org
  T:    git git://neil.brown.name/md
  S:    Supported
@@@ -10306,7 -10291,6 +10306,7 @@@ L:   spear-devel@list.st.co
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
  S:    Maintained
 +F:    arch/arm/boot/dts/spear*
  F:    arch/arm/mach-spear/
  
  SPEAR CLOCK FRAMEWORK SUPPORT
@@@ -10869,14 -10853,6 +10869,14 @@@ L: linux-omap@vger.kernel.or
  S:    Maintained
  F:    drivers/thermal/ti-soc-thermal/
  
 +TI VPE/CAL DRIVERS
 +M:    Benoit Parrot <bparrot@ti.com>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +S:    Maintained
 +F:    drivers/media/platform/ti-vpe/
 +
  TI CDCE706 CLOCK DRIVER
  M:    Max Filippov <jcmvbkbc@gmail.com>
  S:    Maintained
@@@ -11342,7 -11318,7 +11342,7 @@@ F:   Documentation/usb/ehci.tx
  F:    drivers/usb/host/ehci*
  
  USB GADGET/PERIPHERAL SUBSYSTEM
 -M:    Felipe Balbi <balbi@ti.com>
 +M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
  W:    http://www.linux-usb.org/gadget
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
@@@ -11418,7 -11394,7 +11418,7 @@@ S:   Maintaine
  F:    drivers/net/usb/pegasus.*
  
  USB PHY LAYER
 -M:    Felipe Balbi <balbi@ti.com>
 +M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
@@@ -12157,7 -12133,7 +12157,7 @@@ F:   drivers/net/hamradio/*scc.
  F:    drivers/net/hamradio/z8530.h
  
  ZBUD COMPRESSED PAGE ALLOCATOR
 -M:    Seth Jennings <sjennings@variantweb.net>
 +M:    Seth Jennings <sjenning@redhat.com>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/zbud.c
@@@ -12212,7 -12188,7 +12212,7 @@@ F:   include/linux/zsmalloc.
  F:    Documentation/vm/zsmalloc.txt
  
  ZSWAP COMPRESSED SWAP CACHING
 -M:    Seth Jennings <sjennings@variantweb.net>
 +M:    Seth Jennings <sjenning@redhat.com>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/zswap.c
diff --combined drivers/net/vxlan.c
index a31cd954b308fcf9792df88ec4d1d06842a3b1a1,65f52472a52cc7b7a73066019df5a5f0f8a39b87..57d219fc3d644d8a87b63a9e662870e5e1e3adbd
@@@ -1684,18 -1684,14 +1684,14 @@@ static void vxlan_build_gbp_hdr(struct 
        gbp->policy_id = htons(md->gbp & VXLAN_GBP_ID_MASK);
  }
  
- #if IS_ENABLED(CONFIG_IPV6)
- static int vxlan6_xmit_skb(struct dst_entry *dst, struct sock *sk,
-                          struct sk_buff *skb,
-                          struct net_device *dev, struct in6_addr *saddr,
-                          struct in6_addr *daddr, __u8 prio, __u8 ttl,
-                          __be16 src_port, __be16 dst_port, __be32 vni,
-                          struct vxlan_metadata *md, bool xnet, u32 vxflags)
+ static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst,
+                          int iphdr_len, __be32 vni,
+                          struct vxlan_metadata *md, u32 vxflags,
+                          bool udp_sum)
  {
        struct vxlanhdr *vxh;
        int min_headroom;
        int err;
-       bool udp_sum = !(vxflags & VXLAN_F_UDP_ZERO_CSUM6_TX);
        int type = udp_sum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
        u16 hdrlen = sizeof(struct vxlanhdr);
  
                }
        }
  
-       skb_scrub_packet(skb, xnet);
        min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len
-                       + VXLAN_HLEN + sizeof(struct ipv6hdr)
-                       + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0);
-       /* Need space for new headers (invalidates iph ptr) */
-       err = skb_cow_head(skb, min_headroom);
-       if (unlikely(err)) {
-               kfree_skb(skb);
-               goto err;
-       }
-       skb = vlan_hwaccel_push_inside(skb);
-       if (WARN_ON(!skb)) {
-               err = -ENOMEM;
-               goto err;
-       }
-       skb = iptunnel_handle_offloads(skb, udp_sum, type);
-       if (IS_ERR(skb)) {
-               err = -EINVAL;
-               goto err;
-       }
-       vxh = (struct vxlanhdr *) __skb_push(skb, sizeof(*vxh));
-       vxh->vx_flags = htonl(VXLAN_HF_VNI);
-       vxh->vx_vni = vni;
-       if (type & SKB_GSO_TUNNEL_REMCSUM) {
-               u32 data = (skb_checksum_start_offset(skb) - hdrlen) >>
-                          VXLAN_RCO_SHIFT;
-               if (skb->csum_offset == offsetof(struct udphdr, check))
-                       data |= VXLAN_RCO_UDP;
-               vxh->vx_vni |= htonl(data);
-               vxh->vx_flags |= htonl(VXLAN_HF_RCO);
-               if (!skb_is_gso(skb)) {
-                       skb->ip_summed = CHECKSUM_NONE;
-                       skb->encapsulation = 0;
-               }
-       }
-       if (vxflags & VXLAN_F_GBP)
-               vxlan_build_gbp_hdr(vxh, vxflags, md);
-       skb_set_inner_protocol(skb, htons(ETH_P_TEB));
-       udp_tunnel6_xmit_skb(dst, sk, skb, dev, saddr, daddr, prio,
-                            ttl, src_port, dst_port,
-                            !!(vxflags & VXLAN_F_UDP_ZERO_CSUM6_TX));
-       return 0;
- err:
-       dst_release(dst);
-       return err;
- }
- #endif
- static int vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
-                         __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
-                         __be16 src_port, __be16 dst_port, __be32 vni,
-                         struct vxlan_metadata *md, bool xnet, u32 vxflags)
- {
-       struct vxlanhdr *vxh;
-       int min_headroom;
-       int err;
-       bool udp_sum = !!(vxflags & VXLAN_F_UDP_CSUM);
-       int type = udp_sum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
-       u16 hdrlen = sizeof(struct vxlanhdr);
-       if ((vxflags & VXLAN_F_REMCSUM_TX) &&
-           skb->ip_summed == CHECKSUM_PARTIAL) {
-               int csum_start = skb_checksum_start_offset(skb);
-               if (csum_start <= VXLAN_MAX_REMCSUM_START &&
-                   !(csum_start & VXLAN_RCO_SHIFT_MASK) &&
-                   (skb->csum_offset == offsetof(struct udphdr, check) ||
-                    skb->csum_offset == offsetof(struct tcphdr, check))) {
-                       udp_sum = false;
-                       type |= SKB_GSO_TUNNEL_REMCSUM;
-               }
-       }
-       min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
-                       + VXLAN_HLEN + sizeof(struct iphdr)
+                       + VXLAN_HLEN + iphdr_len
                        + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0);
  
        /* Need space for new headers (invalidates iph ptr) */
                vxlan_build_gbp_hdr(vxh, vxflags, md);
  
        skb_set_inner_protocol(skb, htons(ETH_P_TEB));
-       udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df,
-                           src_port, dst_port, xnet,
-                           !(vxflags & VXLAN_F_UDP_CSUM));
        return 0;
  }
  
+ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan,
+                                     struct sk_buff *skb, int oif, u8 tos,
+                                     __be32 daddr, __be32 *saddr)
+ {
+       struct rtable *rt = NULL;
+       struct flowi4 fl4;
+       memset(&fl4, 0, sizeof(fl4));
+       fl4.flowi4_oif = oif;
+       fl4.flowi4_tos = RT_TOS(tos);
+       fl4.flowi4_mark = skb->mark;
+       fl4.flowi4_proto = IPPROTO_UDP;
+       fl4.daddr = daddr;
+       fl4.saddr = vxlan->cfg.saddr.sin.sin_addr.s_addr;
+       rt = ip_route_output_key(vxlan->net, &fl4);
+       if (!IS_ERR(rt))
+               *saddr = fl4.saddr;
+       return rt;
+ }
  #if IS_ENABLED(CONFIG_IPV6)
  static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
                                          struct sk_buff *skb, int oif,
@@@ -1928,7 -1856,6 +1856,6 @@@ static void vxlan_xmit_one(struct sk_bu
        struct sock *sk;
        struct rtable *rt = NULL;
        const struct iphdr *old_iph;
-       struct flowi4 fl4;
        union vxlan_addr *dst;
        union vxlan_addr remote_ip;
        struct vxlan_metadata _md;
        __u8 tos, ttl;
        int err;
        u32 flags = vxlan->flags;
+       bool udp_sum = false;
+       bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev));
  
        info = skb_tunnel_info(skb);
  
        if (info) {
                ttl = info->key.ttl;
                tos = info->key.tos;
+               udp_sum = !!(info->key.tun_flags & TUNNEL_CSUM);
  
                if (info->options_len)
                        md = ip_tunnel_info_opts(info);
        }
  
        if (dst->sa.sa_family == AF_INET) {
+               __be32 saddr;
                if (!vxlan->vn4_sock)
                        goto drop;
                sk = vxlan->vn4_sock->sock->sk;
                if (info) {
                        if (info->key.tun_flags & TUNNEL_DONT_FRAGMENT)
                                df = htons(IP_DF);
-                       if (info->key.tun_flags & TUNNEL_CSUM)
-                               flags |= VXLAN_F_UDP_CSUM;
-                       else
-                               flags &= ~VXLAN_F_UDP_CSUM;
+               } else {
+                       udp_sum = !!(flags & VXLAN_F_UDP_CSUM);
                }
  
-               memset(&fl4, 0, sizeof(fl4));
-               fl4.flowi4_oif = rdst ? rdst->remote_ifindex : 0;
-               fl4.flowi4_tos = RT_TOS(tos);
-               fl4.flowi4_mark = skb->mark;
-               fl4.flowi4_proto = IPPROTO_UDP;
-               fl4.daddr = dst->sin.sin_addr.s_addr;
-               fl4.saddr = vxlan->cfg.saddr.sin.sin_addr.s_addr;
-               rt = ip_route_output_key(vxlan->net, &fl4);
+               rt = vxlan_get_route(vxlan, skb,
+                                    rdst ? rdst->remote_ifindex : 0, tos,
+                                    dst->sin.sin_addr.s_addr, &saddr);
                if (IS_ERR(rt)) {
                        netdev_dbg(dev, "no route to %pI4\n",
                                   &dst->sin.sin_addr.s_addr);
  
                tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
                ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
-               err = vxlan_xmit_skb(rt, sk, skb, fl4.saddr,
-                                    dst->sin.sin_addr.s_addr, tos, ttl, df,
-                                    src_port, dst_port, htonl(vni << 8), md,
-                                    !net_eq(vxlan->net, dev_net(vxlan->dev)),
-                                    flags);
-               if (err < 0) {
-                       /* skb is already freed. */
-                       skb = NULL;
-                       goto rt_tx_error;
-               }
+               err = vxlan_build_skb(skb, &rt->dst, sizeof(struct iphdr),
+                                     htonl(vni << 8), md, flags, udp_sum);
+               if (err < 0)
+                       goto xmit_tx_error;
+               udp_tunnel_xmit_skb(rt, sk, skb, saddr,
+                                   dst->sin.sin_addr.s_addr, tos, ttl, df,
+                                   src_port, dst_port, xnet, !udp_sum);
  #if IS_ENABLED(CONFIG_IPV6)
        } else {
                struct dst_entry *ndst;
                        return;
                }
  
-               if (info) {
-                       if (info->key.tun_flags & TUNNEL_CSUM)
-                               flags &= ~VXLAN_F_UDP_ZERO_CSUM6_TX;
-                       else
-                               flags |= VXLAN_F_UDP_ZERO_CSUM6_TX;
-               }
+               if (!info)
+                       udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
  
                ttl = ttl ? : ip6_dst_hoplimit(ndst);
-               err = vxlan6_xmit_skb(ndst, sk, skb, dev, &saddr, &dst->sin6.sin6_addr,
-                                     0, ttl, src_port, dst_port, htonl(vni << 8), md,
-                                     !net_eq(vxlan->net, dev_net(vxlan->dev)),
-                                     flags);
+               skb_scrub_packet(skb, xnet);
+               err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
+                                     htonl(vni << 8), md, flags, udp_sum);
+               if (err < 0) {
+                       dst_release(ndst);
+                       return;
+               }
+               udp_tunnel6_xmit_skb(ndst, sk, skb, dev,
+                                    &saddr, &dst->sin6.sin6_addr,
+                                    0, ttl, src_port, dst_port, !udp_sum);
  #endif
        }
  
@@@ -2124,6 -2047,9 +2047,9 @@@ drop
        dev->stats.tx_dropped++;
        goto tx_free;
  
+ xmit_tx_error:
+       /* skb is already freed. */
+       skb = NULL;
  rt_tx_error:
        ip_rt_put(rt);
  tx_error:
@@@ -2367,68 -2293,29 +2293,43 @@@ static void vxlan_set_multicast_list(st
  {
  }
  
 -static int vxlan_change_mtu(struct net_device *dev, int new_mtu)
 +static int __vxlan_change_mtu(struct net_device *dev,
 +                            struct net_device *lowerdev,
 +                            struct vxlan_rdst *dst, int new_mtu, bool strict)
  {
 -      struct vxlan_dev *vxlan = netdev_priv(dev);
 -      struct vxlan_rdst *dst = &vxlan->default_dst;
 -      struct net_device *lowerdev;
 -      int max_mtu;
 +      int max_mtu = IP_MAX_MTU;
  
 -      lowerdev = __dev_get_by_index(vxlan->net, dst->remote_ifindex);
 -      if (lowerdev == NULL)
 -              return eth_change_mtu(dev, new_mtu);
 +      if (lowerdev)
 +              max_mtu = lowerdev->mtu;
  
        if (dst->remote_ip.sa.sa_family == AF_INET6)
 -              max_mtu = lowerdev->mtu - VXLAN6_HEADROOM;
 +              max_mtu -= VXLAN6_HEADROOM;
        else
 -              max_mtu = lowerdev->mtu - VXLAN_HEADROOM;
 +              max_mtu -= VXLAN_HEADROOM;
  
 -      if (new_mtu < 68 || new_mtu > max_mtu)
 +      if (new_mtu < 68)
                return -EINVAL;
  
 +      if (new_mtu > max_mtu) {
 +              if (strict)
 +                      return -EINVAL;
 +
 +              new_mtu = max_mtu;
 +      }
 +
        dev->mtu = new_mtu;
        return 0;
  }
  
- static int egress_ipv4_tun_info(struct net_device *dev, struct sk_buff *skb,
-                               struct ip_tunnel_info *info,
-                               __be16 sport, __be16 dport)
- {
-       struct vxlan_dev *vxlan = netdev_priv(dev);
-       struct rtable *rt;
-       struct flowi4 fl4;
-       memset(&fl4, 0, sizeof(fl4));
-       fl4.flowi4_tos = RT_TOS(info->key.tos);
-       fl4.flowi4_mark = skb->mark;
-       fl4.flowi4_proto = IPPROTO_UDP;
-       fl4.daddr = info->key.u.ipv4.dst;
-       rt = ip_route_output_key(vxlan->net, &fl4);
-       if (IS_ERR(rt))
-               return PTR_ERR(rt);
-       ip_rt_put(rt);
-       info->key.u.ipv4.src = fl4.saddr;
-       info->key.tp_src = sport;
-       info->key.tp_dst = dport;
-       return 0;
- }
 +static int vxlan_change_mtu(struct net_device *dev, int new_mtu)
 +{
 +      struct vxlan_dev *vxlan = netdev_priv(dev);
 +      struct vxlan_rdst *dst = &vxlan->default_dst;
 +      struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
 +                                                       dst->remote_ifindex);
 +      return __vxlan_change_mtu(dev, lowerdev, dst, new_mtu, true);
 +}
 +
  static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
  {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        dport = info->key.tp_dst ? : vxlan->cfg.dst_port;
  
        if (ip_tunnel_info_af(info) == AF_INET) {
+               struct rtable *rt;
                if (!vxlan->vn4_sock)
                        return -EINVAL;
-               return egress_ipv4_tun_info(dev, skb, info, sport, dport);
+               rt = vxlan_get_route(vxlan, skb, 0, info->key.tos,
+                                    info->key.u.ipv4.dst,
+                                    &info->key.u.ipv4.src);
+               if (IS_ERR(rt))
+                       return PTR_ERR(rt);
+               ip_rt_put(rt);
        } else {
  #if IS_ENABLED(CONFIG_IPV6)
                struct dst_entry *ndst;
                if (IS_ERR(ndst))
                        return PTR_ERR(ndst);
                dst_release(ndst);
-               info->key.tp_src = sport;
-               info->key.tp_dst = dport;
  #else /* !CONFIG_IPV6 */
                return -EPFNOSUPPORT;
  #endif
        }
+       info->key.tp_src = sport;
+       info->key.tp_dst = dport;
        return 0;
  }
  
@@@ -2779,7 -2672,6 +2686,7 @@@ static int vxlan_dev_configure(struct n
        int err;
        bool use_ipv6 = false;
        __be16 default_port = vxlan->cfg.dst_port;
 +      struct net_device *lowerdev = NULL;
  
        vxlan->net = src_net;
  
        }
  
        if (conf->remote_ifindex) {
 -              struct net_device *lowerdev
 -                       = __dev_get_by_index(src_net, conf->remote_ifindex);
 -
 +              lowerdev = __dev_get_by_index(src_net, conf->remote_ifindex);
                dst->remote_ifindex = conf->remote_ifindex;
  
                if (!lowerdev) {
                needed_headroom = lowerdev->hard_header_len;
        }
  
 +      if (conf->mtu) {
 +              err = __vxlan_change_mtu(dev, lowerdev, dst, conf->mtu, false);
 +              if (err)
 +                      return err;
 +      }
 +
        if (use_ipv6 || conf->flags & VXLAN_F_COLLECT_METADATA)
                needed_headroom += VXLAN6_HEADROOM;
        else
diff --combined include/net/tcp.h
index ae6468f5c9f373d63d987fb114deba1064bc16d5,9b2cb0c8d876d96e857d76f6c49956289faa97e1..e90db854680602414d9db5e1e93ee010adb552e4
@@@ -239,13 -239,6 +239,6 @@@ extern struct inet_timewait_death_row t
  extern int sysctl_tcp_timestamps;
  extern int sysctl_tcp_window_scaling;
  extern int sysctl_tcp_sack;
- extern int sysctl_tcp_fin_timeout;
- extern int sysctl_tcp_syn_retries;
- extern int sysctl_tcp_synack_retries;
- extern int sysctl_tcp_retries1;
- extern int sysctl_tcp_retries2;
- extern int sysctl_tcp_orphan_retries;
- extern int sysctl_tcp_syncookies;
  extern int sysctl_tcp_fastopen;
  extern int sysctl_tcp_retrans_collapse;
  extern int sysctl_tcp_stdurg;
@@@ -274,7 -267,6 +267,6 @@@ extern int sysctl_tcp_thin_dupack
  extern int sysctl_tcp_early_retrans;
  extern int sysctl_tcp_limit_output_bytes;
  extern int sysctl_tcp_challenge_ack_limit;
- extern unsigned int sysctl_tcp_notsent_lowat;
  extern int sysctl_tcp_min_tso_segs;
  extern int sysctl_tcp_min_rtt_wlen;
  extern int sysctl_tcp_autocorking;
@@@ -447,7 -439,7 +439,7 @@@ const u8 *tcp_parse_md5sig_option(cons
  
  void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);
  void tcp_v4_mtu_reduced(struct sock *sk);
 -void tcp_req_err(struct sock *sk, u32 seq);
 +void tcp_req_err(struct sock *sk, u32 seq, bool abort);
  int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb);
  struct sock *tcp_create_openreq_child(const struct sock *sk,
                                      struct request_sock *req,
@@@ -568,6 -560,7 +560,7 @@@ void tcp_rearm_rto(struct sock *sk)
  void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req);
  void tcp_reset(struct sock *sk);
  void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb);
+ void tcp_fin(struct sock *sk);
  
  /* tcp_timer.c */
  void tcp_init_xmit_timers(struct sock *);
@@@ -963,9 -956,11 +956,11 @@@ static inline void tcp_enable_fack(stru
   */
  static inline void tcp_enable_early_retrans(struct tcp_sock *tp)
  {
+       struct net *net = sock_net((struct sock *)tp);
        tp->do_early_retrans = sysctl_tcp_early_retrans &&
                sysctl_tcp_early_retrans < 4 && !sysctl_tcp_thin_dupack &&
-               sysctl_tcp_reordering == 3;
+               net->ipv4.sysctl_tcp_reordering == 3;
  }
  
  static inline void tcp_disable_early_retrans(struct tcp_sock *tp)
@@@ -1252,7 -1247,7 +1247,7 @@@ static inline u32 keepalive_time_elapse
  
  static inline int tcp_fin_time(const struct sock *sk)
  {
-       int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout;
+       int fin_timeout = tcp_sk(sk)->linger2 ? : sock_net(sk)->ipv4.sysctl_tcp_fin_timeout;
        const int rto = inet_csk(sk)->icsk_rto;
  
        if (fin_timeout < (rto << 2) - (rto >> 1))
@@@ -1437,6 -1432,7 +1432,7 @@@ void tcp_free_fastopen_req(struct tcp_s
  
  extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;
  int tcp_fastopen_reset_cipher(void *key, unsigned int len);
+ void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb);
  struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
                              struct request_sock *req,
                              struct tcp_fastopen_cookie *foc,
@@@ -1685,7 -1681,8 +1681,8 @@@ void __tcp_v4_send_check(struct sk_buf
  
  static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp)
  {
-       return tp->notsent_lowat ?: sysctl_tcp_notsent_lowat;
+       struct net *net = sock_net((struct sock *)tp);
+       return tp->notsent_lowat ?: net->ipv4.sysctl_tcp_notsent_lowat;
  }
  
  static inline bool tcp_stream_memory_free(const struct sock *sk)
diff --combined net/ipv4/tcp.c
index 0c36ef4a3f8619792a33a67cf557849baba251ba,014f18e2f7b368f3ba3a319962ab027d7014ef6f..56024d17ca516d338166ee7ad85647ecdc973c52
  #include <asm/unaligned.h>
  #include <net/busy_poll.h>
  
- int sysctl_tcp_fin_timeout __read_mostly = TCP_FIN_TIMEOUT;
  int sysctl_tcp_min_tso_segs __read_mostly = 2;
  
  int sysctl_tcp_autocorking __read_mostly = 1;
@@@ -406,7 -404,7 +404,7 @@@ void tcp_init_sock(struct sock *sk
        tp->mss_cache = TCP_MSS_DEFAULT;
        u64_stats_init(&tp->syncp);
  
-       tp->reordering = sysctl_tcp_reordering;
+       tp->reordering = sock_net(sk)->ipv4.sysctl_tcp_reordering;
        tcp_enable_early_retrans(tp);
        tcp_assign_congestion_control(sk);
  
@@@ -940,7 -938,7 +938,7 @@@ new_segment
  
                i = skb_shinfo(skb)->nr_frags;
                can_coalesce = skb_can_coalesce(skb, i, page, offset);
 -              if (!can_coalesce && i >= MAX_SKB_FRAGS) {
 +              if (!can_coalesce && i >= sysctl_max_skb_frags) {
                        tcp_mark_push(tp, skb);
                        goto new_segment;
                }
@@@ -1213,7 -1211,7 +1211,7 @@@ new_segment
  
                        if (!skb_can_coalesce(skb, i, pfrag->page,
                                              pfrag->offset)) {
 -                              if (i == MAX_SKB_FRAGS || !sg) {
 +                              if (i == sysctl_max_skb_frags || !sg) {
                                        tcp_mark_push(tp, skb);
                                        goto new_segment;
                                }
@@@ -1466,8 -1464,10 +1464,10 @@@ static struct sk_buff *tcp_recv_skb(str
  
        while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
                offset = seq - TCP_SKB_CB(skb)->seq;
-               if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
+               if (unlikely(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)) {
+                       pr_err_once("%s: found a SYN, please report !\n", __func__);
                        offset--;
+               }
                if (offset < skb->len || (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)) {
                        *off = offset;
                        return skb;
@@@ -1657,8 -1657,10 +1657,10 @@@ int tcp_recvmsg(struct sock *sk, struc
                                break;
  
                        offset = *seq - TCP_SKB_CB(skb)->seq;
-                       if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
+                       if (unlikely(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)) {
+                               pr_err_once("%s: found a SYN, please report !\n", __func__);
                                offset--;
+                       }
                        if (offset < skb->len)
                                goto found_ok_skb;
                        if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
@@@ -2326,6 -2328,7 +2328,7 @@@ static int do_tcp_setsockopt(struct soc
  {
        struct tcp_sock *tp = tcp_sk(sk);
        struct inet_connection_sock *icsk = inet_csk(sk);
+       struct net *net = sock_net(sk);
        int val;
        int err = 0;
  
        case TCP_LINGER2:
                if (val < 0)
                        tp->linger2 = -1;
-               else if (val > sysctl_tcp_fin_timeout / HZ)
+               else if (val > net->ipv4.sysctl_tcp_fin_timeout / HZ)
                        tp->linger2 = 0;
                else
                        tp->linger2 = val * HZ;
@@@ -2727,6 -2730,7 +2730,7 @@@ static int do_tcp_getsockopt(struct soc
  {
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
+       struct net *net = sock_net(sk);
        int val, len;
  
        if (get_user(len, optlen))
                val = keepalive_probes(tp);
                break;
        case TCP_SYNCNT:
-               val = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries;
+               val = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries;
                break;
        case TCP_LINGER2:
                val = tp->linger2;
                if (val >= 0)
-                       val = (val ? : sysctl_tcp_fin_timeout) / HZ;
+                       val = (val ? : net->ipv4.sysctl_tcp_fin_timeout) / HZ;
                break;
        case TCP_DEFER_ACCEPT:
                val = retrans_to_secs(icsk->icsk_accept_queue.rskq_defer_accept,
diff --combined net/ipv4/tcp_ipv4.c
index 7f6ff037adaf7c91d3eb52225df60d2cc4c24e5a,0d381fa164f85b4015e548e9f30d2d0f4058b73a..2a562834a01a41c98ec235e43184ca50d0b5d442
@@@ -311,7 -311,7 +311,7 @@@ static void do_redirect(struct sk_buff 
  
  
  /* handle ICMP messages on TCP_NEW_SYN_RECV request sockets */
 -void tcp_req_err(struct sock *sk, u32 seq)
 +void tcp_req_err(struct sock *sk, u32 seq, bool abort)
  {
        struct request_sock *req = inet_reqsk(sk);
        struct net *net = sock_net(sk);
  
        if (seq != tcp_rsk(req)->snt_isn) {
                NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
 -      } else {
 +      } else if (abort) {
                /*
                 * Still in SYN_RECV, just remove it silently.
                 * There is no good way to pass the error to the newly
@@@ -383,12 -383,7 +383,12 @@@ void tcp_v4_err(struct sk_buff *icmp_sk
        }
        seq = ntohl(th->seq);
        if (sk->sk_state == TCP_NEW_SYN_RECV)
 -              return tcp_req_err(sk, seq);
 +              return tcp_req_err(sk, seq,
 +                                type == ICMP_PARAMETERPROB ||
 +                                type == ICMP_TIME_EXCEEDED ||
 +                                (type == ICMP_DEST_UNREACH &&
 +                                 (code == ICMP_NET_UNREACH ||
 +                                  code == ICMP_HOST_UNREACH)));
  
        bh_lock_sock(sk);
        /* If too many ICMPs get dropped on busy
@@@ -865,7 -860,6 +865,6 @@@ static void tcp_v4_reqsk_destructor(str
        kfree(inet_rsk(req)->opt);
  }
  
  #ifdef CONFIG_TCP_MD5SIG
  /*
   * RFC2385 MD5 checksumming requires a mapping of
@@@ -2393,6 -2387,16 +2392,16 @@@ static int __net_init tcp_sk_init(struc
        net->ipv4.sysctl_tcp_keepalive_probes = TCP_KEEPALIVE_PROBES;
        net->ipv4.sysctl_tcp_keepalive_intvl = TCP_KEEPALIVE_INTVL;
  
+       net->ipv4.sysctl_tcp_syn_retries = TCP_SYN_RETRIES;
+       net->ipv4.sysctl_tcp_synack_retries = TCP_SYNACK_RETRIES;
+       net->ipv4.sysctl_tcp_syncookies = 1;
+       net->ipv4.sysctl_tcp_reordering = TCP_FASTRETRANS_THRESH;
+       net->ipv4.sysctl_tcp_retries1 = TCP_RETR1;
+       net->ipv4.sysctl_tcp_retries2 = TCP_RETR2;
+       net->ipv4.sysctl_tcp_orphan_retries = 0;
+       net->ipv4.sysctl_tcp_fin_timeout = TCP_FIN_TIMEOUT;
+       net->ipv4.sysctl_tcp_notsent_lowat = UINT_MAX;
        return 0;
  fail:
        tcp_sk_exit(net);
diff --combined net/unix/af_unix.c
index 29be035f9c65024fcaf4fe483a81702d6877217f,b3745557fc89b35703d683431336f6a6bf2e629f..a6d6654697779060ecdeeb34c75fcfe7e618f433
@@@ -1496,7 -1496,7 +1496,7 @@@ static void unix_detach_fds(struct scm_
        UNIXCB(skb).fp = NULL;
  
        for (i = scm->fp->count-1; i >= 0; i--)
 -              unix_notinflight(scm->fp->fp[i]);
 +              unix_notinflight(scm->fp->user, scm->fp->fp[i]);
  }
  
  static void unix_destruct_scm(struct sk_buff *skb)
@@@ -1534,7 -1534,6 +1534,6 @@@ static int unix_attach_fds(struct scm_c
  {
        int i;
        unsigned char max_level = 0;
-       int unix_sock_count = 0;
  
        if (too_many_unix_fds(current))
                return -ETOOMANYREFS;
        for (i = scm->fp->count - 1; i >= 0; i--) {
                struct sock *sk = unix_get_socket(scm->fp->fp[i]);
  
-               if (sk) {
-                       unix_sock_count++;
+               if (sk)
                        max_level = max(max_level,
                                        unix_sk(sk)->recursion_level);
-               }
        }
        if (unlikely(max_level > MAX_RECURSION_LEVEL))
                return -ETOOMANYREFS;
                return -ENOMEM;
  
        for (i = scm->fp->count - 1; i >= 0; i--)
 -              unix_inflight(scm->fp->fp[i]);
 +              unix_inflight(scm->fp->user, scm->fp->fp[i]);
        return max_level;
  }