On Tue, Mar 31, 2015 at 11:02 AM, Pravin Shelar <pshe...@nicira.com> wrote: > On Tue, Mar 31, 2015 at 9:34 AM, Jesse Gross <je...@nicira.com> wrote: >> skb protocol offsets are relative to the beginning of the >> buffer and therefore must be updated if the buffer size is >> expanded. Kernel functions do this automatically for existing >> fields but obviously not for anything that we backport. This >> introduces a wrapper for pskb_expand_head() to update the >> inner protocol fields that we have backported. >> >> Without this, a kernel crash can be triggered with tunnel >> packets that do not have enough headroom and need to be >> segmented. >> > which pskb_expand head actually causes this issue for vxlan?
This is the result of skb_cow_head() in vxlan_xmit_skb(). >> diff --git a/datapath/linux/compat/gso.h b/datapath/linux/compat/gso.h >> index 337d13a..ba94eae 100644 >> --- a/datapath/linux/compat/gso.h >> +++ b/datapath/linux/compat/gso.h >> @@ -125,6 +125,27 @@ static inline void skb_reset_inner_headers(struct >> sk_buff *skb) >> skb_set_inner_network_header(skb, skb_network_offset(skb)); >> skb_set_inner_transport_header(skb, skb_transport_offset(skb)); >> } >> + >> +static inline int rpl_pskb_expand_head(struct sk_buff *skb, int nhead, >> + int ntail, gfp_t gfp_mask) >> +{ >> + int err; >> + >> + err = pskb_expand_head(skb, nhead, ntail, gfp_mask); >> + if (err) >> + return err; >> + >> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) >> + OVS_GSO_CB(skb)->inner_mac_header += nhead; >> +#endif >> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) >> + OVS_GSO_CB(skb)->inner_network_header += nhead; >> +#endif >> + > Can you add API for this to gso.h so that we can use existing kernel > version checks in gso.h. OK, I'll send a v2. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev