refresh the packet socket patch for 2.6.29
[openwrt/svn-archive/archive.git] / target / linux / generic-2.6 / patches-2.6.29 / 240-packet_socket_type.patch
index 741966bc6cf9208725e427b4f3c73546efbcf261..e2840ea6b9f220236f8b6fff4c52d16cb2e72490 100644 (file)
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  /* 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 */
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
        unsigned int            tp_hdrlen;
        unsigned int            tp_reserve;
  #endif
-+      int                     pkt_type;
++      unsigned int            pkt_type;
  };
  
  struct packet_skb_cb {
@@ -91,21 +91,21 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
        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)))
@@ -116,13 +116,13 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  
  #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;