From patchwork Tue Dec 5 10:43:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zoltan Balogh X-Patchwork-Id: 844678 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yrdfR2fV7z9tB8 for ; Tue, 5 Dec 2017 21:44:31 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 314531417; Tue, 5 Dec 2017 10:43:54 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id BA70F1414 for ; Tue, 5 Dec 2017 10:43:52 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from sesbmg23.ericsson.net (sesbmg23.ericsson.net [193.180.251.37]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 8AEF8F6 for ; Tue, 5 Dec 2017 10:43:51 +0000 (UTC) X-AuditID: c1b4fb25-385ff70000000151-ef-5a267864cb69 Received: from ESESSHC024.ericsson.se (Unknown_Domain [153.88.183.90]) by sesbmg23.ericsson.net (Symantec Mail Security) with SMTP id 71.E3.00337.468762A5; Tue, 5 Dec 2017 11:43:48 +0100 (CET) Received: from labserv2.eth.ericsson.se (153.88.183.153) by smtp.internal.ericsson.com (153.88.183.92) with Microsoft SMTP Server id 14.3.352.0; Tue, 5 Dec 2017 11:43:48 +0100 Received: from gep5.sdn.hu.eld.ericsson.se (unknown [172.31.40.105]) by labserv2.eth.ericsson.se (Postfix) with ESMTP id 0B83C29C740; Tue, 5 Dec 2017 11:37:16 +0100 (CET) From: Zoltan Balogh To: Date: Tue, 5 Dec 2017 11:43:14 +0100 Message-ID: <1512470596-18091-2-git-send-email-zoltan.balogh@ericsson.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1512470596-18091-1-git-send-email-zoltan.balogh@ericsson.com> References: <1512470596-18091-1-git-send-email-zoltan.balogh@ericsson.com> MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrFLMWRmVeSWpSXmKPExsUyM2J7lG5KhVqUwdU2E4ujp/cwWzy9+IvZ gclj8Z6XTB7Pbv5nDGCK4rJJSc3JLEst0rdL4Mp4+qSduWCPacWrzw9ZGxgvaXUxcnJICJhI rF1xjL2LkYtDSOAwo8TEa39ZIJzNjBKzvt9hhnDWM0rsffOUEaSFTcBA4sflL0wgtoiApMS/ xVvYQGxmgViJz8s3sYLYwgLuEhc//WMBsVkEVCRWTfrADmLzCnhJNGx9xQSxWk7i5LHJYPWc At4SM/4eBasRAqppXbiOCaJeUOLkzCcsEPMlJA6+eMEMUaMucajlNdsERoFZSMpmISlbwMi0 ilG0OLU4KTfdyFgvtSgzubg4P08vL7VkEyMwBA9u+a26g/HyG8dDjAIcjEo8vHIlalFCrIll xZW5hxglOJiVRHjlyoFCvCmJlVWpRfnxRaU5qcWHGKU5WJTEeU968kYJCaQnlqRmp6YWpBbB ZJk4OKUaGGOXiPZ/3DbjYMBEhpLeys5PG++eFv575BxvUKXB2i6lyaKfV2dsmdzK+OzoixVp 7TeMTq3g19hVM23N34rtEgwbVZ5MrQkpuBhcavvsqBTvF11+40Y2/iVVNlW66RfFP1spOlR9 2m0QrbP8eMfr4He1SnZqq8pvrDi/4MabV3tY1kd1aZ94w6rEUpyRaKjFXFScCACEViEQPQIA AA== X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 1/3] ofproto-dpif-sflow: propagate actions within clone X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org By avoiding Tx recirculation and embracing tnl_push action within clone, the tunnel metadata is not propagated. Unless clone action is handled in the dpif_sflow_read_actions() function as well. This commit resolves this issue. In addition, some sflow data needs to be stored and restored in ofproto-dpif-xlate when native_tunnel_output() is invoked. Otherwise the output action of underlay bridge is getting counted as well if sFlow is set on the overlay bridge. Signed-off-by: Zoltan Balogh CC: Sugesh Chandran --- ofproto/ofproto-dpif-sflow.c | 19 +++++++++++++------ ofproto/ofproto-dpif-sflow.h | 2 +- ofproto/ofproto-dpif-upcall.c | 2 +- ofproto/ofproto-dpif-xlate.c | 7 +++++++ tests/ofproto-dpif.at | 2 +- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c index ccf89645b..0bdb3fdfa 100644 --- a/ofproto/ofproto-dpif-sflow.c +++ b/ofproto/ofproto-dpif-sflow.c @@ -961,7 +961,7 @@ sflow_read_set_action(const struct nlattr *attr, } else { dpif_sflow_read_actions(NULL, nl_attr_get(attr), nl_attr_get_size(attr), - sflow_actions); + sflow_actions, true); } break; case OVS_KEY_ATTR_PRIORITY: @@ -1089,7 +1089,7 @@ dpif_sflow_capture_input_mpls(const struct flow *flow, void dpif_sflow_read_actions(const struct flow *flow, const struct nlattr *actions, size_t actions_len, - struct dpif_sflow_actions *sflow_actions) + struct dpif_sflow_actions *sflow_actions, bool capture_mpls) { const struct nlattr *a; unsigned int left; @@ -1099,7 +1099,7 @@ dpif_sflow_read_actions(const struct flow *flow, return; } - if (flow != NULL) { + if (flow != NULL && capture_mpls == true) { /* Make sure the MPLS output stack * is seeded with the input stack. */ @@ -1197,8 +1197,13 @@ dpif_sflow_read_actions(const struct flow *flow, * structure to report this. */ break; + case OVS_ACTION_ATTR_CLONE: + if (flow != NULL) { + dpif_sflow_read_actions(flow, nl_attr_get(a), nl_attr_get_size(a), + sflow_actions, false); + } + break; case OVS_ACTION_ATTR_SAMPLE: - case OVS_ACTION_ATTR_CLONE: case OVS_ACTION_ATTR_ENCAP_NSH: case OVS_ACTION_ATTR_DECAP_NSH: case OVS_ACTION_ATTR_UNSPEC: @@ -1266,6 +1271,7 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet, struct dpif_sflow_port *in_dsp; struct dpif_sflow_port *out_dsp; ovs_be16 vlan_tci; + uint32_t num_outputs; ovs_mutex_lock(&mutex); sampler = ds->sflow_agent->samplers; @@ -1333,11 +1339,12 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet, } } + num_outputs = dpif_sflow_cookie_num_outputs(cookie); /* Output tunnel. */ if (sflow_actions && sflow_actions->encap_depth == 1 && !sflow_actions->tunnel_err - && dpif_sflow_cookie_num_outputs(cookie) == 1) { + && (num_outputs == 1 || num_outputs == 2)) { /* push_tnl or clone + push_tnl */ tnlOutProto = sflow_actions->tunnel_ipproto; if (tnlOutProto == 0) { /* Try to infer the ip-protocol from the output port. */ @@ -1367,7 +1374,7 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet, if (sflow_actions && sflow_actions->mpls_stack_depth > 0 && !sflow_actions->mpls_err - && dpif_sflow_cookie_num_outputs(cookie) == 1) { + && num_outputs == 1) { memset(&mplsElem, 0, sizeof(mplsElem)); mplsElem.tag = SFLFLOW_EX_MPLS; dpif_sflow_encode_mpls_stack(&mplsElem.flowType.mpls.out_stack, diff --git a/ofproto/ofproto-dpif-sflow.h b/ofproto/ofproto-dpif-sflow.h index 014e6cce3..01dd7d590 100644 --- a/ofproto/ofproto-dpif-sflow.h +++ b/ofproto/ofproto-dpif-sflow.h @@ -71,7 +71,7 @@ void dpif_sflow_wait(struct dpif_sflow *); void dpif_sflow_read_actions(const struct flow *, const struct nlattr *actions, size_t actions_len, - struct dpif_sflow_actions *); + struct dpif_sflow_actions *, bool capture_mpls); void dpif_sflow_received(struct dpif_sflow *, const struct dp_packet *, const struct flow *, odp_port_t odp_port, diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 02cf5415b..dc496344f 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -1317,7 +1317,7 @@ dpif_read_actions(struct udpif *udpif, struct upcall *upcall, switch (type) { case SFLOW_UPCALL: - dpif_sflow_read_actions(flow, actions, actions_len, upcall_data); + dpif_sflow_read_actions(flow, actions, actions_len, upcall_data, true); break; case FLOW_SAMPLE_UPCALL: case IPFIX_UPCALL: diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index fcced344e..19343aca3 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -3259,6 +3259,9 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport, char buf_sip6[INET6_ADDRSTRLEN]; char buf_dip6[INET6_ADDRSTRLEN]; + /* Store sFlow data. */ + uint32_t sflow_n_outputs = ctx->sflow_n_outputs; + /* Structures to backup Ethernet and IP of base_flow. */ struct flow old_base_flow; struct flow old_flow; @@ -3410,6 +3413,10 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport, /* Restore the flows after the translation. */ memcpy(&ctx->xin->flow, &old_flow, sizeof ctx->xin->flow); memcpy(&ctx->base_flow, &old_base_flow, sizeof ctx->base_flow); + + /* Restore sFlow data. */ + ctx->sflow_n_outputs = sflow_n_outputs; + return 0; } diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index 9a51a1364..cdf48f4de 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -6286,7 +6286,7 @@ AT_CHECK([ovs-appctl ovs/route/add 1.1.2.92/24 br0], [0], [OK AT_CHECK([ovs-ofctl add-flow br0 action=normal]) dnl Prime ARP Cache for 1.1.2.92 -AT_CHECK([ovs-appctl netdev-dummy/receive br0 'recirc_id(0),in_port(100),eth(src=f8:bc:12:44:34:b6,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=1.1.2.92,tip=1.1.2.88,op=2,sha=f8:bc:12:44:34:b6,tha=00:00:00:00:00:00)']) +AT_CHECK([ovs-appctl netdev-dummy/receive p0 'recirc_id(0),in_port(1),eth(src=f8:bc:12:44:34:b6,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=1.1.2.92,tip=1.1.2.88,op=2,sha=f8:bc:12:44:34:b6,tha=00:00:00:00:00:00)']) dnl configure sflow on int-br only ovs-vsctl \