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