mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 01:51:26 +00:00
Until now, dpif_sflow_read_actions() has ignored actions inside clone. This means that sflow missed tnl_push actions inside clone, which OVS now uses to avoid tx recirculation. This commit fixes the problem by making dpif_sflow_read_actions() recursively process actions inside clone. 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 too when sFlow is set on the overlay bridge. Both bugs are connected to sflows and were introduced by the commit in the "Fixes:" tag below. Signed-off-by: Zoltan Balogh <zoltan.balogh@ericsson.com> CC: Sugesh Chandran <sugesh.chandran@intel.com> Fixes: 7c12dfc527a5 ("tunneling: Avoid datapath-recirc by combining recirc actions at xlate.") Signed-off-by: Ben Pfaff <blp@ovn.org>
85 lines
3.1 KiB
C
85 lines
3.1 KiB
C
/*
|
|
* Copyright (c) 2009, 2010 InMon Corp.
|
|
* Copyright (c) 2009, 2012 Nicira, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef OFPROTO_DPIF_SFLOW_H
|
|
#define OFPROTO_DPIF_SFLOW_H 1
|
|
|
|
#include <stdint.h>
|
|
#include "svec.h"
|
|
#include "lib/odp-util.h"
|
|
|
|
struct dpif;
|
|
struct dpif_upcall;
|
|
struct flow;
|
|
struct ofproto_sflow_options;
|
|
struct ofport;
|
|
|
|
/* When we have the actions for a sampled packet that
|
|
* will go to just one output, then this structure is
|
|
* populated by parsing them. Only fields relevant to
|
|
* the sFlow export are extracted.
|
|
*/
|
|
struct dpif_sflow_actions {
|
|
odp_port_t out_port; /* ODP output port. */
|
|
|
|
uint32_t encap_depth; /* Count layers of tunnel-encap. */
|
|
struct flow_tnl tunnel; /* Egress tunnel push/set. */
|
|
uint8_t tunnel_ipproto; /* Tunnel push action can set ipproto. */
|
|
bool tunnel_err; /* Tunnel actions parse failure. */
|
|
|
|
/* Using host-byte order for the mpls stack here
|
|
to match the expectations of the sFlow library. Also
|
|
the ordering is reversed, so that the entry at offset 0
|
|
is the bottom of the stack.
|
|
*/
|
|
uint32_t mpls_lse[FLOW_MAX_MPLS_LABELS]; /* Out stack in host byte order. */
|
|
uint32_t mpls_stack_depth; /* Out stack depth. */
|
|
bool mpls_err; /* MPLS actions parse failure. */
|
|
};
|
|
|
|
struct dpif_sflow *dpif_sflow_create(void);
|
|
struct dpif_sflow *dpif_sflow_ref(const struct dpif_sflow *);
|
|
void dpif_sflow_unref(struct dpif_sflow *);
|
|
|
|
uint32_t dpif_sflow_get_probability(const struct dpif_sflow *);
|
|
|
|
void dpif_sflow_set_options(struct dpif_sflow *,
|
|
const struct ofproto_sflow_options *);
|
|
void dpif_sflow_clear(struct dpif_sflow *);
|
|
bool dpif_sflow_is_enabled(const struct dpif_sflow *);
|
|
|
|
void dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport,
|
|
odp_port_t odp_port);
|
|
void dpif_sflow_del_port(struct dpif_sflow *, odp_port_t odp_port);
|
|
|
|
void dpif_sflow_run(struct dpif_sflow *);
|
|
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 *, bool capture_mpls);
|
|
|
|
void dpif_sflow_received(struct dpif_sflow *, const struct dp_packet *,
|
|
const struct flow *, odp_port_t odp_port,
|
|
const struct user_action_cookie *,
|
|
const struct dpif_sflow_actions *);
|
|
|
|
int dpif_sflow_odp_port_to_ifindex(const struct dpif_sflow *,
|
|
odp_port_t odp_port);
|
|
|
|
#endif /* ofproto/ofproto-dpif-sflow.h */
|