Commit 9e300987 authored by Michal Swiatkowski's avatar Michal Swiatkowski Committed by Tony Nguyen

ice: VXLAN and Geneve TC support

Add definition for VXLAN and Geneve dummy packet. Define VXLAN and
Geneve type of fields to match on correct UDP tunnel header.

Parse tunnel specific fields from TC tool like outer MACs, outer IPs,
outer destination port and VNI. Save values and masks in outer header
struct and move header pointer to inner to simplify parsing inner
values.

There are two cases for redirect action:
- from uplink to VF - TC filter is added on tunnel device
- from VF to uplink - TC filter is added on PR, for this case check if
  redirect device is tunnel device

VXLAN example:
- create tunnel device
ip l add $VXLAN_DEV type vxlan id $VXLAN_VNI dstport $VXLAN_PORT \
dev $PF
- add TC filter (in switchdev mode)
tc filter add dev $VXLAN_DEV protocol ip parent ffff: flower \
enc_dst_ip $VF1_IP enc_key_id $VXLAN_VNI action mirred egress \
redirect dev $VF1_PR

Geneve example:
- create tunnel device
ip l add $GENEVE_DEV type geneve id $GENEVE_VNI dstport $GENEVE_PORT \
remote $GENEVE_IP
- add TC filter (in switchdev mode)
tc filter add dev $GENEVE_DEV protocol ip parent ffff: flower \
enc_key_id $GENEVE_VNI dst_ip $GENEVE1_IP action mirred egress \
redirect dev $VF1_PR
Signed-off-by: default avatarMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: default avatarSandeep Penigalapati <sandeep.penigalapati@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 195bb48f
...@@ -8270,6 +8270,11 @@ ice_indr_setup_tc_block(struct net_device *netdev, struct Qdisc *sch, ...@@ -8270,6 +8270,11 @@ ice_indr_setup_tc_block(struct net_device *netdev, struct Qdisc *sch,
struct ice_indr_block_priv *indr_priv; struct ice_indr_block_priv *indr_priv;
struct flow_block_cb *block_cb; struct flow_block_cb *block_cb;
if (!ice_is_tunnel_supported(netdev) &&
!(is_vlan_dev(netdev) &&
vlan_dev_real_dev(netdev) == np->vsi->netdev))
return -EOPNOTSUPP;
if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
...@@ -37,10 +37,19 @@ enum ice_protocol_type { ...@@ -37,10 +37,19 @@ enum ice_protocol_type {
ICE_TCP_IL, ICE_TCP_IL,
ICE_UDP_OF, ICE_UDP_OF,
ICE_UDP_ILOS, ICE_UDP_ILOS,
ICE_VXLAN,
ICE_GENEVE,
ICE_VXLAN_GPE,
ICE_SCTP_IL, ICE_SCTP_IL,
ICE_PROTOCOL_LAST ICE_PROTOCOL_LAST
}; };
enum ice_sw_tunnel_type {
ICE_NON_TUN = 0,
ICE_SW_TUN_VXLAN,
ICE_SW_TUN_GENEVE,
};
/* Decoders for ice_prot_id: /* Decoders for ice_prot_id:
* - F: First * - F: First
* - I: Inner * - I: Inner
...@@ -152,6 +161,12 @@ struct ice_l4_hdr { ...@@ -152,6 +161,12 @@ struct ice_l4_hdr {
__be16 check; __be16 check;
}; };
struct ice_udp_tnl_hdr {
__be16 field;
__be16 proto_type;
__be32 vni; /* only use lower 24-bits */
};
union ice_prot_hdr { union ice_prot_hdr {
struct ice_ether_hdr eth_hdr; struct ice_ether_hdr eth_hdr;
struct ice_ethtype_hdr ethertype; struct ice_ethtype_hdr ethertype;
...@@ -160,6 +175,7 @@ union ice_prot_hdr { ...@@ -160,6 +175,7 @@ union ice_prot_hdr {
struct ice_ipv6_hdr ipv6_hdr; struct ice_ipv6_hdr ipv6_hdr;
struct ice_l4_hdr l4_hdr; struct ice_l4_hdr l4_hdr;
struct ice_sctp_hdr sctp_hdr; struct ice_sctp_hdr sctp_hdr;
struct ice_udp_tnl_hdr tnl_hdr;
}; };
/* This is mapping table entry that maps every word within a given protocol /* This is mapping table entry that maps every word within a given protocol
......
...@@ -171,6 +171,7 @@ struct ice_adv_rule_flags_info { ...@@ -171,6 +171,7 @@ struct ice_adv_rule_flags_info {
}; };
struct ice_adv_rule_info { struct ice_adv_rule_info {
enum ice_sw_tunnel_type tun_type;
struct ice_sw_act_ctrl sw_act; struct ice_sw_act_ctrl sw_act;
u32 priority; u32 priority;
u8 rx; /* true means LOOKUP_RX otherwise LOOKUP_TX */ u8 rx; /* true means LOOKUP_RX otherwise LOOKUP_TX */
......
This diff is collapsed.
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#define ICE_TC_FLWR_FIELD_ENC_DST_MAC BIT(16) #define ICE_TC_FLWR_FIELD_ENC_DST_MAC BIT(16)
#define ICE_TC_FLWR_FIELD_ETH_TYPE_ID BIT(17) #define ICE_TC_FLWR_FIELD_ETH_TYPE_ID BIT(17)
#define ICE_TC_FLOWER_MASK_32 0xFFFFFFFF
struct ice_indr_block_priv { struct ice_indr_block_priv {
struct net_device *netdev; struct net_device *netdev;
struct ice_netdev_priv *np; struct ice_netdev_priv *np;
...@@ -118,6 +120,7 @@ struct ice_tc_flower_fltr { ...@@ -118,6 +120,7 @@ struct ice_tc_flower_fltr {
struct ice_vsi *src_vsi; struct ice_vsi *src_vsi;
__be32 tenant_id; __be32 tenant_id;
u32 flags; u32 flags;
u8 tunnel_type;
struct ice_tc_flower_action action; struct ice_tc_flower_action action;
/* cache ptr which is used wherever needed to communicate netlink /* cache ptr which is used wherever needed to communicate netlink
...@@ -154,5 +157,6 @@ ice_add_cls_flower(struct net_device *netdev, struct ice_vsi *vsi, ...@@ -154,5 +157,6 @@ ice_add_cls_flower(struct net_device *netdev, struct ice_vsi *vsi,
int int
ice_del_cls_flower(struct ice_vsi *vsi, struct flow_cls_offload *cls_flower); ice_del_cls_flower(struct ice_vsi *vsi, struct flow_cls_offload *cls_flower);
void ice_replay_tc_fltrs(struct ice_pf *pf); void ice_replay_tc_fltrs(struct ice_pf *pf);
bool ice_is_tunnel_supported(struct net_device *dev);
#endif /* _ICE_TC_LIB_H_ */ #endif /* _ICE_TC_LIB_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment