* [dpdk-dev] [PATCH] net/softnic: add rte flow vxlan action support
@ 2018-10-12 15:34 Reshma Pattan
2018-10-15 14:41 ` [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action Reshma Pattan
2018-10-16 14:29 ` [dpdk-dev] [PATCH v3] " Reshma Pattan
0 siblings, 2 replies; 6+ messages in thread
From: Reshma Pattan @ 2018-10-12 15:34 UTC (permalink / raw)
To: dev, cristian.dumitrescu; +Cc: Reshma Pattan
Added support to handle vxlan action of rte flow rule.
Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
Acked-by: Dumitrescu Cristian <cristian.dumitrescu@intel.com>
---
drivers/net/softnic/rte_eth_softnic_flow.c | 192 +++++++++++++++++++++
1 file changed, 192 insertions(+)
diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c b/drivers/net/softnic/rte_eth_softnic_flow.c
index 23ef32969..8d3863f7c 100644
--- a/drivers/net/softnic/rte_eth_softnic_flow.c
+++ b/drivers/net/softnic/rte_eth_softnic_flow.c
@@ -1634,6 +1634,198 @@ flow_rule_action_get(struct pmd_internals *softnic,
break;
} /* RTE_FLOW_ACTION_TYPE_METER */
+ case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
+ {
+ const struct rte_flow_action_vxlan_encap *conf =
+ action->conf;
+ const struct rte_flow_item *item;
+ union flow_item spec, mask;
+ int disabled = 0, status;
+ size_t size;
+
+ if (conf == NULL)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ action,
+ "VXLAN ENCAP: Null configuration");
+
+ item = conf->definition;
+ if (item == NULL)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ action,
+ "VXLAN ENCAP: Null configuration definition");
+
+ if (!(params->action_mask &
+ (1LLU << RTE_TABLE_ACTION_ENCAP)))
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+ NULL,
+ "VXLAN ENCAP: Encap action not enabled for this table");
+
+ /* Check for Ether. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_ETH) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: first encap item should be ether");
+ }
+ ether_addr_copy(&spec.eth.dst,
+ &rule_action->encap.vxlan.ether.da);
+ ether_addr_copy(&spec.eth.src,
+ &rule_action->encap.vxlan.ether.sa);
+
+ item++;
+
+ /* Check for VLAN. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
+ if (!params->encap.vxlan.vlan)
+ return rte_flow_error_set(error,
+ ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: vlan encap not supported by table");
+
+ uint16_t tci = rte_ntohs(spec.vlan.tci);
+ rule_action->encap.vxlan.vlan.pcp =
+ tci & 0x7;
+ rule_action->encap.vxlan.vlan.dei =
+ tci & 0x8;
+ rule_action->encap.vxlan.vlan.vid =
+ tci & 0xfff;
+
+ item++;
+
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec,
+ &mask, &size, &disabled, error);
+ if (status)
+ return status;
+ } else {
+ if (params->encap.vxlan.vlan)
+ return rte_flow_error_set(error,
+ ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: expecting vlan encap item");
+ }
+
+ /* Check for IPV4/IPV6. */
+ switch (item->type) {
+ case RTE_FLOW_ITEM_TYPE_IPV4:
+ {
+ rule_action->encap.vxlan.ipv4.sa =
+ rte_ntohl(spec.ipv4.hdr.src_addr);
+ rule_action->encap.vxlan.ipv4.da =
+ rte_ntohl(spec.ipv4.hdr.dst_addr);
+ rule_action->encap.vxlan.ipv4.dscp =
+ spec.ipv4.hdr.type_of_service >> 2;
+ rule_action->encap.vxlan.ipv4.ttl =
+ spec.ipv4.hdr.time_to_live;
+ break;
+ }
+ case RTE_FLOW_ITEM_TYPE_IPV6:
+ {
+ uint32_t vtc_flow;
+
+ memcpy(&rule_action->encap.vxlan.ipv6.sa,
+ &spec.ipv6.hdr.src_addr,
+ sizeof(spec.ipv6.hdr.src_addr));
+ memcpy(&rule_action->encap.vxlan.ipv6.da,
+ &spec.ipv6.hdr.dst_addr,
+ sizeof(spec.ipv6.hdr.dst_addr));
+ vtc_flow = rte_ntohl(spec.ipv6.hdr.vtc_flow);
+ rule_action->encap.vxlan.ipv6.flow_label =
+ vtc_flow >> 12;
+ rule_action->encap.vxlan.ipv6.dscp =
+ (vtc_flow & 0x00000fc0) >> 6;
+ rule_action->encap.vxlan.ipv6.hop_limit =
+ spec.ipv6.hdr.hop_limits;
+ break;
+ }
+ default:
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after ether should be ipv4/ipv6");
+ }
+
+ item++;
+
+ /* Check for UDP. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_UDP) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after ipv4/ipv6 should be udp");
+ }
+ rule_action->encap.vxlan.udp.sp =
+ rte_ntohs(spec.udp.hdr.src_port);
+ rule_action->encap.vxlan.udp.dp =
+ rte_ntohs(spec.udp.hdr.dst_port);
+
+ item++;
+
+ /* Check for VXLAN. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_VXLAN) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after udp should be vxlan");
+ }
+ rule_action->encap.vxlan.vxlan.vni =
+ (spec.vxlan.vni[0] << 16U |
+ spec.vxlan.vni[1] << 8U
+ | spec.vxlan.vni[2]);
+
+ item++;
+
+ /* Check for END. */
+ flow_item_skip_void(&item);
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_END)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: expecting END item");
+
+ rule_action->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;
+ rule_action->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
+ break;
+ } /* RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP */
+
default:
return -ENOTSUP;
}
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action
2018-10-12 15:34 [dpdk-dev] [PATCH] net/softnic: add rte flow vxlan action support Reshma Pattan
@ 2018-10-15 14:41 ` Reshma Pattan
2018-10-15 16:05 ` Dumitrescu, Cristian
2018-10-16 14:29 ` [dpdk-dev] [PATCH v3] " Reshma Pattan
1 sibling, 1 reply; 6+ messages in thread
From: Reshma Pattan @ 2018-10-15 14:41 UTC (permalink / raw)
To: dev, cristian.dumitrescu; +Cc: Reshma Pattan
Added support to handle vxlan encap action of rte flow rule.
Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
Acked-by: Dumitrescu Cristian <cristian.dumitrescu@intel.com>
---
drivers/net/softnic/rte_eth_softnic_flow.c | 192 +++++++++++++++++++++
1 file changed, 192 insertions(+)
diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c b/drivers/net/softnic/rte_eth_softnic_flow.c
index 23ef32969..3a17046b4 100644
--- a/drivers/net/softnic/rte_eth_softnic_flow.c
+++ b/drivers/net/softnic/rte_eth_softnic_flow.c
@@ -1634,6 +1634,198 @@ flow_rule_action_get(struct pmd_internals *softnic,
break;
} /* RTE_FLOW_ACTION_TYPE_METER */
+ case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
+ {
+ const struct rte_flow_action_vxlan_encap *conf =
+ action->conf;
+ const struct rte_flow_item *item;
+ union flow_item spec, mask;
+ int disabled = 0, status;
+ size_t size;
+
+ if (conf == NULL)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ action,
+ "VXLAN ENCAP: Null configuration");
+
+ item = conf->definition;
+ if (item == NULL)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ action,
+ "VXLAN ENCAP: Null configuration definition");
+
+ if (!(params->action_mask &
+ (1LLU << RTE_TABLE_ACTION_ENCAP)))
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+ NULL,
+ "VXLAN ENCAP: Encap action not enabled for this table");
+
+ /* Check for Ether. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_ETH) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: first encap item should be ether");
+ }
+ ether_addr_copy(&spec.eth.dst,
+ &rule_action->encap.vxlan.ether.da);
+ ether_addr_copy(&spec.eth.src,
+ &rule_action->encap.vxlan.ether.sa);
+
+ item++;
+
+ /* Check for VLAN. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
+ if (!params->encap.vxlan.vlan)
+ return rte_flow_error_set(error,
+ ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: vlan encap not supported by table");
+
+ uint16_t tci = rte_ntohs(spec.vlan.tci);
+ rule_action->encap.vxlan.vlan.pcp =
+ tci & 0x7;
+ rule_action->encap.vxlan.vlan.dei =
+ (tci & 0x8) >> 3;
+ rule_action->encap.vxlan.vlan.vid =
+ tci & 0xfff0;
+
+ item++;
+
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec,
+ &mask, &size, &disabled, error);
+ if (status)
+ return status;
+ } else {
+ if (params->encap.vxlan.vlan)
+ return rte_flow_error_set(error,
+ ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: expecting vlan encap item");
+ }
+
+ /* Check for IPV4/IPV6. */
+ switch (item->type) {
+ case RTE_FLOW_ITEM_TYPE_IPV4:
+ {
+ rule_action->encap.vxlan.ipv4.sa =
+ rte_ntohl(spec.ipv4.hdr.src_addr);
+ rule_action->encap.vxlan.ipv4.da =
+ rte_ntohl(spec.ipv4.hdr.dst_addr);
+ rule_action->encap.vxlan.ipv4.dscp =
+ spec.ipv4.hdr.type_of_service >> 2;
+ rule_action->encap.vxlan.ipv4.ttl =
+ spec.ipv4.hdr.time_to_live;
+ break;
+ }
+ case RTE_FLOW_ITEM_TYPE_IPV6:
+ {
+ uint32_t vtc_flow;
+
+ memcpy(&rule_action->encap.vxlan.ipv6.sa,
+ &spec.ipv6.hdr.src_addr,
+ sizeof(spec.ipv6.hdr.src_addr));
+ memcpy(&rule_action->encap.vxlan.ipv6.da,
+ &spec.ipv6.hdr.dst_addr,
+ sizeof(spec.ipv6.hdr.dst_addr));
+ vtc_flow = rte_ntohl(spec.ipv6.hdr.vtc_flow);
+ rule_action->encap.vxlan.ipv6.flow_label =
+ vtc_flow >> 12;
+ rule_action->encap.vxlan.ipv6.dscp =
+ (vtc_flow & 0x00000fc0) >> 6;
+ rule_action->encap.vxlan.ipv6.hop_limit =
+ spec.ipv6.hdr.hop_limits;
+ break;
+ }
+ default:
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after ether should be ipv4/ipv6");
+ }
+
+ item++;
+
+ /* Check for UDP. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_UDP) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after ipv4/ipv6 should be udp");
+ }
+ rule_action->encap.vxlan.udp.sp =
+ rte_ntohs(spec.udp.hdr.src_port);
+ rule_action->encap.vxlan.udp.dp =
+ rte_ntohs(spec.udp.hdr.dst_port);
+
+ item++;
+
+ /* Check for VXLAN. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_VXLAN) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after udp should be vxlan");
+ }
+ rule_action->encap.vxlan.vxlan.vni =
+ (spec.vxlan.vni[0] << 16U |
+ spec.vxlan.vni[1] << 8U
+ | spec.vxlan.vni[2]);
+
+ item++;
+
+ /* Check for END. */
+ flow_item_skip_void(&item);
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_END)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: expecting END item");
+
+ rule_action->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;
+ rule_action->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
+ break;
+ } /* RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP */
+
default:
return -ENOTSUP;
}
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action
2018-10-15 14:41 ` [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action Reshma Pattan
@ 2018-10-15 16:05 ` Dumitrescu, Cristian
2018-10-15 16:18 ` Dumitrescu, Cristian
0 siblings, 1 reply; 6+ messages in thread
From: Dumitrescu, Cristian @ 2018-10-15 16:05 UTC (permalink / raw)
To: Pattan, Reshma, dev
> -----Original Message-----
> From: Pattan, Reshma
> Sent: Monday, October 15, 2018 3:42 PM
> To: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: Pattan, Reshma <reshma.pattan@intel.com>
> Subject: [PATCH v2] net/softnic: add support for flow API vxlan encap action
>
> Added support to handle vxlan encap action of rte flow rule.
>
> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> Acked-by: Dumitrescu Cristian <cristian.dumitrescu@intel.com>
> ---
> drivers/net/softnic/rte_eth_softnic_flow.c | 192
> +++++++++++++++++++++
> 1 file changed, 192 insertions(+)
>
> diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c
> b/drivers/net/softnic/rte_eth_softnic_flow.c
> index 23ef32969..3a17046b4 100644
> --- a/drivers/net/softnic/rte_eth_softnic_flow.c
> +++ b/drivers/net/softnic/rte_eth_softnic_flow.c
> @@ -1634,6 +1634,198 @@ flow_rule_action_get(struct pmd_internals
> *softnic,
> break;
> } /* RTE_FLOW_ACTION_TYPE_METER */
>
> + case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
> + {
> + const struct rte_flow_action_vxlan_encap *conf =
> + action->conf;
> + const struct rte_flow_item *item;
> + union flow_item spec, mask;
> + int disabled = 0, status;
> + size_t size;
> +
> + if (conf == NULL)
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ACTION,
> + action,
> + "VXLAN ENCAP: Null configuration");
> +
> + item = conf->definition;
> + if (item == NULL)
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ACTION,
> + action,
> + "VXLAN ENCAP: Null configuration
> definition");
> +
> + if (!(params->action_mask &
> + (1LLU <<
> RTE_TABLE_ACTION_ENCAP)))
> + return rte_flow_error_set(error,
> + EINVAL,
> +
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> + NULL,
> + "VXLAN ENCAP: Encap action not
> enabled for this table");
> +
> + /* Check for Ether. */
> + flow_item_skip_void(&item);
> + status = flow_item_proto_preprocess(item, &spec,
> &mask,
> + &size, &disabled, error);
> + if (status)
> + return status;
> +
> + if (item->type != RTE_FLOW_ITEM_TYPE_ETH) {
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: first encap item
> should be ether");
> + }
> + ether_addr_copy(&spec.eth.dst,
> + &rule_action-
> >encap.vxlan.ether.da);
> + ether_addr_copy(&spec.eth.src,
> + &rule_action->encap.vxlan.ether.sa);
> +
> + item++;
> +
> + /* Check for VLAN. */
> + flow_item_skip_void(&item);
> + status = flow_item_proto_preprocess(item, &spec,
> &mask,
> + &size, &disabled, error);
> + if (status)
> + return status;
> +
> + if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
> + if (!params->encap.vxlan.vlan)
> + return rte_flow_error_set(error,
> + ENOTSUP,
> +
> RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: vlan encap
> not supported by table");
> +
> + uint16_t tci = rte_ntohs(spec.vlan.tci);
> + rule_action->encap.vxlan.vlan.pcp =
> + tci & 0x7;
> + rule_action->encap.vxlan.vlan.dei =
> + (tci & 0x8) >> 3;
> + rule_action->encap.vxlan.vlan.vid =
> + tci & 0xfff0;
rule_action->encap.vxlan.vlan.pcp = tci >> 13;
rule_action->encap.vxlan.vlan.dei = (tci >> 12) & 0x1;
rule_action->encap.vxlan.vlan.vid = tci & 0xFFF;
> +
> + item++;
> +
> + flow_item_skip_void(&item);
> + status = flow_item_proto_preprocess(item,
> &spec,
> + &mask, &size, &disabled,
> error);
> + if (status)
> + return status;
> + } else {
> + if (params->encap.vxlan.vlan)
> + return rte_flow_error_set(error,
> + ENOTSUP,
> +
> RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: expecting
> vlan encap item");
> + }
> +
> + /* Check for IPV4/IPV6. */
> + switch (item->type) {
> + case RTE_FLOW_ITEM_TYPE_IPV4:
> + {
> + rule_action->encap.vxlan.ipv4.sa =
> + rte_ntohl(spec.ipv4.hdr.src_addr);
> + rule_action->encap.vxlan.ipv4.da =
> + rte_ntohl(spec.ipv4.hdr.dst_addr);
> + rule_action->encap.vxlan.ipv4.dscp =
> + spec.ipv4.hdr.type_of_service >> 2;
> + rule_action->encap.vxlan.ipv4.ttl =
> + spec.ipv4.hdr.time_to_live;
> + break;
> + }
> + case RTE_FLOW_ITEM_TYPE_IPV6:
> + {
> + uint32_t vtc_flow;
> +
> + memcpy(&rule_action->encap.vxlan.ipv6.sa,
> + &spec.ipv6.hdr.src_addr,
> +
> sizeof(spec.ipv6.hdr.src_addr));
> + memcpy(&rule_action->encap.vxlan.ipv6.da,
> + &spec.ipv6.hdr.dst_addr,
> +
> sizeof(spec.ipv6.hdr.dst_addr));
> + vtc_flow = rte_ntohl(spec.ipv6.hdr.vtc_flow);
> + rule_action->encap.vxlan.ipv6.flow_label =
> + vtc_flow >> 12;
> + rule_action->encap.vxlan.ipv6.dscp =
> + (vtc_flow & 0x00000fc0) >> 6;
> + rule_action->encap.vxlan.ipv6.hop_limit =
> + spec.ipv6.hdr.hop_limits;
> + break;
> + }
> + default:
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: encap item after
> ether should be ipv4/ipv6");
> + }
> +
> + item++;
> +
> + /* Check for UDP. */
> + flow_item_skip_void(&item);
> + status = flow_item_proto_preprocess(item, &spec,
> &mask,
> + &size, &disabled, error);
> + if (status)
> + return status;
> +
> + if (item->type != RTE_FLOW_ITEM_TYPE_UDP) {
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: encap item after
> ipv4/ipv6 should be udp");
> + }
> + rule_action->encap.vxlan.udp.sp =
> + rte_ntohs(spec.udp.hdr.src_port);
> + rule_action->encap.vxlan.udp.dp =
> + rte_ntohs(spec.udp.hdr.dst_port);
> +
> + item++;
> +
> + /* Check for VXLAN. */
> + flow_item_skip_void(&item);
> + status = flow_item_proto_preprocess(item, &spec,
> &mask,
> + &size, &disabled, error);
> + if (status)
> + return status;
> +
> + if (item->type != RTE_FLOW_ITEM_TYPE_VXLAN) {
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: encap item after udp
> should be vxlan");
> + }
> + rule_action->encap.vxlan.vxlan.vni =
> + (spec.vxlan.vni[0] << 16U |
> + spec.vxlan.vni[1] << 8U
> + | spec.vxlan.vni[2]);
> +
> + item++;
> +
> + /* Check for END. */
> + flow_item_skip_void(&item);
> +
> + if (item->type != RTE_FLOW_ITEM_TYPE_END)
> + return rte_flow_error_set(error,
> + EINVAL,
> + RTE_FLOW_ERROR_TYPE_ITEM,
> + item,
> + "VXLAN ENCAP: expecting END
> item");
> +
> + rule_action->encap.type =
> RTE_TABLE_ACTION_ENCAP_VXLAN;
> + rule_action->action_mask |= 1 <<
> RTE_TABLE_ACTION_ENCAP;
> + break;
> + } /* RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP */
> +
> default:
> return -ENOTSUP;
> }
> --
> 2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action
2018-10-15 16:05 ` Dumitrescu, Cristian
@ 2018-10-15 16:18 ` Dumitrescu, Cristian
0 siblings, 0 replies; 6+ messages in thread
From: Dumitrescu, Cristian @ 2018-10-15 16:18 UTC (permalink / raw)
To: Dumitrescu, Cristian, Pattan, Reshma, dev
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Dumitrescu,
> Cristian
> Sent: Monday, October 15, 2018 5:05 PM
> To: Pattan, Reshma <reshma.pattan@intel.com>; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2] net/softnic: add support for flow API
> vxlan encap action
>
>
>
> > -----Original Message-----
> > From: Pattan, Reshma
> > Sent: Monday, October 15, 2018 3:42 PM
> > To: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> > Cc: Pattan, Reshma <reshma.pattan@intel.com>
> > Subject: [PATCH v2] net/softnic: add support for flow API vxlan encap
> action
> >
> > Added support to handle vxlan encap action of rte flow rule.
> >
> > Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> > Acked-by: Dumitrescu Cristian <cristian.dumitrescu@intel.com>
> > ---
> > drivers/net/softnic/rte_eth_softnic_flow.c | 192
> > +++++++++++++++++++++
> > 1 file changed, 192 insertions(+)
> >
> > diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c
> > b/drivers/net/softnic/rte_eth_softnic_flow.c
> > index 23ef32969..3a17046b4 100644
> > --- a/drivers/net/softnic/rte_eth_softnic_flow.c
> > +++ b/drivers/net/softnic/rte_eth_softnic_flow.c
> > @@ -1634,6 +1634,198 @@ flow_rule_action_get(struct pmd_internals
> > *softnic,
> > break;
> > } /* RTE_FLOW_ACTION_TYPE_METER */
> >
> > + case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
> > + {
> > + const struct rte_flow_action_vxlan_encap *conf =
> > + action->conf;
> > + const struct rte_flow_item *item;
> > + union flow_item spec, mask;
> > + int disabled = 0, status;
> > + size_t size;
> > +
> > + if (conf == NULL)
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ACTION,
> > + action,
> > + "VXLAN ENCAP: Null configuration");
> > +
> > + item = conf->definition;
> > + if (item == NULL)
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ACTION,
> > + action,
> > + "VXLAN ENCAP: Null configuration
> > definition");
> > +
> > + if (!(params->action_mask &
> > + (1LLU <<
> > RTE_TABLE_ACTION_ENCAP)))
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > +
> > RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> > + NULL,
> > + "VXLAN ENCAP: Encap action not
> > enabled for this table");
> > +
> > + /* Check for Ether. */
> > + flow_item_skip_void(&item);
> > + status = flow_item_proto_preprocess(item, &spec,
> > &mask,
> > + &size, &disabled, error);
> > + if (status)
> > + return status;
> > +
> > + if (item->type != RTE_FLOW_ITEM_TYPE_ETH) {
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: first encap item
> > should be ether");
> > + }
> > + ether_addr_copy(&spec.eth.dst,
> > + &rule_action-
> > >encap.vxlan.ether.da);
> > + ether_addr_copy(&spec.eth.src,
> > + &rule_action->encap.vxlan.ether.sa);
> > +
> > + item++;
> > +
> > + /* Check for VLAN. */
> > + flow_item_skip_void(&item);
> > + status = flow_item_proto_preprocess(item, &spec,
> > &mask,
> > + &size, &disabled, error);
> > + if (status)
> > + return status;
> > +
> > + if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
> > + if (!params->encap.vxlan.vlan)
> > + return rte_flow_error_set(error,
> > + ENOTSUP,
> > +
> > RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: vlan encap
> > not supported by table");
> > +
> > + uint16_t tci = rte_ntohs(spec.vlan.tci);
> > + rule_action->encap.vxlan.vlan.pcp =
> > + tci & 0x7;
> > + rule_action->encap.vxlan.vlan.dei =
> > + (tci & 0x8) >> 3;
> > + rule_action->encap.vxlan.vlan.vid =
> > + tci & 0xfff0;
>
> rule_action->encap.vxlan.vlan.pcp = tci >> 13;
> rule_action->encap.vxlan.vlan.dei = (tci >> 12) & 0x1;
> rule_action->encap.vxlan.vlan.vid = tci & 0xFFF;
>
> > +
> > + item++;
> > +
> > + flow_item_skip_void(&item);
> > + status = flow_item_proto_preprocess(item,
> > &spec,
> > + &mask, &size, &disabled,
> > error);
> > + if (status)
> > + return status;
> > + } else {
> > + if (params->encap.vxlan.vlan)
> > + return rte_flow_error_set(error,
> > + ENOTSUP,
> > +
> > RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: expecting
> > vlan encap item");
> > + }
> > +
> > + /* Check for IPV4/IPV6. */
> > + switch (item->type) {
> > + case RTE_FLOW_ITEM_TYPE_IPV4:
> > + {
> > + rule_action->encap.vxlan.ipv4.sa =
> > + rte_ntohl(spec.ipv4.hdr.src_addr);
> > + rule_action->encap.vxlan.ipv4.da =
> > + rte_ntohl(spec.ipv4.hdr.dst_addr);
> > + rule_action->encap.vxlan.ipv4.dscp =
> > + spec.ipv4.hdr.type_of_service >> 2;
> > + rule_action->encap.vxlan.ipv4.ttl =
> > + spec.ipv4.hdr.time_to_live;
> > + break;
> > + }
> > + case RTE_FLOW_ITEM_TYPE_IPV6:
> > + {
> > + uint32_t vtc_flow;
> > +
> > + memcpy(&rule_action->encap.vxlan.ipv6.sa,
> > + &spec.ipv6.hdr.src_addr,
> > +
> > sizeof(spec.ipv6.hdr.src_addr));
> > + memcpy(&rule_action->encap.vxlan.ipv6.da,
> > + &spec.ipv6.hdr.dst_addr,
> > +
> > sizeof(spec.ipv6.hdr.dst_addr));
> > + vtc_flow = rte_ntohl(spec.ipv6.hdr.vtc_flow);
> > + rule_action->encap.vxlan.ipv6.flow_label =
> > + vtc_flow >> 12;
rule_action->encap.vxlan.ipv6.flow_label = vtc_flow & 0xFFFFF;
> > + rule_action->encap.vxlan.ipv6.dscp =
> > + (vtc_flow & 0x00000fc0) >> 6;
rule_action->encap.vxlan.ipv6.dscp = (vtc_flow >> 22) & 0x3F;
> > + rule_action->encap.vxlan.ipv6.hop_limit =
> > + spec.ipv6.hdr.hop_limits;
> > + break;
> > + }
> > + default:
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: encap item after
> > ether should be ipv4/ipv6");
> > + }
> > +
> > + item++;
> > +
> > + /* Check for UDP. */
> > + flow_item_skip_void(&item);
> > + status = flow_item_proto_preprocess(item, &spec,
> > &mask,
> > + &size, &disabled, error);
> > + if (status)
> > + return status;
> > +
> > + if (item->type != RTE_FLOW_ITEM_TYPE_UDP) {
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: encap item after
> > ipv4/ipv6 should be udp");
> > + }
> > + rule_action->encap.vxlan.udp.sp =
> > + rte_ntohs(spec.udp.hdr.src_port);
> > + rule_action->encap.vxlan.udp.dp =
> > + rte_ntohs(spec.udp.hdr.dst_port);
> > +
> > + item++;
> > +
> > + /* Check for VXLAN. */
> > + flow_item_skip_void(&item);
> > + status = flow_item_proto_preprocess(item, &spec,
> > &mask,
> > + &size, &disabled, error);
> > + if (status)
> > + return status;
> > +
> > + if (item->type != RTE_FLOW_ITEM_TYPE_VXLAN) {
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: encap item after udp
> > should be vxlan");
> > + }
> > + rule_action->encap.vxlan.vxlan.vni =
> > + (spec.vxlan.vni[0] << 16U |
> > + spec.vxlan.vni[1] << 8U
> > + | spec.vxlan.vni[2]);
> > +
> > + item++;
> > +
> > + /* Check for END. */
> > + flow_item_skip_void(&item);
> > +
> > + if (item->type != RTE_FLOW_ITEM_TYPE_END)
> > + return rte_flow_error_set(error,
> > + EINVAL,
> > + RTE_FLOW_ERROR_TYPE_ITEM,
> > + item,
> > + "VXLAN ENCAP: expecting END
> > item");
> > +
> > + rule_action->encap.type =
> > RTE_TABLE_ACTION_ENCAP_VXLAN;
> > + rule_action->action_mask |= 1 <<
> > RTE_TABLE_ACTION_ENCAP;
> > + break;
> > + } /* RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP */
> > +
> > default:
> > return -ENOTSUP;
> > }
> > --
> > 2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v3] net/softnic: add support for flow API vxlan encap action
2018-10-12 15:34 [dpdk-dev] [PATCH] net/softnic: add rte flow vxlan action support Reshma Pattan
2018-10-15 14:41 ` [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action Reshma Pattan
@ 2018-10-16 14:29 ` Reshma Pattan
2018-10-17 13:16 ` Dumitrescu, Cristian
1 sibling, 1 reply; 6+ messages in thread
From: Reshma Pattan @ 2018-10-16 14:29 UTC (permalink / raw)
To: dev, cristian.dumitrescu; +Cc: Reshma Pattan
Added support to handle vxlan encap action of rte flow rule.
Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
Acked-by: Dumitrescu Cristian <cristian.dumitrescu@intel.com>
---
v3: fixed vlan pcp, dei and vid parsing.
fixed ipv6 flow_label and dscp parsing.
---
drivers/net/softnic/rte_eth_softnic_flow.c | 192 +++++++++++++++++++++
1 file changed, 192 insertions(+)
diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c b/drivers/net/softnic/rte_eth_softnic_flow.c
index 23ef32969..285af462b 100644
--- a/drivers/net/softnic/rte_eth_softnic_flow.c
+++ b/drivers/net/softnic/rte_eth_softnic_flow.c
@@ -1634,6 +1634,198 @@ flow_rule_action_get(struct pmd_internals *softnic,
break;
} /* RTE_FLOW_ACTION_TYPE_METER */
+ case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
+ {
+ const struct rte_flow_action_vxlan_encap *conf =
+ action->conf;
+ const struct rte_flow_item *item;
+ union flow_item spec, mask;
+ int disabled = 0, status;
+ size_t size;
+
+ if (conf == NULL)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ action,
+ "VXLAN ENCAP: Null configuration");
+
+ item = conf->definition;
+ if (item == NULL)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ action,
+ "VXLAN ENCAP: Null configuration definition");
+
+ if (!(params->action_mask &
+ (1LLU << RTE_TABLE_ACTION_ENCAP)))
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+ NULL,
+ "VXLAN ENCAP: Encap action not enabled for this table");
+
+ /* Check for Ether. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_ETH) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: first encap item should be ether");
+ }
+ ether_addr_copy(&spec.eth.dst,
+ &rule_action->encap.vxlan.ether.da);
+ ether_addr_copy(&spec.eth.src,
+ &rule_action->encap.vxlan.ether.sa);
+
+ item++;
+
+ /* Check for VLAN. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
+ if (!params->encap.vxlan.vlan)
+ return rte_flow_error_set(error,
+ ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: vlan encap not supported by table");
+
+ uint16_t tci = rte_ntohs(spec.vlan.tci);
+ rule_action->encap.vxlan.vlan.pcp =
+ tci >> 13;
+ rule_action->encap.vxlan.vlan.dei =
+ (tci >> 12) & 0x1;
+ rule_action->encap.vxlan.vlan.vid =
+ tci & 0xfff;
+
+ item++;
+
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec,
+ &mask, &size, &disabled, error);
+ if (status)
+ return status;
+ } else {
+ if (params->encap.vxlan.vlan)
+ return rte_flow_error_set(error,
+ ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: expecting vlan encap item");
+ }
+
+ /* Check for IPV4/IPV6. */
+ switch (item->type) {
+ case RTE_FLOW_ITEM_TYPE_IPV4:
+ {
+ rule_action->encap.vxlan.ipv4.sa =
+ rte_ntohl(spec.ipv4.hdr.src_addr);
+ rule_action->encap.vxlan.ipv4.da =
+ rte_ntohl(spec.ipv4.hdr.dst_addr);
+ rule_action->encap.vxlan.ipv4.dscp =
+ spec.ipv4.hdr.type_of_service >> 2;
+ rule_action->encap.vxlan.ipv4.ttl =
+ spec.ipv4.hdr.time_to_live;
+ break;
+ }
+ case RTE_FLOW_ITEM_TYPE_IPV6:
+ {
+ uint32_t vtc_flow;
+
+ memcpy(&rule_action->encap.vxlan.ipv6.sa,
+ &spec.ipv6.hdr.src_addr,
+ sizeof(spec.ipv6.hdr.src_addr));
+ memcpy(&rule_action->encap.vxlan.ipv6.da,
+ &spec.ipv6.hdr.dst_addr,
+ sizeof(spec.ipv6.hdr.dst_addr));
+ vtc_flow = rte_ntohl(spec.ipv6.hdr.vtc_flow);
+ rule_action->encap.vxlan.ipv6.flow_label =
+ vtc_flow & 0xfffff;
+ rule_action->encap.vxlan.ipv6.dscp =
+ (vtc_flow >> 22) & 0x3f;
+ rule_action->encap.vxlan.ipv6.hop_limit =
+ spec.ipv6.hdr.hop_limits;
+ break;
+ }
+ default:
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after ether should be ipv4/ipv6");
+ }
+
+ item++;
+
+ /* Check for UDP. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_UDP) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after ipv4/ipv6 should be udp");
+ }
+ rule_action->encap.vxlan.udp.sp =
+ rte_ntohs(spec.udp.hdr.src_port);
+ rule_action->encap.vxlan.udp.dp =
+ rte_ntohs(spec.udp.hdr.dst_port);
+
+ item++;
+
+ /* Check for VXLAN. */
+ flow_item_skip_void(&item);
+ status = flow_item_proto_preprocess(item, &spec, &mask,
+ &size, &disabled, error);
+ if (status)
+ return status;
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_VXLAN) {
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: encap item after udp should be vxlan");
+ }
+ rule_action->encap.vxlan.vxlan.vni =
+ (spec.vxlan.vni[0] << 16U |
+ spec.vxlan.vni[1] << 8U
+ | spec.vxlan.vni[2]);
+
+ item++;
+
+ /* Check for END. */
+ flow_item_skip_void(&item);
+
+ if (item->type != RTE_FLOW_ITEM_TYPE_END)
+ return rte_flow_error_set(error,
+ EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "VXLAN ENCAP: expecting END item");
+
+ rule_action->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;
+ rule_action->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
+ break;
+ } /* RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP */
+
default:
return -ENOTSUP;
}
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v3] net/softnic: add support for flow API vxlan encap action
2018-10-16 14:29 ` [dpdk-dev] [PATCH v3] " Reshma Pattan
@ 2018-10-17 13:16 ` Dumitrescu, Cristian
0 siblings, 0 replies; 6+ messages in thread
From: Dumitrescu, Cristian @ 2018-10-17 13:16 UTC (permalink / raw)
To: Pattan, Reshma, dev
> -----Original Message-----
> From: Pattan, Reshma
> Sent: Tuesday, October 16, 2018 3:29 PM
> To: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: Pattan, Reshma <reshma.pattan@intel.com>
> Subject: [PATCH v3] net/softnic: add support for flow API vxlan encap action
>
> Added support to handle vxlan encap action of rte flow rule.
>
> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> Acked-by: Dumitrescu Cristian <cristian.dumitrescu@intel.com>
> ---
> v3: fixed vlan pcp, dei and vid parsing.
> fixed ipv6 flow_label and dscp parsing.
> ---
> drivers/net/softnic/rte_eth_softnic_flow.c | 192
> +++++++++++++++++++++
> 1 file changed, 192 insertions(+)
>
Applied to next-pipeline tree, thanks!
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-10-17 13:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-12 15:34 [dpdk-dev] [PATCH] net/softnic: add rte flow vxlan action support Reshma Pattan
2018-10-15 14:41 ` [dpdk-dev] [PATCH v2] net/softnic: add support for flow API vxlan encap action Reshma Pattan
2018-10-15 16:05 ` Dumitrescu, Cristian
2018-10-15 16:18 ` Dumitrescu, Cristian
2018-10-16 14:29 ` [dpdk-dev] [PATCH v3] " Reshma Pattan
2018-10-17 13:16 ` Dumitrescu, Cristian
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).