diff mbox

[ovs-dev,action,upcall,meter,v2,4/5] ofproto: Meter sample action when configured.

Message ID 1493370083-7385-4-git-send-email-azhou@ovn.org
State Accepted
Headers show

Commit Message

Andy Zhou April 28, 2017, 9:01 a.m. UTC
When slowpath meter is configured, add meter action when translate
sample action.

Signed-off-by: Andy Zhou <azhou@ovn.org>

---
v1->v2: Fix test case 1128 failure.
---
 ofproto/ofproto-dpif-xlate.c | 14 ++++++++++++--
 tests/ofproto-dpif.at        | 14 ++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

Comments

Jarno Rajahalme April 28, 2017, 7:48 p.m. UTC | #1
Acked-by: Jarno Rajahalme <jarno@ovn.org>

> On Apr 28, 2017, at 2:01 AM, Andy Zhou <azhou@ovn.org> wrote:
> 
> When slowpath meter is configured, add meter action when translate
> sample action.
> 
> Signed-off-by: Andy Zhou <azhou@ovn.org>
> 
> ---
> v1->v2: Fix test case 1128 failure.
> ---
> ofproto/ofproto-dpif-xlate.c | 14 ++++++++++++--
> tests/ofproto-dpif.at        | 14 ++++++++++++++
> 2 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index d8c6a7ccb38c..f34413b9bc94 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -2850,8 +2850,14 @@ compose_sample_action(struct xlate_ctx *ctx,
>         return 0;
>     }
> 
> -    /* No need to generate sample action for 100% sampling rate. */
> -    bool is_sample = probability < UINT32_MAX;
> +    /* If the slow path meter is configured by the controller,
> +     * insert a meter action before the user space action.  */
> +    struct ofproto *ofproto = &ctx->xin->ofproto->up;
> +    uint32_t meter_id = ofproto->slowpath_meter_id;
> +
> +    /* When meter action is not required, avoid generate sample action
> +     * for 100% sampling rate.  */
> +    bool is_sample = probability < UINT32_MAX || meter_id != UINT32_MAX;
>     size_t sample_offset, actions_offset;
>     if (is_sample) {
>         sample_offset = nl_msg_start_nested(ctx->odp_actions,
> @@ -2862,6 +2868,10 @@ compose_sample_action(struct xlate_ctx *ctx,
>                                              OVS_SAMPLE_ATTR_ACTIONS);
>     }
> 
> +    if (meter_id != UINT32_MAX) {
> +        nl_msg_put_u32(ctx->odp_actions, OVS_ACTION_ATTR_METER, meter_id);
> +    }
> +
>     odp_port_t odp_port = ofp_port_to_odp_port(
>         ctx->xbridge, ctx->xin->flow.in_port.ofp_port);
>     uint32_t pid = dpif_port_get_pid(ctx->xbridge->dpif, odp_port,
> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> index 9f7c6beb0c58..22cb533b57bb 100644
> --- a/tests/ofproto-dpif.at
> +++ b/tests/ofproto-dpif.at
> @@ -6490,6 +6490,20 @@ flow-dump from non-dpdk interfaces:
> packets:2, bytes:68, used:0.001s, actions:userspace(pid=0,ipfix(output_port=4294967295))
> ])
> 
> +AT_CHECK([ovs-appctl revalidator/purge])
> +dnl
> +dnl Add a slowpath meter. The userspace action should be metered.
> +AT_CHECK([ovs-ofctl -O OpenFlow13 add-meter br0 'meter=slowpath pktps burst stats bands=type=drop rate=3 burst_size=1'])
> +
> +dnl Send some packets that should be sampled and metered.
> +for i in `seq 1 3`; do
> +    AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800)'])
> +done
> +AT_CHECK([ovs-appctl dpctl/dump-flows | sed 's/.*\(packets:\)/\1/' | sed 's/used:[[0-9]].[[0-9]]*s/used:0.001s/'], [0], [dnl
> +flow-dump from non-dpdk interfaces:
> +packets:2, bytes:68, used:0.001s, actions:sample(sample=100.0%,actions(meter(0),userspace(pid=0,ipfix(output_port=4294967295))))
> +])
> +
> dnl Remove the IPFIX configuration.
> AT_CHECK([ovs-vsctl clear bridge br0 ipfix])
> AT_CHECK([ovs-appctl revalidator/purge])
> -- 
> 1.8.3.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff mbox

Patch

diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index d8c6a7ccb38c..f34413b9bc94 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2850,8 +2850,14 @@  compose_sample_action(struct xlate_ctx *ctx,
         return 0;
     }
 
-    /* No need to generate sample action for 100% sampling rate. */
-    bool is_sample = probability < UINT32_MAX;
+    /* If the slow path meter is configured by the controller,
+     * insert a meter action before the user space action.  */
+    struct ofproto *ofproto = &ctx->xin->ofproto->up;
+    uint32_t meter_id = ofproto->slowpath_meter_id;
+
+    /* When meter action is not required, avoid generate sample action
+     * for 100% sampling rate.  */
+    bool is_sample = probability < UINT32_MAX || meter_id != UINT32_MAX;
     size_t sample_offset, actions_offset;
     if (is_sample) {
         sample_offset = nl_msg_start_nested(ctx->odp_actions,
@@ -2862,6 +2868,10 @@  compose_sample_action(struct xlate_ctx *ctx,
                                              OVS_SAMPLE_ATTR_ACTIONS);
     }
 
+    if (meter_id != UINT32_MAX) {
+        nl_msg_put_u32(ctx->odp_actions, OVS_ACTION_ATTR_METER, meter_id);
+    }
+
     odp_port_t odp_port = ofp_port_to_odp_port(
         ctx->xbridge, ctx->xin->flow.in_port.ofp_port);
     uint32_t pid = dpif_port_get_pid(ctx->xbridge->dpif, odp_port,
diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
index 9f7c6beb0c58..22cb533b57bb 100644
--- a/tests/ofproto-dpif.at
+++ b/tests/ofproto-dpif.at
@@ -6490,6 +6490,20 @@  flow-dump from non-dpdk interfaces:
 packets:2, bytes:68, used:0.001s, actions:userspace(pid=0,ipfix(output_port=4294967295))
 ])
 
+AT_CHECK([ovs-appctl revalidator/purge])
+dnl
+dnl Add a slowpath meter. The userspace action should be metered.
+AT_CHECK([ovs-ofctl -O OpenFlow13 add-meter br0 'meter=slowpath pktps burst stats bands=type=drop rate=3 burst_size=1'])
+
+dnl Send some packets that should be sampled and metered.
+for i in `seq 1 3`; do
+    AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800)'])
+done
+AT_CHECK([ovs-appctl dpctl/dump-flows | sed 's/.*\(packets:\)/\1/' | sed 's/used:[[0-9]].[[0-9]]*s/used:0.001s/'], [0], [dnl
+flow-dump from non-dpdk interfaces:
+packets:2, bytes:68, used:0.001s, actions:sample(sample=100.0%,actions(meter(0),userspace(pid=0,ipfix(output_port=4294967295))))
+])
+
 dnl Remove the IPFIX configuration.
 AT_CHECK([ovs-vsctl clear bridge br0 ipfix])
 AT_CHECK([ovs-appctl revalidator/purge])