An upcoming patch to odp-util will add a new user, but this seems like a
reasonable change in any case.
---
 lib/odp-util.c         |   22 ++++++++++++++++++++++
 lib/odp-util.h         |    3 +++
 ofproto/ofproto-dpif.c |    9 +--------
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/lib/odp-util.c b/lib/odp-util.c
index 9959662..89bee20 100644
--- a/lib/odp-util.c
+++ b/lib/odp-util.c
@@ -1227,3 +1227,25 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t 
key_len,
         NOT_REACHED();
     }
 }
+
+/* Appends an OVS_ACTION_ATTR_USERSPACE action to 'odp_actions' that specifies
+ * Netlink PID 'pid'.  If 'cookie' is nonnull, adds a userdata attribute whose
+ * contents contains 'cookie' and returns the offset within 'odp_actions' of
+ * the start of the cookie.  (If 'cookie' is null, then the return value is not
+ * meaningful.) */
+size_t
+odp_put_userspace_action(uint32_t pid, const struct user_action_cookie *cookie,
+                         struct ofpbuf *odp_actions)
+{
+    size_t offset;
+
+    offset = nl_msg_start_nested(odp_actions, OVS_ACTION_ATTR_USERSPACE);
+    nl_msg_put_u32(odp_actions, OVS_USERSPACE_ATTR_PID, pid);
+    if (cookie) {
+        nl_msg_put_unspec(odp_actions, OVS_USERSPACE_ATTR_USERDATA,
+                          cookie, sizeof *cookie);
+    }
+    nl_msg_end_nested(odp_actions, offset);
+
+    return cookie ? odp_actions->size - NLA_ALIGN(sizeof *cookie) : 0;
+}
diff --git a/lib/odp-util.h b/lib/odp-util.h
index 8c7d4d1..6525512 100644
--- a/lib/odp-util.h
+++ b/lib/odp-util.h
@@ -115,4 +115,7 @@ struct user_action_cookie {
 
 BUILD_ASSERT_DECL(sizeof(struct user_action_cookie) == 8);
 
+size_t odp_put_userspace_action(uint32_t pid,
+                                const struct user_action_cookie *,
+                                struct ofpbuf *odp_actions);
 #endif /* odp-util.h */
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 74407c9..4e55b43 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -3520,19 +3520,12 @@ put_userspace_action(const struct ofproto_dpif *ofproto,
                      const struct flow *flow,
                      const struct user_action_cookie *cookie)
 {
-    size_t offset;
     uint32_t pid;
 
     pid = dpif_port_get_pid(ofproto->dpif,
                             ofp_port_to_odp_port(flow->in_port));
 
-    offset = nl_msg_start_nested(odp_actions, OVS_ACTION_ATTR_USERSPACE);
-    nl_msg_put_u32(odp_actions, OVS_USERSPACE_ATTR_PID, pid);
-    nl_msg_put_unspec(odp_actions, OVS_USERSPACE_ATTR_USERDATA,
-                      cookie, sizeof *cookie);
-    nl_msg_end_nested(odp_actions, offset);
-
-    return odp_actions->size - NLA_ALIGN(sizeof *cookie);
+    return odp_put_userspace_action(pid, cookie, odp_actions);
 }
 
 /* Compose SAMPLE action for sFlow. */
-- 
1.7.2.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to