1 /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 /* Microsemi Ocelot Switch driver 3 * Copyright (c) 2019 Microsemi Corporation 4 */ 5 6 #ifndef _MSCC_OCELOT_ACE_H_ 7 #define _MSCC_OCELOT_ACE_H_ 8 9 #include "ocelot.h" 10 #include <net/sch_generic.h> 11 #include <net/pkt_cls.h> 12 13 struct ocelot_ipv4 { 14 u8 addr[4]; 15 }; 16 17 enum ocelot_vcap_bit { 18 OCELOT_VCAP_BIT_ANY, 19 OCELOT_VCAP_BIT_0, 20 OCELOT_VCAP_BIT_1 21 }; 22 23 struct ocelot_vcap_u8 { 24 u8 value[1]; 25 u8 mask[1]; 26 }; 27 28 struct ocelot_vcap_u16 { 29 u8 value[2]; 30 u8 mask[2]; 31 }; 32 33 struct ocelot_vcap_u24 { 34 u8 value[3]; 35 u8 mask[3]; 36 }; 37 38 struct ocelot_vcap_u32 { 39 u8 value[4]; 40 u8 mask[4]; 41 }; 42 43 struct ocelot_vcap_u40 { 44 u8 value[5]; 45 u8 mask[5]; 46 }; 47 48 struct ocelot_vcap_u48 { 49 u8 value[6]; 50 u8 mask[6]; 51 }; 52 53 struct ocelot_vcap_u64 { 54 u8 value[8]; 55 u8 mask[8]; 56 }; 57 58 struct ocelot_vcap_u128 { 59 u8 value[16]; 60 u8 mask[16]; 61 }; 62 63 struct ocelot_vcap_vid { 64 u16 value; 65 u16 mask; 66 }; 67 68 struct ocelot_vcap_ipv4 { 69 struct ocelot_ipv4 value; 70 struct ocelot_ipv4 mask; 71 }; 72 73 struct ocelot_vcap_udp_tcp { 74 u16 value; 75 u16 mask; 76 }; 77 78 enum ocelot_ace_type { 79 OCELOT_ACE_TYPE_ANY, 80 OCELOT_ACE_TYPE_ETYPE, 81 OCELOT_ACE_TYPE_LLC, 82 OCELOT_ACE_TYPE_SNAP, 83 OCELOT_ACE_TYPE_ARP, 84 OCELOT_ACE_TYPE_IPV4, 85 OCELOT_ACE_TYPE_IPV6 86 }; 87 88 struct ocelot_ace_vlan { 89 struct ocelot_vcap_vid vid; /* VLAN ID (12 bit) */ 90 struct ocelot_vcap_u8 pcp; /* PCP (3 bit) */ 91 enum ocelot_vcap_bit dei; /* DEI */ 92 enum ocelot_vcap_bit tagged; /* Tagged/untagged frame */ 93 }; 94 95 struct ocelot_ace_frame_etype { 96 struct ocelot_vcap_u48 dmac; 97 struct ocelot_vcap_u48 smac; 98 struct ocelot_vcap_u16 etype; 99 struct ocelot_vcap_u16 data; /* MAC data */ 100 }; 101 102 struct ocelot_ace_frame_llc { 103 struct ocelot_vcap_u48 dmac; 104 struct ocelot_vcap_u48 smac; 105 106 /* LLC header: DSAP at byte 0, SSAP at byte 1, Control at byte 2 */ 107 struct ocelot_vcap_u32 llc; 108 }; 109 110 struct ocelot_ace_frame_snap { 111 struct ocelot_vcap_u48 dmac; 112 struct ocelot_vcap_u48 smac; 113 114 /* SNAP header: Organization Code at byte 0, Type at byte 3 */ 115 struct ocelot_vcap_u40 snap; 116 }; 117 118 struct ocelot_ace_frame_arp { 119 struct ocelot_vcap_u48 smac; 120 enum ocelot_vcap_bit arp; /* Opcode ARP/RARP */ 121 enum ocelot_vcap_bit req; /* Opcode request/reply */ 122 enum ocelot_vcap_bit unknown; /* Opcode unknown */ 123 enum ocelot_vcap_bit smac_match; /* Sender MAC matches SMAC */ 124 enum ocelot_vcap_bit dmac_match; /* Target MAC matches DMAC */ 125 126 /**< Protocol addr. length 4, hardware length 6 */ 127 enum ocelot_vcap_bit length; 128 129 enum ocelot_vcap_bit ip; /* Protocol address type IP */ 130 enum ocelot_vcap_bit ethernet; /* Hardware address type Ethernet */ 131 struct ocelot_vcap_ipv4 sip; /* Sender IP address */ 132 struct ocelot_vcap_ipv4 dip; /* Target IP address */ 133 }; 134 135 struct ocelot_ace_frame_ipv4 { 136 enum ocelot_vcap_bit ttl; /* TTL zero */ 137 enum ocelot_vcap_bit fragment; /* Fragment */ 138 enum ocelot_vcap_bit options; /* Header options */ 139 struct ocelot_vcap_u8 ds; 140 struct ocelot_vcap_u8 proto; /* Protocol */ 141 struct ocelot_vcap_ipv4 sip; /* Source IP address */ 142 struct ocelot_vcap_ipv4 dip; /* Destination IP address */ 143 struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */ 144 struct ocelot_vcap_udp_tcp sport; /* UDP/TCP: Source port */ 145 struct ocelot_vcap_udp_tcp dport; /* UDP/TCP: Destination port */ 146 enum ocelot_vcap_bit tcp_fin; 147 enum ocelot_vcap_bit tcp_syn; 148 enum ocelot_vcap_bit tcp_rst; 149 enum ocelot_vcap_bit tcp_psh; 150 enum ocelot_vcap_bit tcp_ack; 151 enum ocelot_vcap_bit tcp_urg; 152 enum ocelot_vcap_bit sip_eq_dip; /* SIP equals DIP */ 153 enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT */ 154 enum ocelot_vcap_bit seq_zero; /* TCP sequence number is zero */ 155 }; 156 157 struct ocelot_ace_frame_ipv6 { 158 struct ocelot_vcap_u8 proto; /* IPv6 protocol */ 159 struct ocelot_vcap_u128 sip; /* IPv6 source (byte 0-7 ignored) */ 160 enum ocelot_vcap_bit ttl; /* TTL zero */ 161 struct ocelot_vcap_u8 ds; 162 struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */ 163 struct ocelot_vcap_udp_tcp sport; 164 struct ocelot_vcap_udp_tcp dport; 165 enum ocelot_vcap_bit tcp_fin; 166 enum ocelot_vcap_bit tcp_syn; 167 enum ocelot_vcap_bit tcp_rst; 168 enum ocelot_vcap_bit tcp_psh; 169 enum ocelot_vcap_bit tcp_ack; 170 enum ocelot_vcap_bit tcp_urg; 171 enum ocelot_vcap_bit sip_eq_dip; /* SIP equals DIP */ 172 enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT */ 173 enum ocelot_vcap_bit seq_zero; /* TCP sequence number is zero */ 174 }; 175 176 enum ocelot_ace_action { 177 OCELOT_ACL_ACTION_DROP, 178 OCELOT_ACL_ACTION_TRAP, 179 }; 180 181 struct ocelot_ace_stats { 182 u64 bytes; 183 u64 pkts; 184 u64 used; 185 }; 186 187 struct ocelot_ace_rule { 188 struct list_head list; 189 struct ocelot_port *port; 190 191 u16 prio; 192 u32 id; 193 194 enum ocelot_ace_action action; 195 struct ocelot_ace_stats stats; 196 int chip_port; 197 198 enum ocelot_vcap_bit dmac_mc; 199 enum ocelot_vcap_bit dmac_bc; 200 struct ocelot_ace_vlan vlan; 201 202 enum ocelot_ace_type type; 203 union { 204 /* ocelot_ACE_TYPE_ANY: No specific fields */ 205 struct ocelot_ace_frame_etype etype; 206 struct ocelot_ace_frame_llc llc; 207 struct ocelot_ace_frame_snap snap; 208 struct ocelot_ace_frame_arp arp; 209 struct ocelot_ace_frame_ipv4 ipv4; 210 struct ocelot_ace_frame_ipv6 ipv6; 211 } frame; 212 }; 213 214 struct ocelot_acl_block { 215 struct list_head rules; 216 struct ocelot *ocelot; 217 int count; 218 }; 219 220 int ocelot_ace_rule_offload_add(struct ocelot_ace_rule *rule); 221 int ocelot_ace_rule_offload_del(struct ocelot_ace_rule *rule); 222 int ocelot_ace_rule_stats_update(struct ocelot_ace_rule *rule); 223 224 int ocelot_ace_init(struct ocelot *ocelot); 225 void ocelot_ace_deinit(void); 226 227 int ocelot_setup_tc_block_flower_bind(struct ocelot_port *port, 228 struct flow_block_offload *f); 229 void ocelot_setup_tc_block_flower_unbind(struct ocelot_port *port, 230 struct flow_block_offload *f); 231 232 #endif /* _MSCC_OCELOT_ACE_H_ */ 233