This patch enables RSS action of avf flow. Type: feature Signed-off-by: Xinyao Cai <xinyao.cai@intel.com> Change-Id: I65de18d0c2eaa415893959563ea917a6b1956550
2691 lines
101 KiB
C
2691 lines
101 KiB
C
/*
|
|
*------------------------------------------------------------------
|
|
* Copyright (c) 2022 Intel and/or its affiliates.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*------------------------------------------------------------------
|
|
*/
|
|
|
|
#include <vppinfra/mem.h>
|
|
#include "avf_advanced_flow.h"
|
|
|
|
#define AVF_PHINT_NONE 0
|
|
#define AVF_PHINT_GTPU BIT_ULL (0)
|
|
#define AVF_PHINT_GTPU_EH BIT_ULL (1)
|
|
#define AVF_PHINT_GTPU_EH_DWN BIT_ULL (2)
|
|
#define AVF_PHINT_GTPU_EH_UP BIT_ULL (3)
|
|
#define AVF_PHINT_OUTER_IPV4 BIT_ULL (4)
|
|
#define AVF_PHINT_OUTER_IPV6 BIT_ULL (5)
|
|
#define AVF_PHINT_GRE BIT_ULL (6)
|
|
/* the second IP header of GTPoGRE */
|
|
#define AVF_PHINT_MID_IPV4 BIT_ULL (7)
|
|
#define AVF_PHINT_MID_IPV6 BIT_ULL (8)
|
|
/* L2TPv2 */
|
|
#define AVF_PHINT_L2TPV2 BIT_ULL (9)
|
|
#define AVF_PHINT_L2TPV2_LEN BIT_ULL (10)
|
|
/* Raw */
|
|
#define AVF_PHINT_RAW BIT_ULL (11)
|
|
|
|
#define AVF_PHINT_GTPU_MSK \
|
|
(AVF_PHINT_GTPU | AVF_PHINT_GTPU_EH | AVF_PHINT_GTPU_EH_DWN | \
|
|
AVF_PHINT_GTPU_EH_UP)
|
|
|
|
#define AVF_PHINT_LAYERS_MSK (AVF_PHINT_OUTER_IPV4 | AVF_PHINT_OUTER_IPV6)
|
|
|
|
#define AVF_GTPU_EH_DWNLINK 0
|
|
#define AVF_GTPU_EH_UPLINK 1
|
|
|
|
#define FIELD_SELECTOR(proto_hdr_field) \
|
|
(1UL << ((proto_hdr_field) &PROTO_HDR_FIELD_MASK))
|
|
#define BUFF_NOUSED 0
|
|
|
|
#define REFINE_PROTO_FLD(op, fld) \
|
|
VIRTCHNL_##op##_PROTO_HDR_FIELD (hdr, VIRTCHNL_PROTO_HDR_##fld)
|
|
#define REPALCE_PROTO_FLD(fld_1, fld_2) \
|
|
do \
|
|
{ \
|
|
REFINE_PROTO_FLD (DEL, fld_1); \
|
|
REFINE_PROTO_FLD (ADD, fld_2); \
|
|
} \
|
|
while (0)
|
|
|
|
#define proto_hdr_eth \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_ETH, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ETH_SRC) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ETH_DST), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_svlan \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_S_VLAN, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_S_VLAN_ID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_cvlan \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_C_VLAN, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_C_VLAN_ID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ipv4 \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_IPV4, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_DST), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ipv4_with_prot \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_IPV4, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_DST) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_PROT), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ipv6 \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_IPV6, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_DST), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ipv6_frag \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ipv6_with_prot \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_IPV6, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_DST) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_PROT), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_udp \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_UDP, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_UDP_SRC_PORT) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_UDP_DST_PORT), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_tcp \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_TCP, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_TCP_SRC_PORT) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_TCP_DST_PORT), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_sctp \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_SCTP, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_SCTP_DST_PORT), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_esp \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_ESP, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ESP_SPI), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ah \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_AH, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_AH_SPI), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_l2tpv3 \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_L2TPV3, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_pfcp \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_PFCP, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_PFCP_SEID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_gtpc \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_GTPC, 0, { BUFF_NOUSED } \
|
|
}
|
|
|
|
#define proto_hdr_ecpri \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_ECPRI, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_l2tpv2 \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_L2TPV2, \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
|
|
FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), \
|
|
{ \
|
|
BUFF_NOUSED \
|
|
} \
|
|
}
|
|
|
|
#define proto_hdr_ppp \
|
|
{ \
|
|
VIRTCHNL_PROTO_HDR_PPP, 0, { BUFF_NOUSED } \
|
|
}
|
|
|
|
#define TUNNEL_LEVEL_OUTER 0
|
|
#define TUNNEL_LEVEL_INNER 1
|
|
|
|
/* proto_hdrs template */
|
|
struct virtchnl_proto_hdrs outer_ipv4_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
4,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv4 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv4_udp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
|
|
proto_hdr_ipv4_with_prot, proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv4_tcp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
|
|
proto_hdr_ipv4_with_prot, proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv4_sctp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv4,
|
|
proto_hdr_sctp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
4,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6,
|
|
proto_hdr_ipv6_frag } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
|
|
proto_hdr_ipv6_with_prot, proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv6_tcp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
|
|
proto_hdr_ipv6_with_prot, proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs outer_ipv6_sctp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6,
|
|
proto_hdr_sctp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv4_tmplt = { TUNNEL_LEVEL_INNER,
|
|
1,
|
|
{ { proto_hdr_ipv4 } } };
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv4_udp_tmplt = {
|
|
TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv4_tcp_tmplt = {
|
|
TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs second_inner_ipv4_tmplt = {
|
|
2, 1, { { proto_hdr_ipv4 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs second_inner_ipv4_udp_tmplt = {
|
|
2, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs second_inner_ipv4_tcp_tmplt = {
|
|
2, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs second_inner_ipv6_tmplt = {
|
|
2, 1, { { proto_hdr_ipv6 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs second_inner_ipv6_udp_tmplt = {
|
|
2, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs second_inner_ipv6_tcp_tmplt = {
|
|
2, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv4_sctp_tmplt = {
|
|
TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv4, proto_hdr_sctp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv6_tmplt = { TUNNEL_LEVEL_INNER,
|
|
1,
|
|
{ { proto_hdr_ipv6 } } };
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv6_udp_tmplt = {
|
|
TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv6_tcp_tmplt = {
|
|
TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs inner_ipv6_sctp_tmplt = {
|
|
TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv6, proto_hdr_sctp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_esp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_esp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_udp_esp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv4, proto_hdr_udp, proto_hdr_esp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_ah_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_ah } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_esp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_esp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_udp_esp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv6, proto_hdr_udp, proto_hdr_esp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_ah_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_ah } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_l2tpv3_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_l2tpv3 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_l2tpv3_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_l2tpv3 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_pfcp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_pfcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_pfcp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_pfcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_udp_gtpc_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv4, proto_hdr_udp, proto_hdr_gtpc } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_udp_gtpc_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv6, proto_hdr_udp, proto_hdr_gtpc } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs eth_ecpri_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_eth, proto_hdr_ecpri } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
|
|
TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ecpri } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_tmplt = {
|
|
TUNNEL_LEVEL_INNER,
|
|
3,
|
|
{ { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv4 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tmplt = {
|
|
TUNNEL_LEVEL_INNER,
|
|
3,
|
|
{ { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv6 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_udp_tmplt = {
|
|
TUNNEL_LEVEL_INNER,
|
|
4,
|
|
{ { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv4_with_prot,
|
|
proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_tcp_tmplt = {
|
|
TUNNEL_LEVEL_INNER,
|
|
4,
|
|
{ { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv4_with_prot,
|
|
proto_hdr_tcp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_udp_tmplt = {
|
|
TUNNEL_LEVEL_INNER,
|
|
4,
|
|
{ { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv6_with_prot,
|
|
proto_hdr_udp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
|
|
TUNNEL_LEVEL_INNER,
|
|
4,
|
|
{ { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv6_with_prot,
|
|
proto_hdr_tcp } }
|
|
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
4,
|
|
{ { proto_hdr_eth, proto_hdr_ipv4, proto_hdr_udp, proto_hdr_l2tpv2 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
4,
|
|
{ { proto_hdr_eth, proto_hdr_ipv6, proto_hdr_udp, proto_hdr_l2tpv2 } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_ipv4, proto_hdr_udp, proto_hdr_l2tpv2,
|
|
proto_hdr_ppp } }
|
|
};
|
|
|
|
struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
|
|
TUNNEL_LEVEL_OUTER,
|
|
5,
|
|
{ { proto_hdr_eth, proto_hdr_ipv6, proto_hdr_udp, proto_hdr_l2tpv2,
|
|
proto_hdr_ppp } }
|
|
};
|
|
|
|
/* rss type super set */
|
|
|
|
#define AVF_INSET_NONE 0ULL
|
|
|
|
/* IPv4 outer */
|
|
#define AVF_RSS_TYPE_OUTER_IPV4 \
|
|
(AVF_ETH_RSS_ETH | AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 | \
|
|
AVF_ETH_RSS_IPV4_CHKSUM)
|
|
#define AVF_RSS_TYPE_OUTER_IPV4_UDP \
|
|
(AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_UDP | \
|
|
AVF_ETH_RSS_L4_CHKSUM)
|
|
#define AVF_RSS_TYPE_OUTER_IPV4_TCP \
|
|
(AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_TCP | \
|
|
AVF_ETH_RSS_L4_CHKSUM)
|
|
#define AVF_RSS_TYPE_OUTER_IPV4_SCTP \
|
|
(AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_SCTP | \
|
|
AVF_ETH_RSS_L4_CHKSUM)
|
|
/* IPv6 outer */
|
|
#define AVF_RSS_TYPE_OUTER_IPV6 (AVF_ETH_RSS_ETH | AVF_ETH_RSS_IPV6)
|
|
#define AVF_RSS_TYPE_OUTER_IPV6_FRAG \
|
|
(AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_FRAG_IPV6)
|
|
#define AVF_RSS_TYPE_OUTER_IPV6_UDP \
|
|
(AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_UDP | \
|
|
AVF_ETH_RSS_L4_CHKSUM)
|
|
#define AVF_RSS_TYPE_OUTER_IPV6_TCP \
|
|
(AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_TCP | \
|
|
AVF_ETH_RSS_L4_CHKSUM)
|
|
#define AVF_RSS_TYPE_OUTER_IPV6_SCTP \
|
|
(AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_SCTP | \
|
|
AVF_ETH_RSS_L4_CHKSUM)
|
|
/* VLAN IPV4 */
|
|
#define AVF_RSS_TYPE_VLAN_IPV4 \
|
|
(AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV4_UDP \
|
|
(AVF_RSS_TYPE_OUTER_IPV4_UDP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV4_TCP \
|
|
(AVF_RSS_TYPE_OUTER_IPV4_TCP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV4_SCTP \
|
|
(AVF_RSS_TYPE_OUTER_IPV4_SCTP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
/* VLAN IPv6 */
|
|
#define AVF_RSS_TYPE_VLAN_IPV6 \
|
|
(AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV6_FRAG \
|
|
(AVF_RSS_TYPE_OUTER_IPV6_FRAG | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV6_UDP \
|
|
(AVF_RSS_TYPE_OUTER_IPV6_UDP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV6_TCP \
|
|
(AVF_RSS_TYPE_OUTER_IPV6_TCP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
#define AVF_RSS_TYPE_VLAN_IPV6_SCTP \
|
|
(AVF_RSS_TYPE_OUTER_IPV6_SCTP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
|
|
/* IPv4 inner */
|
|
#define AVF_RSS_TYPE_INNER_IPV4 AVF_ETH_RSS_IPV4
|
|
#define AVF_RSS_TYPE_INNER_IPV4_UDP \
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_UDP)
|
|
#define AVF_RSS_TYPE_INNER_IPV4_TCP \
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_TCP)
|
|
#define AVF_RSS_TYPE_INNER_IPV4_SCTP \
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_SCTP)
|
|
/* IPv6 inner */
|
|
#define AVF_RSS_TYPE_INNER_IPV6 AVF_ETH_RSS_IPV6
|
|
#define AVF_RSS_TYPE_INNER_IPV6_UDP \
|
|
(AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_UDP)
|
|
#define AVF_RSS_TYPE_INNER_IPV6_TCP \
|
|
(AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_TCP)
|
|
#define AVF_RSS_TYPE_INNER_IPV6_SCTP \
|
|
(AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_SCTP)
|
|
/* GTPU IPv4 */
|
|
#define AVF_RSS_TYPE_GTPU_IPV4 (AVF_RSS_TYPE_INNER_IPV4 | AVF_ETH_RSS_GTPU)
|
|
#define AVF_RSS_TYPE_GTPU_IPV4_UDP \
|
|
(AVF_RSS_TYPE_INNER_IPV4_UDP | AVF_ETH_RSS_GTPU)
|
|
#define AVF_RSS_TYPE_GTPU_IPV4_TCP \
|
|
(AVF_RSS_TYPE_INNER_IPV4_TCP | AVF_ETH_RSS_GTPU)
|
|
/* GTPU IPv6 */
|
|
#define AVF_RSS_TYPE_GTPU_IPV6 (AVF_RSS_TYPE_INNER_IPV6 | AVF_ETH_RSS_GTPU)
|
|
#define AVF_RSS_TYPE_GTPU_IPV6_UDP \
|
|
(AVF_RSS_TYPE_INNER_IPV6_UDP | AVF_ETH_RSS_GTPU)
|
|
#define AVF_RSS_TYPE_GTPU_IPV6_TCP \
|
|
(AVF_RSS_TYPE_INNER_IPV6_TCP | AVF_ETH_RSS_GTPU)
|
|
/* ESP, AH, L2TPV3 and PFCP */
|
|
#define AVF_RSS_TYPE_IPV4_ESP (AVF_ETH_RSS_ESP | AVF_ETH_RSS_IPV4)
|
|
#define AVF_RSS_TYPE_IPV4_AH (AVF_ETH_RSS_AH | AVF_ETH_RSS_IPV4)
|
|
#define AVF_RSS_TYPE_IPV6_ESP (AVF_ETH_RSS_ESP | AVF_ETH_RSS_IPV6)
|
|
#define AVF_RSS_TYPE_IPV6_AH (AVF_ETH_RSS_AH | AVF_ETH_RSS_IPV6)
|
|
#define AVF_RSS_TYPE_IPV4_L2TPV3 (AVF_ETH_RSS_L2TPV3 | AVF_ETH_RSS_IPV4)
|
|
#define AVF_RSS_TYPE_IPV6_L2TPV3 (AVF_ETH_RSS_L2TPV3 | AVF_ETH_RSS_IPV6)
|
|
#define AVF_RSS_TYPE_IPV4_PFCP (AVF_ETH_RSS_PFCP | AVF_ETH_RSS_IPV4)
|
|
#define AVF_RSS_TYPE_IPV6_PFCP (AVF_ETH_RSS_PFCP | AVF_ETH_RSS_IPV6)
|
|
|
|
/* L2TPv2 */
|
|
#define AVF_RSS_TYPE_ETH_L2TPV2 (AVF_ETH_RSS_ETH | AVF_ETH_RSS_L2TPV2)
|
|
|
|
#define VALID_RSS_IPV4_L4 \
|
|
(AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV4_TCP | \
|
|
AVF_ETH_RSS_NONFRAG_IPV4_SCTP)
|
|
|
|
#define VALID_RSS_IPV6_L4 \
|
|
(AVF_ETH_RSS_NONFRAG_IPV6_UDP | AVF_ETH_RSS_NONFRAG_IPV6_TCP | \
|
|
AVF_ETH_RSS_NONFRAG_IPV6_SCTP)
|
|
|
|
#define VALID_RSS_IPV4 \
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 | VALID_RSS_IPV4_L4)
|
|
#define VALID_RSS_IPV6 \
|
|
(AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_FRAG_IPV6 | VALID_RSS_IPV6_L4)
|
|
#define VALID_RSS_L3 (VALID_RSS_IPV4 | VALID_RSS_IPV6)
|
|
#define VALID_RSS_L4 (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
|
|
|
|
#define VALID_RSS_ATTR \
|
|
(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY | \
|
|
AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY | \
|
|
AVF_ETH_RSS_L2_SRC_ONLY | AVF_ETH_RSS_L2_DST_ONLY | AVF_ETH_RSS_L3_PRE64)
|
|
|
|
#define INVALID_RSS_ATTR \
|
|
(AVF_ETH_RSS_L3_PRE32 | AVF_ETH_RSS_L3_PRE40 | AVF_ETH_RSS_L3_PRE48 | \
|
|
AVF_ETH_RSS_L3_PRE56 | AVF_ETH_RSS_L3_PRE96)
|
|
|
|
static u64 invalid_rss_comb[] = {
|
|
AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_UDP,
|
|
AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_TCP,
|
|
AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_UDP,
|
|
AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_TCP,
|
|
AVF_ETH_RSS_L3_PRE32 | AVF_ETH_RSS_L3_PRE40 | AVF_ETH_RSS_L3_PRE48 |
|
|
AVF_ETH_RSS_L3_PRE56 | AVF_ETH_RSS_L3_PRE96
|
|
};
|
|
|
|
struct rss_attr_type
|
|
{
|
|
u64 attr;
|
|
u64 type;
|
|
};
|
|
|
|
static struct rss_attr_type rss_attr_to_valid_type[] = {
|
|
{ AVF_ETH_RSS_L2_SRC_ONLY | AVF_ETH_RSS_L2_DST_ONLY, AVF_ETH_RSS_ETH },
|
|
{ AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY, VALID_RSS_L3 },
|
|
{ AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY, VALID_RSS_L4 },
|
|
/* current ipv6 prefix only supports prefix 64 bits*/
|
|
{ AVF_ETH_RSS_L3_PRE64, VALID_RSS_IPV6 },
|
|
{ INVALID_RSS_ATTR, 0 }
|
|
};
|
|
|
|
/* raw */
|
|
enum avf_flow_item_type avf_pattern_raw[] = {
|
|
AVF_FLOW_ITEM_TYPE_RAW,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* empty */
|
|
enum avf_flow_item_type avf_pattern_empty[] = {
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* L2 */
|
|
enum avf_flow_item_type avf_pattern_ethertype[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_ethertype_vlan[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_ethertype_qinq[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* ARP */
|
|
enum avf_flow_item_type avf_pattern_eth_arp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* non-tunnel IPv4 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_sctp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_SCTP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_sctp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_sctp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_ICMP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* non-tunnel IPv6 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_frag_ext[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_frag_ext[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_frag_ext[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_sctp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_SCTP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_sctp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_sctp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_icmp6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_ICMP6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_icmp6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_ICMP6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_icmp6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_ICMP6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 GTPC */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpc[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GTPU (EH) */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 GTPC */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpc[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GTPU (EH) */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GTPU IPv4 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_ICMP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv4 UDP GTPU IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv4 UDP GTPU IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv6 UDP GTPU IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv6 UDP GTPU IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GRE IPv4 UDP GTPU IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv4 UDP GTPU IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GRE IPv6 UDP GTPU IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GRE IPv6 UDP GTPU IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv4 UDP GTPU EH IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv4 UDP GTPU IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv6 UDP GTPU EH IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv6 UDP GTPU EH IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GRE IPv4 UDP GTPU EH IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GRE IPv4 UDP GTPU EH IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GRE IPv6 UDP GTPU EH IPv4*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GRE IPv6 UDP GTPU EH IPv6*/
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
|
|
AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GTPU IPv6 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_ICMP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GTPU IPv4 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_ICMP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GTPU IPv6 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_ICMP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GTPU EH IPv4 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV4 GTPU EH IPv6 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GTPU EH IPv4 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPV6 GTPU EH IPv6 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* ESP */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_esp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_ESP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_esp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_ESP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_esp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_ESP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_esp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_ESP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* AH */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_ah[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_AH,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_ah[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_AH,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* L2TPV3 */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_l2tpv3[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV3OIP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_l2tpv3[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV3OIP,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* PFCP */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_pfcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_PFCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_pfcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_PFCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* ECPRI */
|
|
enum avf_flow_item_type avf_pattern_eth_ecpri[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH,
|
|
AVF_FLOW_ITEM_TYPE_ECPRI,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_ecpri[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_ECPRI, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* GRE */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
|
|
AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* PPPoL2TPv2oUDP */
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp[] = {
|
|
AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
|
|
AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
|
|
AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
static struct avf_pattern_match_item avf_hash_pattern_list[] = {
|
|
/* IPv4 */
|
|
{ avf_pattern_raw, AVF_INSET_NONE, NULL },
|
|
{ avf_pattern_eth_ipv4, AVF_RSS_TYPE_OUTER_IPV4, &outer_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp, AVF_RSS_TYPE_OUTER_IPV4_UDP,
|
|
&outer_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_tcp, AVF_RSS_TYPE_OUTER_IPV4_TCP,
|
|
&outer_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_sctp, AVF_RSS_TYPE_OUTER_IPV4_SCTP,
|
|
&outer_ipv4_sctp_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv4, AVF_RSS_TYPE_VLAN_IPV4, &outer_ipv4_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv4_udp, AVF_RSS_TYPE_VLAN_IPV4_UDP,
|
|
&outer_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv4_tcp, AVF_RSS_TYPE_VLAN_IPV4_TCP,
|
|
&outer_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv4_sctp, AVF_RSS_TYPE_VLAN_IPV4_SCTP,
|
|
&outer_ipv4_sctp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu, AVF_ETH_RSS_IPV4, &outer_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
|
|
&second_inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
|
|
&second_inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
|
|
&second_inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_esp, AVF_RSS_TYPE_IPV4_ESP, &ipv4_esp_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_esp, AVF_RSS_TYPE_IPV4_ESP, &ipv4_udp_esp_tmplt },
|
|
{ avf_pattern_eth_ipv4_ah, AVF_RSS_TYPE_IPV4_AH, &ipv4_ah_tmplt },
|
|
{ avf_pattern_eth_ipv4_l2tpv3, AVF_RSS_TYPE_IPV4_L2TPV3,
|
|
&ipv4_l2tpv3_tmplt },
|
|
{ avf_pattern_eth_ipv4_pfcp, AVF_RSS_TYPE_IPV4_PFCP, &ipv4_pfcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpc, AVF_ETH_RSS_IPV4, &ipv4_udp_gtpc_tmplt },
|
|
{ avf_pattern_eth_ecpri, AVF_ETH_RSS_ECPRI, ð_ecpri_tmplt },
|
|
{ avf_pattern_eth_ipv4_ecpri, AVF_ETH_RSS_ECPRI, &ipv4_ecpri_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4, AVF_RSS_TYPE_INNER_IPV4,
|
|
&inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4, AVF_RSS_TYPE_INNER_IPV4,
|
|
&inner_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
|
|
&inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
|
|
&inner_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
|
|
&inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
|
|
&inner_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2, AVF_RSS_TYPE_ETH_L2TPV2,
|
|
&ipv4_l2tpv2_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp, AVF_RSS_TYPE_ETH_L2TPV2,
|
|
&ipv4_l2tpv2_ppp_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, AVF_RSS_TYPE_INNER_IPV4,
|
|
&udp_l2tpv2_ppp_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
|
|
&udp_l2tpv2_ppp_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
|
|
&udp_l2tpv2_ppp_ipv4_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, AVF_RSS_TYPE_INNER_IPV4,
|
|
&udp_l2tpv2_ppp_ipv4_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
|
|
&udp_l2tpv2_ppp_ipv4_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
|
|
&udp_l2tpv2_ppp_ipv4_tcp_tmplt },
|
|
|
|
/* IPv6 */
|
|
{ avf_pattern_eth_ipv6, AVF_RSS_TYPE_OUTER_IPV6, &outer_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_frag_ext, AVF_RSS_TYPE_OUTER_IPV6_FRAG,
|
|
&outer_ipv6_frag_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp, AVF_RSS_TYPE_OUTER_IPV6_UDP,
|
|
&outer_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_tcp, AVF_RSS_TYPE_OUTER_IPV6_TCP,
|
|
&outer_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_sctp, AVF_RSS_TYPE_OUTER_IPV6_SCTP,
|
|
&outer_ipv6_sctp_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv6, AVF_RSS_TYPE_VLAN_IPV6, &outer_ipv6_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv6_frag_ext, AVF_RSS_TYPE_OUTER_IPV6_FRAG,
|
|
&outer_ipv6_frag_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv6_udp, AVF_RSS_TYPE_VLAN_IPV6_UDP,
|
|
&outer_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv6_tcp, AVF_RSS_TYPE_VLAN_IPV6_TCP,
|
|
&outer_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_vlan_ipv6_sctp, AVF_RSS_TYPE_VLAN_IPV6_SCTP,
|
|
&outer_ipv6_sctp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu, AVF_ETH_RSS_IPV6, &outer_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
|
|
&second_inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
|
|
&second_inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
|
|
&second_inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_esp, AVF_RSS_TYPE_IPV6_ESP, &ipv6_esp_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_esp, AVF_RSS_TYPE_IPV6_ESP, &ipv6_udp_esp_tmplt },
|
|
{ avf_pattern_eth_ipv6_ah, AVF_RSS_TYPE_IPV6_AH, &ipv6_ah_tmplt },
|
|
{ avf_pattern_eth_ipv6_l2tpv3, AVF_RSS_TYPE_IPV6_L2TPV3,
|
|
&ipv6_l2tpv3_tmplt },
|
|
{ avf_pattern_eth_ipv6_pfcp, AVF_RSS_TYPE_IPV6_PFCP, &ipv6_pfcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gtpc, AVF_ETH_RSS_IPV6, &ipv6_udp_gtpc_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6, AVF_RSS_TYPE_INNER_IPV6,
|
|
&inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6, AVF_RSS_TYPE_INNER_IPV6,
|
|
&inner_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
|
|
&inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
|
|
&inner_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv4_gre_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
|
|
&inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_gre_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
|
|
&inner_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2, AVF_RSS_TYPE_ETH_L2TPV2,
|
|
&ipv6_l2tpv2_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp, AVF_RSS_TYPE_ETH_L2TPV2,
|
|
&ipv6_l2tpv2_ppp_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, AVF_RSS_TYPE_INNER_IPV6,
|
|
&udp_l2tpv2_ppp_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
|
|
&udp_l2tpv2_ppp_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
|
|
&udp_l2tpv2_ppp_ipv6_tcp_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, AVF_RSS_TYPE_INNER_IPV6,
|
|
&udp_l2tpv2_ppp_ipv6_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
|
|
&udp_l2tpv2_ppp_ipv6_udp_tmplt },
|
|
{ avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
|
|
&udp_l2tpv2_ppp_ipv6_tcp_tmplt },
|
|
|
|
};
|
|
|
|
static inline u64
|
|
avf_eth_rss_hf_refine (u64 rss_hf)
|
|
{
|
|
if ((rss_hf & AVF_ETH_RSS_L3_SRC_ONLY) && (rss_hf & AVF_ETH_RSS_L3_DST_ONLY))
|
|
rss_hf &= ~(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY);
|
|
|
|
if ((rss_hf & AVF_ETH_RSS_L4_SRC_ONLY) && (rss_hf & AVF_ETH_RSS_L4_DST_ONLY))
|
|
rss_hf &= ~(AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY);
|
|
|
|
return rss_hf;
|
|
}
|
|
|
|
static int
|
|
avf_any_invalid_rss_type (enum avf_eth_hash_function rss_func, u64 rss_type,
|
|
u64 allow_rss_type)
|
|
{
|
|
u32 i;
|
|
|
|
/**
|
|
* Check if l3/l4 SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ
|
|
* hash function.
|
|
*/
|
|
if (rss_func == AVF_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
|
|
{
|
|
if (rss_type & (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY |
|
|
AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
|
|
return 1;
|
|
|
|
if (!(rss_type &
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_IPV6 |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV6_UDP |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_TCP | AVF_ETH_RSS_NONFRAG_IPV6_TCP |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_SCTP | AVF_ETH_RSS_NONFRAG_IPV6_SCTP)))
|
|
return 1;
|
|
}
|
|
|
|
/* check invalid combination */
|
|
for (i = 0; i < _vec_len (invalid_rss_comb); i++)
|
|
{
|
|
if (__builtin_popcountll (rss_type & invalid_rss_comb[i]) > 1)
|
|
return 1;
|
|
}
|
|
|
|
/* check invalid RSS attribute */
|
|
for (i = 0; i < _vec_len (rss_attr_to_valid_type); i++)
|
|
{
|
|
struct rss_attr_type *rat = &rss_attr_to_valid_type[i];
|
|
|
|
if (rat->attr & rss_type && !(rat->type & rss_type))
|
|
return 1;
|
|
}
|
|
|
|
/* check not allowed RSS type */
|
|
rss_type &= ~VALID_RSS_ATTR;
|
|
|
|
return ((rss_type & allow_rss_type) != rss_type);
|
|
}
|
|
|
|
int
|
|
avf_rss_cfg_create (struct virtchnl_rss_cfg **rss_cfg, int tunnel_level)
|
|
{
|
|
*rss_cfg = clib_mem_alloc (sizeof (**rss_cfg));
|
|
|
|
clib_memset (*rss_cfg, 0, sizeof (**rss_cfg));
|
|
|
|
(*rss_cfg)->proto_hdrs.tunnel_level = tunnel_level;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
avf_rss_rcfg_destroy (struct virtchnl_rss_cfg *rss_cfg)
|
|
{
|
|
clib_mem_free (rss_cfg);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* refine proto hdrs base on gtpu rss type */
|
|
static void
|
|
avf_refine_proto_hdrs_gtpu (struct virtchnl_proto_hdrs *proto_hdrs,
|
|
u64 rss_type)
|
|
{
|
|
struct virtchnl_proto_hdr *hdr;
|
|
int i;
|
|
|
|
if (!(rss_type & AVF_ETH_RSS_GTPU))
|
|
return;
|
|
|
|
for (i = 0; i < proto_hdrs->count; i++)
|
|
{
|
|
hdr = &proto_hdrs->proto_hdr[i];
|
|
switch (hdr->type)
|
|
{
|
|
case VIRTCHNL_PROTO_HDR_GTPU_IP:
|
|
REFINE_PROTO_FLD (ADD, GTPU_IP_TEID);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
avf_hash_add_fragment_hdr (struct virtchnl_proto_hdrs *hdrs, int layer)
|
|
{
|
|
struct virtchnl_proto_hdr *hdr1;
|
|
struct virtchnl_proto_hdr *hdr2;
|
|
int i;
|
|
|
|
if (layer < 0 || layer > hdrs->count)
|
|
return;
|
|
|
|
/* shift headers layer */
|
|
for (i = hdrs->count; i >= layer; i--)
|
|
{
|
|
hdr1 = &hdrs->proto_hdr[i];
|
|
hdr2 = &hdrs->proto_hdr[i - 1];
|
|
*hdr1 = *hdr2;
|
|
}
|
|
|
|
/* adding dummy fragment header */
|
|
hdr1 = &hdrs->proto_hdr[layer];
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, IPV4_FRAG);
|
|
hdrs->count = ++layer;
|
|
}
|
|
|
|
/* refine proto hdrs base on l2, l3, l4 rss type */
|
|
static void
|
|
avf_refine_proto_hdrs_l234 (struct virtchnl_proto_hdrs *proto_hdrs,
|
|
u64 rss_type)
|
|
{
|
|
struct virtchnl_proto_hdr *hdr;
|
|
int i;
|
|
|
|
for (i = 0; i < proto_hdrs->count; i++)
|
|
{
|
|
hdr = &proto_hdrs->proto_hdr[i];
|
|
switch (hdr->type)
|
|
{
|
|
case VIRTCHNL_PROTO_HDR_ETH:
|
|
if (!(rss_type & AVF_ETH_RSS_ETH))
|
|
hdr->field_selector = 0;
|
|
else if (rss_type & AVF_ETH_RSS_L2_SRC_ONLY)
|
|
REFINE_PROTO_FLD (DEL, ETH_DST);
|
|
else if (rss_type & AVF_ETH_RSS_L2_DST_ONLY)
|
|
REFINE_PROTO_FLD (DEL, ETH_SRC);
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_IPV4:
|
|
if (rss_type &
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV4_TCP |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_SCTP))
|
|
{
|
|
if (rss_type & AVF_ETH_RSS_FRAG_IPV4)
|
|
{
|
|
avf_hash_add_fragment_hdr (proto_hdrs, i + 1);
|
|
}
|
|
else if (rss_type & AVF_ETH_RSS_L3_SRC_ONLY)
|
|
{
|
|
REFINE_PROTO_FLD (DEL, IPV4_DST);
|
|
}
|
|
else if (rss_type & AVF_ETH_RSS_L3_DST_ONLY)
|
|
{
|
|
REFINE_PROTO_FLD (DEL, IPV4_SRC);
|
|
}
|
|
else if (rss_type &
|
|
(AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
|
|
{
|
|
REFINE_PROTO_FLD (DEL, IPV4_DST);
|
|
REFINE_PROTO_FLD (DEL, IPV4_SRC);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hdr->field_selector = 0;
|
|
}
|
|
|
|
if (rss_type & AVF_ETH_RSS_IPV4_CHKSUM)
|
|
REFINE_PROTO_FLD (ADD, IPV4_CHKSUM);
|
|
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_IPV4_FRAG:
|
|
if (rss_type &
|
|
(AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV4_TCP |
|
|
AVF_ETH_RSS_NONFRAG_IPV4_SCTP))
|
|
{
|
|
if (rss_type & AVF_ETH_RSS_FRAG_IPV4)
|
|
REFINE_PROTO_FLD (ADD, IPV4_FRAG_PKID);
|
|
}
|
|
else
|
|
{
|
|
hdr->field_selector = 0;
|
|
}
|
|
|
|
if (rss_type & AVF_ETH_RSS_IPV4_CHKSUM)
|
|
REFINE_PROTO_FLD (ADD, IPV4_CHKSUM);
|
|
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_IPV6:
|
|
if (rss_type &
|
|
(AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_FRAG_IPV6 |
|
|
AVF_ETH_RSS_NONFRAG_IPV6_UDP | AVF_ETH_RSS_NONFRAG_IPV6_TCP |
|
|
AVF_ETH_RSS_NONFRAG_IPV6_SCTP))
|
|
{
|
|
if (rss_type & AVF_ETH_RSS_L3_SRC_ONLY)
|
|
{
|
|
REFINE_PROTO_FLD (DEL, IPV6_DST);
|
|
}
|
|
else if (rss_type & AVF_ETH_RSS_L3_DST_ONLY)
|
|
{
|
|
REFINE_PROTO_FLD (DEL, IPV6_SRC);
|
|
}
|
|
else if (rss_type &
|
|
(AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
|
|
{
|
|
REFINE_PROTO_FLD (DEL, IPV6_DST);
|
|
REFINE_PROTO_FLD (DEL, IPV6_SRC);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hdr->field_selector = 0;
|
|
}
|
|
if (rss_type & AVF_ETH_RSS_L3_PRE64)
|
|
{
|
|
if (REFINE_PROTO_FLD (TEST, IPV6_SRC))
|
|
REPALCE_PROTO_FLD (IPV6_SRC, IPV6_PREFIX64_SRC);
|
|
if (REFINE_PROTO_FLD (TEST, IPV6_DST))
|
|
REPALCE_PROTO_FLD (IPV6_DST, IPV6_PREFIX64_DST);
|
|
}
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG:
|
|
if (rss_type & AVF_ETH_RSS_FRAG_IPV6)
|
|
REFINE_PROTO_FLD (ADD, IPV6_EH_FRAG_PKID);
|
|
else
|
|
hdr->field_selector = 0;
|
|
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_UDP:
|
|
if (rss_type &
|
|
(AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV6_UDP))
|
|
{
|
|
if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
|
|
REFINE_PROTO_FLD (DEL, UDP_DST_PORT);
|
|
else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
|
|
REFINE_PROTO_FLD (DEL, UDP_SRC_PORT);
|
|
else if (rss_type &
|
|
(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
|
|
hdr->field_selector = 0;
|
|
}
|
|
else
|
|
{
|
|
hdr->field_selector = 0;
|
|
}
|
|
|
|
if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
|
|
REFINE_PROTO_FLD (ADD, UDP_CHKSUM);
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_TCP:
|
|
if (rss_type &
|
|
(AVF_ETH_RSS_NONFRAG_IPV4_TCP | AVF_ETH_RSS_NONFRAG_IPV6_TCP))
|
|
{
|
|
if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
|
|
REFINE_PROTO_FLD (DEL, TCP_DST_PORT);
|
|
else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
|
|
REFINE_PROTO_FLD (DEL, TCP_SRC_PORT);
|
|
else if (rss_type &
|
|
(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
|
|
hdr->field_selector = 0;
|
|
}
|
|
else
|
|
{
|
|
hdr->field_selector = 0;
|
|
}
|
|
|
|
if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
|
|
REFINE_PROTO_FLD (ADD, TCP_CHKSUM);
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_SCTP:
|
|
if (rss_type &
|
|
(AVF_ETH_RSS_NONFRAG_IPV4_SCTP | AVF_ETH_RSS_NONFRAG_IPV6_SCTP))
|
|
{
|
|
if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
|
|
REFINE_PROTO_FLD (DEL, SCTP_DST_PORT);
|
|
else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
|
|
REFINE_PROTO_FLD (DEL, SCTP_SRC_PORT);
|
|
else if (rss_type &
|
|
(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
|
|
hdr->field_selector = 0;
|
|
}
|
|
else
|
|
{
|
|
hdr->field_selector = 0;
|
|
}
|
|
|
|
if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
|
|
REFINE_PROTO_FLD (ADD, SCTP_CHKSUM);
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_S_VLAN:
|
|
if (!(rss_type & AVF_ETH_RSS_S_VLAN))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_C_VLAN:
|
|
if (!(rss_type & AVF_ETH_RSS_C_VLAN))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_L2TPV3:
|
|
if (!(rss_type & AVF_ETH_RSS_L2TPV3))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_ESP:
|
|
if (!(rss_type & AVF_ETH_RSS_ESP))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_AH:
|
|
if (!(rss_type & AVF_ETH_RSS_AH))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_PFCP:
|
|
if (!(rss_type & AVF_ETH_RSS_PFCP))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_ECPRI:
|
|
if (!(rss_type & AVF_ETH_RSS_ECPRI))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
case VIRTCHNL_PROTO_HDR_L2TPV2:
|
|
if (!(rss_type & AVF_ETH_RSS_L2TPV2))
|
|
hdr->field_selector = 0;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
avf_refine_proto_hdrs_by_pattern (struct virtchnl_proto_hdrs *proto_hdrs,
|
|
u64 phint)
|
|
{
|
|
struct virtchnl_proto_hdr *hdr1;
|
|
struct virtchnl_proto_hdr *hdr2;
|
|
int i, shift_count = 1;
|
|
int tun_lvl = proto_hdrs->tunnel_level;
|
|
|
|
if (!(phint & AVF_PHINT_GTPU_MSK) && !(phint & AVF_PHINT_GRE))
|
|
return;
|
|
|
|
while (tun_lvl)
|
|
{
|
|
if (phint & AVF_PHINT_LAYERS_MSK)
|
|
shift_count = 2;
|
|
|
|
/* shift headers layer */
|
|
for (i = proto_hdrs->count - 1 + shift_count; i > shift_count - 1; i--)
|
|
{
|
|
hdr1 = &proto_hdrs->proto_hdr[i];
|
|
hdr2 = &proto_hdrs->proto_hdr[i - shift_count];
|
|
*hdr1 = *hdr2;
|
|
}
|
|
|
|
if (shift_count == 1)
|
|
{
|
|
/* adding tunnel header at layer 0 */
|
|
hdr1 = &proto_hdrs->proto_hdr[0];
|
|
}
|
|
else
|
|
{
|
|
/* adding tunnel header and outer ip header */
|
|
hdr1 = &proto_hdrs->proto_hdr[1];
|
|
hdr2 = &proto_hdrs->proto_hdr[0];
|
|
hdr2->field_selector = 0;
|
|
proto_hdrs->count++;
|
|
tun_lvl--;
|
|
|
|
if (tun_lvl == TUNNEL_LEVEL_OUTER)
|
|
{
|
|
if (phint & AVF_PHINT_OUTER_IPV4)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV4);
|
|
else if (phint & AVF_PHINT_OUTER_IPV6)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV6);
|
|
}
|
|
else if (tun_lvl == TUNNEL_LEVEL_INNER)
|
|
{
|
|
if (phint & AVF_PHINT_MID_IPV4)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV4);
|
|
else if (phint & AVF_PHINT_MID_IPV6)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV6);
|
|
}
|
|
}
|
|
|
|
hdr1->field_selector = 0;
|
|
proto_hdrs->count++;
|
|
|
|
if (phint & AVF_PHINT_GTPU_EH_DWN)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH_PDU_DWN);
|
|
else if (phint & AVF_PHINT_GTPU_EH_UP)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH_PDU_UP);
|
|
else if (phint & AVF_PHINT_GTPU_EH)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH);
|
|
else if (phint & AVF_PHINT_GTPU)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_IP);
|
|
|
|
if (phint & AVF_PHINT_GRE)
|
|
{
|
|
if (phint & AVF_PHINT_GTPU)
|
|
{
|
|
/* if GTPoGRE, add GRE header at the outer tunnel */
|
|
if (tun_lvl == TUNNEL_LEVEL_OUTER)
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GRE);
|
|
}
|
|
else
|
|
{
|
|
VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GRE);
|
|
}
|
|
}
|
|
}
|
|
proto_hdrs->tunnel_level = tun_lvl;
|
|
}
|
|
|
|
static void
|
|
avf_refine_proto_hdrs (struct virtchnl_proto_hdrs *proto_hdrs, u64 rss_type,
|
|
u64 phint)
|
|
{
|
|
avf_refine_proto_hdrs_l234 (proto_hdrs, rss_type);
|
|
avf_refine_proto_hdrs_by_pattern (proto_hdrs, phint);
|
|
avf_refine_proto_hdrs_gtpu (proto_hdrs, rss_type);
|
|
}
|
|
|
|
static int
|
|
avf_rss_parse_action (const struct avf_flow_action actions[],
|
|
struct virtchnl_rss_cfg *rss_cfg,
|
|
struct avf_pattern_match_item *match_item, u64 phint,
|
|
struct avf_flow_error *error)
|
|
{
|
|
const struct avf_flow_action_rss *rss;
|
|
const struct avf_flow_action *action;
|
|
u64 rss_type;
|
|
int ret;
|
|
|
|
for (action = actions; action->type != AVF_FLOW_ACTION_TYPE_END; action++)
|
|
{
|
|
switch (action->type)
|
|
{
|
|
case AVF_FLOW_ACTION_TYPE_RSS:
|
|
rss = action->conf;
|
|
|
|
if (rss->func == AVF_ETH_HASH_FUNCTION_SIMPLE_XOR)
|
|
{
|
|
rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
|
|
ret = avf_flow_error_set (error, AVF_FAILURE,
|
|
AVF_FLOW_ERROR_TYPE_ACTION, actions,
|
|
"simple xor is not supported.");
|
|
return ret;
|
|
}
|
|
else if (rss->func == AVF_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
|
|
{
|
|
rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
|
|
}
|
|
else
|
|
{
|
|
rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
|
|
}
|
|
|
|
if (rss->level)
|
|
return avf_flow_error_set (
|
|
error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ACTION, actions,
|
|
"a nonzero RSS encapsulation level is not supported");
|
|
|
|
if (rss->key_len)
|
|
return avf_flow_error_set (
|
|
error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ACTION, actions,
|
|
"a nonzero RSS key_len is not supported");
|
|
|
|
if (rss->queue_num)
|
|
return avf_flow_error_set (
|
|
error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ACTION, actions,
|
|
"a non-NULL RSS queue is not supported");
|
|
|
|
if (phint == AVF_PHINT_RAW)
|
|
break;
|
|
|
|
rss_type = avf_eth_rss_hf_refine (rss->types);
|
|
|
|
if (avf_any_invalid_rss_type (rss->func, rss_type,
|
|
match_item->input_set_mask))
|
|
return avf_flow_error_set (error, AVF_FAILURE,
|
|
AVF_FLOW_ERROR_TYPE_ACTION, actions,
|
|
"RSS type not supported");
|
|
|
|
memcpy (&rss_cfg->proto_hdrs, match_item->meta,
|
|
sizeof (struct virtchnl_proto_hdrs));
|
|
|
|
avf_refine_proto_hdrs (&rss_cfg->proto_hdrs, rss_type, phint);
|
|
|
|
break;
|
|
|
|
default:
|
|
return avf_flow_error_set (error, AVF_FAILURE,
|
|
AVF_FLOW_ERROR_TYPE_ACTION, actions,
|
|
"Invalid action.");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
avf_rss_parse_generic_pattern (struct virtchnl_rss_cfg *rss_cfg,
|
|
struct avf_flow_item avf_items[],
|
|
struct avf_flow_error *error)
|
|
{
|
|
struct avf_flow_item *item = avf_items;
|
|
u8 *pkt_buf, *msk_buf;
|
|
u16 spec_len, pkt_len;
|
|
|
|
spec_len = clib_strnlen (item->spec, VIRTCHNL_MAX_SIZE_GEN_PACKET);
|
|
pkt_len = spec_len / 2;
|
|
|
|
pkt_buf = clib_mem_alloc (pkt_len);
|
|
msk_buf = clib_mem_alloc (pkt_len);
|
|
|
|
avf_parse_generic_pattern (item, pkt_buf, msk_buf, spec_len);
|
|
|
|
clib_memcpy (rss_cfg->proto_hdrs.raw.spec, pkt_buf, pkt_len);
|
|
clib_memcpy (rss_cfg->proto_hdrs.raw.mask, msk_buf, pkt_len);
|
|
|
|
rss_cfg->proto_hdrs.count = 0;
|
|
rss_cfg->proto_hdrs.tunnel_level = 0;
|
|
rss_cfg->proto_hdrs.raw.pkt_len = pkt_len;
|
|
|
|
clib_mem_free (pkt_buf);
|
|
clib_mem_free (msk_buf);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Find the first VOID or non-VOID item pointer */
|
|
static const struct avf_flow_item *
|
|
avf_find_first_item (const struct avf_flow_item *item, int is_void)
|
|
{
|
|
int is_find;
|
|
|
|
while (item->type != AVF_FLOW_ITEM_TYPE_END)
|
|
{
|
|
if (is_void)
|
|
is_find = item->type == AVF_FLOW_ITEM_TYPE_VOID;
|
|
else
|
|
is_find = item->type != AVF_FLOW_ITEM_TYPE_VOID;
|
|
if (is_find)
|
|
break;
|
|
item++;
|
|
}
|
|
return item;
|
|
}
|
|
|
|
/* Skip all VOID items of the pattern */
|
|
static void
|
|
avf_pattern_skip_void_item (struct avf_flow_item *items,
|
|
const struct avf_flow_item *pattern)
|
|
{
|
|
u32 cpy_count = 0;
|
|
const struct avf_flow_item *pb = pattern, *pe = pattern;
|
|
|
|
for (;;)
|
|
{
|
|
/* Find a non-void item first */
|
|
pb = avf_find_first_item (pb, 0);
|
|
if (pb->type == AVF_FLOW_ITEM_TYPE_END)
|
|
{
|
|
pe = pb;
|
|
break;
|
|
}
|
|
|
|
/* Find a void item */
|
|
pe = avf_find_first_item (pb + 1, 1);
|
|
|
|
cpy_count = pe - pb;
|
|
clib_memcpy (items, pb, sizeof (struct avf_flow_item) * cpy_count);
|
|
|
|
items += cpy_count;
|
|
|
|
if (pe->type == AVF_FLOW_ITEM_TYPE_END)
|
|
break;
|
|
|
|
pb = pe + 1;
|
|
}
|
|
/* Copy the END item. */
|
|
clib_memcpy (items, pe, sizeof (struct avf_flow_item));
|
|
}
|
|
|
|
/* Check if the pattern matches a supported item type array */
|
|
static int
|
|
avf_match_pattern (enum avf_flow_item_type *item_array,
|
|
const struct avf_flow_item *pattern)
|
|
{
|
|
const struct avf_flow_item *item = pattern;
|
|
|
|
while ((*item_array == item->type) &&
|
|
(*item_array != AVF_FLOW_ITEM_TYPE_END))
|
|
{
|
|
item_array++;
|
|
item++;
|
|
}
|
|
|
|
return (*item_array == AVF_FLOW_ITEM_TYPE_END &&
|
|
item->type == AVF_FLOW_ITEM_TYPE_END);
|
|
}
|
|
|
|
static int
|
|
avf_rss_search_pattern_match_item (const struct avf_flow_item pattern[],
|
|
struct avf_pattern_match_item **match_item,
|
|
struct avf_flow_error *error)
|
|
{
|
|
u16 i = 0;
|
|
struct avf_pattern_match_item *array = avf_hash_pattern_list;
|
|
u32 array_len =
|
|
sizeof (avf_hash_pattern_list) / sizeof (avf_hash_pattern_list[0]);
|
|
/* need free by each filter */
|
|
struct avf_flow_item *items; /* used for pattern without VOID items */
|
|
u32 item_num = 0; /* non-void item number */
|
|
|
|
/* Get the non-void item number of pattern */
|
|
while ((pattern + i)->type != AVF_FLOW_ITEM_TYPE_END)
|
|
{
|
|
if ((pattern + i)->type != AVF_FLOW_ITEM_TYPE_VOID)
|
|
item_num++;
|
|
i++;
|
|
}
|
|
item_num++;
|
|
|
|
items = clib_mem_alloc (item_num * sizeof (struct avf_flow_item));
|
|
avf_pattern_skip_void_item (items, pattern);
|
|
|
|
for (i = 0; i < array_len; i++)
|
|
if (avf_match_pattern (array[i].pattern_list, items))
|
|
{
|
|
*match_item = &array[i];
|
|
clib_mem_free (items);
|
|
return 0;
|
|
}
|
|
avf_flow_error_set (error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ITEM, pattern,
|
|
"Unsupported pattern");
|
|
|
|
*match_item = NULL;
|
|
clib_mem_free (items);
|
|
return -1;
|
|
}
|
|
|
|
static void
|
|
avf_rss_parse_pattern (const struct avf_flow_item pattern[], u64 *phint)
|
|
{
|
|
const struct avf_flow_item *item = pattern;
|
|
const struct avf_gtp_psc_hdr *psc;
|
|
|
|
for (item = pattern; item->type != AVF_FLOW_ITEM_TYPE_END; item++)
|
|
{
|
|
|
|
switch (item->type)
|
|
{
|
|
case AVF_FLOW_ITEM_TYPE_RAW:
|
|
*phint |= AVF_PHINT_RAW;
|
|
break;
|
|
case AVF_FLOW_ITEM_TYPE_IPV4:
|
|
if (!(*phint & AVF_PHINT_GTPU_MSK) && !(*phint & AVF_PHINT_GRE) &&
|
|
!(*phint & AVF_PHINT_L2TPV2))
|
|
*phint |= AVF_PHINT_OUTER_IPV4;
|
|
if ((*phint & AVF_PHINT_GRE) && !(*phint & AVF_PHINT_GTPU_MSK))
|
|
*phint |= AVF_PHINT_MID_IPV4;
|
|
break;
|
|
case AVF_FLOW_ITEM_TYPE_IPV6:
|
|
if (!(*phint & AVF_PHINT_GTPU_MSK) && !(*phint & AVF_PHINT_GRE) &&
|
|
!(*phint & AVF_PHINT_L2TPV2))
|
|
*phint |= AVF_PHINT_OUTER_IPV6;
|
|
if ((*phint & AVF_PHINT_GRE) && !(*phint & AVF_PHINT_GTPU_MSK))
|
|
*phint |= AVF_PHINT_MID_IPV6;
|
|
break;
|
|
case AVF_FLOW_ITEM_TYPE_GTPU:
|
|
*phint |= AVF_PHINT_GTPU;
|
|
break;
|
|
case AVF_FLOW_ITEM_TYPE_GTP_PSC:
|
|
*phint |= AVF_PHINT_GTPU_EH;
|
|
psc = item->spec;
|
|
if (!psc)
|
|
break;
|
|
else if (psc->pdu_type == AVF_GTPU_EH_UPLINK)
|
|
*phint |= AVF_PHINT_GTPU_EH_UP;
|
|
else if (psc->pdu_type == AVF_GTPU_EH_DWNLINK)
|
|
*phint |= AVF_PHINT_GTPU_EH_DWN;
|
|
break;
|
|
case AVF_FLOW_ITEM_TYPE_GRE:
|
|
*phint |= AVF_PHINT_GRE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
avf_rss_parse_pattern_action (struct avf_flow_item avf_items[],
|
|
struct avf_flow_action avf_actions[],
|
|
struct virtchnl_rss_cfg *rss_cfg,
|
|
struct avf_flow_error *error)
|
|
{
|
|
struct avf_pattern_match_item *match_item = NULL;
|
|
u64 pattern_hint = 0;
|
|
int ret = 0;
|
|
|
|
ret = avf_rss_search_pattern_match_item (avf_items, &match_item, error);
|
|
if (ret)
|
|
return ret;
|
|
|
|
avf_rss_parse_pattern (avf_items, &pattern_hint);
|
|
|
|
if (pattern_hint == AVF_PHINT_RAW)
|
|
{
|
|
ret = avf_rss_parse_generic_pattern (rss_cfg, avf_items, error);
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
|
|
ret = avf_rss_parse_action (avf_actions, rss_cfg, match_item, pattern_hint,
|
|
error);
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
avf_rss_rule_create (struct avf_flow_vc_ctx *ctx,
|
|
struct virtchnl_rss_cfg *rss_cfg)
|
|
{
|
|
int ret;
|
|
|
|
ret = ctx->vc_op (ctx->vc_hdl, VIRTCHNL_ADV_OP_ADD_RSS_CFG, rss_cfg,
|
|
sizeof (*rss_cfg), 0, 0);
|
|
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
avf_rss_rule_destroy (struct avf_flow_vc_ctx *ctx,
|
|
struct virtchnl_rss_cfg *rss_cfg)
|
|
{
|
|
int ret;
|
|
|
|
ret = ctx->vc_op (ctx->vc_hdl, VIRTCHNL_ADV_OP_DEL_RSS_CFG, rss_cfg,
|
|
sizeof (*rss_cfg), 0, 0);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/*
|
|
* fd.io coding-style-patch-verification: ON
|
|
*
|
|
* Local Variables:
|
|
* eval: (c-set-style "gnu")
|
|
* End:
|
|
*/
|