FD.io VPP  v17.01.1-3-gc6833f8
Vector Packet Processing
acl.c File Reference
+ Include dependency graph for acl.c:

Go to the source code of this file.

Data Structures

struct  macip_match_type_t
 

Macros

#define vl_typedefs
 
#define vl_endianfun
 
#define vl_print(handle, ...)   vlib_cli_output (handle, __VA_ARGS__)
 
#define vl_printfun
 
#define vl_api_version(n, v)   static u32 api_version=(v);
 
#define REPLY_MACRO(t)
 
#define REPLY_MACRO2(t, body)
 
#define REPLY_MACRO3(t, n, body)
 
#define foreach_acl_plugin_api_msg
 
#define XX   "\377"
 
#define v
 
#define vl_msg_name_crc_list
 

Functions

clib_error_tvlib_plugin_register (vlib_main_t *vm, vnet_plugin_handoff_t *h, int from_early_init)
 
static void vl_api_acl_plugin_get_version_t_handler (vl_api_acl_plugin_get_version_t *mp)
 
static int acl_add_list (u32 count, vl_api_acl_rule_t rules[], u32 *acl_list_index, u8 *tag)
 
static int acl_del_list (u32 acl_list_index)
 
static int count_skip (u8 *p, u32 size)
 
static int acl_classify_add_del_table_big (vnet_classify_main_t *cm, u8 *mask, u32 mask_len, u32 next_table_index, u32 miss_next_index, u32 *table_index, int is_add)
 
static int acl_classify_add_del_table_small (vnet_classify_main_t *cm, u8 *mask, u32 mask_len, u32 next_table_index, u32 miss_next_index, u32 *table_index, int is_add)
 
static int acl_unhook_l2_input_classify (acl_main_t *am, u32 sw_if_index)
 
static int acl_unhook_l2_output_classify (acl_main_t *am, u32 sw_if_index)
 
static int acl_hook_l2_input_classify (acl_main_t *am, u32 sw_if_index)
 
static int acl_hook_l2_output_classify (acl_main_t *am, u32 sw_if_index)
 
int acl_interface_in_enable_disable (acl_main_t *am, u32 sw_if_index, int enable_disable)
 
int acl_interface_out_enable_disable (acl_main_t *am, u32 sw_if_index, int enable_disable)
 
static int acl_interface_add_inout_acl (u32 sw_if_index, u8 is_input, u32 acl_list_index)
 
static int acl_interface_del_inout_acl (u32 sw_if_index, u8 is_input, u32 acl_list_index)
 
static void acl_interface_reset_inout_acls (u32 sw_if_index, u8 is_input)
 
static int acl_interface_add_del_inout_acl (u32 sw_if_index, u8 is_add, u8 is_input, u32 acl_list_index)
 
static void * get_ptr_to_offset (vlib_buffer_t *b0, int offset)
 
static u8 acl_get_l4_proto (vlib_buffer_t *b0, int node_is_ip6)
 
static int acl_match_addr (ip46_address_t *addr1, ip46_address_t *addr2, int prefixlen, int is_ip6)
 
static int acl_match_port (u16 port, u16 port_first, u16 port_last, int is_ip6)
 
static int acl_packet_match (acl_main_t *am, u32 acl_index, vlib_buffer_t *b0, u8 *r_action, int *r_is_ip6, u32 *r_acl_match_p, u32 *r_rule_match_p, u32 *trace_bitmap)
 
void input_acl_packet_match (u32 sw_if_index, vlib_buffer_t *b0, u32 *nextp, u32 *acl_match_p, u32 *rule_match_p, u32 *trace_bitmap)
 
void output_acl_packet_match (u32 sw_if_index, vlib_buffer_t *b0, u32 *nextp, u32 *acl_match_p, u32 *rule_match_p, u32 *trace_bitmap)
 
static u32 macip_find_match_type (macip_match_type_t *mv, u8 *mac_mask, u8 prefix_len, u8 is_ipv6)
 
static int match_type_metric (macip_match_type_t *m)
 
static int match_type_compare (macip_match_type_t *m1, macip_match_type_t *m2)
 
static int get_l3_src_offset (int is6)
 
static int macip_create_classify_tables (acl_main_t *am, u32 macip_acl_index)
 
static void macip_destroy_classify_tables (acl_main_t *am, u32 macip_acl_index)
 
