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 <lisp/lisp-gpe/lisp_gpe_packet.h>
19 #include <vnet/ip/ip.h>
21 #include <nsh/nsh-md2-ioam/nsh_md2_ioam.h>
22 #include <nsh/nsh_packet.h>
25 extern nsh_option_map_t *nsh_md2_lookup_option (u16 class, u8 type);
31 } nsh_transit_trace_t;
34 nsh_md2_ioam_encap_decap_ioam_v4_one_inline (vlib_main_t * vm,
35 vlib_node_runtime_t * node,
37 u32 * next0, u32 drop_node_val,
41 udp_header_t *udp_hdr0;
42 lisp_gpe_header_t *lisp_gpe_hdr0;
43 nsh_base_header_t *nsh_hdr;
44 nsh_tlv_header_t *opt0;
45 nsh_tlv_header_t *limit0;
46 nsh_main_t *hm = &nsh_main;
47 nsh_option_map_t *nsh_option;
49 /* Populate the iOAM header */
50 ip0 = vlib_buffer_get_current (b0);
51 udp_hdr0 = (udp_header_t *) (ip0 + 1);
52 lisp_gpe_hdr0 = (lisp_gpe_header_t *) (udp_hdr0 + 1);
53 nsh_hdr = (nsh_base_header_t *) (lisp_gpe_hdr0 + 1);
54 opt0 = (nsh_tlv_header_t *) (nsh_hdr + 1);
56 (nsh_tlv_header_t *) ((u8 *) opt0 + (nsh_hdr->length * 4) -
57 sizeof (nsh_base_header_t));
60 * Basic validity checks
62 if ((nsh_hdr->length * 4) > clib_net_to_host_u16 (ip0->length))
64 *next0 = drop_node_val;
68 if (nsh_hdr->md_type != 2)
70 *next0 = drop_node_val;
74 /* Scan the set of h-b-h options, process ones that we understand */
82 opt0 = (nsh_tlv_header_t *) ((u8 *) opt0) + 1;
87 nsh_option = nsh_md2_lookup_option (opt0->class, opt0->type);
88 if ((nsh_option != NULL) && (hm->options[nsh_option->option_id]))
90 if ((*hm->options[nsh_option->option_id]) (b0, opt0) < 0)
92 *next0 = drop_node_val;
99 (nsh_tlv_header_t *) (((u8 *) opt0) + opt0->length +
100 sizeof (nsh_tlv_header_t));
104 if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
106 nsh_transit_trace_t *tr = vlib_add_trace (vm, node, b0, sizeof (*tr));
107 clib_memcpy_fast (&(tr->trace_data), nsh_hdr, (nsh_hdr->length * 4));
116 * fd.io coding-style-patch-verification: ON
119 * eval: (c-set-style "gnu")