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
251struct sk_buff {
252
253 struct sk_buff *next;
254 struct sk_buff *prev;
255
256 struct sock *sk;
257 ktime_t tstamp;
258 struct net_device *dev;
259
260 union {
261 struct dst_entry *dst;
262 struct rtable *rtable;
263 };
264 struct sec_path *sp;
265
266
267
268
269
270
271
272 char cb[48];
273
274 unsigned int len,
275 data_len;
276 __u16 mac_len,
277 hdr_len;
278 union {
279 __wsum csum;
280 struct {
281 __u16 csum_start;
282 __u16 csum_offset;
283 };
284 };
285 __u32 priority;
286 __u8 local_df:1,
287 cloned:1,
288 ip_summed:2,
289 nohdr:1,
290 nfctinfo:3;
291 __u8 pkt_type:3,
292 fclone:2,
293 ipvs_property:1,
294 peeked:1,
295 nf_trace:1;
296 __be16 protocol;
297
298 void (*destructor)(struct sk_buff *skb);
299#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
300 struct nf_conntrack *nfct;
301 struct sk_buff *nfct_reasm;
302#endif
303#ifdef CONFIG_BRIDGE_NETFILTER
304 struct nf_bridge_info *nf_bridge;
305#endif
306
307 int iif;
308#ifdef CONFIG_NETDEVICES_MULTIQUEUE
309 __u16 queue_mapping;
310#endif
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
321
322#ifdef CONFIG_NET_DMA
323 dma_cookie_t dma_cookie;
324#endif
325#ifdef CONFIG_NETWORK_SECMARK
326 __u32 secmark;
327#endif
328
329 __u32 mark;
330
331 sk_buff_data_t transport_header;
332 sk_buff_data_t network_header;
333 sk_buff_data_t mac_header;
334
335 sk_buff_data_t tail;
336 sk_buff_data_t end;
337 unsigned char *head,
338 *data;
339 unsigned int truesize;
340 atomic_t users;
341};
342
343#ifdef __KERNEL__
344
345
346
347#include <linux/slab.h>
348
349#include <asm/system.h>
350
351extern void kfree_skb(struct sk_buff *skb);
352extern void __kfree_skb(struct sk_buff *skb);
353extern struct sk_buff *__alloc_skb(unsigned int size,
354 gfp_t priority, int fclone, int node);
355static inline struct sk_buff *alloc_skb(unsigned int size,
356 gfp_t priority)
357{
358 return __alloc_skb(size, priority, 0, -1);
359}
360
361static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
362 gfp_t priority)
363{
364 return __alloc_skb(size, priority, 1, -1);
365}
366
367extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
368extern struct sk_buff *skb_clone(struct sk_buff *skb,
369 gfp_t priority);
370extern struct sk_buff *skb_copy(const struct sk_buff *skb,
371 gfp_t priority);
372extern struct sk_buff *pskb_copy(struct sk_buff *skb,
373 gfp_t gfp_mask);
374extern int pskb_expand_head(struct sk_buff *skb,
375 int nhead, int ntail,
376 gfp_t gfp_mask);
377extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb,
378 unsigned int headroom);
379extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
380 int newheadroom, int newtailroom,
381 gfp_t priority);
382extern int skb_to_sgvec(struct sk_buff *skb,
383 struct scatterlist *sg, int offset,
384 int len);
385extern int skb_cow_data(struct sk_buff *skb, int tailbits,
386 struct sk_buff **trailer);
387extern int skb_pad(struct sk_buff *skb, int pad);
388#define dev_kfree_skb(a) kfree_skb(a)
389extern void skb_over_panic(struct sk_buff *skb, int len,
390 void *here);
391extern void skb_under_panic(struct sk_buff *skb, int len,
392 void *here);
393extern void skb_truesize_bug(struct sk_buff *skb);
394
395static inline void skb_truesize_check(struct sk_buff *skb)
396{
397 int len = sizeof(struct sk_buff) + skb->len;
398
399 if (unlikely((int)skb->truesize < len))
400 skb_truesize_bug(skb);
401}
402
403extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
404 int getfrag(void *from, char *to, int offset,
405 int len,int odd, struct sk_buff *skb),
406 void *from, int length);
407
408struct skb_seq_state
409{
410 __u32 lower_offset;
411 __u32 upper_offset;
412 __u32 frag_idx;
413 __u32 stepped_offset;
414 struct sk_buff *root_skb;
415 struct sk_buff *cur_skb;
416 __u8 *frag_data;
417};
418
419extern void skb_prepare_seq_read(struct sk_buff *skb,
420 unsigned int from, unsigned int to,
421 struct skb_seq_state *st);
422extern unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
423 struct skb_seq_state *st);
424extern void skb_abort_seq_read(struct skb_seq_state *st);
425
426extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
427 unsigned int to, struct ts_config *config,
428 struct ts_state *state);
429
430#ifdef NET_SKBUFF_DATA_USES_OFFSET
431static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
432{
433 return skb->head + skb->end;
434}
435#else
436static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
437{
438 return skb->end;
439}
440#endif
441
442
443#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))
444
445
446
447
448
449
450
451static inline int skb_queue_empty(const struct sk_buff_head *list)
452{
453 return list->next == (struct sk_buff *)list;
454}
455
456
457
458
459
460
461
462
463static inline struct sk_buff *skb_get(struct sk_buff *skb)
464{
465 atomic_inc(&skb->users);
466 return skb;
467}
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482static inline int skb_cloned(const struct sk_buff *skb)
483{
484 return skb->cloned &&
485 (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;
486}
487
488
489
490
491
492
493
494
495static inline int skb_header_cloned(const struct sk_buff *skb)
496{
497 int dataref;
498
499 if (!skb->cloned)
500 return 0;
501
502 dataref = atomic_read(&skb_shinfo(skb)->dataref);
503 dataref = (dataref & SKB_DATAREF_MASK) - (dataref >> SKB_DATAREF_SHIFT);
504 return dataref != 1;
505}
506
507
508
509
510
511
512
513
514
515static inline void skb_header_release(struct sk_buff *skb)
516{
517 BUG_ON(skb->nohdr);
518 skb->nohdr = 1;
519 atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
520}
521
522
523
524
525
526
527
528
529static inline int skb_shared(const struct sk_buff *skb)
530{
531 return atomic_read(&skb->users) != 1;
532}
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547static inline struct sk_buff *skb_share_check(struct sk_buff *skb,
548 gfp_t pri)
549{
550 might_sleep_if(pri & __GFP_WAIT);
551 if (skb_shared(skb)) {
552 struct sk_buff *nskb = skb_clone(skb, pri);
553 kfree_skb(skb);
554 skb = nskb;
555 }
556 return skb;
557}
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
580 gfp_t pri)
581{
582 might_sleep_if(pri & __GFP_WAIT);
583 if (skb_cloned(skb)) {
584 struct sk_buff *nskb = skb_copy(skb, pri);
585 kfree_skb(skb);
586 skb = nskb;
587 }
588 return skb;
589}
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)
605{
606 struct sk_buff *list = ((struct sk_buff *)list_)->next;
607 if (list == (struct sk_buff *)list_)
608 list = NULL;
609 return list;
610}
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625static inline struct sk_buff *skb_peek_tail(struct sk_buff_head *list_)
626{
627 struct sk_buff *list = ((struct sk_buff *)list_)->prev;
628 if (list == (struct sk_buff *)list_)
629 list = NULL;
630 return list;
631}
632
633
634
635
636
637
638
639static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
640{
641 return list_->qlen;
642}
643
644
645
646
647
648
649
650
651
652static inline void skb_queue_head_init(struct sk_buff_head *list)
653{
654 spin_lock_init(&list->lock);
655 list->prev = list->next = (struct sk_buff *)list;
656 list->qlen = 0;
657}
658
659static inline void skb_queue_head_init_class(struct sk_buff_head *list,
660 struct lock_class_key *class)
661{
662 skb_queue_head_init(list);
663 lockdep_set_class(&list->lock, class);
664}
665
666
667
668
669
670
671
672extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
673static inline void __skb_insert(struct sk_buff *newsk,
674 struct sk_buff *prev, struct sk_buff *next,
675 struct sk_buff_head *list)
676{
677 newsk->next = next;
678 newsk->prev = prev;
679 next->prev = prev->next = newsk;
680 list->qlen++;
681}
682
683
684
685
686
687
688
689
690
691
692
693
694static inline void __skb_queue_after(struct sk_buff_head *list,
695 struct sk_buff *prev,
696 struct sk_buff *newsk)
697{
698 __skb_insert(newsk, prev, prev->next, list);
699}
700
701extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
702 struct sk_buff_head *list);
703
704static inline void __skb_queue_before(struct sk_buff_head *list,
705 struct sk_buff *next,
706 struct sk_buff *newsk)
707{
708 __skb_insert(newsk, next->prev, next, list);
709}
710
711
712
713
714
715
716
717
718
719
720
721extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
722static inline void __skb_queue_head(struct sk_buff_head *list,
723 struct sk_buff *newsk)
724{
725 __skb_queue_after(list, (struct sk_buff *)list, newsk);
726}
727
728
729
730
731
732
733
734
735
736
737
738extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
739static inline void __skb_queue_tail(struct sk_buff_head *list,
740 struct sk_buff *newsk)
741{
742 __skb_queue_before(list, (struct sk_buff *)list, newsk);
743}
744
745
746
747
748
749extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
750static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
751{
752 struct sk_buff *next, *prev;
753
754 list->qlen--;
755 next = skb->next;
756 prev = skb->prev;
757 skb->next = skb->prev = NULL;
758 next->prev = prev;
759 prev->next = next;
760}
761
762
763
764
765
766
767
768
769
770extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
771static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
772{
773 struct sk_buff *skb = skb_peek(list);
774 if (skb)
775 __skb_unlink(skb, list);
776 return skb;
777}
778
779
780
781
782
783
784
785
786
787extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
788static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
789{
790 struct sk_buff *skb = skb_peek_tail(list);
791 if (skb)
792 __skb_unlink(skb, list);
793 return skb;
794}
795
796
797static inline int skb_is_nonlinear(const struct sk_buff *skb)
798{
799 return skb->data_len;
800}
801
802static inline unsigned int skb_headlen(const struct sk_buff *skb)
803{
804 return skb->len - skb->data_len;
805}
806
807static inline int skb_pagelen(const struct sk_buff *skb)
808{
809 int i, len = 0;
810
811 for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
812 len += skb_shinfo(skb)->frags[i].size;
813 return len + skb_headlen(skb);
814}
815
816static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
817 struct page *page, int off, int size)
818{
819 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
820
821 frag->page = page;
822 frag->page_offset = off;
823 frag->size = size;
824 skb_shinfo(skb)->nr_frags = i + 1;
825}
826
827#define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags)
828#define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list)
829#define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb))
830
831#ifdef NET_SKBUFF_DATA_USES_OFFSET
832static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
833{
834 return skb->head + skb->tail;
835}
836
837static inline void skb_reset_tail_pointer(struct sk_buff *skb)
838{
839 skb->tail = skb->data - skb->head;
840}
841
842static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
843{
844 skb_reset_tail_pointer(skb);
845 skb->tail += offset;
846}
847#else
848static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
849{
850 return skb->tail;
851}
852
853static inline void skb_reset_tail_pointer(struct sk_buff *skb)
854{
855 skb->tail = skb->data;
856}
857
858static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
859{
860 skb->tail = skb->data + offset;
861}
862
863#endif
864
865
866
867
868extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
869static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
870{
871 unsigned char *tmp = skb_tail_pointer(skb);
872 SKB_LINEAR_ASSERT(skb);
873 skb->tail += len;
874 skb->len += len;
875 return tmp;
876}
877
878extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
879static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
880{
881 skb->data -= len;
882 skb->len += len;
883 return skb->data;
884}
885
886extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
887static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
888{
889 skb->len -= len;
890 BUG_ON(skb->len < skb->data_len);
891 return skb->data += len;
892}
893
894extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
895
896static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
897{
898 if (len > skb_headlen(skb) &&
899 !__pskb_pull_tail(skb, len-skb_headlen(skb)))
900 return NULL;
901 skb->len -= len;
902 return skb->data += len;
903}
904
905static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
906{
907 return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
908}
909
910static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
911{
912 if (likely(len <= skb_headlen(skb)))
913 return 1;
914 if (unlikely(len > skb->len))
915 return 0;
916 return __pskb_pull_tail(skb, len-skb_headlen(skb)) != NULL;
917}
918
919
920
921
922
923
924
925static inline unsigned int skb_headroom(const struct sk_buff *skb)
926{
927 return skb->data - skb->head;
928}
929
930
931
932
933
934
935
936static inline int skb_tailroom(const struct sk_buff *skb)
937{
938 return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
939}
940
941
942
943
944
945
946
947
948
949static inline void skb_reserve(struct sk_buff *skb, int len)
950{
951 skb->data += len;
952 skb->tail += len;
953}
954
955#ifdef NET_SKBUFF_DATA_USES_OFFSET
956static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
957{
958 return skb->head + skb->transport_header;
959}
960
961static inline void skb_reset_transport_header(struct sk_buff *skb)
962{
963 skb->transport_header = skb->data - skb->head;
964}
965
966static inline void skb_set_transport_header(struct sk_buff *skb,
967 const int offset)
968{
969 skb_reset_transport_header(skb);
970 skb->transport_header += offset;
971}
972
973static inline unsigned char *skb_network_header(const struct sk_buff *skb)
974{
975 return skb->head + skb->network_header;
976}
977
978static inline void skb_reset_network_header(struct sk_buff *skb)
979{
980 skb->network_header = skb->data - skb->head;
981}
982
983static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
984{
985 skb_reset_network_header(skb);
986 skb->network_header += offset;
987}
988
989static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
990{
991 return skb->head + skb->mac_header;
992}
993
994static inline int skb_mac_header_was_set(const struct sk_buff *skb)
995{
996 return skb->mac_header != ~0U;
997}
998
999static inline void skb_reset_mac_header(struct sk_buff *skb)
1000{
1001 skb->mac_header = skb->data - skb->head;
1002}
1003
1004static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1005{
1006 skb_reset_mac_header(skb);
1007 skb->mac_header += offset;
1008}
1009
1010#else
1011
1012static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
1013{
1014 return skb->transport_header;
1015}
1016
1017static inline void skb_reset_transport_header(struct sk_buff *skb)
1018{
1019 skb->transport_header = skb->data;
1020}
1021
1022static inline void skb_set_transport_header(struct sk_buff *skb,
1023 const int offset)
1024{
1025 skb->transport_header = skb->data + offset;
1026}
1027
1028static inline unsigned char *skb_network_header(const struct sk_buff *skb)
1029{
1030 return skb->network_header;
1031}
1032
1033static inline void skb_reset_network_header(struct sk_buff *skb)
1034{
1035 skb->network_header = skb->data;
1036}
1037
1038static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1039{
1040 skb->network_header = skb->data + offset;
1041}
1042
1043static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1044{
1045 return skb->mac_header;
1046}
1047
1048static inline int skb_mac_header_was_set(const struct sk_buff *skb)
1049{
1050 return skb->mac_header != NULL;
1051}
1052
1053static inline void skb_reset_mac_header(struct sk_buff *skb)
1054{
1055 skb->mac_header = skb->data;
1056}
1057
1058static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
1059{
1060 skb->mac_header = skb->data + offset;
1061}
1062#endif
1063
1064static inline int skb_transport_offset(const struct sk_buff *skb)
1065{
1066 return skb_transport_header(skb) - skb->data;
1067}
1068
1069static inline u32 skb_network_header_len(const struct sk_buff *skb)
1070{
1071 return skb->transport_header - skb->network_header;
1072}
1073
1074static inline int skb_network_offset(const struct sk_buff *skb)
1075{
1076 return skb_network_header(skb) - skb->data;
1077}
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099#ifndef NET_IP_ALIGN
1100#define NET_IP_ALIGN 2
1101#endif
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118#ifndef NET_SKB_PAD
1119#define NET_SKB_PAD 16
1120#endif
1121
1122extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1123
1124static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
1125{
1126 if (unlikely(skb->data_len)) {
1127 WARN_ON(1);
1128 return;
1129 }
1130 skb->len = len;
1131 skb_set_tail_pointer(skb, len);
1132}
1133
1134extern void skb_trim(struct sk_buff *skb, unsigned int len);
1135
1136static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
1137{
1138 if (skb->data_len)
1139 return ___pskb_trim(skb, len);
1140 __skb_trim(skb, len);
1141 return 0;
1142}
1143
1144static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
1145{
1146 return (len < skb->len) ? __pskb_trim(skb, len) : 0;
1147}
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
1159{
1160 int err = pskb_trim(skb, len);
1161 BUG_ON(err);
1162}
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172static inline void skb_orphan(struct sk_buff *skb)
1173{
1174 if (skb->destructor)
1175 skb->destructor(skb);
1176 skb->destructor = NULL;
1177 skb->sk = NULL;
1178}
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188extern void skb_queue_purge(struct sk_buff_head *list);
1189static inline void __skb_queue_purge(struct sk_buff_head *list)
1190{
1191 struct sk_buff *skb;
1192 while ((skb = __skb_dequeue(list)) != NULL)
1193 kfree_skb(skb);
1194}
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
1209 gfp_t gfp_mask)
1210{
1211 struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
1212 if (likely(skb))
1213 skb_reserve(skb, NET_SKB_PAD);
1214 return skb;
1215}
1216
1217extern struct sk_buff *dev_alloc_skb(unsigned int length);
1218
1219extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
1220 unsigned int length, gfp_t gfp_mask);
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
1236 unsigned int length)
1237{
1238 return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
1239}
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249static inline int skb_clone_writable(struct sk_buff *skb, unsigned int len)
1250{
1251 return !skb_header_cloned(skb) &&
1252 skb_headroom(skb) + len <= skb->hdr_len;
1253}
1254
1255static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
1256 int cloned)
1257{
1258 int delta = 0;
1259
1260 if (headroom < NET_SKB_PAD)
1261 headroom = NET_SKB_PAD;
1262 if (headroom > skb_headroom(skb))
1263 delta = headroom - skb_headroom(skb);
1264
1265 if (delta || cloned)
1266 return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
1267 GFP_ATOMIC);
1268 return 0;
1269}
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
1284{
1285 return __skb_cow(skb, headroom, skb_cloned(skb));
1286}
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298static inline int skb_cow_head(struct sk_buff *skb, unsigned int headroom)
1299{
1300 return __skb_cow(skb, headroom, skb_header_cloned(skb));
1301}
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314static inline int skb_padto(struct sk_buff *skb, unsigned int len)
1315{
1316 unsigned int size = skb->len;
1317 if (likely(size >= len))
1318 return 0;
1319 return skb_pad(skb, len-size);
1320}
1321
1322static inline int skb_add_data(struct sk_buff *skb,
1323 char __user *from, int copy)
1324{
1325 const int off = skb->len;
1326
1327 if (skb->ip_summed == CHECKSUM_NONE) {
1328 int err = 0;
1329 __wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
1330 copy, 0, &err);
1331 if (!err) {
1332 skb->csum = csum_block_add(skb->csum, csum, off);
1333 return 0;
1334 }
1335 } else if (!copy_from_user(skb_put(skb, copy), from, copy))
1336 return 0;
1337
1338 __skb_trim(skb, off);
1339 return -EFAULT;
1340}
1341
1342static inline int skb_can_coalesce(struct sk_buff *skb, int i,
1343 struct page *page, int off)
1344{
1345 if (i) {
1346 struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
1347
1348 return page == frag->page &&
1349 off == frag->page_offset + frag->size;
1350 }
1351 return 0;
1352}
1353
1354static inline int __skb_linearize(struct sk_buff *skb)
1355{
1356 return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
1357}
1358
1359
1360
1361
1362
1363
1364
1365
1366static inline int skb_linearize(struct sk_buff *skb)
1367{
1368 return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
1369}
1370
1371
1372
1373
1374
1375
1376
1377
1378static inline int skb_linearize_cow(struct sk_buff *skb)
1379{
1380 return skb_is_nonlinear(skb) || skb_cloned(skb) ?
1381 __skb_linearize(skb) : 0;
1382}
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395static inline void skb_postpull_rcsum(struct sk_buff *skb,
1396 const void *start, unsigned int len)
1397{
1398 if (skb->ip_summed == CHECKSUM_COMPLETE)
1399 skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
1400}
1401
1402unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1414{
1415 if (likely(len >= skb->len))
1416 return 0;
1417 if (skb->ip_summed == CHECKSUM_COMPLETE)
1418 skb->ip_summed = CHECKSUM_NONE;
1419 return __pskb_trim(skb, len);
1420}
1421
1422#define skb_queue_walk(queue, skb) \
1423 for (skb = (queue)->next; \
1424 prefetch(skb->next), (skb != (struct sk_buff *)(queue)); \
1425 skb = skb->next)
1426
1427#define skb_queue_walk_safe(queue, skb, tmp) \
1428 for (skb = (queue)->next, tmp = skb->next; \
1429 skb != (struct sk_buff *)(queue); \
1430 skb = tmp, tmp = skb->next)
1431
1432#define skb_queue_reverse_walk(queue, skb) \
1433 for (skb = (queue)->prev; \
1434 prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \
1435 skb = skb->prev)
1436
1437
1438extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
1439 int *peeked, int *err);
1440extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
1441 int noblock, int *err);
1442extern unsigned int datagram_poll(struct file *file, struct socket *sock,
1443 struct poll_table_struct *wait);
1444extern int skb_copy_datagram_iovec(const struct sk_buff *from,
1445 int offset, struct iovec *to,
1446 int size);
1447extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
1448 int hlen,
1449 struct iovec *iov);
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#ifdef CONFIG_NETDEVICES_MULTIQUEUE
1675 skb->queue_mapping = queue_mapping;
1676#endif
1677}
1678
1679static inline u16 skb_get_queue_mapping(struct sk_buff *skb)
1680{
1681#ifdef CONFIG_NETDEVICES_MULTIQUEUE
1682 return skb->queue_mapping;
1683#else
1684 return 0;
1685#endif
1686}
1687
1688static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
1689{
1690#ifdef CONFIG_NETDEVICES_MULTIQUEUE
1691 to->queue_mapping = from->queue_mapping;
1692#endif
1693}
1694
1695static inline int skb_is_gso(const struct sk_buff *skb)
1696{
1697 return skb_shinfo(skb)->gso_size;
1698}
1699
1700static inline int skb_is_gso_v6(const struct sk_buff *skb)
1701{
1702 return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
1703}
1704
1705static inline void skb_forward_csum(struct sk_buff *skb)
1706{
1707
1708 if (skb->ip_summed == CHECKSUM_COMPLETE)
1709 skb->ip_summed = CHECKSUM_NONE;
1710}
1711
1712bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
1713#endif
1714#endif
1715