FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
nsh_md2_ioam_util.h
Go to the documentation of this file.
1
/*
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:
6
*
7
* http://www.apache.org/licenses/LICENSE-2.0
8
*
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.
14
*/
15
#ifndef __included_nsh_md2_ioam_util_h__
16
#define __included_nsh_md2_ioam_util_h__
17
18
#include <
lisp/lisp-gpe/lisp_gpe_packet.h
>
19
#include <
vnet/ip/ip.h
>
20
#include <
nsh/nsh.h
>
21
#include <
nsh/nsh-md2-ioam/nsh_md2_ioam.h
>
22
#include <
nsh/nsh_packet.h
>
23
24
25
extern
nsh_option_map_t
*
nsh_md2_lookup_option
(
u16
class
,
u8
type
);
26
27
28
typedef
struct
29
{
30
u8
trace_data[256];
31
}
nsh_transit_trace_t
;
32
33
always_inline
void
34
nsh_md2_ioam_encap_decap_ioam_v4_one_inline
(
vlib_main_t
*
vm
,
35
vlib_node_runtime_t
*
node
,
36
vlib_buffer_t
* b0,
37
u32
* next0,
u32
drop_node_val,
38
u8
use_adj)
39
{
40
ip4_header_t
*ip0;
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;
48
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);
55
limit0 =
56
(nsh_tlv_header_t *) ((
u8
*) opt0 + (nsh_hdr->length * 4) -
57
sizeof
(nsh_base_header_t));
58
59
/*
60
* Basic validity checks
61
*/
62
if
((nsh_hdr->length * 4) > clib_net_to_host_u16 (ip0->
length
))
63
{
64
*next0 = drop_node_val;
65
return
;
66
}
67
68
if
(nsh_hdr->md_type != 2)
69
{
70
*next0 = drop_node_val;
71
return
;
72
}
73
74
/* Scan the set of h-b-h options, process ones that we understand */
75
while
(opt0 < limit0)
76
{
77
u8
type0;
78
type0 = opt0->type;
79
switch
(type0)
80
{
81
case
0:
/* Pad1 */
82
opt0 = (nsh_tlv_header_t *) ((
u8
*) opt0) + 1;
83
continue
;
84
case
1:
/* PadN */
85
break
;
86
default
:
87
nsh_option =
nsh_md2_lookup_option
(opt0->class, opt0->type);
88
if
((nsh_option != NULL) && (hm->
options
[nsh_option->
option_id
]))
89
{
90
if
((*hm->
options
[nsh_option->
option_id
]) (b0, opt0) < 0)
91
{
92
*next0 = drop_node_val;
93
return
;
94
}
95
}
96
break
;
97
}
98
opt0 =
99
(nsh_tlv_header_t *) (((
u8
*) opt0) + opt0->length +
100
sizeof
(nsh_tlv_header_t));
101
}
102
103
104
if
(
PREDICT_FALSE
(b0->
flags
& VLIB_BUFFER_IS_TRACED))
105
{
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));
108
}
109
return
;
110
}
111
112
113
#endif
114
115
/*
116
* fd.io coding-style-patch-verification: ON
117
*
118
* Local Variables:
119
* eval: (c-set-style "gnu")
120
* End:
121
*/
nsh_md2_ioam.h
node
vlib_main_t vlib_node_runtime_t * node
Definition:
nat44_ei.c:3047
u16
unsigned short u16
Definition:
types.h:57
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition:
nat44_ei.c:3047
nsh_transit_trace_t
Definition:
nsh_md2_ioam_util.h:28
clib_memcpy_fast
static_always_inline void * clib_memcpy_fast(void *restrict dst, const void *restrict src, size_t n)
Definition:
string.h:92
nsh_md2_lookup_option
nsh_option_map_t * nsh_md2_lookup_option(u16 class, u8 type)
Definition:
nsh.c:88
udp_header_t
Definition:
udp_packet.h:45
ip4_header_t
Definition:
ip4_packet.h:87
ip4_header_t::length
u16 length
Definition:
ip4_packet.h:99
nsh_main_t
Definition:
nsh.h:105
nsh_md2_ioam_encap_decap_ioam_v4_one_inline
static void nsh_md2_ioam_encap_decap_ioam_v4_one_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_buffer_t *b0, u32 *next0, u32 drop_node_val, u8 use_adj)
Definition:
nsh_md2_ioam_util.h:34
PREDICT_FALSE
#define PREDICT_FALSE(x)
Definition:
clib.h:124
nsh_transit_trace_t::trace_data
u8 trace_data[256]
Definition:
nsh_md2_ioam_util.h:30
nsh_main_t::options
int(* options[MAX_MD2_OPTIONS])(vlib_buffer_t *b, nsh_tlv_header_t *opt)
Definition:
nsh.h:148
nsh_option_map_t::option_id
u32 option_id
Definition:
nsh.h:29
always_inline
#define always_inline
Definition:
rdma_mlx5dv.h:23
nsh_main
nsh_main_t nsh_main
Definition:
nsh.c:28
nsh.h
lisp_gpe_packet.h
LISP-GPE packet header structure.
ip.h
u32
unsigned int u32
Definition:
types.h:88
lisp_gpe_header_t
LISP-GPE header.
Definition:
lisp_gpe_packet.h:100
nsh_packet.h
vlib_main_t
Definition:
main.h:102
vlib_add_trace
void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
Definition:
trace.c:628
u8
unsigned char u8
Definition:
types.h:56
vlib_buffer_get_current
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
Definition:
buffer.h:257
nsh_option_map_t
Definition:
nsh.h:28
vlib_node_runtime_t
Definition:
node.h:454
type
vl_api_fib_path_type_t type
Definition:
fib_types.api:123
vlib_buffer_t::flags
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index,...
Definition:
buffer.h:133
vlib_buffer_t
VLIB buffer representation.
Definition:
buffer.h:111
src
plugins
nsh
nsh-md2-ioam
nsh_md2_ioam_util.h
Generated on Sat Jan 8 2022 10:04:18 for FD.io VPP by
1.8.17