kernel: remove support for kernel 4.9
[openwrt/staging/mkresin.git] / target / linux / generic / pending-4.9 / 630-packet_socket_type.patch
diff --git a/target/linux/generic/pending-4.9/630-packet_socket_type.patch b/target/linux/generic/pending-4.9/630-packet_socket_type.patch
deleted file mode 100644 (file)
index e89bf0c..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: net: add an optimization for dealing with raw sockets
-
-lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/uapi/linux/if_packet.h |  3 +++
- net/packet/af_packet.c         | 34 +++++++++++++++++++++++++++-------
- net/packet/internal.h          |  1 +
- 3 files changed, 31 insertions(+), 7 deletions(-)
-
---- a/include/uapi/linux/if_packet.h
-+++ b/include/uapi/linux/if_packet.h
-@@ -31,6 +31,8 @@ struct sockaddr_ll {
- #define PACKET_KERNEL         7               /* To kernel space      */
- /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */
- #define PACKET_FASTROUTE      6               /* Fastrouted frame     */
-+#define PACKET_MASK_ANY               0xffffffff      /* mask for packet type bits */
-+
- /* Packet socket options */
-@@ -56,6 +58,7 @@ struct sockaddr_ll {
- #define PACKET_QDISC_BYPASS           20
- #define PACKET_ROLLOVER_STATS         21
- #define PACKET_FANOUT_DATA            22
-+#define PACKET_RECV_TYPE              23
- #define PACKET_FANOUT_HASH            0
- #define PACKET_FANOUT_LB              1
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -1781,6 +1781,7 @@ static int packet_rcv_spkt(struct sk_buf
- {
-       struct sock *sk;
-       struct sockaddr_pkt *spkt;
-+      struct packet_sock *po;
-       /*
-        *      When we registered the protocol we saved the socket in the data
-@@ -1788,6 +1789,7 @@ static int packet_rcv_spkt(struct sk_buf
-        */
-       sk = pt->af_packet_priv;
-+      po = pkt_sk(sk);
-       /*
-        *      Yank back the headers [hope the device set this
-@@ -1800,7 +1802,7 @@ static int packet_rcv_spkt(struct sk_buf
-        *      so that this procedure is noop.
-        */
--      if (skb->pkt_type == PACKET_LOOPBACK)
-+      if (!(po->pkt_type & (1 << skb->pkt_type)))
-               goto out;
-       if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -2038,12 +2040,12 @@ static int packet_rcv(struct sk_buff *sk
-       unsigned int snaplen, res;
-       bool is_drop_n_account = false;
--      if (skb->pkt_type == PACKET_LOOPBACK)
--              goto drop;
--
-       sk = pt->af_packet_priv;
-       po = pkt_sk(sk);
-+      if (!(po->pkt_type & (1 << skb->pkt_type)))
-+              goto drop;
-+
-       if (!net_eq(dev_net(dev), sock_net(sk)))
-               goto drop;
-@@ -2169,12 +2171,12 @@ static int tpacket_rcv(struct sk_buff *s
-       BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
-       BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
--      if (skb->pkt_type == PACKET_LOOPBACK)
--              goto drop;
--
-       sk = pt->af_packet_priv;
-       po = pkt_sk(sk);
-+      if (!(po->pkt_type & (1 << skb->pkt_type)))
-+              goto drop;
-+
-       if (!net_eq(dev_net(dev), sock_net(sk)))
-               goto drop;
-@@ -3292,6 +3294,7 @@ static int packet_create(struct net *net
-       mutex_init(&po->pg_vec_lock);
-       po->rollover = NULL;
-       po->prot_hook.func = packet_rcv;
-+      po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
-       if (sock->type == SOCK_PACKET)
-               po->prot_hook.func = packet_rcv_spkt;
-@@ -3905,6 +3908,16 @@ packet_setsockopt(struct socket *sock, i
-               po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
-               return 0;
-       }
-+        case PACKET_RECV_TYPE:
-+        {
-+                unsigned int val;
-+                if (optlen != sizeof(val))
-+                        return -EINVAL;
-+                if (copy_from_user(&val, optval, sizeof(val)))
-+                        return -EFAULT;
-+                po->pkt_type = val & ~BIT(PACKET_LOOPBACK);
-+                return 0;
-+        }
-       default:
-               return -ENOPROTOOPT;
-       }
-@@ -3957,6 +3970,13 @@ static int packet_getsockopt(struct sock
-       case PACKET_VNET_HDR:
-               val = po->has_vnet_hdr;
-               break;
-+      case PACKET_RECV_TYPE:
-+              if (len > sizeof(unsigned int))
-+                      len = sizeof(unsigned int);
-+              val = po->pkt_type;
-+
-+              data = &val;
-+              break;
-       case PACKET_VERSION:
-               val = po->tp_version;
-               break;
---- a/net/packet/internal.h
-+++ b/net/packet/internal.h
-@@ -129,6 +129,7 @@ struct packet_sock {
-       struct net_device __rcu *cached_dev;
-       int                     (*xmit)(struct sk_buff *skb);
-       struct packet_type      prot_hook ____cacheline_aligned_in_smp;
-+      unsigned int            pkt_type;
- };
- static struct packet_sock *pkt_sk(struct sock *sk)