ethdev: support flow aging
[dpdk.git] / lib / librte_ethdev / rte_flow.c
index d7f29e5..3699edc 100644 (file)
@@ -93,6 +93,8 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {
        MK_FLOW_ITEM(IGMP, sizeof(struct rte_flow_item_igmp)),
        MK_FLOW_ITEM(AH, sizeof(struct rte_flow_item_ah)),
        MK_FLOW_ITEM(HIGIG2, sizeof(struct rte_flow_item_higig2_hdr)),
+       MK_FLOW_ITEM(L2TPV3OIP, sizeof(struct rte_flow_item_l2tpv3oip)),
+       MK_FLOW_ITEM(PFCP, sizeof(struct rte_flow_item_pfcp)),
 };
 
 /** Generate flow_action[] entry. */
@@ -168,6 +170,9 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = {
        MK_FLOW_ACTION(DEC_TCP_ACK, sizeof(rte_be32_t)),
        MK_FLOW_ACTION(SET_TAG, sizeof(struct rte_flow_action_set_tag)),
        MK_FLOW_ACTION(SET_META, sizeof(struct rte_flow_action_set_meta)),
+       MK_FLOW_ACTION(SET_IPV4_DSCP, sizeof(struct rte_flow_action_set_dscp)),
+       MK_FLOW_ACTION(SET_IPV6_DSCP, sizeof(struct rte_flow_action_set_dscp)),
+       MK_FLOW_ACTION(AGE, sizeof(struct rte_flow_action_age)),
 };
 
 int
@@ -1071,6 +1076,7 @@ rte_flow_expand_rss(struct rte_flow_expand_rss *buf, size_t size,
        int elt = 0;
        const struct rte_flow_item *last_item = NULL;
 
+       memset(&missed_item, 0, sizeof(missed_item));
        lsize = offsetof(struct rte_flow_expand_rss, entry) +
                elt_n * sizeof(buf->entry[0]);
        if (lsize <= size) {
@@ -1211,3 +1217,36 @@ rte_flow_expand_rss(struct rte_flow_expand_rss *buf, size_t size,
        }
        return lsize;
 }
+
+int
+rte_flow_dev_dump(uint16_t port_id, FILE *file, struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       if (unlikely(!ops))
+               return -rte_errno;
+       if (likely(!!ops->dev_dump))
+               return flow_err(port_id, ops->dev_dump(dev, file, error),
+                               error);
+       return rte_flow_error_set(error, ENOSYS,
+                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                 NULL, rte_strerror(ENOSYS));
+}
+
+int
+rte_flow_get_aged_flows(uint16_t port_id, void **contexts,
+                   uint32_t nb_contexts, struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       if (unlikely(!ops))
+               return -rte_errno;
+       if (likely(!!ops->get_aged_flows))
+               return flow_err(port_id, ops->get_aged_flows(dev, contexts,
+                               nb_contexts, error), error);
+       return rte_flow_error_set(error, ENOTSUP,
+                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                 NULL, rte_strerror(ENOTSUP));
+}