X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Fmpls_label_dpo.c;h=9d147f98f138253efdd802cf3849fab02284ea1e;hb=53f06a0148cd7ece2d48a3396e3e63f248d066e9;hp=ebbbbec9b64aebbd46f260fc93eeda0cf3e7fb6c;hpb=19bd1902cb8cc074470f1e178d1df0601f75f58b;p=vpp.git diff --git a/src/vnet/dpo/mpls_label_dpo.c b/src/vnet/dpo/mpls_label_dpo.c index ebbbbec9b64..9d147f98f13 100644 --- a/src/vnet/dpo/mpls_label_dpo.c +++ b/src/vnet/dpo/mpls_label_dpo.c @@ -18,6 +18,7 @@ #include #include +#ifndef CLIB_MARCH_VARIANT /* * pool of all MPLS Label DPOs */ @@ -40,7 +41,7 @@ mpls_label_dpo_alloc (void) mpls_label_dpo_t *mld; pool_get_aligned(mpls_label_dpo_pool, mld, CLIB_CACHE_LINE_BYTES); - memset(mld, 0, sizeof(*mld)); + clib_memset(mld, 0, sizeof(*mld)); dpo_reset(&mld->mld_dpo); @@ -205,7 +206,7 @@ format_mpls_label_dpo (u8 *s, va_list *args) } mld = mpls_label_dpo_get(index); - s = format(s, "mpls-label[%U%d]:", + s = format(s, "mpls-label[%U@%d]:", format_mpls_label_dpo_flags, (int) mld->mld_flags, index); @@ -247,6 +248,7 @@ mpls_label_dpo_unlock (dpo_id_t *dpo) pool_put(mpls_label_dpo_pool, mld); } } +#endif /* CLIB_MARCH_VARIANT */ /** * @brief A struct to hold tracing information for the MPLS label imposition @@ -287,7 +289,7 @@ mpls_label_paint (vlib_buffer_t * b0, } else { - clib_memcpy(hdr0, mld0->mld_hdr, mld0->mld_n_hdr_bytes); + clib_memcpy_fast(hdr0, mld0->mld_hdr, mld0->mld_n_hdr_bytes); hdr0 = hdr0 + (mld0->mld_n_labels - 1); } @@ -482,6 +484,12 @@ mpls_label_imposition_inline (vlib_main_t * vm, exp2 = ip_dscp_to_mpls_exp(ip2->tos); exp3 = ip_dscp_to_mpls_exp(ip3->tos); } + + /* save the payload proto information in mpls opaque */ + vnet_buffer(b0)->mpls.pyld_proto = DPO_PROTO_IP4; + vnet_buffer(b1)->mpls.pyld_proto = DPO_PROTO_IP4; + vnet_buffer(b2)->mpls.pyld_proto = DPO_PROTO_IP4; + vnet_buffer(b3)->mpls.pyld_proto = DPO_PROTO_IP4; } else if (DPO_PROTO_IP6 == dproto) { @@ -516,6 +524,12 @@ mpls_label_imposition_inline (vlib_main_t * vm, exp3 = ip_dscp_to_mpls_exp( ip6_traffic_class_network_order(ip3)); } + + /* save the payload proto information in mpls opaque */ + vnet_buffer(b0)->mpls.pyld_proto = DPO_PROTO_IP6; + vnet_buffer(b1)->mpls.pyld_proto = DPO_PROTO_IP6; + vnet_buffer(b2)->mpls.pyld_proto = DPO_PROTO_IP6; + vnet_buffer(b3)->mpls.pyld_proto = DPO_PROTO_IP6; } else { @@ -785,6 +799,9 @@ mpls_label_imposition_inline (vlib_main_t * vm, ttl0 = ip0->ttl; exp0 = ip_dscp_to_mpls_exp(ip0->tos); } + + /* save the payload proto information in mpls opaque */ + vnet_buffer(b0)->mpls.pyld_proto = DPO_PROTO_IP4; } else if (DPO_PROTO_IP6 == dproto) { @@ -803,6 +820,9 @@ mpls_label_imposition_inline (vlib_main_t * vm, exp0 = ip_dscp_to_mpls_exp( ip6_traffic_class_network_order(ip0)); } + + /* save the payload proto information in mpls opaque */ + vnet_buffer(b0)->mpls.pyld_proto = DPO_PROTO_IP6; } else { @@ -902,8 +922,7 @@ format_mpls_label_imposition_trace (u8 * s, va_list * args) return (s); } -static uword -mpls_mpls_label_imposition_pipe (vlib_main_t * vm, +VLIB_NODE_FN (mpls_mpls_label_imposition_pipe_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -913,7 +932,6 @@ mpls_mpls_label_imposition_pipe (vlib_main_t * vm, } VLIB_REGISTER_NODE (mpls_mpls_label_imposition_pipe_node) = { - .function = mpls_mpls_label_imposition_pipe, .name = "mpls-label-imposition-pipe", .vector_size = sizeof (u32), @@ -923,11 +941,8 @@ VLIB_REGISTER_NODE (mpls_mpls_label_imposition_pipe_node) = { [0] = "mpls-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (mpls_mpls_label_imposition_pipe_node, - mpls_mpls_label_imposition_pipe) -static uword -ip4_mpls_label_imposition_pipe (vlib_main_t * vm, +VLIB_NODE_FN (ip4_mpls_label_imposition_pipe_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -937,7 +952,6 @@ ip4_mpls_label_imposition_pipe (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip4_mpls_label_imposition_pipe_node) = { - .function = ip4_mpls_label_imposition_pipe, .name = "ip4-mpls-label-imposition-pipe", .vector_size = sizeof (u32), @@ -947,11 +961,8 @@ VLIB_REGISTER_NODE (ip4_mpls_label_imposition_pipe_node) = { [0] = "ip4-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip4_mpls_label_imposition_pipe_node, - ip4_mpls_label_imposition_pipe) -static uword -ip6_mpls_label_imposition_pipe (vlib_main_t * vm, +VLIB_NODE_FN (ip6_mpls_label_imposition_pipe_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -961,7 +972,6 @@ ip6_mpls_label_imposition_pipe (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip6_mpls_label_imposition_pipe_node) = { - .function = ip6_mpls_label_imposition_pipe, .name = "ip6-mpls-label-imposition-pipe", .vector_size = sizeof (u32), @@ -971,11 +981,8 @@ VLIB_REGISTER_NODE (ip6_mpls_label_imposition_pipe_node) = { [0] = "ip6-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_mpls_label_imposition_pipe_node, - ip6_mpls_label_imposition_pipe) -static uword -ethernet_mpls_label_imposition_pipe (vlib_main_t * vm, +VLIB_NODE_FN (ethernet_mpls_label_imposition_pipe_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -985,7 +992,6 @@ ethernet_mpls_label_imposition_pipe (vlib_main_t * vm, } VLIB_REGISTER_NODE (ethernet_mpls_label_imposition_pipe_node) = { - .function = ethernet_mpls_label_imposition_pipe, .name = "ethernet-mpls-label-imposition-pipe", .vector_size = sizeof (u32), @@ -996,11 +1002,7 @@ VLIB_REGISTER_NODE (ethernet_mpls_label_imposition_pipe_node) = { } }; -VLIB_NODE_FUNCTION_MULTIARCH (ethernet_mpls_label_imposition_pipe_node, - ethernet_mpls_label_imposition_pipe) - -static uword -mpls_mpls_label_imposition_uniform (vlib_main_t * vm, +VLIB_NODE_FN (mpls_mpls_label_imposition_uniform_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1010,7 +1012,6 @@ mpls_mpls_label_imposition_uniform (vlib_main_t * vm, } VLIB_REGISTER_NODE (mpls_mpls_label_imposition_uniform_node) = { - .function = mpls_mpls_label_imposition_uniform, .name = "mpls-label-imposition-uniform", .vector_size = sizeof (u32), @@ -1020,11 +1021,8 @@ VLIB_REGISTER_NODE (mpls_mpls_label_imposition_uniform_node) = { [0] = "mpls-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (mpls_mpls_label_imposition_uniform_node, - mpls_mpls_label_imposition_uniform) -static uword -ip4_mpls_label_imposition_uniform (vlib_main_t * vm, +VLIB_NODE_FN (ip4_mpls_label_imposition_uniform_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1034,7 +1032,6 @@ ip4_mpls_label_imposition_uniform (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip4_mpls_label_imposition_uniform_node) = { - .function = ip4_mpls_label_imposition_uniform, .name = "ip4-mpls-label-imposition-uniform", .vector_size = sizeof (u32), @@ -1044,11 +1041,8 @@ VLIB_REGISTER_NODE (ip4_mpls_label_imposition_uniform_node) = { [0] = "ip4-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip4_mpls_label_imposition_uniform_node, - ip4_mpls_label_imposition_uniform) -static uword -ip6_mpls_label_imposition_uniform (vlib_main_t * vm, +VLIB_NODE_FN (ip6_mpls_label_imposition_uniform_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1058,7 +1052,6 @@ ip6_mpls_label_imposition_uniform (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip6_mpls_label_imposition_uniform_node) = { - .function = ip6_mpls_label_imposition_uniform, .name = "ip6-mpls-label-imposition-uniform", .vector_size = sizeof (u32), @@ -1068,11 +1061,8 @@ VLIB_REGISTER_NODE (ip6_mpls_label_imposition_uniform_node) = { [0] = "ip6-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_mpls_label_imposition_uniform_node, - ip6_mpls_label_imposition_uniform) -static uword -ethernet_mpls_label_imposition_uniform (vlib_main_t * vm, +VLIB_NODE_FN (ethernet_mpls_label_imposition_uniform_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1082,7 +1072,6 @@ ethernet_mpls_label_imposition_uniform (vlib_main_t * vm, } VLIB_REGISTER_NODE (ethernet_mpls_label_imposition_uniform_node) = { - .function = ethernet_mpls_label_imposition_uniform, .name = "ethernet-mpls-label-imposition-uniform", .vector_size = sizeof (u32), @@ -1093,11 +1082,8 @@ VLIB_REGISTER_NODE (ethernet_mpls_label_imposition_uniform_node) = { } }; -VLIB_NODE_FUNCTION_MULTIARCH (ethernet_mpls_label_imposition_uniform_node, - ethernet_mpls_label_imposition_uniform) -static uword -ip4_mpls_label_imposition_pipe_no_ip_ttl_decr (vlib_main_t * vm, +VLIB_NODE_FN (ip4_mpls_label_imposition_pipe_no_ip_ttl_decr_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1107,7 +1093,6 @@ ip4_mpls_label_imposition_pipe_no_ip_ttl_decr (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip4_mpls_label_imposition_pipe_no_ip_ttl_decr_node) = { - .function = ip4_mpls_label_imposition_pipe_no_ip_ttl_decr, .name = "ip4-mpls-label-imposition-pipe-no-ip-ttl-decr", .vector_size = sizeof (u32), @@ -1117,11 +1102,8 @@ VLIB_REGISTER_NODE (ip4_mpls_label_imposition_pipe_no_ip_ttl_decr_node) = { [0] = "ip4-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip4_mpls_label_imposition_pipe_no_ip_ttl_decr_node, - ip4_mpls_label_imposition_pipe_no_ip_ttl_decr) -static uword -ip6_mpls_label_imposition_pipe_no_ip_ttl_decr (vlib_main_t * vm, +VLIB_NODE_FN (ip6_mpls_label_imposition_pipe_no_ip_ttl_decr_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1131,7 +1113,6 @@ ip6_mpls_label_imposition_pipe_no_ip_ttl_decr (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip6_mpls_label_imposition_pipe_no_ip_ttl_decr_node) = { - .function = ip6_mpls_label_imposition_pipe_no_ip_ttl_decr, .name = "ip6-mpls-label-imposition-pipe-no-ip-ttl-decr", .vector_size = sizeof (u32), @@ -1141,11 +1122,8 @@ VLIB_REGISTER_NODE (ip6_mpls_label_imposition_pipe_no_ip_ttl_decr_node) = { [0] = "ip6-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_mpls_label_imposition_pipe_no_ip_ttl_decr_node, - ip6_mpls_label_imposition_pipe_no_ip_ttl_decr) -static uword -ip4_mpls_label_imposition_uniform_no_ip_ttl_decr (vlib_main_t * vm, +VLIB_NODE_FN (ip4_mpls_label_imposition_uniform_no_ip_ttl_decr_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1156,7 +1134,6 @@ ip4_mpls_label_imposition_uniform_no_ip_ttl_decr (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip4_mpls_label_imposition_uniform_no_ip_ttl_decr_node) = { - .function = ip4_mpls_label_imposition_uniform_no_ip_ttl_decr, .name = "ip4-mpls-label-imposition-uniform-no-ip-ttl-decr", .vector_size = sizeof (u32), @@ -1166,11 +1143,8 @@ VLIB_REGISTER_NODE (ip4_mpls_label_imposition_uniform_no_ip_ttl_decr_node) = { [0] = "ip4-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip4_mpls_label_imposition_uniform_no_ip_ttl_decr_node, - ip4_mpls_label_imposition_uniform_no_ip_ttl_decr) -static uword -ip6_mpls_label_imposition_uniform_no_ip_ttl_decr (vlib_main_t * vm, +VLIB_NODE_FN (ip6_mpls_label_imposition_uniform_no_ip_ttl_decr_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -1181,7 +1155,6 @@ ip6_mpls_label_imposition_uniform_no_ip_ttl_decr (vlib_main_t * vm, } VLIB_REGISTER_NODE (ip6_mpls_label_imposition_uniform_no_ip_ttl_decr_node) = { - .function = ip6_mpls_label_imposition_uniform_no_ip_ttl_decr, .name = "ip6-mpls-label-imposition-uniform-no-ip-ttl-decr", .vector_size = sizeof (u32), @@ -1191,10 +1164,9 @@ VLIB_REGISTER_NODE (ip6_mpls_label_imposition_uniform_no_ip_ttl_decr_node) = { [0] = "ip6-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_mpls_label_imposition_uniform_no_ip_ttl_decr_node, - ip6_mpls_label_imposition_uniform_no_ip_ttl_decr) +#ifndef CLIB_MARCH_VARIANT static void mpls_label_dpo_mem_show (void) { @@ -1204,11 +1176,44 @@ mpls_label_dpo_mem_show (void) sizeof(mpls_label_dpo_t)); } +/** + * Interpose a label DPO. used in the FIB unit tests + */ +static void +mpls_label_interpose (const dpo_id_t *original, + const dpo_id_t *parent, + dpo_id_t *clone) +{ + mpls_label_dpo_t *mld, *mld_clone; + + mld_clone = mpls_label_dpo_alloc(); + mld = mpls_label_dpo_get(original->dpoi_index); + + mld_clone->mld_locks = 0; + clib_memcpy_fast(&mld_clone->mld_hdr, + &mld->mld_hdr, + sizeof(mld_clone->mld_hdr)); + mld_clone->mld_payload_proto = mld->mld_payload_proto; + mld_clone->mld_n_labels = mld->mld_n_labels; + mld_clone->mld_n_hdr_bytes = mld->mld_n_hdr_bytes; + + dpo_stack(mpls_label_dpo_types[MPLS_LABEL_DPO_FLAG_NONE], + mld_clone->mld_payload_proto, + &mld_clone->mld_dpo, + parent); + + dpo_set(clone, + mpls_label_dpo_types[MPLS_LABEL_DPO_FLAG_NONE], + mld_clone->mld_payload_proto, + mpls_label_dpo_get_index(mld_clone)); +} + const static dpo_vft_t mld_vft = { .dv_lock = mpls_label_dpo_lock, .dv_unlock = mpls_label_dpo_unlock, .dv_format = format_mpls_label_dpo, .dv_mem_show = mpls_label_dpo_mem_show, + .dv_mk_interpose = mpls_label_interpose, }; const static char* const mpls_label_imp_pipe_ip4_nodes[] = @@ -1326,3 +1331,4 @@ mpls_label_dpo_get_type (mpls_label_dpo_flags_t flags) { return (mpls_label_dpo_types[flags]); } +#endif /* CLIB_MARCH_VARIANT */