diff options
Diffstat (limited to 'src/vnet/ip/reass/ip4_full_reass.c')
-rw-r--r-- | src/vnet/ip/reass/ip4_full_reass.c | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/src/vnet/ip/reass/ip4_full_reass.c b/src/vnet/ip/reass/ip4_full_reass.c index 3183560cc86..5b69234e438 100644 --- a/src/vnet/ip/reass/ip4_full_reass.c +++ b/src/vnet/ip/reass/ip4_full_reass.c @@ -73,21 +73,19 @@ typedef enum typedef struct { - union + struct { - struct - { - u32 xx_id; - ip4_address_t src; - ip4_address_t dst; - u16 frag_id; - u8 proto; - u8 unused; - }; - u64 as_u64[2]; + u16 frag_id; + u8 proto; + u8 unused; + u32 fib_index; + ip4_address_t src; + ip4_address_t dst; }; } ip4_full_reass_key_t; +STATIC_ASSERT_SIZEOF (ip4_full_reass_key_t, 16); + typedef union { struct @@ -417,9 +415,8 @@ ip4_full_reass_free (ip4_full_reass_main_t * rm, ip4_full_reass_per_thread_t * rt, ip4_full_reass_t * reass) { - clib_bihash_kv_16_8_t kv; - kv.key[0] = reass->key.as_u64[0]; - kv.key[1] = reass->key.as_u64[1]; + clib_bihash_kv_16_8_t kv = {}; + clib_memcpy_fast (&kv, &reass->key, sizeof (kv.key)); clib_bihash_add_del_16_8 (&rm->hash, &kv, 0); return ip4_full_reass_free_ctx (rt, reass); } @@ -621,8 +618,7 @@ again: ++rt->reass_n; } - reass->key.as_u64[0] = kv->kv.key[0]; - reass->key.as_u64[1] = kv->kv.key[1]; + clib_memcpy_fast (&reass->key, &kv->kv.key, sizeof (reass->key)); kv->v.reass_index = (reass - rt->pool); kv->v.memory_owner_thread_index = vm->thread_index; reass->last_heard = now; @@ -1250,16 +1246,18 @@ ip4_full_reass_inline (vlib_main_t *vm, vlib_node_runtime_t *node, error0 = IP4_ERROR_REASS_MALFORMED_PACKET; goto packet_enqueue; } - ip4_full_reass_kv_t kv; - u8 do_handoff = 0; - kv.k.as_u64[0] = - (u64) vec_elt (ip4_main.fib_index_by_sw_if_index, - vnet_buffer (b0)->sw_if_index[VLIB_RX]) | - (u64) ip0->src_address.as_u32 << 32; - kv.k.as_u64[1] = - (u64) ip0->dst_address. - as_u32 | (u64) ip0->fragment_id << 32 | (u64) ip0->protocol << 48; + u32 fib_index = vec_elt (ip4_main.fib_index_by_sw_if_index, + vnet_buffer (b0)->sw_if_index[VLIB_RX]); + + ip4_full_reass_kv_t kv = { .k.fib_index = fib_index, + .k.src.as_u32 = ip0->src_address.as_u32, + .k.dst.as_u32 = ip0->dst_address.as_u32, + .k.frag_id = ip0->fragment_id, + .k.proto = ip0->protocol + + }; + u8 do_handoff = 0; ip4_full_reass_t *reass = ip4_full_reass_find_or_create ( vm, node, rm, rt, &kv, &do_handoff, &n_left_to_next, &to_next); @@ -1768,9 +1766,8 @@ format_ip4_full_reass_key (u8 * s, va_list * args) { ip4_full_reass_key_t *key = va_arg (*args, ip4_full_reass_key_t *); s = - format (s, - "xx_id: %u, src: %U, dst: %U, frag_id: %u, proto: %u", - key->xx_id, format_ip4_address, &key->src, format_ip4_address, + format (s, "fib_index: %u, src: %U, dst: %U, frag_id: %u, proto: %u", + key->fib_index, format_ip4_address, &key->src, format_ip4_address, &key->dst, clib_net_to_host_u16 (key->frag_id), key->proto); return s; } |