BIER neighbor stats
[vpp.git] / src / vnet / udp / udp_encap.h
1 /*
2  * Copyright (c) 2016 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
16 #ifndef __UDP_ENCAP_H__
17 #define __UDP_ENCAP_H__
18
19 #include <vnet/ip/ip.h>
20 #include <vnet/udp/udp.h>
21 #include <vnet/fib/fib_node.h>
22
23 /**
24  * UDP encapsualtion.
25  * A representation of the encapsulation of packets in UDP-over-IP.
26  * This is encapsulation only, there is no tunnel interface, hence
27  * it is uni-directional. For decap register a handler with the UDP port
28  * dispatcher.
29  */
30
31 /**
32  * Fixup behaviour. Actions performed on the encap in the data-plance
33  */
34 typedef enum udp_encap_fixup_flags_t_
35 {
36   UDP_ENCAP_FIXUP_NONE = 0,
37     /**
38      * UDP source port contains an entropy/hash value for load-balancing by downstream peers.
39      */
40   UDP_ENCAP_FIXUP_UDP_SRC_PORT_ENTROPY = (1 << 0),
41 } udp_encap_fixup_flags_t;
42
43 /**
44  * The UDP encap represenation
45  */
46 typedef struct udp_encap_t_
47 {
48     /**
49      * The first cacheline contains the data used in the data-plane
50      */
51   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
52
53     /**
54      * The headers to paint, in packet painting order
55      */
56   union
57   {
58     struct
59     {
60       ip4_header_t ue_ip4;
61       udp_header_t ue_udp;
62     } __attribute__ ((packed)) ip4;
63     struct
64     {
65       ip6_header_t ue_ip6;
66       udp_header_t ue_udp;
67     } __attribute__ ((packed)) ip6;
68   } __attribute__ ((packed)) ue_hdrs;
69
70     /**
71      * Flags controlling fixup behaviour
72      */
73   udp_encap_fixup_flags_t ue_flags;
74
75     /**
76      * The DPO used to forward to the next node in the VLIB graph
77      */
78   dpo_id_t ue_dpo;
79
80     /**
81      * the protocol of the IP header imposed
82      */
83   fib_protocol_t ue_ip_proto;
84
85     CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
86
87     /**
88      * linkage into the FIB graph
89      */
90   fib_node_t ue_fib_node;
91
92     /**
93      * The ID given by the user/client.
94      * This ID is used by the client for modifications.
95      */
96   u32 ue_id;
97
98     /**
99      * Tracking information for the IP destination
100      */
101   fib_node_index_t ue_fib_entry_index;
102   u32 ue_fib_sibling;
103
104     /**
105      * The FIB index in which the encap destination resides
106      */
107   index_t ue_fib_index;
108 } udp_encap_t;
109
110 extern index_t udp_encap_add_and_lock (u32 id,
111                                        fib_protocol_t proto,
112                                        index_t fib_index,
113                                        const ip46_address_t * src_ip,
114                                        const ip46_address_t * dst_ip,
115                                        u16 src_port,
116                                        u16 dst_port,
117                                        udp_encap_fixup_flags_t flags);
118
119 extern index_t udp_encap_find (u32 id);
120 extern void udp_encap_lock (u32 id);
121 extern void udp_encap_unlock (u32 id);
122 extern u8 *format_udp_encap (u8 * s, va_list * args);
123 extern void udp_encap_unlock_w_index (index_t uei);
124 extern void udp_encap_contribute_forwarding (u32 id,
125                                              dpo_proto_t proto,
126                                              dpo_id_t * dpo);
127
128 extern void udp_encap_get_stats (index_t uei, u64 * packets, u64 * bytes);
129
130 /**
131  * Callback function invoked when walking all encap objects.
132  * Return non-zero to continue the walk.
133  */
134 typedef walk_rc_t (*udp_encap_walk_cb_t) (index_t uei, void *ctx);
135
136 /**
137  * Walk each of the encap objects
138  */
139 extern void udp_encap_walk (udp_encap_walk_cb_t cb, void *ctx);
140
141 /**
142  * Pool of encaps
143  */
144 extern udp_encap_t *udp_encap_pool;
145
146 static inline udp_encap_t *
147 udp_encap_get (index_t uei)
148 {
149   return (pool_elt_at_index (udp_encap_pool, uei));
150 }
151
152 /*
153  * fd.io coding-style-patch-verification: ON
154  *
155  * Local Variables:
156  * eval: (c-set-style "gnu")
157  * End:
158  */
159
160 #endif