linux/drivers/net/ethernet/intel/iavf/iavf_fdir.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (c) 2021, Intel Corporation. */
   3
   4#ifndef _IAVF_FDIR_H_
   5#define _IAVF_FDIR_H_
   6
   7struct iavf_adapter;
   8
   9/* State of Flow Director filter */
  10enum iavf_fdir_fltr_state_t {
  11        IAVF_FDIR_FLTR_ADD_REQUEST,     /* User requests to add filter */
  12        IAVF_FDIR_FLTR_ADD_PENDING,     /* Filter pending add by the PF */
  13        IAVF_FDIR_FLTR_DEL_REQUEST,     /* User requests to delete filter */
  14        IAVF_FDIR_FLTR_DEL_PENDING,     /* Filter pending delete by the PF */
  15        IAVF_FDIR_FLTR_ACTIVE,          /* Filter is active */
  16};
  17
  18enum iavf_fdir_flow_type {
  19        /* NONE - used for undef/error */
  20        IAVF_FDIR_FLOW_NONE = 0,
  21        IAVF_FDIR_FLOW_IPV4_TCP,
  22        IAVF_FDIR_FLOW_IPV4_UDP,
  23        IAVF_FDIR_FLOW_IPV4_SCTP,
  24        IAVF_FDIR_FLOW_IPV4_AH,
  25        IAVF_FDIR_FLOW_IPV4_ESP,
  26        IAVF_FDIR_FLOW_IPV4_OTHER,
  27        IAVF_FDIR_FLOW_IPV6_TCP,
  28        IAVF_FDIR_FLOW_IPV6_UDP,
  29        IAVF_FDIR_FLOW_IPV6_SCTP,
  30        IAVF_FDIR_FLOW_IPV6_AH,
  31        IAVF_FDIR_FLOW_IPV6_ESP,
  32        IAVF_FDIR_FLOW_IPV6_OTHER,
  33        IAVF_FDIR_FLOW_NON_IP_L2,
  34        /* MAX - this must be last and add anything new just above it */
  35        IAVF_FDIR_FLOW_PTYPE_MAX,
  36};
  37
  38/* Must not exceed the array element number of '__be32 data[2]' in the ethtool
  39 * 'struct ethtool_rx_flow_spec.m_ext.data[2]' to express the flex-byte (word).
  40 */
  41#define IAVF_FLEX_WORD_NUM      2
  42
  43struct iavf_flex_word {
  44        u16 offset;
  45        u16 word;
  46};
  47
  48struct iavf_ipv4_addrs {
  49        __be32 src_ip;
  50        __be32 dst_ip;
  51};
  52
  53struct iavf_ipv6_addrs {
  54        struct in6_addr src_ip;
  55        struct in6_addr dst_ip;
  56};
  57
  58struct iavf_fdir_eth {
  59        __be16 etype;
  60};
  61
  62struct iavf_fdir_ip {
  63        union {
  64                struct iavf_ipv4_addrs v4_addrs;
  65                struct iavf_ipv6_addrs v6_addrs;
  66        };
  67        __be16 src_port;
  68        __be16 dst_port;
  69        __be32 l4_header;       /* first 4 bytes of the layer 4 header */
  70        __be32 spi;             /* security parameter index for AH/ESP */
  71        union {
  72                u8 tos;
  73                u8 tclass;
  74        };
  75        u8 proto;
  76};
  77
  78struct iavf_fdir_extra {
  79        u32 usr_def[IAVF_FLEX_WORD_NUM];
  80};
  81
  82/* bookkeeping of Flow Director filters */
  83struct iavf_fdir_fltr {
  84        enum iavf_fdir_fltr_state_t state;
  85        struct list_head list;
  86
  87        enum iavf_fdir_flow_type flow_type;
  88
  89        struct iavf_fdir_eth eth_data;
  90        struct iavf_fdir_eth eth_mask;
  91
  92        struct iavf_fdir_ip ip_data;
  93        struct iavf_fdir_ip ip_mask;
  94
  95        struct iavf_fdir_extra ext_data;
  96        struct iavf_fdir_extra ext_mask;
  97
  98        enum virtchnl_action action;
  99
 100        /* flex byte filter data */
 101        u8 ip_ver; /* used to adjust the flex offset, 4 : IPv4, 6 : IPv6 */
 102        u8 flex_cnt;
 103        struct iavf_flex_word flex_words[IAVF_FLEX_WORD_NUM];
 104
 105        u32 flow_id;
 106
 107        u32 loc;        /* Rule location inside the flow table */
 108        u32 q_index;
 109
 110        struct virtchnl_fdir_add vc_add_msg;
 111};
 112
 113int iavf_fill_fdir_add_msg(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr);
 114void iavf_print_fdir_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr);
 115bool iavf_fdir_is_dup_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr);
 116void iavf_fdir_list_add_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr);
 117struct iavf_fdir_fltr *iavf_find_fdir_fltr_by_loc(struct iavf_adapter *adapter, u32 loc);
 118#endif /* _IAVF_FDIR_H_ */
 119