f-stack/dpdk/drivers/net/enic/base/vnic_flowman.h

366 lines
8.5 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2018-2019 Cisco Systems, Inc. All rights reserved.
*/
#ifndef _VNIC_FLOWMAN_H_
#define _VNIC_FLOWMAN_H_
/* This file contains Flow Manager (FM) API of the firmware */
/* Flow manager sub-ops */
enum {
FM_EXACT_TABLE_ALLOC,
FM_TCAM_TABLE_ALLOC,
FM_MATCH_TABLE_FREE,
FM_COUNTER_BRK,
FM_COUNTER_QUERY,
FM_COUNTER_CLEAR_ALL,
FM_COUNTER_DMA,
FM_ACTION_ALLOC,
FM_ACTION_FREE,
FM_EXACT_ENTRY_INSTALL,
FM_TCAM_ENTRY_INSTALL,
FM_MATCH_ENTRY_REMOVE,
FM_VNIC_FIND,
FM_API_VERSION_QUERY,
FM_API_VERSION_SELECT,
FM_INFO_QUERY
};
/*
* FKM (flow key metadata) flags used to match packet metadata
* (e.g. packet is tcp)
*/
#define FKM_BITS \
FBIT(FKM_QTAG) \
FBIT(FKM_CMD) \
FBIT(FKM_IPV4) \
FBIT(FKM_IPV6) \
FBIT(FKM_ROCE) \
FBIT(FKM_UDP) \
FBIT(FKM_TCP) \
FBIT(FKM_TCPORUDP) \
FBIT(FKM_IPFRAG) \
FBIT(FKM_NVGRE) \
FBIT(FKM_VXLAN) \
FBIT(FKM_GENEVE) \
FBIT(FKM_NSH) \
FBIT(FKM_ROCEV2) \
FBIT(FKM_VLAN_PRES) \
FBIT(FKM_IPOK) \
FBIT(FKM_L4OK) \
FBIT(FKM_ROCEOK) \
FBIT(FKM_FCSOK) \
FBIT(FKM_EG_SPAN) \
FBIT(FKM_IG_SPAN) \
FBIT(FKM_EG_HAIRPINNED)
/*
* FKH (flow key header) flags.
* This selects which headers are valid in the struct.
* This is distinct from metadata in that metadata is requesting actual
* selection criteria. If, for example, a TCAM match with metadata "FKM_UDP"
* is feeding into an exact match table, there may be no need for the
* exact match table to also specify FKM_UDP, so FKH_UDP is used to
* specify that the UDP header fields should be used in the match.
*/
#define FKH_BITS \
FBIT(FKH_ETHER) \
FBIT(FKH_QTAG) \
FBIT(FKH_L2RAW) \
FBIT(FKH_IPV4) \
FBIT(FKH_IPV6) \
FBIT(FKH_L3RAW) \
FBIT(FKH_UDP) \
FBIT(FKH_TCP) \
FBIT(FKH_ICMP) \
FBIT(FKH_VXLAN) \
FBIT(FKH_L4RAW)
#define FBIT(X) X##_BIT,
enum {
FKM_BITS
FKM_BIT_COUNT
};
enum {
FKH_BITS
FKH_BIT_COUNT
};
#undef FBIT
#define FBIT(X) X = (1 << X##_BIT),
enum {
FKM_BITS
};
enum {
FKH_BITS
};
#undef FBIT
#define FM_ETH_ALEN 6
#define FM_LAYER_SIZE 64
/* Header match pattern */
struct fm_header_set {
uint32_t fk_metadata; /* FKM flags */
uint32_t fk_header_select; /* FKH flags */
uint16_t fk_vlan;
/* L2: Ethernet Header (valid if FKH_ETHER) */
union {
struct {
uint8_t fk_dstmac[FM_ETH_ALEN];
uint8_t fk_srcmac[FM_ETH_ALEN];
uint16_t fk_ethtype;
} __rte_packed eth;
uint8_t rawdata[FM_LAYER_SIZE];
} __rte_packed l2;
/* L3: IPv4 or IPv6 (valid if FKH_IPV4,6) */
union {
/* Valid if FKH_IPV4 */
struct {
uint8_t fk_ihl_vers;
uint8_t fk_tos;
uint16_t fk_tot_len;
uint16_t fk_id;
uint16_t fk_frag_off;
uint8_t fk_ttl;
uint8_t fk_proto;
uint16_t fk_check;
uint32_t fk_saddr;
uint32_t fk_daddr;
} __rte_packed ip4;
/* Valid if FKH_IPV6 */
struct {
union {
struct {
uint32_t fk_un1_flow;
uint16_t fk_un1_plen;
uint8_t fk_un1_nxt;
uint8_t fk_un1_hlim;
} unl;
uint8_t fk_un2_vfc;
} ctl;
uint8_t fk_srcip[16];
uint8_t fk_dstip[16];
} __rte_packed ip6;
uint8_t rawdata[FM_LAYER_SIZE];
} __rte_packed l3;
/* L4: UDP, TCP, or ICMP (valid if FKH_UDP,TCP,ICMP) */
union {
struct {
uint16_t fk_source;
uint16_t fk_dest;
uint16_t fk_len;
uint16_t fk_check;
} __rte_packed udp;
struct {
uint16_t fk_source;
uint16_t fk_dest;
uint32_t fk_seq;
uint32_t fk_ack_seq;
uint16_t fk_flags;
uint16_t fk_window;
uint16_t fk_check;
uint16_t fk_urg_ptr;
} __rte_packed tcp;
struct {
uint8_t fk_code;
uint8_t fk_type;
} __rte_packed icmp;
uint8_t rawdata[FM_LAYER_SIZE];
} __rte_packed l4;
/* VXLAN (valid if FKH_VXLAN) */
struct {
uint8_t fkvx_flags;
uint8_t fkvx_res0[3];
uint8_t fkvx_vni[3];
uint8_t fkvx_res1;
} __rte_packed vxlan;
/* Payload or unknown inner-most protocol */
uint8_t fk_l5_data[64];
} __rte_packed;
/*
* FK (flow key) template.
* fk_hdrset specifies a set of headers per layer of encapsulation.
* Currently FM supports two header sets: outer (0) and inner(1)
*/
#define FM_HDRSET_MAX 2
struct fm_key_template {
struct fm_header_set fk_hdrset[FM_HDRSET_MAX];
uint32_t fk_flags;
uint16_t fk_packet_tag;
uint16_t fk_packet_size;
uint16_t fk_port_id;
uint32_t fk_wq_id; /* WQ index */
uint64_t fk_wq_vnic; /* VNIC handle for WQ index */
} __rte_packed;
/* Action operation types */
enum {
FMOP_NOP = 0,
/* End the action chain. */
FMOP_END,
/* Drop packet and end the action chain. */
FMOP_DROP,
/* Steer packet to an RQ. */
FMOP_RQ_STEER,
/*
* Jump to an exact match table.
* arg1: exact match table handle
*/
FMOP_EXACT_MATCH,
/* Apply CQ-visible mark on packet. Mark is written to RSS HASH. */
FMOP_MARK,
/*
* Apply CQ-visible mark on packet. Mark is written to a field in
* extended CQ. RSS HASH is preserved.
*/
FMOP_EXT_MARK,
/*
* Apply internal tag which can be matched in subsequent
* stages or hairpin.
*/
FMOP_TAG,
/* Hairpin packet from EG -> IG */
FMOP_EG_HAIRPIN,
/* Hairpin packet from IG -> EG */
FMOP_IG_HAIRPIN,
/* Encap with VXLAN and inner VLAN from metadata. */
FMOP_ENCAP_IVLAN,
/* Encap, no inner VLAN. */
FMOP_ENCAP_NOIVLAN,
/* Encap, add inner VLAN if present. */
FMOP_ENCAP,
/* Set outer VLAN. */
FMOP_SET_OVLAN,
/* Decap when vlan_strip is off */
FMOP_DECAP_NOSTRIP,
FMOP_OP_MAX,
};
/*
* Action operation.
* Complex actions are achieved by a series of "transform operations"
* We can have complex transform operations like "decap" or "vxlan
* encap" and also simple ops like insert this data, add PACKET_LEN to
* this address, etc.
*/
struct fm_action_op {
uint32_t fa_op; /* FMOP flags */
union {
struct {
uint8_t len1_offset;
uint8_t len1_delta;
uint8_t len2_offset;
uint8_t len2_delta;
uint16_t outer_vlan;
uint8_t template_offset;
uint8_t template_len;
} __rte_packed encap;
struct {
uint32_t rq_index;
uint64_t vnic_handle;
} __rte_packed rq_steer;
struct {
uint16_t vlan;
} __rte_packed ovlan;
struct {
uint16_t mark;
} __rte_packed mark;
struct {
uint32_t ext_mark;
} __rte_packed ext_mark;
struct {
uint8_t tag;
} __rte_packed tag;
struct {
uint64_t handle;
} __rte_packed exact;
} __rte_packed;
} __rte_packed;
#define FM_ACTION_OP_MAX 64
#define FM_ACTION_DATA_MAX 96
/*
* Action is a series of action operations applied to matched
* packet. FMA (flowman action).
*/
struct fm_action {
struct fm_action_op fma_action_ops[FM_ACTION_OP_MAX];
uint8_t fma_data[FM_ACTION_DATA_MAX];
} __rte_packed;
/* Match entry flags. FMEF (flow match entry flag) */
#define FMEF_COUNTER 0x0001 /* counter index is valid */
/* FEM (flow exact match) entry */
struct fm_exact_match_entry {
struct fm_key_template fem_data; /* Match data. Mask is per table */
uint32_t fem_flags; /* FMEF_xxx */
uint64_t fem_action; /* Action handle */
uint32_t fem_counter; /* Counter index */
} __rte_packed;
/* FTM (flow TCAM match) entry */
struct fm_tcam_match_entry {
struct fm_key_template ftm_mask; /* Key mask */
struct fm_key_template ftm_data; /* Match data */
uint32_t ftm_flags; /* FMEF_xxx */
uint32_t ftm_position; /* Entry position */
uint64_t ftm_action; /* Action handle */
uint32_t ftm_counter; /* Counter index */
} __rte_packed;
/* Match directions */
enum {
FM_INGRESS,
FM_EGRESS,
FM_DIR_CNT
};
/* Last stage ID, independent of the number of stages in hardware */
#define FM_STAGE_LAST 0xff
/* Hash based exact match table. FET (flow exact match table) */
struct fm_exact_match_table {
uint8_t fet_direction; /* FM_INGRESS or EGRESS*/
uint8_t fet_stage;
uint8_t pad[2];
uint32_t fet_max_entries;
uint64_t fet_dflt_action;
struct fm_key_template fet_key;
} __rte_packed;
/* TCAM based match table. FTT (flow TCAM match table) */
struct fm_tcam_match_table {
uint8_t ftt_direction;
uint8_t ftt_stage;
uint8_t pad[2];
uint32_t ftt_max_entries;
} __rte_packed;
struct fm_counter_counts {
uint64_t fcc_packets;
uint64_t fcc_bytes;
} __rte_packed;
/*
* Return structure for FM_INFO_QUERY devcmd
*/
#define FM_VERSION 1 /* This header file is for version 1 */
struct fm_info {
uint64_t fm_op_mask; /* Bitmask of action supported ops */
uint64_t fm_current_ts; /* Current VIC timestamp */
uint64_t fm_clock_freq; /* Timestamp clock frequency */
uint16_t fm_max_ops; /* Max ops in an action */
uint8_t fm_stages; /* Number of match-action stages */
uint8_t pad[5];
uint32_t fm_counter_count; /* Number of allocated counters */
} __rte_packed;
#endif /* _VNIC_FLOWMAN_H_ */