diff options
Diffstat (limited to 'src/plugins/map/map.h')
-rw-r--r-- | src/plugins/map/map.h | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/plugins/map/map.h b/src/plugins/map/map.h index 45959f0d0e1..6587a8a455b 100644 --- a/src/plugins/map/map.h +++ b/src/plugins/map/map.h @@ -532,19 +532,23 @@ int map_ip6_reass_conf_buffers(u32 buffers); static_always_inline void ip4_map_t_embedded_address (map_domain_t *d, - ip6_address_t *ip6, const ip4_address_t *ip4) + ip6_address_t *ip6, const ip4_address_t *ip4) { - ASSERT(d->ip6_src_len == 96); //No support for other lengths for now + ASSERT(d->ip6_src_len == 96 || d->ip6_src_len == 64); //No support for other lengths for now + u8 offset = d->ip6_src_len == 64 ? 9 : 12; ip6->as_u64[0] = d->ip6_src.as_u64[0]; - ip6->as_u32[2] = d->ip6_src.as_u32[2]; - ip6->as_u32[3] = ip4->as_u32; + ip6->as_u64[1] = d->ip6_src.as_u64[1]; + clib_memcpy(&ip6->as_u8[offset], ip4, 4); } static_always_inline u32 ip6_map_t_embedded_address (map_domain_t *d, ip6_address_t *addr) { - ASSERT(d->ip6_src_len == 96); //No support for other lengths for now - return addr->as_u32[3]; + ASSERT(d->ip6_src_len == 64 || d->ip6_src_len == 96); + u32 x; + u8 offset = d->ip6_src_len == 64 ? 9 : 12; + clib_memcpy(&x, &addr->as_u8[offset], 4); + return x; } static inline void |