26 #ifndef FACEMGR_FACELET_H
27 #define FACEMGR_FACELET_H
34 #define MAXSZ_FACELET 1024
36 #define FACELET_MAX_ERRORS 10
39 #define IS_VALID_NETDEVICE(netdevice) ((netdevice.index != 0) && (netdevice.name[0] != '\0'))
41 typedef struct facelet_s facelet_t;
45 #define foreach_face_type_layer \
52 #define _(x) FACE_TYPE_LAYER_ ## x,
53 foreach_face_type_layer
57 #define foreach_face_type_encap \
64 #define _(x) FACE_TYPE_ENCAP_ ## x,
65 foreach_face_type_encap
70 face_type_layer_t layer;
71 face_type_encap_t encap;
75 extern const char * face_type_layer_str[];
76 extern const char * face_type_encap_str[];
78 #define FACEMGR_FACE_TYPE_STR(x) \
79 face_type_layer_str[x.layer], face_type_encap_str[x.encap]
81 #define FACEMGR_FACE_TYPE_UNDEFINED (facemgr_face_type_t) { \
82 .layer = FACE_TYPE_LAYER_UNDEFINED, \
83 .encap = FACE_TYPE_ENCAP_UNDEFINED, \
86 #define FACEMGR_FACE_TYPE_NATIVE_UDP (facemgr_face_type_t) { \
87 .layer = FACE_TYPE_LAYER_3, \
88 .encap = FACE_TYPE_ENCAP_UDP, \
91 #define FACEMGR_FACE_TYPE_NATIVE_TCP (facemgr_face_type_t) { \
92 .layer = FACE_TYPE_LAYER_3, \
93 .encap = FACE_TYPE_ENCAP_TCP, \
96 #define FACEMGR_FACE_TYPE_OVERLAY_UDP (facemgr_face_type_t) { \
97 .layer = FACE_TYPE_LAYER_4, \
98 .encap = FACE_TYPE_ENCAP_UDP, \
101 #define FACEMGR_FACE_TYPE_OVERLAY_TCP (facemgr_face_type_t) { \
102 .layer = FACE_TYPE_LAYER_4, \
103 .encap = FACE_TYPE_ENCAP_TCP, \
107 #define foreach_facelet_status \
121 #define _(x) FACELET_STATUS_ ## x,
122 foreach_facelet_status
126 extern const char * facelet_status_str[];
129 #define foreach_facelet_error_reason \
131 _(UNSPECIFIED_ERROR) \
132 _(FORWARDER_OFFLINE) \
133 _(PERMISSION_DENIED) \
138 #define _(x) FACELET_ERROR_REASON_ ## x,
139 foreach_facelet_error_reason
141 } facelet_error_reason_t;
143 extern const char * facelet_error_reason_str[];
151 #define foreach_facelet_attr_status \
161 #define _(x, y) FACELET_ATTR_STATUS_ ## x,
162 foreach_facelet_attr_status
164 } facelet_attr_status_t;
166 extern const char * facelet_attr_status_str[];
167 extern const char * facelet_attr_status_str_short[];
172 #define foreach_facelet_attr \
173 _(netdevice_type_t, netdevice_type) \
174 _(netdevice_t, netdevice) \
176 _(ip_address_t, local_addr) \
178 _(ip_address_t, remote_addr) \
179 _(u16, remote_port) \
180 _(face_state_t, admin_state) \
181 _(face_state_t, state) \
183 _(facemgr_face_type_t, face_type)
185 #define foreach_facelet_attr \
186 _(netdevice_type_t, netdevice_type) \
187 _(netdevice_t, netdevice) \
189 _(ip_address_t, local_addr) \
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)
198 #define foreach_facelet_event \
208 #define MAXSZ_EVENT__ 10
209 #define MAXSZ_EVENT_ MAXSZ_EVENT_ + 1
215 #define _(x) FACELET_EVENT_ ## x,
216 foreach_facelet_event
220 extern const char * facelet_event_str[];
227 facelet_t * facelet_create_from_netdevice(
netdevice_t * netdevice);
229 unsigned facelet_get_id(facelet_t * facelet);
230 void facelet_set_id(facelet_t * facelet,
unsigned id);
232 int facelet_validate_face(
const facelet_t * facelet);
234 facelet_t * facelet_create_from_face(
face_t * face);
236 void facelet_free(facelet_t * facelet);
238 facelet_t * facelet_dup(
const facelet_t * current_facelet);
240 int facelet_cmp(
const facelet_t * f1,
const facelet_t * f2);
242 bool facelet_equals(
const facelet_t * facelet1,
const facelet_t * facelet2);
245 bool facelet_match(
const facelet_t * facelet,
const facelet_t * facelet_match);
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);
265 #define _(TYPE, NAME) FACELET_ACCESSORS_H(TYPE, NAME)
269 int facelet_get_face(
const facelet_t * facelet,
face_t ** pface);
271 int facelet_merge(facelet_t * facelet, facelet_t * facelet_to_merge);
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);
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);
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);
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);
295 int facelet_snprintf(
char * buf,
size_t size,
const facelet_t * facelet);
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); \
303 int facelet_snprintf_json(
char * buf,
size_t size,
const facelet_t * facelet,
int indent);