#define IP_FLOW_HASH_SRC_PORT (1<<3)
#define IP_FLOW_HASH_DST_PORT (1<<4)
#define IP_FLOW_HASH_REVERSE_SRC_DST (1<<5)
+#define IP_FLOW_HASH_SYMMETRIC (1<<6)
/** Default: 5-tuple without the "reverse" bit */
#define IP_FLOW_HASH_DEFAULT (0x1F)
_(sport, IP_FLOW_HASH_SRC_PORT) \
_(dport, IP_FLOW_HASH_DST_PORT) \
_(proto, IP_FLOW_HASH_PROTO) \
-_(reverse, IP_FLOW_HASH_REVERSE_SRC_DST)
+_(reverse, IP_FLOW_HASH_REVERSE_SRC_DST) \
+_(symmetric, IP_FLOW_HASH_SYMMETRIC)
/**
* A flow hash configuration is a mask of the flow hash options
/* An all zeros address */
extern const ip46_address_t zero_addr;
+typedef enum ip_interface_address_flags_t_
+{
+ IP_INTERFACE_ADDRESS_FLAG_STALE = (1 << 0),
+} __clib_packed ip_interface_address_flags_t;
+
+typedef struct
+{
+ fib_prefix_t prefix;
+
+ u32 sw_if_index;
+} ip_interface_prefix_key_t;
+
+typedef struct
+{
+ /* key - prefix and sw_if_index */
+ ip_interface_prefix_key_t key;
+
+ /* number of addresses in this prefix on the interface */
+ u16 ref_count;
+
+ /* index of the interface address used as a default source address */
+ u32 src_ia_index;
+} ip_interface_prefix_t;
typedef struct
{
/* Interface which has this address. */
u32 sw_if_index;
- /* Adjacency for neighbor probe (ARP) for this interface address. */
- u32 neighbor_probe_adj_index;
-
/* Address (prefix) length for this interface. */
u16 address_length;
- /* Will be used for something eventually. Primary vs. secondary? */
- u16 flags;
+ /* flags relating to this prefix */
+ ip_interface_address_flags_t flags;
/* Next and previous pointers for doubly linked list of
addresses per software interface. */
IP_LOCAL_NEXT_PUNT,
IP_LOCAL_NEXT_UDP_LOOKUP,
IP_LOCAL_NEXT_ICMP,
+ IP_LOCAL_NEXT_REASSEMBLY,
IP_LOCAL_N_NEXT,
} ip_local_next_t;
~0 means this interface has no address. */
u32 *if_address_pool_index_by_sw_if_index;
+ /** Pool of prefixes containing addresses assigned to interfaces */
+ ip_interface_prefix_t *if_prefix_pool;
+
+ /** Hash table mapping prefix to index in interface prefix pool */
+ mhash_t prefix_to_if_prefix_index;
+
/** First table index to use for this interface, ~0 => none */
u32 *classify_table_index_by_sw_if_index;
u8 builtin_protocol_by_ip_protocol[256];
} ip_lookup_main_t;
-clib_error_t *ip_interface_address_add_del (ip_lookup_main_t * lm,
- u32 sw_if_index,
- void *address,
- u32 address_length,
- u32 is_del, u32 * result_index);
-
u8 *format_ip_flow_hash_config (u8 * s, va_list * args);
-always_inline ip_interface_address_t *
-ip_get_interface_address (ip_lookup_main_t * lm, void *addr_fib)
+
+always_inline void
+ip_lookup_set_buffer_fib_index (u32 * fib_index_by_sw_if_index,
+ vlib_buffer_t * b)
{
- uword *p = mhash_get (&lm->address_to_if_address_index, addr_fib);
- return p ? pool_elt_at_index (lm->if_address_pool, p[0]) : 0;
+ /* *INDENT-OFF* */
+ vnet_buffer (b)->ip.fib_index =
+ vec_elt (fib_index_by_sw_if_index, vnet_buffer (b)->sw_if_index[VLIB_RX]);
+ vnet_buffer (b)->ip.fib_index =
+ ((vnet_buffer (b)->sw_if_index[VLIB_TX] == (u32) ~ 0) ?
+ vnet_buffer (b)->ip.fib_index :
+ vnet_buffer (b)->sw_if_index[VLIB_TX]);
+ /* *INDENT-ON* */
}
-always_inline void *
-ip_interface_address_get_address (ip_lookup_main_t * lm,
- ip_interface_address_t * a)
+typedef struct _vnet_ip_container_proxy_args
{
- return mhash_key_to_mem (&lm->address_to_if_address_index, a->address_key);
-}
+ fib_prefix_t prefix;
+ u32 sw_if_index;
+ u8 is_add;
+} vnet_ip_container_proxy_args_t;
-/* *INDENT-OFF* */
-#define foreach_ip_interface_address(lm,a,sw_if_index,loop,body) \
-do { \
- vnet_main_t *_vnm = vnet_get_main(); \
- u32 _sw_if_index = sw_if_index; \
- vnet_sw_interface_t *_swif; \
- _swif = vnet_get_sw_interface (_vnm, _sw_if_index); \
- \
- /* \
- * Loop => honor unnumbered interface addressing. \
- */ \
- if (_swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED) \
- { \
- if (loop) \
- _sw_if_index = _swif->unnumbered_sw_if_index; \
- else \
- /* the interface is unnumbered, by the caller does not want \
- * unnumbered interfaces considered/honoured */ \
- break; \
- } \
- u32 _ia = ((vec_len((lm)->if_address_pool_index_by_sw_if_index) \
- > (_sw_if_index)) ? \
- vec_elt ((lm)->if_address_pool_index_by_sw_if_index, \
- (_sw_if_index)) : \
- (u32)~0); \
- ip_interface_address_t * _a; \
- while (_ia != ~0) \
- { \
- _a = pool_elt_at_index ((lm)->if_address_pool, _ia); \
- _ia = _a->next_this_sw_interface; \
- (a) = _a; \
- body; \
- } \
-} while (0)
-/* *INDENT-ON* */
+clib_error_t *vnet_ip_container_proxy_add_del (vnet_ip_container_proxy_args_t
+ * args);
+
+typedef int (*ip_container_proxy_cb_t) (const fib_prefix_t * pfx,
+ u32 sw_if_index, void *ctx);
+void ip_container_proxy_walk (ip_container_proxy_cb_t cb, void *ctx);
void ip_lookup_init (ip_lookup_main_t * lm, u32 ip_lookup_node_index);
#endif /* included_ip_lookup_h */
-
/*
* fd.io coding-style-patch-verification: ON
*