diff mbox series

[net-next] ip_gre: check packet length and mtu correctly in erspan_fb_xmit

Message ID 1507162445-18540-1-git-send-email-u9012063@gmail.com
State Changes Requested, archived
Delegated to: David Miller
Headers show
Series [net-next] ip_gre: check packet length and mtu correctly in erspan_fb_xmit | expand

Commit Message

William Tu Oct. 5, 2017, 12:14 a.m. UTC
Similarly to early patch for erspan_xmit(), the ARPHDR_ETHER device
is the length of the whole ether packet.  So skb->len should subtract
the dev->hard_header_len.

Fixes: 1a66a836da63 ("gre: add collect_md mode to ERSPAN tunnel")
Signed-off-by: William Tu <u9012063@gmail.com>
Cc: Xin Long <lucien.xin@gmail.com>
---
 net/ipv4/ip_gre.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

David Laight Oct. 5, 2017, 1:59 p.m. UTC | #1
From: William Tu
> Sent: 05 October 2017 01:14
> Similarly to early patch for erspan_xmit(), the ARPHDR_ETHER device
> is the length of the whole ether packet.  So skb->len should subtract
> the dev->hard_header_len.
> 
> Fixes: 1a66a836da63 ("gre: add collect_md mode to ERSPAN tunnel")
> Signed-off-by: William Tu <u9012063@gmail.com>
> Cc: Xin Long <lucien.xin@gmail.com>
> ---
>  net/ipv4/ip_gre.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
> index b279c325c7f6..10b21fe5b3a6 100644
> --- a/net/ipv4/ip_gre.c
> +++ b/net/ipv4/ip_gre.c
> @@ -579,7 +579,7 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev,
>  	if (gre_handle_offloads(skb, false))
>  		goto err_free_rt;
> 
> -	if (skb->len > dev->mtu) {
> +	if (skb->len - dev->hard_header_len > dev->mtu) {

Can you guarantee that skb->len > dev_hard_header_len?
It is probably safer to check skb->len > dev->hard_header_len + dev->mtu
since that addition isn't going to overflow.

>  		pskb_trim(skb, dev->mtu);
>  		truncate = true;

Is that pskb_trim() now truncating to the correct size?

	David
William Tu Oct. 5, 2017, 9:20 p.m. UTC | #2
On Thu, Oct 5, 2017 at 6:59 AM, David Laight <David.Laight@aculab.com> wrote:
> From: William Tu
>> Sent: 05 October 2017 01:14
>> Similarly to early patch for erspan_xmit(), the ARPHDR_ETHER device
>> is the length of the whole ether packet.  So skb->len should subtract
>> the dev->hard_header_len.
>>
>> Fixes: 1a66a836da63 ("gre: add collect_md mode to ERSPAN tunnel")
>> Signed-off-by: William Tu <u9012063@gmail.com>
>> Cc: Xin Long <lucien.xin@gmail.com>
>> ---
>>  net/ipv4/ip_gre.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
>> index b279c325c7f6..10b21fe5b3a6 100644
>> --- a/net/ipv4/ip_gre.c
>> +++ b/net/ipv4/ip_gre.c
>> @@ -579,7 +579,7 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev,
>>       if (gre_handle_offloads(skb, false))
>>               goto err_free_rt;
>>
>> -     if (skb->len > dev->mtu) {
>> +     if (skb->len - dev->hard_header_len > dev->mtu) {
>
> Can you guarantee that skb->len > dev_hard_header_len?
> It is probably safer to check skb->len > dev->hard_header_len + dev->mtu
> since that addition isn't going to overflow.
Sure, I will fix it.

>
>>               pskb_trim(skb, dev->mtu);
>>               truncate = true;
>
> Is that pskb_trim() now truncating to the correct size?

You're right, now I should truncate to (dev->mtu + dev_hard_header_len)
Thanks
William
David Laight Oct. 6, 2017, 9:38 a.m. UTC | #3
From: William Tu

> Sent: 05 October 2017 22:21

...
> >> -     if (skb->len > dev->mtu) {

> >> +     if (skb->len - dev->hard_header_len > dev->mtu) {

> >

> > Can you guarantee that skb->len > dev_hard_header_len?

> > It is probably safer to check skb->len > dev->hard_header_len + dev->mtu

> > since that addition isn't going to overflow.

> Sure, I will fix it.

> 

> >

> >>               pskb_trim(skb, dev->mtu);

> >>               truncate = true;

> >

> > Is that pskb_trim() now truncating to the correct size?

> 

> You're right, now I should truncate to (dev->mtu + dev_hard_header_len)


It might be worth caching that length in the dev structure
to avoid the arithmetic on every packet.

	David
William Tu Oct. 6, 2017, 10:09 p.m. UTC | #4
On Fri, Oct 6, 2017 at 2:38 AM, David Laight <David.Laight@aculab.com> wrote:
> From: William Tu
>> Sent: 05 October 2017 22:21
> ...
>> >> -     if (skb->len > dev->mtu) {
>> >> +     if (skb->len - dev->hard_header_len > dev->mtu) {
>> >
>> > Can you guarantee that skb->len > dev_hard_header_len?
>> > It is probably safer to check skb->len > dev->hard_header_len + dev->mtu
>> > since that addition isn't going to overflow.
>> Sure, I will fix it.
>>
>> >
>> >>               pskb_trim(skb, dev->mtu);
>> >>               truncate = true;
>> >
>> > Is that pskb_trim() now truncating to the correct size?
>>
>> You're right, now I should truncate to (dev->mtu + dev_hard_header_len)
>
> It might be worth caching that length in the dev structure
> to avoid the arithmetic on every packet.
>
>         David
>
Thanks for the advise.
Yes, adding another field in the struct net_device can avoid the
arithmetic operation. I'm not sure it's a good idea to add new field
since there are already a lot in net_device.  Let's wait to see how
others think.

William
David Miller Oct. 6, 2017, 10:22 p.m. UTC | #5
From: William Tu <u9012063@gmail.com>
Date: Fri, 6 Oct 2017 15:09:29 -0700

> Yes, adding another field in the struct net_device can avoid the
> arithmetic operation. I'm not sure it's a good idea to add new field
> since there are already a lot in net_device.  Let's wait to see how
> others think.

Why would you add it to net_device when you can add it to ip_tunnel?
William Tu Oct. 6, 2017, 10:51 p.m. UTC | #6
On Fri, Oct 6, 2017 at 3:22 PM, David Miller <davem@davemloft.net> wrote:
> From: William Tu <u9012063@gmail.com>
> Date: Fri, 6 Oct 2017 15:09:29 -0700
>
>> Yes, adding another field in the struct net_device can avoid the
>> arithmetic operation. I'm not sure it's a good idea to add new field
>> since there are already a lot in net_device.  Let's wait to see how
>> others think.
>
> Why would you add it to net_device when you can add it to ip_tunnel?
>
I see. I will add it to ip_tunnel and resubmit the patch. Thanks!
diff mbox series

Patch

diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index b279c325c7f6..10b21fe5b3a6 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -579,7 +579,7 @@  static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev,
 	if (gre_handle_offloads(skb, false))
 		goto err_free_rt;
 
-	if (skb->len > dev->mtu) {
+	if (skb->len - dev->hard_header_len > dev->mtu) {
 		pskb_trim(skb, dev->mtu);
 		truncate = true;
 	}