[net-next,v3] openvswitch: Add packet len info to upcall.

Subsystems: networking [general], openvswitch, the rest

2 messages, 2 authors, 2016-06-19 · open the first message on its own page

[net-next,v3] openvswitch: Add packet len info to upcall.

From: William Tu <hidden>
Date: 2016-06-17 19:53:05

The commit f2a4d086ed4c ("openvswitch: Add packet truncation support.")
introduces packet truncation before sending to userspace upcall receiver.
This patch passes up the skb->len before truncation so that the upcall
receiver knows the original packet size. Potentially this will be used
by sFlow, where OVS translates sFlow config header=N to a sample action,
truncating packet to N byte in kernel datapath. Thus, only N bytes instead
of full-packet size is copied from kernel to userspace, saving the
kernel-to-userspace bandwidth.

Signed-off-by: William Tu <redacted>
Cc: Pravin Shelar <redacted>
---
v2->v3:
- remove platform specific name.
- fix issue when receiving GSO packet
- remove skblen in struct dp_upcall_info
v1->v2:
- pass skb->len to userspace instead of cutlen
---
 include/uapi/linux/openvswitch.h |  2 ++
 net/openvswitch/datapath.c       | 11 ++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
index 8274675..d95a301 100644
--- a/include/uapi/linux/openvswitch.h
+++ b/include/uapi/linux/openvswitch.h
@@ -166,6 +166,7 @@ enum ovs_packet_cmd {
  * output port is actually a tunnel port. Contains the output tunnel key
  * extracted from the packet as nested %OVS_TUNNEL_KEY_ATTR_* attributes.
  * @OVS_PACKET_ATTR_MRU: Present for an %OVS_PACKET_CMD_ACTION and
+ * @OVS_PACKET_ATTR_LEN: Packet size before truncation.
  * %OVS_PACKET_ATTR_USERSPACE action specify the Maximum received fragment
  * size.
  *
@@ -185,6 +186,7 @@ enum ovs_packet_attr {
 	OVS_PACKET_ATTR_PROBE,      /* Packet operation is a feature probe,
 				       error logging should be suppressed. */
 	OVS_PACKET_ATTR_MRU,	    /* Maximum received IP fragment size. */
+	OVS_PACKET_ATTR_LEN,		/* Packet size before truncation. */
 	__OVS_PACKET_ATTR_MAX
 };
 
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index 6739342..623fc04 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -387,7 +387,8 @@ static size_t upcall_msg_size(const struct dp_upcall_info *upcall_info,
 {
 	size_t size = NLMSG_ALIGN(sizeof(struct ovs_header))
 		+ nla_total_size(hdrlen) /* OVS_PACKET_ATTR_PACKET */
-		+ nla_total_size(ovs_key_attr_size()); /* OVS_PACKET_ATTR_KEY */
+		+ nla_total_size(ovs_key_attr_size()) /* OVS_PACKET_ATTR_KEY */
+		+ nla_total_size(sizeof(unsigned int)); /* OVS_PACKET_ATTR_LEN */
 
 	/* OVS_PACKET_ATTR_USERDATA */
 	if (upcall_info->userdata)
@@ -514,6 +515,14 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
 		pad_packet(dp, user_skb);
 	}
 
+	/* Add OVS_PACKET_ATTR_LEN */
+	if (nla_put_u32(user_skb, OVS_PACKET_ATTR_LEN,
+			skb->len)) {
+		err = -ENOBUFS;
+		goto out;
+	}
+	pad_packet(dp, user_skb);
+
 	/* Only reserve room for attribute header, packet data is added
 	 * in skb_zerocopy() */
 	if (!(nla = nla_reserve(user_skb, OVS_PACKET_ATTR_PACKET, 0))) {
-- 
2.5.0

Re: [net-next,v3] openvswitch: Add packet len info to upcall.

From: pravin shelar <hidden>
Date: 2016-06-19 18:10:23

On Fri, Jun 17, 2016 at 12:52 PM, William Tu [off-list ref] wrote:
The commit f2a4d086ed4c ("openvswitch: Add packet truncation support.")
introduces packet truncation before sending to userspace upcall receiver.
This patch passes up the skb->len before truncation so that the upcall
receiver knows the original packet size. Potentially this will be used
by sFlow, where OVS translates sFlow config header=N to a sample action,
truncating packet to N byte in kernel datapath. Thus, only N bytes instead
of full-packet size is copied from kernel to userspace, saving the
kernel-to-userspace bandwidth.

Signed-off-by: William Tu <redacted>
Cc: Pravin Shelar <redacted>
---
v2->v3:
- remove platform specific name.
- fix issue when receiving GSO packet
- remove skblen in struct dp_upcall_info
v1->v2:
- pass skb->len to userspace instead of cutlen
---
 include/uapi/linux/openvswitch.h |  2 ++
 net/openvswitch/datapath.c       | 11 ++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)
Patch looks good, I just have one minor comment.
quoted hunk
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index 6739342..623fc04 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -387,7 +387,8 @@ static size_t upcall_msg_size(const struct dp_upcall_info *upcall_info,
 {
        size_t size = NLMSG_ALIGN(sizeof(struct ovs_header))
                + nla_total_size(hdrlen) /* OVS_PACKET_ATTR_PACKET */
-               + nla_total_size(ovs_key_attr_size()); /* OVS_PACKET_ATTR_KEY */
+               + nla_total_size(ovs_key_attr_size()) /* OVS_PACKET_ATTR_KEY */
+               + nla_total_size(sizeof(unsigned int)); /* OVS_PACKET_ATTR_LEN */

        /* OVS_PACKET_ATTR_USERDATA */
        if (upcall_info->userdata)
@@ -514,6 +515,14 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
                pad_packet(dp, user_skb);
        }

+       /* Add OVS_PACKET_ATTR_LEN */
+       if (nla_put_u32(user_skb, OVS_PACKET_ATTR_LEN,
+                       skb->len)) {
+               err = -ENOBUFS;
+               goto out;
+       }
+       pad_packet(dp, user_skb);
+
We should only send packet length in case of truncated packet. This
would avoid sending this extra attribute in miss flow handling case.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help