forked from Qortal/Brooklyn
b73fb8b536
* Try that punk NASA -_-
125 lines
4.0 KiB
C
125 lines
4.0 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
|
|
/* Copyright (c) 2020 Marvell International Ltd. All rights reserved. */
|
|
|
|
#ifndef _PRESTERA_ACL_H_
|
|
#define _PRESTERA_ACL_H_
|
|
|
|
enum prestera_acl_rule_match_entry_type {
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ETH_TYPE = 1,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ETH_DMAC,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ETH_SMAC,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_IP_PROTO,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_PORT,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_IP_SRC,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_IP_DST,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_SRC,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_DST,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_RANGE_SRC,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_RANGE_DST,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_VLAN_ID,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_VLAN_TPID,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ICMP_TYPE,
|
|
PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ICMP_CODE
|
|
};
|
|
|
|
enum prestera_acl_rule_action {
|
|
PRESTERA_ACL_RULE_ACTION_ACCEPT,
|
|
PRESTERA_ACL_RULE_ACTION_DROP,
|
|
PRESTERA_ACL_RULE_ACTION_TRAP
|
|
};
|
|
|
|
struct prestera_switch;
|
|
struct prestera_port;
|
|
struct prestera_acl_rule;
|
|
struct prestera_acl_ruleset;
|
|
|
|
struct prestera_flow_block_binding {
|
|
struct list_head list;
|
|
struct prestera_port *port;
|
|
int span_id;
|
|
};
|
|
|
|
struct prestera_flow_block {
|
|
struct list_head binding_list;
|
|
struct prestera_switch *sw;
|
|
struct net *net;
|
|
struct prestera_acl_ruleset *ruleset;
|
|
struct flow_block_cb *block_cb;
|
|
};
|
|
|
|
struct prestera_acl_rule_action_entry {
|
|
struct list_head list;
|
|
enum prestera_acl_rule_action id;
|
|
};
|
|
|
|
struct prestera_acl_rule_match_entry {
|
|
struct list_head list;
|
|
enum prestera_acl_rule_match_entry_type type;
|
|
union {
|
|
struct {
|
|
u8 key;
|
|
u8 mask;
|
|
} u8;
|
|
struct {
|
|
u16 key;
|
|
u16 mask;
|
|
} u16;
|
|
struct {
|
|
u32 key;
|
|
u32 mask;
|
|
} u32;
|
|
struct {
|
|
u64 key;
|
|
u64 mask;
|
|
} u64;
|
|
struct {
|
|
u8 key[ETH_ALEN];
|
|
u8 mask[ETH_ALEN];
|
|
} mac;
|
|
} keymask;
|
|
};
|
|
|
|
int prestera_acl_init(struct prestera_switch *sw);
|
|
void prestera_acl_fini(struct prestera_switch *sw);
|
|
struct prestera_flow_block *
|
|
prestera_acl_block_create(struct prestera_switch *sw, struct net *net);
|
|
void prestera_acl_block_destroy(struct prestera_flow_block *block);
|
|
struct net *prestera_acl_block_net(struct prestera_flow_block *block);
|
|
struct prestera_switch *prestera_acl_block_sw(struct prestera_flow_block *block);
|
|
int prestera_acl_block_bind(struct prestera_flow_block *block,
|
|
struct prestera_port *port);
|
|
int prestera_acl_block_unbind(struct prestera_flow_block *block,
|
|
struct prestera_port *port);
|
|
struct prestera_acl_ruleset *
|
|
prestera_acl_block_ruleset_get(struct prestera_flow_block *block);
|
|
struct prestera_acl_rule *
|
|
prestera_acl_rule_create(struct prestera_flow_block *block,
|
|
unsigned long cookie);
|
|
u32 prestera_acl_rule_priority_get(struct prestera_acl_rule *rule);
|
|
void prestera_acl_rule_priority_set(struct prestera_acl_rule *rule,
|
|
u32 priority);
|
|
u16 prestera_acl_rule_ruleset_id_get(const struct prestera_acl_rule *rule);
|
|
struct list_head *
|
|
prestera_acl_rule_action_list_get(struct prestera_acl_rule *rule);
|
|
u8 prestera_acl_rule_action_len(struct prestera_acl_rule *rule);
|
|
u8 prestera_acl_rule_match_len(struct prestera_acl_rule *rule);
|
|
int prestera_acl_rule_action_add(struct prestera_acl_rule *rule,
|
|
struct prestera_acl_rule_action_entry *entry);
|
|
struct list_head *
|
|
prestera_acl_rule_match_list_get(struct prestera_acl_rule *rule);
|
|
int prestera_acl_rule_match_add(struct prestera_acl_rule *rule,
|
|
struct prestera_acl_rule_match_entry *entry);
|
|
void prestera_acl_rule_destroy(struct prestera_acl_rule *rule);
|
|
struct prestera_acl_rule *
|
|
prestera_acl_rule_lookup(struct prestera_acl_ruleset *ruleset,
|
|
unsigned long cookie);
|
|
int prestera_acl_rule_add(struct prestera_switch *sw,
|
|
struct prestera_acl_rule *rule);
|
|
void prestera_acl_rule_del(struct prestera_switch *sw,
|
|
struct prestera_acl_rule *rule);
|
|
int prestera_acl_rule_get_stats(struct prestera_switch *sw,
|
|
struct prestera_acl_rule *rule,
|
|
u64 *packets, u64 *bytes, u64 *last_use);
|
|
|
|
#endif /* _PRESTERA_ACL_H_ */
|