mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 14:25:26 +00:00
ofp-actions: Add "ingress" and "egress" options to "sample" action.
Before Open vSwitch 2.5.90, IPFIX reports from Open vSwitch didn't include whether the packet was ingressing or egressing the switch. Starting in OVS 2.5.90, this information was available but only accurate if the action included a port number that indicated a tunnel. Conflating these two does not always make sense (not every packet involves a tunnel!), so this patch makes it possible for the sample action to simply say whether it's for ingress or egress. This is difficult to test, since the "tests" directory of OVS does not have a proper IPFIX listener. This passes those tests, plus a couple that just verify that the actions are properly parsed and formatted. Benli did test it end-to-end in a VMware use case. Requested-by: Benli Ye <daniely@vmware.com> Tested-by: Benli Ye <daniely@vmware.com> Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Simon Horman <simon.horman@netronome.com>
This commit is contained in:
@@ -313,12 +313,18 @@ format_odp_userspace_action(struct ds *ds, const struct nlattr *attr)
|
||||
",collector_set_id=%"PRIu32
|
||||
",obs_domain_id=%"PRIu32
|
||||
",obs_point_id=%"PRIu32
|
||||
",output_port=%"PRIu32")",
|
||||
",output_port=%"PRIu32,
|
||||
cookie.flow_sample.probability,
|
||||
cookie.flow_sample.collector_set_id,
|
||||
cookie.flow_sample.obs_domain_id,
|
||||
cookie.flow_sample.obs_point_id,
|
||||
cookie.flow_sample.output_odp_port);
|
||||
if (cookie.flow_sample.direction == NX_ACTION_SAMPLE_INGRESS) {
|
||||
ds_put_cstr(ds, ",ingress");
|
||||
} else if (cookie.flow_sample.direction == NX_ACTION_SAMPLE_EGRESS) {
|
||||
ds_put_cstr(ds, ",egress");
|
||||
}
|
||||
ds_put_char(ds, ')');
|
||||
} else if (userdata_len >= sizeof cookie.ipfix
|
||||
&& cookie.type == USER_ACTION_COOKIE_IPFIX) {
|
||||
ds_put_format(ds, ",ipfix(output_port=%"PRIu32")",
|
||||
@@ -963,7 +969,7 @@ parse_odp_userspace_action(const char *s, struct ofpbuf *actions)
|
||||
"collector_set_id=%"SCNi32","
|
||||
"obs_domain_id=%"SCNi32","
|
||||
"obs_point_id=%"SCNi32","
|
||||
"output_port=%"SCNi32")%n",
|
||||
"output_port=%"SCNi32"%n",
|
||||
&probability, &collector_set_id,
|
||||
&obs_domain_id, &obs_point_id,
|
||||
&output, &n1)) {
|
||||
@@ -977,6 +983,21 @@ parse_odp_userspace_action(const char *s, struct ofpbuf *actions)
|
||||
cookie.flow_sample.output_odp_port = u32_to_odp(output);
|
||||
user_data = &cookie;
|
||||
user_data_size = sizeof cookie.flow_sample;
|
||||
|
||||
if (ovs_scan(&s[n], ",ingress%n", &n1)) {
|
||||
cookie.flow_sample.direction = NX_ACTION_SAMPLE_INGRESS;
|
||||
n += n1;
|
||||
} else if (ovs_scan(&s[n], ",egress%n", &n1)) {
|
||||
cookie.flow_sample.direction = NX_ACTION_SAMPLE_EGRESS;
|
||||
n += n1;
|
||||
} else {
|
||||
cookie.flow_sample.direction = NX_ACTION_SAMPLE_DEFAULT;
|
||||
}
|
||||
if (s[n] != ')') {
|
||||
res = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
n++;
|
||||
} else if (ovs_scan(&s[n], ",ipfix(output_port=%"SCNi32")%n",
|
||||
&output, &n1) ) {
|
||||
n += n1;
|
||||
|
Reference in New Issue
Block a user