root/drivers/net/ethernet/mscc/ocelot_ace.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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_ */

/* [<][>][^][v][top][bottom][index][help] */