diff mbox series

[ovs-dev,v2,03/13] ofproto_dpif: Check for psample support.

Message ID 20240711233238.1038670-4-amorenoz@redhat.com
State Superseded
Headers show
Series Introduce local sampling with NXAST_SAMPLE action. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Adrián Moreno July 11, 2024, 11:32 p.m. UTC
Only kernel datapath supports this action so add a function in dpif.c
that checks for that.

Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
 lib/dpif.c             |  7 +++++++
 lib/dpif.h             |  1 +
 ofproto/ofproto-dpif.c | 46 ++++++++++++++++++++++++++++++++++++++++++
 ofproto/ofproto-dpif.h |  6 +++++-
 vswitchd/vswitch.xml   |  5 +++++
 5 files changed, 64 insertions(+), 1 deletion(-)

Comments

Eelco Chaudron July 12, 2024, 2:30 p.m. UTC | #1
On 12 Jul 2024, at 1:32, Adrian Moreno wrote:

> Only kernel datapath supports this action so add a function in dpif.c
> that checks for that.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>

This patch looks good to me. One small comment/nit below. The rest looks good.

Acked-by: Eelco Chaudron <echaudro@redhat.com>

> ---
>  lib/dpif.c             |  7 +++++++
>  lib/dpif.h             |  1 +
>  ofproto/ofproto-dpif.c | 46 ++++++++++++++++++++++++++++++++++++++++++
>  ofproto/ofproto-dpif.h |  6 +++++-
>  vswitchd/vswitch.xml   |  5 +++++
>  5 files changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/lib/dpif.c b/lib/dpif.c
> index 94db4630e..ab633fd27 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -1953,6 +1953,13 @@ dpif_supports_lb_output_action(const struct dpif *dpif)
>      return dpif_is_netdev(dpif);
>  }
>
> +bool
> +dpif_may_support_psample(const struct dpif *dpif)
> +{
> +    /* Userspace datapath does not support this action. */
> +    return !dpif_is_netdev(dpif);
> +}
> +
>  /* Meters */
>  void
>  dpif_meter_get_features(const struct dpif *dpif,
> diff --git a/lib/dpif.h b/lib/dpif.h
> index a764e8a59..6bef7d5b3 100644
> --- a/lib/dpif.h
> +++ b/lib/dpif.h
> @@ -941,6 +941,7 @@ int dpif_get_pmds_for_port(const struct dpif * dpif, odp_port_t port_no,
>  char *dpif_get_dp_version(const struct dpif *);
>  bool dpif_supports_tnl_push_pop(const struct dpif *);
>  bool dpif_may_support_explicit_drop_action(const struct dpif *);
> +bool dpif_may_support_psample(const struct dpif *);
>  bool dpif_synced_dp_layers(struct dpif *);
>
>  /* Log functions. */
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 1405d614e..41a5e989d 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -873,6 +873,12 @@ ovs_lb_output_action_supported(struct ofproto_dpif *ofproto)
>      return ofproto->backer->rt_support.lb_output_action;
>  }
>
> +bool
> +ovs_psample_supported(struct ofproto_dpif *ofproto)
> +{
> +    return ofproto->backer->rt_support.psample;
> +}
> +
>  /* Tests whether 'backer''s datapath supports recirculation.  Only newer
>   * datapaths support OVS_KEY_ATTR_RECIRC_ID in keys.  We need to disable some
>   * features on older datapaths that don't support this feature.
> @@ -1609,6 +1615,44 @@ check_add_mpls(struct dpif_backer *backer)
>      return supported;
>  }
>
> +/* Tests whether 'backer''s datapath supports the OVS_ACTION_ATTR_PSAMPLE
> + * action. */
> +static bool
> +check_psample(struct dpif_backer *backer)
> +{
> +    uint8_t cookie[OVS_PSAMPLE_COOKIE_MAX_SIZE];
> +    struct odputil_keybuf keybuf;
> +    struct ofpbuf actions;
> +    struct ofpbuf key;
> +    bool supported;
> +
> +    /* Intentionally bogus dl_type. */
> +    struct flow flow = {
> +        .dl_type = CONSTANT_HTONS(0x1234),
> +    };
> +    struct odp_flow_key_parms odp_parms = {
> +        .flow = &flow,
> +        .probe = true,
> +    };
> +
> +    ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
> +    odp_flow_key_from_flow(&odp_parms, &key);
> +    ofpbuf_init(&actions, 32);
> +
> +    /* Generate a random max-size cookie. */
> +    random_bytes(cookie, sizeof cookie);
> +
> +    odp_put_psample_action(&actions, 10, cookie, sizeof cookie);
> +
> +    supported = dpif_may_support_psample(backer->dpif) &&
> +        dpif_probe_feature(backer->dpif, "psample", &key, &actions, NULL);
> +
> +    ofpbuf_uninit(&actions);
> +    VLOG_INFO("%s: Datapath %s psample action", dpif_name(backer->dpif),
> +              supported ? "supports" : "does not support");
> +    return supported;
> +}
> +
>  #define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE, ETHTYPE)               \
>  static bool                                                                 \
>  check_##NAME(struct dpif_backer *backer)                                    \
> @@ -1698,6 +1742,7 @@ check_support(struct dpif_backer *backer)
>          dpif_supports_lb_output_action(backer->dpif);
>      backer->rt_support.ct_zero_snat = dpif_supports_ct_zero_snat(backer);
>      backer->rt_support.add_mpls = check_add_mpls(backer);
> +    backer->rt_support.psample = check_psample(backer);
>
>      /* Flow fields. */
>      backer->rt_support.odp.ct_state = check_ct_state(backer);
> @@ -5821,6 +5866,7 @@ get_datapath_cap(const char *datapath_type, struct smap *cap)
>      smap_add(cap, "lb_output_action", s->lb_output_action ? "true" : "false");
>      smap_add(cap, "ct_zero_snat", s->ct_zero_snat ? "true" : "false");
>      smap_add(cap, "add_mpls", s->add_mpls ? "true" : "false");
> +    smap_add(cap, "psample", s->psample ? "true" : "false");
>
>      /* The ct_tuple_flush is implemented on dpif level, so it is supported
>       * for all backers. */
> diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
> index d33f73df8..ea18ccedf 100644
> --- a/ofproto/ofproto-dpif.h
> +++ b/ofproto/ofproto-dpif.h
> @@ -213,7 +213,10 @@ struct group_dpif *group_dpif_lookup(struct ofproto_dpif *,
>      DPIF_SUPPORT_FIELD(bool, ct_zero_snat, "Conntrack all-zero IP SNAT")    \
>                                                                              \
>      /* True if the datapath supports add_mpls action. */                    \
> -    DPIF_SUPPORT_FIELD(bool, add_mpls, "MPLS Label add")
> +    DPIF_SUPPORT_FIELD(bool, add_mpls, "MPLS Label add")                    \
> +                                                                            \
> +    /* True if the datapath supports psample action. */                     \
> +    DPIF_SUPPORT_FIELD(bool, psample, "psample")
>
>
>  /* Stores the various features which the corresponding backer supports. */
> @@ -411,5 +414,6 @@ bool ofproto_dpif_ct_zone_timeout_policy_get_name(
>      uint8_t nw_proto, char **tp_name, bool *unwildcard);
>
>  bool ovs_explicit_drop_action_supported(struct ofproto_dpif *);
> +bool ovs_psample_supported(struct ofproto_dpif *);
>
>  #endif /* ofproto-dpif.h */
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index e3afb78a4..c6eb598d3 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -6511,6 +6511,11 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \
>          called <code>NXT_CT_FLUSH</code>. The <code>NXT_CT_FLUSH</code>
>          extensions allows to flush CT entries based on specified parameters.
>        </column>
> +      <column name="capabilities" key="psample"
> +              type='{"type": "boolean"}'>
> +        True if the datapath supports OVS_ACTION_ATTR_PSAMPLE. If false,
> +        local sampling will not be supported.

nit: Remember to change this if we add userspace support, or maybe make it more clear with something like:

  If false, local sampling will not be supported with the Linux kernel datapath.

> +      </column>
>      </group>
>
>      <column name="ct_zone_default_limit">
> -- 
> 2.45.2
diff mbox series

Patch

diff --git a/lib/dpif.c b/lib/dpif.c
index 94db4630e..ab633fd27 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -1953,6 +1953,13 @@  dpif_supports_lb_output_action(const struct dpif *dpif)
     return dpif_is_netdev(dpif);
 }
 
+bool
+dpif_may_support_psample(const struct dpif *dpif)
+{
+    /* Userspace datapath does not support this action. */
+    return !dpif_is_netdev(dpif);
+}
+
 /* Meters */
 void
 dpif_meter_get_features(const struct dpif *dpif,
diff --git a/lib/dpif.h b/lib/dpif.h
index a764e8a59..6bef7d5b3 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -941,6 +941,7 @@  int dpif_get_pmds_for_port(const struct dpif * dpif, odp_port_t port_no,
 char *dpif_get_dp_version(const struct dpif *);
 bool dpif_supports_tnl_push_pop(const struct dpif *);
 bool dpif_may_support_explicit_drop_action(const struct dpif *);
+bool dpif_may_support_psample(const struct dpif *);
 bool dpif_synced_dp_layers(struct dpif *);
 
 /* Log functions. */
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 1405d614e..41a5e989d 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -873,6 +873,12 @@  ovs_lb_output_action_supported(struct ofproto_dpif *ofproto)
     return ofproto->backer->rt_support.lb_output_action;
 }
 
+bool
+ovs_psample_supported(struct ofproto_dpif *ofproto)
+{
+    return ofproto->backer->rt_support.psample;
+}
+
 /* Tests whether 'backer''s datapath supports recirculation.  Only newer
  * datapaths support OVS_KEY_ATTR_RECIRC_ID in keys.  We need to disable some
  * features on older datapaths that don't support this feature.
@@ -1609,6 +1615,44 @@  check_add_mpls(struct dpif_backer *backer)
     return supported;
 }
 
+/* Tests whether 'backer''s datapath supports the OVS_ACTION_ATTR_PSAMPLE
+ * action. */
+static bool
+check_psample(struct dpif_backer *backer)
+{
+    uint8_t cookie[OVS_PSAMPLE_COOKIE_MAX_SIZE];
+    struct odputil_keybuf keybuf;
+    struct ofpbuf actions;
+    struct ofpbuf key;
+    bool supported;
+
+    /* Intentionally bogus dl_type. */
+    struct flow flow = {
+        .dl_type = CONSTANT_HTONS(0x1234),
+    };
+    struct odp_flow_key_parms odp_parms = {
+        .flow = &flow,
+        .probe = true,
+    };
+
+    ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
+    odp_flow_key_from_flow(&odp_parms, &key);
+    ofpbuf_init(&actions, 32);
+
+    /* Generate a random max-size cookie. */
+    random_bytes(cookie, sizeof cookie);
+
+    odp_put_psample_action(&actions, 10, cookie, sizeof cookie);
+
+    supported = dpif_may_support_psample(backer->dpif) &&
+        dpif_probe_feature(backer->dpif, "psample", &key, &actions, NULL);
+
+    ofpbuf_uninit(&actions);
+    VLOG_INFO("%s: Datapath %s psample action", dpif_name(backer->dpif),
+              supported ? "supports" : "does not support");
+    return supported;
+}
+
 #define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE, ETHTYPE)               \
 static bool                                                                 \
 check_##NAME(struct dpif_backer *backer)                                    \
@@ -1698,6 +1742,7 @@  check_support(struct dpif_backer *backer)
         dpif_supports_lb_output_action(backer->dpif);
     backer->rt_support.ct_zero_snat = dpif_supports_ct_zero_snat(backer);
     backer->rt_support.add_mpls = check_add_mpls(backer);
+    backer->rt_support.psample = check_psample(backer);
 
     /* Flow fields. */
     backer->rt_support.odp.ct_state = check_ct_state(backer);
@@ -5821,6 +5866,7 @@  get_datapath_cap(const char *datapath_type, struct smap *cap)
     smap_add(cap, "lb_output_action", s->lb_output_action ? "true" : "false");
     smap_add(cap, "ct_zero_snat", s->ct_zero_snat ? "true" : "false");
     smap_add(cap, "add_mpls", s->add_mpls ? "true" : "false");
+    smap_add(cap, "psample", s->psample ? "true" : "false");
 
     /* The ct_tuple_flush is implemented on dpif level, so it is supported
      * for all backers. */
diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
index d33f73df8..ea18ccedf 100644
--- a/ofproto/ofproto-dpif.h
+++ b/ofproto/ofproto-dpif.h
@@ -213,7 +213,10 @@  struct group_dpif *group_dpif_lookup(struct ofproto_dpif *,
     DPIF_SUPPORT_FIELD(bool, ct_zero_snat, "Conntrack all-zero IP SNAT")    \
                                                                             \
     /* True if the datapath supports add_mpls action. */                    \
-    DPIF_SUPPORT_FIELD(bool, add_mpls, "MPLS Label add")
+    DPIF_SUPPORT_FIELD(bool, add_mpls, "MPLS Label add")                    \
+                                                                            \
+    /* True if the datapath supports psample action. */                     \
+    DPIF_SUPPORT_FIELD(bool, psample, "psample")
 
 
 /* Stores the various features which the corresponding backer supports. */
@@ -411,5 +414,6 @@  bool ofproto_dpif_ct_zone_timeout_policy_get_name(
     uint8_t nw_proto, char **tp_name, bool *unwildcard);
 
 bool ovs_explicit_drop_action_supported(struct ofproto_dpif *);
+bool ovs_psample_supported(struct ofproto_dpif *);
 
 #endif /* ofproto-dpif.h */
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index e3afb78a4..c6eb598d3 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -6511,6 +6511,11 @@  ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \
         called <code>NXT_CT_FLUSH</code>. The <code>NXT_CT_FLUSH</code>
         extensions allows to flush CT entries based on specified parameters.
       </column>
+      <column name="capabilities" key="psample"
+              type='{"type": "boolean"}'>
+        True if the datapath supports OVS_ACTION_ATTR_PSAMPLE. If false,
+        local sampling will not be supported.
+      </column>
     </group>
 
     <column name="ct_zone_default_limit">