summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorJustin Pettit <jpettit@ovn.org>2017-10-03 17:31:34 -0700
committerJustin Pettit <jpettit@ovn.org>2018-01-10 16:42:00 -0800
commitfcb9579be3c7717744e63a343a86a0dbcf0d3d78 (patch)
tree429bfea9266057e182d49b706f06150c96ebab8d /ofproto
parenta934a3dd666698f8aca47f6a6a3e7678e9b3bf07 (diff)
downloadopenvswitch-fcb9579be3c7717744e63a343a86a0dbcf0d3d78.tar.gz
ofproto: Add 'ofproto_uuid' and 'ofp_in_port' to user action cookie.
Previously, the ofproto instance and OpenFlow port have been derived based on the datapath port number. This change explicitly declares them both, which will be helpful in future commits that no longer can depend on having a unique datapath port (e.g., a source port that represents the controller). Signed-off-by: Justin Pettit <jpettit@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-upcall.c49
-rw-r--r--ofproto/ofproto-dpif-xlate.c13
2 files changed, 44 insertions, 18 deletions
diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index 5ba100689..bd7dc9e7b 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -38,6 +38,7 @@
#include "packets.h"
#include "openvswitch/poll-loop.h"
#include "seq.h"
+#include "tunnel.h"
#include "unixctl.h"
#include "openvswitch/vlog.h"
@@ -207,7 +208,7 @@ struct upcall {
const ovs_u128 *ufid; /* Unique identifier for 'flow'. */
unsigned pmd_id; /* Datapath poll mode driver id. */
const struct dp_packet *packet; /* Packet associated with this upcall. */
- ofp_port_t in_port; /* OpenFlow in port, or OFPP_NONE. */
+ ofp_port_t ofp_in_port; /* OpenFlow in port, or OFPP_NONE. */
uint16_t mru; /* If !0, Maximum receive unit of
fragmented IP packet */
@@ -1021,16 +1022,18 @@ classify_upcall(enum dpif_upcall_type type, const struct nlattr *userdata,
* initialized with at least 128 bytes of space. */
static void
compose_slow_path(struct udpif *udpif, struct xlate_out *xout,
- const struct flow *flow, odp_port_t odp_in_port,
+ const struct flow *flow,
+ odp_port_t odp_in_port, ofp_port_t ofp_in_port,
struct ofpbuf *buf, uint32_t slowpath_meter_id,
- uint32_t controller_meter_id)
+ uint32_t controller_meter_id, struct uuid *ofproto_uuid)
{
struct user_action_cookie cookie;
odp_port_t port;
uint32_t pid;
cookie.type = USER_ACTION_COOKIE_SLOW_PATH;
- cookie.slow_path.unused = 0;
+ cookie.ofp_in_port = ofp_in_port;
+ cookie.ofproto_uuid = *ofproto_uuid;
cookie.slow_path.reason = xout->slow;
port = xout->slow & (SLOW_CFM | SLOW_BFD | SLOW_LACP | SLOW_STP)
@@ -1077,12 +1080,23 @@ upcall_receive(struct upcall *upcall, const struct dpif_backer *backer,
upcall->type = classify_upcall(type, userdata, &upcall->cookie);
if (upcall->type == BAD_UPCALL) {
return EAGAIN;
- }
-
- error = xlate_lookup(backer, flow, &upcall->ofproto, &upcall->ipfix,
- &upcall->sflow, NULL, &upcall->in_port);
- if (error) {
- return error;
+ } else if (upcall->type == MISS_UPCALL) {
+ error = xlate_lookup(backer, flow, &upcall->ofproto, &upcall->ipfix,
+ &upcall->sflow, NULL, &upcall->ofp_in_port);
+ if (error) {
+ return error;
+ }
+ } else {
+ struct ofproto_dpif *ofproto
+ = ofproto_dpif_lookup_by_uuid(&upcall->cookie.ofproto_uuid);
+ if (!ofproto) {
+ VLOG_INFO_RL(&rl, "upcall could not find ofproto");
+ return ENODEV;
+ }
+ upcall->ofproto = ofproto;
+ upcall->ipfix = ofproto->ipfix;
+ upcall->sflow = ofproto->sflow;
+ upcall->ofp_in_port = upcall->cookie.ofp_in_port;
}
upcall->recirc = NULL;
@@ -1123,7 +1137,7 @@ upcall_xlate(struct udpif *udpif, struct upcall *upcall,
xlate_in_init(&xin, upcall->ofproto,
ofproto_dpif_get_tables_version(upcall->ofproto),
- upcall->flow, upcall->in_port, NULL,
+ upcall->flow, upcall->ofp_in_port, NULL,
stats.tcp_flags, upcall->packet, wc, odp_actions);
if (upcall->type == MISS_UPCALL) {
@@ -1168,8 +1182,9 @@ upcall_xlate(struct udpif *udpif, struct upcall *upcall,
uint32_t cmid = upcall->ofproto->up.controller_meter_id;
/* upcall->put_actions already initialized by upcall_receive(). */
compose_slow_path(udpif, &upcall->xout, upcall->flow,
- upcall->flow->in_port.odp_port,
- &upcall->put_actions, smid, cmid);
+ upcall->flow->in_port.odp_port, upcall->ofp_in_port,
+ &upcall->put_actions, smid, cmid,
+ &upcall->ofproto->uuid);
}
/* This function is also called for slow-pathed flows. As we are only
@@ -2025,13 +2040,17 @@ revalidate_ukey__(struct udpif *udpif, const struct udpif_key *ukey,
if (xoutp->slow) {
struct ofproto_dpif *ofproto;
- ofproto = xlate_lookup_ofproto(udpif->backer, &ctx.flow, NULL);
+ ofp_port_t ofp_in_port;
+
+ ofproto = xlate_lookup_ofproto(udpif->backer, &ctx.flow,
+ &ofp_in_port);
uint32_t smid = ofproto ? ofproto->up.slowpath_meter_id : UINT32_MAX;
uint32_t cmid = ofproto ? ofproto->up.controller_meter_id : UINT32_MAX;
ofpbuf_clear(odp_actions);
compose_slow_path(udpif, xoutp, &ctx.flow, ctx.flow.in_port.odp_port,
- odp_actions, smid, cmid);
+ ofp_in_port, odp_actions, smid, cmid,
+ &ofproto->uuid);
}
if (odp_flow_key_to_mask(ukey->mask, ukey->mask_len, &dp_mask, &ctx.flow)
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 94bdac14a..625063a31 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2927,7 +2927,11 @@ compose_sflow_action(struct xlate_ctx *ctx)
return 0;
}
- struct user_action_cookie cookie = { .type = USER_ACTION_COOKIE_SFLOW };
+ struct user_action_cookie cookie = {
+ .type = USER_ACTION_COOKIE_SFLOW,
+ .ofp_in_port = ctx->xin->flow.in_port.ofp_port,
+ .ofproto_uuid = ctx->xbridge->ofproto->uuid
+ };
return compose_sample_action(ctx, dpif_sflow_get_probability(sflow),
&cookie, ODPP_NONE, true);
}
@@ -2969,7 +2973,9 @@ compose_ipfix_action(struct xlate_ctx *ctx, odp_port_t output_odp_port)
struct user_action_cookie cookie = {
.type = USER_ACTION_COOKIE_IPFIX,
- .ipfix.output_odp_port = output_odp_port,
+ .ofp_in_port = ctx->xin->flow.in_port.ofp_port,
+ .ofproto_uuid = ctx->xbridge->ofproto->uuid,
+ .ipfix.output_odp_port = output_odp_port
};
compose_sample_action(ctx,
dpif_ipfix_get_bridge_exporter_probability(ipfix),
@@ -2990,7 +2996,6 @@ fix_sflow_action(struct xlate_ctx *ctx, unsigned int user_cookie_offset)
cookie = ofpbuf_at(ctx->odp_actions, user_cookie_offset, sizeof *cookie);
ovs_assert(cookie->type == USER_ACTION_COOKIE_SFLOW);
- cookie->type = USER_ACTION_COOKIE_SFLOW;
cookie->sflow.vlan_tci = base->vlans[0].tci;
/* See http://www.sflow.org/sflow_version_5.txt (search for "Input/output
@@ -5270,6 +5275,8 @@ xlate_sample_action(struct xlate_ctx *ctx,
struct user_action_cookie cookie = {
.type = USER_ACTION_COOKIE_FLOW_SAMPLE,
+ .ofp_in_port = ctx->xin->flow.in_port.ofp_port,
+ .ofproto_uuid = ctx->xbridge->ofproto->uuid,
.flow_sample = {
.probability = os->probability,
.collector_set_id = os->collector_set_id,