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_VCAP_H_
7 #define _MSCC_OCELOT_VCAP_H_
8 
9 #include "ocelot.h"
10 #include "ocelot_police.h"
11 #include <net/sch_generic.h>
12 #include <net/pkt_cls.h>
13 
14 struct ocelot_ipv4 {
15 	u8 addr[4];
16 };
17 
18 enum ocelot_vcap_bit {
19 	OCELOT_VCAP_BIT_ANY,
20 	OCELOT_VCAP_BIT_0,
21 	OCELOT_VCAP_BIT_1
22 };
23 
24 struct ocelot_vcap_u8 {
25 	u8 value[1];
26 	u8 mask[1];
27 };
28 
29 struct ocelot_vcap_u16 {
30 	u8 value[2];
31 	u8 mask[2];
32 };
33 
34 struct ocelot_vcap_u24 {
35 	u8 value[3];
36 	u8 mask[3];
37 };
38 
39 struct ocelot_vcap_u32 {
40 	u8 value[4];
41 	u8 mask[4];
42 };
43 
44 struct ocelot_vcap_u40 {
45 	u8 value[5];
46 	u8 mask[5];
47 };
48 
49 struct ocelot_vcap_u48 {
50 	u8 value[6];
51 	u8 mask[6];
52 };
53 
54 struct ocelot_vcap_u64 {
55 	u8 value[8];
56 	u8 mask[8];
57 };
58 
59 struct ocelot_vcap_u128 {
60 	u8 value[16];
61 	u8 mask[16];
62 };
63 
64 struct ocelot_vcap_vid {
65 	u16 value;
66 	u16 mask;
67 };
68 
69 struct ocelot_vcap_ipv4 {
70 	struct ocelot_ipv4 value;
71 	struct ocelot_ipv4 mask;
72 };
73 
74 struct ocelot_vcap_udp_tcp {
75 	u16 value;
76 	u16 mask;
77 };
78 
79 enum ocelot_vcap_key_type {
80 	OCELOT_VCAP_KEY_ANY,
81 	OCELOT_VCAP_KEY_ETYPE,
82 	OCELOT_VCAP_KEY_LLC,
83 	OCELOT_VCAP_KEY_SNAP,
84 	OCELOT_VCAP_KEY_ARP,
85 	OCELOT_VCAP_KEY_IPV4,
86 	OCELOT_VCAP_KEY_IPV6
87 };
88 
89 struct ocelot_vcap_key_vlan {
90 	struct ocelot_vcap_vid vid;    /* VLAN ID (12 bit) */
91 	struct ocelot_vcap_u8  pcp;    /* PCP (3 bit) */
92 	enum ocelot_vcap_bit dei;    /* DEI */
93 	enum ocelot_vcap_bit tagged; /* Tagged/untagged frame */
94 };
95 
96 struct ocelot_vcap_key_etype {
97 	struct ocelot_vcap_u48 dmac;
98 	struct ocelot_vcap_u48 smac;
99 	struct ocelot_vcap_u16 etype;
100 	struct ocelot_vcap_u16 data; /* MAC data */
101 };
102 
103 struct ocelot_vcap_key_llc {
104 	struct ocelot_vcap_u48 dmac;
105 	struct ocelot_vcap_u48 smac;
106 
107 	/* LLC header: DSAP at byte 0, SSAP at byte 1, Control at byte 2 */
108 	struct ocelot_vcap_u32 llc;
109 };
110 
111 struct ocelot_vcap_key_snap {
112 	struct ocelot_vcap_u48 dmac;
113 	struct ocelot_vcap_u48 smac;
114 
115 	/* SNAP header: Organization Code at byte 0, Type at byte 3 */
116 	struct ocelot_vcap_u40 snap;
117 };
118 
119 struct ocelot_vcap_key_arp {
120 	struct ocelot_vcap_u48 smac;
121 	enum ocelot_vcap_bit arp;	/* Opcode ARP/RARP */
122 	enum ocelot_vcap_bit req;	/* Opcode request/reply */
123 	enum ocelot_vcap_bit unknown;    /* Opcode unknown */
124 	enum ocelot_vcap_bit smac_match; /* Sender MAC matches SMAC */
125 	enum ocelot_vcap_bit dmac_match; /* Target MAC matches DMAC */
126 
127 	/**< Protocol addr. length 4, hardware length 6 */
128 	enum ocelot_vcap_bit length;
129 
130 	enum ocelot_vcap_bit ip;       /* Protocol address type IP */
131 	enum  ocelot_vcap_bit ethernet; /* Hardware address type Ethernet */
132 	struct ocelot_vcap_ipv4 sip;     /* Sender IP address */
133 	struct ocelot_vcap_ipv4 dip;     /* Target IP address */
134 };
135 
136 struct ocelot_vcap_key_ipv4 {
137 	enum ocelot_vcap_bit ttl;      /* TTL zero */
138 	enum ocelot_vcap_bit fragment; /* Fragment */
139 	enum ocelot_vcap_bit options;  /* Header options */
140 	struct ocelot_vcap_u8 ds;
141 	struct ocelot_vcap_u8 proto;      /* Protocol */
142 	struct ocelot_vcap_ipv4 sip;      /* Source IP address */
143 	struct ocelot_vcap_ipv4 dip;      /* Destination IP address */
144 	struct ocelot_vcap_u48 data;      /* Not UDP/TCP: IP data */
145 	struct ocelot_vcap_udp_tcp sport; /* UDP/TCP: Source port */
146 	struct ocelot_vcap_udp_tcp dport; /* UDP/TCP: Destination port */
147 	enum ocelot_vcap_bit tcp_fin;
148 	enum ocelot_vcap_bit tcp_syn;
149 	enum ocelot_vcap_bit tcp_rst;
150 	enum ocelot_vcap_bit tcp_psh;
151 	enum ocelot_vcap_bit tcp_ack;
152 	enum ocelot_vcap_bit tcp_urg;
153 	enum ocelot_vcap_bit sip_eq_dip;     /* SIP equals DIP  */
154 	enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT  */
155 	enum ocelot_vcap_bit seq_zero;       /* TCP sequence number is zero */
156 };
157 
158 struct ocelot_vcap_key_ipv6 {
159 	struct ocelot_vcap_u8 proto; /* IPv6 protocol */
160 	struct ocelot_vcap_u128 sip; /* IPv6 source (byte 0-7 ignored) */
161 	enum ocelot_vcap_bit ttl;  /* TTL zero */
162 	struct ocelot_vcap_u8 ds;
163 	struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */
164 	struct ocelot_vcap_udp_tcp sport;
165 	struct ocelot_vcap_udp_tcp dport;
166 	enum ocelot_vcap_bit tcp_fin;
167 	enum ocelot_vcap_bit tcp_syn;
168 	enum ocelot_vcap_bit tcp_rst;
169 	enum ocelot_vcap_bit tcp_psh;
170 	enum ocelot_vcap_bit tcp_ack;
171 	enum ocelot_vcap_bit tcp_urg;
172 	enum ocelot_vcap_bit sip_eq_dip;     /* SIP equals DIP  */
173 	enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT  */
174 	enum ocelot_vcap_bit seq_zero;       /* TCP sequence number is zero */
175 };
176 
177 enum ocelot_vcap_action {
178 	OCELOT_VCAP_ACTION_DROP,
179 	OCELOT_VCAP_ACTION_TRAP,
180 	OCELOT_VCAP_ACTION_POLICE,
181 };
182 
183 struct ocelot_vcap_stats {
184 	u64 bytes;
185 	u64 pkts;
186 	u64 used;
187 };
188 
189 struct ocelot_vcap_filter {
190 	struct list_head list;
191 
192 	u16 prio;
193 	u32 id;
194 
195 	enum ocelot_vcap_action action;
196 	struct ocelot_vcap_stats stats;
197 	unsigned long ingress_port_mask;
198 
199 	enum ocelot_vcap_bit dmac_mc;
200 	enum ocelot_vcap_bit dmac_bc;
201 	struct ocelot_vcap_key_vlan vlan;
202 
203 	enum ocelot_vcap_key_type key_type;
204 	union {
205 		/* OCELOT_VCAP_KEY_ANY: No specific fields */
206 		struct ocelot_vcap_key_etype etype;
207 		struct ocelot_vcap_key_llc llc;
208 		struct ocelot_vcap_key_snap snap;
209 		struct ocelot_vcap_key_arp arp;
210 		struct ocelot_vcap_key_ipv4 ipv4;
211 		struct ocelot_vcap_key_ipv6 ipv6;
212 	} key;
213 	struct ocelot_policer pol;
214 	u32 pol_ix;
215 };
216 
217 int ocelot_vcap_filter_add(struct ocelot *ocelot,
218 			   struct ocelot_vcap_filter *rule,
219 			   struct netlink_ext_ack *extack);
220 int ocelot_vcap_filter_del(struct ocelot *ocelot,
221 			   struct ocelot_vcap_filter *rule);
222 int ocelot_vcap_filter_stats_update(struct ocelot *ocelot,
223 				    struct ocelot_vcap_filter *rule);
224 
225 int ocelot_vcap_init(struct ocelot *ocelot);
226 
227 int ocelot_setup_tc_cls_flower(struct ocelot_port_private *priv,
228 			       struct flow_cls_offload *f,
229 			       bool ingress);
230 
231 #endif /* _MSCC_OCELOT_VCAP_H_ */
232