X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Flinux%2Fcompat%2Finclude%2Flinux%2Fskbuff.h;h=de0c56ab9f86bf339981ef62b55757f8d09d331b;hb=4b0424809b823101c969a0691fc1db0c880ae64a;hp=311bfdbc60dc7a66bd6ce5d8881ffaf77bb63f18;hpb=ceb176fdb72bb7ce90debc66e1eeb1d25823d30a;p=sliver-openvswitch.git diff --git a/datapath/linux/compat/include/linux/skbuff.h b/datapath/linux/compat/include/linux/skbuff.h index 311bfdbc6..de0c56ab9 100644 --- a/datapath/linux/compat/include/linux/skbuff.h +++ b/datapath/linux/compat/include/linux/skbuff.h @@ -5,17 +5,6 @@ #include -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -/* In version 2.6.24 the return type of skb_headroom() changed from 'int' to - * 'unsigned int'. We use skb_headroom() as one arm of a min(a,b) invocation - * in make_writable() in actions.c, so we need the correct type. */ -#define skb_headroom rpl_skb_headroom -static inline unsigned int rpl_skb_headroom(const struct sk_buff *skb) -{ - return skb->data - skb->head; -} -#endif - #ifndef HAVE_SKB_COPY_FROM_LINEAR_DATA_OFFSET static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb, const int offset, void *to, @@ -34,6 +23,12 @@ static inline void skb_copy_to_linear_data_offset(struct sk_buff *skb, #endif /* !HAVE_SKB_COPY_FROM_LINEAR_DATA_OFFSET */ +#ifndef HAVE_SKB_RESET_TAIL_POINTER +static inline void skb_reset_tail_pointer(struct sk_buff *skb) +{ + skb->tail = skb->data; +} +#endif /* * The networking layer reserves some headroom in skb data (via * dev_alloc_skb). This is used to avoid having to reallocate skb data when @@ -76,13 +71,6 @@ static inline int skb_cow_head(struct sk_buff *skb, unsigned int headroom) } #endif /* !HAVE_SKB_COW_HEAD */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) -static inline int skb_clone_writable(struct sk_buff *skb, int len) -{ - return false; -} -#endif - #ifndef HAVE_SKB_DST_ACCESSOR_FUNCS static inline struct dst_entry *skb_dst(const struct sk_buff *skb) { @@ -100,18 +88,6 @@ static inline struct rtable *skb_rtable(const struct sk_buff *skb) } #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) -/* Emulate Linux 2.6.17 and later behavior, in which kfree_skb silently ignores - * null pointer arguments. */ -#define kfree_skb(skb) kfree_skb_maybe_null(skb) -static inline void kfree_skb_maybe_null(struct sk_buff *skb) -{ - if (likely(skb != NULL)) - (kfree_skb)(skb); -} -#endif - - #ifndef CHECKSUM_PARTIAL #define CHECKSUM_PARTIAL CHECKSUM_HW #endif @@ -119,12 +95,6 @@ static inline void kfree_skb_maybe_null(struct sk_buff *skb) #define CHECKSUM_COMPLETE CHECKSUM_HW #endif -#ifdef HAVE_MAC_RAW -#define mac_header mac.raw -#define network_header nh.raw -#define transport_header h.raw -#endif - #ifndef HAVE_SKBUFF_HEADER_HELPERS static inline unsigned char *skb_transport_header(const struct sk_buff *skb) { @@ -190,21 +160,6 @@ static inline void skb_copy_to_linear_data(struct sk_buff *skb, } #endif /* !HAVE_SKBUFF_HEADER_HELPERS */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) -#warning "TSO/UFO not supported on kernels earlier than 2.6.18" - -static inline int skb_is_gso(const struct sk_buff *skb) -{ - return 0; -} - -static inline struct sk_buff *skb_gso_segment(struct sk_buff *skb, - int features) -{ - return NULL; -} -#endif /* before 2.6.18 */ - #ifndef HAVE_SKB_WARN_LRO #ifndef NETIF_F_LRO static inline bool skb_warn_if_lro(const struct sk_buff *skb) @@ -232,17 +187,98 @@ static inline bool skb_warn_if_lro(const struct sk_buff *skb) #define consume_skb kfree_skb #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0) +#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 -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) +#ifndef HAVE_SKB_RESET_MAC_LEN static inline void skb_reset_mac_len(struct sk_buff *skb) { skb->mac_len = skb->network_header - skb->mac_header; } #endif + +#ifndef HAVE_SKB_UNCLONE +static inline int skb_unclone(struct sk_buff *skb, gfp_t pri) +{ + might_sleep_if(pri & __GFP_WAIT); + + if (skb_cloned(skb)) + return pskb_expand_head(skb, 0, 0, pri); + + return 0; +} +#endif + +#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 + +extern u32 __skb_get_rxhash(struct sk_buff *skb); +static inline __u32 skb_get_rxhash(struct sk_buff *skb) +{ +#ifdef HAVE_RXHASH + if (skb->rxhash) + return skb->rxhash; +#endif + return __skb_get_rxhash(skb); +} +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0) +unsigned int skb_zerocopy_headlen(const struct sk_buff *from); +void skb_zerocopy(struct sk_buff *to, const struct sk_buff *from, int len, + int hlen); +#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 + #endif