52 f->
index = *flow_index;
75 return VNET_FLOW_ERROR_NO_SUCH_ENTRY;
80 vnet_flow_disable (vnm, flow_index, hw_if_index);
85 memset (f, 0,
sizeof (*f));
100 return VNET_FLOW_ERROR_NO_SUCH_INTERFACE;
104 return VNET_FLOW_ERROR_ALREADY_DONE;
109 if (dev_class->flow_ops_function == 0)
110 return VNET_FLOW_ERROR_NOT_SUPPORTED;
112 if (f->
actions & VNET_FLOW_ACTION_REDIRECT_TO_NODE)
141 return VNET_FLOW_ERROR_NO_SUCH_INTERFACE;
145 return VNET_FLOW_ERROR_ALREADY_DONE;
#define hash_set(h, key, value)
int vnet_flow_get_range(vnet_main_t *vnm, char *owner, u32 count, u32 *start)
#define hash_unset(h, key)
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
vnet_flow_t * global_flow_pool
struct _vnet_device_class vnet_device_class_t
int vnet_flow_disable(vnet_main_t *vnm, u32 flow_index, u32 hw_if_index)
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
static vnet_device_class_t * vnet_get_device_class(vnet_main_t *vnm, u32 dev_class_index)
#define hash_foreach(key_var, value_var, h, body)
vnet_flow_main_t flow_main
vnet_flow_range_t * ranges
int vnet_flow_del(vnet_main_t *vnm, u32 flow_index)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
#define pool_put(P, E)
Free an object E in pool P.
vnet_flow_t * vnet_get_flow(u32 flow_index)
#define clib_memcpy(a, b, c)
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
static uword vnet_hw_interface_is_valid(vnet_main_t *vnm, u32 hw_if_index)
int vnet_flow_add(vnet_main_t *vnm, vnet_flow_t *flow, u32 *flow_index)
int vnet_flow_enable(vnet_main_t *vnm, u32 flow_index, u32 hw_if_index)
u32 redirect_device_input_next_index