aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/skbuff.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r--include/linux/skbuff.h104
1 files changed, 86 insertions, 18 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index c45ad1263271..2e7405500626 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -179,6 +179,16 @@ enum {
179 SKB_GSO_TCPV6 = 1 << 4, 179 SKB_GSO_TCPV6 = 1 << 4,
180}; 180};
181 181
182#if BITS_PER_LONG > 32
183#define NET_SKBUFF_DATA_USES_OFFSET 1
184#endif
185
186#ifdef NET_SKBUFF_DATA_USES_OFFSET
187typedef unsigned int sk_buff_data_t;
188#else
189typedef unsigned char *sk_buff_data_t;
190#endif
191
182/** 192/**
183 * struct sk_buff - socket buffer 193 * struct sk_buff - socket buffer
184 * @next: Next buffer in list 194 * @next: Next buffer in list
@@ -236,9 +246,9 @@ struct sk_buff {
236 int iif; 246 int iif;
237 /* 4 byte hole on 64 bit*/ 247 /* 4 byte hole on 64 bit*/
238 248
239 unsigned char *transport_header; 249 sk_buff_data_t transport_header;
240 unsigned char *network_header; 250 sk_buff_data_t network_header;
241 unsigned char *mac_header; 251 sk_buff_data_t mac_header;
242 struct dst_entry *dst; 252 struct dst_entry *dst;
243 struct sec_path *sp; 253 struct sec_path *sp;
244 254
@@ -942,50 +952,92 @@ static inline void skb_reserve(struct sk_buff *skb, int len)
942 skb->tail += len; 952 skb->tail += len;
943} 953}
944 954
955#ifdef NET_SKBUFF_DATA_USES_OFFSET
945static inline unsigned char *skb_transport_header(const struct sk_buff *skb) 956static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
946{ 957{
947 return skb->transport_header; 958 return skb->head + skb->transport_header;
948} 959}
949 960
950static inline void skb_reset_transport_header(struct sk_buff *skb) 961static inline void skb_reset_transport_header(struct sk_buff *skb)
951{ 962{
952 skb->transport_header = skb->data; 963 skb->transport_header = skb->data - skb->head;
953} 964}
954 965
955static inline void skb_set_transport_header(struct sk_buff *skb, 966static inline void skb_set_transport_header(struct sk_buff *skb,
956 const int offset) 967 const int offset)
957{ 968{
958 skb->transport_header = skb->data + offset; 969 skb_reset_transport_header(skb);
959} 970 skb->transport_header += offset;
960
961static inline int skb_transport_offset(const struct sk_buff *skb)
962{
963 return skb->transport_header - skb->data;
964} 971}
965 972
966static inline unsigned char *skb_network_header(const struct sk_buff *skb) 973static inline unsigned char *skb_network_header(const struct sk_buff *skb)
967{ 974{
968 return skb->network_header; 975 return skb->head + skb->network_header;
969} 976}
970 977
971static inline void skb_reset_network_header(struct sk_buff *skb) 978static inline void skb_reset_network_header(struct sk_buff *skb)
972{ 979{
973 skb->network_header = skb->data; 980 skb->network_header = skb->data - skb->head;
974} 981}
975 982
976static inline void skb_set_network_header(struct sk_buff *skb, const int offset) 983static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
977{ 984{
978 skb->network_header = skb->data + offset; 985 skb_reset_network_header(skb);
986 skb->network_header += offset;
979} 987}
980 988
981static inline int skb_network_offset(const struct sk_buff *skb) 989static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
982{ 990{
983 return skb->network_header - skb->data; 991 return skb->head + skb->mac_header;
984} 992}
985 993
986static inline u32 skb_network_header_len(const struct sk_buff *skb) 994static inline int skb_mac_header_was_set(const struct sk_buff *skb)
987{ 995{
988 return skb->transport_header - skb->network_header; 996 return skb->mac_header != ~0U;
997}
998
999static inline void skb_reset_mac_header(struct sk_buff *skb)
1000{
1001 skb->mac_header = skb->data - skb->head;
1002}
1003
1004static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1005{
1006 skb_reset_mac_header(skb);
1007 skb->mac_header += offset;
1008}
1009
1010#else /* NET_SKBUFF_DATA_USES_OFFSET */
1011
1012static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1013{
1014 return skb->transport_header;
1015}
1016
1017static inline void skb_reset_transport_header(struct sk_buff *skb)
1018{
1019 skb->transport_header = skb->data;
1020}
1021
1022static inline void skb_set_transport_header(struct sk_buff *skb,
1023 const int offset)
1024{
1025 skb->transport_header = skb->data + offset;
1026}
1027
1028static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1029{
1030 return skb->network_header;
1031}
1032
1033static inline void skb_reset_network_header(struct sk_buff *skb)
1034{
1035 skb->network_header = skb->data;
1036}
1037
1038static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1039{
1040 skb->network_header = skb->data + offset;
989} 1041}
990 1042
991static inline unsigned char *skb_mac_header(const struct sk_buff *skb) 1043static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
@@ -1007,6 +1059,22 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1007{ 1059{
1008 skb->mac_header = skb->data + offset; 1060 skb->mac_header = skb->data + offset;
1009} 1061}
1062#endif /* NET_SKBUFF_DATA_USES_OFFSET */
1063
1064static inline int skb_transport_offset(const struct sk_buff *skb)
1065{
1066 return skb_transport_header(skb) - skb->data;
1067}
1068
1069static inline u32 skb_network_header_len(const struct sk_buff *skb)
1070{
1071 return skb->transport_header - skb->network_header;
1072}
1073
1074static inline int skb_network_offset(const struct sk_buff *skb)
1075{
1076 return skb_network_header(skb) - skb->data;
1077}
1010 1078
1011/* 1079/*
1012 * CPUs often take a performance hit when accessing unaligned memory 1080 * CPUs often take a performance hit when accessing unaligned memory