summaryrefslogtreecommitdiffstats
path: root/target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-06-26 20:42:58 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-06-26 20:42:58 +0000
commitc5552ad03973839d83d32d7108f20c00f192633b (patch)
treede32e4def600e56134cd085a7447cb6620542078 /target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch
parent7ec88f88f4c65a22b3b7e32ef87cb42dcb32a6fb (diff)
rename target/linux/generic-2.6 to generic
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21952 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch')
-rw-r--r--target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch133
1 files changed, 0 insertions, 133 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch b/target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch
deleted file mode 100644
index 4d4c01155..000000000
--- a/target/linux/generic-2.6/patches-2.6.34/240-packet_socket_type.patch
+++ /dev/null
@@ -1,133 +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 */
-
-@@ -47,6 +49,8 @@ struct sockaddr_ll {
- #define PACKET_TX_RING 13
- #define PACKET_LOSS 14
- #define PACKET_VNET_HDR 15
-+#define PACKET_RECV_TYPE 16
-+
-
- struct tpacket_stats {
- unsigned int tp_packets;
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -202,6 +202,7 @@ struct packet_sock {
- unsigned int tp_reserve;
- unsigned int tp_loss:1;
- struct packet_type prot_hook ____cacheline_aligned_in_smp;
-+ __u8 pkt_type:3;
- };
-
- struct packet_skb_cb {
-@@ -336,6 +337,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
-@@ -343,6 +345,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
-@@ -355,7 +358,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)))
-@@ -531,12 +534,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;
-
-@@ -651,12 +654,12 @@ static int tpacket_rcv(struct sk_buff *s
- struct timeval tv;
- struct timespec ts;
-
-- 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;
-
-@@ -1464,6 +1467,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;
-@@ -1968,6 +1972,16 @@ packet_setsockopt(struct socket *sock, i
- po->has_vnet_hdr = !!val;
- 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 & ~PACKET_LOOPBACK;
-+ return 0;
-+ }
- default:
- return -ENOPROTOOPT;
- }
-@@ -2025,6 +2039,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);