From: Eric Dumazet <hidden> Date: 2012-09-20 13:04:50
Try to pull 40 bytes : Thats OK for tcp performance, because 40 bytes
is the minimum size of IP+TCP headers
pskb_may_pull(skb, 40);
(instead of your skb_linearize(skb);)
On Thu, Sep 20, 2012 at 2:58 PM, Artem Bityutskiy
[off-list ref] wrote:
quoted hunk
On Thu, 2012-09-20 at 14:45 +0200, Eric Dumazet wrote:
quoted
I guess you only need to make sure 14 bytes of ethernet header are
available before eth_type_trans(skb, dev);
@@ -1797,6 +1797,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)/* deliver to local stack */skb->protocol=eth_type_trans(skb,dev);memset(skb->cb,0,sizeof(skb->cb));+skb_linearize(skb);netif_receive_skb(skb);}--
Best Regards,
Artem Bityutskiy
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
@@ -1798,9 +1798,13 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)if(skb){/* deliver to local stack */-skb->protocol=eth_type_trans(skb,dev);-memset(skb->cb,0,sizeof(skb->cb));-netif_receive_skb(skb);+if(pskb_may_pull(skb,40)){+skb->protocol=eth_type_trans(skb,dev);+memset(skb->cb,0,sizeof(skb->cb));+netif_receive_skb(skb);+}else{+kfree_skb(skb);+}}}
OK but you cant do that, or small frames will be dropped.
Anyway its a hack, we should find the buggy layer.
You could use dropwatch (drop_monitor) to check where frame is dropped.
modprobe drop_monitor
dropwatch -l kas
@@ -1798,9 +1798,13 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)if(skb){/* deliver to local stack */-skb->protocol=eth_type_trans(skb,dev);-memset(skb->cb,0,sizeof(skb->cb));-netif_receive_skb(skb);+if(pskb_may_pull(skb,40)){+skb->protocol=eth_type_trans(skb,dev);+memset(skb->cb,0,sizeof(skb->cb));+netif_receive_skb(skb);+}else{+kfree_skb(skb);+}}}
Please remove this hack and try the following bugfix in raw handler
icmp_filter() should not modify skb, or else its caller should not
assume ip_hdr() is unchanged.
net/ipv4/raw.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
@@ -128,25 +128,30 @@ found:}/*-*0-deliver-*1-block+*false-deliver+*true-block*/-static__inline__inticmp_filter(structsock*sk,structsk_buff*skb)+staticboolicmp_filter(structsock*sk,conststructsk_buff*skb){-inttype;--if(!pskb_may_pull(skb,sizeof(structicmphdr)))-return1;--type=icmp_hdr(skb)->type;-if(type<32){+__u8_type;+const__u8*type;++type=skb_header_pointer(skb,+skb_transport_offset(skb)++offsetof(structicmphdr,type),+sizeof(_type),+&_type);+if(!type)+returntrue;++if(*type<32){__u32data=raw_sk(sk)->filter.data;-return((1<<type)&data)!=0;+return((1U<<*type)&data)!=0;}/* Do not block unknown ICMP types */-return0;+returnfalse;}/* IP input processing comes here for RAW socket delivery.
Please remove this hack and try the following bugfix in raw handler
icmp_filter() should not modify skb, or else its caller should not
assume ip_hdr() is unchanged.
Right, good catch.
Please submit this fix formally Eric, thanks a lot.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html