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/kmemcheck.h>
19#include <linux/compiler.h>
20#include <linux/time.h>
21#include <linux/bug.h>
22#include <linux/cache.h>
23
24#include <linux/atomic.h>
25#include <asm/types.h>
26#include <linux/spinlock.h>
27#include <linux/net.h>
28#include <linux/textsearch.h>
29#include <net/checksum.h>
30#include <linux/rcupdate.h>
31#include <linux/dmaengine.h>
32#include <linux/hrtimer.h>
33#include <linux/dma-mapping.h>
34#include <linux/netdev_features.h>
35
36
37#define CHECKSUM_NONE 0
38#define CHECKSUM_UNNECESSARY 1
39#define CHECKSUM_COMPLETE 2
40#define CHECKSUM_PARTIAL 3
41
42#define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \
43 ~(SMP_CACHE_BYTES - 1))
44#define SKB_WITH_OVERHEAD(X) \
45 ((X) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
46#define SKB_MAX_ORDER(X, ORDER) \
47 SKB_WITH_OVERHEAD((PAGE_SIZE << (ORDER)) - (X))
48#define SKB_MAX_HEAD(X) (SKB_MAX_ORDER((X), 0))
49#define SKB_MAX_ALLOC (SKB_MAX_ORDER(0, 2))
50
51
52#define SKB_TRUESIZE(X) ((X) + \
53 SKB_DATA_ALIGN(sizeof(struct sk_buff)) + \
54 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108struct net_device;
109struct scatterlist;
110struct pipe_inode_info;
111
112#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
113struct nf_conntrack {
114 atomic_t use;
115};
116#endif
117
118#ifdef CONFIG_BRIDGE_NETFILTER
119struct nf_bridge_info {
120 atomic_t use;
121 unsigned int mask;
122 struct net_device *physindev;
123 struct net_device *physoutdev;
124 unsigned long data[32 / sizeof(unsigned long)];
125};
126#endif
127
128struct sk_buff_head {
129
130 struct sk_buff *next;
131 struct sk_buff *prev;
132
133 __u32 qlen;
134 spinlock_t lock;
135};
136
137struct sk_buff;
138
139
140
141
142
143
144
145
146#if (65536/PAGE_SIZE + 1) < 16
147#define MAX_SKB_FRAGS 16UL
148#else
149#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1)
150#endif
151
152typedef struct skb_frag_struct skb_frag_t;
153
154struct skb_frag_struct {
155 struct {
156 struct page *p;
157 } page;
158#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
159 __u32 page_offset;
160 __u32 size;
161#else
162 __u16 page_offset;
163 __u16 size;
164#endif
165};
166
167static inline unsigned int skb_frag_size(const skb_frag_t *frag)
168{
169 return frag->size;
170}
171
172static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
173{
174 frag->size = size;
175}
176
177static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
178{
179 frag->size += delta;
180}
181
182static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
183{
184 frag->size -= delta;
185}
186
187#define HAVE_HW_TIME_STAMP
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212struct skb_shared_hwtstamps {
213 ktime_t hwtstamp;
214 ktime_t syststamp;
215};
216
217
218enum {
219
220 SKBTX_HW_TSTAMP = 1 << 0,
221
222
223 SKBTX_SW_TSTAMP = 1 << 1,
224
225
226 SKBTX_IN_PROGRESS = 1 << 2,
227
228
229 SKBTX_DEV_ZEROCOPY = 1 << 3,
230
231
232 SKBTX_WIFI_STATUS = 1 << 4,
233};
234
235
236
237
238
239
240
241struct ubuf_info {
242 void (*callback)(struct ubuf_info *);
243 void *ctx;
244 unsigned long desc;
245};
246
247
248
249
250struct skb_shared_info {
251 unsigned char nr_frags;
252 __u8 tx_flags;
253 unsigned short gso_size;
254
255 unsigned short gso_segs;
256 unsigned short gso_type;
257 struct sk_buff *frag_list;
258 struct skb_shared_hwtstamps hwtstamps;
259 __be32 ip6_frag_id;
260
261
262
263
264 atomic_t dataref;
265
266
267
268 void * destructor_arg;
269
270
271 skb_frag_t frags[MAX_SKB_FRAGS];
272};
273
274
275
276
277
278
279
280
281
282
283
284
285#define SKB_DATAREF_SHIFT 16
286#define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)
287
288
289enum {
290 SKB_FCLONE_UNAVAILABLE,
291 SKB_FCLONE_ORIG,
292 SKB_FCLONE_CLONE,
293};
294
295enum {
296 SKB_GSO_TCPV4 = 1 << 0,
297 SKB_GSO_UDP = 1 << 1,
298
299
300 SKB_GSO_DODGY = 1 << 2,
301
302
303 SKB_GSO_TCP_ECN = 1 << 3,
304
305 SKB_GSO_TCPV6 = 1 << 4,
306
307 SKB_GSO_FCOE = 1 << 5,
308};
309
310#if BITS_PER_LONG > 32
311#define NET_SKBUFF_DATA_USES_OFFSET 1
312#endif
313
314#ifdef NET_SKBUFF_DATA_USES_OFFSET
315typedef unsigned int sk_buff_data_t;
316#else
317typedef unsigned char *sk_buff_data_t;
318#endif
319
320#if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \
321 defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE)
322#define NET_SKBUFF_NF_DEFRAG_NEEDED 1
323#endif
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388struct sk_buff {
389
390 struct sk_buff *next;
391 struct sk_buff *prev;
392
393 ktime_t tstamp;
394
395 struct sock *sk;
396 struct net_device *dev;
397
398
399
400
401
402
403
404 char cb[48] __aligned(8);
405
406 unsigned long _skb_refdst;
407#ifdef CONFIG_XFRM
408 struct sec_path *sp;
409#endif
410 unsigned int len,
411 data_len;
412 __u16 mac_len,
413 hdr_len;
414 union {
415 __wsum csum;
416 struct {
417 __u16 csum_start;
418 __u16 csum_offset;
419 };
420 };
421 __u32 priority;
422 kmemcheck_bitfield_begin(flags1);
423 __u8 local_df:1,
424 cloned:1,
425 ip_summed:2,
426 nohdr:1,
427 nfctinfo:3;
428 __u8 pkt_type:3,
429 fclone:2,
430 ipvs_property:1,
431 peeked:1,
432 nf_trace:1;
433 kmemcheck_bitfield_end(flags1);
434 __be16 protocol;
435
436 void (*destructor)(struct sk_buff *skb);
437#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
438 struct nf_conntrack *nfct;
439#endif
440#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
441 struct sk_buff *nfct_reasm;
442#endif
443#ifdef CONFIG_BRIDGE_NETFILTER
444 struct nf_bridge_info *nf_bridge;
445#endif
446
447 int skb_iif;
448
449 __u32 rxhash;
450
451 __u16 vlan_tci;
452
453#ifdef CONFIG_NET_SCHED
454 __u16 tc_index;
455#ifdef CONFIG_NET_CLS_ACT
456 __u16 tc_verd;
457#endif
458#endif
459
460 __u16 queue_mapping;
461 kmemcheck_bitfield_begin(flags2);
462#ifdef CONFIG_IPV6_NDISC_NODETYPE
463 __u8 ndisc_nodetype:2;
464#endif
465 __u8 pfmemalloc:1;
466 __u8 ooo_okay:1;
467 __u8 l4_rxhash:1;
468 __u8 wifi_acked_valid:1;
469 __u8 wifi_acked:1;
470 __u8 no_fcs:1;
471 __u8 head_frag:1;
472
473 kmemcheck_bitfield_end(flags2);
474
475#ifdef CONFIG_NET_DMA
476 dma_cookie_t dma_cookie;
477#endif
478#ifdef CONFIG_NETWORK_SECMARK
479 __u32 secmark;
480#endif
481 union {
482 __u32 mark;
483 __u32 dropcount;
484 __u32 avail_size;
485 };
486
487 sk_buff_data_t transport_header;
488 sk_buff_data_t network_header;
489 sk_buff_data_t mac_header;
490
491 sk_buff_data_t tail;
492 sk_buff_data_t end;
493 unsigned char *head,
494 *data;
495 unsigned int truesize;
496 atomic_t users;
497};
498
499#ifdef __KERNEL__
500
501
502
503#include <linux/slab.h>
504
505
506#define SKB_ALLOC_FCLONE 0x01
507#define SKB_ALLOC_RX 0x02
508
509
510static inline bool skb_pfmemalloc(const struct sk_buff *skb)
511{
512 return unlikely(skb->pfmemalloc);
513}
514
515
516
517
518
519#define SKB_DST_NOREF 1UL
520#define SKB_DST_PTRMASK ~(SKB_DST_NOREF)
521
522
523
524
525
526
527
528static inline struct dst_entry *skb_dst(const struct sk_buff *skb)
529{
530
531
532
533 WARN_ON((skb->_skb_refdst & SKB_DST_NOREF) &&
534 !rcu_read_lock_held() &&
535 !rcu_read_lock_bh_held());
536 return (struct dst_entry *)(skb->_skb_refdst & SKB_DST_PTRMASK);
537}
538
539
540
541
542
543
544
545
546
547static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst)
548{
549 skb->_skb_refdst = (unsigned long)dst;
550}
551
552extern void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst);
553
554
555
556
557
558static inline bool skb_dst_is_noref(const struct sk_buff *skb)
559{
560 return (skb->_skb_refdst & SKB_DST_NOREF) && skb_dst(skb);
561}
562
563static inline struct rtable *skb_rtable(const struct sk_buff *skb)
564{
565 return (struct rtable *)skb_dst(skb);
566}
567
568extern void kfree_skb(struct sk_buff *skb);
569extern void consume_skb(struct sk_buff *skb);
570extern void __kfree_skb(struct sk_buff *skb);
571extern struct kmem_cache *skbuff_head_cache;
572
573extern void kfree_skb_partial(struct sk_buff *skb, bool head_stolen);
574extern bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,
575 bool *fragstolen, int *delta_truesize);
576
577extern struct sk_buff *__alloc_skb(unsigned int size,
578 gfp_t priority, int flags, int node);
579extern struct sk_buff *build_skb(void *data, unsigned int frag_size);
580static inline struct sk_buff *alloc_skb(unsigned int size,
581 gfp_t priority)
582{
583 return __alloc_skb(size, priority, 0, NUMA_NO_NODE);
584}
585
586static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
587 gfp_t priority)
588{
589 return __alloc_skb(size, priority, SKB_ALLOC_FCLONE, NUMA_NO_NODE);
590}
591
592extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
593extern int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask);
594extern struct sk_buff *skb_clone(struct sk_buff *skb,
595 gfp_t priority);
596extern struct sk_buff *skb_copy(const struct sk_buff *skb,
597 gfp_t priority);
598extern struct sk_buff *__pskb_copy(struct sk_buff *skb,
599 int headroom, gfp_t gfp_mask);
600
601extern int pskb_expand_head(struct sk_buff *skb,
602 int nhead, int ntail,
603 gfp_t gfp_mask);
604extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb,
605 unsigned int headroom);
606extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
607 int newheadroom, int newtailroom,
608 gfp_t priority);
609extern int skb_to_sgvec(struct sk_buff *skb,
610 struct scatterlist *sg, int offset,
611 int len);
612extern int skb_cow_data(struct sk_buff *skb, int tailbits,
613 struct sk_buff **trailer);
614extern int skb_pad(struct sk_buff *skb, int pad);
615#define dev_kfree_skb(a) consume_skb(a)
616
617extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
618 int getfrag(void *from, char *to, int offset,
619 int len,int odd, struct sk_buff *skb),
620 void *from, int length);
621
622struct skb_seq_state {
623 __u32 lower_offset;
624 __u32 upper_offset;
625 __u32 frag_idx;
626 __u32 stepped_offset;
627 struct sk_buff *root_skb;
628 struct sk_buff *cur_skb;
629 __u8 *frag_data;
630};
631
632extern void skb_prepare_seq_read(struct sk_buff *skb,
633 unsigned int from, unsigned int to,
634 struct skb_seq_state *st);
635extern unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
636 struct skb_seq_state *st);
637extern void skb_abort_seq_read(struct skb_seq_state *st);
638
639extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
640 unsigned int to, struct ts_config *config,
641 struct ts_state *state);
642
643extern void __skb_get_rxhash(struct sk_buff *skb);
644static inline __u32 skb_get_rxhash(struct sk_buff *skb)
645{
646 if (!skb->rxhash)
647 __skb_get_rxhash(skb);
648
649 return skb->rxhash;
650}
651
652#ifdef NET_SKBUFF_DATA_USES_OFFSET
653static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
654{
655 return skb->head + skb->end;
656}
657
658static inline unsigned int skb_end_offset(const struct sk_buff *skb)
659{
660 return skb->end;
661}
662#else
663static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
664{
665 return skb->end;
666}
667
668static inline unsigned int skb_end_offset(const struct sk_buff *skb)
669{
670 return skb->end - skb->head;
671}
672#endif
673
674
675#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))
676
677static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb)
678{
679 return &skb_shinfo(skb)->hwtstamps;
680}
681
682
683
684
685
686
687
688static inline int skb_queue_empty(const struct sk_buff_head *list)
689{
690 return list->next == (struct sk_buff *)list;
691}
692
693
694
695
696
697
698
699
700static inline bool skb_queue_is_last(const struct sk_buff_head *list,
701 const struct sk_buff *skb)
702{
703 return skb->next == (struct sk_buff *)list;
704}
705
706
707
708
709
710
711
712
713static inline bool skb_queue_is_first(const struct sk_buff_head *list,
714 const struct sk_buff *skb)
715{
716 return skb->prev == (struct sk_buff *)list;
717}
718
719
720
721
722
723
724
725
726
727static inline struct sk_buff *skb_queue_next(const struct sk_buff_head *list,
728 const struct sk_buff *skb)
729{
730
731
732
733 BUG_ON(skb_queue_is_last(list, skb));
734 return skb->next;
735}
736
737
738
739
740
741
742
743
744
745static inline struct sk_buff *skb_queue_prev(const struct sk_buff_head *list,
746 const struct sk_buff *skb)
747{
748
749
750
751 BUG_ON(skb_queue_is_first(list, skb));
752 return skb->prev;
753}
754
755
756
757
758
759
760
761
762static inline struct sk_buff *skb_get(struct sk_buff *skb)
763{
764 atomic_inc(&skb->users);
765 return skb;
766}
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781static inline int skb_cloned(const struct sk_buff *skb)
782{
783 return skb->cloned &&
784 (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;
785}
786
787
788
789
790
791
792
793
794static inline int skb_header_cloned(const struct sk_buff *skb)
795{
796 int dataref;
797
798 if (!skb->cloned)
799 return 0;
800
801 dataref = atomic_read(&skb_shinfo(skb)->dataref);
802 dataref = (dataref & SKB_DATAREF_MASK) - (dataref >> SKB_DATAREF_SHIFT);
803 return dataref != 1;
804}
805
806
807
808
809
810
811
812
813
814static inline void skb_header_release(struct sk_buff *skb)
815{
816 BUG_ON(skb->nohdr);
817 skb->nohdr = 1;
818 atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
819}
820
821
822
823
824
825
826
827
828static inline int skb_shared(const struct sk_buff *skb)
829{
830 return atomic_read(&skb->users) != 1;
831}
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846static inline struct sk_buff *skb_share_check(struct sk_buff *skb, gfp_t pri)
847{
848 might_sleep_if(pri & __GFP_WAIT);
849 if (skb_shared(skb)) {
850 struct sk_buff *nskb = skb_clone(skb, pri);
851
852 if (likely(nskb))
853 consume_skb(skb);
854 else
855 kfree_skb(skb);
856 skb = nskb;
857 }
858 return skb;
859}
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
882 gfp_t pri)
883{
884 might_sleep_if(pri & __GFP_WAIT);
885 if (skb_cloned(skb)) {
886 struct sk_buff *nskb = skb_copy(skb, pri);
887 kfree_skb(skb);
888 skb = nskb;
889 }
890 return skb;
891}
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906static inline struct sk_buff *skb_peek(const struct sk_buff_head *list_)
907{
908 struct sk_buff *skb = list_->next;
909
910 if (skb == (struct sk_buff *)list_)
911 skb = NULL;
912 return skb;
913}
914
915
916
917
918
919
920
921
922
923
924static inline struct sk_buff *skb_peek_next(struct sk_buff *skb,
925 const struct sk_buff_head *list_)
926{
927 struct sk_buff *next = skb->next;
928
929 if (next == (struct sk_buff *)list_)
930 next = NULL;
931 return next;
932}
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947static inline struct sk_buff *skb_peek_tail(const struct sk_buff_head *list_)
948{
949 struct sk_buff *skb = list_->prev;
950
951 if (skb == (struct sk_buff *)list_)
952 skb = NULL;
953 return skb;
954
955}
956
957
958
959
960
961
962
963static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
964{
965 return list_->qlen;
966}
967
968
969
970
971
972
973
974
975
976
977
978static inline void __skb_queue_head_init(struct sk_buff_head *list)
979{
980 list->prev = list->next = (struct sk_buff *)list;
981 list->qlen = 0;
982}
983
984
985
986
987
988
989
990
991
992static inline void skb_queue_head_init(struct sk_buff_head *list)
993{
994 spin_lock_init(&list->lock);
995 __skb_queue_head_init(list);
996}
997
998static inline void skb_queue_head_init_class(struct sk_buff_head *list,
999 struct lock_class_key *class)
1000{
1001 skb_queue_head_init(list);
1002 lockdep_set_class(&list->lock, class);
1003}
1004
1005
1006
1007
1008
1009
1010
1011extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
1012static inline void __skb_insert(struct sk_buff *newsk,
1013 struct sk_buff *prev, struct sk_buff *next,
1014 struct sk_buff_head *list)
1015{
1016 newsk->next = next;
1017 newsk->prev = prev;
1018 next->prev = prev->next = newsk;
1019 list->qlen++;
1020}
1021
1022static inline void __skb_queue_splice(const struct sk_buff_head *list,
1023 struct sk_buff *prev,
1024 struct sk_buff *next)
1025{
1026 struct sk_buff *first = list->next;
1027 struct sk_buff *last = list->prev;
1028
1029 first->prev = prev;
1030 prev->next = first;
1031
1032 last->next = next;
1033 next->prev = last;
1034}
1035
1036
1037
1038
1039
1040
1041static inline void skb_queue_splice(const struct sk_buff_head *list,
1042 struct sk_buff_head *head)
1043{
1044 if (!skb_queue_empty(list)) {
1045 __skb_queue_splice(list, (struct sk_buff *) head, head->next);
1046 head->qlen += list->qlen;
1047 }
1048}
1049
1050
1051
1052
1053
1054
1055
1056
1057static inline void skb_queue_splice_init(struct sk_buff_head *list,
1058 struct sk_buff_head *head)
1059{
1060 if (!skb_queue_empty(list)) {
1061 __skb_queue_splice(list, (struct sk_buff *) head, head->next);
1062 head->qlen += list->qlen;
1063 __skb_queue_head_init(list);
1064 }
1065}
1066
1067
1068
1069
1070
1071
1072static inline void skb_queue_splice_tail(const struct sk_buff_head *list,
1073 struct sk_buff_head *head)
1074{
1075 if (!skb_queue_empty(list)) {
1076 __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
1077 head->qlen += list->qlen;
1078 }
1079}
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089static inline void skb_queue_splice_tail_init(struct sk_buff_head *list,
1090 struct sk_buff_head *head)
1091{
1092 if (!skb_queue_empty(list)) {
1093 __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
1094 head->qlen += list->qlen;
1095 __skb_queue_head_init(list);
1096 }
1097}
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110static inline void __skb_queue_after(struct sk_buff_head *list,
1111 struct sk_buff *prev,
1112 struct sk_buff *newsk)
1113{
1114 __skb_insert(newsk, prev, prev->next, list);
1115}
1116
1117extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
1118 struct sk_buff_head *list);
1119
1120static inline void __skb_queue_before(struct sk_buff_head *list,
1121 struct sk_buff *next,
1122 struct sk_buff *newsk)
1123{
1124 __skb_insert(newsk, next->prev, next, list);
1125}
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
1138static inline void __skb_queue_head(struct sk_buff_head *list,
1139 struct sk_buff *newsk)
1140{
1141 __skb_queue_after(list, (struct sk_buff *)list, newsk);
1142}
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
1155static inline void __skb_queue_tail(struct sk_buff_head *list,
1156 struct sk_buff *newsk)
1157{
1158 __skb_queue_before(list, (struct sk_buff *)list, newsk);
1159}
1160
1161
1162
1163
1164
1165extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
1166static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
1167{
1168 struct sk_buff *next, *prev;
1169
1170 list->qlen--;
1171 next = skb->next;
1172 prev = skb->prev;
1173 skb->next = skb->prev = NULL;
1174 next->prev = prev;
1175 prev->next = next;
1176}
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
1187static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
1188{
1189 struct sk_buff *skb = skb_peek(list);
1190 if (skb)
1191 __skb_unlink(skb, list);
1192 return skb;
1193}
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
1204static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
1205{
1206 struct sk_buff *skb = skb_peek_tail(list);
1207 if (skb)
1208 __skb_unlink(skb, list);
1209 return skb;
1210}
1211
1212
1213static inline bool skb_is_nonlinear(const struct sk_buff *skb)
1214{
1215 return skb->data_len;
1216}
1217
1218static inline unsigned int skb_headlen(const struct sk_buff *skb)
1219{
1220 return skb->len - skb->data_len;
1221}
1222
1223static inline int skb_pagelen(const struct sk_buff *skb)
1224{
1225 int i, len = 0;
1226
1227 for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
1228 len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
1229 return len + skb_headlen(skb);
1230}
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
1246 struct page *page, int off, int size)
1247{
1248 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259 if (page->pfmemalloc && !page->mapping)
1260 skb->pfmemalloc = true;
1261 frag->page.p = page;
1262 frag->page_offset = off;
1263 skb_frag_size_set(frag, size);
1264}
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
1281 struct page *page, int off, int size)
1282{
1283 __skb_fill_page_desc(skb, i, page, off, size);
1284 skb_shinfo(skb)->nr_frags = i + 1;
1285}
1286
1287extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page,
1288 int off, int size, unsigned int truesize);
1289
1290#define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags)
1291#define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb))
1292#define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb))
1293
1294#ifdef NET_SKBUFF_DATA_USES_OFFSET
1295static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
1296{
1297 return skb->head + skb->tail;
1298}
1299
1300static inline void skb_reset_tail_pointer(struct sk_buff *skb)
1301{
1302 skb->tail = skb->data - skb->head;
1303}
1304
1305static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
1306{
1307 skb_reset_tail_pointer(skb);
1308 skb->tail += offset;
1309}
1310#else
1311static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
1312{
1313 return skb->tail;
1314}
1315
1316static inline void skb_reset_tail_pointer(struct sk_buff *skb)
1317{
1318 skb->tail = skb->data;
1319}
1320
1321static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
1322{
1323 skb->tail = skb->data + offset;
1324}
1325
1326#endif
1327
1328
1329
1330
1331extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
1332static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
1333{
1334 unsigned char *tmp = skb_tail_pointer(skb);
1335 SKB_LINEAR_ASSERT(skb);
1336 skb->tail += len;
1337 skb->len += len;
1338 return tmp;
1339}
1340
1341extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
1342static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
1343{
1344 skb->data -= len;
1345 skb->len += len;
1346 return skb->data;
1347}
1348
1349extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
1350static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
1351{
1352 skb->len -= len;
1353 BUG_ON(skb->len < skb->data_len);
1354 return skb->data += len;
1355}
1356
1357static inline unsigned char *skb_pull_inline(struct sk_buff *skb, unsigned int len)
1358{
1359 return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
1360}
1361
1362extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
1363
1364static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
1365{
1366 if (len > skb_headlen(skb) &&
1367 !__pskb_pull_tail(skb, len - skb_headlen(skb)))
1368 return NULL;
1369 skb->len -= len;
1370 return skb->data += len;
1371}
1372
1373static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
1374{
1375 return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
1376}
1377
1378static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
1379{
1380 if (likely(len <= skb_headlen(skb)))
1381 return 1;
1382 if (unlikely(len > skb->len))
1383 return 0;
1384 return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
1385}
1386
1387
1388
1389
1390
1391
1392
1393static inline unsigned int skb_headroom(const struct sk_buff *skb)
1394{
1395 return skb->data - skb->head;
1396}
1397
1398
1399
1400
1401
1402
1403
1404static inline int skb_tailroom(const struct sk_buff *skb)
1405{
1406 return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
1407}
1408
1409
1410
1411
1412
1413
1414
1415
1416static inline int skb_availroom(const struct sk_buff *skb)
1417{
1418 return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len;
1419}
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429static inline void skb_reserve(struct sk_buff *skb, int len)
1430{
1431 skb->data += len;
1432 skb->tail += len;
1433}
1434
1435static inline void skb_reset_mac_len(struct sk_buff *skb)
1436{
1437 skb->mac_len = skb->network_header - skb->mac_header;
1438}
1439
1440#ifdef NET_SKBUFF_DATA_USES_OFFSET
1441static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1442{
1443 return skb->head + skb->transport_header;
1444}
1445
1446static inline void skb_reset_transport_header(struct sk_buff *skb)
1447{
1448 skb->transport_header = skb->data - skb->head;
1449}
1450
1451static inline void skb_set_transport_header(struct sk_buff *skb,
1452 const int offset)
1453{
1454 skb_reset_transport_header(skb);
1455 skb->transport_header += offset;
1456}
1457
1458static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1459{
1460 return skb->head + skb->network_header;
1461}
1462
1463static inline void skb_reset_network_header(struct sk_buff *skb)
1464{
1465 skb->network_header = skb->data - skb->head;
1466}
1467
1468static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1469{
1470 skb_reset_network_header(skb);
1471 skb->network_header += offset;
1472}
1473
1474static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1475{
1476 return skb->head + skb->mac_header;
1477}
1478
1479static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1480{
1481 return skb->mac_header != ~0U;
1482}
1483
1484static inline void skb_reset_mac_header(struct sk_buff *skb)
1485{
1486 skb->mac_header = skb->data - skb->head;
1487}
1488
1489static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1490{
1491 skb_reset_mac_header(skb);
1492 skb->mac_header += offset;
1493}
1494
1495#else
1496
1497static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1498{
1499 return skb->transport_header;
1500}
1501
1502static inline void skb_reset_transport_header(struct sk_buff *skb)
1503{
1504 skb->transport_header = skb->data;
1505}
1506
1507static inline void skb_set_transport_header(struct sk_buff *skb,
1508 const int offset)
1509{
1510 skb->transport_header = skb->data + offset;
1511}
1512
1513static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1514{
1515 return skb->network_header;
1516}
1517
1518static inline void skb_reset_network_header(struct sk_buff *skb)
1519{
1520 skb->network_header = skb->data;
1521}
1522
1523static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1524{
1525 skb->network_header = skb->data + offset;
1526}
1527
1528static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1529{
1530 return skb->mac_header;
1531}
1532
1533static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1534{
1535 return skb->mac_header != NULL;
1536}
1537
1538static inline void skb_reset_mac_header(struct sk_buff *skb)
1539{
1540 skb->mac_header = skb->data;
1541}
1542
1543static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1544{
1545 skb->mac_header = skb->data + offset;
1546}
1547#endif
1548
1549static inline void skb_mac_header_rebuild(struct sk_buff *skb)
1550{
1551 if (skb_mac_header_was_set(skb)) {
1552 const unsigned char *old_mac = skb_mac_header(skb);
1553
1554 skb_set_mac_header(skb, -skb->mac_len);
1555 memmove(skb_mac_header(skb), old_mac, skb->mac_len);
1556 }
1557}
1558
1559static inline int skb_checksum_start_offset(const struct sk_buff *skb)
1560{
1561 return skb->csum_start - skb_headroom(skb);
1562}
1563
1564static inline int skb_transport_offset(const struct sk_buff *skb)
1565{
1566 return skb_transport_header(skb) - skb->data;
1567}
1568
1569static inline u32 skb_network_header_len(const struct sk_buff *skb)
1570{
1571 return skb->transport_header - skb->network_header;
1572}
1573
1574static inline int skb_network_offset(const struct sk_buff *skb)
1575{
1576 return skb_network_header(skb) - skb->data;
1577}
1578
1579static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)
1580{
1581 return pskb_may_pull(skb, skb_network_offset(skb) + len);
1582}
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604#ifndef NET_IP_ALIGN
1605#define NET_IP_ALIGN 2
1606#endif
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628#ifndef NET_SKB_PAD
1629#define NET_SKB_PAD max(32, L1_CACHE_BYTES)
1630#endif
1631
1632extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1633
1634static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
1635{
1636 if (unlikely(skb_is_nonlinear(skb))) {
1637 WARN_ON(1);
1638 return;
1639 }
1640 skb->len = len;
1641 skb_set_tail_pointer(skb, len);
1642}
1643
1644extern void skb_trim(struct sk_buff *skb, unsigned int len);
1645
1646static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
1647{
1648 if (skb->data_len)
1649 return ___pskb_trim(skb, len);
1650 __skb_trim(skb, len);
1651 return 0;
1652}
1653
1654static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
1655{
1656 return (len < skb->len) ? __pskb_trim(skb, len) : 0;
1657}
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
1669{
1670 int err = pskb_trim(skb, len);
1671 BUG_ON(err);
1672}
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682static inline void skb_orphan(struct sk_buff *skb)
1683{
1684 if (skb->destructor)
1685 skb->destructor(skb);
1686 skb->destructor = NULL;
1687 skb->sk = NULL;
1688}
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699static inline int skb_orphan_frags(struct sk_buff *skb, gfp_t gfp_mask)
1700{
1701 if (likely(!(skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY)))
1702 return 0;
1703 return skb_copy_ubufs(skb, gfp_mask);
1704}
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714extern void skb_queue_purge(struct sk_buff_head *list);
1715static inline void __skb_queue_purge(struct sk_buff_head *list)
1716{
1717 struct sk_buff *skb;
1718 while ((skb = __skb_dequeue(list)) != NULL)
1719 kfree_skb(skb);
1720}
1721
1722extern void *netdev_alloc_frag(unsigned int fragsz);
1723
1724extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
1725 unsigned int length,
1726 gfp_t gfp_mask);
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
1742 unsigned int length)
1743{
1744 return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
1745}
1746
1747
1748static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
1749 gfp_t gfp_mask)
1750{
1751 return __netdev_alloc_skb(NULL, length, gfp_mask);
1752}
1753
1754
1755static inline struct sk_buff *dev_alloc_skb(unsigned int length)
1756{
1757 return netdev_alloc_skb(NULL, length);
1758}
1759
1760
1761static inline struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev,
1762 unsigned int length, gfp_t gfp)
1763{
1764 struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp);
1765
1766 if (NET_IP_ALIGN && skb)
1767 skb_reserve(skb, NET_IP_ALIGN);
1768 return skb;
1769}
1770
1771static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
1772 unsigned int length)
1773{
1774 return __netdev_alloc_skb_ip_align(dev, length, GFP_ATOMIC);
1775}
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787static inline struct page *__skb_alloc_pages(gfp_t gfp_mask,
1788 struct sk_buff *skb,
1789 unsigned int order)
1790{
1791 struct page *page;
1792
1793 gfp_mask |= __GFP_COLD;
1794
1795 if (!(gfp_mask & __GFP_NOMEMALLOC))
1796 gfp_mask |= __GFP_MEMALLOC;
1797
1798 page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
1799 if (skb && page && page->pfmemalloc)
1800 skb->pfmemalloc = true;
1801
1802 return page;
1803}
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814static inline struct page *__skb_alloc_page(gfp_t gfp_mask,
1815 struct sk_buff *skb)
1816{
1817 return __skb_alloc_pages(gfp_mask, skb, 0);
1818}
1819
1820
1821
1822
1823
1824
1825static inline void skb_propagate_pfmemalloc(struct page *page,
1826 struct sk_buff *skb)
1827{
1828 if (page && page->pfmemalloc)
1829 skb->pfmemalloc = true;
1830}
1831
1832
1833
1834
1835
1836
1837
1838static inline struct page *skb_frag_page(const skb_frag_t *frag)
1839{
1840 return frag->page.p;
1841}
1842
1843
1844
1845
1846
1847
1848
1849static inline void __skb_frag_ref(skb_frag_t *frag)
1850{
1851 get_page(skb_frag_page(frag));
1852}
1853
1854
1855
1856
1857
1858
1859
1860
1861static inline void skb_frag_ref(struct sk_buff *skb, int f)
1862{
1863 __skb_frag_ref(&skb_shinfo(skb)->frags[f]);
1864}
1865
1866
1867
1868
1869
1870
1871
1872static inline void __skb_frag_unref(skb_frag_t *frag)
1873{
1874 put_page(skb_frag_page(frag));
1875}
1876
1877
1878
1879
1880
1881
1882
1883
1884static inline void skb_frag_unref(struct sk_buff *skb, int f)
1885{
1886 __skb_frag_unref(&skb_shinfo(skb)->frags[f]);
1887}
1888
1889
1890
1891
1892
1893
1894
1895
1896static inline void *skb_frag_address(const skb_frag_t *frag)
1897{
1898 return page_address(skb_frag_page(frag)) + frag->page_offset;
1899}
1900
1901
1902
1903
1904
1905
1906
1907
1908static inline void *skb_frag_address_safe(const skb_frag_t *frag)
1909{
1910 void *ptr = page_address(skb_frag_page(frag));
1911 if (unlikely(!ptr))
1912 return NULL;
1913
1914 return ptr + frag->page_offset;
1915}
1916
1917
1918
1919
1920
1921
1922
1923
1924static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page)
1925{
1926 frag->page.p = page;
1927}
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937static inline void skb_frag_set_page(struct sk_buff *skb, int f,
1938 struct page *page)
1939{
1940 __skb_frag_set_page(&skb_shinfo(skb)->frags[f], page);
1941}
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954static inline dma_addr_t skb_frag_dma_map(struct device *dev,
1955 const skb_frag_t *frag,
1956 size_t offset, size_t size,
1957 enum dma_data_direction dir)
1958{
1959 return dma_map_page(dev, skb_frag_page(frag),
1960 frag->page_offset + offset, size, dir);
1961}
1962
1963static inline struct sk_buff *pskb_copy(struct sk_buff *skb,
1964 gfp_t gfp_mask)
1965{
1966 return __pskb_copy(skb, skb_headroom(skb), gfp_mask);
1967}
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977static inline int skb_clone_writable(const struct sk_buff *skb, unsigned int len)
1978{
1979 return !skb_header_cloned(skb) &&
1980 skb_headroom(skb) + len <= skb->hdr_len;
1981}
1982
1983static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
1984 int cloned)
1985{
1986 int delta = 0;
1987
1988 if (headroom > skb_headroom(skb))
1989 delta = headroom - skb_headroom(skb);
1990
1991 if (delta || cloned)
1992 return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
1993 GFP_ATOMIC);
1994 return 0;
1995}
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
2010{
2011 return __skb_cow(skb, headroom, skb_cloned(skb));
2012}
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024static inline int skb_cow_head(struct sk_buff *skb, unsigned int headroom)
2025{
2026 return __skb_cow(skb, headroom, skb_header_cloned(skb));
2027}
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040static inline int skb_padto(struct sk_buff *skb, unsigned int len)
2041{
2042 unsigned int size = skb->len;
2043 if (likely(size >= len))
2044 return 0;
2045 return skb_pad(skb, len - size);
2046}
2047
2048static inline int skb_add_data(struct sk_buff *skb,
2049 char __user *from, int copy)
2050{
2051 const int off = skb->len;
2052
2053 if (skb->ip_summed == CHECKSUM_NONE) {
2054 int err = 0;
2055 __wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
2056 copy, 0, &err);
2057 if (!err) {
2058 skb->csum = csum_block_add(skb->csum, csum, off);
2059 return 0;
2060 }
2061 } else if (!copy_from_user(skb_put(skb, copy), from, copy))
2062 return 0;
2063
2064 __skb_trim(skb, off);
2065 return -EFAULT;
2066}
2067
2068static inline bool skb_can_coalesce(struct sk_buff *skb, int i,
2069 const struct page *page, int off)
2070{
2071 if (i) {
2072 const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
2073
2074 return page == skb_frag_page(frag) &&
2075 off == frag->page_offset + skb_frag_size(frag);
2076 }
2077 return false;
2078}
2079
2080static inline int __skb_linearize(struct sk_buff *skb)
2081{
2082 return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
2083}
2084
2085
2086
2087
2088
2089
2090
2091
2092static inline int skb_linearize(struct sk_buff *skb)
2093{
2094 return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
2095}
2096
2097
2098
2099
2100
2101
2102
2103
2104static inline int skb_linearize_cow(struct sk_buff *skb)
2105{
2106 return skb_is_nonlinear(skb) || skb_cloned(skb) ?
2107 __skb_linearize(skb) : 0;
2108}
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121static inline void skb_postpull_rcsum(struct sk_buff *skb,
2122 const void *start, unsigned int len)
2123{
2124 if (skb->ip_summed == CHECKSUM_COMPLETE)
2125 skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
2126}
2127
2128unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
2140{
2141 if (likely(len >= skb->len))
2142 return 0;
2143 if (skb->ip_summed == CHECKSUM_COMPLETE)
2144 skb->ip_summed = CHECKSUM_NONE;
2145 return __pskb_trim(skb, len);
2146}
2147
2148#define skb_queue_walk(queue, skb) \
2149 for (skb = (queue)->next; \
2150 skb != (struct sk_buff *)(queue); \
2151 skb = skb->next)
2152
2153#define skb_queue_walk_safe(queue, skb, tmp) \
2154 for (skb = (queue)->next, tmp = skb->next; \
2155 skb != (struct sk_buff *)(queue); \
2156 skb = tmp, tmp = skb->next)
2157
2158#define skb_queue_walk_from(queue, skb) \
2159 for (; skb != (struct sk_buff *)(queue); \
2160 skb = skb->next)
2161
2162#define skb_queue_walk_from_safe(queue, skb, tmp) \
2163 for (tmp = skb->next; \
2164 skb != (struct sk_buff *)(queue); \
2165 skb = tmp, tmp = skb->next)
2166
2167#define skb_queue_reverse_walk(queue, skb) \
2168 for (skb = (queue)->prev; \
2169 skb != (struct sk_buff *)(queue); \
2170 skb = skb->prev)
2171
2172#define skb_queue_reverse_walk_safe(queue, skb, tmp) \
2173 for (skb = (queue)->prev, tmp = skb->prev; \
2174 skb != (struct sk_buff *)(queue); \
2175 skb = tmp, tmp = skb->prev)
2176
2177#define skb_queue_reverse_walk_from_safe(queue, skb, tmp) \
2178 for (tmp = skb->prev; \
2179 skb != (struct sk_buff *)(queue); \
2180 skb = tmp, tmp = skb->prev)
2181
2182static inline bool skb_has_frag_list(const struct sk_buff *skb)
2183{
2184 return skb_shinfo(skb)->frag_list != NULL;
2185}
2186
2187static inline void skb_frag_list_init(struct sk_buff *skb)
2188{
2189 skb_shinfo(skb)->frag_list = NULL;
2190}
2191
2192static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag)
2193{
2194 frag->next = skb_shinfo(skb)->frag_list;
2195 skb_shinfo(skb)->frag_list = frag;
2196}
2197
2198#define skb_walk_frags(skb, iter) \
2199 for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next)
2200
2201extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
2202 int *peeked, int *off, int *err);
2203extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
2204 int noblock, int *err);
2205extern unsigned int datagram_poll(struct file *file, struct socket *sock,
2206 struct poll_table_struct *wait);
2207extern int skb_copy_datagram_iovec(const struct sk_buff *from,
2208 int offset, struct iovec *to,
2209 int size);
2210extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
2211 int hlen,
2212 struct iovec *iov);
2213extern int skb_copy_datagram_from_iovec(struct sk_buff *skb,
2214 int offset,
2215 const struct iovec *from,
2216 int from_offset,
2217 int len);
2218extern int skb_copy_datagram_const_iovec(const struct sk_buff *from,
2219 int offset,
2220 const struct iovec *to,
2221 int to_offset,
2222 int size);
2223extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
2224extern void skb_free_datagram_locked(struct sock *sk,
2225 struct sk_buff *skb);
2226extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
2227 unsigned int flags);
2228extern __wsum skb_checksum(const struct sk_buff *skb, int offset,
2229 int len, __wsum csum);
2230extern int skb_copy_bits(const struct sk_buff *skb, int offset,
2231 void *to, int len);
2232extern int skb_store_bits(struct sk_buff *skb, int offset,
2233 const void *from, int len);
2234extern __wsum skb_copy_and_csum_bits(const struct sk_buff *skb,
2235 int offset, u8 *to, int len,
2236 __wsum csum);
2237extern int skb_splice_bits(struct sk_buff *skb,
2238 unsigned int offset,
2239 struct pipe_inode_info *pipe,
2240 unsigned int len,
2241 unsigned int flags);
2242extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
2243extern void skb_split(struct sk_buff *skb,
2244 struct sk_buff *skb1, const u32 len);
2245extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
2246 int shiftlen);
2247
2248extern struct sk_buff *skb_segment(struct sk_buff *skb,
2249 netdev_features_t features);
2250
2251static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
2252 int len, void *buffer)
2253{
2254 int hlen = skb_headlen(skb);
2255
2256 if (hlen - offset >= len)
2257 return skb->data + offset;
2258
2259 if (skb_copy_bits(skb, offset, buffer, len) < 0)
2260 return NULL;
2261
2262 return buffer;
2263}
2264
2265static inline void skb_copy_from_linear_data(const struct sk_buff *skb,
2266 void *to,
2267 const unsigned int len)
2268{
2269 memcpy(to, skb->data, len);
2270}
2271
2272static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb,
2273 const int offset, void *to,
2274 const unsigned int len)
2275{
2276 memcpy(to, skb->data + offset, len);
2277}
2278
2279static inline void skb_copy_to_linear_data(struct sk_buff *skb,
2280 const void *from,
2281 const unsigned int len)
2282{
2283 memcpy(skb->data, from, len);
2284}
2285
2286static inline void skb_copy_to_linear_data_offset(struct sk_buff *skb,
2287 const int offset,
2288 const void *from,
2289 const unsigned int len)
2290{
2291 memcpy(skb->data + offset, from, len);
2292}
2293
2294extern void skb_init(void);
2295
2296static inline ktime_t skb_get_ktime(const struct sk_buff *skb)
2297{
2298 return skb->tstamp;
2299}
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310static inline void skb_get_timestamp(const struct sk_buff *skb,
2311 struct timeval *stamp)
2312{
2313 *stamp = ktime_to_timeval(skb->tstamp);
2314}
2315
2316static inline void skb_get_timestampns(const struct sk_buff *skb,
2317 struct timespec *stamp)
2318{
2319 *stamp = ktime_to_timespec(skb->tstamp);
2320}
2321
2322static inline void __net_timestamp(struct sk_buff *skb)
2323{
2324 skb->tstamp = ktime_get_real();
2325}
2326
2327static inline ktime_t net_timedelta(ktime_t t)
2328{
2329 return ktime_sub(ktime_get_real(), t);
2330}
2331
2332static inline ktime_t net_invalid_timestamp(void)
2333{
2334 return ktime_set(0, 0);
2335}
2336
2337extern void skb_timestamping_init(void);
2338
2339#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
2340
2341extern void skb_clone_tx_timestamp(struct sk_buff *skb);
2342extern bool skb_defer_rx_timestamp(struct sk_buff *skb);
2343
2344#else
2345
2346static inline void skb_clone_tx_timestamp(struct sk_buff *skb)
2347{
2348}
2349
2350static inline bool skb_defer_rx_timestamp(struct sk_buff *skb)
2351{
2352 return false;
2353}
2354
2355#endif
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369void skb_complete_tx_timestamp(struct sk_buff *skb,
2370 struct skb_shared_hwtstamps *hwtstamps);
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383extern void skb_tstamp_tx(struct sk_buff *orig_skb,
2384 struct skb_shared_hwtstamps *hwtstamps);
2385
2386static inline void sw_tx_timestamp(struct sk_buff *skb)
2387{
2388 if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP &&
2389 !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS))
2390 skb_tstamp_tx(skb, NULL);
2391}
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401static inline void skb_tx_timestamp(struct sk_buff *skb)
2402{
2403 skb_clone_tx_timestamp(skb);
2404 sw_tx_timestamp(skb);
2405}
2406
2407
2408
2409
2410
2411
2412
2413
2414void skb_complete_wifi_ack(struct sk_buff *skb, bool acked);
2415
2416extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
2417extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
2418
2419static inline int skb_csum_unnecessary(const struct sk_buff *skb)
2420{
2421 return skb->ip_summed & CHECKSUM_UNNECESSARY;
2422}
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440static inline __sum16 skb_checksum_complete(struct sk_buff *skb)
2441{
2442 return skb_csum_unnecessary(skb) ?
2443 0 : __skb_checksum_complete(skb);
2444}
2445
2446#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2447extern void nf_conntrack_destroy(struct nf_conntrack *nfct);
2448static inline void nf_conntrack_put(struct nf_conntrack *nfct)
2449{
2450 if (nfct && atomic_dec_and_test(&nfct->use))
2451 nf_conntrack_destroy(nfct);
2452}
2453static inline void nf_conntrack_get(struct nf_conntrack *nfct)
2454{
2455 if (nfct)
2456 atomic_inc(&nfct->use);
2457}
2458#endif
2459#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2460static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
2461{
2462 if (skb)
2463 atomic_inc(&skb->users);
2464}
2465static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
2466{
2467 if (skb)
2468 kfree_skb(skb);
2469}
2470#endif
2471#ifdef CONFIG_BRIDGE_NETFILTER
2472static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
2473{
2474 if (nf_bridge && atomic_dec_and_test(&nf_bridge->use))
2475 kfree(nf_bridge);
2476}
2477static inline void nf_bridge_get(struct nf_bridge_info *nf_bridge)
2478{
2479 if (nf_bridge)
2480 atomic_inc(&nf_bridge->use);
2481}
2482#endif
2483static inline void nf_reset(struct sk_buff *skb)
2484{
2485#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2486 nf_conntrack_put(skb->nfct);
2487 skb->nfct = NULL;
2488#endif
2489#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2490 nf_conntrack_put_reasm(skb->nfct_reasm);
2491 skb->nfct_reasm = NULL;
2492#endif
2493#ifdef CONFIG_BRIDGE_NETFILTER
2494 nf_bridge_put(skb->nf_bridge);
2495 skb->nf_bridge = NULL;
2496#endif
2497}
2498
2499
2500static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
2501{
2502#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2503 dst->nfct = src->nfct;
2504 nf_conntrack_get(src->nfct);
2505 dst->nfctinfo = src->nfctinfo;
2506#endif
2507#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2508 dst->nfct_reasm = src->nfct_reasm;
2509 nf_conntrack_get_reasm(src->nfct_reasm);
2510#endif
2511#ifdef CONFIG_BRIDGE_NETFILTER
2512 dst->nf_bridge = src->nf_bridge;
2513 nf_bridge_get(src->nf_bridge);
2514#endif
2515}
2516
2517static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
2518{
2519#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2520 nf_conntrack_put(dst->nfct);
2521#endif
2522#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2523 nf_conntrack_put_reasm(dst->nfct_reasm);
2524#endif
2525#ifdef CONFIG_BRIDGE_NETFILTER
2526 nf_bridge_put(dst->nf_bridge);
2527#endif
2528 __nf_copy(dst, src);
2529}
2530
2531#ifdef CONFIG_NETWORK_SECMARK
2532static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
2533{
2534 to->secmark = from->secmark;
2535}
2536
2537static inline void skb_init_secmark(struct sk_buff *skb)
2538{
2539 skb->secmark = 0;
2540}
2541#else
2542static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
2543{ }
2544
2545static inline void skb_init_secmark(struct sk_buff *skb)
2546{ }
2547#endif
2548
2549static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping)
2550{
2551 skb->queue_mapping = queue_mapping;
2552}
2553
2554static inline u16 skb_get_queue_mapping(const struct sk_buff *skb)
2555{
2556 return skb->queue_mapping;
2557}
2558
2559static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
2560{
2561 to->queue_mapping = from->queue_mapping;
2562}
2563
2564static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue)
2565{
2566 skb->queue_mapping = rx_queue + 1;
2567}
2568
2569static inline u16 skb_get_rx_queue(const struct sk_buff *skb)
2570{
2571 return skb->queue_mapping - 1;
2572}
2573
2574static inline bool skb_rx_queue_recorded(const struct sk_buff *skb)
2575{
2576 return skb->queue_mapping != 0;
2577}
2578
2579extern u16 __skb_tx_hash(const struct net_device *dev,
2580 const struct sk_buff *skb,
2581 unsigned int num_tx_queues);
2582
2583#ifdef CONFIG_XFRM
2584static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
2585{
2586 return skb->sp;
2587}
2588#else
2589static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
2590{
2591 return NULL;
2592}
2593#endif
2594
2595static inline bool skb_is_gso(const struct sk_buff *skb)
2596{
2597 return skb_shinfo(skb)->gso_size;
2598}
2599
2600static inline bool skb_is_gso_v6(const struct sk_buff *skb)
2601{
2602 return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
2603}
2604
2605extern void __skb_warn_lro_forwarding(const struct sk_buff *skb);
2606
2607static inline bool skb_warn_if_lro(const struct sk_buff *skb)
2608{
2609
2610
2611 const struct skb_shared_info *shinfo = skb_shinfo(skb);
2612
2613 if (skb_is_nonlinear(skb) && shinfo->gso_size != 0 &&
2614 unlikely(shinfo->gso_type == 0)) {
2615 __skb_warn_lro_forwarding(skb);
2616 return true;
2617 }
2618 return false;
2619}
2620
2621static inline void skb_forward_csum(struct sk_buff *skb)
2622{
2623
2624 if (skb->ip_summed == CHECKSUM_COMPLETE)
2625 skb->ip_summed = CHECKSUM_NONE;
2626}
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636static inline void skb_checksum_none_assert(const struct sk_buff *skb)
2637{
2638#ifdef DEBUG
2639 BUG_ON(skb->ip_summed != CHECKSUM_NONE);
2640#endif
2641}
2642
2643bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654static inline bool skb_head_is_locked(const struct sk_buff *skb)
2655{
2656 return !skb->head_frag || skb_cloned(skb);
2657}
2658#endif
2659#endif
2660