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,
847 gfp_t pri)
848{
849 might_sleep_if(pri & __GFP_WAIT);
850 if (skb_shared(skb)) {
851 struct sk_buff *nskb = skb_clone(skb, pri);
852 kfree_skb(skb);
853 skb = nskb;
854 }
855 return skb;
856}
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
879 gfp_t pri)
880{
881 might_sleep_if(pri & __GFP_WAIT);
882 if (skb_cloned(skb)) {
883 struct sk_buff *nskb = skb_copy(skb, pri);
884 kfree_skb(skb);
885 skb = nskb;
886 }
887 return skb;
888}
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903static inline struct sk_buff *skb_peek(const struct sk_buff_head *list_)
904{
905 struct sk_buff *skb = list_->next;
906
907 if (skb == (struct sk_buff *)list_)
908 skb = NULL;
909 return skb;
910}
911
912
913
914
915
916
917
918
919
920
921static inline struct sk_buff *skb_peek_next(struct sk_buff *skb,
922 const struct sk_buff_head *list_)
923{
924 struct sk_buff *next = skb->next;
925
926 if (next == (struct sk_buff *)list_)
927 next = NULL;
928 return next;
929}
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944static inline struct sk_buff *skb_peek_tail(const struct sk_buff_head *list_)
945{
946 struct sk_buff *skb = list_->prev;
947
948 if (skb == (struct sk_buff *)list_)
949 skb = NULL;
950 return skb;
951
952}
953
954
955
956
957
958
959
960static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
961{
962 return list_->qlen;
963}
964
965
966
967
968
969
970
971
972
973
974
975static inline void __skb_queue_head_init(struct sk_buff_head *list)
976{
977 list->prev = list->next = (struct sk_buff *)list;
978 list->qlen = 0;
979}
980
981
982
983
984
985
986
987
988
989static inline void skb_queue_head_init(struct sk_buff_head *list)
990{
991 spin_lock_init(&list->lock);
992 __skb_queue_head_init(list);
993}
994
995static inline void skb_queue_head_init_class(struct sk_buff_head *list,
996 struct lock_class_key *class)
997{
998 skb_queue_head_init(list);
999 lockdep_set_class(&list->lock, class);
1000}
1001
1002
1003
1004
1005
1006
1007
1008extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
1009static inline void __skb_insert(struct sk_buff *newsk,
1010 struct sk_buff *prev, struct sk_buff *next,
1011 struct sk_buff_head *list)
1012{
1013 newsk->next = next;
1014 newsk->prev = prev;
1015 next->prev = prev->next = newsk;
1016 list->qlen++;
1017}
1018
1019static inline void __skb_queue_splice(const struct sk_buff_head *list,
1020 struct sk_buff *prev,
1021 struct sk_buff *next)
1022{
1023 struct sk_buff *first = list->next;
1024 struct sk_buff *last = list->prev;
1025
1026 first->prev = prev;
1027 prev->next = first;
1028
1029 last->next = next;
1030 next->prev = last;
1031}
1032
1033
1034
1035
1036
1037
1038static inline void skb_queue_splice(const struct sk_buff_head *list,
1039 struct sk_buff_head *head)
1040{
1041 if (!skb_queue_empty(list)) {
1042 __skb_queue_splice(list, (struct sk_buff *) head, head->next);
1043 head->qlen += list->qlen;
1044 }
1045}
1046
1047
1048
1049
1050
1051
1052
1053
1054static inline void skb_queue_splice_init(struct sk_buff_head *list,
1055 struct sk_buff_head *head)
1056{
1057 if (!skb_queue_empty(list)) {
1058 __skb_queue_splice(list, (struct sk_buff *) head, head->next);
1059 head->qlen += list->qlen;
1060 __skb_queue_head_init(list);
1061 }
1062}
1063
1064
1065
1066
1067
1068
1069static inline void skb_queue_splice_tail(const struct sk_buff_head *list,
1070 struct sk_buff_head *head)
1071{
1072 if (!skb_queue_empty(list)) {
1073 __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
1074 head->qlen += list->qlen;
1075 }
1076}
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086static inline void skb_queue_splice_tail_init(struct sk_buff_head *list,
1087 struct sk_buff_head *head)
1088{
1089 if (!skb_queue_empty(list)) {
1090 __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
1091 head->qlen += list->qlen;
1092 __skb_queue_head_init(list);
1093 }
1094}
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107static inline void __skb_queue_after(struct sk_buff_head *list,
1108 struct sk_buff *prev,
1109 struct sk_buff *newsk)
1110{
1111 __skb_insert(newsk, prev, prev->next, list);
1112}
1113
1114extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
1115 struct sk_buff_head *list);
1116
1117static inline void __skb_queue_before(struct sk_buff_head *list,
1118 struct sk_buff *next,
1119 struct sk_buff *newsk)
1120{
1121 __skb_insert(newsk, next->prev, next, list);
1122}
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
1135static inline void __skb_queue_head(struct sk_buff_head *list,
1136 struct sk_buff *newsk)
1137{
1138 __skb_queue_after(list, (struct sk_buff *)list, newsk);
1139}
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
1152static inline void __skb_queue_tail(struct sk_buff_head *list,
1153 struct sk_buff *newsk)
1154{
1155 __skb_queue_before(list, (struct sk_buff *)list, newsk);
1156}
1157
1158
1159
1160
1161
1162extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
1163static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
1164{
1165 struct sk_buff *next, *prev;
1166
1167 list->qlen--;
1168 next = skb->next;
1169 prev = skb->prev;
1170 skb->next = skb->prev = NULL;
1171 next->prev = prev;
1172 prev->next = next;
1173}
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
1184static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
1185{
1186 struct sk_buff *skb = skb_peek(list);
1187 if (skb)
1188 __skb_unlink(skb, list);
1189 return skb;
1190}
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
1201static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
1202{
1203 struct sk_buff *skb = skb_peek_tail(list);
1204 if (skb)
1205 __skb_unlink(skb, list);
1206 return skb;
1207}
1208
1209
1210static inline bool skb_is_nonlinear(const struct sk_buff *skb)
1211{
1212 return skb->data_len;
1213}
1214
1215static inline unsigned int skb_headlen(const struct sk_buff *skb)
1216{
1217 return skb->len - skb->data_len;
1218}
1219
1220static inline int skb_pagelen(const struct sk_buff *skb)
1221{
1222 int i, len = 0;
1223
1224 for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
1225 len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
1226 return len + skb_headlen(skb);
1227}
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
1243 struct page *page, int off, int size)
1244{
1245 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256 if (page->pfmemalloc && !page->mapping)
1257 skb->pfmemalloc = true;
1258 frag->page.p = page;
1259 frag->page_offset = off;
1260 skb_frag_size_set(frag, size);
1261}
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
1278 struct page *page, int off, int size)
1279{
1280 __skb_fill_page_desc(skb, i, page, off, size);
1281 skb_shinfo(skb)->nr_frags = i + 1;
1282}
1283
1284extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page,
1285 int off, int size, unsigned int truesize);
1286
1287#define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags)
1288#define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb))
1289#define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb))
1290
1291#ifdef NET_SKBUFF_DATA_USES_OFFSET
1292static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
1293{
1294 return skb->head + skb->tail;
1295}
1296
1297static inline void skb_reset_tail_pointer(struct sk_buff *skb)
1298{
1299 skb->tail = skb->data - skb->head;
1300}
1301
1302static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
1303{
1304 skb_reset_tail_pointer(skb);
1305 skb->tail += offset;
1306}
1307#else
1308static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
1309{
1310 return skb->tail;
1311}
1312
1313static inline void skb_reset_tail_pointer(struct sk_buff *skb)
1314{
1315 skb->tail = skb->data;
1316}
1317
1318static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
1319{
1320 skb->tail = skb->data + offset;
1321}
1322
1323#endif
1324
1325
1326
1327
1328extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
1329static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
1330{
1331 unsigned char *tmp = skb_tail_pointer(skb);
1332 SKB_LINEAR_ASSERT(skb);
1333 skb->tail += len;
1334 skb->len += len;
1335 return tmp;
1336}
1337
1338extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
1339static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
1340{
1341 skb->data -= len;
1342 skb->len += len;
1343 return skb->data;
1344}
1345
1346extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
1347static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
1348{
1349 skb->len -= len;
1350 BUG_ON(skb->len < skb->data_len);
1351 return skb->data += len;
1352}
1353
1354static inline unsigned char *skb_pull_inline(struct sk_buff *skb, unsigned int len)
1355{
1356 return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
1357}
1358
1359extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
1360
1361static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
1362{
1363 if (len > skb_headlen(skb) &&
1364 !__pskb_pull_tail(skb, len - skb_headlen(skb)))
1365 return NULL;
1366 skb->len -= len;
1367 return skb->data += len;
1368}
1369
1370static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
1371{
1372 return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
1373}
1374
1375static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
1376{
1377 if (likely(len <= skb_headlen(skb)))
1378 return 1;
1379 if (unlikely(len > skb->len))
1380 return 0;
1381 return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
1382}
1383
1384
1385
1386
1387
1388
1389
1390static inline unsigned int skb_headroom(const struct sk_buff *skb)
1391{
1392 return skb->data - skb->head;
1393}
1394
1395
1396
1397
1398
1399
1400
1401static inline int skb_tailroom(const struct sk_buff *skb)
1402{
1403 return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
1404}
1405
1406
1407
1408
1409
1410
1411
1412
1413static inline int skb_availroom(const struct sk_buff *skb)
1414{
1415 return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len;
1416}
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426static inline void skb_reserve(struct sk_buff *skb, int len)
1427{
1428 skb->data += len;
1429 skb->tail += len;
1430}
1431
1432static inline void skb_reset_mac_len(struct sk_buff *skb)
1433{
1434 skb->mac_len = skb->network_header - skb->mac_header;
1435}
1436
1437#ifdef NET_SKBUFF_DATA_USES_OFFSET
1438static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1439{
1440 return skb->head + skb->transport_header;
1441}
1442
1443static inline void skb_reset_transport_header(struct sk_buff *skb)
1444{
1445 skb->transport_header = skb->data - skb->head;
1446}
1447
1448static inline void skb_set_transport_header(struct sk_buff *skb,
1449 const int offset)
1450{
1451 skb_reset_transport_header(skb);
1452 skb->transport_header += offset;
1453}
1454
1455static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1456{
1457 return skb->head + skb->network_header;
1458}
1459
1460static inline void skb_reset_network_header(struct sk_buff *skb)
1461{
1462 skb->network_header = skb->data - skb->head;
1463}
1464
1465static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1466{
1467 skb_reset_network_header(skb);
1468 skb->network_header += offset;
1469}
1470
1471static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1472{
1473 return skb->head + skb->mac_header;
1474}
1475
1476static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1477{
1478 return skb->mac_header != ~0U;
1479}
1480
1481static inline void skb_reset_mac_header(struct sk_buff *skb)
1482{
1483 skb->mac_header = skb->data - skb->head;
1484}
1485
1486static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1487{
1488 skb_reset_mac_header(skb);
1489 skb->mac_header += offset;
1490}
1491
1492#else
1493
1494static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1495{
1496 return skb->transport_header;
1497}
1498
1499static inline void skb_reset_transport_header(struct sk_buff *skb)
1500{
1501 skb->transport_header = skb->data;
1502}
1503
1504static inline void skb_set_transport_header(struct sk_buff *skb,
1505 const int offset)
1506{
1507 skb->transport_header = skb->data + offset;
1508}
1509
1510static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1511{
1512 return skb->network_header;
1513}
1514
1515static inline void skb_reset_network_header(struct sk_buff *skb)
1516{
1517 skb->network_header = skb->data;
1518}
1519
1520static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1521{
1522 skb->network_header = skb->data + offset;
1523}
1524
1525static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1526{
1527 return skb->mac_header;
1528}
1529
1530static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1531{
1532 return skb->mac_header != NULL;
1533}
1534
1535static inline void skb_reset_mac_header(struct sk_buff *skb)
1536{
1537 skb->mac_header = skb->data;
1538}
1539
1540static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1541{
1542 skb->mac_header = skb->data + offset;
1543}
1544#endif
1545
1546static inline void skb_mac_header_rebuild(struct sk_buff *skb)
1547{
1548 if (skb_mac_header_was_set(skb)) {
1549 const unsigned char *old_mac = skb_mac_header(skb);
1550
1551 skb_set_mac_header(skb, -skb->mac_len);
1552 memmove(skb_mac_header(skb), old_mac, skb->mac_len);
1553 }
1554}
1555
1556static inline int skb_checksum_start_offset(const struct sk_buff *skb)
1557{
1558 return skb->csum_start - skb_headroom(skb);
1559}
1560
1561static inline int skb_transport_offset(const struct sk_buff *skb)
1562{
1563 return skb_transport_header(skb) - skb->data;
1564}
1565
1566static inline u32 skb_network_header_len(const struct sk_buff *skb)
1567{
1568 return skb->transport_header - skb->network_header;
1569}
1570
1571static inline int skb_network_offset(const struct sk_buff *skb)
1572{
1573 return skb_network_header(skb) - skb->data;
1574}
1575
1576static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)
1577{
1578 return pskb_may_pull(skb, skb_network_offset(skb) + len);
1579}
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601#ifndef NET_IP_ALIGN
1602#define NET_IP_ALIGN 2
1603#endif
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625#ifndef NET_SKB_PAD
1626#define NET_SKB_PAD max(32, L1_CACHE_BYTES)
1627#endif
1628
1629extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1630
1631static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
1632{
1633 if (unlikely(skb_is_nonlinear(skb))) {
1634 WARN_ON(1);
1635 return;
1636 }
1637 skb->len = len;
1638 skb_set_tail_pointer(skb, len);
1639}
1640
1641extern void skb_trim(struct sk_buff *skb, unsigned int len);
1642
1643static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
1644{
1645 if (skb->data_len)
1646 return ___pskb_trim(skb, len);
1647 __skb_trim(skb, len);
1648 return 0;
1649}
1650
1651static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
1652{
1653 return (len < skb->len) ? __pskb_trim(skb, len) : 0;
1654}
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
1666{
1667 int err = pskb_trim(skb, len);
1668 BUG_ON(err);
1669}
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679static inline void skb_orphan(struct sk_buff *skb)
1680{
1681 if (skb->destructor)
1682 skb->destructor(skb);
1683 skb->destructor = NULL;
1684 skb->sk = NULL;
1685}
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696static inline int skb_orphan_frags(struct sk_buff *skb, gfp_t gfp_mask)
1697{
1698 if (likely(!(skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY)))
1699 return 0;
1700 return skb_copy_ubufs(skb, gfp_mask);
1701}
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711extern void skb_queue_purge(struct sk_buff_head *list);
1712static inline void __skb_queue_purge(struct sk_buff_head *list)
1713{
1714 struct sk_buff *skb;
1715 while ((skb = __skb_dequeue(list)) != NULL)
1716 kfree_skb(skb);
1717}
1718
1719extern void *netdev_alloc_frag(unsigned int fragsz);
1720
1721extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
1722 unsigned int length,
1723 gfp_t gfp_mask);
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
1739 unsigned int length)
1740{
1741 return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
1742}
1743
1744
1745static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
1746 gfp_t gfp_mask)
1747{
1748 return __netdev_alloc_skb(NULL, length, gfp_mask);
1749}
1750
1751
1752static inline struct sk_buff *dev_alloc_skb(unsigned int length)
1753{
1754 return netdev_alloc_skb(NULL, length);
1755}
1756
1757
1758static inline struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev,
1759 unsigned int length, gfp_t gfp)
1760{
1761 struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp);
1762
1763 if (NET_IP_ALIGN && skb)
1764 skb_reserve(skb, NET_IP_ALIGN);
1765 return skb;
1766}
1767
1768static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
1769 unsigned int length)
1770{
1771 return __netdev_alloc_skb_ip_align(dev, length, GFP_ATOMIC);
1772}
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784static inline struct page *__skb_alloc_pages(gfp_t gfp_mask,
1785 struct sk_buff *skb,
1786 unsigned int order)
1787{
1788 struct page *page;
1789
1790 gfp_mask |= __GFP_COLD;
1791
1792 if (!(gfp_mask & __GFP_NOMEMALLOC))
1793 gfp_mask |= __GFP_MEMALLOC;
1794
1795 page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, order);
1796 if (skb && page && page->pfmemalloc)
1797 skb->pfmemalloc = true;
1798
1799 return page;
1800}
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811static inline struct page *__skb_alloc_page(gfp_t gfp_mask,
1812 struct sk_buff *skb)
1813{
1814 return __skb_alloc_pages(gfp_mask, skb, 0);
1815}
1816
1817
1818
1819
1820
1821
1822static inline void skb_propagate_pfmemalloc(struct page *page,
1823 struct sk_buff *skb)
1824{
1825 if (page && page->pfmemalloc)
1826 skb->pfmemalloc = true;
1827}
1828
1829
1830
1831
1832
1833
1834
1835static inline struct page *skb_frag_page(const skb_frag_t *frag)
1836{
1837 return frag->page.p;
1838}
1839
1840
1841
1842
1843
1844
1845
1846static inline void __skb_frag_ref(skb_frag_t *frag)
1847{
1848 get_page(skb_frag_page(frag));
1849}
1850
1851
1852
1853
1854
1855
1856
1857
1858static inline void skb_frag_ref(struct sk_buff *skb, int f)
1859{
1860 __skb_frag_ref(&skb_shinfo(skb)->frags[f]);
1861}
1862
1863
1864
1865
1866
1867
1868
1869static inline void __skb_frag_unref(skb_frag_t *frag)
1870{
1871 put_page(skb_frag_page(frag));
1872}
1873
1874
1875
1876
1877
1878
1879
1880
1881static inline void skb_frag_unref(struct sk_buff *skb, int f)
1882{
1883 __skb_frag_unref(&skb_shinfo(skb)->frags[f]);
1884}
1885
1886
1887
1888
1889
1890
1891
1892
1893static inline void *skb_frag_address(const skb_frag_t *frag)
1894{
1895 return page_address(skb_frag_page(frag)) + frag->page_offset;
1896}
1897
1898
1899
1900
1901
1902
1903
1904
1905static inline void *skb_frag_address_safe(const skb_frag_t *frag)
1906{
1907 void *ptr = page_address(skb_frag_page(frag));
1908 if (unlikely(!ptr))
1909 return NULL;
1910
1911 return ptr + frag->page_offset;
1912}
1913
1914
1915
1916
1917
1918
1919
1920
1921static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page)
1922{
1923 frag->page.p = page;
1924}
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934static inline void skb_frag_set_page(struct sk_buff *skb, int f,
1935 struct page *page)
1936{
1937 __skb_frag_set_page(&skb_shinfo(skb)->frags[f], page);
1938}
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951static inline dma_addr_t skb_frag_dma_map(struct device *dev,
1952 const skb_frag_t *frag,
1953 size_t offset, size_t size,
1954 enum dma_data_direction dir)
1955{
1956 return dma_map_page(dev, skb_frag_page(frag),
1957 frag->page_offset + offset, size, dir);
1958}
1959
1960static inline struct sk_buff *pskb_copy(struct sk_buff *skb,
1961 gfp_t gfp_mask)
1962{
1963 return __pskb_copy(skb, skb_headroom(skb), gfp_mask);
1964}
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974static inline int skb_clone_writable(const struct sk_buff *skb, unsigned int len)
1975{
1976 return !skb_header_cloned(skb) &&
1977 skb_headroom(skb) + len <= skb->hdr_len;
1978}
1979
1980static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
1981 int cloned)
1982{
1983 int delta = 0;
1984
1985 if (headroom > skb_headroom(skb))
1986 delta = headroom - skb_headroom(skb);
1987
1988 if (delta || cloned)
1989 return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
1990 GFP_ATOMIC);
1991 return 0;
1992}
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
2007{
2008 return __skb_cow(skb, headroom, skb_cloned(skb));
2009}
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021static inline int skb_cow_head(struct sk_buff *skb, unsigned int headroom)
2022{
2023 return __skb_cow(skb, headroom, skb_header_cloned(skb));
2024}
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037static inline int skb_padto(struct sk_buff *skb, unsigned int len)
2038{
2039 unsigned int size = skb->len;
2040 if (likely(size >= len))
2041 return 0;
2042 return skb_pad(skb, len - size);
2043}
2044
2045static inline int skb_add_data(struct sk_buff *skb,
2046 char __user *from, int copy)
2047{
2048 const int off = skb->len;
2049
2050 if (skb->ip_summed == CHECKSUM_NONE) {
2051 int err = 0;
2052 __wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
2053 copy, 0, &err);
2054 if (!err) {
2055 skb->csum = csum_block_add(skb->csum, csum, off);
2056 return 0;
2057 }
2058 } else if (!copy_from_user(skb_put(skb, copy), from, copy))
2059 return 0;
2060
2061 __skb_trim(skb, off);
2062 return -EFAULT;
2063}
2064
2065static inline bool skb_can_coalesce(struct sk_buff *skb, int i,
2066 const struct page *page, int off)
2067{
2068 if (i) {
2069 const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
2070
2071 return page == skb_frag_page(frag) &&
2072 off == frag->page_offset + skb_frag_size(frag);
2073 }
2074 return false;
2075}
2076
2077static inline int __skb_linearize(struct sk_buff *skb)
2078{
2079 return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
2080}
2081
2082
2083
2084
2085
2086
2087
2088
2089static inline int skb_linearize(struct sk_buff *skb)
2090{
2091 return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
2092}
2093
2094
2095
2096
2097
2098
2099
2100
2101static inline int skb_linearize_cow(struct sk_buff *skb)
2102{
2103 return skb_is_nonlinear(skb) || skb_cloned(skb) ?
2104 __skb_linearize(skb) : 0;
2105}
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118static inline void skb_postpull_rcsum(struct sk_buff *skb,
2119 const void *start, unsigned int len)
2120{
2121 if (skb->ip_summed == CHECKSUM_COMPLETE)
2122 skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
2123}
2124
2125unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
2137{
2138 if (likely(len >= skb->len))
2139 return 0;
2140 if (skb->ip_summed == CHECKSUM_COMPLETE)
2141 skb->ip_summed = CHECKSUM_NONE;
2142 return __pskb_trim(skb, len);
2143}
2144
2145#define skb_queue_walk(queue, skb) \
2146 for (skb = (queue)->next; \
2147 skb != (struct sk_buff *)(queue); \
2148 skb = skb->next)
2149
2150#define skb_queue_walk_safe(queue, skb, tmp) \
2151 for (skb = (queue)->next, tmp = skb->next; \
2152 skb != (struct sk_buff *)(queue); \
2153 skb = tmp, tmp = skb->next)
2154
2155#define skb_queue_walk_from(queue, skb) \
2156 for (; skb != (struct sk_buff *)(queue); \
2157 skb = skb->next)
2158
2159#define skb_queue_walk_from_safe(queue, skb, tmp) \
2160 for (tmp = skb->next; \
2161 skb != (struct sk_buff *)(queue); \
2162 skb = tmp, tmp = skb->next)
2163
2164#define skb_queue_reverse_walk(queue, skb) \
2165 for (skb = (queue)->prev; \
2166 skb != (struct sk_buff *)(queue); \
2167 skb = skb->prev)
2168
2169#define skb_queue_reverse_walk_safe(queue, skb, tmp) \
2170 for (skb = (queue)->prev, tmp = skb->prev; \
2171 skb != (struct sk_buff *)(queue); \
2172 skb = tmp, tmp = skb->prev)
2173
2174#define skb_queue_reverse_walk_from_safe(queue, skb, tmp) \
2175 for (tmp = skb->prev; \
2176 skb != (struct sk_buff *)(queue); \
2177 skb = tmp, tmp = skb->prev)
2178
2179static inline bool skb_has_frag_list(const struct sk_buff *skb)
2180{
2181 return skb_shinfo(skb)->frag_list != NULL;
2182}
2183
2184static inline void skb_frag_list_init(struct sk_buff *skb)
2185{
2186 skb_shinfo(skb)->frag_list = NULL;
2187}
2188
2189static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag)
2190{
2191 frag->next = skb_shinfo(skb)->frag_list;
2192 skb_shinfo(skb)->frag_list = frag;
2193}
2194
2195#define skb_walk_frags(skb, iter) \
2196 for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next)
2197
2198extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
2199 int *peeked, int *off, int *err);
2200extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
2201 int noblock, int *err);
2202extern unsigned int datagram_poll(struct file *file, struct socket *sock,
2203 struct poll_table_struct *wait);
2204extern int skb_copy_datagram_iovec(const struct sk_buff *from,
2205 int offset, struct iovec *to,
2206 int size);
2207extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
2208 int hlen,
2209 struct iovec *iov);
2210extern int skb_copy_datagram_from_iovec(struct sk_buff *skb,
2211 int offset,
2212 const struct iovec *from,
2213 int from_offset,
2214 int len);
2215extern int skb_copy_datagram_const_iovec(const struct sk_buff *from,
2216 int offset,
2217 const struct iovec *to,
2218 int to_offset,
2219 int size);
2220extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
2221extern void skb_free_datagram_locked(struct sock *sk,
2222 struct sk_buff *skb);
2223extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
2224 unsigned int flags);
2225extern __wsum skb_checksum(const struct sk_buff *skb, int offset,
2226 int len, __wsum csum);
2227extern int skb_copy_bits(const struct sk_buff *skb, int offset,
2228 void *to, int len);
2229extern int skb_store_bits(struct sk_buff *skb, int offset,
2230 const void *from, int len);
2231extern __wsum skb_copy_and_csum_bits(const struct sk_buff *skb,
2232 int offset, u8 *to, int len,
2233 __wsum csum);
2234extern int skb_splice_bits(struct sk_buff *skb,
2235 unsigned int offset,
2236 struct pipe_inode_info *pipe,
2237 unsigned int len,
2238 unsigned int flags);
2239extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
2240extern void skb_split(struct sk_buff *skb,
2241 struct sk_buff *skb1, const u32 len);
2242extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
2243 int shiftlen);
2244
2245extern struct sk_buff *skb_segment(struct sk_buff *skb,
2246 netdev_features_t features);
2247
2248static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
2249 int len, void *buffer)
2250{
2251 int hlen = skb_headlen(skb);
2252
2253 if (hlen - offset >= len)
2254 return skb->data + offset;
2255
2256 if (skb_copy_bits(skb, offset, buffer, len) < 0)
2257 return NULL;
2258
2259 return buffer;
2260}
2261
2262static inline void skb_copy_from_linear_data(const struct sk_buff *skb,
2263 void *to,
2264 const unsigned int len)
2265{
2266 memcpy(to, skb->data, len);
2267}
2268
2269static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb,
2270 const int offset, void *to,
2271 const unsigned int len)
2272{
2273 memcpy(to, skb->data + offset, len);
2274}
2275
2276static inline void skb_copy_to_linear_data(struct sk_buff *skb,
2277 const void *from,
2278 const unsigned int len)
2279{
2280 memcpy(skb->data, from, len);
2281}
2282
2283static inline void skb_copy_to_linear_data_offset(struct sk_buff *skb,
2284 const int offset,
2285 const void *from,
2286 const unsigned int len)
2287{
2288 memcpy(skb->data + offset, from, len);
2289}
2290
2291extern void skb_init(void);
2292
2293static inline ktime_t skb_get_ktime(const struct sk_buff *skb)
2294{
2295 return skb->tstamp;
2296}
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307static inline void skb_get_timestamp(const struct sk_buff *skb,
2308 struct timeval *stamp)
2309{
2310 *stamp = ktime_to_timeval(skb->tstamp);
2311}
2312
2313static inline void skb_get_timestampns(const struct sk_buff *skb,
2314 struct timespec *stamp)
2315{
2316 *stamp = ktime_to_timespec(skb->tstamp);
2317}
2318
2319static inline void __net_timestamp(struct sk_buff *skb)
2320{
2321 skb->tstamp = ktime_get_real();
2322}
2323
2324static inline ktime_t net_timedelta(ktime_t t)
2325{
2326 return ktime_sub(ktime_get_real(), t);
2327}
2328
2329static inline ktime_t net_invalid_timestamp(void)
2330{
2331 return ktime_set(0, 0);
2332}
2333
2334extern void skb_timestamping_init(void);
2335
2336#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
2337
2338extern void skb_clone_tx_timestamp(struct sk_buff *skb);
2339extern bool skb_defer_rx_timestamp(struct sk_buff *skb);
2340
2341#else
2342
2343static inline void skb_clone_tx_timestamp(struct sk_buff *skb)
2344{
2345}
2346
2347static inline bool skb_defer_rx_timestamp(struct sk_buff *skb)
2348{
2349 return false;
2350}
2351
2352#endif
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366void skb_complete_tx_timestamp(struct sk_buff *skb,
2367 struct skb_shared_hwtstamps *hwtstamps);
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380extern void skb_tstamp_tx(struct sk_buff *orig_skb,
2381 struct skb_shared_hwtstamps *hwtstamps);
2382
2383static inline void sw_tx_timestamp(struct sk_buff *skb)
2384{
2385 if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP &&
2386 !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS))
2387 skb_tstamp_tx(skb, NULL);
2388}
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398static inline void skb_tx_timestamp(struct sk_buff *skb)
2399{
2400 skb_clone_tx_timestamp(skb);
2401 sw_tx_timestamp(skb);
2402}
2403
2404
2405
2406
2407
2408
2409
2410
2411void skb_complete_wifi_ack(struct sk_buff *skb, bool acked);
2412
2413extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
2414extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
2415
2416static inline int skb_csum_unnecessary(const struct sk_buff *skb)
2417{
2418 return skb->ip_summed & CHECKSUM_UNNECESSARY;
2419}
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437static inline __sum16 skb_checksum_complete(struct sk_buff *skb)
2438{
2439 return skb_csum_unnecessary(skb) ?
2440 0 : __skb_checksum_complete(skb);
2441}
2442
2443#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2444extern void nf_conntrack_destroy(struct nf_conntrack *nfct);
2445static inline void nf_conntrack_put(struct nf_conntrack *nfct)
2446{
2447 if (nfct && atomic_dec_and_test(&nfct->use))
2448 nf_conntrack_destroy(nfct);
2449}
2450static inline void nf_conntrack_get(struct nf_conntrack *nfct)
2451{
2452 if (nfct)
2453 atomic_inc(&nfct->use);
2454}
2455#endif
2456#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2457static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
2458{
2459 if (skb)
2460 atomic_inc(&skb->users);
2461}
2462static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
2463{
2464 if (skb)
2465 kfree_skb(skb);
2466}
2467#endif
2468#ifdef CONFIG_BRIDGE_NETFILTER
2469static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
2470{
2471 if (nf_bridge && atomic_dec_and_test(&nf_bridge->use))
2472 kfree(nf_bridge);
2473}
2474static inline void nf_bridge_get(struct nf_bridge_info *nf_bridge)
2475{
2476 if (nf_bridge)
2477 atomic_inc(&nf_bridge->use);
2478}
2479#endif
2480static inline void nf_reset(struct sk_buff *skb)
2481{
2482#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2483 nf_conntrack_put(skb->nfct);
2484 skb->nfct = NULL;
2485#endif
2486#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2487 nf_conntrack_put_reasm(skb->nfct_reasm);
2488 skb->nfct_reasm = NULL;
2489#endif
2490#ifdef CONFIG_BRIDGE_NETFILTER
2491 nf_bridge_put(skb->nf_bridge);
2492 skb->nf_bridge = NULL;
2493#endif
2494}
2495
2496
2497static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
2498{
2499#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2500 dst->nfct = src->nfct;
2501 nf_conntrack_get(src->nfct);
2502 dst->nfctinfo = src->nfctinfo;
2503#endif
2504#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2505 dst->nfct_reasm = src->nfct_reasm;
2506 nf_conntrack_get_reasm(src->nfct_reasm);
2507#endif
2508#ifdef CONFIG_BRIDGE_NETFILTER
2509 dst->nf_bridge = src->nf_bridge;
2510 nf_bridge_get(src->nf_bridge);
2511#endif
2512}
2513
2514static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
2515{
2516#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2517 nf_conntrack_put(dst->nfct);
2518#endif
2519#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
2520 nf_conntrack_put_reasm(dst->nfct_reasm);
2521#endif
2522#ifdef CONFIG_BRIDGE_NETFILTER
2523 nf_bridge_put(dst->nf_bridge);
2524#endif
2525 __nf_copy(dst, src);
2526}
2527
2528#ifdef CONFIG_NETWORK_SECMARK
2529static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
2530{
2531 to->secmark = from->secmark;
2532}
2533
2534static inline void skb_init_secmark(struct sk_buff *skb)
2535{
2536 skb->secmark = 0;
2537}
2538#else
2539static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
2540{ }
2541
2542static inline void skb_init_secmark(struct sk_buff *skb)
2543{ }
2544#endif
2545
2546static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping)
2547{
2548 skb->queue_mapping = queue_mapping;
2549}
2550
2551static inline u16 skb_get_queue_mapping(const struct sk_buff *skb)
2552{
2553 return skb->queue_mapping;
2554}
2555
2556static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
2557{
2558 to->queue_mapping = from->queue_mapping;
2559}
2560
2561static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue)
2562{
2563 skb->queue_mapping = rx_queue + 1;
2564}
2565
2566static inline u16 skb_get_rx_queue(const struct sk_buff *skb)
2567{
2568 return skb->queue_mapping - 1;
2569}
2570
2571static inline bool skb_rx_queue_recorded(const struct sk_buff *skb)
2572{
2573 return skb->queue_mapping != 0;
2574}
2575
2576extern u16 __skb_tx_hash(const struct net_device *dev,
2577 const struct sk_buff *skb,
2578 unsigned int num_tx_queues);
2579
2580#ifdef CONFIG_XFRM
2581static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
2582{
2583 return skb->sp;
2584}
2585#else
2586static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
2587{
2588 return NULL;
2589}
2590#endif
2591
2592static inline bool skb_is_gso(const struct sk_buff *skb)
2593{
2594 return skb_shinfo(skb)->gso_size;
2595}
2596
2597static inline bool skb_is_gso_v6(const struct sk_buff *skb)
2598{
2599 return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
2600}
2601
2602extern void __skb_warn_lro_forwarding(const struct sk_buff *skb);
2603
2604static inline bool skb_warn_if_lro(const struct sk_buff *skb)
2605{
2606
2607
2608 const struct skb_shared_info *shinfo = skb_shinfo(skb);
2609
2610 if (skb_is_nonlinear(skb) && shinfo->gso_size != 0 &&
2611 unlikely(shinfo->gso_type == 0)) {
2612 __skb_warn_lro_forwarding(skb);
2613 return true;
2614 }
2615 return false;
2616}
2617
2618static inline void skb_forward_csum(struct sk_buff *skb)
2619{
2620
2621 if (skb->ip_summed == CHECKSUM_COMPLETE)
2622 skb->ip_summed = CHECKSUM_NONE;
2623}
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633static inline void skb_checksum_none_assert(const struct sk_buff *skb)
2634{
2635#ifdef DEBUG
2636 BUG_ON(skb->ip_summed != CHECKSUM_NONE);
2637#endif
2638}
2639
2640bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651static inline bool skb_head_is_locked(const struct sk_buff *skb)
2652{
2653 return !skb->head_frag || skb_cloned(skb);
2654}
2655#endif
2656#endif
2657