Example #1
0
static u16 xenvif_select_queue(struct net_device *dev, struct sk_buff *skb,
                               void *accel_priv,
                               select_queue_fallback_t fallback)
{
    struct xenvif *vif = netdev_priv(dev);
    unsigned int size = vif->hash.size;

    if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE) {
        u16 index = fallback(dev, skb) % dev->real_num_tx_queues;

        /* Make sure there is no hash information in the socket
         * buffer otherwise it would be incorrectly forwarded
         * to the frontend.
         */
        skb_clear_hash(skb);

        return index;
    }

    xenvif_set_skb_hash(vif, skb);

    if (size == 0)
        return skb_get_hash_raw(skb) % dev->real_num_tx_queues;

    return vif->hash.mapping[skb_get_hash_raw(skb) % size];
}
Example #2
0
static u16 xenvif_select_queue(struct net_device *dev, struct sk_buff *skb,
                               void *accel_priv,
                               select_queue_fallback_t fallback)
{
    struct xenvif *vif = netdev_priv(dev);
    unsigned int size = vif->hash.size;

    if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE)
        return fallback(dev, skb) % dev->real_num_tx_queues;

    xenvif_set_skb_hash(vif, skb);

    if (size == 0)
        return skb_get_hash_raw(skb) % dev->real_num_tx_queues;

    return vif->hash.mapping[skb_get_hash_raw(skb) % size];
}