#ifndef _MAC_FLOW_H
#define _MAC_FLOW_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <sys/ethernet.h>
#define MAX_RINGS_PER_GROUP 128
#define MAXFLOWNAMELEN 128
#define MAXMACADDR 20
typedef uint64_t flow_mask_t;
#define FLOW_LINK_DST 0x00000001
#define FLOW_LINK_SRC 0x00000002
#define FLOW_LINK_VID 0x00000004
#define FLOW_LINK_SAP 0x00000008
#define FLOW_IP_VERSION 0x00000010
#define FLOW_IP_PROTOCOL 0x00000020
#define FLOW_IP_LOCAL 0x00000040
#define FLOW_IP_REMOTE 0x00000080
#define FLOW_IP_DSFIELD 0x00000100
#define FLOW_ULP_PORT_LOCAL 0x00001000
#define FLOW_ULP_PORT_REMOTE 0x00002000
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
typedef struct flow_desc_s {
flow_mask_t fd_mask;
uint32_t fd_mac_len;
uint8_t fd_dst_mac[MAXMACADDR];
uint8_t fd_src_mac[MAXMACADDR];
uint16_t fd_vid;
uint32_t fd_sap;
uint8_t fd_ipversion;
uint8_t fd_protocol;
in6_addr_t fd_local_addr;
in6_addr_t fd_local_netmask;
in6_addr_t fd_remote_addr;
in6_addr_t fd_remote_netmask;
in_port_t fd_local_port;
in_port_t fd_remote_port;
uint8_t fd_dsfield;
uint8_t fd_dsfield_mask;
} flow_desc_t;
#define MRP_NCPUS 256
typedef enum {
MCM_FANOUT = 1,
MCM_CPUS
} mac_cpu_mode_t;
typedef struct mac_tx_intr_cpus_s {
int32_t mtc_intr_cpu[MRP_NCPUS];
int32_t mtc_retargeted_cpu[MRP_NCPUS];
} mac_tx_intr_cpu_t;
typedef struct mac_cpus_props_s {
uint32_t mc_ncpus;
uint32_t mc_cpus[MRP_NCPUS];
uint32_t mc_rx_fanout_cnt;
uint32_t mc_rx_fanout_cpus[MRP_NCPUS];
uint32_t mc_rx_pollid;
uint32_t mc_rx_workerid;
int32_t mc_rx_intr_cpu;
int32_t mc_tx_fanout_cpus[MRP_NCPUS];
mac_tx_intr_cpu_t mc_tx_intr_cpus;
mac_cpu_mode_t mc_fanout_mode;
} mac_cpus_t;
#define mc_tx_intr_cpu mc_tx_intr_cpus.mtc_intr_cpu
#define mc_tx_retargeted_cpu mc_tx_intr_cpus.mtc_retargeted_cpu
typedef enum {
MPL_LOW,
MPL_MEDIUM,
MPL_HIGH,
MPL_RESET
} mac_priority_level_t;
#define MPT_MACNOSPOOF 0x00000001
#define MPT_RESTRICTED 0x00000002
#define MPT_IPNOSPOOF 0x00000004
#define MPT_DHCPNOSPOOF 0x00000008
#define MPT_ALL 0x0000000f
#define MPT_RESET 0xffffffff
#define MPT_MAXCNT 32
#define MPT_MAXIPADDR MPT_MAXCNT
#define MPT_MAXCID MPT_MAXCNT
#define MPT_MAXCIDLEN 256
typedef struct mac_ipaddr_s {
uint32_t ip_version;
in6_addr_t ip_addr;
uint8_t ip_netmask;
} mac_ipaddr_t;
typedef enum {
CIDFORM_TYPED = 1,
CIDFORM_HEX,
CIDFORM_STR
} mac_dhcpcid_form_t;
typedef struct mac_dhcpcid_s {
uchar_t dc_id[MPT_MAXCIDLEN];
uint32_t dc_len;
mac_dhcpcid_form_t dc_form;
} mac_dhcpcid_t;
typedef struct mac_protect_s {
uint32_t mp_types;
uint32_t mp_ipaddrcnt;
mac_ipaddr_t mp_ipaddrs[MPT_MAXIPADDR];
uint32_t mp_cidcnt;
mac_dhcpcid_t mp_cids[MPT_MAXCID];
} mac_protect_t;
#define MPL_LINK_DEFAULT MPL_HIGH
#define MPL_SUBFLOW_DEFAULT MPL_MEDIUM
#define MRP_MAXBW 0x00000001
#define MRP_CPUS 0x00000002
#define MRP_CPUS_USERSPEC 0x00000004
#define MRP_PRIORITY 0x00000008
#define MRP_PROTECT 0x00000010
#define MRP_RX_RINGS 0x00000020
#define MRP_TX_RINGS 0x00000040
#define MRP_RXRINGS_UNSPEC 0x00000080
#define MRP_TXRINGS_UNSPEC 0x00000100
#define MRP_RINGS_RESET 0x00000200
#define MRP_POOL 0x00000400
#define MRP_THROTTLE MRP_MAXBW
#define MRP_PRIORITY_LEVELS 3
#define MRP_MAXBW_RESETVAL -1ULL
#define MRP_MAXBW_MINVAL 1200000
typedef struct mac_resource_props_s {
uint32_t mrp_mask;
uint64_t mrp_maxbw;
mac_priority_level_t mrp_priority;
mac_cpus_t mrp_cpus;
mac_protect_t mrp_protect;
uint32_t mrp_nrxrings;
uint32_t mrp_ntxrings;
char mrp_pool[MAXPATHLEN];
} mac_resource_props_t;
#define mrp_ncpus mrp_cpus.mc_ncpus
#define mrp_cpu mrp_cpus.mc_cpus
#define mrp_rx_fanout_cnt mrp_cpus.mc_rx_fanout_cnt
#define mrp_rx_pollid mrp_cpus.mc_rx_pollid
#define mrp_rx_workerid mrp_cpus.mc_rx_workerid
#define mrp_rx_intr_cpu mrp_cpus.mc_rx_intr_cpu
#define mrp_fanout_mode mrp_cpus.mc_fanout_mode
#define MAC_COPY_CPUS(mrp, fmrp) { \
int ncpus; \
(fmrp)->mrp_ncpus = (mrp)->mrp_ncpus; \
(fmrp)->mrp_rx_fanout_cnt = (mrp)->mrp_rx_fanout_cnt; \
(fmrp)->mrp_rx_intr_cpu = (mrp)->mrp_rx_intr_cpu; \
(fmrp)->mrp_fanout_mode = (mrp)->mrp_fanout_mode; \
if ((mrp)->mrp_ncpus == 0) { \
(fmrp)->mrp_mask &= ~MRP_CPUS; \
(fmrp)->mrp_mask &= ~MRP_CPUS_USERSPEC; \
} else { \
for (ncpus = 0; ncpus < (fmrp)->mrp_ncpus; ncpus++) \
(fmrp)->mrp_cpu[ncpus] = (mrp)->mrp_cpu[ncpus];\
(fmrp)->mrp_mask |= MRP_CPUS; \
if ((mrp)->mrp_mask & MRP_CPUS_USERSPEC) \
(fmrp)->mrp_mask |= MRP_CPUS_USERSPEC; \
} \
}
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#ifdef __cplusplus
}
#endif
#endif