af_packet: Add Queue mapping mode to af_packet fanout operation
This patch adds a queue mapping mode to the fanout operation of af_packet sockets. This allows user space af_packet users to better filter on flows ingressing and egressing via a specific hardware queue, and avoids the potential packet reordering that can occur when FANOUT_CPU is being used and irq affinity varies. Tested successfully by myself. applies to net-next Signed-off-by: Neil Horman <nhorman@tuxdriver.com> CC: "David S. Miller" <davem@davemloft.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b414ac9a3e
commit
2d36097d26
2 changed files with 12 additions and 0 deletions
|
@ -60,6 +60,7 @@ struct sockaddr_ll {
|
|||
#define PACKET_FANOUT_CPU 2
|
||||
#define PACKET_FANOUT_ROLLOVER 3
|
||||
#define PACKET_FANOUT_RND 4
|
||||
#define PACKET_FANOUT_QM 5
|
||||
#define PACKET_FANOUT_FLAG_ROLLOVER 0x1000
|
||||
#define PACKET_FANOUT_FLAG_DEFRAG 0x8000
|
||||
|
||||
|
|
|
@ -1312,6 +1312,13 @@ static unsigned int fanout_demux_rollover(struct packet_fanout *f,
|
|||
return idx;
|
||||
}
|
||||
|
||||
static unsigned int fanout_demux_qm(struct packet_fanout *f,
|
||||
struct sk_buff *skb,
|
||||
unsigned int num)
|
||||
{
|
||||
return skb_get_queue_mapping(skb) % num;
|
||||
}
|
||||
|
||||
static bool fanout_has_flag(struct packet_fanout *f, u16 flag)
|
||||
{
|
||||
return f->flags & (flag >> 8);
|
||||
|
@ -1351,6 +1358,9 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct net_device *dev,
|
|||
case PACKET_FANOUT_RND:
|
||||
idx = fanout_demux_rnd(f, skb, num);
|
||||
break;
|
||||
case PACKET_FANOUT_QM:
|
||||
idx = fanout_demux_qm(f, skb, num);
|
||||
break;
|
||||
case PACKET_FANOUT_ROLLOVER:
|
||||
idx = fanout_demux_rollover(f, skb, 0, (unsigned int) -1, num);
|
||||
break;
|
||||
|
@ -1421,6 +1431,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
|
|||
case PACKET_FANOUT_LB:
|
||||
case PACKET_FANOUT_CPU:
|
||||
case PACKET_FANOUT_RND:
|
||||
case PACKET_FANOUT_QM:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in a new issue