* [PATCH] net: tso: add support for IPv6
@ 2015-10-25 19:58 Emmanuel Grumbach
2015-10-25 20:02 ` [PATCH v2] " Emmanuel Grumbach
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Emmanuel Grumbach @ 2015-10-25 19:58 UTC (permalink / raw)
To: netdev; +Cc: linux-wireless, egrumbach, Emmanuel Grumbach
Adding IPv6 for the TSO helper API is trivial:
* Don't play with the id (which doesn't exist in IPv6)
* Correctly update the payload_len (don't include the
length of the IP header itself)
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
net/core/tso.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/net/core/tso.c b/net/core/tso.c
index 630b30b..ece4605 100644
--- a/net/core/tso.c
+++ b/net/core/tso.c
@@ -14,18 +14,25 @@ EXPORT_SYMBOL(tso_count_descs);
void tso_build_hdr(struct sk_buff *skb, char *hdr, struct tso_t *tso,
int size, bool is_last)
{
- struct iphdr *iph;
struct tcphdr *tcph;
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
int mac_hdr_len = skb_network_offset(skb);
memcpy(hdr, skb->data, hdr_len);
- iph = (struct iphdr *)(hdr + mac_hdr_len);
- iph->id = htons(tso->ip_id);
- iph->tot_len = htons(size + hdr_len - mac_hdr_len);
+ if (skb->protocol == htons(ETH_P_IP)) {
+ struct iphdr *iph = (void *)(hdr + mac_hdr_len);
+
+ iph->id = htons(tso->ip_id);
+ iph->tot_len = htons(size + hdr_len - mac_hdr_len);
+ tso->ip_id++;
+ }
+ if (skb->protocol == htons(ETH_P_IPV6)) {
+ struct ipv6hdr *iph = (void *)(hdr + mac_hdr_len);
+
+ iph->payload_len = htons(size + tcp_hdrlen(skb));
+ }
tcph = (struct tcphdr *)(hdr + skb_transport_offset(skb));
put_unaligned_be32(tso->tcp_seq, &tcph->seq);
- tso->ip_id++;
if (!is_last) {
/* Clear all special flags for not last packet */
--
2.1.4
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2] net: tso: add support for IPv6
2015-10-25 19:58 [PATCH] net: tso: add support for IPv6 Emmanuel Grumbach
@ 2015-10-25 20:02 ` Emmanuel Grumbach
[not found] ` <1445803371-19778-1-git-send-email-emmanuel.grumbach-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-10-25 22:34 ` [PATCH] " Sergei Shtylyov
2015-10-26 8:31 ` [PATCH v3] " Emmanuel Grumbach
2 siblings, 1 reply; 11+ messages in thread
From: Emmanuel Grumbach @ 2015-10-25 20:02 UTC (permalink / raw)
To: netdev; +Cc: linux-wireless, egrumbach, Emmanuel Grumbach
Adding IPv6 for the TSO helper API is trivial:
* Don't play with the id (which doesn't exist in IPv6)
* Correctly update the payload_len (don't include the
length of the IP header itself)
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
v2: add else if
NOTE: instead of checking the skb->protocol, I can add a bool
in tso_t. This might be better in terms of cache
handling. Let me know if you prefer that option
---
net/core/tso.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/net/core/tso.c b/net/core/tso.c
index 630b30b..bf71bdc5 100644
--- a/net/core/tso.c
+++ b/net/core/tso.c
@@ -14,18 +14,24 @@ EXPORT_SYMBOL(tso_count_descs);
void tso_build_hdr(struct sk_buff *skb, char *hdr, struct tso_t *tso,
int size, bool is_last)
{
- struct iphdr *iph;
struct tcphdr *tcph;
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
int mac_hdr_len = skb_network_offset(skb);
memcpy(hdr, skb->data, hdr_len);
- iph = (struct iphdr *)(hdr + mac_hdr_len);
- iph->id = htons(tso->ip_id);
- iph->tot_len = htons(size + hdr_len - mac_hdr_len);
+ if (skb->protocol == htons(ETH_P_IP)) {
+ struct iphdr *iph = (void *)(hdr + mac_hdr_len);
+
+ iph->id = htons(tso->ip_id);
+ iph->tot_len = htons(size + hdr_len - mac_hdr_len);
+ tso->ip_id++;
+ } else if (skb->protocol == htons(ETH_P_IPV6)) {
+ struct ipv6hdr *iph = (void *)(hdr + mac_hdr_len);
+
+ iph->payload_len = htons(size + tcp_hdrlen(skb));
+ }
tcph = (struct tcphdr *)(hdr + skb_transport_offset(skb));
put_unaligned_be32(tso->tcp_seq, &tcph->seq);
- tso->ip_id++;
if (!is_last) {
/* Clear all special flags for not last packet */
--
2.1.4
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH] net: tso: add support for IPv6
2015-10-25 19:58 [PATCH] net: tso: add support for IPv6 Emmanuel Grumbach
2015-10-25 20:02 ` [PATCH v2] " Emmanuel Grumbach
@ 2015-10-25 22:34 ` Sergei Shtylyov
2015-10-26 8:31 ` [PATCH v3] " Emmanuel Grumbach
2 siblings, 0 replies; 11+ messages in thread
From: Sergei Shtylyov @ 2015-10-25 22:34 UTC (permalink / raw)
To: Emmanuel Grumbach, netdev; +Cc: linux-wireless, egrumbach
Hello.
On 10/25/2015 10:58 PM, Emmanuel Grumbach wrote:
> Adding IPv6 for the TSO helper API is trivial:
> * Don't play with the id (which doesn't exist in IPv6)
> * Correctly update the payload_len (don't include the
> length of the IP header itself)
>
> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
> ---
> net/core/tso.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/net/core/tso.c b/net/core/tso.c
> index 630b30b..ece4605 100644
> --- a/net/core/tso.c
> +++ b/net/core/tso.c
> @@ -14,18 +14,25 @@ EXPORT_SYMBOL(tso_count_descs);
> void tso_build_hdr(struct sk_buff *skb, char *hdr, struct tso_t *tso,
> int size, bool is_last)
> {
> - struct iphdr *iph;
> struct tcphdr *tcph;
> int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
> int mac_hdr_len = skb_network_offset(skb);
>
> memcpy(hdr, skb->data, hdr_len);
> - iph = (struct iphdr *)(hdr + mac_hdr_len);
> - iph->id = htons(tso->ip_id);
> - iph->tot_len = htons(size + hdr_len - mac_hdr_len);
> + if (skb->protocol == htons(ETH_P_IP)) {
> + struct iphdr *iph = (void *)(hdr + mac_hdr_len);
> +
> + iph->id = htons(tso->ip_id);
> + iph->tot_len = htons(size + hdr_len - mac_hdr_len);
> + tso->ip_id++;
> + }
> + if (skb->protocol == htons(ETH_P_IPV6)) {
*else* needed.
> + struct ipv6hdr *iph = (void *)(hdr + mac_hdr_len);
> +
> + iph->payload_len = htons(size + tcp_hdrlen(skb));
> + }
The above asks to be a *switch* statement.
[...]
MBR, Sergei
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3] net: tso: add support for IPv6
2015-10-25 19:58 [PATCH] net: tso: add support for IPv6 Emmanuel Grumbach
2015-10-25 20:02 ` [PATCH v2] " Emmanuel Grumbach
2015-10-25 22:34 ` [PATCH] " Sergei Shtylyov
@ 2015-10-26 8:31 ` Emmanuel Grumbach
2015-10-26 14:56 ` Eric Dumazet
2015-10-27 5:24 ` David Miller
2 siblings, 2 replies; 11+ messages in thread
From: Emmanuel Grumbach @ 2015-10-26 8:31 UTC (permalink / raw)
To: netdev; +Cc: linux-wireless, egrumbach, Emmanuel Grumbach
Adding IPv6 for the TSO helper API is trivial:
* Don't play with the id (which doesn't exist in IPv6)
* Correctly update the payload_len (don't include the
length of the IP header itself)
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
v3: use vlan_get_protocol and call it once in tso_start
store the result in tso_t
---
include/net/tso.h | 1 +
net/core/tso.c | 18 +++++++++++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/include/net/tso.h b/include/net/tso.h
index 47e5444..b7be852 100644
--- a/include/net/tso.h
+++ b/include/net/tso.h
@@ -8,6 +8,7 @@ struct tso_t {
void *data;
size_t size;
u16 ip_id;
+ bool ipv6;
u32 tcp_seq;
};
diff --git a/net/core/tso.c b/net/core/tso.c
index 630b30b..5dca7ce 100644
--- a/net/core/tso.c
+++ b/net/core/tso.c
@@ -1,4 +1,5 @@
#include <linux/export.h>
+#include <linux/if_vlan.h>
#include <net/ip.h>
#include <net/tso.h>
#include <asm/unaligned.h>
@@ -14,18 +15,24 @@ EXPORT_SYMBOL(tso_count_descs);
void tso_build_hdr(struct sk_buff *skb, char *hdr, struct tso_t *tso,
int size, bool is_last)
{
- struct iphdr *iph;
struct tcphdr *tcph;
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
int mac_hdr_len = skb_network_offset(skb);
memcpy(hdr, skb->data, hdr_len);
- iph = (struct iphdr *)(hdr + mac_hdr_len);
- iph->id = htons(tso->ip_id);
- iph->tot_len = htons(size + hdr_len - mac_hdr_len);
+ if (!tso->ipv6) {
+ struct iphdr *iph = (void *)(hdr + mac_hdr_len);
+
+ iph->id = htons(tso->ip_id);
+ iph->tot_len = htons(size + hdr_len - mac_hdr_len);
+ tso->ip_id++;
+ } else {
+ struct ipv6hdr *iph = (void *)(hdr + mac_hdr_len);
+
+ iph->payload_len = htons(size + tcp_hdrlen(skb));
+ }
tcph = (struct tcphdr *)(hdr + skb_transport_offset(skb));
put_unaligned_be32(tso->tcp_seq, &tcph->seq);
- tso->ip_id++;
if (!is_last) {
/* Clear all special flags for not last packet */
@@ -61,6 +68,7 @@ void tso_start(struct sk_buff *skb, struct tso_t *tso)
tso->ip_id = ntohs(ip_hdr(skb)->id);
tso->tcp_seq = ntohl(tcp_hdr(skb)->seq);
tso->next_frag_idx = 0;
+ tso->ipv6 = vlan_get_protocol(skb) == htons(ETH_P_IPV6);
/* Build first data */
tso->size = skb_headlen(skb) - hdr_len;
--
2.1.4
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH v3] net: tso: add support for IPv6
2015-10-26 8:31 ` [PATCH v3] " Emmanuel Grumbach
@ 2015-10-26 14:56 ` Eric Dumazet
2015-10-27 5:24 ` David Miller
1 sibling, 0 replies; 11+ messages in thread
From: Eric Dumazet @ 2015-10-26 14:56 UTC (permalink / raw)
To: Emmanuel Grumbach; +Cc: netdev, linux-wireless, egrumbach
On Mon, 2015-10-26 at 10:31 +0200, Emmanuel Grumbach wrote:
> Adding IPv6 for the TSO helper API is trivial:
> * Don't play with the id (which doesn't exist in IPv6)
> * Correctly update the payload_len (don't include the
> length of the IP header itself)
>
> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
> ---
> v3: use vlan_get_protocol and call it once in tso_start
> store the result in tso_t
Acked-by: Eric Dumazet <edumazet@google.com>
Next step, adding encapsulation support ;)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] net: tso: add support for IPv6
2015-10-26 8:31 ` [PATCH v3] " Emmanuel Grumbach
2015-10-26 14:56 ` Eric Dumazet
@ 2015-10-27 5:24 ` David Miller
1 sibling, 0 replies; 11+ messages in thread
From: David Miller @ 2015-10-27 5:24 UTC (permalink / raw)
To: emmanuel.grumbach; +Cc: netdev, linux-wireless, egrumbach
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Date: Mon, 26 Oct 2015 10:31:29 +0200
> Adding IPv6 for the TSO helper API is trivial:
> * Don't play with the id (which doesn't exist in IPv6)
> * Correctly update the payload_len (don't include the
> length of the IP header itself)
>
> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Applied to net-next, thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-10-27 5:08 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-25 19:58 [PATCH] net: tso: add support for IPv6 Emmanuel Grumbach
2015-10-25 20:02 ` [PATCH v2] " Emmanuel Grumbach
[not found] ` <1445803371-19778-1-git-send-email-emmanuel.grumbach-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-10-26 4:03 ` Toshiaki Makita
2015-10-26 7:47 ` Grumbach, Emmanuel
2015-10-26 8:13 ` Toshiaki Makita
[not found] ` <562DE0A4.80100-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-10-26 8:17 ` Toshiaki Makita
2015-10-26 8:17 ` Grumbach, Emmanuel
2015-10-25 22:34 ` [PATCH] " Sergei Shtylyov
2015-10-26 8:31 ` [PATCH v3] " Emmanuel Grumbach
2015-10-26 14:56 ` Eric Dumazet
2015-10-27 5:24 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).