host stack: update stale copyright
[vpp.git] / src / vnet / udp / udp_encap.h
1 /*
2  * Copyright (c) 2016-2019 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 encapsulation.
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-plane
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 representation
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   /**
86    * The second cacheline contains control-plane data
87    */
88     CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
89
90   /**
91    * linkage into the FIB graph
92    */
93   fib_node_t ue_fib_node;
94
95   /**
96    * Tracking information for the IP destination
97    */
98   fib_node_index_t ue_fib_entry_index;
99   u32 ue_fib_sibling;
100
101   /**
102    * The FIB index in which the encap destination resides
103    */
104   index_t ue_fib_index;
105 } udp_encap_t;
106
107 extern index_t udp_encap_add_and_lock (fib_protocol_t proto,
108                                        index_t fib_index,
109                                        const ip46_address_t * src_ip,
110                                        const ip46_address_t * dst_ip,
111                                        u16 src_port,
112                                        u16 dst_port,
113                                        udp_encap_fixup_flags_t flags);
114
115 extern void udp_encap_lock (index_t uei);
116 extern void udp_encap_unlock (index_t uei);
117 extern u8 *format_udp_encap (u8 * s, va_list * args);
118 extern void udp_encap_contribute_forwarding (index_t uei,
119                                              dpo_proto_t proto,
120                                              dpo_id_t * dpo);
121
122 extern void udp_encap_get_stats (index_t uei, u64 * packets, u64 * bytes);
123
124 /**
125  * Callback function invoked when walking all encap objects.
126  * Return non-zero to continue the walk.
127  */
128 typedef walk_rc_t (*udp_encap_walk_cb_t) (index_t uei, void *ctx);
129
130 /**
131  * Walk each of the encap objects
132  */
133 extern void udp_encap_walk (udp_encap_walk_cb_t cb, void *ctx);
134
135 /**
136  * Pool of encaps
137  */
138 extern udp_encap_t *udp_encap_pool;
139
140 static inline udp_encap_t *
141 udp_encap_get (index_t uei)
142 {
143   return (pool_elt_at_index (udp_encap_pool, uei));
144 }
145
146 /*
147  * fd.io coding-style-patch-verification: ON
148  *
149  * Local Variables:
150  * eval: (c-set-style "gnu")
151  * End:
152  */
153
154 #endif