]> Pileus Git - ~andy/linux/blobdiff - net/packet/af_packet.c
af_packet: Add Queue mapping mode to af_packet fanout operation
[~andy/linux] / net / packet / af_packet.c
index 97346162803d87f7a4c5355b0ae54dca17296f53..6a2bb37506c567c1f03de74bf51eb8aa357e318e 100644 (file)
@@ -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;