Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d36097d authored by Neil Horman's avatar Neil Horman Committed by David S. Miller
Browse files

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: default avatarNeil Horman <nhorman@tuxdriver.com>
CC: "David S. Miller" <davem@davemloft.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b414ac9a
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -60,6 +60,7 @@ struct sockaddr_ll {
#define PACKET_FANOUT_CPU		2
#define PACKET_FANOUT_CPU		2
#define PACKET_FANOUT_ROLLOVER		3
#define PACKET_FANOUT_ROLLOVER		3
#define PACKET_FANOUT_RND		4
#define PACKET_FANOUT_RND		4
#define PACKET_FANOUT_QM		5
#define PACKET_FANOUT_FLAG_ROLLOVER	0x1000
#define PACKET_FANOUT_FLAG_ROLLOVER	0x1000
#define PACKET_FANOUT_FLAG_DEFRAG	0x8000
#define PACKET_FANOUT_FLAG_DEFRAG	0x8000


+11 −0
Original line number Original line Diff line number Diff line
@@ -1312,6 +1312,13 @@ static unsigned int fanout_demux_rollover(struct packet_fanout *f,
	return idx;
	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)
static bool fanout_has_flag(struct packet_fanout *f, u16 flag)
{
{
	return f->flags & (flag >> 8);
	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:
	case PACKET_FANOUT_RND:
		idx = fanout_demux_rnd(f, skb, num);
		idx = fanout_demux_rnd(f, skb, num);
		break;
		break;
	case PACKET_FANOUT_QM:
		idx = fanout_demux_qm(f, skb, num);
		break;
	case PACKET_FANOUT_ROLLOVER:
	case PACKET_FANOUT_ROLLOVER:
		idx = fanout_demux_rollover(f, skb, 0, (unsigned int) -1, num);
		idx = fanout_demux_rollover(f, skb, 0, (unsigned int) -1, num);
		break;
		break;
@@ -1421,6 +1431,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
	case PACKET_FANOUT_LB:
	case PACKET_FANOUT_LB:
	case PACKET_FANOUT_CPU:
	case PACKET_FANOUT_CPU:
	case PACKET_FANOUT_RND:
	case PACKET_FANOUT_RND:
	case PACKET_FANOUT_QM:
		break;
		break;
	default:
	default:
		return -EINVAL;
		return -EINVAL;