1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef _LINUX_SKBUFF_H
15#define _LINUX_SKBUFF_H
16
17#include <linux/kernel.h>
18#include <linux/compiler.h>
19#include <linux/time.h>
20#include <linux/cache.h>
21
22#include <asm/atomic.h>
23#include <asm/types.h>
24#include <linux/spinlock.h>
25#include <linux/net.h>
26#include <linux/textsearch.h>
27#include <net/checksum.h>
28#include <linux/rcupdate.h>
29#include <linux/dmaengine.h>
30#include <linux/hrtimer.h>
31
32
33#define CHECKSUM_NONE 0
34#define CHECKSUM_UNNECESSARY 1
35#define CHECKSUM_COMPLETE 2
36#define CHECKSUM_PARTIAL 3
37
38#define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \
39 ~(SMP_CACHE_BYTES - 1))
40#define SKB_WITH_OVERHEAD(X) \
41 ((X) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
42#define SKB_MAX_ORDER(X, ORDER) \
43 SKB_WITH_OVERHEAD((PAGE_SIZE << (ORDER)) - (X))
44#define SKB_MAX_HEAD(X) (SKB_MAX_ORDER((X), 0))
45#define SKB_MAX_ALLOC (SKB_MAX_ORDER(0, 2))
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93struct net_device;
94struct scatterlist;
95struct pipe_inode_info;
96
97#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
98struct nf_conntrack {
99 atomic_t use;
100};
101#endif
102
103#ifdef CONFIG_BRIDGE_NETFILTER
104struct nf_bridge_info {
105 atomic_t use;
106 struct net_device *physindev;
107 struct net_device *physoutdev;
108 unsigned int mask;
109 unsigned long data[32 / sizeof(unsigned long)];
110};
111#endif
112
113struct sk_buff_head {
114
115 struct sk_buff *next;
116 struct sk_buff *prev;
117
118 __u32 qlen;
119 spinlock_t lock;
120};
121
122struct sk_buff;
123
124
125#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)
126
127typedef struct skb_frag_struct skb_frag_t;
128
129struct skb_frag_struct {
130 struct page *page;
131 __u32 page_offset;
132 __u32 size;
133};
134
135#define HAVE_HW_TIME_STAMP
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160struct skb_shared_hwtstamps {
161 ktime_t hwtstamp;
162 ktime_t syststamp;
163};
164
165
166
167
168
169
170
171
172
173
174
175
176union skb_shared_tx {
177 struct {
178 __u8 hardware:1,
179 software:1,
180 in_progress:1;
181 };
182 __u8 flags;
183};
184
185
186
187
188struct skb_shared_info {
189 atomic_t dataref;
190 unsigned short nr_frags;
191 unsigned short gso_size;
192
193 unsigned short gso_segs;
194 unsigned short gso_type;
195 __be32 ip6_frag_id;
196 union skb_shared_tx tx_flags;
197#ifdef CONFIG_HAS_DMA
198 unsigned int num_dma_maps;
199#endif
200 struct sk_buff *frag_list;
201 struct skb_shared_hwtstamps hwtstamps;
202 skb_frag_t frags[MAX_SKB_FRAGS];
203#ifdef CONFIG_HAS_DMA
204 dma_addr_t dma_maps[MAX_SKB_FRAGS + 1];
205#endif
206};
207
208
209
210
211
212
213
214
215
216
217
218
219#define SKB_DATAREF_SHIFT 16
220#define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)
221
222
223enum {
224 SKB_FCLONE_UNAVAILABLE,
225 SKB_FCLONE_ORIG,
226 SKB_FCLONE_CLONE,
227};
228
229enum {
230 SKB_GSO_TCPV4 = 1 << 0,
231 SKB_GSO_UDP = 1 << 1,
232
233
234 SKB_GSO_DODGY = 1 << 2,
235
236
237 SKB_GSO_TCP_ECN = 1 << 3,
238
239 SKB_GSO_TCPV6 = 1 << 4,
240
241 SKB_GSO_FCOE = 1 << 5,
242};
243
244#if BITS_PER_LONG > 32
245#define NET_SKBUFF_DATA_USES_OFFSET 1
246#endif
247
248#ifdef NET_SKBUFF_DATA_USES_OFFSET
249typedef unsigned int sk_buff_data_t;
250#else
251typedef unsigned char *sk_buff_data_t;
252#endif
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313struct sk_buff {
314
315 struct sk_buff *next;
316 struct sk_buff *prev;
317
318 struct sock *sk;
319 ktime_t tstamp;
320 struct net_device *dev;
321
322 union {
323 struct dst_entry *dst;
324 struct rtable *rtable;
325 };
326#ifdef CONFIG_XFRM
327 struct sec_path *sp;
328#endif
329
330
331
332
333
334
335 char cb[48];
336
337 unsigned int len,
338 data_len;
339 __u16 mac_len,
340 hdr_len;
341 union {
342 __wsum csum;
343 struct {
344 __u16 csum_start;
345 __u16 csum_offset;
346 };
347 };
348 __u32 priority;
349 __u8 local_df:1,
350 cloned:1,
351 ip_summed:2,
352 nohdr:1,
353 nfctinfo:3;
354 __u8 pkt_type:3,
355 fclone:2,
356 ipvs_property:1,
357 peeked:1,
358 nf_trace:1;
359 __be16 protocol;
360
361 void (*destructor)(struct sk_buff *skb);
362#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
363 struct nf_conntrack *nfct;
364 struct sk_buff *nfct_reasm;
365#endif
366#ifdef CONFIG_BRIDGE_NETFILTER
367 struct nf_bridge_info *nf_bridge;
368#endif
369
370 int iif;
371 __u16 queue_mapping;
372#ifdef CONFIG_NET_SCHED
373 __u16 tc_index;
374#ifdef CONFIG_NET_CLS_ACT
375 __u16 tc_verd;
376#endif
377#endif
378#ifdef CONFIG_IPV6_NDISC_NODETYPE
379 __u8 ndisc_nodetype:2;
380#endif
381#if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE)
382 __u8 do_not_encrypt:1;
383 __u8 requeue:1;
384#endif
385
386
387#ifdef CONFIG_NET_DMA
388 dma_cookie_t dma_cookie;
389#endif
390#ifdef CONFIG_NETWORK_SECMARK
391 __u32 secmark;
392#endif
393
394 __u32 mark;
395
396 __u16 vlan_tci;
397
398 sk_buff_data_t transport_header;
399 sk_buff_data_t network_header;
400 sk_buff_data_t mac_header;
401
402 sk_buff_data_t tail;
403 sk_buff_data_t end;
404 unsigned char *head,
405 *data;
406 unsigned int truesize;
407 atomic_t users;
408};
409
410#ifdef __KERNEL__
411
412
413
414#include <linux/slab.h>
415
416#include <asm/system.h>
417
418#ifdef CONFIG_HAS_DMA
419#include <linux/dma-mapping.h>
420extern int skb_dma_map(struct device *dev, struct sk_buff *skb,
421 enum dma_data_direction dir);
422extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb,
423 enum dma_data_direction dir);
424#endif
425
426extern void kfree_skb(struct sk_buff *skb);
427extern void consume_skb(struct sk_buff *skb);
428extern void __kfree_skb(struct sk_buff *skb);
429extern struct sk_buff *__alloc_skb(unsigned int size,
430 gfp_t priority, int fclone, int node);
431static inline struct sk_buff *alloc_skb(unsigned int size,
432 gfp_t priority)
433{
434 return __alloc_skb(size, priority, 0, -1);
435}
436
437static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
438 gfp_t priority)
439{
440 return __alloc_skb(size, priority, 1, -1);
441}
442
443extern int skb_recycle_check(struct sk_buff *skb, int skb_size);
444
445extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
446extern struct sk_buff *skb_clone(struct sk_buff *skb,
447 gfp_t priority);
448extern struct sk_buff *skb_copy(const struct sk_buff *skb,
449 gfp_t priority);
450extern struct sk_buff *pskb_copy(struct sk_buff *skb,
451 gfp_t gfp_mask);
452extern int pskb_expand_head(struct sk_buff *skb,
453 int nhead, int ntail,
454 gfp_t gfp_mask);
455extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb,
456 unsigned int headroom);
457extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
458 int newheadroom, int newtailroom,
459 gfp_t priority);
460extern int skb_to_sgvec(struct sk_buff *skb,
461 struct scatterlist *sg, int offset,
462 int len);
463extern int skb_cow_data(struct sk_buff *skb, int tailbits,
464 struct sk_buff **trailer);
465extern int skb_pad(struct sk_buff *skb, int pad);
466#define dev_kfree_skb(a) consume_skb(a)
467#define dev_consume_skb(a) kfree_skb_clean(a)
468extern void skb_over_panic(struct sk_buff *skb, int len,
469 void *here);
470extern void skb_under_panic(struct sk_buff *skb, int len,
471 void *here);
472
473extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
474 int getfrag(void *from, char *to, int offset,
475 int len,int odd, struct sk_buff *skb),
476 void *from, int length);
477
478struct skb_seq_state
479{
480 __u32 lower_offset;
481 __u32 upper_offset;
482 __u32 frag_idx;
483 __u32 stepped_offset;
484 struct sk_buff *root_skb;
485 struct sk_buff *cur_skb;
486 __u8 *frag_data;
487};
488
489extern void skb_prepare_seq_read(struct sk_buff *skb,
490 unsigned int from, unsigned int to,
491 struct skb_seq_state *st);
492extern unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
493 struct skb_seq_state *st);
494extern void skb_abort_seq_read(struct skb_seq_state *st);
495
496extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
497 unsigned int to, struct ts_config *config,
498 struct ts_state *state);
499
500#ifdef NET_SKBUFF_DATA_USES_OFFSET
501static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
502{
503 return skb->head + skb->end;
504}
505#else
506static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
507{
508 return skb->end;
509}
510#endif
511
512
513#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))
514
515static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb)
516{
517 return &skb_shinfo(skb)->hwtstamps;
518}
519
520static inline union skb_shared_tx *skb_tx(struct sk_buff *skb)
521{
522 return &skb_shinfo(skb)->tx_flags;
523}
524
525
526
527
528
529
530
531static inline int skb_queue_empty(const struct sk_buff_head *list)
532{
533 return list->next == (struct sk_buff *)list;
534}
535
536
537
538
539
540
541
542
543static inline bool skb_queue_is_last(const struct sk_buff_head *list,
544 const struct sk_buff *skb)
545{
546 return (skb->next == (struct sk_buff *) list);
547}
548
549
550
551
552
553
554
555
556static inline bool skb_queue_is_first(const struct sk_buff_head *list,
557 const struct sk_buff *skb)
558{
559 return (skb->prev == (struct sk_buff *) list);
560}
561
562
563
564
565
566
567
568
569
570static inline struct sk_buff *skb_queue_next(const struct sk_buff_head *list,
571 const struct sk_buff *skb)
572{
573
574
575
576 BUG_ON(skb_queue_is_last(list, skb));
577 return skb->next;
578}
579
580
581
582
583
584
585
586
587
588static inline struct sk_buff *skb_queue_prev(const struct sk_buff_head *list,
589 const struct sk_buff *skb)
590{
591
592
593
594 BUG_ON(skb_queue_is_first(list, skb));
595 return skb->prev;
596}
597
598
599
600
601
602
603
604
605static inline struct sk_buff *skb_get(struct sk_buff *skb)
606{
607 atomic_inc(&skb->users);
608 return skb;
609}
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624static inline int skb_cloned(const struct sk_buff *skb)
625{
626 return skb->cloned &&
627 (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;
628}
629
630
631
632
633
634
635
636
637static inline int skb_header_cloned(const struct sk_buff *skb)
638{
639 int dataref;
640
641 if (!skb->cloned)
642 return 0;
643
644 dataref = atomic_read(&skb_shinfo(skb)->dataref);
645 dataref = (dataref & SKB_DATAREF_MASK) - (dataref >> SKB_DATAREF_SHIFT);
646 return dataref != 1;
647}
648
649
650
651
652
653
654
655
656
657static inline void skb_header_release(struct sk_buff *skb)
658{
659 BUG_ON(skb->nohdr);
660 skb->nohdr = 1;
661 atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
662}
663
664
665
666
667
668
669
670
671static inline int skb_shared(const struct sk_buff *skb)
672{
673 return atomic_read(&skb->users) != 1;
674}
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689static inline struct sk_buff *skb_share_check(struct sk_buff *skb,
690 gfp_t pri)
691{
692 might_sleep_if(pri & __GFP_WAIT);
693 if (skb_shared(skb)) {
694 struct sk_buff *nskb = skb_clone(skb, pri);
695 kfree_skb(skb);
696 skb = nskb;
697 }
698 return skb;
699}
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
722 gfp_t pri)
723{
724 might_sleep_if(pri & __GFP_WAIT);
725 if (skb_cloned(skb)) {
726 struct sk_buff *nskb = skb_copy(skb, pri);
727 kfree_skb(skb);
728 skb = nskb;
729 }
730 return skb;
731}
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)
747{
748 struct sk_buff *list = ((struct sk_buff *)list_)->next;
749 if (list == (struct sk_buff *)list_)
750 list = NULL;
751 return list;
752}
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767static inline struct sk_buff *skb_peek_tail(struct sk_buff_head *list_)
768{
769 struct sk_buff *list = ((struct sk_buff *)list_)->prev;
770 if (list == (struct sk_buff *)list_)
771 list = NULL;
772 return list;
773}
774
775
776
777
778
779
780
781static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
782{
783 return list_->qlen;
784}
785
786
787
788
789
790
791
792
793
794
795
796static inline void __skb_queue_head_init(struct sk_buff_head *list)
797{
798 list->prev = list->next = (struct sk_buff *)list;
799 list->qlen = 0;
800}
801
802
803
804
805
806
807
808
809
810static inline void skb_queue_head_init(struct sk_buff_head *list)
811{
812 spin_lock_init(&list->lock);
813 __skb_queue_head_init(list);
814}
815
816static inline void skb_queue_head_init_class(struct sk_buff_head *list,
817 struct lock_class_key *class)
818{
819 skb_queue_head_init(list);
820 lockdep_set_class(&list->lock, class);
821}
822
823
824
825
826
827
828
829extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
830static inline void __skb_insert(struct sk_buff *newsk,
831 struct sk_buff *prev, struct sk_buff *next,
832 struct sk_buff_head *list)
833{
834 newsk->next = next;
835 newsk->prev = prev;
836 next->prev = prev->next = newsk;
837 list->qlen++;
838}
839
840static inline void __skb_queue_splice(const struct sk_buff_head *list,
841 struct sk_buff *prev,
842 struct sk_buff *next)
843{
844 struct sk_buff *first = list->next;
845 struct sk_buff *last = list->prev;
846
847 first->prev = prev;
848 prev->next = first;
849
850 last->next = next;
851 next->prev = last;
852}
853
854
855
856
857
858
859static inline void skb_queue_splice(const struct sk_buff_head *list,
860 struct sk_buff_head *head)
861{
862 if (!skb_queue_empty(list)) {
863 __skb_queue_splice(list, (struct sk_buff *) head, head->next);
864 head->qlen += list->qlen;
865 }
866}
867
868
869
870
871
872
873
874
875static inline void skb_queue_splice_init(struct sk_buff_head *list,
876 struct sk_buff_head *head)
877{
878 if (!skb_queue_empty(list)) {
879 __skb_queue_splice(list, (struct sk_buff *) head, head->next);
880 head->qlen += list->qlen;
881 __skb_queue_head_init(list);
882 }
883}
884
885
886
887
888
889
890static inline void skb_queue_splice_tail(const struct sk_buff_head *list,
891 struct sk_buff_head *head)
892{
893 if (!skb_queue_empty(list)) {
894 __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
895 head->qlen += list->qlen;
896 }
897}
898
899
900
901
902
903
904
905
906
907static inline void skb_queue_splice_tail_init(struct sk_buff_head *list,
908 struct sk_buff_head *head)
909{
910 if (!skb_queue_empty(list)) {
911 __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
912 head->qlen += list->qlen;
913 __skb_queue_head_init(list);
914 }
915}
916
917
918
919
920
921
922
923
924
925
926
927
928static inline void __skb_queue_after(struct sk_buff_head *list,
929 struct sk_buff *prev,
930 struct sk_buff *newsk)
931{
932 __skb_insert(newsk, prev, prev->next, list);
933}
934
935extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
936 struct sk_buff_head *list);
937
938static inline void __skb_queue_before(struct sk_buff_head *list,
939 struct sk_buff *next,
940 struct sk_buff *newsk)
941{
942 __skb_insert(newsk, next->prev, next, list);
943}
944
945
946
947
948
949
950
951
952
953
954
955extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
956static inline void __skb_queue_head(struct sk_buff_head *list,
957 struct sk_buff *newsk)
958{
959 __skb_queue_after(list, (struct sk_buff *)list, newsk);
960}
961
962
963
964
965
966
967
968
969
970
971
972extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
973static inline void __skb_queue_tail(struct sk_buff_head *list,
974 struct sk_buff *newsk)
975{
976 __skb_queue_before(list, (struct sk_buff *)list, newsk);
977}
978
979
980
981
982
983extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
984static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
985{
986 struct sk_buff *next, *prev;
987
988 list->qlen--;
989 next = skb->next;
990 prev = skb->prev;
991 skb->next = skb->prev = NULL;
992 next->prev = prev;
993 prev->next = next;
994}
995
996
997
998
999
1000
1001
1002
1003
1004extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
1005static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
1006{
1007 struct sk_buff *skb = skb_peek(list);
1008 if (skb)
1009 __skb_unlink(skb, list);
1010 return skb;
1011}
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
1022static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
1023{
1024 struct sk_buff *skb = skb_peek_tail(list);
1025 if (skb)
1026 __skb_unlink(skb, list);
1027 return skb;
1028}
1029
1030
1031static inline int skb_is_nonlinear(const struct sk_buff *skb)
1032{
1033 return skb->data_len;
1034}
1035
1036static inline unsigned int skb_headlen(const struct sk_buff *skb)
1037{
1038 return skb->len - skb->data_len;
1039}
1040
1041static inline int skb_pagelen(const struct sk_buff *skb)
1042{
1043 int i, len = 0;
1044
1045 for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
1046 len += skb_shinfo(skb)->frags[i].size;
1047 return len + skb_headlen(skb);
1048}
1049
1050static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
1051 struct page *page, int off, int size)
1052{
1053 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1054
1055 frag->page = page;
1056 frag->page_offset = off;
1057 frag->size = size;
1058 skb_shinfo(skb)->nr_frags = i + 1;
1059}
1060
1061extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page,
1062 int off, int size);
1063
1064#define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags)
1065#define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list)
1066#define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb))
1067
1068#ifdef NET_SKBUFF_DATA_USES_OFFSET
1069static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
1070{
1071 return skb->head + skb->tail;
1072}
1073
1074static inline void skb_reset_tail_pointer(struct sk_buff *skb)
1075{
1076 skb->tail = skb->data - skb->head;
1077}
1078
1079static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
1080{
1081 skb_reset_tail_pointer(skb);
1082 skb->tail += offset;
1083}
1084#else
1085static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
1086{
1087 return skb->tail;
1088}
1089
1090static inline void skb_reset_tail_pointer(struct sk_buff *skb)
1091{
1092 skb->tail = skb->data;
1093}
1094
1095static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
1096{
1097 skb->tail = skb->data + offset;
1098}
1099
1100#endif
1101
1102
1103
1104
1105extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
1106static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
1107{
1108 unsigned char *tmp = skb_tail_pointer(skb);
1109 SKB_LINEAR_ASSERT(skb);
1110 skb->tail += len;
1111 skb->len += len;
1112 return tmp;
1113}
1114
1115extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
1116static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
1117{
1118 skb->data -= len;
1119 skb->len += len;
1120 return skb->data;
1121}
1122
1123extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
1124static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
1125{
1126 skb->len -= len;
1127 BUG_ON(skb->len < skb->data_len);
1128 return skb->data += len;
1129}
1130
1131extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
1132
1133static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
1134{
1135 if (len > skb_headlen(skb) &&
1136 !__pskb_pull_tail(skb, len - skb_headlen(skb)))
1137 return NULL;
1138 skb->len -= len;
1139 return skb->data += len;
1140}
1141
1142static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
1143{
1144 return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
1145}
1146
1147static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
1148{
1149 if (likely(len <= skb_headlen(skb)))
1150 return 1;
1151 if (unlikely(len > skb->len))
1152 return 0;
1153 return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
1154}
1155
1156
1157
1158
1159
1160
1161
1162static inline unsigned int skb_headroom(const struct sk_buff *skb)
1163{
1164 return skb->data - skb->head;
1165}
1166
1167
1168
1169
1170
1171
1172
1173static inline int skb_tailroom(const struct sk_buff *skb)
1174{
1175 return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
1176}
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186static inline void skb_reserve(struct sk_buff *skb, int len)
1187{
1188 skb->data += len;
1189 skb->tail += len;
1190}
1191
1192#ifdef NET_SKBUFF_DATA_USES_OFFSET
1193static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1194{
1195 return skb->head + skb->transport_header;
1196}
1197
1198static inline void skb_reset_transport_header(struct sk_buff *skb)
1199{
1200 skb->transport_header = skb->data - skb->head;
1201}
1202
1203static inline void skb_set_transport_header(struct sk_buff *skb,
1204 const int offset)
1205{
1206 skb_reset_transport_header(skb);
1207 skb->transport_header += offset;
1208}
1209
1210static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1211{
1212 return skb->head + skb->network_header;
1213}
1214
1215static inline void skb_reset_network_header(struct sk_buff *skb)
1216{
1217 skb->network_header = skb->data - skb->head;
1218}
1219
1220static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1221{
1222 skb_reset_network_header(skb);
1223 skb->network_header += offset;
1224}
1225
1226static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1227{
1228 return skb->head + skb->mac_header;
1229}
1230
1231static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1232{
1233 return skb->mac_header != ~0U;
1234}
1235
1236static inline void skb_reset_mac_header(struct sk_buff *skb)
1237{
1238 skb->mac_header = skb->data - skb->head;
1239}
1240
1241static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1242{
1243 skb_reset_mac_header(skb);
1244 skb->mac_header += offset;
1245}
1246
1247#else
1248
1249static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1250{
1251 return skb->transport_header;
1252}
1253
1254static inline void skb_reset_transport_header(struct sk_buff *skb)
1255{
1256 skb->transport_header = skb->data;
1257}
1258
1259static inline void skb_set_transport_header(struct sk_buff *skb,
1260 const int offset)
1261{
1262 skb->transport_header = skb->data + offset;
1263}
1264
1265static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1266{
1267 return skb->network_header;
1268}
1269
1270static inline void skb_reset_network_header(struct sk_buff *skb)
1271{
1272 skb->network_header = skb->data;
1273}
1274
1275static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1276{
1277 skb->network_header = skb->data + offset;
1278}
1279
1280static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1281{
1282 return skb->mac_header;
1283}
1284
1285static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1286{
1287 return skb->mac_header != NULL;
1288}
1289
1290static inline void skb_reset_mac_header(struct sk_buff *skb)
1291{
1292 skb->mac_header = skb->data;
1293}
1294
1295static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1296{
1297 skb->mac_header = skb->data + offset;
1298}
1299#endif
1300
1301static inline int skb_transport_offset(const struct sk_buff *skb)
1302{
1303 return skb_transport_header(skb) - skb->data;
1304}
1305
1306static inline u32 skb_network_header_len(const struct sk_buff *skb)
1307{
1308 return skb->transport_header - skb->network_header;
1309}
1310
1311static inline int skb_network_offset(const struct sk_buff *skb)
1312{
1313 return skb_network_header(skb) - skb->data;
1314}
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336#ifndef NET_IP_ALIGN
1337#define NET_IP_ALIGN 2
1338#endif
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355#ifndef NET_SKB_PAD
1356#define NET_SKB_PAD 32
1357#endif
1358
1359extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1360
1361static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
1362{
1363 if (unlikely(skb->data_len)) {
1364 WARN_ON(1);
1365 return;
1366 }
1367 skb->len = len;
1368 skb_set_tail_pointer(skb, len);
1369}
1370
1371extern void skb_trim(struct sk_buff *skb, unsigned int len);
1372
1373static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
1374{
1375 if (skb->data_len)
1376 return ___pskb_trim(skb, len);
1377 __skb_trim(skb, len);
1378 return 0;
1379}
1380
1381static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
1382{
1383 return (len < skb->len) ? __pskb_trim(skb, len) : 0;
1384}
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
1396{
1397 int err = pskb_trim(skb, len);
1398 BUG_ON(err);
1399}
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409static inline void skb_orphan(struct sk_buff *skb)
1410{
1411 if (skb->destructor)
1412 skb->destructor(skb);
1413 skb->destructor = NULL;
1414 skb->sk = NULL;
1415}
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425extern void skb_queue_purge(struct sk_buff_head *list);
1426static inline void __skb_queue_purge(struct sk_buff_head *list)
1427{
1428 struct sk_buff *skb;
1429 while ((skb = __skb_dequeue(list)) != NULL)
1430 kfree_skb(skb);
1431}
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
1446 gfp_t gfp_mask)
1447{
1448 struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
1449 if (likely(skb))
1450 skb_reserve(skb, NET_SKB_PAD);
1451 return skb;
1452}
1453
1454extern struct sk_buff *dev_alloc_skb(unsigned int length);
1455
1456extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
1457 unsigned int length, gfp_t gfp_mask);
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
1473 unsigned int length)
1474{
1475 return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
1476}
1477
1478extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask);
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488static inline struct page *netdev_alloc_page(struct net_device *dev)
1489{
1490 return __netdev_alloc_page(dev, GFP_ATOMIC);
1491}
1492
1493static inline void netdev_free_page(struct net_device *dev, struct page *page)
1494{
1495 __free_page(page);
1496}
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506static inline int skb_clone_writable(struct sk_buff *skb, unsigned int len)
1507{
1508 return !skb_header_cloned(skb) &&
1509 skb_headroom(skb) + len <= skb->hdr_len;
1510}
1511
1512static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
1513 int cloned)
1514{
1515 int delta = 0;
1516
1517 if (headroom < NET_SKB_PAD)
1518 headroom = NET_SKB_PAD;
1519 if (headroom > skb_headroom(skb))
1520 delta = headroom - skb_headroom(skb);
1521
1522 if (delta || cloned)
1523 return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
1524 GFP_ATOMIC);
1525 return 0;
1526}
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
1541{
1542 return __skb_cow(skb, headroom, skb_cloned(skb));
1543}
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555static inline int skb_cow_head(struct sk_buff *skb, unsigned int headroom)
1556{
1557 return __skb_cow(skb, headroom, skb_header_cloned(skb));
1558}
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571static inline int skb_padto(struct sk_buff *skb, unsigned int len)
1572{
1573 unsigned int size = skb->len;
1574 if (likely(size >= len))
1575 return 0;
1576 return skb_pad(skb, len - size);
1577}
1578
1579static inline int skb_add_data(struct sk_buff *skb,
1580 char __user *from, int copy)
1581{
1582 const int off = skb->len;
1583
1584 if (skb->ip_summed == CHECKSUM_NONE) {
1585 int err = 0;
1586 __wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
1587 copy, 0, &err);
1588 if (!err) {
1589 skb->csum = csum_block_add(skb->csum, csum, off);
1590 return 0;
1591 }
1592 } else if (!copy_from_user(skb_put(skb, copy), from, copy))
1593 return 0;
1594
1595 __skb_trim(skb, off);
1596 return -EFAULT;
1597}
1598
1599static inline int skb_can_coalesce(struct sk_buff *skb, int i,
1600 struct page *page, int off)
1601{
1602 if (i) {
1603 struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
1604
1605 return page == frag->page &&
1606 off == frag->page_offset + frag->size;
1607 }
1608 return 0;
1609}
1610
1611static inline int __skb_linearize(struct sk_buff *skb)
1612{
1613 return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
1614}
1615
1616
1617
1618
1619
1620
1621
1622
1623static inline int skb_linearize(struct sk_buff *skb)
1624{
1625 return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
1626}
1627
1628
1629
1630
1631
1632
1633
1634
1635static inline int skb_linearize_cow(struct sk_buff *skb)
1636{
1637 return skb_is_nonlinear(skb) || skb_cloned(skb) ?
1638 __skb_linearize(skb) : 0;
1639}
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652static inline void skb_postpull_rcsum(struct sk_buff *skb,
1653 const void *start, unsigned int len)
1654{
1655 if (skb->ip_summed == CHECKSUM_COMPLETE)
1656 skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
1657}
1658
1659unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1671{
1672 if (likely(len >= skb->len))
1673 return 0;
1674 if (skb->ip_summed == CHECKSUM_COMPLETE)
1675 skb->ip_summed = CHECKSUM_NONE;
1676 return __pskb_trim(skb, len);
1677}
1678
1679#define skb_queue_walk(queue, skb) \
1680 for (skb = (queue)->next; \
1681 prefetch(skb->next), (skb != (struct sk_buff *)(queue)); \
1682 skb = skb->next)
1683
1684#define skb_queue_walk_safe(queue, skb, tmp) \
1685 for (skb = (queue)->next, tmp = skb->next; \
1686 skb != (struct sk_buff *)(queue); \
1687 skb = tmp, tmp = skb->next)
1688
1689#define skb_queue_walk_from(queue, skb) \
1690 for (; prefetch(skb->next), (skb != (struct sk_buff *)(queue)); \
1691 skb = skb->next)
1692
1693#define skb_queue_walk_from_safe(queue, skb, tmp) \
1694 for (tmp = skb->next; \
1695 skb != (struct sk_buff *)(queue); \
1696 skb = tmp, tmp = skb->next)
1697
1698#define skb_queue_reverse_walk(queue, skb) \
1699 for (skb = (queue)->prev; \
1700 prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \
1701 skb = skb->prev)
1702
1703
1704extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
1705 int *peeked, int *err);
1706extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
1707 int noblock, int *err);
1708extern unsigned int datagram_poll(struct file *file, struct socket *sock,
1709 struct poll_table_struct *wait);
1710extern int skb_copy_datagram_iovec(const struct sk_buff *from,
1711 int offset, struct iovec *to,
1712 int size);
1713extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
1714 int hlen,
1715 struct iovec *iov);
1716extern int skb_copy_datagram_from_iovec(struct sk_buff *skb,
1717 int offset,
1718 struct iovec *from,
1719 int len);
1720extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
1721extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
1722 unsigned int flags);
1723extern __wsum skb_checksum(const struct sk_buff *skb, int offset,
1724 int len, __wsum csum);
1725extern int skb_copy_bits(const struct sk_buff *skb, int offset,
1726 void *to, int len);
1727extern int skb_store_bits(struct sk_buff *skb, int offset,
1728 const void *from, int len);
1729extern __wsum skb_copy_and_csum_bits(const struct sk_buff *skb,
1730 int offset, u8 *to, int len,
1731 __wsum csum);
1732extern int skb_splice_bits(struct sk_buff *skb,
1733 unsigned int offset,
1734 struct pipe_inode_info *pipe,
1735 unsigned int len,
1736 unsigned int flags);
1737extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
1738extern void skb_split(struct sk_buff *skb,
1739 struct sk_buff *skb1, const u32 len);
1740extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
1741 int shiftlen);
1742
1743extern struct sk_buff *skb_segment(struct sk_buff *skb, int features);
1744
1745static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
1746 int len, void *buffer)
1747{
1748 int hlen = skb_headlen(skb);
1749
1750 if (hlen - offset >= len)
1751 return skb->data + offset;
1752
1753 if (skb_copy_bits(skb, offset, buffer, len) < 0)
1754 return NULL;
1755
1756 return buffer;
1757}
1758
1759static inline void skb_copy_from_linear_data(const struct sk_buff *skb,
1760 void *to,
1761 const unsigned int len)
1762{
1763 memcpy(to, skb->data, len);
1764}
1765
1766static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb,
1767 const int offset, void *to,
1768 const unsigned int len)
1769{
1770 memcpy(to, skb->data + offset, len);
1771}
1772
1773static inline void skb_copy_to_linear_data(struct sk_buff *skb,
1774 const void *from,
1775 const unsigned int len)
1776{
1777 memcpy(skb->data, from, len);
1778}
1779
1780static inline void skb_copy_to_linear_data_offset(struct sk_buff *skb,
1781 const int offset,
1782 const void *from,
1783 const unsigned int len)
1784{
1785 memcpy(skb->data + offset, from, len);
1786}
1787
1788extern void skb_init(void);
1789
1790static inline ktime_t skb_get_ktime(const struct sk_buff *skb)
1791{
1792 return skb->tstamp;
1793}
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804static inline void skb_get_timestamp(const struct sk_buff *skb,
1805 struct timeval *stamp)
1806{
1807 *stamp = ktime_to_timeval(skb->tstamp);
1808}
1809
1810static inline void skb_get_timestampns(const struct sk_buff *skb,
1811 struct timespec *stamp)
1812{
1813 *stamp = ktime_to_timespec(skb->tstamp);
1814}
1815
1816static inline void __net_timestamp(struct sk_buff *skb)
1817{
1818 skb->tstamp = ktime_get_real();
1819}
1820
1821static inline ktime_t net_timedelta(ktime_t t)
1822{
1823 return ktime_sub(ktime_get_real(), t);
1824}
1825
1826static inline ktime_t net_invalid_timestamp(void)
1827{
1828 return ktime_set(0, 0);
1829}
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842extern void skb_tstamp_tx(struct sk_buff *orig_skb,
1843 struct skb_shared_hwtstamps *hwtstamps);
1844
1845extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
1846extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
1847
1848static inline int skb_csum_unnecessary(const struct sk_buff *skb)
1849{
1850 return skb->ip_summed & CHECKSUM_UNNECESSARY;
1851}
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869static inline __sum16 skb_checksum_complete(struct sk_buff *skb)
1870{
1871 return skb_csum_unnecessary(skb) ?
1872 0 : __skb_checksum_complete(skb);
1873}
1874
1875#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1876extern void nf_conntrack_destroy(struct nf_conntrack *nfct);
1877static inline void nf_conntrack_put(struct nf_conntrack *nfct)
1878{
1879 if (nfct && atomic_dec_and_test(&nfct->use))
1880 nf_conntrack_destroy(nfct);
1881}
1882static inline void nf_conntrack_get(struct nf_conntrack *nfct)
1883{
1884 if (nfct)
1885 atomic_inc(&nfct->use);
1886}
1887static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
1888{
1889 if (skb)
1890 atomic_inc(&skb->users);
1891}
1892static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
1893{
1894 if (skb)
1895 kfree_skb(skb);
1896}
1897#endif
1898#ifdef CONFIG_BRIDGE_NETFILTER
1899static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
1900{
1901 if (nf_bridge && atomic_dec_and_test(&nf_bridge->use))
1902 kfree(nf_bridge);
1903}
1904static inline void nf_bridge_get(struct nf_bridge_info *nf_bridge)
1905{
1906 if (nf_bridge)
1907 atomic_inc(&nf_bridge->use);
1908}
1909#endif
1910static inline void nf_reset(struct sk_buff *skb)
1911{
1912#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1913 nf_conntrack_put(skb->nfct);
1914 skb->nfct = NULL;
1915 nf_conntrack_put_reasm(skb->nfct_reasm);
1916 skb->nfct_reasm = NULL;
1917#endif
1918#ifdef CONFIG_BRIDGE_NETFILTER
1919 nf_bridge_put(skb->nf_bridge);
1920 skb->nf_bridge = NULL;
1921#endif
1922}
1923
1924
1925static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
1926{
1927#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1928 dst->nfct = src->nfct;
1929 nf_conntrack_get(src->nfct);
1930 dst->nfctinfo = src->nfctinfo;
1931 dst->nfct_reasm = src->nfct_reasm;
1932 nf_conntrack_get_reasm(src->nfct_reasm);
1933#endif
1934#ifdef CONFIG_BRIDGE_NETFILTER
1935 dst->nf_bridge = src->nf_bridge;
1936 nf_bridge_get(src->nf_bridge);
1937#endif
1938}
1939
1940static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
1941{
1942#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1943 nf_conntrack_put(dst->nfct);
1944 nf_conntrack_put_reasm(dst->nfct_reasm);
1945#endif
1946#ifdef CONFIG_BRIDGE_NETFILTER
1947 nf_bridge_put(dst->nf_bridge);
1948#endif
1949 __nf_copy(dst, src);
1950}
1951
1952#ifdef CONFIG_NETWORK_SECMARK
1953static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
1954{
1955 to->secmark = from->secmark;
1956}
1957
1958static inline void skb_init_secmark(struct sk_buff *skb)
1959{
1960 skb->secmark = 0;
1961}
1962#else
1963static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
1964{ }
1965
1966static inline void skb_init_secmark(struct sk_buff *skb)
1967{ }
1968#endif
1969
1970static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping)
1971{
1972 skb->queue_mapping = queue_mapping;
1973}
1974
1975static inline u16 skb_get_queue_mapping(const struct sk_buff *skb)
1976{
1977 return skb->queue_mapping;
1978}
1979
1980static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
1981{
1982 to->queue_mapping = from->queue_mapping;
1983}
1984
1985static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue)
1986{
1987 skb->queue_mapping = rx_queue + 1;
1988}
1989
1990static inline u16 skb_get_rx_queue(const struct sk_buff *skb)
1991{
1992 return skb->queue_mapping - 1;
1993}
1994
1995static inline bool skb_rx_queue_recorded(const struct sk_buff *skb)
1996{
1997 return (skb->queue_mapping != 0);
1998}
1999
2000extern u16 skb_tx_hash(const struct net_device *dev,
2001 const struct sk_buff *skb);
2002
2003#ifdef CONFIG_XFRM
2004static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
2005{
2006 return skb->sp;
2007}
2008#else
2009static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
2010{
2011 return NULL;
2012}
2013#endif
2014
2015static inline int skb_is_gso(const struct sk_buff *skb)
2016{
2017 return skb_shinfo(skb)->gso_size;
2018}
2019
2020static inline int skb_is_gso_v6(const struct sk_buff *skb)
2021{
2022 return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
2023}
2024
2025extern void __skb_warn_lro_forwarding(const struct sk_buff *skb);
2026
2027static inline bool skb_warn_if_lro(const struct sk_buff *skb)
2028{
2029
2030
2031 struct skb_shared_info *shinfo = skb_shinfo(skb);
2032 if (shinfo->gso_size != 0 && unlikely(shinfo->gso_type == 0)) {
2033 __skb_warn_lro_forwarding(skb);
2034 return true;
2035 }
2036 return false;
2037}
2038
2039static inline void skb_forward_csum(struct sk_buff *skb)
2040{
2041
2042 if (skb->ip_summed == CHECKSUM_COMPLETE)
2043 skb->ip_summed = CHECKSUM_NONE;
2044}
2045
2046bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
2047#endif
2048#endif
2049