Hybrid ICN (hICN) plugin  v21.06-rc0-4-g18fa668
facelet.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-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 
26 #ifndef FACEMGR_FACELET_H
27 #define FACEMGR_FACELET_H
28 
29 #include <stdbool.h>
30 
31 #include <hicn/ctrl/face.h>
32 #include <hicn/ctrl/route.h>
33 
34 #define MAXSZ_FACELET 1024
35 
36 #define FACELET_MAX_ERRORS 10
37 
38 /* NOTE: Any test should be sufficient */
39 #define IS_VALID_NETDEVICE(netdevice) ((netdevice.index != 0) && (netdevice.name[0] != '\0'))
40 
41 typedef struct facelet_s facelet_t;
42 
43 /* Face type */
44 
45 #define foreach_face_type_layer \
46  _(UNDEFINED) \
47  _(3) \
48  _(4) \
49  _(N)
50 
51 typedef enum {
52 #define _(x) FACE_TYPE_LAYER_ ## x,
53  foreach_face_type_layer
54 #undef _
55 } face_type_layer_t;
56 
57 #define foreach_face_type_encap \
58  _(UNDEFINED) \
59  _(TCP) \
60  _(UDP) \
61  _(N)
62 
63 typedef enum {
64 #define _(x) FACE_TYPE_ENCAP_ ## x,
65  foreach_face_type_encap
66 #undef _
67 } face_type_encap_t;
68 
69 typedef struct {
70  face_type_layer_t layer;
71  face_type_encap_t encap;
73 
74 
75 extern const char * face_type_layer_str[];
76 extern const char * face_type_encap_str[];
77 
78 #define FACEMGR_FACE_TYPE_STR(x) \
79  face_type_layer_str[x.layer], face_type_encap_str[x.encap]
80 
81 #define FACEMGR_FACE_TYPE_UNDEFINED (facemgr_face_type_t) { \
82  .layer = FACE_TYPE_LAYER_UNDEFINED, \
83  .encap = FACE_TYPE_ENCAP_UNDEFINED, \
84 }
85 
86 #define FACEMGR_FACE_TYPE_NATIVE_UDP (facemgr_face_type_t) { \
87  .layer = FACE_TYPE_LAYER_3, \
88  .encap = FACE_TYPE_ENCAP_UDP, \
89 }
90 
91 #define FACEMGR_FACE_TYPE_NATIVE_TCP (facemgr_face_type_t) { \
92  .layer = FACE_TYPE_LAYER_3, \
93  .encap = FACE_TYPE_ENCAP_TCP, \
94 }
95 
96 #define FACEMGR_FACE_TYPE_OVERLAY_UDP (facemgr_face_type_t) { \
97  .layer = FACE_TYPE_LAYER_4, \
98  .encap = FACE_TYPE_ENCAP_UDP, \
99 }
100 
101 #define FACEMGR_FACE_TYPE_OVERLAY_TCP (facemgr_face_type_t) { \
102  .layer = FACE_TYPE_LAYER_4, \
103  .encap = FACE_TYPE_ENCAP_TCP, \
104 }
105 
106 /* Facelet status */
107 #define foreach_facelet_status \
108  _(UNDEFINED) \
109  _(DOWN) \
110  _(UNCERTAIN) \
111  _(INCOMPLETE) \
112  _(CREATE) \
113  _(CLEAN) \
114  _(IGNORED) \
115  _(UPDATE) \
116  _(DELETE) \
117  _(DELETED) \
118  _(N)
119 
120 typedef enum {
121 #define _(x) FACELET_STATUS_ ## x,
122  foreach_facelet_status
123 #undef _
124 } facelet_status_t;
125 
126 extern const char * facelet_status_str[];
127 
128 /* Facelet error reason */
129 #define foreach_facelet_error_reason \
130  _(UNDEFINED) \
131  _(UNSPECIFIED_ERROR) \
132  _(FORWARDER_OFFLINE) \
133  _(PERMISSION_DENIED) \
134  _(INTERNAL_ERROR) \
135  _(N)
136 
137 typedef enum {
138 #define _(x) FACELET_ERROR_REASON_ ## x,
139  foreach_facelet_error_reason
140 #undef _
141 } facelet_error_reason_t;
142 
143 extern const char * facelet_error_reason_str[];
144 
145 /* Facelet attribute status */
146 
147 /*
148  * We expect an attribute in the cache to be able to take any value but
149  * UNDEFINED and N, which facelet events should either be UNSET or CLEAN
150  */
151 #define foreach_facelet_attr_status \
152  _(UNDEFINED, '?') \
153  _(UNSET, 'X') \
154  _(CLEAN, ' ') \
155  _(DIRTY, '*') \
156  _(PENDING, 'P') \
157  _(CONFLICT, '!') \
158  _(N, '-')
159 
160 typedef enum {
161 #define _(x, y) FACELET_ATTR_STATUS_ ## x,
162  foreach_facelet_attr_status
163 #undef _
164 } facelet_attr_status_t;
165 
166 extern const char * facelet_attr_status_str[];
167 extern const char * facelet_attr_status_str_short[];
168 
169 /* Facelet attribute */
170 
171 #ifdef WITH_POLICY
172 #define foreach_facelet_attr \
173  _(netdevice_type_t, netdevice_type) \
174  _(netdevice_t, netdevice) \
175  _(int, family) \
176  _(ip_address_t, local_addr) \
177  _(u16, local_port) \
178  _(ip_address_t, remote_addr) \
179  _(u16, remote_port) \
180  _(face_state_t, admin_state) \
181  _(face_state_t, state) \
182  _(u32, priority) \
183  _(facemgr_face_type_t, face_type)
184 #else
185 #define foreach_facelet_attr \
186  _(netdevice_type_t, netdevice_type) \
187  _(netdevice_t, netdevice) \
188  _(int, family) \
189  _(ip_address_t, local_addr) \
190  _(u16, local_port) \
191  _(ip_address_t, remote_addr) \
192  _(u16, remote_port) \
193  _(face_state_t, admin_state) \
194  _(face_state_t, state) \
195  _(facemgr_face_type_t, face_type)
196 #endif /* WITH_POLICY */
197 
198 #define foreach_facelet_event \
199  _(UNDEFINED) \
200  _(GET) \
201  _(CREATE) \
202  _(UPDATE) \
203  _(DELETE) \
204  _(SET_UP) \
205  _(SET_DOWN) \
206  _(N)
207 
208 #define MAXSZ_EVENT__ 10
209 #define MAXSZ_EVENT_ MAXSZ_EVENT_ + 1
210 
214 typedef enum {
215 #define _(x) FACELET_EVENT_ ## x,
216 foreach_facelet_event
217 #undef _
219 
220 extern const char * facelet_event_str[];
221 
225 facelet_t * facelet_create();
226 
227 facelet_t * facelet_create_from_netdevice(netdevice_t * netdevice);
228 
229 unsigned facelet_get_id(facelet_t * facelet);
230 void facelet_set_id(facelet_t * facelet, unsigned id);
231 
232 int facelet_validate_face(const facelet_t * facelet);
233 
234 facelet_t * facelet_create_from_face(face_t * face);
235 
236 void facelet_free(facelet_t * facelet);
237 
238 facelet_t * facelet_dup(const facelet_t * current_facelet);
239 
240 int facelet_cmp(const facelet_t * f1, const facelet_t * f2);
241 
242 bool facelet_equals(const facelet_t * facelet1, const facelet_t * facelet2);
243 
244 /* NOTE: only clean attributes are matched */
245 bool facelet_match(const facelet_t * facelet, const facelet_t * facelet_match);
246 
254 bool facelet_has_key(const facelet_t * facelet);
255 
256 #define FACELET_ACCESSORS_H(TYPE, NAME) \
257 bool facelet_has_ ## NAME(const facelet_t * facelet); \
258 facelet_attr_status_t facelet_get_ ## NAME ## _status(const facelet_t * facelet);\
259 void facelet_set_ ## NAME ## _status(facelet_t * facelet, \
260  facelet_attr_status_t status); \
261 int facelet_get_ ## NAME(const facelet_t * facelet, TYPE * NAME); \
262 int facelet_set_ ## NAME(facelet_t * facelet, TYPE NAME); \
263 int facelet_unset_ ## NAME(facelet_t * facelet);
264 
265 #define _(TYPE, NAME) FACELET_ACCESSORS_H(TYPE, NAME)
266 foreach_facelet_attr
267 #undef _
268 
269 int facelet_get_face(const facelet_t * facelet, face_t ** pface);
270 
271 int facelet_merge(facelet_t * facelet, facelet_t * facelet_to_merge);
272 
273 facelet_status_t facelet_get_status(const facelet_t * facelet);
274 void facelet_set_status(facelet_t * facelet, facelet_status_t status);
275 void facelet_set_attr_clean(facelet_t * facelet);
276 
277 void facelet_set_error(facelet_t * facelet, facelet_error_reason_t reason);
278 void facelet_unset_error(facelet_t * facelet);
279 bool facelet_get_error(const facelet_t * facelet);
280 
281 void facelet_set_bj_done(facelet_t * facelet);
282 void facelet_unset_bj_done(facelet_t * facelet);
283 bool facelet_is_bj_done(const facelet_t * facelet);
284 void facelet_set_au_done(facelet_t * facelet);
285 bool facelet_is_au_done(const facelet_t * facelet);
286 
287 facelet_event_t facelet_get_event(const facelet_t * facelet);
288 void facelet_set_event(facelet_t * facelet, facelet_event_t event);
289 
290 int facelet_add_route(facelet_t * facelet, hicn_route_t * route);
291 int facelet_remove_route(facelet_t * facelet, hicn_route_t * route, hicn_route_t ** route_removed);
292 int facelet_clear_routes(facelet_t * facelet);
293 int facelet_get_route_array(const facelet_t * facelet, hicn_route_t *** route_array);
294 
295 int facelet_snprintf(char * buf, size_t size, const facelet_t * facelet);
296 
297 #define DUMP_FACELET(msg, facelet) do { \
298  char buf[MAXSZ_FACELET]; \
299  facelet_snprintf(buf, MAXSZ_FACELET, facelet); \
300  DEBUG("%s : %s", msg, buf); \
301 } while(0)
302 
303 int facelet_snprintf_json(char * buf, size_t size, const facelet_t * facelet, int indent);
304 
305 #endif /* FACEMGR_FACELET_H */
facelet_event_t
facelet_event_t
Enumeration of the possible types of event.
Definition: facelet.h:214
face_t
Definition: face.h:153
netdevice_t
Netdevice type.
Definition: face.h:73
facelet_has_key
bool facelet_has_key(const facelet_t *facelet)
Returns whether the specified facelet has all key attributes defined.
face.h
Face abstraction.
facelet_create
facelet_t * facelet_create()
Create a facelet.
facemgr_face_type_t
Definition: facelet.h:69
route.h
hICN route