diff options
| -rw-r--r-- | include/linux/openvswitch.h | 11 | ||||
| -rw-r--r-- | net/openvswitch/datapath.c | 11 | ||||
| -rw-r--r-- | net/openvswitch/datapath.h | 2 | 
3 files changed, 13 insertions, 11 deletions
diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index 99e6414a40d..67d6c7b0358 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -127,7 +127,8 @@ enum ovs_packet_cmd {   * for %OVS_PACKET_CMD_EXECUTE.  It has nested %OVS_ACTION_ATTR_* attributes.   * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION   * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an - * %OVS_USERSPACE_ATTR_USERDATA attribute. + * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content + * specified there.   *   * These attributes follow the &struct ovs_header within the Generic Netlink   * payload for %OVS_PACKET_* commands. @@ -137,7 +138,7 @@ enum ovs_packet_attr {  	OVS_PACKET_ATTR_PACKET,      /* Packet data. */  	OVS_PACKET_ATTR_KEY,         /* Nested OVS_KEY_ATTR_* attributes. */  	OVS_PACKET_ATTR_ACTIONS,     /* Nested OVS_ACTION_ATTR_* attributes. */ -	OVS_PACKET_ATTR_USERDATA,    /* u64 OVS_ACTION_ATTR_USERSPACE arg. */ +	OVS_PACKET_ATTR_USERDATA,    /* OVS_ACTION_ATTR_USERSPACE arg. */  	__OVS_PACKET_ATTR_MAX  }; @@ -389,13 +390,13 @@ enum ovs_sample_attr {   * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action.   * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION   * message should be sent.  Required. - * @OVS_USERSPACE_ATTR_USERDATA: If present, its u64 argument is copied to the - * %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA, + * @OVS_USERSPACE_ATTR_USERDATA: If present, its variable-length argument is + * copied to the %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA.   */  enum ovs_userspace_attr {  	OVS_USERSPACE_ATTR_UNSPEC,  	OVS_USERSPACE_ATTR_PID,	      /* u32 Netlink PID to receive upcalls. */ -	OVS_USERSPACE_ATTR_USERDATA,  /* u64 optional user-specified cookie. */ +	OVS_USERSPACE_ATTR_USERDATA,  /* Optional user-specified cookie. */  	__OVS_USERSPACE_ATTR_MAX  }; diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index f9d2438e643..96cd5b243d5 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -370,8 +370,8 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex,  	len = sizeof(struct ovs_header);  	len += nla_total_size(skb->len);  	len += nla_total_size(FLOW_BUFSIZE); -	if (upcall_info->cmd == OVS_PACKET_CMD_ACTION) -		len += nla_total_size(8); +	if (upcall_info->userdata) +		len += NLA_ALIGN(upcall_info->userdata->nla_len);  	user_skb = genlmsg_new(len, GFP_ATOMIC);  	if (!user_skb) { @@ -388,8 +388,9 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex,  	nla_nest_end(user_skb, nla);  	if (upcall_info->userdata) -		nla_put_u64(user_skb, OVS_PACKET_ATTR_USERDATA, -			    nla_get_u64(upcall_info->userdata)); +		__nla_put(user_skb, OVS_PACKET_ATTR_USERDATA, +			  nla_len(upcall_info->userdata), +			  nla_data(upcall_info->userdata));  	nla = __nla_reserve(user_skb, OVS_PACKET_ATTR_PACKET, skb->len); @@ -544,7 +545,7 @@ static int validate_userspace(const struct nlattr *attr)  {  	static const struct nla_policy userspace_policy[OVS_USERSPACE_ATTR_MAX + 1] =	{  		[OVS_USERSPACE_ATTR_PID] = {.type = NLA_U32 }, -		[OVS_USERSPACE_ATTR_USERDATA] = {.type = NLA_U64 }, +		[OVS_USERSPACE_ATTR_USERDATA] = {.type = NLA_UNSPEC },  	};  	struct nlattr *a[OVS_USERSPACE_ATTR_MAX + 1];  	int error; diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h index 031dfbf37c9..9125ad5c5ae 100644 --- a/net/openvswitch/datapath.h +++ b/net/openvswitch/datapath.h @@ -119,7 +119,7 @@ struct ovs_skb_cb {   * struct dp_upcall - metadata to include with a packet to send to userspace   * @cmd: One of %OVS_PACKET_CMD_*.   * @key: Becomes %OVS_PACKET_ATTR_KEY.  Must be nonnull. - * @userdata: If nonnull, its u64 value is extracted and passed to userspace as + * @userdata: If nonnull, its variable-length value is passed to userspace as   * %OVS_PACKET_ATTR_USERDATA.   * @pid: Netlink PID to which packet should be sent.  If @pid is 0 then no   * packet is sent and the packet is accounted in the datapath's @n_lost  |