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/mm.h>
26#include <linux/highmem.h>
27#include <linux/poll.h>
28#include <linux/net.h>
29#include <linux/textsearch.h>
30#include <net/checksum.h>
31#include <linux/dmaengine.h>
32
33#define HAVE_ALLOC_SKB
34#define HAVE_ALIGNABLE_SKB
35
36#define CHECKSUM_NONE 0
37#define CHECKSUM_HW 1
38#define CHECKSUM_UNNECESSARY 2
39
40#define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \
41 ~(SMP_CACHE_BYTES - 1))
42#define SKB_MAX_ORDER(X, ORDER) (((PAGE_SIZE << (ORDER)) - (X) - \
43 sizeof(struct skb_shared_info)) & \
44 ~(SMP_CACHE_BYTES - 1))
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
86struct net_device;
87
88#ifdef CONFIG_NETFILTER
89struct nf_conntrack {
90 atomic_t use;
91 void (*destroy)(struct nf_conntrack *);
92};
93
94#ifdef CONFIG_BRIDGE_NETFILTER
95struct nf_bridge_info {
96 atomic_t use;
97 struct net_device *physindev;
98 struct net_device *physoutdev;
99#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
100 struct net_device *netoutdev;
101#endif
102 unsigned int mask;
103 unsigned long data[32 / sizeof(unsigned long)];
104};
105#endif
106
107#endif
108
109struct sk_buff_head {
110
111 struct sk_buff *next;
112 struct sk_buff *prev;
113
114 __u32 qlen;
115 spinlock_t lock;
116};
117
118struct sk_buff;
119
120
121#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)
122
123typedef struct skb_frag_struct skb_frag_t;
124
125struct skb_frag_struct {
126 struct page *page;
127 __u16 page_offset;
128 __u16 size;
129};
130
131
132
133
134struct skb_shared_info {
135 atomic_t dataref;
136 unsigned short nr_frags;
137 unsigned short gso_size;
138
139 unsigned short gso_segs;
140 unsigned short gso_type;
141 unsigned int ip6_frag_id;
142 struct sk_buff *frag_list;
143 skb_frag_t frags[MAX_SKB_FRAGS];
144};
145
146
147
148
149
150
151
152
153
154
155
156
157#define SKB_DATAREF_SHIFT 16
158#define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)
159
160struct skb_timeval {
161 u32 off_sec;
162 u32 off_usec;
163};
164
165
166enum {
167 SKB_FCLONE_UNAVAILABLE,
168 SKB_FCLONE_ORIG,
169 SKB_FCLONE_CLONE,
170};
171
172enum {
173 SKB_GSO_TCPV4 = 1 << 0,
174 SKB_GSO_UDP = 1 << 1,
175
176
177 SKB_GSO_DODGY = 1 << 2,
178
179
180 SKB_GSO_TCP_ECN = 1 << 3,
181
182 SKB_GSO_TCPV6 = 1 << 4,
183};
184
185
186
187
188
189
190
191
192
193
194
195
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
231struct sk_buff {
232
233 struct sk_buff *next;
234 struct sk_buff *prev;
235
236 struct sock *sk;
237 struct skb_timeval tstamp;
238 struct net_device *dev;
239 struct net_device *input_dev;
240
241 union {
242 struct tcphdr *th;
243 struct udphdr *uh;
244 struct icmphdr *icmph;
245 struct igmphdr *igmph;
246 struct iphdr *ipiph;
247 struct ipv6hdr *ipv6h;
248 unsigned char *raw;
249 } h;
250
251 union {
252 struct iphdr *iph;
253 struct ipv6hdr *ipv6h;
254 struct arphdr *arph;
255 unsigned char *raw;
256 } nh;
257
258 union {
259 unsigned char *raw;
260 } mac;
261
262 struct dst_entry *dst;
263 struct sec_path *sp;
264
265
266
267
268
269
270
271 char cb[48];
272
273 unsigned int len,
274 data_len,
275 mac_len,
276 csum;
277 __u32 priority;
278 __u8 local_df:1,
279 cloned:1,
280 ip_summed:2,
281 nohdr:1,
282 nfctinfo:3;
283 __u8 pkt_type:3,
284 fclone:2,
285 ipvs_property:1;
286 __be16 protocol;
287
288 void (*destructor)(struct sk_buff *skb);
289#ifdef CONFIG_NETFILTER
290 struct nf_conntrack *nfct;
291#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
292 struct sk_buff *nfct_reasm;
293#endif
294#ifdef CONFIG_BRIDGE_NETFILTER
295 struct nf_bridge_info *nf_bridge;
296#endif
297 __u32 nfmark;
298#endif
299#ifdef CONFIG_NET_SCHED
300 __u16 tc_index;
301#ifdef CONFIG_NET_CLS_ACT
302 __u16 tc_verd;
303#endif
304#endif
305#ifdef CONFIG_NET_DMA
306 dma_cookie_t dma_cookie;
307#endif
308#ifdef CONFIG_NETWORK_SECMARK
309 __u32 secmark;
310#endif
311
312
313
314 unsigned int truesize;
315 atomic_t users;
316 unsigned char *head,
317 *data,
318 *tail,
319 *end;
320};
321
322#ifdef __KERNEL__
323
324
325
326#include <linux/slab.h>
327
328#include <asm/system.h>
329
330extern void kfree_skb(struct sk_buff *skb);
331extern void __kfree_skb(struct sk_buff *skb);
332extern struct sk_buff *__alloc_skb(unsigned int size,
333 gfp_t priority, int fclone);
334static inline struct sk_buff *alloc_skb(unsigned int size,
335 gfp_t priority)
336{
337 return __alloc_skb(size, priority, 0);
338}
339
340static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
341 gfp_t priority)
342{
343 return __alloc_skb(size, priority, 1);
344}
345
346extern struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp,
347 unsigned int size,
348 gfp_t priority);
349extern void kfree_skbmem(struct sk_buff *skb);
350extern struct sk_buff *skb_clone(struct sk_buff *skb,
351 gfp_t priority);
352extern struct sk_buff *skb_copy(const struct sk_buff *skb,
353 gfp_t priority);
354extern struct sk_buff *pskb_copy(struct sk_buff *skb,
355 gfp_t gfp_mask);
356extern int pskb_expand_head(struct sk_buff *skb,
357 int nhead, int ntail,
358 gfp_t gfp_mask);
359extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb,
360 unsigned int headroom);
361extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
362 int newheadroom, int newtailroom,
363 gfp_t priority);
364extern int skb_pad(struct sk_buff *skb, int pad);
365#define dev_kfree_skb(a) kfree_skb(a)
366extern void skb_over_panic(struct sk_buff *skb, int len,
367 void *here);
368extern void skb_under_panic(struct sk_buff *skb, int len,
369 void *here);
370extern void skb_truesize_bug(struct sk_buff *skb);
371
372static inline void skb_truesize_check(struct sk_buff *skb)
373{
374 if (unlikely((int)skb->truesize < sizeof(struct sk_buff) + skb->len))
375 skb_truesize_bug(skb);
376}
377
378extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
379 int getfrag(void *from, char *to, int offset,
380 int len,int odd, struct sk_buff *skb),
381 void *from, int length);
382
383struct skb_seq_state
384{
385 __u32 lower_offset;
386 __u32 upper_offset;
387 __u32 frag_idx;
388 __u32 stepped_offset;
389 struct sk_buff *root_skb;
390 struct sk_buff *cur_skb;
391 __u8 *frag_data;
392};
393
394extern void skb_prepare_seq_read(struct sk_buff *skb,
395 unsigned int from, unsigned int to,
396 struct skb_seq_state *st);
397extern unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
398 struct skb_seq_state *st);
399extern void skb_abort_seq_read(struct skb_seq_state *st);
400
401extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
402 unsigned int to, struct ts_config *config,
403 struct ts_state *state);
404
405
406#define skb_shinfo(SKB) ((struct skb_shared_info *)((SKB)->end))
407
408
409
410
411
412
413
414static inline int skb_queue_empty(const struct sk_buff_head *list)
415{
416 return list->next == (struct sk_buff *)list;
417}
418
419
420
421
422
423
424
425
426static inline struct sk_buff *skb_get(struct sk_buff *skb)
427{
428 atomic_inc(&skb->users);
429 return skb;
430}
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445static inline int skb_cloned(const struct sk_buff *skb)
446{
447 return skb->cloned &&
448 (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;
449}
450
451
452
453
454
455
456
457
458static inline int skb_header_cloned(const struct sk_buff *skb)
459{
460 int dataref;
461
462 if (!skb->cloned)
463 return 0;
464
465 dataref = atomic_read(&skb_shinfo(skb)->dataref);
466 dataref = (dataref & SKB_DATAREF_MASK) - (dataref >> SKB_DATAREF_SHIFT);
467 return dataref != 1;
468}
469
470
471
472
473
474
475
476
477
478static inline void skb_header_release(struct sk_buff *skb)
479{
480 BUG_ON(skb->nohdr);
481 skb->nohdr = 1;
482 atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
483}
484
485
486
487
488
489
490
491
492static inline int skb_shared(const struct sk_buff *skb)
493{
494 return atomic_read(&skb->users) != 1;
495}
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510static inline struct sk_buff *skb_share_check(struct sk_buff *skb,
511 gfp_t pri)
512{
513 might_sleep_if(pri & __GFP_WAIT);
514 if (skb_shared(skb)) {
515 struct sk_buff *nskb = skb_clone(skb, pri);
516 kfree_skb(skb);
517 skb = nskb;
518 }
519 return skb;
520}
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
543 gfp_t pri)
544{
545 might_sleep_if(pri & __GFP_WAIT);
546 if (skb_cloned(skb)) {
547 struct sk_buff *nskb = skb_copy(skb, pri);
548 kfree_skb(skb);
549 skb = nskb;
550 }
551 return skb;
552}
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)
568{
569 struct sk_buff *list = ((struct sk_buff *)list_)->next;
570 if (list == (struct sk_buff *)list_)
571 list = NULL;
572 return list;
573}
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588static inline struct sk_buff *skb_peek_tail(struct sk_buff_head *list_)
589{
590 struct sk_buff *list = ((struct sk_buff *)list_)->prev;
591 if (list == (struct sk_buff *)list_)
592 list = NULL;
593 return list;
594}
595
596
597
598
599
600
601
602static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
603{
604 return list_->qlen;
605}
606
607
608
609
610
611
612
613
614
615static inline void skb_queue_head_init(struct sk_buff_head *list)
616{
617 spin_lock_init(&list->lock);
618 list->prev = list->next = (struct sk_buff *)list;
619 list->qlen = 0;
620}
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640static inline void __skb_queue_after(struct sk_buff_head *list,
641 struct sk_buff *prev,
642 struct sk_buff *newsk)
643{
644 struct sk_buff *next;
645 list->qlen++;
646
647 next = prev->next;
648 newsk->next = next;
649 newsk->prev = prev;
650 next->prev = prev->next = newsk;
651}
652
653
654
655
656
657
658
659
660
661
662
663extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
664static inline void __skb_queue_head(struct sk_buff_head *list,
665 struct sk_buff *newsk)
666{
667 __skb_queue_after(list, (struct sk_buff *)list, newsk);
668}
669
670
671
672
673
674
675
676
677
678
679
680extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
681static inline void __skb_queue_tail(struct sk_buff_head *list,
682 struct sk_buff *newsk)
683{
684 struct sk_buff *prev, *next;
685
686 list->qlen++;
687 next = (struct sk_buff *)list;
688 prev = next->prev;
689 newsk->next = next;
690 newsk->prev = prev;
691 next->prev = prev->next = newsk;
692}
693
694
695
696
697
698
699
700
701
702
703extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
704static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
705{
706 struct sk_buff *next, *prev, *result;
707
708 prev = (struct sk_buff *) list;
709 next = prev->next;
710 result = NULL;
711 if (next != prev) {
712 result = next;
713 next = next->next;
714 list->qlen--;
715 next->prev = prev;
716 prev->next = next;
717 result->next = result->prev = NULL;
718 }
719 return result;
720}
721
722
723
724
725
726extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
727static inline void __skb_insert(struct sk_buff *newsk,
728 struct sk_buff *prev, struct sk_buff *next,
729 struct sk_buff_head *list)
730{
731 newsk->next = next;
732 newsk->prev = prev;
733 next->prev = prev->next = newsk;
734 list->qlen++;
735}
736
737
738
739
740extern void skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
741static inline void __skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list)
742{
743 __skb_insert(newsk, old, old->next, list);
744}
745
746
747
748
749
750extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
751static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
752{
753 struct sk_buff *next, *prev;
754
755 list->qlen--;
756 next = skb->next;
757 prev = skb->prev;
758 skb->next = skb->prev = NULL;
759 next->prev = prev;
760 prev->next = next;
761}
762
763
764
765
766
767
768
769
770
771
772
773
774extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
775static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
776{
777 struct sk_buff *skb = skb_peek_tail(list);
778 if (skb)
779 __skb_unlink(skb, list);
780 return skb;
781}
782
783
784static inline int skb_is_nonlinear(const struct sk_buff *skb)
785{
786 return skb->data_len;
787}
788
789static inline unsigned int skb_headlen(const struct sk_buff *skb)
790{
791 return skb->len - skb->data_len;
792}
793
794static inline int skb_pagelen(const struct sk_buff *skb)
795{
796 int i, len = 0;
797
798 for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
799 len += skb_shinfo(skb)->frags[i].size;
800 return len + skb_headlen(skb);
801}
802
803static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
804 struct page *page, int off, int size)
805{
806 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
807
808 frag->page = page;
809 frag->page_offset = off;
810 frag->size = size;
811 skb_shinfo(skb)->nr_frags = i + 1;
812}
813
814#define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags)
815#define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list)
816#define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb))
817
818
819
820
821static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
822{
823 unsigned char *tmp = skb->tail;
824 SKB_LINEAR_ASSERT(skb);
825 skb->tail += len;
826 skb->len += len;
827 return tmp;
828}
829
830
831
832
833
834
835
836
837
838
839static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
840{
841 unsigned char *tmp = skb->tail;
842 SKB_LINEAR_ASSERT(skb);
843 skb->tail += len;
844 skb->len += len;
845 if (unlikely(skb->tail>skb->end))
846 skb_over_panic(skb, len, current_text_addr());
847 return tmp;
848}
849
850static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
851{
852 skb->data -= len;
853 skb->len += len;
854 return skb->data;
855}
856
857
858
859
860
861
862
863
864
865
866static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
867{
868 skb->data -= len;
869 skb->len += len;
870 if (unlikely(skb->data<skb->head))
871 skb_under_panic(skb, len, current_text_addr());
872 return skb->data;
873}
874
875static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
876{
877 skb->len -= len;
878 BUG_ON(skb->len < skb->data_len);
879 return skb->data += len;
880}
881
882
883
884
885
886
887
888
889
890
891
892static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
893{
894 return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
895}
896
897extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
898
899static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
900{
901 if (len > skb_headlen(skb) &&
902 !__pskb_pull_tail(skb, len-skb_headlen(skb)))
903 return NULL;
904 skb->len -= len;
905 return skb->data += len;
906}
907
908static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
909{
910 return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
911}
912
913static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
914{
915 if (likely(len <= skb_headlen(skb)))
916 return 1;
917 if (unlikely(len > skb->len))
918 return 0;
919 return __pskb_pull_tail(skb, len-skb_headlen(skb)) != NULL;
920}
921
922
923
924
925
926
927
928static inline int skb_headroom(const struct sk_buff *skb)
929{
930 return skb->data - skb->head;
931}
932
933
934
935
936
937
938
939static inline int skb_tailroom(const struct sk_buff *skb)
940{
941 return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
942}
943
944
945
946
947
948
949
950
951
952static inline void skb_reserve(struct sk_buff *skb, int len)
953{
954 skb->data += len;
955 skb->tail += len;
956}
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978#ifndef NET_IP_ALIGN
979#define NET_IP_ALIGN 2
980#endif
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997#ifndef NET_SKB_PAD
998#define NET_SKB_PAD 16
999#endif
1000
1001extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1002
1003static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
1004{
1005 if (unlikely(skb->data_len)) {
1006 WARN_ON(1);
1007 return;
1008 }
1009 skb->len = len;
1010 skb->tail = skb->data + len;
1011}
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022static inline void skb_trim(struct sk_buff *skb, unsigned int len)
1023{
1024 if (skb->len > len)
1025 __skb_trim(skb, len);
1026}
1027
1028
1029static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
1030{
1031 if (skb->data_len)
1032 return ___pskb_trim(skb, len);
1033 __skb_trim(skb, len);
1034 return 0;
1035}
1036
1037static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
1038{
1039 return (len < skb->len) ? __pskb_trim(skb, len) : 0;
1040}
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
1052{
1053 int err = pskb_trim(skb, len);
1054 BUG_ON(err);
1055}
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065static inline void skb_orphan(struct sk_buff *skb)
1066{
1067 if (skb->destructor)
1068 skb->destructor(skb);
1069 skb->destructor = NULL;
1070 skb->sk = NULL;
1071}
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081extern void skb_queue_purge(struct sk_buff_head *list);
1082static inline void __skb_queue_purge(struct sk_buff_head *list)
1083{
1084 struct sk_buff *skb;
1085 while ((skb = __skb_dequeue(list)) != NULL)
1086 kfree_skb(skb);
1087}
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
1102 gfp_t gfp_mask)
1103{
1104 struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
1105 if (likely(skb))
1106 skb_reserve(skb, NET_SKB_PAD);
1107 return skb;
1108}
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122static inline struct sk_buff *dev_alloc_skb(unsigned int length)
1123{
1124 return __dev_alloc_skb(length, GFP_ATOMIC);
1125}
1126
1127extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
1128 unsigned int length, gfp_t gfp_mask);
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
1144 unsigned int length)
1145{
1146 return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
1147}
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
1162{
1163 int delta = (headroom > NET_SKB_PAD ? headroom : NET_SKB_PAD) -
1164 skb_headroom(skb);
1165
1166 if (delta < 0)
1167 delta = 0;
1168
1169 if (delta || skb_cloned(skb))
1170 return pskb_expand_head(skb, (delta + (NET_SKB_PAD-1)) &
1171 ~(NET_SKB_PAD-1), 0, GFP_ATOMIC);
1172 return 0;
1173}
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186static inline int skb_padto(struct sk_buff *skb, unsigned int len)
1187{
1188 unsigned int size = skb->len;
1189 if (likely(size >= len))
1190 return 0;
1191 return skb_pad(skb, len-size);
1192}
1193
1194static inline int skb_add_data(struct sk_buff *skb,
1195 char __user *from, int copy)
1196{
1197 const int off = skb->len;
1198
1199 if (skb->ip_summed == CHECKSUM_NONE) {
1200 int err = 0;
1201 unsigned int csum = csum_and_copy_from_user(from,
1202 skb_put(skb, copy),
1203 copy, 0, &err);
1204 if (!err) {
1205 skb->csum = csum_block_add(skb->csum, csum, off);
1206 return 0;
1207 }
1208 } else if (!copy_from_user(skb_put(skb, copy), from, copy))
1209 return 0;
1210
1211 __skb_trim(skb, off);
1212 return -EFAULT;
1213}
1214
1215static inline int skb_can_coalesce(struct sk_buff *skb, int i,
1216 struct page *page, int off)
1217{
1218 if (i) {
1219 struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
1220
1221 return page == frag->page &&
1222 off == frag->page_offset + frag->size;
1223 }
1224 return 0;
1225}
1226
1227static inline int __skb_linearize(struct sk_buff *skb)
1228{
1229 return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
1230}
1231
1232
1233
1234
1235
1236
1237
1238
1239static inline int skb_linearize(struct sk_buff *skb)
1240{
1241 return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
1242}
1243
1244
1245
1246
1247
1248
1249
1250
1251static inline int skb_linearize_cow(struct sk_buff *skb)
1252{
1253 return skb_is_nonlinear(skb) || skb_cloned(skb) ?
1254 __skb_linearize(skb) : 0;
1255}
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268static inline void skb_postpull_rcsum(struct sk_buff *skb,
1269 const void *start, unsigned int len)
1270{
1271 if (skb->ip_summed == CHECKSUM_HW)
1272 skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
1273}
1274
1275unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1287{
1288 if (likely(len >= skb->len))
1289 return 0;
1290 if (skb->ip_summed == CHECKSUM_HW)
1291 skb->ip_summed = CHECKSUM_NONE;
1292 return __pskb_trim(skb, len);
1293}
1294
1295static inline void *kmap_skb_frag(const skb_frag_t *frag)
1296{
1297#ifdef CONFIG_HIGHMEM
1298 BUG_ON(in_irq());
1299
1300 local_bh_disable();
1301#endif
1302 return kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ);
1303}
1304
1305static inline void kunmap_skb_frag(void *vaddr)
1306{
1307 kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
1308#ifdef CONFIG_HIGHMEM
1309 local_bh_enable();
1310#endif
1311}
1312
1313#define skb_queue_walk(queue, skb) \
1314 for (skb = (queue)->next; \
1315 prefetch(skb->next), (skb != (struct sk_buff *)(queue)); \
1316 skb = skb->next)
1317
1318#define skb_queue_reverse_walk(queue, skb) \
1319 for (skb = (queue)->prev; \
1320 prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \
1321 skb = skb->prev)
1322
1323
1324extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
1325 int noblock, int *err);
1326extern unsigned int datagram_poll(struct file *file, struct socket *sock,
1327 struct poll_table_struct *wait);
1328extern int skb_copy_datagram_iovec(const struct sk_buff *from,
1329 int offset, struct iovec *to,
1330 int size);
1331extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
1332 int hlen,
1333 struct iovec *iov);
1334extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
1335extern void skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
1336 unsigned int flags);
1337extern unsigned int skb_checksum(const struct sk_buff *skb, int offset,
1338 int len, unsigned int csum);
1339extern int skb_copy_bits(const struct sk_buff *skb, int offset,
1340 void *to, int len);
1341extern int skb_store_bits(const struct sk_buff *skb, int offset,
1342 void *from, int len);
1343extern unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb,
1344 int offset, u8 *to, int len,
1345 unsigned int csum);
1346extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
1347extern void skb_split(struct sk_buff *skb,
1348 struct sk_buff *skb1, const u32 len);
1349
1350extern struct sk_buff *skb_segment(struct sk_buff *skb, int features);
1351
1352static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
1353 int len, void *buffer)
1354{
1355 int hlen = skb_headlen(skb);
1356
1357 if (hlen - offset >= len)
1358 return skb->data + offset;
1359
1360 if (skb_copy_bits(skb, offset, buffer, len) < 0)
1361 return NULL;
1362
1363 return buffer;
1364}
1365
1366extern void skb_init(void);
1367extern void skb_add_mtu(int mtu);
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378static inline void skb_get_timestamp(const struct sk_buff *skb, struct timeval *stamp)
1379{
1380 stamp->tv_sec = skb->tstamp.off_sec;
1381 stamp->tv_usec = skb->tstamp.off_usec;
1382}
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393static inline void skb_set_timestamp(struct sk_buff *skb, const struct timeval *stamp)
1394{
1395 skb->tstamp.off_sec = stamp->tv_sec;
1396 skb->tstamp.off_usec = stamp->tv_usec;
1397}
1398
1399extern void __net_timestamp(struct sk_buff *skb);
1400
1401extern unsigned int __skb_checksum_complete(struct sk_buff *skb);
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419static inline unsigned int skb_checksum_complete(struct sk_buff *skb)
1420{
1421 return skb->ip_summed != CHECKSUM_UNNECESSARY &&
1422 __skb_checksum_complete(skb);
1423}
1424
1425#ifdef CONFIG_NETFILTER
1426static inline void nf_conntrack_put(struct nf_conntrack *nfct)
1427{
1428 if (nfct && atomic_dec_and_test(&nfct->use))
1429 nfct->destroy(nfct);
1430}
1431static inline void nf_conntrack_get(struct nf_conntrack *nfct)
1432{
1433 if (nfct)
1434 atomic_inc(&nfct->use);
1435}
1436#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1437static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
1438{
1439 if (skb)
1440 atomic_inc(&skb->users);
1441}
1442static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
1443{
1444 if (skb)
1445 kfree_skb(skb);
1446}
1447#endif
1448#ifdef CONFIG_BRIDGE_NETFILTER
1449static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
1450{
1451 if (nf_bridge && atomic_dec_and_test(&nf_bridge->use))
1452 kfree(nf_bridge);
1453}
1454static inline void nf_bridge_get(struct nf_bridge_info *nf_bridge)
1455{
1456 if (nf_bridge)
1457 atomic_inc(&nf_bridge->use);
1458}
1459#endif
1460static inline void nf_reset(struct sk_buff *skb)
1461{
1462 nf_conntrack_put(skb->nfct);
1463 skb->nfct = NULL;
1464#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1465 nf_conntrack_put_reasm(skb->nfct_reasm);
1466 skb->nfct_reasm = NULL;
1467#endif
1468#ifdef CONFIG_BRIDGE_NETFILTER
1469 nf_bridge_put(skb->nf_bridge);
1470 skb->nf_bridge = NULL;
1471#endif
1472}
1473
1474#else
1475static inline void nf_reset(struct sk_buff *skb) {}
1476#endif
1477
1478#ifdef CONFIG_NETWORK_SECMARK
1479static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
1480{
1481 to->secmark = from->secmark;
1482}
1483
1484static inline void skb_init_secmark(struct sk_buff *skb)
1485{
1486 skb->secmark = 0;
1487}
1488#else
1489static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
1490{ }
1491
1492static inline void skb_init_secmark(struct sk_buff *skb)
1493{ }
1494#endif
1495
1496static inline int skb_is_gso(const struct sk_buff *skb)
1497{
1498 return skb_shinfo(skb)->gso_size;
1499}
1500
1501#endif
1502#endif
1503