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