From 1cbcdb8fcb732940e98283212af7315463fefe82 Mon Sep 17 00:00:00 2001 From: Selvam Sathappan Periakaruppan Date: Thu, 24 Feb 2022 21:39:40 +0530 Subject: [PATCH] drivers: net: ipq9574: Add src_mac drop acl This patch adds ACL to drop the packets with src mac address. Change-Id: Ib944154ffb53b9bf67a178a5ab08cd9f12866b4a Signed-off-by: Selvam Sathappan Periakaruppan --- drivers/net/ipq9574/ipq9574_edma.c | 13 ++++++++++ drivers/net/ipq9574/ipq9574_ppe.c | 39 ++++++++++++++++++------------ drivers/net/ipq9574/ipq9574_ppe.h | 11 ++++++--- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/drivers/net/ipq9574/ipq9574_edma.c b/drivers/net/ipq9574/ipq9574_edma.c index 9bac612be2..b92d85e93b 100644 --- a/drivers/net/ipq9574/ipq9574_edma.c +++ b/drivers/net/ipq9574/ipq9574_edma.c @@ -1873,6 +1873,8 @@ void get_phy_address(int offset) int ipq9574_edma_init(void *edma_board_cfg) { struct eth_device *dev[IPQ9574_EDMA_DEV]; + char octets[16]; + int field0, field1; struct ipq9574_edma_common_info *c_info[IPQ9574_EDMA_DEV]; struct ipq9574_edma_hw *hw[IPQ9574_EDMA_DEV]; uchar enet_addr[IPQ9574_EDMA_DEV * 6]; @@ -1976,6 +1978,17 @@ int ipq9574_edma_init(void *edma_board_cfg) dev[i]->enetaddr[4], dev[i]->enetaddr[5]); + snprintf(octets, sizeof(octets), "%x%x", + dev[i]->enetaddr[0], dev[i]->enetaddr[1]); + field0 = simple_strtoul(octets, NULL, 16); + snprintf(octets, sizeof(octets), "%x%x%x%x", + dev[i]->enetaddr[2], dev[i]->enetaddr[3], + dev[i]->enetaddr[4], dev[i]->enetaddr[5]); + field1 = simple_strtoul(octets, NULL, 16); + + /* Drop packets with DUT's mac addr */ + ipq9574_ppe_acl_set(4, 0x1, field0, field1, 0xffffffff, 0x0, 0x1); + snprintf(dev[i]->name, sizeof(dev[i]->name), "eth%d", i); ipq9574_edma_dev[i]->dev = dev[i]; diff --git a/drivers/net/ipq9574/ipq9574_ppe.c b/drivers/net/ipq9574/ipq9574_ppe.c index 5a46958b3f..05dc831760 100644 --- a/drivers/net/ipq9574/ipq9574_ppe.c +++ b/drivers/net/ipq9574/ipq9574_ppe.c @@ -81,7 +81,7 @@ void ppe_ipo_action_set(union ipo_action_u *hw_act, int rule_id) } } -void ipq9574_ppe_acl_set(int rule_id, int rule_type, int pkt_type, int l4_port_no, int l4_port_mask, int permit, int deny) +void ipq9574_ppe_acl_set(int rule_id, int rule_type, int field0, int field1, int mask, int permit, int deny) { union ipo_rule_reg_u hw_reg = {0}; union ipo_mask_reg_u hw_mask = {0}; @@ -92,30 +92,37 @@ void ipq9574_ppe_acl_set(int rule_id, int rule_type, int pkt_type, int l4_port_n memset(&hw_act, 0, sizeof(hw_act)); if (rule_id < MAX_RULE) { + hw_act.bf.dest_info_change_en = 1; + hw_mask.bf.maskfield_0 = mask; + hw_reg.bf.rule_type = rule_type; if (rule_type == ADPT_ACL_HPPE_IPV4_DIP_RULE) { - hw_reg.bf.rule_type = ADPT_ACL_HPPE_IPV4_DIP_RULE; - hw_reg.bf.rule_field_0 = l4_port_no; - hw_reg.bf.rule_field_1 = pkt_type<<17; - hw_mask.bf.maskfield_0 = l4_port_mask; + hw_reg.bf.rule_field_0 = field1; + hw_reg.bf.rule_field_1 = field0<<17; hw_mask.bf.maskfield_1 = 7<<17; if (permit == 0x0) { - hw_act.bf.dest_info_change_en = 1; - hw_act.bf.fwd_cmd = 0;/*forward*/ + hw_act.bf.fwd_cmd = 0;/* forward */ hw_reg.bf.pri = 0x1; } - if (deny == 0x1) { - hw_act.bf.dest_info_change_en = 1; - hw_act.bf.fwd_cmd = 1;/*drop*/ + hw_act.bf.fwd_cmd = 1;/* drop */ hw_reg.bf.pri = 0x0; - } - hw_reg.bf.src_0 = 0x0; - hw_reg.bf.src_1 = 0x3f; - ppe_ipo_rule_reg_set(&hw_reg, rule_id); - ppe_ipo_mask_reg_set(&hw_mask, rule_id); - ppe_ipo_action_set(&hw_act, rule_id); + } else if (rule_type == ADPT_ACL_HPPE_MAC_SA_RULE) { + /* src mac AC rule */ + hw_reg.bf.rule_field_0 = field1; + hw_reg.bf.rule_field_1 = field0; + hw_mask.bf.maskfield_1 = 0xffff; + hw_act.bf.fwd_cmd = 1;/* drop */ + hw_reg.bf.pri = 0x2; + /* bypass fdb lean and fdb freash */ + hw_act.bf.bypass_bitmap_0 = 0x1800; } + /* bind port1-port6 */ + hw_reg.bf.src_0 = 0x0; + hw_reg.bf.src_1 = 0x3F; + ppe_ipo_rule_reg_set(&hw_reg, rule_id); + ppe_ipo_mask_reg_set(&hw_mask, rule_id); + ppe_ipo_action_set(&hw_act, rule_id); } } diff --git a/drivers/net/ipq9574/ipq9574_ppe.h b/drivers/net/ipq9574/ipq9574_ppe.h index 74f48c5062..7fecd3ba90 100644 --- a/drivers/net/ipq9574/ipq9574_ppe.h +++ b/drivers/net/ipq9574/ipq9574_ppe.h @@ -68,8 +68,9 @@ enum { UDP_PKT, }; -#define ADPT_ACL_HPPE_IPV4_DIP_RULE 4 -#define MAX_RULE 512 +#define ADPT_ACL_HPPE_IPV4_DIP_RULE 4 +#define ADPT_ACL_HPPE_MAC_SA_RULE 1 +#define MAX_RULE 512 struct ipo_rule_reg { uint32_t rule_field_0:32; @@ -106,8 +107,10 @@ union ipo_mask_reg_u { struct ipo_action { uint32_t dest_info_change_en:1; uint32_t fwd_cmd:2; - uint32_t _reserved0:29; - uint32_t _reserved1:32; + uint32_t _reserved0:15; + uint32_t bypass_bitmap_0:14; + uint32_t bypass_bitmap_1:18; + uint32_t _reserved1:14; uint32_t _reserved2:32; uint32_t _reserved3:32; uint32_t _reserved4:32;