Lines Matching +full:data +full:- +full:mapping
46 memcpy(new->tag, tag, len); in xenvif_add_hash()
47 new->len = len; in xenvif_add_hash()
48 new->val = val; in xenvif_add_hash()
50 spin_lock_irqsave(&vif->hash.cache.lock, flags); in xenvif_add_hash()
54 list_for_each_entry_rcu(entry, &vif->hash.cache.list, link, in xenvif_add_hash()
55 lockdep_is_held(&vif->hash.cache.lock)) { in xenvif_add_hash()
57 if (entry->len == len && in xenvif_add_hash()
58 memcmp(entry->tag, tag, len) == 0) in xenvif_add_hash()
60 if (!oldest || entry->seq < oldest->seq) in xenvif_add_hash()
65 new->seq = atomic_inc_return(&vif->hash.cache.seq); in xenvif_add_hash()
66 list_add_rcu(&new->link, &vif->hash.cache.list); in xenvif_add_hash()
68 if (++vif->hash.cache.count > xenvif_hash_cache_size) { in xenvif_add_hash()
69 list_del_rcu(&oldest->link); in xenvif_add_hash()
70 vif->hash.cache.count--; in xenvif_add_hash()
75 spin_unlock_irqrestore(&vif->hash.cache.lock, flags); in xenvif_add_hash()
81 static u32 xenvif_new_hash(struct xenvif *vif, const u8 *data, in xenvif_new_hash() argument
86 val = xen_netif_toeplitz_hash(vif->hash.key, in xenvif_new_hash()
87 sizeof(vif->hash.key), in xenvif_new_hash()
88 data, len); in xenvif_new_hash()
91 xenvif_add_hash(vif, data, len, val); in xenvif_new_hash()
104 spin_lock_irqsave(&vif->hash.cache.lock, flags); in xenvif_flush_hash()
106 list_for_each_entry_rcu(entry, &vif->hash.cache.list, link, in xenvif_flush_hash()
107 lockdep_is_held(&vif->hash.cache.lock)) { in xenvif_flush_hash()
108 list_del_rcu(&entry->link); in xenvif_flush_hash()
109 vif->hash.cache.count--; in xenvif_flush_hash()
113 spin_unlock_irqrestore(&vif->hash.cache.lock, flags); in xenvif_flush_hash()
116 static u32 xenvif_find_hash(struct xenvif *vif, const u8 *data, in xenvif_find_hash() argument
127 return xenvif_new_hash(vif, data, len); in xenvif_find_hash()
133 list_for_each_entry_rcu(entry, &vif->hash.cache.list, link) { in xenvif_find_hash()
134 if (entry->len == len && in xenvif_find_hash()
135 memcmp(entry->tag, data, len) == 0) { in xenvif_find_hash()
136 val = entry->val; in xenvif_find_hash()
137 entry->seq = atomic_inc_return(&vif->hash.cache.seq); in xenvif_find_hash()
146 val = xenvif_new_hash(vif, data, len); in xenvif_find_hash()
156 u32 flags = vif->hash.flags; in xenvif_set_skb_hash()
163 switch (skb->protocol) { in xenvif_set_skb_hash()
189 switch (skb->protocol) { in xenvif_set_skb_hash()
193 u8 data[12]; in xenvif_set_skb_hash() local
195 memcpy(&data[0], &flow.addrs.v4addrs.src, 4); in xenvif_set_skb_hash()
196 memcpy(&data[4], &flow.addrs.v4addrs.dst, 4); in xenvif_set_skb_hash()
197 memcpy(&data[8], &flow.ports.src, 2); in xenvif_set_skb_hash()
198 memcpy(&data[10], &flow.ports.dst, 2); in xenvif_set_skb_hash()
200 hash = xenvif_find_hash(vif, data, sizeof(data)); in xenvif_set_skb_hash()
203 u8 data[8]; in xenvif_set_skb_hash() local
205 memcpy(&data[0], &flow.addrs.v4addrs.src, 4); in xenvif_set_skb_hash()
206 memcpy(&data[4], &flow.addrs.v4addrs.dst, 4); in xenvif_set_skb_hash()
208 hash = xenvif_find_hash(vif, data, sizeof(data)); in xenvif_set_skb_hash()
217 u8 data[36]; in xenvif_set_skb_hash() local
219 memcpy(&data[0], &flow.addrs.v6addrs.src, 16); in xenvif_set_skb_hash()
220 memcpy(&data[16], &flow.addrs.v6addrs.dst, 16); in xenvif_set_skb_hash()
221 memcpy(&data[32], &flow.ports.src, 2); in xenvif_set_skb_hash()
222 memcpy(&data[34], &flow.ports.dst, 2); in xenvif_set_skb_hash()
224 hash = xenvif_find_hash(vif, data, sizeof(data)); in xenvif_set_skb_hash()
227 u8 data[32]; in xenvif_set_skb_hash() local
229 memcpy(&data[0], &flow.addrs.v6addrs.src, 16); in xenvif_set_skb_hash()
230 memcpy(&data[16], &flow.addrs.v6addrs.dst, 16); in xenvif_set_skb_hash()
232 hash = xenvif_find_hash(vif, data, sizeof(data)); in xenvif_set_skb_hash()
257 vif->hash.alg = alg; in xenvif_set_hash_alg()
264 if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE) in xenvif_get_hash_flags()
283 if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE) in xenvif_set_hash_flags()
286 vif->hash.flags = flags; in xenvif_set_hash_flags()
293 u8 *key = vif->hash.key; in xenvif_set_hash_key()
296 .source.domid = vif->domid, in xenvif_set_hash_key()
316 memset(key + len, 0, XEN_NETBK_MAX_HASH_KEY_SIZE - len); in xenvif_set_hash_key()
328 vif->hash.size = size; in xenvif_set_hash_mapping_size()
329 memset(vif->hash.mapping[vif->hash.mapping_sel], 0, in xenvif_set_hash_mapping_size()
338 u32 *mapping = vif->hash.mapping[!vif->hash.mapping_sel]; in xenvif_set_hash_mapping() local
342 .source.domid = vif->domid, in xenvif_set_hash_mapping()
344 .len = len * sizeof(*mapping), in xenvif_set_hash_mapping()
348 if ((off + len < off) || (off + len > vif->hash.size) || in xenvif_set_hash_mapping()
349 len > XEN_PAGE_SIZE / sizeof(*mapping)) in xenvif_set_hash_mapping()
352 copy_op[0].dest.u.gmfn = virt_to_gfn(mapping + off); in xenvif_set_hash_mapping()
353 copy_op[0].dest.offset = xen_offset_in_page(mapping + off); in xenvif_set_hash_mapping()
356 copy_op[1].source.offset = XEN_PAGE_SIZE - copy_op[0].dest.offset; in xenvif_set_hash_mapping()
357 copy_op[1].dest.u.gmfn = virt_to_gfn(mapping + off + len); in xenvif_set_hash_mapping()
359 copy_op[1].len = copy_op[0].len - copy_op[1].source.offset; in xenvif_set_hash_mapping()
364 memcpy(mapping, vif->hash.mapping[vif->hash.mapping_sel], in xenvif_set_hash_mapping()
365 vif->hash.size * sizeof(*mapping)); in xenvif_set_hash_mapping()
371 copy_op[nr - 1].status != GNTST_okay) in xenvif_set_hash_mapping()
375 while (len-- != 0) in xenvif_set_hash_mapping()
376 if (mapping[off++] >= vif->num_queues) in xenvif_set_hash_mapping()
379 vif->hash.mapping_sel = !vif->hash.mapping_sel; in xenvif_set_hash_mapping()
389 switch (vif->hash.alg) { in xenvif_dump_hash_info()
401 if (vif->hash.flags) { in xenvif_dump_hash_info()
404 if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV4) in xenvif_dump_hash_info()
405 seq_puts(m, "- IPv4\n"); in xenvif_dump_hash_info()
406 if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP) in xenvif_dump_hash_info()
407 seq_puts(m, "- IPv4 + TCP\n"); in xenvif_dump_hash_info()
408 if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV6) in xenvif_dump_hash_info()
409 seq_puts(m, "- IPv6\n"); in xenvif_dump_hash_info()
410 if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP) in xenvif_dump_hash_info()
411 seq_puts(m, "- IPv6 + TCP\n"); in xenvif_dump_hash_info()
421 n = XEN_NETBK_MAX_HASH_KEY_SIZE - i; in xenvif_dump_hash_info()
423 seq_printf(m, "[%2u - %2u]: ", i, i + n - 1); in xenvif_dump_hash_info()
426 seq_printf(m, "%02x ", vif->hash.key[i]); in xenvif_dump_hash_info()
431 if (vif->hash.size != 0) { in xenvif_dump_hash_info()
432 const u32 *mapping = vif->hash.mapping[vif->hash.mapping_sel]; in xenvif_dump_hash_info() local
434 seq_puts(m, "\nHash Mapping:\n"); in xenvif_dump_hash_info()
436 for (i = 0; i < vif->hash.size; ) { in xenvif_dump_hash_info()
440 if (i + n >= vif->hash.size) in xenvif_dump_hash_info()
441 n = vif->hash.size - i; in xenvif_dump_hash_info()
443 seq_printf(m, "[%4u - %4u]: ", i, i + n - 1); in xenvif_dump_hash_info()
446 seq_printf(m, "%4u ", mapping[i]); in xenvif_dump_hash_info()
459 BUG_ON(vif->hash.cache.count); in xenvif_init_hash()
461 spin_lock_init(&vif->hash.cache.lock); in xenvif_init_hash()
462 INIT_LIST_HEAD(&vif->hash.cache.list); in xenvif_init_hash()