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