1
0
Files
kernel-49/ndm/hw_nat/ra_nat.h
Andrey Zolotarev 0f20331cff hw_nat: add union to rxd info structure
Helper for WARP driver.
2023-03-09 22:32:19 +07:00

267 lines
7.2 KiB
C

#ifndef _RA_NAT_WANTED
#define _RA_NAT_WANTED
#include <linux/ip.h>
#include <linux/ipv6.h>
#if defined(CONFIG_MACH_MT7981) || \
defined(CONFIG_MACH_MT7986)
#define MTK_NETSYS_V2
#endif
struct PdmaRxDescInfo4 {
uint16_t MAGIC_TAG;
union {
struct {
#ifdef MTK_NETSYS_V2
uint32_t FOE_Entry:15;
uint32_t Rsv0:3;
uint32_t CRSN:5;
uint32_t Rsv1:3;
uint32_t SPORT:4;
uint32_t Rsv3:1;
uint32_t ALG:1;
#else
#ifdef __BIG_ENDIAN
uint32_t IF:8;
uint32_t ALG:1;
uint32_t SPORT:4;
uint32_t CRSN:5;
uint32_t FOE_Entry:14;
#else
uint32_t FOE_Entry:14;
uint32_t CRSN:5;
uint32_t SPORT:4;
uint32_t ALG:1;
uint32_t IF:8;
#endif
#endif
};
uint32_t desc;
};
} __packed;
/*
* DEFINITIONS AND MACROS
*/
#ifdef MTK_NETSYS_V2
#define FOE_INV_ENTRY 0x7fff
#else
#define FOE_INV_ENTRY 0x3fff
#endif
/*
* 2bytes 4bytes
* +-----------+-------------------+
* | Magic Tag | RX/TX Desc info4 |
* +-----------+-------------------+
* |<------FOE Flow Info---------->|
*/
#define FOE_INFO_LEN 6
#define FOE_MAGIC_EXTIF 0x7274
#define FOE_MAGIC_PCI FOE_MAGIC_EXTIF
#define FOE_MAGIC_WLAN FOE_MAGIC_EXTIF
#define FOE_MAGIC_GE 0x7275
#define FOE_MAGIC_PPE 0x7276
#define FOE_MAGIC_WED 0x7278
#ifdef MTK_NETSYS_V2
#define FOE_MAGIC_PPE_DWORD 0x7fff7276UL /* FOE_Entry=0x7fff */
#else
#ifdef __BIG_ENDIAN
#define FOE_MAGIC_PPE_DWORD 0x7672ff3fUL /* FOE_Entry=0x3fff */
#else
#define FOE_MAGIC_PPE_DWORD 0x3fff7276UL /* FOE_Entry=0x3fff */
#endif
#endif
/* choose one of them to keep HNAT related information in somewhere. */
//#define HNAT_USE_HEADROOM
//#define HNAT_USE_TAILROOM
#define HNAT_USE_SKB_CB
#if defined(HNAT_USE_HEADROOM)
#define IS_SPACE_AVAILABLED(skb) ((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)
#define FOE_INFO_START_ADDR(skb) (skb->head)
#elif defined(HNAT_USE_TAILROOM)
#define IS_SPACE_AVAILABLED(skb) ((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0)
#define FOE_INFO_START_ADDR(skb) (skb->end - FOE_INFO_LEN)
#elif defined(HNAT_USE_SKB_CB)
//change the position of skb_CB if necessary
#define CB_OFFSET 40
#define IS_SPACE_AVAILABLED(skb) 1
#define FOE_INFO_START_ADDR(skb) (skb->cb + CB_OFFSET)
#endif
#define FOE_MAGIC_TAG(skb) ((struct PdmaRxDescInfo4 *)FOE_INFO_START_ADDR(skb))->MAGIC_TAG
#define FOE_ENTRY_NUM(skb) ((struct PdmaRxDescInfo4 *)FOE_INFO_START_ADDR(skb))->FOE_Entry
#define FOE_ALG(skb) ((struct PdmaRxDescInfo4 *)FOE_INFO_START_ADDR(skb))->ALG
#define FOE_ENTRY_VALID(skb) (((struct PdmaRxDescInfo4 *)FOE_INFO_START_ADDR(skb))->FOE_Entry != FOE_INV_ENTRY)
#define FOE_AI(skb) ((struct PdmaRxDescInfo4 *)FOE_INFO_START_ADDR(skb))->CRSN
#define FOE_SP(skb) ((struct PdmaRxDescInfo4 *)FOE_INFO_START_ADDR(skb))->SPORT
#ifndef UN_HIT
#define UN_HIT 0x0D
#endif
#ifndef HIT_BIND_KEEPALIVE_DUP_OLD_HDR
#define HIT_BIND_KEEPALIVE_DUP_OLD_HDR 0x15
#endif
/* PPE internal CRSN values 0x01..0x1E */
#define CRSN_PPE_INVALID 0x1F
#if defined(MTK_NETSYS_V2) && IS_ENABLED(CONFIG_MTK_WARP)
#define IS_MAGIC_TAG_VALID(skb) \
((FOE_MAGIC_TAG(skb) == FOE_MAGIC_GE) || \
(FOE_MAGIC_TAG(skb) == FOE_MAGIC_WED))
#else
#define IS_MAGIC_TAG_VALID(skb) \
((FOE_MAGIC_TAG(skb) == FOE_MAGIC_GE))
#endif
#define IS_DPORT_PPE_VALID(skb) \
(*((uint32_t *)(FOE_INFO_START_ADDR(skb))) == FOE_MAGIC_PPE_DWORD)
/* mark flow need skipped from PPE */
#define FOE_ALG_SKIP(skb) \
if (IS_SPACE_AVAILABLED(skb) && !FOE_ALG(skb) && IS_MAGIC_TAG_VALID(skb)) FOE_ALG(skb) = 1
#define FOE_ALG_MARK(skb) \
FOE_ALG_SKIP(skb)
#define FOE_SKB_IS_KEEPALIVE(skb) \
(FOE_AI(skb) == HIT_BIND_KEEPALIVE_DUP_OLD_HDR)
#define FOE_SKB_IS_PPE_REJECTED(skb) \
(FOE_AI(skb) == CRSN_PPE_INVALID)
/* reset AI for local output flow */
#define FOE_AI_UNHIT(skb) \
if (IS_SPACE_AVAILABLED(skb)) FOE_AI(skb) = UN_HIT
/* fast clear FoE Info (magic_tag,entry_num) */
#define DO_FAST_CLEAR_FOE(skb) \
(*((uint32_t *)(FOE_INFO_START_ADDR(skb))) = 0U)
/* full clear FoE Info */
#define DO_FULL_CLEAR_FOE(skb) \
(memset(FOE_INFO_START_ADDR(skb), 0, FOE_INFO_LEN))
/* fast fill FoE magic tag field */
#define DO_FILL_FOE_MTAG(skb,mtag) \
(*((uint16_t *)(FOE_INFO_START_ADDR(skb))) = (uint16_t)(mtag))
/* fast fill FoE desc field */
#define DO_FILL_FOE_DESC(skb,desc) \
(*((uint32_t *)(FOE_INFO_START_ADDR(skb) + 2)) = (uint32_t)(desc))
/* fast fill FoE desc to DPORT PPE (magic_tag,entry_num) */
#define DO_FILL_FOE_DPORT_PPE(skb) \
(*((uint32_t *)(FOE_INFO_START_ADDR(skb))) = FOE_MAGIC_PPE_DWORD)
//////////////////////////////////////////////////////////////////////
/* gmac_id */
#define GMAC_ID_MAGIC_EXTIF 0
#define GMAC_ID_GDM1 1
#define GMAC_ID_GDM2 2
#define GMAC_ID_WDMA 3
#if defined(CONFIG_ECONET_EN7512) || \
defined(CONFIG_ECONET_EN7516) || \
defined(CONFIG_ECONET_EN7527)
/* gmac_type */
#define GMAC_TYPE_ETH 0
#define GMAC_TYPE_ATM 1
#define GMAC_TYPE_PTM 2
/* gmac_info fields */
struct gmac_info {
union {
struct {
/* assume BE for all en75xx */
uint32_t wi_rxid: 1; /* QDMA RX ring */
uint32_t atm_pppoa: 1; /* ATM PPPoA incap */
uint32_t atm_ipoa: 1; /* ATM IPoA incap */
uint32_t atm_mux_vc: 1; /* ATM VC mux mode */
uint32_t atm_uu: 8; /* ATM User-to-User */
uint32_t atm_clp: 1; /* ATM Cell Loss Priority */
uint32_t xoa: 1; /* X over ATM */
uint32_t resv: 1;
uint32_t is_wan: 1; /* assume upstream path */
uint32_t hwfq: 1; /* send via QDMA HWFQ */
uint32_t queue_id: 3; /* QDMA QoS queue (0..7) */
uint32_t channel_id: 8; /* QDMA virtual channel */
uint32_t gmac_type: 2; /* 0: ETH, 1: ATM, 2: PTM */
uint32_t gmac_id: 2; /* 0: external (WiFi), 1: GDM1, 2: GDM2 */
} bits;
uint32_t word;
};
} __packed;
#elif defined(CONFIG_ECONET_EN7528)
/* gmac_info fields */
struct gmac_info {
union {
struct {
/* assume LE for en7528 */
uint32_t gmac_id: 2; /* 0: external (WiFi), 1: GDM1, 2: GDM2, 3: WDMA */
uint32_t channel_id: 8; /* QDMA virtual channel */
uint32_t queue_id: 3; /* QDMA QoS queue (0..7) */
uint32_t hwfq: 1; /* send via QDMA HWFQ */
uint32_t is_wan: 1; /* assume upstream path */
uint32_t resv: 1;
uint32_t wdmaid: 1; /* WDMA0/1 */
uint32_t wi_bssid: 6; /* BSSID */
uint32_t wi_wcid: 8; /* WCID */
uint32_t wi_rxid: 1; /* WDMA/QDMA RX ring */
} bits;
uint32_t word;
};
} __packed;
#else
/* gmac_info fields */
struct gmac_info {
union {
struct {
/* assume LE for all mt76xx/mt79xx */
uint32_t gmac_id: 2; /* 0: external (WiFi), 1: GDM1, 2: GDM2, 3: WDMA */
uint32_t queue_id: 7; /* QDMA QoS queue (0..127) */
uint32_t hwfq: 1; /* send via QDMA HWFQ */
uint32_t is_wan: 1; /* assume upstream path */
uint32_t wdmaid: 1; /* WDMA0/1 */
uint32_t wi_bssid: 6; /* BSSID */
uint32_t wi_wcid: 10; /* WCID */
uint32_t wi_rxid: 2; /* WDMA RX ring */
uint32_t resv: 2;
} bits;
uint32_t word;
};
} __packed;
#endif
extern int (*ra_sw_nat_hook_rx)(struct sk_buff *skb);
extern int (*ra_sw_nat_hook_tx)(struct sk_buff *skb, int gmac_info);
extern int (*ppe_del_entry_by_addr_hook)(const char *addr);
extern int (*ppe_dev_has_accel_hook)(struct net_device *dev);
extern void (*ppe_dev_register_hook)(struct net_device *dev);
extern void (*ppe_dev_unregister_hook)(struct net_device *dev);
//////////////////////////////////////////////////////////////////////
#endif