datapath: 16bit inner_network_header field in struct ovs_gso_cb
[cascardo/ovs.git] / datapath / linux / compat / gso.h
1 #ifndef __LINUX_GSO_WRAPPER_H
2 #define __LINUX_GSO_WRAPPER_H
3
4 #include <linux/version.h>
5 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)
6
7 #include <linux/skbuff.h>
8 #include <net/protocol.h>
9
10 #include "datapath.h"
11
12 struct ovs_gso_cb {
13         struct ovs_skb_cb dp_cb;
14         u16             inner_network_header;   /* Offset from
15                                                  * inner_mac_header */
16         /* 16bit hole */
17         sk_buff_data_t  inner_mac_header;       /* Offset from skb->head */
18         void (*fix_segment)(struct sk_buff *);
19 };
20 #define OVS_GSO_CB(skb) ((struct ovs_gso_cb *)(skb)->cb)
21
22 #define skb_inner_network_header rpl_skb_inner_network_header
23
24 #ifdef NET_SKBUFF_DATA_USES_OFFSET
25 #define skb_inner_mac_header rpl_skb_inner_mac_header
26 static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb)
27 {
28         return skb->head + OVS_GSO_CB(skb)->inner_mac_header;
29 }
30
31 #else
32
33 #define skb_inner_mac_header rpl_skb_inner_mac_header
34 static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb)
35 {
36         return OVS_GSO_CB(skb)->inner_mac_header;
37 }
38
39 #endif
40
41 #define skb_inner_network_header rpl_skb_inner_network_header
42 static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb)
43 {
44         return skb_inner_mac_header(skb) +
45                 OVS_GSO_CB(skb)->inner_network_header;
46 }
47
48 #define skb_inner_network_offset rpl_skb_inner_network_offset
49 static inline int skb_inner_network_offset(const struct sk_buff *skb)
50 {
51         return skb_inner_network_header(skb) - skb->data;
52 }
53
54 #define skb_inner_mac_offset rpl_skb_inner_mac_offset
55 static inline int skb_inner_mac_offset(const struct sk_buff *skb)
56 {
57         return skb_inner_mac_header(skb) - skb->data;
58 }
59
60 #define skb_reset_inner_headers rpl_skb_reset_inner_headers
61 static inline void skb_reset_inner_headers(struct sk_buff *skb)
62 {
63         BUILD_BUG_ON(sizeof(struct ovs_gso_cb) > FIELD_SIZEOF(struct sk_buff, cb));
64         OVS_GSO_CB(skb)->inner_network_header = skb->network_header -
65                 skb->mac_header;
66         OVS_GSO_CB(skb)->inner_mac_header = skb->mac_header;
67
68         OVS_GSO_CB(skb)->fix_segment = NULL;
69 }
70
71 #define ip_local_out rpl_ip_local_out
72 int ip_local_out(struct sk_buff *skb);
73
74 #endif /* 3.12 */
75 #endif