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