mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 18:07:40 +00:00
ofproto_dpif: Check for psample support.
Only kernel datapath supports this action so add a function in dpif.c that checks for that. Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
parent
1a3bd96b4f
commit
d0afbf0944
@ -1953,6 +1953,13 @@ dpif_supports_lb_output_action(const struct dpif *dpif)
|
|||||||
return dpif_is_netdev(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 */
|
/* Meters */
|
||||||
void
|
void
|
||||||
dpif_meter_get_features(const struct dpif *dpif,
|
dpif_meter_get_features(const struct dpif *dpif,
|
||||||
|
@ -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 *);
|
char *dpif_get_dp_version(const struct dpif *);
|
||||||
bool dpif_supports_tnl_push_pop(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_explicit_drop_action(const struct dpif *);
|
||||||
|
bool dpif_may_support_psample(const struct dpif *);
|
||||||
bool dpif_synced_dp_layers(struct dpif *);
|
bool dpif_synced_dp_layers(struct dpif *);
|
||||||
|
|
||||||
/* Log functions. */
|
/* Log functions. */
|
||||||
|
@ -874,6 +874,12 @@ ovs_lb_output_action_supported(struct ofproto_dpif *ofproto)
|
|||||||
return ofproto->backer->rt_support.lb_output_action;
|
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
|
/* Tests whether 'backer''s datapath supports recirculation. Only newer
|
||||||
* datapaths support OVS_KEY_ATTR_RECIRC_ID in keys. We need to disable some
|
* datapaths support OVS_KEY_ATTR_RECIRC_ID in keys. We need to disable some
|
||||||
* features on older datapaths that don't support this feature.
|
* features on older datapaths that don't support this feature.
|
||||||
@ -1610,6 +1616,44 @@ check_add_mpls(struct dpif_backer *backer)
|
|||||||
return supported;
|
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) \
|
#define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE, ETHTYPE) \
|
||||||
static bool \
|
static bool \
|
||||||
check_##NAME(struct dpif_backer *backer) \
|
check_##NAME(struct dpif_backer *backer) \
|
||||||
@ -1699,6 +1743,7 @@ check_support(struct dpif_backer *backer)
|
|||||||
dpif_supports_lb_output_action(backer->dpif);
|
dpif_supports_lb_output_action(backer->dpif);
|
||||||
backer->rt_support.ct_zero_snat = dpif_supports_ct_zero_snat(backer);
|
backer->rt_support.ct_zero_snat = dpif_supports_ct_zero_snat(backer);
|
||||||
backer->rt_support.add_mpls = check_add_mpls(backer);
|
backer->rt_support.add_mpls = check_add_mpls(backer);
|
||||||
|
backer->rt_support.psample = check_psample(backer);
|
||||||
|
|
||||||
/* Flow fields. */
|
/* Flow fields. */
|
||||||
backer->rt_support.odp.ct_state = check_ct_state(backer);
|
backer->rt_support.odp.ct_state = check_ct_state(backer);
|
||||||
@ -5822,6 +5867,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, "lb_output_action", s->lb_output_action ? "true" : "false");
|
||||||
smap_add(cap, "ct_zero_snat", s->ct_zero_snat ? "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, "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
|
/* The ct_tuple_flush is implemented on dpif level, so it is supported
|
||||||
* for all backers. */
|
* for all backers. */
|
||||||
|
@ -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") \
|
DPIF_SUPPORT_FIELD(bool, ct_zero_snat, "Conntrack all-zero IP SNAT") \
|
||||||
\
|
\
|
||||||
/* True if the datapath supports add_mpls action. */ \
|
/* 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 action")
|
||||||
|
|
||||||
|
|
||||||
/* Stores the various features which the corresponding backer supports. */
|
/* 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);
|
uint8_t nw_proto, char **tp_name, bool *unwildcard);
|
||||||
|
|
||||||
bool ovs_explicit_drop_action_supported(struct ofproto_dpif *);
|
bool ovs_explicit_drop_action_supported(struct ofproto_dpif *);
|
||||||
|
bool ovs_psample_supported(struct ofproto_dpif *);
|
||||||
|
|
||||||
#endif /* ofproto-dpif.h */
|
#endif /* ofproto-dpif.h */
|
||||||
|
@ -6517,6 +6517,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>
|
called <code>NXT_CT_FLUSH</code>. The <code>NXT_CT_FLUSH</code>
|
||||||
extensions allows to flush CT entries based on specified parameters.
|
extensions allows to flush CT entries based on specified parameters.
|
||||||
</column>
|
</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 with the Linux kernel datapath.
|
||||||
|
</column>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<column name="ct_zone_default_limit">
|
<column name="ct_zone_default_limit">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user