2 * Copyright (c) 2017 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
15 #ifndef __included_nsh_md2_ioam_util_h__
16 #define __included_nsh_md2_ioam_util_h__
18 #include <vnet/lisp-gpe/lisp_gpe.h>
19 #include <vnet/lisp-gpe/lisp_gpe_packet.h>
20 #include <vnet/ip/ip.h>
22 #include <nsh/nsh-md2-ioam/nsh_md2_ioam.h>
23 #include <nsh/nsh_packet.h>
26 extern nsh_option_map_t *nsh_md2_lookup_option (u16 class, u8 type);
32 } nsh_transit_trace_t;
35 nsh_md2_ioam_encap_decap_ioam_v4_one_inline (vlib_main_t * vm,
36 vlib_node_runtime_t * node,
38 u32 * next0, u32 drop_node_val,
42 udp_header_t *udp_hdr0;
43 lisp_gpe_header_t *lisp_gpe_hdr0;
44 nsh_base_header_t *nsh_hdr;
45 nsh_tlv_header_t *opt0;
46 nsh_tlv_header_t *limit0;
47 nsh_main_t *hm = &nsh_main;
48 nsh_option_map_t *nsh_option;
50 /* Populate the iOAM header */
51 ip0 = vlib_buffer_get_current (b0);
52 udp_hdr0 = (udp_header_t *) (ip0 + 1);
53 lisp_gpe_hdr0 = (lisp_gpe_header_t *) (udp_hdr0 + 1);
54 nsh_hdr = (nsh_base_header_t *) (lisp_gpe_hdr0 + 1);
55 opt0 = (nsh_tlv_header_t *) (nsh_hdr + 1);
57 (nsh_tlv_header_t *) ((u8 *) opt0 + (nsh_hdr->length * 4) -
58 sizeof (nsh_base_header_t));
61 * Basic validity checks
63 if ((nsh_hdr->length * 4) > clib_net_to_host_u16 (ip0->length))
65 *next0 = drop_node_val;
69 if (nsh_hdr->md_type != 2)
71 *next0 = drop_node_val;
75 /* Scan the set of h-b-h options, process ones that we understand */
83 opt0 = (nsh_tlv_header_t *) ((u8 *) opt0) + 1;
88 nsh_option = nsh_md2_lookup_option (opt0->class, opt0->type);
89 if ((nsh_option != NULL) && (hm->options[nsh_option->option_id]))
91 if ((*hm->options[nsh_option->option_id]) (b0, opt0) < 0)
93 *next0 = drop_node_val;
100 (nsh_tlv_header_t *) (((u8 *) opt0) + opt0->length +
101 sizeof (nsh_tlv_header_t));
105 if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
107 nsh_transit_trace_t *tr = vlib_add_trace (vm, node, b0, sizeof (*tr));
108 clib_memcpy (&(tr->trace_data), nsh_hdr, (nsh_hdr->length * 4));
117 * fd.io coding-style-patch-verification: ON
120 * eval: (c-set-style "gnu")