16 #ifndef __HICN_FACE_H__
17 #define __HICN_FACE_H__
19 #include <vnet/fib/fib_node.h>
20 #include <vnet/vnet.h>
21 #include <vlib/vlib.h>
22 #include <vnet/ip/ip46_address.h>
23 #include <vnet/dpo/dpo.h>
24 #include <vnet/adj/adj_types.h>
25 #include <vppinfra/bihash_8_8.h>
26 #include <vnet/adj/adj_midchain.h>
29 typedef u8 hicn_face_flags_t;
30 typedef index_t hicn_face_id_t;
82 typedef struct __attribute__ ((packed)) hicn_face_s
86 hicn_face_flags_t flags;
112 fib_node_index_t fib_entry_index;
118 extern hicn_face_t *hicn_dpoi_face_pool;
124 #define HICN_FACE_FLAGS_DEFAULT 0x00
125 #define HICN_FACE_FLAGS_FACE 0x01
126 #define HICN_FACE_FLAGS_IFACE 0x02
127 #define HICN_FACE_FLAGS_APPFACE_PROD \
129 #define HICN_FACE_FLAGS_APPFACE_CONS \
131 #define HICN_FACE_FLAGS_DELETED 0x10
133 #define HICN_FACE_NULL (hicn_face_id_t) ~0
135 #define HICN_FACE_FLAGS_APPFACE_PROD_BIT 2
136 #define HICN_FACE_FLAGS_APPFACE_CONS_BIT 3
138 #define HICN_BUFFER_FLAGS_DEFAULT 0x00
139 #define HICN_BUFFER_FLAGS_FACE_IS_APP 0x01
141 STATIC_ASSERT ((1 << HICN_FACE_FLAGS_APPFACE_PROD_BIT) ==
142 HICN_FACE_FLAGS_APPFACE_PROD,
143 "HICN_FACE_FLAGS_APPFACE_PROD_BIT and "
144 "HICN_FACE_FLAGS_APPFACE_PROD must correspond");
146 STATIC_ASSERT ((1 << HICN_FACE_FLAGS_APPFACE_CONS_BIT) ==
147 HICN_FACE_FLAGS_APPFACE_CONS,
148 "HICN_FACE_FLAGS_APPFACE_CONS_BIT and "
149 "HICN_FACE_FLAGS_APPFACE_CONS must correspond");
152 (HICN_FACE_FLAGS_APPFACE_PROD >> HICN_FACE_FLAGS_APPFACE_PROD_BIT) ==
153 HICN_BUFFER_FLAGS_FACE_IS_APP,
154 "hicn buffer app flag does not correspond to HICN_FACE_FLAGS_APPFACE_PROD");
157 (HICN_FACE_FLAGS_APPFACE_CONS >> HICN_FACE_FLAGS_APPFACE_CONS_BIT) ==
158 HICN_BUFFER_FLAGS_FACE_IS_APP,
159 "hicn buffer app flag does not correspond to HICN_FACE_FLAGS_APPFACE_PROD");
166 u8 *(*format_face) (u8 *s, va_list *args);
168 int (*hicn_face_del) (hicn_face_id_t face_id);
169 void (*hicn_face_get_dpo) (hicn_face_t *face, dpo_id_t *dpo);
172 #define foreach_hicn_face_counter \
173 _ (INTEREST_RX, 0, "Interest rx") \
174 _ (INTEREST_TX, 1, "Interest tx") \
175 _ (DATA_RX, 2, "Data rx") \
176 _ (DATA_TX, 3, "Data tx")
180 #define _(a, b, c) HICN_FACE_COUNTERS_##a = (b),
181 foreach_hicn_face_counter
184 } hicn_face_counters_t;
186 extern mhash_t hicn_face_hashtb;
188 extern const char *HICN_FACE_CTRX_STRING[];
190 #define get_face_counter_string(ctrxno) \
191 (char *) (HICN_FACE_CTRX_STRING[ctrxno])
194 extern dpo_id_t *face_dpo_vec;
198 extern char **face_type_names_vec;
204 extern dpo_type_t first_type;
207 extern vlib_combined_counter_main_t *counters;
215 always_inline hicn_face_id_t
218 return face_dpoi - hicn_dpoi_face_pool;
228 always_inline hicn_face_t *
231 if (!pool_is_free_index (hicn_dpoi_face_pool, dpoi_index))
232 return (hicn_face_t *) pool_elt_at_index (hicn_dpoi_face_pool, dpoi_index);
243 always_inline hicn_face_t *
246 return (hicn_face_t *) pool_elt_at_index (hicn_dpoi_face_pool, dpoi_index);
255 return pool_len (hicn_dpoi_face_pool) > face_id &&
256 !pool_is_free_index (hicn_dpoi_face_pool, face_id);
315 u8 *format_hicn_face (u8 *s, va_list *args);
353 hicn_face_id_t face_id;
388 typedef struct __attribute__ ((packed)) hicn_face_key_s
409 hicn_face_key_t *key)
426 always_inline hicn_face_t *
432 dpo_id_t dpo = DPO_INVALID;
434 dpo.dpoi_index = adj_index;
438 hicn_face_id_t *dpoi_index = (hicn_face_id_t *) mhash_get (hashtb, &key);
440 if (dpoi_index != NULL)
460 always_inline hicn_face_t *
462 const dpo_id_t *dpo, mhash_t *hashtb)
468 hicn_face_id_t *dpoi_index = (hicn_face_id_t *) mhash_get (hashtb, &key);
470 if (dpoi_index != NULL)
495 dpo_id_t dpo = DPO_INVALID;
515 int sw_if, hicn_face_id_t *pfaceid, u8 is_app_prod);
529 hicn_face_id_t *pfaceid, dpo_proto_t proto, u32 adj_index)
532 pool_get (hicn_dpoi_face_pool, face);
534 clib_memcpy (&(face->nat_addr), nat_address, sizeof (
ip46_address_t));
537 face->dpo.dpoi_type = DPO_FIRST;
538 face->dpo.dpoi_proto = DPO_PROTO_NONE;
539 face->dpo.dpoi_index = adj_index;
540 face->dpo.dpoi_next_node = 0;
541 face->pl_id = pl_index++;
542 face->flags = HICN_FACE_FLAGS_IFACE;
549 mhash_set_mem (&hicn_face_hashtb, &key, (uword *) pfaceid, 0);
551 for (
int i = 0; i < HICN_N_COUNTER; i++)
553 vlib_validate_combined_counter (&counters[(*pfaceid) * HICN_N_COUNTER],
555 vlib_zero_combined_counter (&counters[(*pfaceid) * HICN_N_COUNTER], i);
581 ip46_address_set_ip4 (&ip_address, nat_addr);
585 if (PREDICT_FALSE (in_faces_vec == NULL))
586 return HICN_ERROR_FACE_NOT_FOUND;
588 *in_faces_vec_id = in_faces_vec->vec_id;
591 *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
592 *hicnb_flags |= (face->flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
593 HICN_FACE_FLAGS_APPFACE_PROD_BIT;
595 *face_id = in_faces_vec->face_id;
597 return HICN_ERROR_NONE;
620 if (PREDICT_FALSE (in_faces_vec == NULL))
621 return HICN_ERROR_FACE_NOT_FOUND;
623 *in_faces_vec_id = in_faces_vec->vec_id;
626 *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
627 *hicnb_flags |= (face->flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
628 HICN_FACE_FLAGS_APPFACE_PROD_BIT;
630 *face_id = in_faces_vec->face_id;
632 return HICN_ERROR_NONE;
639 hicn4_iface_adj_walk_cb (adj_index_t ai,
void *ctx)
642 hicn_face_t *face = (hicn_face_t *) ctx;
644 dpo_set (&face->dpo, DPO_ADJACENCY_MIDCHAIN, DPO_PROTO_IP4, ai);
645 adj_nbr_midchain_stack (ai, &face->dpo);
647 return (ADJ_WALK_RC_CONTINUE);
664 u32 adj_index, u32 node_index)
669 ip46_address_set_ip4 (&ip_address, nat_addr);
673 hicn_face_get (&ip_address, sw_if, &hicn_face_hashtb, adj_index);
678 hicn_iface_add (&ip_address, sw_if, &idx, DPO_PROTO_IP4, adj_index);
682 face->dpo.dpoi_type = DPO_FIRST;
683 face->dpo.dpoi_proto = DPO_PROTO_IP4;
684 face->dpo.dpoi_index = adj_index;
685 face->dpo.dpoi_next_node = node_index;
689 adj_nbr_walk (face->sw_if, FIB_PROTOCOL_IP4, hicn4_iface_adj_walk_cb,
693 *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
706 *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
707 *hicnb_flags |= (face->flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
708 HICN_FACE_FLAGS_APPFACE_PROD_BIT;
717 hicn6_iface_adj_walk_cb (adj_index_t ai,
void *ctx)
720 hicn_face_t *face = (hicn_face_t *) ctx;
722 ip_adjacency_t *adj = adj_get (ai);
723 if ((adj->lookup_next_index == IP_LOOKUP_NEXT_MIDCHAIN) ||
724 (adj->lookup_next_index == IP_LOOKUP_NEXT_MCAST_MIDCHAIN))
726 dpo_set (&face->dpo, DPO_ADJACENCY_MIDCHAIN, adj->ia_nh_proto, ai);
727 adj_nbr_midchain_stack (ai, &face->dpo);
730 return (ADJ_WALK_RC_CONTINUE);
747 u32 adj_index, u32 node_index)
752 &hicn_face_hashtb, adj_index);
762 face->dpo.dpoi_type = DPO_FIRST;
763 face->dpo.dpoi_proto = DPO_PROTO_IP6;
764 face->dpo.dpoi_index = adj_index;
765 face->dpo.dpoi_next_node = node_index;
767 adj_nbr_walk (face->sw_if, FIB_PROTOCOL_IP6, hicn6_iface_adj_walk_cb,
770 *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
784 *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
785 *hicnb_flags |= (face->flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
786 HICN_FACE_FLAGS_APPFACE_PROD_BIT;
791 #endif // __HICN_FACE_H__