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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neil Horman
				Neil Horman