Skip to content

Commit

Permalink
ice: refactor PTYPE validating
Browse files Browse the repository at this point in the history
Since the capability of a PTYPE within a specific package could be
negotiated by checking the HW bit map, it means that there's no need
to maintain a different PTYPE list for each type of the package when
parsing PTYPE. So refactor the PTYPE validating mechanism.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
Tested-by: Tony Brelinski <tony.brelinski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Jeff Guo authored and Tony Nguyen committed Dec 14, 2021
1 parent 8818b95 commit 60f44fe
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 372 deletions.
22 changes: 22 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_flex_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,24 @@ enum ice_sect {
ICE_SECT_COUNT
};

/* Packet Type (PTYPE) values */
#define ICE_PTYPE_MAC_PAY 1
#define ICE_PTYPE_IPV4_PAY 23
#define ICE_PTYPE_IPV4_UDP_PAY 24
#define ICE_PTYPE_IPV4_TCP_PAY 26
#define ICE_PTYPE_IPV4_SCTP_PAY 27
#define ICE_PTYPE_IPV6_PAY 89
#define ICE_PTYPE_IPV6_UDP_PAY 90
#define ICE_PTYPE_IPV6_TCP_PAY 92
#define ICE_PTYPE_IPV6_SCTP_PAY 93
#define ICE_MAC_IPV4_ESP 160
#define ICE_MAC_IPV6_ESP 161
#define ICE_MAC_IPV4_AH 162
#define ICE_MAC_IPV6_AH 163
#define ICE_MAC_IPV4_NAT_T_ESP 164
#define ICE_MAC_IPV6_NAT_T_ESP 165
#define ICE_MAC_IPV4_GTPU 329
#define ICE_MAC_IPV6_GTPU 330
#define ICE_MAC_IPV4_GTPU_IPV4_FRAG 331
#define ICE_MAC_IPV4_GTPU_IPV4_PAY 332
#define ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY 333
Expand All @@ -222,6 +240,10 @@ enum ice_sect {
#define ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY 348
#define ICE_MAC_IPV6_GTPU_IPV6_TCP 349
#define ICE_MAC_IPV6_GTPU_IPV6_ICMPV6 350
#define ICE_MAC_IPV4_PFCP_SESSION 352
#define ICE_MAC_IPV6_PFCP_SESSION 354
#define ICE_MAC_IPV4_L2TPV3 360
#define ICE_MAC_IPV6_L2TPV3 361

/* Attributes that can modify PTYPE definitions.
*
Expand Down
274 changes: 3 additions & 271 deletions drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,197 +47,6 @@ struct virtchnl_fdir_fltr_conf {
u32 flow_id;
};

static enum virtchnl_proto_hdr_type vc_pattern_ether[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_tcp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_TCP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_udp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_sctp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_SCTP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_tcp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_TCP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_udp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_sctp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_SCTP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_gtpu[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_GTPU_IP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_gtpu_eh[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_GTPU_IP,
VIRTCHNL_PROTO_HDR_GTPU_EH,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_l2tpv3[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_L2TPV3,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_l2tpv3[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_L2TPV3,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_esp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_ESP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_esp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_ESP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_ah[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_AH,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_ah[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_AH,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_nat_t_esp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_ESP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_nat_t_esp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_ESP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv4_pfcp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV4,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_PFCP,
VIRTCHNL_PROTO_HDR_NONE,
};

static enum virtchnl_proto_hdr_type vc_pattern_ipv6_pfcp[] = {
VIRTCHNL_PROTO_HDR_ETH,
VIRTCHNL_PROTO_HDR_IPV6,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_PFCP,
VIRTCHNL_PROTO_HDR_NONE,
};

struct virtchnl_fdir_pattern_match_item {
enum virtchnl_proto_hdr_type *list;
u64 input_set;
u64 *meta;
};

static const struct virtchnl_fdir_pattern_match_item vc_fdir_pattern_os[] = {
{vc_pattern_ipv4, 0, NULL},
{vc_pattern_ipv4_tcp, 0, NULL},
{vc_pattern_ipv4_udp, 0, NULL},
{vc_pattern_ipv4_sctp, 0, NULL},
{vc_pattern_ipv6, 0, NULL},
{vc_pattern_ipv6_tcp, 0, NULL},
{vc_pattern_ipv6_udp, 0, NULL},
{vc_pattern_ipv6_sctp, 0, NULL},
};

static const struct virtchnl_fdir_pattern_match_item vc_fdir_pattern_comms[] = {
{vc_pattern_ipv4, 0, NULL},
{vc_pattern_ipv4_tcp, 0, NULL},
{vc_pattern_ipv4_udp, 0, NULL},
{vc_pattern_ipv4_sctp, 0, NULL},
{vc_pattern_ipv6, 0, NULL},
{vc_pattern_ipv6_tcp, 0, NULL},
{vc_pattern_ipv6_udp, 0, NULL},
{vc_pattern_ipv6_sctp, 0, NULL},
{vc_pattern_ether, 0, NULL},
{vc_pattern_ipv4_gtpu, 0, NULL},
{vc_pattern_ipv4_gtpu_eh, 0, NULL},
{vc_pattern_ipv4_l2tpv3, 0, NULL},
{vc_pattern_ipv6_l2tpv3, 0, NULL},
{vc_pattern_ipv4_esp, 0, NULL},
{vc_pattern_ipv6_esp, 0, NULL},
{vc_pattern_ipv4_ah, 0, NULL},
{vc_pattern_ipv6_ah, 0, NULL},
{vc_pattern_ipv4_nat_t_esp, 0, NULL},
{vc_pattern_ipv6_nat_t_esp, 0, NULL},
{vc_pattern_ipv4_pfcp, 0, NULL},
{vc_pattern_ipv6_pfcp, 0, NULL},
};

struct virtchnl_fdir_inset_map {
enum virtchnl_proto_hdr_field field;
enum ice_flow_field fld;
Expand Down Expand Up @@ -910,83 +719,6 @@ ice_vc_fdir_config_input_set(struct ice_vf *vf, struct virtchnl_fdir_add *fltr,
return ret;
}

/**
* ice_vc_fdir_match_pattern
* @fltr: virtual channel add cmd buffer
* @type: virtual channel protocol filter header type
*
* Matching the header type by comparing fltr and type's value.
*
* Return: true on success, and false on error.
*/
static bool
ice_vc_fdir_match_pattern(struct virtchnl_fdir_add *fltr,
enum virtchnl_proto_hdr_type *type)
{
struct virtchnl_proto_hdrs *proto = &fltr->rule_cfg.proto_hdrs;
int i = 0;

while ((i < proto->count) &&
(*type == proto->proto_hdr[i].type) &&
(*type != VIRTCHNL_PROTO_HDR_NONE)) {
type++;
i++;
}

return ((i == proto->count) && (*type == VIRTCHNL_PROTO_HDR_NONE));
}

/**
* ice_vc_fdir_get_pattern - get while list pattern
* @vf: pointer to the VF info
* @len: filter list length
*
* Return: pointer to allowed filter list
*/
static const struct virtchnl_fdir_pattern_match_item *
ice_vc_fdir_get_pattern(struct ice_vf *vf, int *len)
{
const struct virtchnl_fdir_pattern_match_item *item;
struct ice_pf *pf = vf->pf;
struct ice_hw *hw;

hw = &pf->hw;
if (!strncmp(hw->active_pkg_name, "ICE COMMS Package",
sizeof(hw->active_pkg_name))) {
item = vc_fdir_pattern_comms;
*len = ARRAY_SIZE(vc_fdir_pattern_comms);
} else {
item = vc_fdir_pattern_os;
*len = ARRAY_SIZE(vc_fdir_pattern_os);
}

return item;
}

/**
* ice_vc_fdir_search_pattern
* @vf: pointer to the VF info
* @fltr: virtual channel add cmd buffer
*
* Search for matched pattern from supported pattern list
*
* Return: 0 on success, and other on error.
*/
static int
ice_vc_fdir_search_pattern(struct ice_vf *vf, struct virtchnl_fdir_add *fltr)
{
const struct virtchnl_fdir_pattern_match_item *pattern;
int len, i;

pattern = ice_vc_fdir_get_pattern(vf, &len);

for (i = 0; i < len; i++)
if (ice_vc_fdir_match_pattern(fltr, pattern[i].list))
return 0;

return -EINVAL;
}

/**
* ice_vc_fdir_parse_pattern
* @vf: pointer to the VF info
Expand Down Expand Up @@ -1299,11 +1031,11 @@ static int
ice_vc_validate_fdir_fltr(struct ice_vf *vf, struct virtchnl_fdir_add *fltr,
struct virtchnl_fdir_fltr_conf *conf)
{
struct virtchnl_proto_hdrs *proto = &fltr->rule_cfg.proto_hdrs;
int ret;

ret = ice_vc_fdir_search_pattern(vf, fltr);
if (ret)
return ret;
if (!ice_vc_validate_pattern(vf, proto))
return -EINVAL;

ret = ice_vc_fdir_parse_pattern(vf, fltr, conf);
if (ret)
Expand Down
Loading

0 comments on commit 60f44fe

Please sign in to comment.