static int macip_acl_add_list (u32 count, vl_api_macip_acl_rule_t rules[], u32 *acl_list_index, u8 *tag)
 
static int macip_acl_interface_del_acl (acl_main_t *am, u32 sw_if_index)
 
static int macip_acl_interface_add_acl (acl_main_t *am, u32 sw_if_index, u32 macip_acl_index)
 
static int macip_acl_del_list (u32 acl_list_index)
 
static int macip_acl_interface_add_del_acl (u32 sw_if_index, u8 is_add, u32 acl_list_index)
 
static void vl_api_acl_add_replace_t_handler (vl_api_acl_add_replace_t *mp)
 
static void vl_api_acl_del_t_handler (vl_api_acl_del_t *mp)
 
static void vl_api_acl_interface_add_del_t_handler (vl_api_acl_interface_add_del_t *mp)
 
static void vl_api_acl_interface_set_acl_list_t_handler (vl_api_acl_interface_set_acl_list_t *mp)
 
static void copy_acl_rule_to_api_rule (vl_api_acl_rule_t *api_rule, acl_rule_t *r)
 
static void send_acl_details (acl_main_t *am, unix_shared_memory_queue_t *q, acl_list_t *acl, u32 context)
 
static void vl_api_acl_dump_t_handler (vl_api_acl_dump_t *mp)
 
static void send_acl_interface_list_details (acl_main_t *am, unix_shared_memory_queue_t *q, u32 sw_if_index, u32 context)
 
static void vl_api_acl_interface_list_dump_t_handler (vl_api_acl_interface_list_dump_t *mp)
 
static void vl_api_macip_acl_add_t_handler (vl_api_macip_acl_add_t *mp)
 
static void vl_api_macip_acl_del_t_handler (vl_api_macip_acl_del_t *mp)
 
static void vl_api_macip_acl_interface_add_del_t_handler (vl_api_macip_acl_interface_add_del_t *mp)
 
static void send_macip_acl_details (acl_main_t *am, unix_shared_memory_queue_t *q, macip_acl_list_t *acl, u32 context)
 
static void vl_api_macip_acl_dump_t_handler (vl_api_macip_acl_dump_t *mp)
 
static void vl_api_macip_acl_interface_get_t_handler (vl_api_macip_acl_interface_get_t *mp)
 
static clib_error_tacl_plugin_api_hookup (vlib_main_t *vm)
 
static void setup_message_id_table (acl_main_t *sm, api_main_t *am)
 
u32 register_match_action_nexts (u32 next_in_ip4, u32 next_in_ip6, u32 next_out_ip4, u32 next_out_ip6)
 
void acl_setup_nodes (void)
 
static clib_error_tacl_init (vlib_main_t *vm)
 

Variables

acl_main_t acl_main
 
u8 ip4_5tuple_mask []
 
u8 ip6_5tuple_mask []
 

Macro Definition Documentation

#define foreach_acl_plugin_api_msg
Value:
_(ACL_PLUGIN_GET_VERSION, acl_plugin_get_version) \
_(ACL_ADD_REPLACE, acl_add_replace) \
_(ACL_DEL, acl_del) \
_(ACL_INTERFACE_ADD_DEL, acl_interface_add_del) \
_(ACL_INTERFACE_SET_ACL_LIST, acl_interface_set_acl_list) \
_(ACL_DUMP, acl_dump) \
_(ACL_INTERFACE_LIST_DUMP, acl_interface_list_dump) \
_(MACIP_ACL_ADD, macip_acl_add) \
_(MACIP_ACL_DEL, macip_acl_del) \
_(MACIP_ACL_INTERFACE_ADD_DEL, macip_acl_interface_add_del) \
_(MACIP_ACL_DUMP, macip_acl_dump) \
_(MACIP_ACL_INTERFACE_GET, macip_acl_interface_get)

Definition at line 117 of file acl.c.

#define REPLY_MACRO (   t)
Value:
do { \
if (!q) \
return; \
\
rmp = vl_msg_api_alloc (sizeof (*rmp)); \
rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
rmp->context = mp->context; \
rmp->retval = ntohl(rv); \
vl_msg_api_send_shmem (q, (u8 *)&rmp); \
} while(0);
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
void * vl_msg_api_alloc(int nbytes)
unsigned char u8
Definition: types.h:56
struct _unix_shared_memory_queue unix_shared_memory_queue_t

