This simplifies the cookie handling a bit.

Signed-off-by: Justin Pettit <[email protected]>
---
v1->v2: New to the series.
---
 lib/odp-util.c                | 35 ++++++++------------------
 lib/odp-util.h                | 58 ++++++++++++++++++++++---------------------
 ofproto/ofproto-dpif-ipfix.c  |  2 +-
 ofproto/ofproto-dpif-ipfix.h  |  3 ++-
 ofproto/ofproto-dpif-sflow.c  | 14 +++++------
 ofproto/ofproto-dpif-sflow.h  |  8 +++---
 ofproto/ofproto-dpif-upcall.c | 53 +++++++++++++++++++--------------------
 ofproto/ofproto-dpif-xlate.c  | 50 ++++++++++++++++---------------------
 tests/odp.at                  |  2 --
 9 files changed, 103 insertions(+), 122 deletions(-)

diff --git a/lib/odp-util.c b/lib/odp-util.c
index ff08821595fd..2910e1514985 100644
--- a/lib/odp-util.c
+++ b/lib/odp-util.c
@@ -437,31 +437,25 @@ format_odp_userspace_action(struct ds *ds, const struct 
nlattr *attr,
         const uint8_t *userdata = nl_attr_get(userdata_attr);
         size_t userdata_len = nl_attr_get_size(userdata_attr);
         bool userdata_unspec = true;
-        union user_action_cookie cookie;
+        struct user_action_cookie cookie;
 
-        if (userdata_len >= sizeof cookie.type
-            && userdata_len <= sizeof cookie) {
-
-            memset(&cookie, 0, sizeof cookie);
-            memcpy(&cookie, userdata, userdata_len);
+        if (userdata_len == sizeof cookie) {
+            memcpy(&cookie, userdata, sizeof cookie);
 
             userdata_unspec = false;
 
-            if (userdata_len == sizeof cookie.sflow
-                && cookie.type == USER_ACTION_COOKIE_SFLOW) {
+            if (cookie.type == USER_ACTION_COOKIE_SFLOW) {
                 ds_put_format(ds, ",sFlow("
                               "vid=%"PRIu16",pcp=%d,output=%"PRIu32")",
                               vlan_tci_to_vid(cookie.sflow.vlan_tci),
                               vlan_tci_to_pcp(cookie.sflow.vlan_tci),
                               cookie.sflow.output);
-            } else if (userdata_len == sizeof cookie.slow_path
-                       && cookie.type == USER_ACTION_COOKIE_SLOW_PATH) {
+            } else if (cookie.type == USER_ACTION_COOKIE_SLOW_PATH) {
                 ds_put_cstr(ds, ",slow_path(");
                 format_flags(ds, slow_path_reason_to_string,
                              cookie.slow_path.reason, ',');
                 ds_put_format(ds, ")");
-            } else if (userdata_len == sizeof cookie.flow_sample
-                       && cookie.type == USER_ACTION_COOKIE_FLOW_SAMPLE) {
+            } else if (cookie.type == USER_ACTION_COOKIE_FLOW_SAMPLE) {
                 ds_put_format(ds, ",flow_sample(probability=%"PRIu16
                               ",collector_set_id=%"PRIu32
                               ",obs_domain_id=%"PRIu32
@@ -479,8 +473,7 @@ format_odp_userspace_action(struct ds *ds, const struct 
nlattr *attr,
                     ds_put_cstr(ds, ",egress");
                 }
                 ds_put_char(ds, ')');
-            } else if (userdata_len >= sizeof cookie.ipfix
-                       && cookie.type == USER_ACTION_COOKIE_IPFIX) {
+            } else if (cookie.type == USER_ACTION_COOKIE_IPFIX) {
                 ds_put_format(ds, ",ipfix(output_port=");
                 odp_portno_name_format(portno_names,
                                        cookie.ipfix.output_odp_port, ds);
@@ -1111,7 +1104,7 @@ static int
 parse_odp_userspace_action(const char *s, struct ofpbuf *actions)
 {
     uint32_t pid;
-    union user_action_cookie cookie;
+    struct user_action_cookie cookie;
     struct ofpbuf buf;
     odp_port_t tunnel_out_port;
     int n = -1;
@@ -1125,7 +1118,10 @@ parse_odp_userspace_action(const char *s, struct ofpbuf 
*actions)
     }
 
     ofpbuf_init(&buf, 16);
+    memset(&cookie, 0, sizeof cookie);
 
+    user_data = &cookie;
+    user_data_size = sizeof cookie;
     {
         uint32_t output;
         uint32_t probability;
@@ -1148,8 +1144,6 @@ parse_odp_userspace_action(const char *s, struct ofpbuf 
*actions)
             cookie.type = USER_ACTION_COOKIE_SFLOW;
             cookie.sflow.vlan_tci = htons(tci);
             cookie.sflow.output = output;
-            user_data = &cookie;
-            user_data_size = sizeof cookie.sflow;
         } else if (ovs_scan(&s[n], ",slow_path(%n",
                             &n1)) {
             n += n1;
@@ -1164,9 +1158,6 @@ parse_odp_userspace_action(const char *s, struct ofpbuf 
*actions)
                 goto out;
             }
             n += res + 1;
-
-            user_data = &cookie;
-            user_data_size = sizeof cookie.slow_path;
         } else if (ovs_scan(&s[n], ",flow_sample(probability=%"SCNi32","
                             "collector_set_id=%"SCNi32","
                             "obs_domain_id=%"SCNi32","
@@ -1183,8 +1174,6 @@ parse_odp_userspace_action(const char *s, struct ofpbuf 
*actions)
             cookie.flow_sample.obs_domain_id = obs_domain_id;
             cookie.flow_sample.obs_point_id = obs_point_id;
             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;
@@ -1205,8 +1194,6 @@ parse_odp_userspace_action(const char *s, struct ofpbuf 
*actions)
             n += n1;
             cookie.type = USER_ACTION_COOKIE_IPFIX;
             cookie.ipfix.output_odp_port = u32_to_odp(output);
-            user_data = &cookie;
-            user_data_size = sizeof cookie.ipfix;
         } else if (ovs_scan(&s[n], ",userdata(%n",
                             &n1)) {
             char *end;
diff --git a/lib/odp-util.h b/lib/odp-util.h
index f7ce206510fb..b08ff7190168 100644
--- a/lib/odp-util.h
+++ b/lib/odp-util.h
@@ -300,37 +300,39 @@ enum user_action_cookie_type {
 };
 
 /* user_action_cookie is passed as argument to OVS_ACTION_ATTR_USERSPACE. */
-union user_action_cookie {
+struct user_action_cookie {
     uint16_t type;              /* enum user_action_cookie_type. */
 
-    struct {
-        uint16_t type;          /* USER_ACTION_COOKIE_SFLOW. */
-        ovs_be16 vlan_tci;      /* Destination VLAN TCI. */
-        uint32_t output;        /* SFL_FLOW_SAMPLE_TYPE 'output' value. */
-    } sflow;
-
-    struct {
-        uint16_t type;          /* USER_ACTION_COOKIE_SLOW_PATH. */
-        uint16_t unused;
-        uint32_t reason;        /* enum slow_path_reason. */
-    } slow_path;
-
-    struct {
-        uint16_t type;          /* USER_ACTION_COOKIE_FLOW_SAMPLE. */
-        uint16_t probability;   /* Sampling probability. */
-        uint32_t collector_set_id; /* ID of IPFIX collector set. */
-        uint32_t obs_domain_id; /* Observation Domain ID. */
-        uint32_t obs_point_id;  /* Observation Point ID. */
-        odp_port_t output_odp_port; /* The output odp port. */
-        enum nx_action_sample_direction direction;
-    } flow_sample;
-
-    struct {
-        uint16_t   type;            /* USER_ACTION_COOKIE_IPFIX. */
-        odp_port_t output_odp_port; /* The output odp port. */
-    } ipfix;
+    union {
+        struct {
+            /* USER_ACTION_COOKIE_SFLOW. */
+            ovs_be16 vlan_tci;      /* Destination VLAN TCI. */
+            uint32_t output;        /* SFL_FLOW_SAMPLE_TYPE 'output' value. */
+        } sflow;
+
+        struct {
+            /* USER_ACTION_COOKIE_SLOW_PATH. */
+            uint16_t unused;
+            uint32_t reason;        /* enum slow_path_reason. */
+        } slow_path;
+
+        struct {
+            /* USER_ACTION_COOKIE_FLOW_SAMPLE. */
+            uint16_t probability;   /* Sampling probability. */
+            uint32_t collector_set_id; /* ID of IPFIX collector set. */
+            uint32_t obs_domain_id; /* Observation Domain ID. */
+            uint32_t obs_point_id;  /* Observation Point ID. */
+            odp_port_t output_odp_port; /* The output odp port. */
+            enum nx_action_sample_direction direction;
+        } flow_sample;
+
+        struct {
+            /* USER_ACTION_COOKIE_IPFIX. */
+            odp_port_t output_odp_port; /* The output odp port. */
+        } ipfix;
+    };
 };
-BUILD_ASSERT_DECL(sizeof(union user_action_cookie) == 24);
+BUILD_ASSERT_DECL(sizeof(struct user_action_cookie) == 28);
 
 size_t odp_put_userspace_action(uint32_t pid,
                                 const void *userdata, size_t userdata_size,
diff --git a/ofproto/ofproto-dpif-ipfix.c b/ofproto/ofproto-dpif-ipfix.c
index 2a4353720056..fb44fb98e4ed 100644
--- a/ofproto/ofproto-dpif-ipfix.c
+++ b/ofproto/ofproto-dpif-ipfix.c
@@ -2562,7 +2562,7 @@ dpif_ipfix_bridge_sample(struct dpif_ipfix *di, const 
struct dp_packet *packet,
 void
 dpif_ipfix_flow_sample(struct dpif_ipfix *di, const struct dp_packet *packet,
                        const struct flow *flow,
-                       const union user_action_cookie *cookie,
+                       const struct user_action_cookie *cookie,
                        odp_port_t input_odp_port,
                        const struct flow_tnl *output_tunnel_key,
                        const struct dpif_ipfix_actions *ipfix_actions)
diff --git a/ofproto/ofproto-dpif-ipfix.h b/ofproto/ofproto-dpif-ipfix.h
index f91d04181305..ad88ac5d5453 100644
--- a/ofproto/ofproto-dpif-ipfix.h
+++ b/ofproto/ofproto-dpif-ipfix.h
@@ -60,7 +60,8 @@ void dpif_ipfix_bridge_sample(struct dpif_ipfix *, const 
struct dp_packet *,
                               odp_port_t, odp_port_t, const struct flow_tnl *,
                               const struct dpif_ipfix_actions *);
 void dpif_ipfix_flow_sample(struct dpif_ipfix *, const struct dp_packet *,
-                            const struct flow *, const union 
user_action_cookie *,
+                            const struct flow *,
+                            const struct user_action_cookie *,
                             odp_port_t, const struct flow_tnl *,
                             const struct dpif_ipfix_actions *);
 
diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
index 2be586998cf0..e30a411f5a69 100644
--- a/ofproto/ofproto-dpif-sflow.c
+++ b/ofproto/ofproto-dpif-sflow.c
@@ -1233,7 +1233,7 @@ dpif_sflow_encode_mpls_stack(SFLLabelStack *stack,
  * See http://sflow.org/sflow_version_5.txt "Input/Output port information"
  */
 static uint32_t
-dpif_sflow_cookie_num_outputs(const union user_action_cookie *cookie)
+dpif_sflow_cookie_num_outputs(const struct user_action_cookie *cookie)
 {
     uint32_t format = cookie->sflow.output & 0xC0000000;
     uint32_t port_n = cookie->sflow.output & 0x3FFFFFFF;
@@ -1248,9 +1248,9 @@ dpif_sflow_cookie_num_outputs(const union 
user_action_cookie *cookie)
 
 void
 dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet,
-                   const struct flow *flow, odp_port_t odp_in_port,
-                   const union user_action_cookie *cookie,
-                   const struct dpif_sflow_actions *sflow_actions)
+                    const struct flow *flow, odp_port_t odp_in_port,
+                    const struct user_action_cookie *cookie,
+                    const struct dpif_sflow_actions *sflow_actions)
     OVS_EXCLUDED(mutex)
 {
     SFL_FLOW_SAMPLE_TYPE fs;
@@ -1283,9 +1283,9 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct 
dp_packet *packet,
         fs.input = SFL_DS_INDEX(in_dsp->dsi);
     }
 
-    /* Make the assumption that the random number generator in the datapath 
converges
-     * to the configured mean, and just increment the samplePool by the 
configured
-     * sampling rate every time. */
+    /* Make the assumption that the random number generator in the
+     * datapath converges to the configured mean, and just increment the
+     * samplePool by the configured sampling rate every time. */
     sampler->samplePool += sfl_sampler_get_sFlowFsPacketSamplingRate(sampler);
 
     /* Sampled header. */
diff --git a/ofproto/ofproto-dpif-sflow.h b/ofproto/ofproto-dpif-sflow.h
index 014e6cce39c0..74fe58007af0 100644
--- a/ofproto/ofproto-dpif-sflow.h
+++ b/ofproto/ofproto-dpif-sflow.h
@@ -70,13 +70,13 @@ 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 *);
+                             const struct nlattr *actions, size_t actions_len,
+                             struct dpif_sflow_actions *);
 
 void dpif_sflow_received(struct dpif_sflow *, const struct dp_packet *,
                          const struct flow *, odp_port_t odp_port,
-                         const union user_action_cookie *,
-                        const struct dpif_sflow_actions *);
+                         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);
diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index 02cf5415bc3d..ddae02dabb3f 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -971,9 +971,6 @@ udpif_revalidator(void *arg)
 static enum upcall_type
 classify_upcall(enum dpif_upcall_type type, const struct nlattr *userdata)
 {
-    union user_action_cookie cookie;
-    size_t userdata_len;
-
     /* First look at the upcall type. */
     switch (type) {
     case DPIF_UC_ACTION:
@@ -993,26 +990,22 @@ classify_upcall(enum dpif_upcall_type type, const struct 
nlattr *userdata)
         VLOG_WARN_RL(&rl, "action upcall missing cookie");
         return BAD_UPCALL;
     }
-    userdata_len = nl_attr_get_size(userdata);
-    if (userdata_len < sizeof cookie.type
-        || userdata_len > sizeof cookie) {
+
+    struct user_action_cookie cookie;
+    size_t userdata_len = nl_attr_get_size(userdata);
+    if (userdata_len != sizeof cookie) {
         VLOG_WARN_RL(&rl, "action upcall cookie has unexpected size %"PRIuSIZE,
                      userdata_len);
         return BAD_UPCALL;
     }
-    memset(&cookie, 0, sizeof cookie);
-    memcpy(&cookie, nl_attr_get(userdata), userdata_len);
-    if (userdata_len == MAX(8, sizeof cookie.sflow)
-        && cookie.type == USER_ACTION_COOKIE_SFLOW) {
+    memcpy(&cookie, nl_attr_get(userdata), sizeof cookie);
+    if (cookie.type == USER_ACTION_COOKIE_SFLOW) {
         return SFLOW_UPCALL;
-    } else if (userdata_len == MAX(8, sizeof cookie.slow_path)
-               && cookie.type == USER_ACTION_COOKIE_SLOW_PATH) {
+    } else if (cookie.type == USER_ACTION_COOKIE_SLOW_PATH) {
         return MISS_UPCALL;
-    } else if (userdata_len == MAX(8, sizeof cookie.flow_sample)
-               && cookie.type == USER_ACTION_COOKIE_FLOW_SAMPLE) {
+    } else if (cookie.type == USER_ACTION_COOKIE_FLOW_SAMPLE) {
         return FLOW_SAMPLE_UPCALL;
-    } else if (userdata_len == MAX(8, sizeof cookie.ipfix)
-               && cookie.type == USER_ACTION_COOKIE_IPFIX) {
+    } else if (cookie.type == USER_ACTION_COOKIE_IPFIX) {
         return IPFIX_UPCALL;
     } else {
         VLOG_WARN_RL(&rl, "invalid user cookie of type %"PRIu16
@@ -1029,7 +1022,7 @@ compose_slow_path(struct udpif *udpif, struct xlate_out 
*xout,
                   struct ofpbuf *buf, uint32_t slowpath_meter_id,
                   uint32_t controller_meter_id)
 {
-    union user_action_cookie cookie;
+    struct user_action_cookie cookie;
     odp_port_t port;
     uint32_t pid;
 
@@ -1056,7 +1049,7 @@ compose_slow_path(struct udpif *udpif, struct xlate_out 
*xout,
         nl_msg_put_u32(buf, OVS_ACTION_ATTR_METER, meter_id);
     }
 
-    odp_put_userspace_action(pid, &cookie, sizeof cookie.slow_path,
+    odp_put_userspace_action(pid, &cookie, sizeof cookie,
                              ODPP_NONE, false, buf);
 
     if (meter_id != UINT32_MAX) {
@@ -1349,12 +1342,14 @@ process_upcall(struct udpif *udpif, struct upcall 
*upcall,
 
     case SFLOW_UPCALL:
         if (upcall->sflow) {
-            union user_action_cookie cookie;
+            struct user_action_cookie cookie;
             struct dpif_sflow_actions sflow_actions;
 
+            if (nl_attr_get_size(userdata) != sizeof cookie) {
+                return EINVAL;
+            }
+            memcpy(&cookie, nl_attr_get(userdata), sizeof cookie);
             memset(&sflow_actions, 0, sizeof sflow_actions);
-            memset(&cookie, 0, sizeof cookie);
-            memcpy(&cookie, nl_attr_get(userdata), sizeof cookie.sflow);
 
             actions_len = dpif_read_actions(udpif, upcall, flow, upcall_type,
                                             &sflow_actions);
@@ -1366,12 +1361,14 @@ process_upcall(struct udpif *udpif, struct upcall 
*upcall,
 
     case IPFIX_UPCALL:
         if (upcall->ipfix) {
-            union user_action_cookie cookie;
+            struct user_action_cookie cookie;
             struct flow_tnl output_tunnel_key;
             struct dpif_ipfix_actions ipfix_actions;
 
-            memset(&cookie, 0, sizeof cookie);
-            memcpy(&cookie, nl_attr_get(userdata), sizeof cookie.ipfix);
+            if (nl_attr_get_size(userdata) != sizeof cookie) {
+                return EINVAL;
+            }
+            memcpy(&cookie, nl_attr_get(userdata), sizeof cookie);
             memset(&ipfix_actions, 0, sizeof ipfix_actions);
 
             if (upcall->out_tun_key) {
@@ -1391,12 +1388,14 @@ process_upcall(struct udpif *udpif, struct upcall 
*upcall,
 
     case FLOW_SAMPLE_UPCALL:
         if (upcall->ipfix) {
-            union user_action_cookie cookie;
+            struct user_action_cookie cookie;
             struct flow_tnl output_tunnel_key;
             struct dpif_ipfix_actions ipfix_actions;
 
-            memset(&cookie, 0, sizeof cookie);
-            memcpy(&cookie, nl_attr_get(userdata), sizeof cookie.flow_sample);
+            if (nl_attr_get_size(userdata) != sizeof cookie) {
+                return EINVAL;
+            }
+            memcpy(&cookie, nl_attr_get(userdata), sizeof cookie);
             memset(&ipfix_actions, 0, sizeof ipfix_actions);
 
             if (upcall->out_tun_key) {
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 9e05529d14a4..804b8b88681a 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2853,19 +2853,18 @@ xlate_normal(struct xlate_ctx *ctx)
 
 /* Appends a "sample" action for sFlow or IPFIX to 'ctx->odp_actions'.  The
  * 'probability' is the number of packets out of UINT32_MAX to sample.  The
- * 'cookie' (of length 'cookie_size' bytes) is passed back in the callback for
- * each sampled packet.  'tunnel_out_port', if not ODPP_NONE, is added as the
- * OVS_USERSPACE_ATTR_EGRESS_TUN_PORT attribute.  If 'include_actions', an
- * OVS_USERSPACE_ATTR_ACTIONS attribute is added.  If 'emit_set_tunnel',
- * sample(sampling_port=1) would translate into datapath sample action
- * set(tunnel(...)), sample(...) and it is used for sampling egress tunnel
- * information.
+ * 'cookie' is passed back in the callback for each sampled packet.
+ * 'tunnel_out_port', if not ODPP_NONE, is added as the
+ * OVS_USERSPACE_ATTR_EGRESS_TUN_PORT attribute.  If 'include_actions',
+ * an OVS_USERSPACE_ATTR_ACTIONS attribute is added.  If
+ * 'emit_set_tunnel', sample(sampling_port=1) would translate into
+ * datapath sample action set(tunnel(...)), sample(...) and it is used
+ * for sampling egress tunnel information.
  */
 static size_t
 compose_sample_action(struct xlate_ctx *ctx,
                       const uint32_t probability,
-                      const union user_action_cookie *cookie,
-                      const size_t cookie_size,
+                      const struct user_action_cookie *cookie,
                       const odp_port_t tunnel_out_port,
                       bool include_actions)
 {
@@ -2900,7 +2899,7 @@ compose_sample_action(struct xlate_ctx *ctx,
         ctx->xbridge, ctx->xin->flow.in_port.ofp_port);
     uint32_t pid = dpif_port_get_pid(ctx->xbridge->dpif, odp_port,
                                      flow_hash_5tuple(&ctx->xin->flow, 0));
-    int cookie_offset = odp_put_userspace_action(pid, cookie, cookie_size,
+    int cookie_offset = odp_put_userspace_action(pid, cookie, sizeof *cookie,
                                                  tunnel_out_port,
                                                  include_actions,
                                                  ctx->odp_actions);
@@ -2928,10 +2927,9 @@ compose_sflow_action(struct xlate_ctx *ctx)
         return 0;
     }
 
-    union user_action_cookie cookie = { .type = USER_ACTION_COOKIE_SFLOW };
+    struct user_action_cookie cookie = { .type = USER_ACTION_COOKIE_SFLOW };
     return compose_sample_action(ctx, dpif_sflow_get_probability(sflow),
-                                 &cookie, sizeof cookie.sflow, ODPP_NONE,
-                                 true);
+                                 &cookie, ODPP_NONE, true);
 }
 
 /* If flow IPFIX is enabled, make sure IPFIX flow sample action
@@ -2969,30 +2967,27 @@ compose_ipfix_action(struct xlate_ctx *ctx, odp_port_t 
output_odp_port)
         }
     }
 
-    union user_action_cookie cookie = {
-        .ipfix = {
-            .type = USER_ACTION_COOKIE_IPFIX,
-            .output_odp_port = output_odp_port,
-        }
+    struct user_action_cookie cookie = {
+        .type = USER_ACTION_COOKIE_IPFIX,
+        .ipfix.output_odp_port = output_odp_port,
     };
     compose_sample_action(ctx,
                           dpif_ipfix_get_bridge_exporter_probability(ipfix),
-                          &cookie, sizeof cookie.ipfix, tunnel_out_port,
-                          false);
+                          &cookie, tunnel_out_port, false);
 }
 
 /* Fix "sample" action according to data collected while composing ODP actions,
  * as described in compose_sflow_action().
  *
- * 'user_cookie_offset' must be the offset returned by add_sflow_action(). */
+ * 'user_cookie_offset' must be the offset returned by
+ * compose_sflow_action(). */
 static void
 fix_sflow_action(struct xlate_ctx *ctx, unsigned int user_cookie_offset)
 {
     const struct flow *base = &ctx->base_flow;
-    union user_action_cookie *cookie;
+    struct user_action_cookie *cookie;
 
-    cookie = ofpbuf_at(ctx->odp_actions, user_cookie_offset,
-                       sizeof cookie->sflow);
+    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;
@@ -5273,9 +5268,9 @@ xlate_sample_action(struct xlate_ctx *ctx,
         }
     }
 
-    union user_action_cookie cookie = {
+    struct user_action_cookie cookie = {
+        .type = USER_ACTION_COOKIE_FLOW_SAMPLE,
         .flow_sample = {
-            .type = USER_ACTION_COOKIE_FLOW_SAMPLE,
             .probability = os->probability,
             .collector_set_id = os->collector_set_id,
             .obs_domain_id = os->obs_domain_id,
@@ -5284,8 +5279,7 @@ xlate_sample_action(struct xlate_ctx *ctx,
             .direction = os->direction,
         }
     };
-    compose_sample_action(ctx, probability, &cookie, sizeof cookie.flow_sample,
-                          tunnel_out_port, false);
+    compose_sample_action(ctx, probability, &cookie, tunnel_out_port, false);
 }
 
 /* Determine if an datapath action translated from the openflow action
diff --git a/tests/odp.at b/tests/odp.at
index 1a80322890eb..4891653eb81a 100644
--- a/tests/odp.at
+++ b/tests/odp.at
@@ -246,8 +246,6 @@ AT_CLEANUP
 AT_SETUP([OVS datapath actions parsing and formatting - valid forms])
 AT_DATA([actions.txt], [dnl
 1,2,3
-userspace(pid=555666777)
-userspace(pid=555666777,tunnel_out_port=10)
 userspace(pid=6633,sFlow(vid=9,pcp=7,output=10),actions)
 userspace(pid=6633,sFlow(vid=9,pcp=7,output=10),actions,tunnel_out_port=10)
 userspace(pid=9765,slow_path(0))
-- 
2.7.4

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to