aboutsummaryrefslogtreecommitdiffstats
path: root/net/packet
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-12-11 17:27:06 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-11 17:27:06 -0500
commit70e71ca0af244f48a5dcf56dc435243792e3a495 (patch)
treef7d9c4c4d9a857a00043e9bf6aa2d6f533a34778 /net/packet
parentbae41e45b7400496b9bf0c70c6004419d9987819 (diff)
parent00c83b01d58068dfeb2e1351cca6fccf2a83fa8f (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller: 1) New offloading infrastructure and example 'rocker' driver for offloading of switching and routing to hardware. This work was done by a large group of dedicated individuals, not limited to: Scott Feldman, Jiri Pirko, Thomas Graf, John Fastabend, Jamal Hadi Salim, Andy Gospodarek, Florian Fainelli, Roopa Prabhu 2) Start making the networking operate on IOV iterators instead of modifying iov objects in-situ during transfers. Thanks to Al Viro and Herbert Xu. 3) A set of new netlink interfaces for the TIPC stack, from Richard Alpe. 4) Remove unnecessary looping during ipv6 routing lookups, from Martin KaFai Lau. 5) Add PAUSE frame generation support to gianfar driver, from Matei Pavaluca. 6) Allow for larger reordering levels in TCP, which are easily achievable in the real world right now, from Eric Dumazet. 7) Add a variable of napi_schedule that doesn't need to disable cpu interrupts, from Eric Dumazet. 8) Use a doubly linked list to optimize neigh_parms_release(), from Nicolas Dichtel. 9) Various enhancements to the kernel BPF verifier, and allow eBPF programs to actually be attached to sockets. From Alexei Starovoitov. 10) Support TSO/LSO in sunvnet driver, from David L Stevens. 11) Allow controlling ECN usage via routing metrics, from Florian Westphal. 12) Remote checksum offload, from Tom Herbert. 13) Add split-header receive, BQL, and xmit_more support to amd-xgbe driver, from Thomas Lendacky. 14) Add MPLS support to openvswitch, from Simon Horman. 15) Support wildcard tunnel endpoints in ipv6 tunnels, from Steffen Klassert. 16) Do gro flushes on a per-device basis using a timer, from Eric Dumazet. This tries to resolve the conflicting goals between the desired handling of bulk vs. RPC-like traffic. 17) Allow userspace to ask for the CPU upon what a packet was received/steered, via SO_INCOMING_CPU. From Eric Dumazet. 18) Limit GSO packets to half the current congestion window, from Eric Dumazet. 19) Add a generic helper so that all drivers set their RSS keys in a consistent way, from Eric Dumazet. 20) Add xmit_more support to enic driver, from Govindarajulu Varadarajan. 21) Add VLAN packet scheduler action, from Jiri Pirko. 22) Support configurable RSS hash functions via ethtool, from Eyal Perry. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1820 commits) Fix race condition between vxlan_sock_add and vxlan_sock_release net/macb: fix compilation warning for print_hex_dump() called with skb->mac_header net/mlx4: Add support for A0 steering net/mlx4: Refactor QUERY_PORT net/mlx4_core: Add explicit error message when rule doesn't meet configuration net/mlx4: Add A0 hybrid steering net/mlx4: Add mlx4_bitmap zone allocator net/mlx4: Add a check if there are too many reserved QPs net/mlx4: Change QP allocation scheme net/mlx4_core: Use tasklet for user-space CQ completion events net/mlx4_core: Mask out host side virtualization features for guests net/mlx4_en: Set csum level for encapsulated packets be2net: Export tunnel offloads only when a VxLAN tunnel is created gianfar: Fix dma check map error when DMA_API_DEBUG is enabled cxgb4/csiostor: Don't use MASTER_MUST for fw_hello call net: fec: only enable mdio interrupt before phy device link up net: fec: clear all interrupt events to support i.MX6SX net: fec: reset fep link status in suspend function net: sock: fix access via invalid file descriptor net: introduce helper macro for_each_cmsghdr ...
Diffstat (limited to 'net/packet')
-rw-r--r--net/packet/af_packet.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 586229a14ad3..e52a44785681 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1676,7 +1676,7 @@ retry:
1676 if (len < hhlen) 1676 if (len < hhlen)
1677 skb_reset_network_header(skb); 1677 skb_reset_network_header(skb);
1678 } 1678 }
1679 err = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len); 1679 err = memcpy_from_msg(skb_put(skb, len), msg, len);
1680 if (err) 1680 if (err)
1681 goto out_free; 1681 goto out_free;
1682 goto retry; 1682 goto retry;
@@ -2095,6 +2095,18 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
2095 sock_wfree(skb); 2095 sock_wfree(skb);
2096} 2096}
2097 2097
2098static bool ll_header_truncated(const struct net_device *dev, int len)
2099{
2100 /* net device doesn't like empty head */
2101 if (unlikely(len <= dev->hard_header_len)) {
2102 net_warn_ratelimited("%s: packet size is too short (%d < %d)\n",
2103 current->comm, len, dev->hard_header_len);
2104 return true;
2105 }
2106
2107 return false;
2108}
2109
2098static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, 2110static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
2099 void *frame, struct net_device *dev, int size_max, 2111 void *frame, struct net_device *dev, int size_max,
2100 __be16 proto, unsigned char *addr, int hlen) 2112 __be16 proto, unsigned char *addr, int hlen)
@@ -2170,12 +2182,8 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
2170 if (unlikely(err < 0)) 2182 if (unlikely(err < 0))
2171 return -EINVAL; 2183 return -EINVAL;
2172 } else if (dev->hard_header_len) { 2184 } else if (dev->hard_header_len) {
2173 /* net device doesn't like empty head */ 2185 if (ll_header_truncated(dev, tp_len))
2174 if (unlikely(tp_len <= dev->hard_header_len)) {
2175 pr_err("packet size is too short (%d < %d)\n",
2176 tp_len, dev->hard_header_len);
2177 return -EINVAL; 2186 return -EINVAL;
2178 }
2179 2187
2180 skb_push(skb, dev->hard_header_len); 2188 skb_push(skb, dev->hard_header_len);
2181 err = skb_store_bits(skb, 0, data, 2189 err = skb_store_bits(skb, 0, data,
@@ -2400,6 +2408,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2400 unsigned short gso_type = 0; 2408 unsigned short gso_type = 0;
2401 int hlen, tlen; 2409 int hlen, tlen;
2402 int extra_len = 0; 2410 int extra_len = 0;
2411 ssize_t n;
2403 2412
2404 /* 2413 /*
2405 * Get and verify the address. 2414 * Get and verify the address.
@@ -2438,9 +2447,9 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2438 2447
2439 len -= vnet_hdr_len; 2448 len -= vnet_hdr_len;
2440 2449
2441 err = memcpy_fromiovec((void *)&vnet_hdr, msg->msg_iov, 2450 err = -EFAULT;
2442 vnet_hdr_len); 2451 n = copy_from_iter(&vnet_hdr, vnet_hdr_len, &msg->msg_iter);
2443 if (err < 0) 2452 if (n != vnet_hdr_len)
2444 goto out_unlock; 2453 goto out_unlock;
2445 2454
2446 if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && 2455 if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
@@ -2503,12 +2512,17 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2503 skb_set_network_header(skb, reserve); 2512 skb_set_network_header(skb, reserve);
2504 2513
2505 err = -EINVAL; 2514 err = -EINVAL;
2506 if (sock->type == SOCK_DGRAM && 2515 if (sock->type == SOCK_DGRAM) {
2507 (offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len)) < 0) 2516 offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len);
2508 goto out_free; 2517 if (unlikely(offset) < 0)
2518 goto out_free;
2519 } else {
2520 if (ll_header_truncated(dev, len))
2521 goto out_free;
2522 }
2509 2523
2510 /* Returns -EFAULT on error */ 2524 /* Returns -EFAULT on error */
2511 err = skb_copy_datagram_from_iovec(skb, offset, msg->msg_iov, 0, len); 2525 err = skb_copy_datagram_from_iter(skb, offset, &msg->msg_iter, len);
2512 if (err) 2526 if (err)
2513 goto out_free; 2527 goto out_free;
2514 2528
@@ -2946,8 +2960,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
2946 vnet_hdr.flags = VIRTIO_NET_HDR_F_DATA_VALID; 2960 vnet_hdr.flags = VIRTIO_NET_HDR_F_DATA_VALID;
2947 } /* else everything is zero */ 2961 } /* else everything is zero */
2948 2962
2949 err = memcpy_toiovec(msg->msg_iov, (void *)&vnet_hdr, 2963 err = memcpy_to_msg(msg, (void *)&vnet_hdr, vnet_hdr_len);
2950 vnet_hdr_len);
2951 if (err < 0) 2964 if (err < 0)
2952 goto out_free; 2965 goto out_free;
2953 } 2966 }
@@ -2962,7 +2975,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
2962 msg->msg_flags |= MSG_TRUNC; 2975 msg->msg_flags |= MSG_TRUNC;
2963 } 2976 }
2964 2977
2965 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); 2978 err = skb_copy_datagram_msg(skb, 0, msg, copied);
2966 if (err) 2979 if (err)
2967 goto out_free; 2980 goto out_free;
2968 2981