}
}
+ if (extras[XEN_NETIF_EXTRA_TYPE_HASH - 1].type) {
+ struct xen_netif_extra_info *extra;
+ u32 hash = *(u32 *)extra->u.hash.value;
+
+ extra = &extras[XEN_NETIF_EXTRA_TYPE_HASH - 1];
+
+ switch (extra->u.hash.type) {
+ case XEN_NETIF_HASH_TYPE_TCPV4:
+ case XEN_NETIF_HASH_TYPE_TCPV6:
+ skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
+ break;
+
+ case XEN_NETIF_HASH_TYPE_IPV4:
+ case XEN_NETIF_HASH_TYPE_IPV6:
+ skb_set_hash(skb, hash, PKT_HASH_TYPE_L3);
+ break;
+
+ default:
+ break;
+ }
+ }
+
XENVIF_TX_CB(skb)->pending_idx = pending_idx;
__skb_put(skb, data_len);
goto abort_transaction;
}
+ /* We support hash values. */
+ err = xenbus_printf(xbt, dev->nodename,
+ "feature-hash", "%d", 1);
+ if (err) {
+ message = "writing feature-hash";
+ goto abort_transaction;
+ }
+
err = xenbus_transaction_end(xbt, 0);
} while (err == -EAGAIN);