Definition at line 67 of file acl.c.

#define REPLY_MACRO2 (   t,
  body 
)
Value:
do { \
rv = vl_msg_api_pd_handler (mp, rv); \
q = vl_api_client_index_to_input_queue (mp->client_index); \
if (!q) \
return; \
\
rmp = vl_msg_api_alloc (sizeof (*rmp)); \
rmp->_vl_msg_id = ntohs((t)+am->msg_id_base); \
rmp->context = mp->context; \
rmp->retval = ntohl(rv); \
do {body;} while (0); \
vl_msg_api_send_shmem (q, (u8 *)&rmp); \
} while(0);
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
void * vl_msg_api_alloc(int nbytes)
int vl_msg_api_pd_handler(void *mp, int rv)
Definition: api_shared.c:1280
unsigned char u8
Definition: types.h:56
struct _unix_shared_memory_queue unix_shared_memory_queue_t

Definition at line 82 of file acl.c.

#define REPLY_MACRO3 (   t,
  n,
  body 
)
Value:
do { \
rv = vl_msg_api_pd_handler (mp, rv); \
q = vl_api_client_index_to_input_queue (mp->client_index); \
if (!q) \
return; \
\
rmp = vl_msg_api_alloc (sizeof (*rmp) + n); \
rmp->_vl_msg_id = ntohs((t)+am->msg_id_base); \
rmp->context = mp->context; \
rmp->retval = ntohl(rv); \
do {body;} while (0); \
vl_msg_api_send_shmem (q, (u8 *)&rmp); \
} while(0);
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
void * vl_msg_api_alloc(int nbytes)
int vl_msg_api_pd_handler(void *mp, int rv)
Definition: api_shared.c:1280
unsigned char u8
Definition: types.h:56
struct _unix_shared_memory_queue unix_shared_memory_queue_t

Definition at line 98 of file acl.c.

#define v

Definition at line 314 of file acl.c.

#define vl_api_version (   n,
  v 
)    static u32 api_version=(v);

Definition at line 50 of file acl.c.

#define vl_endianfun

Definition at line 39 of file acl.c.

#define vl_msg_name_crc_list

Definition at line 1854 of file acl.c.

#define vl_print (   handle,
  ... 
)    vlib_cli_output (handle, __VA_ARGS__)

Definition at line 44 of file acl.c.

#define vl_printfun

Definition at line 45 of file acl.c.

#define vl_typedefs

Definition at line 34 of file acl.c.

#define XX   "\377"

Definition at line 311 of file acl.c.

Function Documentation

static int acl_add_list ( u32  count,
vl_api_acl_rule_t  rules[],
u32 acl_list_index,
u8 tag 
)
static

Definition at line 182 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_classify_add_del_table_big ( vnet_classify_main_t cm,
u8 mask,
u32  mask_len,
u32  next_table_index,
u32  miss_next_index,
u32 table_index,
int  is_add 
)
static

Definition at line 384 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_classify_add_del_table_small ( vnet_classify_main_t cm,
u8 mask,
u32  mask_len,
u32  next_table_index,
u32  miss_next_index,
u32 table_index,
int  is_add 
)
static

Definition at line 409 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_del_list ( u32  acl_list_index)
static

Definition at line 258 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8 acl_get_l4_proto ( vlib_buffer_t b0,
int  node_is_ip6 
)
static

Definition at line 787 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_hook_l2_input_classify ( acl_main_t am,
u32  sw_if_index 
)
static

Definition at line 511 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_hook_l2_output_classify ( acl_main_t am,
u32  sw_if_index 
)
static

Definition at line 569 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* acl_init ( vlib_main_t vm)
static

Definition at line 1925 of file acl.c.

+ Here is the call graph for this function:

static int acl_interface_add_del_inout_acl ( u32  sw_if_index,
u8  is_add,
u8  is_input,
u32  acl_list_index 
)
static

Definition at line 761 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_interface_add_inout_acl ( u32  sw_if_index,
u8  is_input,
u32  acl_list_index 
)
static

Definition at line 675 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_interface_del_inout_acl ( u32  sw_if_index,
u8  is_input,
u32  acl_list_index 
)
static

