net/mlx5: add necessary structures for E-Switch VXLAN
authorViacheslav Ovsiienko <viacheslavo@mellanox.com>
Sat, 3 Nov 2018 06:18:37 +0000 (06:18 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 5 Nov 2018 14:01:25 +0000 (15:01 +0100)
This patch introduces the data structures needed to implement VXLAN
encapsulation/decapsulation hardware offload support for E-Switch.

Suggested-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Yongseok Koh <yskoh@mellanox.com>
drivers/net/mlx5/mlx5_flow.h
drivers/net/mlx5/mlx5_flow_tcf.c

index fadde55..2a3ce44 100644 (file)
@@ -219,6 +219,15 @@ struct mlx5_flow_dv {
 struct mlx5_flow_tcf {
        struct nlmsghdr *nlh;
        struct tcmsg *tcm;
+       union { /**< Tunnel encap/decap descriptor. */
+               struct flow_tcf_tunnel_hdr *tunnel;
+               struct flow_tcf_vxlan_decap *vxlan_decap;
+               struct flow_tcf_vxlan_encap *vxlan_encap;
+       };
+       uint32_t applied:1; /**< Whether rule is currently applied. */
+#ifndef NDEBUG
+       uint32_t nlsize; /**< Size of NL message buffer for debug check. */
+#endif
 };
 
 /* Verbs specification header. */
index 4d54112..55c77e3 100644 (file)
@@ -348,6 +348,100 @@ struct mlx5_flow_tcf_context {
        uint8_t *buf; /* Message buffer. */
 };
 
+/**
+ * Neigh rule structure. The neigh rule is applied via Netlink to
+ * outer tunnel iface in order to provide destination MAC address
+ * for the VXLAN encapsultion. The neigh rule is implicitly related
+ * to the Flow itself and can be shared by multiple Flows.
+ */
+struct tcf_neigh_rule {
+       LIST_ENTRY(tcf_neigh_rule) next;
+       uint32_t refcnt;
+       struct ether_addr eth;
+       uint16_t mask;
+       union {
+               struct {
+                       rte_be32_t dst;
+               } ipv4;
+               struct {
+                       uint8_t dst[IPV6_ADDR_LEN];
+               } ipv6;
+       };
+};
+
+/**
+ * Local rule structure. The local rule is applied via Netlink to
+ * outer tunnel iface in order to provide local and peer IP addresses
+ * of the VXLAN tunnel for encapsulation. The local rule is implicitly
+ * related to the Flow itself and can be shared by multiple Flows.
+ */
+struct tcf_local_rule {
+       LIST_ENTRY(tcf_local_rule) next;
+       uint32_t refcnt;
+       uint16_t mask;
+       union {
+               struct {
+                       rte_be32_t dst;
+                       rte_be32_t src;
+               } ipv4;
+               struct {
+                       uint8_t dst[IPV6_ADDR_LEN];
+                       uint8_t src[IPV6_ADDR_LEN];
+               } ipv6;
+       };
+};
+
+/** VXLAN virtual netdev. */
+struct tcf_vtep {
+       LIST_ENTRY(tcf_vtep) next;
+       LIST_HEAD(, tcf_neigh_rule) neigh;
+       LIST_HEAD(, tcf_local_rule) local;
+       uint32_t refcnt;
+       unsigned int ifindex; /**< Own interface index. */
+       unsigned int ifouter; /**< Index of device attached to. */
+       uint16_t port;
+       uint8_t created;
+};
+
+/** Tunnel descriptor header, common for all tunnel types. */
+struct flow_tcf_tunnel_hdr {
+       uint32_t type; /**< Tunnel action type. */
+       struct tcf_vtep *vtep; /**< Virtual tunnel endpoint device. */
+       unsigned int ifindex_org; /**< Original dst/src interface */
+       unsigned int *ifindex_ptr; /**< Interface ptr in message. */
+};
+
+struct flow_tcf_vxlan_decap {
+       struct flow_tcf_tunnel_hdr hdr;
+       uint16_t udp_port;
+};
+
+struct flow_tcf_vxlan_encap {
+       struct flow_tcf_tunnel_hdr hdr;
+       uint32_t mask;
+       struct {
+               struct ether_addr dst;
+               struct ether_addr src;
+       } eth;
+       union {
+               struct {
+                       rte_be32_t dst;
+                       rte_be32_t src;
+               } ipv4;
+               struct {
+                       uint8_t dst[IPV6_ADDR_LEN];
+                       uint8_t src[IPV6_ADDR_LEN];
+               } ipv6;
+       };
+struct {
+               rte_be16_t src;
+               rte_be16_t dst;
+       } udp;
+       struct {
+               uint8_t vni[3];
+       } vxlan;
+};
+
 /** Structure used when extracting the values of a flow counters
  * from a netlink message.
  */
@@ -365,6 +459,7 @@ static const union {
        struct rte_flow_item_ipv6 ipv6;
        struct rte_flow_item_tcp tcp;
        struct rte_flow_item_udp udp;
+       struct rte_flow_item_vxlan vxlan;
 } flow_tcf_mask_empty;
 
 /** Supported masks for known item types. */
@@ -376,6 +471,7 @@ static const struct {
        struct rte_flow_item_ipv6 ipv6;
        struct rte_flow_item_tcp tcp;
        struct rte_flow_item_udp udp;
+       struct rte_flow_item_vxlan vxlan;
 } flow_tcf_mask_supported = {
        .port_id = {
                .id = 0xffffffff,
@@ -413,6 +509,9 @@ static const struct {
                .src_port = RTE_BE16(0xffff),
                .dst_port = RTE_BE16(0xffff),
        },
+       .vxlan = {
+              .vni = "\xff\xff\xff",
+       },
 };
 
 #define SZ_NLATTR_HDR MNL_ALIGN(sizeof(struct nlattr))