Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
On 28 Jun 2024, at 15:53, Adrián Moreno wrote: > On Thu, Jun 27, 2024 at 03:57:03PM GMT, Eelco Chaudron wrote: >> >> >> On 27 Jun 2024, at 13:37, Adrián Moreno wrote: >> >>> On Wed, Jun 26, 2024 at 02:11:00PM GMT, Eelco Chaudron wrote: On 5 Jun 2024, at 22:23, Adrian Moreno wrote: > Add as new column in the Flow_Sample_Collector_Set table named > "local_sample_group" which enables this feature. > > Signed-off-by: Adrian Moreno > --- > NEWS | 4 ++ > vswitchd/bridge.c | 78 +++--- > vswitchd/vswitch.ovsschema | 9 - > vswitchd/vswitch.xml | 39 +-- > 4 files changed, 119 insertions(+), 11 deletions(-) > > diff --git a/NEWS b/NEWS > index b92cec532..1c05a7120 100644 > --- a/NEWS > +++ b/NEWS > @@ -7,6 +7,10 @@ Post-v3.3.0 > - The primary development branch has been renamed from 'master' to > 'main'. > The OVS tree remains hosted on GitHub. > https://github.com/openvswitch/ovs.git > + - Local sampling is introduced. It reuses the OpenFlow sample action > and > + allows samples to be emitted locally (instead of via IPFIX) in a > + datapath-specific manner via the new datapath action called > "emit_sample". > + Linux kernel datapath is the first to support this feature. > > > v3.3.0 - 16 Feb 2024 > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > index 95a65fcdc..cd7dc6646 100644 > --- a/vswitchd/bridge.c > +++ b/vswitchd/bridge.c > @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge > *); > static void bridge_configure_mcast_snooping(struct bridge *); > static void bridge_configure_sflow(struct bridge *, int > *sflow_bridge_number); > static void bridge_configure_ipfix(struct bridge *); > +static void bridge_configure_lsample(struct bridge *); > static void bridge_configure_spanning_tree(struct bridge *); > static void bridge_configure_tables(struct bridge *); > static void bridge_configure_dp_desc(struct bridge *); > @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch > *ovs_cfg) > bridge_configure_netflow(br); > bridge_configure_sflow(br, &sflow_bridge_number); > bridge_configure_ipfix(br); > +bridge_configure_lsample(br); > bridge_configure_spanning_tree(br); > bridge_configure_tables(br); > bridge_configure_dp_desc(br); > @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix > *ipfix) > return ipfix && ipfix->n_targets > 0; > } > > -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ > +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX constains -> 'contains a' >>> >>> Ack. >>> > + * configuration. */ > static bool > -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, > - const struct bridge *br) > +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set > *fscs, > + const struct bridge *br) > { > return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; > } > @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) > const char *virtual_obs_id; > > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > n_fe_opts++; > } > } > @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) > fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); > opts = fe_opts; > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > opts->collector_set_id = fe_cfg->id; > sset_init(&opts->targets); > sset_add_array(&opts->targets, fe_cfg->ipfix->targets, > @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) > } > } > > +/* Returns whether a Flow_Sample_Collector_Set row contains valid local > + * sampling configuraiton. */ ...row contains a valid local... ++ configuraiton -> configuration >>> >>> Ack. >>> > +static bool > +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set > *fscs, > + const struct bridge *br) > +{ > +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && > + fscs->bridge == br->cfg; > +} > + > +/
Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
On Thu, Jun 27, 2024 at 03:57:03PM GMT, Eelco Chaudron wrote: > > > On 27 Jun 2024, at 13:37, Adrián Moreno wrote: > > > On Wed, Jun 26, 2024 at 02:11:00PM GMT, Eelco Chaudron wrote: > >> On 5 Jun 2024, at 22:23, Adrian Moreno wrote: > >> > >>> Add as new column in the Flow_Sample_Collector_Set table named > >>> "local_sample_group" which enables this feature. > >>> > >>> Signed-off-by: Adrian Moreno > >>> --- > >>> NEWS | 4 ++ > >>> vswitchd/bridge.c | 78 +++--- > >>> vswitchd/vswitch.ovsschema | 9 - > >>> vswitchd/vswitch.xml | 39 +-- > >>> 4 files changed, 119 insertions(+), 11 deletions(-) > >>> > >>> diff --git a/NEWS b/NEWS > >>> index b92cec532..1c05a7120 100644 > >>> --- a/NEWS > >>> +++ b/NEWS > >>> @@ -7,6 +7,10 @@ Post-v3.3.0 > >>> - The primary development branch has been renamed from 'master' to > >>> 'main'. > >>> The OVS tree remains hosted on GitHub. > >>>https://github.com/openvswitch/ovs.git > >>> + - Local sampling is introduced. It reuses the OpenFlow sample action > >>> and > >>> + allows samples to be emitted locally (instead of via IPFIX) in a > >>> + datapath-specific manner via the new datapath action called > >>> "emit_sample". > >>> + Linux kernel datapath is the first to support this feature. > >>> > >>> > >>> v3.3.0 - 16 Feb 2024 > >>> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > >>> index 95a65fcdc..cd7dc6646 100644 > >>> --- a/vswitchd/bridge.c > >>> +++ b/vswitchd/bridge.c > >>> @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge > >>> *); > >>> static void bridge_configure_mcast_snooping(struct bridge *); > >>> static void bridge_configure_sflow(struct bridge *, int > >>> *sflow_bridge_number); > >>> static void bridge_configure_ipfix(struct bridge *); > >>> +static void bridge_configure_lsample(struct bridge *); > >>> static void bridge_configure_spanning_tree(struct bridge *); > >>> static void bridge_configure_tables(struct bridge *); > >>> static void bridge_configure_dp_desc(struct bridge *); > >>> @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch > >>> *ovs_cfg) > >>> bridge_configure_netflow(br); > >>> bridge_configure_sflow(br, &sflow_bridge_number); > >>> bridge_configure_ipfix(br); > >>> +bridge_configure_lsample(br); > >>> bridge_configure_spanning_tree(br); > >>> bridge_configure_tables(br); > >>> bridge_configure_dp_desc(br); > >>> @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix > >>> *ipfix) > >>> return ipfix && ipfix->n_targets > 0; > >>> } > >>> > >>> -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ > >>> +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX > >> > >> constains -> 'contains a' > >> > > > > Ack. > > > >>> + * configuration. */ > >>> static bool > >>> -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, > >>> - const struct bridge *br) > >>> +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set > >>> *fscs, > >>> + const struct bridge *br) > >>> { > >>> return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; > >>> } > >>> @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) > >>> const char *virtual_obs_id; > >>> > >>> OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > >>> -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > >>> +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > >>> n_fe_opts++; > >>> } > >>> } > >>> @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) > >>> fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); > >>> opts = fe_opts; > >>> OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > >>> -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > >>> +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > >>> opts->collector_set_id = fe_cfg->id; > >>> sset_init(&opts->targets); > >>> sset_add_array(&opts->targets, fe_cfg->ipfix->targets, > >>> @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) > >>> } > >>> } > >>> > >>> +/* Returns whether a Flow_Sample_Collector_Set row contains valid local > >>> + * sampling configuraiton. */ > >> > >> ...row contains a valid local... > >>++ > >> > >> configuraiton -> configuration > > > > Ack. > > > >> > >>> +static bool > >>> +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set > >>> *fscs, > >>> + const struct bridge *br) > >>> +{ > >>> +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && > >>> + fscs->bridge == br->cfg; > >>> +} > >>> + > >>> +/* Set local sample configuration on 'br'. */ > >>> +sta
Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
On 27 Jun 2024, at 13:37, Adrián Moreno wrote: > On Wed, Jun 26, 2024 at 02:11:00PM GMT, Eelco Chaudron wrote: >> On 5 Jun 2024, at 22:23, Adrian Moreno wrote: >> >>> Add as new column in the Flow_Sample_Collector_Set table named >>> "local_sample_group" which enables this feature. >>> >>> Signed-off-by: Adrian Moreno >>> --- >>> NEWS | 4 ++ >>> vswitchd/bridge.c | 78 +++--- >>> vswitchd/vswitch.ovsschema | 9 - >>> vswitchd/vswitch.xml | 39 +-- >>> 4 files changed, 119 insertions(+), 11 deletions(-) >>> >>> diff --git a/NEWS b/NEWS >>> index b92cec532..1c05a7120 100644 >>> --- a/NEWS >>> +++ b/NEWS >>> @@ -7,6 +7,10 @@ Post-v3.3.0 >>> - The primary development branch has been renamed from 'master' to >>> 'main'. >>> The OVS tree remains hosted on GitHub. >>>https://github.com/openvswitch/ovs.git >>> + - Local sampling is introduced. It reuses the OpenFlow sample action and >>> + allows samples to be emitted locally (instead of via IPFIX) in a >>> + datapath-specific manner via the new datapath action called >>> "emit_sample". >>> + Linux kernel datapath is the first to support this feature. >>> >>> >>> v3.3.0 - 16 Feb 2024 >>> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c >>> index 95a65fcdc..cd7dc6646 100644 >>> --- a/vswitchd/bridge.c >>> +++ b/vswitchd/bridge.c >>> @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge *); >>> static void bridge_configure_mcast_snooping(struct bridge *); >>> static void bridge_configure_sflow(struct bridge *, int >>> *sflow_bridge_number); >>> static void bridge_configure_ipfix(struct bridge *); >>> +static void bridge_configure_lsample(struct bridge *); >>> static void bridge_configure_spanning_tree(struct bridge *); >>> static void bridge_configure_tables(struct bridge *); >>> static void bridge_configure_dp_desc(struct bridge *); >>> @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch >>> *ovs_cfg) >>> bridge_configure_netflow(br); >>> bridge_configure_sflow(br, &sflow_bridge_number); >>> bridge_configure_ipfix(br); >>> +bridge_configure_lsample(br); >>> bridge_configure_spanning_tree(br); >>> bridge_configure_tables(br); >>> bridge_configure_dp_desc(br); >>> @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix >>> *ipfix) >>> return ipfix && ipfix->n_targets > 0; >>> } >>> >>> -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ >>> +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX >> >> constains -> 'contains a' >> > > Ack. > >>> + * configuration. */ >>> static bool >>> -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, >>> - const struct bridge *br) >>> +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set >>> *fscs, >>> + const struct bridge *br) >>> { >>> return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; >>> } >>> @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) >>> const char *virtual_obs_id; >>> >>> OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { >>> -if (ovsrec_fscs_is_valid(fe_cfg, br)) { >>> +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { >>> n_fe_opts++; >>> } >>> } >>> @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) >>> fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); >>> opts = fe_opts; >>> OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { >>> -if (ovsrec_fscs_is_valid(fe_cfg, br)) { >>> +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { >>> opts->collector_set_id = fe_cfg->id; >>> sset_init(&opts->targets); >>> sset_add_array(&opts->targets, fe_cfg->ipfix->targets, >>> @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) >>> } >>> } >>> >>> +/* Returns whether a Flow_Sample_Collector_Set row contains valid local >>> + * sampling configuraiton. */ >> >> ...row contains a valid local... >>++ >> >> configuraiton -> configuration > > Ack. > >> >>> +static bool >>> +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set >>> *fscs, >>> + const struct bridge *br) >>> +{ >>> +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && >>> + fscs->bridge == br->cfg; >>> +} >>> + >>> +/* Set local sample configuration on 'br'. */ >>> +static void >>> +bridge_configure_lsample(struct bridge *br) >>> +{ >>> +static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); >>> +const struct ovsrec_flow_sample_collector_set *fscs; >>> +struct ofproto_lsample_options *opts_array, *opts; >>> +size_t n_opts = 0; >>> +int ret; >>> + >>> +/
Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
On Wed, Jun 26, 2024 at 02:11:00PM GMT, Eelco Chaudron wrote: > On 5 Jun 2024, at 22:23, Adrian Moreno wrote: > > > Add as new column in the Flow_Sample_Collector_Set table named > > "local_sample_group" which enables this feature. > > > > Signed-off-by: Adrian Moreno > > --- > > NEWS | 4 ++ > > vswitchd/bridge.c | 78 +++--- > > vswitchd/vswitch.ovsschema | 9 - > > vswitchd/vswitch.xml | 39 +-- > > 4 files changed, 119 insertions(+), 11 deletions(-) > > > > diff --git a/NEWS b/NEWS > > index b92cec532..1c05a7120 100644 > > --- a/NEWS > > +++ b/NEWS > > @@ -7,6 +7,10 @@ Post-v3.3.0 > > - The primary development branch has been renamed from 'master' to > > 'main'. > > The OVS tree remains hosted on GitHub. > > https://github.com/openvswitch/ovs.git > > + - Local sampling is introduced. It reuses the OpenFlow sample action and > > + allows samples to be emitted locally (instead of via IPFIX) in a > > + datapath-specific manner via the new datapath action called > > "emit_sample". > > + Linux kernel datapath is the first to support this feature. > > > > > > v3.3.0 - 16 Feb 2024 > > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > > index 95a65fcdc..cd7dc6646 100644 > > --- a/vswitchd/bridge.c > > +++ b/vswitchd/bridge.c > > @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge *); > > static void bridge_configure_mcast_snooping(struct bridge *); > > static void bridge_configure_sflow(struct bridge *, int > > *sflow_bridge_number); > > static void bridge_configure_ipfix(struct bridge *); > > +static void bridge_configure_lsample(struct bridge *); > > static void bridge_configure_spanning_tree(struct bridge *); > > static void bridge_configure_tables(struct bridge *); > > static void bridge_configure_dp_desc(struct bridge *); > > @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch > > *ovs_cfg) > > bridge_configure_netflow(br); > > bridge_configure_sflow(br, &sflow_bridge_number); > > bridge_configure_ipfix(br); > > +bridge_configure_lsample(br); > > bridge_configure_spanning_tree(br); > > bridge_configure_tables(br); > > bridge_configure_dp_desc(br); > > @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix > > *ipfix) > > return ipfix && ipfix->n_targets > 0; > > } > > > > -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ > > +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX > > constains -> 'contains a' > Ack. > > + * configuration. */ > > static bool > > -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, > > - const struct bridge *br) > > +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set > > *fscs, > > + const struct bridge *br) > > { > > return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; > > } > > @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) > > const char *virtual_obs_id; > > > > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > > n_fe_opts++; > > } > > } > > @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) > > fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); > > opts = fe_opts; > > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > > opts->collector_set_id = fe_cfg->id; > > sset_init(&opts->targets); > > sset_add_array(&opts->targets, fe_cfg->ipfix->targets, > > @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) > > } > > } > > > > +/* Returns whether a Flow_Sample_Collector_Set row contains valid local > > + * sampling configuraiton. */ > > ...row contains a valid local... >++ > > configuraiton -> configuration Ack. > > > +static bool > > +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set > > *fscs, > > + const struct bridge *br) > > +{ > > +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && > > + fscs->bridge == br->cfg; > > +} > > + > > +/* Set local sample configuration on 'br'. */ > > +static void > > +bridge_configure_lsample(struct bridge *br) > > +{ > > +static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > > +const struct ovsrec_flow_sample_collector_set *fscs; > > +struct ofproto_lsample_options *opts_array, *opts; > > +size_t n_opts = 0; > > +int ret; > > + > > +/* Iterate the Flow_Sample_Collector_Set table twice. > > + * First
Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
On 5 Jun 2024, at 22:23, Adrian Moreno wrote: > Add as new column in the Flow_Sample_Collector_Set table named > "local_sample_group" which enables this feature. > > Signed-off-by: Adrian Moreno > --- > NEWS | 4 ++ > vswitchd/bridge.c | 78 +++--- > vswitchd/vswitch.ovsschema | 9 - > vswitchd/vswitch.xml | 39 +-- > 4 files changed, 119 insertions(+), 11 deletions(-) > > diff --git a/NEWS b/NEWS > index b92cec532..1c05a7120 100644 > --- a/NEWS > +++ b/NEWS > @@ -7,6 +7,10 @@ Post-v3.3.0 > - The primary development branch has been renamed from 'master' to 'main'. > The OVS tree remains hosted on GitHub. > https://github.com/openvswitch/ovs.git > + - Local sampling is introduced. It reuses the OpenFlow sample action and > + allows samples to be emitted locally (instead of via IPFIX) in a > + datapath-specific manner via the new datapath action called > "emit_sample". > + Linux kernel datapath is the first to support this feature. > > > v3.3.0 - 16 Feb 2024 > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > index 95a65fcdc..cd7dc6646 100644 > --- a/vswitchd/bridge.c > +++ b/vswitchd/bridge.c > @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge *); > static void bridge_configure_mcast_snooping(struct bridge *); > static void bridge_configure_sflow(struct bridge *, int > *sflow_bridge_number); > static void bridge_configure_ipfix(struct bridge *); > +static void bridge_configure_lsample(struct bridge *); > static void bridge_configure_spanning_tree(struct bridge *); > static void bridge_configure_tables(struct bridge *); > static void bridge_configure_dp_desc(struct bridge *); > @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch > *ovs_cfg) > bridge_configure_netflow(br); > bridge_configure_sflow(br, &sflow_bridge_number); > bridge_configure_ipfix(br); > +bridge_configure_lsample(br); > bridge_configure_spanning_tree(br); > bridge_configure_tables(br); > bridge_configure_dp_desc(br); > @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix > *ipfix) > return ipfix && ipfix->n_targets > 0; > } > > -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ > +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX constains -> 'contains a' > + * configuration. */ > static bool > -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, > - const struct bridge *br) > +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set > *fscs, > + const struct bridge *br) > { > return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; > } > @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) > const char *virtual_obs_id; > > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > n_fe_opts++; > } > } > @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) > fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); > opts = fe_opts; > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > opts->collector_set_id = fe_cfg->id; > sset_init(&opts->targets); > sset_add_array(&opts->targets, fe_cfg->ipfix->targets, > @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) > } > } > > +/* Returns whether a Flow_Sample_Collector_Set row contains valid local > + * sampling configuraiton. */ ...row contains a valid local... ++ configuraiton -> configuration > +static bool > +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set > *fscs, > + const struct bridge *br) > +{ > +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && > + fscs->bridge == br->cfg; > +} > + > +/* Set local sample configuration on 'br'. */ > +static void > +bridge_configure_lsample(struct bridge *br) > +{ > +static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > +const struct ovsrec_flow_sample_collector_set *fscs; > +struct ofproto_lsample_options *opts_array, *opts; > +size_t n_opts = 0; > +int ret; > + > +/* Iterate the Flow_Sample_Collector_Set table twice. > + * First to get the number of valid configuration entries, then to > process > + * each of them and build an array of options. */ > +OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH (fscs, idl) { > +if (ovsrec_fscs_is_valid_local(fscs, br)) { > +n_opts ++; > +} > +} Did you consider just all
Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
On Wed, Jun 05, 2024 at 10:23:32PM GMT, Adrian Moreno wrote: > Add as new column in the Flow_Sample_Collector_Set table named > "local_sample_group" which enables this feature. > > Signed-off-by: Adrian Moreno Ugh...It seems a merge conflict with the NEWS file is breaking robot builds. > --- > NEWS | 4 ++ > vswitchd/bridge.c | 78 +++--- > vswitchd/vswitch.ovsschema | 9 - > vswitchd/vswitch.xml | 39 +-- > 4 files changed, 119 insertions(+), 11 deletions(-) > > diff --git a/NEWS b/NEWS > index b92cec532..1c05a7120 100644 > --- a/NEWS > +++ b/NEWS > @@ -7,6 +7,10 @@ Post-v3.3.0 > - The primary development branch has been renamed from 'master' to 'main'. > The OVS tree remains hosted on GitHub. > https://github.com/openvswitch/ovs.git > + - Local sampling is introduced. It reuses the OpenFlow sample action and > + allows samples to be emitted locally (instead of via IPFIX) in a > + datapath-specific manner via the new datapath action called > "emit_sample". > + Linux kernel datapath is the first to support this feature. > > > v3.3.0 - 16 Feb 2024 > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > index 95a65fcdc..cd7dc6646 100644 > --- a/vswitchd/bridge.c > +++ b/vswitchd/bridge.c > @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge *); > static void bridge_configure_mcast_snooping(struct bridge *); > static void bridge_configure_sflow(struct bridge *, int > *sflow_bridge_number); > static void bridge_configure_ipfix(struct bridge *); > +static void bridge_configure_lsample(struct bridge *); > static void bridge_configure_spanning_tree(struct bridge *); > static void bridge_configure_tables(struct bridge *); > static void bridge_configure_dp_desc(struct bridge *); > @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch > *ovs_cfg) > bridge_configure_netflow(br); > bridge_configure_sflow(br, &sflow_bridge_number); > bridge_configure_ipfix(br); > +bridge_configure_lsample(br); > bridge_configure_spanning_tree(br); > bridge_configure_tables(br); > bridge_configure_dp_desc(br); > @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix > *ipfix) > return ipfix && ipfix->n_targets > 0; > } > > -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ > +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX > + * configuration. */ > static bool > -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, > - const struct bridge *br) > +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set > *fscs, > + const struct bridge *br) > { > return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; > } > @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) > const char *virtual_obs_id; > > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > n_fe_opts++; > } > } > @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) > fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); > opts = fe_opts; > OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { > -if (ovsrec_fscs_is_valid(fe_cfg, br)) { > +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { > opts->collector_set_id = fe_cfg->id; > sset_init(&opts->targets); > sset_add_array(&opts->targets, fe_cfg->ipfix->targets, > @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) > } > } > > +/* Returns whether a Flow_Sample_Collector_Set row contains valid local > + * sampling configuraiton. */ > +static bool > +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set > *fscs, > + const struct bridge *br) > +{ > +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && > + fscs->bridge == br->cfg; > +} > + > +/* Set local sample configuration on 'br'. */ > +static void > +bridge_configure_lsample(struct bridge *br) > +{ > +static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > +const struct ovsrec_flow_sample_collector_set *fscs; > +struct ofproto_lsample_options *opts_array, *opts; > +size_t n_opts = 0; > +int ret; > + > +/* Iterate the Flow_Sample_Collector_Set table twice. > + * First to get the number of valid configuration entries, then to > process > + * each of them and build an array of options. */ > +OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH (fscs, idl) { > +if (ovsrec_fscs_is_valid_local(fscs, br)) { > +n_opts ++; > +} > +} > + > +if (n_opts == 0) { > +ofp
Re: [ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
Bleep bloop. Greetings Adrian Moreno, I am a robot and I have tried out your patch. Thanks for your contribution. I encountered some error that I wasn't expecting. See the details below. git-am: error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 vswitchd: Add local sampling to vswitchd schema. When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". Patch skipped due to previous failure. Please check this out. If you feel there has been an error, please email acon...@redhat.com Thanks, 0-day Robot ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev
[ovs-dev] [RFC v2 4/9] vswitchd: Add local sampling to vswitchd schema.
Add as new column in the Flow_Sample_Collector_Set table named "local_sample_group" which enables this feature. Signed-off-by: Adrian Moreno --- NEWS | 4 ++ vswitchd/bridge.c | 78 +++--- vswitchd/vswitch.ovsschema | 9 - vswitchd/vswitch.xml | 39 +-- 4 files changed, 119 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index b92cec532..1c05a7120 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,10 @@ Post-v3.3.0 - The primary development branch has been renamed from 'master' to 'main'. The OVS tree remains hosted on GitHub. https://github.com/openvswitch/ovs.git + - Local sampling is introduced. It reuses the OpenFlow sample action and + allows samples to be emitted locally (instead of via IPFIX) in a + datapath-specific manner via the new datapath action called "emit_sample". + Linux kernel datapath is the first to support this feature. v3.3.0 - 16 Feb 2024 diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 95a65fcdc..cd7dc6646 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -288,6 +288,7 @@ static void bridge_configure_mac_table(struct bridge *); static void bridge_configure_mcast_snooping(struct bridge *); static void bridge_configure_sflow(struct bridge *, int *sflow_bridge_number); static void bridge_configure_ipfix(struct bridge *); +static void bridge_configure_lsample(struct bridge *); static void bridge_configure_spanning_tree(struct bridge *); static void bridge_configure_tables(struct bridge *); static void bridge_configure_dp_desc(struct bridge *); @@ -989,6 +990,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg) bridge_configure_netflow(br); bridge_configure_sflow(br, &sflow_bridge_number); bridge_configure_ipfix(br); +bridge_configure_lsample(br); bridge_configure_spanning_tree(br); bridge_configure_tables(br); bridge_configure_dp_desc(br); @@ -1537,10 +1539,11 @@ ovsrec_ipfix_is_valid(const struct ovsrec_ipfix *ipfix) return ipfix && ipfix->n_targets > 0; } -/* Returns whether a Flow_Sample_Collector_Set row is valid. */ +/* Returns whether a Flow_Sample_Collector_Set row constains valid IPFIX + * configuration. */ static bool -ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, - const struct bridge *br) +ovsrec_fscs_is_valid_ipfix(const struct ovsrec_flow_sample_collector_set *fscs, + const struct bridge *br) { return ovsrec_ipfix_is_valid(fscs->ipfix) && fscs->bridge == br->cfg; } @@ -1558,7 +1561,7 @@ bridge_configure_ipfix(struct bridge *br) const char *virtual_obs_id; OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { -if (ovsrec_fscs_is_valid(fe_cfg, br)) { +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { n_fe_opts++; } } @@ -1621,7 +1624,7 @@ bridge_configure_ipfix(struct bridge *br) fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); opts = fe_opts; OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { -if (ovsrec_fscs_is_valid(fe_cfg, br)) { +if (ovsrec_fscs_is_valid_ipfix(fe_cfg, br)) { opts->collector_set_id = fe_cfg->id; sset_init(&opts->targets); sset_add_array(&opts->targets, fe_cfg->ipfix->targets, @@ -1667,6 +1670,71 @@ bridge_configure_ipfix(struct bridge *br) } } +/* Returns whether a Flow_Sample_Collector_Set row contains valid local + * sampling configuraiton. */ +static bool +ovsrec_fscs_is_valid_local(const struct ovsrec_flow_sample_collector_set *fscs, + const struct bridge *br) +{ +return fscs->local_sample_group && fscs->n_local_sample_group == 1 && + fscs->bridge == br->cfg; +} + +/* Set local sample configuration on 'br'. */ +static void +bridge_configure_lsample(struct bridge *br) +{ +static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); +const struct ovsrec_flow_sample_collector_set *fscs; +struct ofproto_lsample_options *opts_array, *opts; +size_t n_opts = 0; +int ret; + +/* Iterate the Flow_Sample_Collector_Set table twice. + * First to get the number of valid configuration entries, then to process + * each of them and build an array of options. */ +OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH (fscs, idl) { +if (ovsrec_fscs_is_valid_local(fscs, br)) { +n_opts ++; +} +} + +if (n_opts == 0) { +ofproto_set_local_sample(br->ofproto, NULL, 0); +return; +} + +opts_array = xcalloc(n_opts, sizeof *opts_array); +opts = opts_array; + +OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH (fscs, idl) { +if (!ovsrec_fscs_is_valid_local(fscs, br)) { +continue; +} +opts->collector_set_id = fscs->id; +opts->group_id = *fscs