X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Flinux%2Fcompat%2Finclude%2Flinux%2Fskbuff.h;h=a9dc2e71205598d459bafd38afc4e2fe26879f71;hb=9bbf88b238c0f00b6fb2ae1403dfe6759301faee;hp=3af3ddc0b9b6c432e095c4042c5f954e53dddc25;hpb=1653f445b3cf25ce1278bd7451ee1f56e90c5928;p=sliver-openvswitch.git diff --git a/datapath/linux/compat/include/linux/skbuff.h b/datapath/linux/compat/include/linux/skbuff.h index 3af3ddc0b..a9dc2e712 100644 --- a/datapath/linux/compat/include/linux/skbuff.h +++ b/datapath/linux/compat/include/linux/skbuff.h @@ -188,10 +188,40 @@ static inline bool skb_warn_if_lro(const struct sk_buff *skb) #endif #ifndef HAVE_SKB_FRAG_PAGE +#include + static inline struct page *skb_frag_page(const skb_frag_t *frag) { return frag->page; } + +static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page) +{ + frag->page = page; +} +static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size) +{ + frag->size = size; +} +static inline void __skb_frag_ref(skb_frag_t *frag) +{ + get_page(skb_frag_page(frag)); +} +static inline void __skb_frag_unref(skb_frag_t *frag) +{ + put_page(skb_frag_page(frag)); +} + +static inline void skb_frag_ref(struct sk_buff *skb, int f) +{ + __skb_frag_ref(&skb_shinfo(skb)->frags[f]); +} + +static inline void skb_frag_unref(struct sk_buff *skb, int f) +{ + __skb_frag_unref(&skb_shinfo(skb)->frags[f]); +} + #endif #ifndef HAVE_SKB_RESET_MAC_LEN @@ -213,18 +243,71 @@ static inline int skb_unclone(struct sk_buff *skb, gfp_t pri) } #endif +#ifndef HAVE_SKB_ORPHAN_FRAGS +static inline int skb_orphan_frags(struct sk_buff *skb, gfp_t gfp_mask) +{ + return 0; +} +#endif + +#ifndef HAVE_SKB_GET_HASH #if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) -#define __skb_get_rxhash rpl__skb_get_rxhash -#define skb_get_rxhash rpl_skb_get_rxhash +#define __skb_get_hash rpl__skb_get_rxhash +#define skb_get_hash rpl_skb_get_rxhash -extern u32 __skb_get_rxhash(struct sk_buff *skb); -static inline __u32 skb_get_rxhash(struct sk_buff *skb) +extern u32 __skb_get_hash(struct sk_buff *skb); +static inline __u32 skb_get_hash(struct sk_buff *skb) { -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,34) +#ifdef HAVE_RXHASH if (skb->rxhash) return skb->rxhash; #endif - return __skb_get_rxhash(skb); + return __skb_get_hash(skb); +} + +#else +#define skb_get_hash skb_get_rxhash +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) */ +#endif /* HAVE_SKB_GET_HASH */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) +static inline void skb_tx_error(struct sk_buff *skb) +{ + return; +} +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0) +unsigned int skb_zerocopy_headlen(const struct sk_buff *from); +int skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len, + int hlen); +#endif + +#ifndef HAVE_SKB_CLEAR_HASH +static inline void skb_clear_hash(struct sk_buff *skb) +{ +#if HAVE_RXHASH + skb->rxhash = 0; +#endif +#if HAVE_L4_RXHASH + skb->l4_rxhash = 0; +#endif +} +#endif + +#ifndef HAVE_SKB_HAS_FRAG_LIST +#define skb_has_frag_list skb_has_frags +#endif + +#ifndef HAVE___SKB_FILL_PAGE_DESC +static inline void __skb_fill_page_desc(struct sk_buff *skb, int i, + struct page *page, int off, int size) +{ + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + + __skb_frag_set_page(frag, page); + frag->page_offset = off; + skb_frag_size_set(frag, size); } #endif