Definition at line 696 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int acl_interface_in_enable_disable ( acl_main_t am,
u32  sw_if_index,
int  enable_disable 
)

Definition at line 628 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int acl_interface_out_enable_disable ( acl_main_t am,
u32  sw_if_index,
int  enable_disable 
)

Definition at line 651 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void acl_interface_reset_inout_acls ( u32  sw_if_index,
u8  is_input 
)
static

Definition at line 743 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_match_addr ( ip46_address_t *  addr1,
ip46_address_t *  addr2,
int  prefixlen,
int  is_ip6 
)
static

Definition at line 804 of file acl.c.

+ Here is the caller graph for this function:

static int acl_match_port ( u16  port,
u16  port_first,
u16  port_last,
int  is_ip6 
)
static

Definition at line 842 of file acl.c.

+ Here is the caller graph for this function:

static int acl_packet_match ( acl_main_t am,
u32  acl_index,
vlib_buffer_t b0,
u8 r_action,
int *  r_is_ip6,
u32 r_acl_match_p,
u32 r_rule_match_p,
u32 trace_bitmap 
)
static

Definition at line 848 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* acl_plugin_api_hookup ( vlib_main_t vm)
static

Definition at line 1837 of file acl.c.

+ Here is the caller graph for this function:

void acl_setup_nodes ( void  )

Definition at line 1886 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_unhook_l2_input_classify ( acl_main_t am,
u32  sw_if_index 
)
static

Definition at line 435 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int acl_unhook_l2_output_classify ( acl_main_t am,
u32  sw_if_index 
)
static

Definition at line 473 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void copy_acl_rule_to_api_rule ( vl_api_acl_rule_t api_rule,
acl_rule_t r 
)
static

Definition at line 1488 of file acl.c.

+ Here is the caller graph for this function:

static int count_skip ( u8 p,
u32  size 
)
static

Definition at line 369 of file acl.c.

+ Here is the caller graph for this function:

static int get_l3_src_offset ( int  is6)
static

Definition at line 1088 of file acl.c.

+ Here is the caller graph for this function:

static void* get_ptr_to_offset ( vlib_buffer_t b0,
int  offset 
)
static

Definition at line 780 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void input_acl_packet_match ( u32  sw_if_index,
vlib_buffer_t b0,
u32 nextp,
u32 acl_match_p,
u32 rule_match_p,
u32 trace_bitmap 
)

Definition at line 970 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int macip_acl_add_list ( u32  count,
vl_api_macip_acl_rule_t  rules[],
u32 acl_list_index,
u8 tag 
)
static

Definition at line 1261 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int macip_acl_del_list ( u32  acl_list_index)
static

Definition at line 1359 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int macip_acl_interface_add_acl ( acl_main_t am,
u32  sw_if_index,
u32  macip_acl_index 
)
static

Definition at line 1336 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int macip_acl_interface_add_del_acl ( u32  sw_if_index,
u8  is_add,
u32  acl_list_index 
)
static

Definition at line 1393 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int macip_acl_interface_del_acl ( acl_main_t am,
u32  sw_if_index 
)
static

Definition at line 1313 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int macip_create_classify_tables ( acl_main_t am,
u32  macip_acl_index 
)
static

Definition at line 1097 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void macip_destroy_classify_tables ( acl_main_t am,
u32  macip_acl_index 
)
static

Definition at line 1238 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u32 macip_find_match_type ( macip_match_type_t mv,
u8 mac_mask,
u8  prefix_len,
u8  is_ipv6 
)
static

Definition at line 1051 of file acl.c.

+ Here is the caller graph for this function:

static int match_type_compare ( macip_match_type_t m1,
macip_match_type_t m2 
)
static

Definition at line 1080 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int match_type_metric ( macip_match_type_t m)
static

Definition at line 1073 of file acl.c.

+ Here is the caller graph for this function:

void output_acl_packet_match ( u32  sw_if_index,
vlib_buffer_t b0,
u32 nextp,
u32 acl_match_p,
u32 rule_match_p,
u32 trace_bitmap 
)

Definition at line 1006 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u32 register_match_action_nexts ( u32  next_in_ip4,
u32  next_in_ip6,
u32  next_out_ip4,
u32  next_out_ip6 
)

Definition at line 1868 of file acl.c.

+ Here is the caller graph for this function:

