Skip to content

Commit

Permalink
[AF_PACKET]: Add option to return orig_dev to userspace.
Browse files Browse the repository at this point in the history
Add a packet socket option to allow the orig_dev index to be returned
to userspace when passing traffic through a decapsulated device, such
as the bonding driver.

This is very useful for layer 2 traffic being able to report which
physical device actually received the traffic, instead of having the
encapsulating device hide that information.

The new option is called PACKET_ORIGDEV.

Signed-off-by: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
ppwaskie authored and David S. Miller committed Apr 26, 2007
1 parent 1370b5a commit 80feaac
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/linux/if_packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ struct sockaddr_ll
#define PACKET_STATISTICS 6
#define PACKET_COPY_THRESH 7
#define PACKET_AUXDATA 8
#define PACKET_ORIGDEV 9

struct tpacket_stats
{
Expand Down
32 changes: 29 additions & 3 deletions net/packet/af_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,8 @@ struct packet_sock {
struct packet_type prot_hook;
spinlock_t bind_lock;
unsigned int running:1, /* prot_hook is attached*/
auxdata:1;
auxdata:1,
origdev:1;
int ifindex; /* bound device */
__be16 num;
#ifdef CONFIG_PACKET_MULTICAST
Expand Down Expand Up @@ -528,7 +529,10 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet
sll->sll_hatype = dev->type;
sll->sll_protocol = skb->protocol;
sll->sll_pkttype = skb->pkt_type;
sll->sll_ifindex = dev->ifindex;
if (unlikely(po->origdev) && skb->pkt_type == PACKET_HOST)
sll->sll_ifindex = orig_dev->ifindex;
else
sll->sll_ifindex = dev->ifindex;
sll->sll_halen = 0;

if (dev->hard_header_parse)
Expand Down Expand Up @@ -673,7 +677,10 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
sll->sll_hatype = dev->type;
sll->sll_protocol = skb->protocol;
sll->sll_pkttype = skb->pkt_type;
sll->sll_ifindex = dev->ifindex;
if (unlikely(po->origdev) && skb->pkt_type == PACKET_HOST)
sll->sll_ifindex = orig_dev->ifindex;
else
sll->sll_ifindex = dev->ifindex;

h->tp_status = status;
smp_mb();
Expand Down Expand Up @@ -1413,6 +1420,18 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
po->auxdata = !!val;
return 0;
}
case PACKET_ORIGDEV:
{
int val;

if (optlen < sizeof(val))
return -EINVAL;
if (copy_from_user(&val, optval, sizeof(val)))
return -EFAULT;

po->origdev = !!val;
return 0;
}
default:
return -ENOPROTOOPT;
}
Expand Down Expand Up @@ -1454,6 +1473,13 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
len = sizeof(int);
val = po->auxdata;

data = &val;
break;
case PACKET_ORIGDEV:
if (len > sizeof(int))
len = sizeof(int);
val = po->origdev;

data = &val;
break;
default:
Expand Down

0 comments on commit 80feaac

Please sign in to comment.