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