static void send_acl_details ( acl_main_t am,
unix_shared_memory_queue_t q,
acl_list_t acl,
u32  context 
)
static

Definition at line 1514 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void send_acl_interface_list_details ( acl_main_t am,
unix_shared_memory_queue_t q,
u32  sw_if_index,
u32  context 
)
static

Definition at line 1587 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void send_macip_acl_details ( acl_main_t am,
unix_shared_memory_queue_t q,
macip_acl_list_t acl,
u32  context 
)
static

Definition at line 1719 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void setup_message_id_table ( acl_main_t sm,
api_main_t am 
)
static

Definition at line 1859 of file acl.c.

+ Here is the caller graph for this function:

static void vl_api_acl_add_replace_t_handler ( vl_api_acl_add_replace_t mp)
static

Definition at line 1411 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_acl_del_t_handler ( vl_api_acl_del_t mp)
static

Definition at line 1429 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_acl_dump_t_handler ( vl_api_acl_dump_t mp)
static

Definition at line 1544 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_acl_interface_add_del_t_handler ( vl_api_acl_interface_add_del_t mp)
static

Definition at line 1441 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_acl_interface_list_dump_t_handler ( vl_api_acl_interface_list_dump_t mp)
static

Definition at line 1632 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_acl_interface_set_acl_list_t_handler ( vl_api_acl_interface_set_acl_list_t mp)
static

Definition at line 1461 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void vl_api_acl_plugin_get_version_t_handler ( vl_api_acl_plugin_get_version_t mp)
static

Definition at line 156 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_macip_acl_add_t_handler ( vl_api_macip_acl_add_t mp)
static

Definition at line 1668 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_macip_acl_del_t_handler ( vl_api_macip_acl_del_t mp)
static

Definition at line 1687 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_macip_acl_dump_t_handler ( vl_api_macip_acl_dump_t mp)
static

Definition at line 1769 of file acl.c.

+ Here is the call graph for this function:

static void vl_api_macip_acl_interface_add_del_t_handler ( vl_api_macip_acl_interface_add_del_t mp)
static

Definition at line 1700 of file acl.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void vl_api_macip_acl_interface_get_t_handler ( vl_api_macip_acl_interface_get_t mp)
static

Definition at line 1805 of file acl.c.

+ Here is the call graph for this function:

clib_error_t* vlib_plugin_register ( vlib_main_t vm,
vnet_plugin_handoff_t h,
int  from_early_init 
)

Definition at line 139 of file acl.c.

+ Here is the call graph for this function:

Variable Documentation

acl_main_t acl_main

Definition at line 57 of file acl.c.

u8 ip4_5tuple_mask[]
Initial value:
=
_(" dmac smac etype ")
_(ether) __ __ __ __ __ __ v __ __ __ __ __ __ v __ __ v
_(" v ihl totlen ")
_(0x0000)
__ __ __ __
_(" ident fl+fo ")
_(0x0004)
__ __ __ __
_(" ttl pr checksum ")
_(0x0008)
__ XX __ __
_(" src address ")
_(0x000C)
_(" dst address ")
_(0x0010)
_("L4 T/U sport dport ")
_(tcpudp)
_(padpad)
__ __ __ __
_(padpad)
__ __ __ __
_(padeth)
__ __
#define v
Definition: acl.c:314
#define XX
Definition: acl.c:311

Definition at line 316 of file acl.c.

u8 ip6_5tuple_mask[]
Initial value:
=
_(" dmac smac etype ")
_(ether) __ __ __ __ __ __ v __ __ __ __ __ __ v __ __ v
_(" v tc + flow ")
_(0x0000) __ __ __ __
_(" plen nh hl ")
_(0x0004) __ __ XX __
_(" src address ")
_(0x0008) XX XX XX XX
_(0x000C) XX XX XX XX
_(0x0010) XX XX XX XX
_(0x0014) XX XX XX XX
_(" dst address ")
_(0x0018) XX XX XX XX
_(0x001C) XX XX XX XX
_(0x0020) XX XX XX XX
_(0x0024) XX XX XX XX
_("L4T/U sport dport ")
_(tcpudp) XX XX XX XX _(padpad) __ __ __ __ _(padeth) __ __
#define v
Definition: acl.c:314
#define XX
Definition: acl.c:311

Definition at line 344 of file acl.c.