return format (s, "ip4");
case NSH_VXLAN_GPE_INPUT_NEXT_IP6_INPUT:
return format (s, "ip6");
+ case NSH_VXLAN_GPE_INPUT_NEXT_ETHERNET_INPUT:
+ return format (s, "ethernet");
case NSH_VXLAN_GPE_INPUT_NEXT_NSH_VXLAN_GPE_ENCAP:
return format (s, "nsh-vxlan-gpe");
default:
t->decap_fib_index);
s = format (s, " decap next %U\n", format_decap_next, t->decap_next_index);
s = format (s, " vxlan VNI %d ", t->vni);
- s = format (s, "nsh ver %d ", (t->ver_o_c>>6));
- if (t->ver_o_c & NSH_GRE_O_BIT)
+ s = format (s, "nsh ver %d ", (t->nsh_hdr.ver_o_c>>6));
+ if (t->nsh_hdr.ver_o_c & NSH_O_BIT)
s = format (s, "O-set ");
- if (t->ver_o_c & NSH_GRE_C_BIT)
+ if (t->nsh_hdr.ver_o_c & NSH_C_BIT)
s = format (s, "C-set ");
s = format (s, "len %d (%d bytes) md_type %d next_protocol %d\n",
- t->length, t->length * 4, t->md_type, t->next_protocol);
+ t->nsh_hdr.length, t->nsh_hdr.length * 4, t->nsh_hdr.md_type, t->nsh_hdr.next_protocol);
s = format (s, " service path %d service index %d\n",
- (t->spi_si>>NSH_GRE_SPI_SHIFT) & NSH_GRE_SPI_MASK,
- t->spi_si & NSH_GRE_SINDEX_MASK);
+ (t->nsh_hdr.spi_si>>NSH_SPI_SHIFT) & NSH_SPI_MASK,
+ t->nsh_hdr.spi_si & NSH_SINDEX_MASK);
s = format (s, " c1 %d c2 %d c3 %d c4 %d\n",
- t->c1, t->c2, t->c3, t->c4);
+ t->nsh_hdr.c1, t->nsh_hdr.c2, t->nsh_hdr.c3, t->nsh_hdr.c4);
return s;
}
_(vni) \
_(encap_fib_index) \
_(decap_fib_index) \
-_(decap_next_index) \
-_(ver_o_c) \
-_(length) \
-_(md_type) \
-_(next_protocol) \
-_(spi_si) \
-_(c1) \
-_(c2) \
-_(c3) \
-_(c4) \
+_(decap_next_index)
+
+
+#define foreach_copy_nshhdr_field \
+_(ver_o_c) \
+_(length) \
+_(md_type) \
+_(next_protocol) \
+_(spi_si) \
+_(c1) \
+_(c2) \
+_(c3) \
+_(c4) \
_(tlvs)
-#define foreach_32bit_field \
+#define foreach_32bit_field \
_(spi_si) \
_(c1) \
_(c2) \
ip4_vxlan_gpe_and_nsh_header_t * h0;
int len;
- len = sizeof (*h0) + vec_len(t->tlvs)*4;
+ len = sizeof (*h0) + vec_len(t->nsh_hdr.tlvs)*4;
vec_validate_aligned (rw, len-1, CLIB_CACHE_LINE_BYTES);
/* NSH header */
nsh0 = &h0->nsh;
- nsh0->ver_o_c = t->ver_o_c;
- nsh0->md_type = t->md_type;
- nsh0->next_protocol = t->next_protocol;
- nsh0->spi_si = t->spi_si;
- nsh0->c1 = t->c1;
- nsh0->c2 = t->c2;
- nsh0->c3 = t->c3;
- nsh0->c4 = t->c4;
+ nsh0->ver_o_c = t->nsh_hdr.ver_o_c;
+ nsh0->md_type = t->nsh_hdr.md_type;
+ nsh0->next_protocol = t->nsh_hdr.next_protocol;
+ nsh0->spi_si = t->nsh_hdr.spi_si;
+ nsh0->c1 = t->nsh_hdr.c1;
+ nsh0->c2 = t->nsh_hdr.c2;
+ nsh0->c3 = t->nsh_hdr.c3;
+ nsh0->c4 = t->nsh_hdr.c4;
/* Endian swap 32-bit fields */
#define _(x) nsh0->x = clib_host_to_net_u32(nsh0->x);
#undef _
/* fix nsh header length */
- t->length = 6 + vec_len(t->tlvs);
- nsh0->length = t->length;
+ t->nsh_hdr.length = 6 + vec_len(t->nsh_hdr.tlvs);
+ nsh0->length = t->nsh_hdr.length;
/* Copy any TLVs */
- if (vec_len(t->tlvs))
- memcpy (nsh0->tlvs, t->tlvs, 4*vec_len(t->tlvs));
+ if (vec_len(t->nsh_hdr.tlvs))
+ clib_memcpy (nsh0->tlvs, t->nsh_hdr.tlvs, 4*vec_len(t->nsh_hdr.tlvs));
t->rewrite = rw;
return (0);
nsh_vxlan_gpe_tunnel_key_t key, *key_copy;
hash_pair_t *hp;
- key.src = a->src.as_u32;
+ key.src = a->dst.as_u32; /* decap src in key is encap dst in config */
key.vni = clib_host_to_net_u32 (a->vni << 8);
- key.spi_si = clib_host_to_net_u32(a->spi_si);
+ key.spi_si = clib_host_to_net_u32(a->nsh_hdr.spi_si);
+ key.pad = 0;
p = hash_get_mem (ngm->nsh_vxlan_gpe_tunnel_by_key, &key);
#define _(x) t->x = a->x;
foreach_copy_field;
#undef _
+
+ /* copy from arg structure */
+#define _(x) t->nsh_hdr.x = a->nsh_hdr.x;
+ foreach_copy_nshhdr_field;
+#undef _
rv = nsh_vxlan_gpe_rewrite (t);
}
key_copy = clib_mem_alloc (sizeof (*key_copy));
- memcpy (key_copy, &key, sizeof (*key_copy));
+ clib_memcpy (key_copy, &key, sizeof (*key_copy));
hash_set_mem (ngm->nsh_vxlan_gpe_tunnel_by_key, key_copy,
t - ngm->tunnels);
else if (unformat (input, "ip6"))
*result = NSH_VXLAN_GPE_INPUT_NEXT_IP6_INPUT;
else if (unformat (input, "ethernet"))
- *result = NSH_VXLAN_GPE_INPUT_NEXT_IP6_INPUT;
+ *result = NSH_VXLAN_GPE_INPUT_NEXT_ETHERNET_INPUT;
else if (unformat (input, "nsh-vxlan-gpe"))
*result = NSH_VXLAN_GPE_INPUT_NEXT_NSH_VXLAN_GPE_ENCAP;
else if (unformat (input, "%d", &tmp))
#define _(x) a->x = x;
foreach_copy_field;
#undef _
+
+#define _(x) a->nsh_hdr.x = x;
+ foreach_copy_nshhdr_field;
+#undef _
rv = vnet_nsh_vxlan_gpe_add_del_tunnel (a, 0 /* hw_if_indexp */);
.short_help =
"nsh vxlan tunnel src <ip4-addr> dst <ip4-addr>"
" c1 <nn> c2 <nn> c3 <nn> c4 <nn> spi <nn> si <nn> vni <nn>\n"
- " [encap-fib-id <nn>] [decap-fib-id <nn>] [o-bit <1|0>] [c-bit <1|0>]\n"
+ " [encap-vrf-id <nn>] [decap-vrf-id <nn>] [o-bit <1|0>] [c-bit <1|0>]\n"
" [md-type <nn>][next-ip4][next-ip6][next-ethernet][next-nsh]\n"
- " [tlv <xx>][decap-next [ip4|ip6|ethernet|nsh-encap]][del]\n",
+ " [tlv <xx>][decap-next [ip4|ip6|ethernet|nsh-vxlan-gpe]][del]\n",
.function = nsh_vxlan_gpe_add_del_tunnel_command_fn,
};