#ifndef _SYS_NXGE_NXGE_FLOW_H
#define _SYS_NXGE_NXGE_FLOW_H
#ifdef __cplusplus
extern "C" {
#endif
#include <netinet/in.h>
#define S6_addr32 _S6_un._S6_u32
typedef struct tcpip4_spec_s {
in_addr_t ip4src;
in_addr_t ip4dst;
in_port_t psrc;
in_port_t pdst;
uint8_t tos;
} tcpip4_spec_t;
typedef struct tcpip6_spec_s {
struct in6_addr ip6src;
struct in6_addr ip6dst;
in_port_t psrc;
in_port_t pdst;
uint8_t tos;
} tcpip6_spec_t;
typedef struct udpip4_spec_s {
in_addr_t ip4src;
in_addr_t ip4dst;
in_port_t psrc;
in_port_t pdst;
uint8_t tos;
} udpip4_spec_t;
typedef struct udpip6_spec_s {
struct in6_addr ip6src;
struct in6_addr ip6dst;
in_port_t psrc;
in_port_t pdst;
uint8_t tos;
} udpip6_spec_t;
typedef struct ahip4_spec_s {
in_addr_t ip4src;
in_addr_t ip4dst;
uint32_t spi;
uint8_t tos;
} ahip4_spec_t;
typedef struct ahip6_spec_s {
struct in6_addr ip6src;
struct in6_addr ip6dst;
uint32_t spi;
uint8_t tos;
} ahip6_spec_t;
typedef ahip4_spec_t espip4_spec_t;
typedef ahip6_spec_t espip6_spec_t;
typedef struct rawip4_spec_s {
struct in6_addr ip4src;
struct in6_addr ip4dst;
uint8_t hdata[64];
} rawip4_spec_t;
typedef struct rawip6_spec_s {
struct in6_addr ip6src;
struct in6_addr ip6dst;
uint8_t hdata[64];
} rawip6_spec_t;
typedef struct ether_spec_s {
uint16_t ether_type;
uint8_t frame_size;
uint8_t eframe[16];
} ether_spec_t;
#define FSPEC_IP4 1
#define FSPEC_IP6 2
typedef struct ip_user_spec_s {
uint32_t ip4src;
uint32_t ip4dst;
uint32_t l4_4_bytes;
uint8_t tos;
uint8_t ip_ver;
uint8_t proto;
} ip_user_spec_t;
typedef struct ip6_frag_spec_s {
struct in6_addr ip6src;
struct in6_addr ip6dst;
uint32_t l4_4_bytes;
uint8_t tos;
uint8_t proto;
} ip6_frag_spec_t;
typedef ether_spec_t arpip_spec_t;
typedef ether_spec_t ether_user_spec_t;
struct flow_spec_s {
uint32_t flow_type;
union {
tcpip4_spec_t tcpip4spec;
tcpip6_spec_t tcpip6spec;
udpip4_spec_t udpip4spec;
udpip6_spec_t udpip6spec;
arpip_spec_t arpipspec;
ahip4_spec_t ahip4spec;
ahip6_spec_t ahip6spec;
espip4_spec_t espip4spec;
espip6_spec_t espip6spec;
rawip4_spec_t rawip4spec;
rawip6_spec_t rawip6spec;
ether_spec_t etherspec;
ip_user_spec_t ip_usr_spec;
ip6_frag_spec_t ip6_frag_spec;
uint8_t hdata[64];
} uh, um;
} __attribute__((packed));
typedef struct flow_spec_s flow_spec_t;
#define FSPEC_TCPIP4 0x1
#define FSPEC_TCPIP6 0x2
#define FSPEC_UDPIP4 0x3
#define FSPEC_UDPIP6 0x4
#define FSPEC_ARPIP 0x5
#define FSPEC_AHIP4 0x6
#define FSPEC_AHIP6 0x7
#define FSPEC_ESPIP4 0x8
#define FSPEC_ESPIP6 0x9
#define FSPEC_SCTPIP4 0xA
#define FSPEC_SCTPIP6 0xB
#define FSPEC_IP6FRAG 0xC
#define FSPEC_RAW4 0xD
#define FSPEC_RAW6 0xE
#define FSPEC_ETHER 0xF
#define FSPEC_IP_USR 0x10
#define FSPEC_HDATA 0x11
#define TCAM_IPV6_ADDR(m32, ip6addr) { \
m32[0] = ip6addr.S6_addr32[0]; \
m32[1] = ip6addr.S6_addr32[1]; \
m32[2] = ip6addr.S6_addr32[2]; \
m32[3] = ip6addr.S6_addr32[3]; \
}
#define FSPEC_IPV6_ADDR(ip6addr, m32) { \
ip6addr.S6_addr32[0] = m32[0]; \
ip6addr.S6_addr32[1] = m32[1]; \
ip6addr.S6_addr32[2] = m32[2]; \
ip6addr.S6_addr32[3] = m32[3]; \
}
#define TCAM_IPV4_ADDR(m32, ip4addr) (m32 = ip4addr)
#define FSPEC_IPV4_ADDR(ip4addr, m32) (ip4addr = m32)
#define TCAM_IP_PORTS(port32, dp, sp) (port32 = dp | (sp << 16))
#define FSPEC_IP_PORTS(dp, sp, port32) { \
dp = port32 & 0xff; \
sp = port32 >> 16; \
}
#define TCAM_IP_CLASS(key, mask, class) { \
key = class; \
mask = 0x1f; \
}
#define TCAM_IP_PROTO(key, mask, proto) { \
key = proto; \
mask = 0xff; \
}
struct flow_resource_s {
uint64_t channel_cookie;
uint64_t flow_cookie;
uint64_t location;
flow_spec_t flow_spec;
} __attribute__((packed));
typedef struct flow_resource_s flow_resource_t;
#define NXGE_RX_CLASS_GCHAN 0x01
#define NXGE_RX_CLASS_GRULE_CNT 0x02
#define NXGE_RX_CLASS_GRULE 0x03
#define NXGE_RX_CLASS_GRULE_ALL 0x04
#define NXGE_RX_CLASS_RULE_DEL 0x05
#define NXGE_RX_CLASS_RULE_INS 0x06
#define NXGE_PKT_DISCARD 0xffffffffffffffffULL
struct rx_class_cfg_s {
uint32_t cmd;
uint32_t data;
uint64_t rule_cnt;
uint32_t rule_locs[256];
flow_resource_t fs;
} __attribute__((packed));
typedef struct rx_class_cfg_s rx_class_cfg_t;
#define NXGE_IPTUN_CFG_ADD_CLS 0x07
#define NXGE_IPTUN_CFG_SET_HASH 0x08
#define NXGE_IPTUN_CFG_DEL_CLS 0x09
#define NXGE_IPTUN_CFG_GET_CLS 0x0a
#define NXGE_CLS_CFG_SET_SYM 0x0b
#define NXGE_CLS_CFG_GET_SYM 0x0c
#define IPTUN_PKT_IPV4 1
#define IPTUN_PKT_IPV6 2
#define IPTUN_PKT_GRE 3
#define IPTUN_PKT_GTP 4
#define OTHER_USR_PKT 5
#define SEL_L4B_0_3 0x0001
#define SEL_L4B_4_7 0x0002
#define SEL_L4B_8_11 0x0004
#define SEL_L4B_12_15 0x0008
#define SEL_L4B_16_19 0x0010
#define SEL_L4B_20_23 0x0020
#define SEL_L4B_24_27 0x0040
#define SEL_L4B_28_31 0x0080
#define SEL_L4B_32_35 0x0100
#define SEL_L4B_36_39 0x0200
#define HASH_IFPORT 0x0001
#define HASH_L2DA 0x0002
#define HASH_VLAN 0x0004
#define HASH_IPSA 0x0008
#define HASH_IPDA 0x0010
#define HASH_L3PROTO 0x0020
#define CLS_TCPV4 0x08
#define CLS_UDPV4 0x09
#define CLS_AHESPV4 0x0A
#define CLS_SCTPV4 0x0B
#define CLS_TCPV6 0x0C
#define CLS_UDPV6 0x0D
#define CLS_AHESPV6 0x0E
#define CLS_SCTPV6 0x0F
#define CLS_IPV6FRAG 0x1F
struct _iptun_cfg {
uint8_t in_pkt_type;
uint8_t l4b0_val;
uint8_t l4b0_mask;
uint8_t l4b23_sel;
uint16_t l4b23_val;
uint16_t l4xor_sel;
uint8_t hash_flags;
} __attribute__((packed));
typedef struct _iptun_cfg iptun_cfg_t;
struct _cfg_cmd {
uint16_t cmd;
uint8_t sym;
uint8_t class_id;
iptun_cfg_t iptun_cfg;
} __attribute__((packed));
typedef struct _cfg_cmd cfg_cmd_t;
#ifdef __cplusplus
}
#endif
#endif