Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixes from David Miller:

1) Fix checksumming regressions, from Tom Herbert.

2) Undo unintentional permissions changes for SCTP rto_alpha and
rto_beta sysfs knobs, from Denial Borkmann.

3) VXLAN, like other IP tunnels, should advertize it's encapsulation
size using dev->needed_headroom instead of dev->hard_header_len.
From Cong Wang.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
net: sctp: fix permissions for rto_alpha and rto_beta knobs
vxlan: Checksum fixes
net: add skb_pop_rcv_encapsulation
udp: call __skb_checksum_complete when doing full checksum
net: Fix save software checksum complete
net: Fix GSO constants to match NETIF flags
udp: ipv4: do not waste time in __udp4_lib_mcast_demux_lookup
vxlan: use dev->needed_headroom instead of dev->hard_header_len
MAINTAINERS: update cxgb4 maintainer

Changed files
+96 -34
drivers
net
include
net
+1 -1
MAINTAINERS
··· 2594 2594 F: drivers/infiniband/hw/cxgb3/ 2595 2595 2596 2596 CXGB4 ETHERNET DRIVER (CXGB4) 2597 - M: Dimitris Michailidis <dm@chelsio.com> 2597 + M: Hariprasad S <hariprasad@chelsio.com> 2598 2598 L: netdev@vger.kernel.org 2599 2599 W: http://www.chelsio.com 2600 2600 S: Supported
+5 -13
drivers/net/vxlan.c
··· 1156 1156 if (!vs) 1157 1157 goto drop; 1158 1158 1159 - /* If the NIC driver gave us an encapsulated packet 1160 - * with the encapsulation mark, the device checksummed it 1161 - * for us. Otherwise force the upper layers to verify it. 1162 - */ 1163 - if ((skb->ip_summed != CHECKSUM_UNNECESSARY && skb->ip_summed != CHECKSUM_PARTIAL) || 1164 - !skb->encapsulation) 1165 - skb->ip_summed = CHECKSUM_NONE; 1166 - 1167 - skb->encapsulation = 0; 1159 + skb_pop_rcv_encapsulation(skb); 1168 1160 1169 1161 vs->rcv(vs, skb, vxh->vx_vni); 1170 1162 return 0; ··· 1193 1201 skb_reset_mac_header(skb); 1194 1202 skb_scrub_packet(skb, !net_eq(vxlan->net, dev_net(vxlan->dev))); 1195 1203 skb->protocol = eth_type_trans(skb, vxlan->dev); 1204 + skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); 1196 1205 1197 1206 /* Ignore packet loops (and multicast echo) */ 1198 1207 if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr)) ··· 2240 2247 eth_hw_addr_random(dev); 2241 2248 ether_setup(dev); 2242 2249 if (vxlan->default_dst.remote_ip.sa.sa_family == AF_INET6) 2243 - dev->hard_header_len = ETH_HLEN + VXLAN6_HEADROOM; 2250 + dev->needed_headroom = ETH_HLEN + VXLAN6_HEADROOM; 2244 2251 else 2245 - dev->hard_header_len = ETH_HLEN + VXLAN_HEADROOM; 2252 + dev->needed_headroom = ETH_HLEN + VXLAN_HEADROOM; 2246 2253 2247 2254 dev->netdev_ops = &vxlan_netdev_ops; 2248 2255 dev->destructor = free_netdev; ··· 2639 2646 if (!tb[IFLA_MTU]) 2640 2647 dev->mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM); 2641 2648 2642 - /* update header length based on lower device */ 2643 - dev->hard_header_len = lowerdev->hard_header_len + 2649 + dev->needed_headroom = lowerdev->hard_header_len + 2644 2650 (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM); 2645 2651 } else if (use_ipv6) 2646 2652 vxlan->flags |= VXLAN_F_IPV6;
+1
include/linux/netdev_features.h
··· 117 117 #define NETIF_F_GSO_IPIP __NETIF_F(GSO_IPIP) 118 118 #define NETIF_F_GSO_SIT __NETIF_F(GSO_SIT) 119 119 #define NETIF_F_GSO_UDP_TUNNEL __NETIF_F(GSO_UDP_TUNNEL) 120 + #define NETIF_F_GSO_UDP_TUNNEL_CSUM __NETIF_F(GSO_UDP_TUNNEL_CSUM) 120 121 #define NETIF_F_GSO_MPLS __NETIF_F(GSO_MPLS) 121 122 #define NETIF_F_HW_VLAN_STAG_FILTER __NETIF_F(HW_VLAN_STAG_FILTER) 122 123 #define NETIF_F_HW_VLAN_STAG_RX __NETIF_F(HW_VLAN_STAG_RX)
+7
include/linux/netdevice.h
··· 3305 3305 BUILD_BUG_ON(SKB_GSO_TCP_ECN != (NETIF_F_TSO_ECN >> NETIF_F_GSO_SHIFT)); 3306 3306 BUILD_BUG_ON(SKB_GSO_TCPV6 != (NETIF_F_TSO6 >> NETIF_F_GSO_SHIFT)); 3307 3307 BUILD_BUG_ON(SKB_GSO_FCOE != (NETIF_F_FSO >> NETIF_F_GSO_SHIFT)); 3308 + BUILD_BUG_ON(SKB_GSO_GRE != (NETIF_F_GSO_GRE >> NETIF_F_GSO_SHIFT)); 3309 + BUILD_BUG_ON(SKB_GSO_GRE_CSUM != (NETIF_F_GSO_GRE_CSUM >> NETIF_F_GSO_SHIFT)); 3310 + BUILD_BUG_ON(SKB_GSO_IPIP != (NETIF_F_GSO_IPIP >> NETIF_F_GSO_SHIFT)); 3311 + BUILD_BUG_ON(SKB_GSO_SIT != (NETIF_F_GSO_SIT >> NETIF_F_GSO_SHIFT)); 3312 + BUILD_BUG_ON(SKB_GSO_UDP_TUNNEL != (NETIF_F_GSO_UDP_TUNNEL >> NETIF_F_GSO_SHIFT)); 3313 + BUILD_BUG_ON(SKB_GSO_UDP_TUNNEL_CSUM != (NETIF_F_GSO_UDP_TUNNEL_CSUM >> NETIF_F_GSO_SHIFT)); 3314 + BUILD_BUG_ON(SKB_GSO_MPLS != (NETIF_F_GSO_MPLS >> NETIF_F_GSO_SHIFT)); 3308 3315 3309 3316 return (features & feature) == feature; 3310 3317 }
+18 -5
include/linux/skbuff.h
··· 338 338 339 339 SKB_GSO_GRE = 1 << 6, 340 340 341 - SKB_GSO_IPIP = 1 << 7, 341 + SKB_GSO_GRE_CSUM = 1 << 7, 342 342 343 - SKB_GSO_SIT = 1 << 8, 343 + SKB_GSO_IPIP = 1 << 8, 344 344 345 - SKB_GSO_UDP_TUNNEL = 1 << 9, 345 + SKB_GSO_SIT = 1 << 9, 346 346 347 - SKB_GSO_MPLS = 1 << 10, 347 + SKB_GSO_UDP_TUNNEL = 1 << 10, 348 348 349 349 SKB_GSO_UDP_TUNNEL_CSUM = 1 << 11, 350 350 351 - SKB_GSO_GRE_CSUM = 1 << 12, 351 + SKB_GSO_MPLS = 1 << 12, 352 + 352 353 }; 353 354 354 355 #if BITS_PER_LONG > 32 ··· 1852 1851 static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) 1853 1852 { 1854 1853 return pskb_may_pull(skb, skb_network_offset(skb) + len); 1854 + } 1855 + 1856 + static inline void skb_pop_rcv_encapsulation(struct sk_buff *skb) 1857 + { 1858 + /* Only continue with checksum unnecessary if device indicated 1859 + * it is valid across encapsulation (skb->encapsulation was set). 1860 + */ 1861 + if (skb->ip_summed == CHECKSUM_UNNECESSARY && !skb->encapsulation) 1862 + skb->ip_summed = CHECKSUM_NONE; 1863 + 1864 + skb->encapsulation = 0; 1865 + skb->csum_valid = 0; 1855 1866 } 1856 1867 1857 1868 /*
+3 -1
include/net/udp.h
··· 111 111 */ 112 112 static inline __sum16 __udp_lib_checksum_complete(struct sk_buff *skb) 113 113 { 114 - return __skb_checksum_complete_head(skb, UDP_SKB_CB(skb)->cscov); 114 + return (UDP_SKB_CB(skb)->cscov == skb->len ? 115 + __skb_checksum_complete(skb) : 116 + __skb_checksum_complete_head(skb, UDP_SKB_CB(skb)->cscov)); 115 117 } 116 118 117 119 static inline int udp_lib_checksum_complete(struct sk_buff *skb)
+26 -10
net/core/datagram.c
··· 739 739 __sum16 sum; 740 740 741 741 sum = csum_fold(skb_checksum(skb, 0, len, skb->csum)); 742 - if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && !sum && 743 - !skb->csum_complete_sw) 744 - netdev_rx_csum_fault(skb->dev); 745 - 746 - /* Save checksum complete for later use */ 747 - skb->csum = sum; 748 - skb->ip_summed = CHECKSUM_COMPLETE; 749 - skb->csum_complete_sw = 1; 750 - 742 + if (likely(!sum)) { 743 + if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && 744 + !skb->csum_complete_sw) 745 + netdev_rx_csum_fault(skb->dev); 746 + } 747 + skb->csum_valid = !sum; 751 748 return sum; 752 749 } 753 750 EXPORT_SYMBOL(__skb_checksum_complete_head); 754 751 755 752 __sum16 __skb_checksum_complete(struct sk_buff *skb) 756 753 { 757 - return __skb_checksum_complete_head(skb, skb->len); 754 + __wsum csum; 755 + __sum16 sum; 756 + 757 + csum = skb_checksum(skb, 0, skb->len, 0); 758 + 759 + /* skb->csum holds pseudo checksum */ 760 + sum = csum_fold(csum_add(skb->csum, csum)); 761 + if (likely(!sum)) { 762 + if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && 763 + !skb->csum_complete_sw) 764 + netdev_rx_csum_fault(skb->dev); 765 + } 766 + 767 + /* Save full packet checksum */ 768 + skb->csum = csum; 769 + skb->ip_summed = CHECKSUM_COMPLETE; 770 + skb->csum_complete_sw = 1; 771 + skb->csum_valid = !sum; 772 + 773 + return sum; 758 774 } 759 775 EXPORT_SYMBOL(__skb_checksum_complete); 760 776
+3
net/core/skbuff.c
··· 689 689 new->ooo_okay = old->ooo_okay; 690 690 new->no_fcs = old->no_fcs; 691 691 new->encapsulation = old->encapsulation; 692 + new->encap_hdr_csum = old->encap_hdr_csum; 693 + new->csum_valid = old->csum_valid; 694 + new->csum_complete_sw = old->csum_complete_sw; 692 695 #ifdef CONFIG_XFRM 693 696 new->sp = secpath_get(old->sp); 694 697 #endif
+4
net/ipv4/udp.c
··· 1861 1861 unsigned int count, slot = udp_hashfn(net, hnum, udp_table.mask); 1862 1862 struct udp_hslot *hslot = &udp_table.hash[slot]; 1863 1863 1864 + /* Do not bother scanning a too big list */ 1865 + if (hslot->count > 10) 1866 + return NULL; 1867 + 1864 1868 rcu_read_lock(); 1865 1869 begin: 1866 1870 count = 0;
+28 -4
net/sctp/sysctl.c
··· 34 34 * Sridhar Samudrala <sri@us.ibm.com> 35 35 */ 36 36 37 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 38 + 37 39 #include <net/sctp/structs.h> 38 40 #include <net/sctp/sctp.h> 39 41 #include <linux/sysctl.h> ··· 48 46 static int sack_timer_max = 500; 49 47 static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ 50 48 static int rwnd_scale_max = 16; 49 + static int rto_alpha_min = 0; 50 + static int rto_beta_min = 0; 51 + static int rto_alpha_max = 1000; 52 + static int rto_beta_max = 1000; 53 + 51 54 static unsigned long max_autoclose_min = 0; 52 55 static unsigned long max_autoclose_max = 53 56 (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) ··· 71 64 static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, 72 65 void __user *buffer, size_t *lenp, 73 66 loff_t *ppos); 67 + static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, 68 + void __user *buffer, size_t *lenp, 69 + loff_t *ppos); 74 70 static int proc_sctp_do_auth(struct ctl_table *ctl, int write, 75 71 void __user *buffer, size_t *lenp, 76 72 loff_t *ppos); ··· 136 126 .procname = "rto_alpha_exp_divisor", 137 127 .data = &init_net.sctp.rto_alpha, 138 128 .maxlen = sizeof(int), 139 - .mode = 0444, 140 - .proc_handler = proc_dointvec, 129 + .mode = 0644, 130 + .proc_handler = proc_sctp_do_alpha_beta, 131 + .extra1 = &rto_alpha_min, 132 + .extra2 = &rto_alpha_max, 141 133 }, 142 134 { 143 135 .procname = "rto_beta_exp_divisor", 144 136 .data = &init_net.sctp.rto_beta, 145 137 .maxlen = sizeof(int), 146 - .mode = 0444, 147 - .proc_handler = proc_dointvec, 138 + .mode = 0644, 139 + .proc_handler = proc_sctp_do_alpha_beta, 140 + .extra1 = &rto_beta_min, 141 + .extra2 = &rto_beta_max, 148 142 }, 149 143 { 150 144 .procname = "max_burst", ··· 415 401 net->sctp.rto_max = new_value; 416 402 } 417 403 return ret; 404 + } 405 + 406 + static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, 407 + void __user *buffer, size_t *lenp, 408 + loff_t *ppos) 409 + { 410 + pr_warn_once("Changing rto_alpha or rto_beta may lead to " 411 + "suboptimal rtt/srtt estimations!\n"); 412 + 413 + return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 418 414 } 419 415 420 416 static int proc_sctp_do_auth(struct ctl_table *ctl, int write,