summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.1/630-packet_socket_type.patch
diff options
context:
space:
mode:
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-05-27 15:01:09 +0000
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-05-27 15:01:09 +0000
commite3e4a95d9b972c8688fa8dd01a07645761fced03 (patch)
tree67ea5cdd7c54260a66c617e12e458ae08576ff0f /target/linux/generic/patches-3.1/630-packet_socket_type.patch
parente17d6b07094e4c7d1ebbd92ee4e32deac4c9dc29 (diff)
linux/3.1: R.I.P.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31891 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/patches-3.1/630-packet_socket_type.patch')
-rw-r--r--target/linux/generic/patches-3.1/630-packet_socket_type.patch132
1 files changed, 0 insertions, 132 deletions
diff --git a/target/linux/generic/patches-3.1/630-packet_socket_type.patch b/target/linux/generic/patches-3.1/630-packet_socket_type.patch
deleted file mode 100644
index e295ce1d1..000000000
--- a/target/linux/generic/patches-3.1/630-packet_socket_type.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-This patch allows the user to specify desired packet types (outgoing,
-broadcast, unicast, etc.) on packet sockets via setsockopt.
-This can reduce the load in situations where only a limited number
-of packet types are necessary
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-
---- a/include/linux/if_packet.h
-+++ b/include/linux/if_packet.h
-@@ -29,6 +29,8 @@ struct sockaddr_ll {
- /* These ones are invisible by user level */
- #define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
- #define PACKET_FASTROUTE 6 /* Fastrouted frame */
-+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */
-+
-
- /* Packet socket options */
-
-@@ -50,6 +52,7 @@ struct sockaddr_ll {
- #define PACKET_TX_TIMESTAMP 16
- #define PACKET_TIMESTAMP 17
- #define PACKET_FANOUT 18
-+#define PACKET_RECV_TYPE 19
-
- #define PACKET_FANOUT_HASH 0
- #define PACKET_FANOUT_LB 1
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -212,6 +212,7 @@ struct packet_sock {
- unsigned int tp_loss:1;
- unsigned int tp_tstamp;
- struct packet_type prot_hook ____cacheline_aligned_in_smp;
-+ unsigned int pkt_type;
- };
-
- #define PACKET_FANOUT_MAX 256
-@@ -661,6 +662,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
-@@ -668,6 +670,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
-@@ -680,7 +683,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)))
-@@ -873,12 +876,12 @@ static int packet_rcv(struct sk_buff *sk
- int skb_len = skb->len;
- unsigned int snaplen, res;
-
-- 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;
-
-@@ -997,12 +1000,12 @@ static int tpacket_rcv(struct sk_buff *s
- struct timespec ts;
- struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
-
-- 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;
-
-@@ -1829,6 +1832,7 @@ static int packet_create(struct net *net
- spin_lock_init(&po->bind_lock);
- mutex_init(&po->pg_vec_lock);
- 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;
-@@ -2413,6 +2417,16 @@ packet_setsockopt(struct socket *sock, i
-
- return fanout_add(sk, val & 0xffff, val >> 16);
- }
-+ 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 & ~PACKET_LOOPBACK;
-+ return 0;
-+ }
- default:
- return -ENOPROTOOPT;
- }
-@@ -2470,6 +2484,13 @@ static int packet_getsockopt(struct sock
-
- data = &val;
- break;
-+ case PACKET_RECV_TYPE:
-+ if (len > sizeof(unsigned int))
-+ len = sizeof(unsigned int);
-+ val = po->pkt_type;
-+
-+ data = &val;
-+ break;
- case PACKET_VERSION:
- if (len > sizeof(int))
- len = sizeof(int);