/* These ones are invisible by user level */
#define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
#define PACKET_FASTROUTE 6 /* Fastrouted frame */
-+#define PACKET_ANY 0xffffffff
++#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */
+
/* Packet socket options */
unsigned int tp_hdrlen;
unsigned int tp_reserve;
#endif
-+ int pkt_type;
++ unsigned int pkt_type;
};
struct packet_skb_cb {
if (dev_net(dev) != sock_net(sk))
goto drop;
-@@ -1072,6 +1075,7 @@ static int packet_create(struct net *net
+@@ -1073,6 +1076,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_ANY & ~PACKET_LOOPBACK;
++ po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
if (sock->type == SOCK_PACKET)
po->prot_hook.func = packet_rcv_spkt;
-@@ -1411,6 +1415,16 @@ packet_setsockopt(struct socket *sock, i
+@@ -1413,6 +1417,16 @@ packet_setsockopt(struct socket *sock, i
ret = packet_mc_drop(sk, &mreq);
return ret;
}
+ case PACKET_RECV_TYPE:
+ {
-+ int val;
++ unsigned int val;
+ if (optlen != sizeof(val))
+ return -EINVAL;
+ if (copy_from_user(&val, optval, sizeof(val)))
#ifdef CONFIG_PACKET_MMAP
case PACKET_RX_RING:
-@@ -1542,6 +1556,13 @@ static int packet_getsockopt(struct sock
+@@ -1544,6 +1558,13 @@ static int packet_getsockopt(struct sock
data = &val;
break;
+ case PACKET_RECV_TYPE:
-+ if (len > sizeof(int))
-+ len = sizeof(int);
++ if (len > sizeof(unsigned int))
++ len = sizeof(unsigned int);
+ val = po->pkt_type;
+
+ data = &val;