OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [core/] [skbuff.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1278 phoenix
/*
2
 *      Routines having to do with the 'struct sk_buff' memory handlers.
3
 *
4
 *      Authors:        Alan Cox <iiitac@pyr.swan.ac.uk>
5
 *                      Florian La Roche <rzsfl@rz.uni-sb.de>
6
 *
7
 *      Version:        $Id: skbuff.c,v 1.1.1.1 2004-04-17 22:13:13 phoenix Exp $
8
 *
9
 *      Fixes:
10
 *              Alan Cox        :       Fixed the worst of the load balancer bugs.
11
 *              Dave Platt      :       Interrupt stacking fix.
12
 *      Richard Kooijman        :       Timestamp fixes.
13
 *              Alan Cox        :       Changed buffer format.
14
 *              Alan Cox        :       destructor hook for AF_UNIX etc.
15
 *              Linus Torvalds  :       Better skb_clone.
16
 *              Alan Cox        :       Added skb_copy.
17
 *              Alan Cox        :       Added all the changed routines Linus
18
 *                                      only put in the headers
19
 *              Ray VanTassle   :       Fixed --skb->lock in free
20
 *              Alan Cox        :       skb_copy copy arp field
21
 *              Andi Kleen      :       slabified it.
22
 *
23
 *      NOTE:
24
 *              The __skb_ routines should be called with interrupts
25
 *      disabled, or you better be *real* sure that the operation is atomic
26
 *      with respect to whatever list is being frobbed (e.g. via lock_sock()
27
 *      or via disabling bottom half handlers, etc).
28
 *
29
 *      This program is free software; you can redistribute it and/or
30
 *      modify it under the terms of the GNU General Public License
31
 *      as published by the Free Software Foundation; either version
32
 *      2 of the License, or (at your option) any later version.
33
 */
34
 
35
/*
36
 *      The functions in this file will not compile correctly with gcc 2.4.x
37
 */
38
 
39
#include <linux/config.h>
40
#include <linux/types.h>
41
#include <linux/kernel.h>
42
#include <linux/sched.h>
43
#include <linux/mm.h>
44
#include <linux/interrupt.h>
45
#include <linux/in.h>
46
#include <linux/inet.h>
47
#include <linux/slab.h>
48
#include <linux/netdevice.h>
49
#include <linux/string.h>
50
#include <linux/skbuff.h>
51
#include <linux/cache.h>
52
#include <linux/rtnetlink.h>
53
#include <linux/init.h>
54
#include <linux/highmem.h>
55
 
56
#include <net/protocol.h>
57
#include <net/dst.h>
58
#include <net/sock.h>
59
#include <net/checksum.h>
60
 
61
#include <asm/uaccess.h>
62
#include <asm/system.h>
63
 
64
int sysctl_hot_list_len = 128;
65
 
66
static kmem_cache_t *skbuff_head_cache;
67
 
68
static union {
69
        struct sk_buff_head     list;
70
        char                    pad[SMP_CACHE_BYTES];
71
} skb_head_pool[NR_CPUS];
72
 
73
/*
74
 *      Keep out-of-line to prevent kernel bloat.
75
 *      __builtin_return_address is not used because it is not always
76
 *      reliable.
77
 */
78
 
79
/**
80
 *      skb_over_panic  -       private function
81
 *      @skb: buffer
82
 *      @sz: size
83
 *      @here: address
84
 *
85
 *      Out of line support code for skb_put(). Not user callable.
86
 */
87
 
88
void skb_over_panic(struct sk_buff *skb, int sz, void *here)
89
{
90
        printk("skput:over: %p:%d put:%d dev:%s",
91
                here, skb->len, sz, skb->dev ? skb->dev->name : "<NULL>");
92
        BUG();
93
}
94
 
95
/**
96
 *      skb_under_panic -       private function
97
 *      @skb: buffer
98
 *      @sz: size
99
 *      @here: address
100
 *
101
 *      Out of line support code for skb_push(). Not user callable.
102
 */
103
 
104
 
105
void skb_under_panic(struct sk_buff *skb, int sz, void *here)
106
{
107
        printk("skput:under: %p:%d put:%d dev:%s",
108
                here, skb->len, sz, skb->dev ? skb->dev->name : "<NULL>");
109
        BUG();
110
}
111
 
112
static __inline__ struct sk_buff *skb_head_from_pool(void)
113
{
114
        struct sk_buff_head *list = &skb_head_pool[smp_processor_id()].list;
115
 
116
        if (skb_queue_len(list)) {
117
                struct sk_buff *skb;
118
                unsigned long flags;
119
 
120
                local_irq_save(flags);
121
                skb = __skb_dequeue(list);
122
                local_irq_restore(flags);
123
                return skb;
124
        }
125
        return NULL;
126
}
127
 
128
static __inline__ void skb_head_to_pool(struct sk_buff *skb)
129
{
130
        struct sk_buff_head *list = &skb_head_pool[smp_processor_id()].list;
131
 
132
        if (skb_queue_len(list) < sysctl_hot_list_len) {
133
                unsigned long flags;
134
 
135
                local_irq_save(flags);
136
                __skb_queue_head(list, skb);
137
                local_irq_restore(flags);
138
 
139
                return;
140
        }
141
        kmem_cache_free(skbuff_head_cache, skb);
142
}
143
 
144
 
145
/*      Allocate a new skbuff. We do this ourselves so we can fill in a few
146
 *      'private' fields and also do memory statistics to find all the
147
 *      [BEEP] leaks.
148
 *
149
 */
150
 
151
/**
152
 *      alloc_skb       -       allocate a network buffer
153
 *      @size: size to allocate
154
 *      @gfp_mask: allocation mask
155
 *
156
 *      Allocate a new &sk_buff. The returned buffer has no headroom and a
157
 *      tail room of size bytes. The object has a reference count of one.
158
 *      The return is the buffer. On a failure the return is %NULL.
159
 *
160
 *      Buffers may only be allocated from interrupts using a @gfp_mask of
161
 *      %GFP_ATOMIC.
162
 */
163
 
164
struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)
165
{
166
        struct sk_buff *skb;
167
        u8 *data;
168
 
169
        if (in_interrupt() && (gfp_mask & __GFP_WAIT)) {
170
                static int count = 0;
171
                if (++count < 5) {
172
                        printk(KERN_ERR "alloc_skb called nonatomically "
173
                               "from interrupt %p\n", NET_CALLER(size));
174
                        BUG();
175
                }
176
                gfp_mask &= ~__GFP_WAIT;
177
        }
178
 
179
        /* Get the HEAD */
180
        skb = skb_head_from_pool();
181
        if (skb == NULL) {
182
                skb = kmem_cache_alloc(skbuff_head_cache, gfp_mask & ~__GFP_DMA);
183
                if (skb == NULL)
184
                        goto nohead;
185
        }
186
 
187
        /* Get the DATA. Size must match skb_add_mtu(). */
188
        size = SKB_DATA_ALIGN(size);
189
        data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
190
        if (data == NULL)
191
                goto nodata;
192
 
193
        /* XXX: does not include slab overhead */
194
        skb->truesize = size + sizeof(struct sk_buff);
195
 
196
        /* Load the data pointers. */
197
        skb->head = data;
198
        skb->data = data;
199
        skb->tail = data;
200
        skb->end = data + size;
201
 
202
        /* Set up other state */
203
        skb->len = 0;
204
        skb->cloned = 0;
205
        skb->data_len = 0;
206
 
207
        atomic_set(&skb->users, 1);
208
        atomic_set(&(skb_shinfo(skb)->dataref), 1);
209
        skb_shinfo(skb)->nr_frags = 0;
210
        skb_shinfo(skb)->frag_list = NULL;
211
        return skb;
212
 
213
nodata:
214
        skb_head_to_pool(skb);
215
nohead:
216
        return NULL;
217
}
218
 
219
 
220
/*
221
 *      Slab constructor for a skb head.
222
 */
223
static inline void skb_headerinit(void *p, kmem_cache_t *cache,
224
                                  unsigned long flags)
225
{
226
        struct sk_buff *skb = p;
227
 
228
        skb->next = NULL;
229
        skb->prev = NULL;
230
        skb->list = NULL;
231
        skb->sk = NULL;
232
        skb->stamp.tv_sec=0;     /* No idea about time */
233
        skb->dev = NULL;
234
        skb->real_dev = NULL;
235
        skb->dst = NULL;
236
        memset(skb->cb, 0, sizeof(skb->cb));
237
        skb->pkt_type = PACKET_HOST;    /* Default type */
238
        skb->ip_summed = 0;
239
        skb->priority = 0;
240
        skb->security = 0;       /* By default packets are insecure */
241
        skb->destructor = NULL;
242
 
243
#ifdef CONFIG_NETFILTER
244
        skb->nfmark = skb->nfcache = 0;
245
        skb->nfct = NULL;
246
#ifdef CONFIG_NETFILTER_DEBUG
247
        skb->nf_debug = 0;
248
#endif
249
#endif
250
#ifdef CONFIG_NET_SCHED
251
        skb->tc_index = 0;
252
#endif
253
}
254
 
255
static void skb_drop_fraglist(struct sk_buff *skb)
256
{
257
        struct sk_buff *list = skb_shinfo(skb)->frag_list;
258
 
259
        skb_shinfo(skb)->frag_list = NULL;
260
 
261
        do {
262
                struct sk_buff *this = list;
263
                list = list->next;
264
                kfree_skb(this);
265
        } while (list);
266
}
267
 
268
static void skb_clone_fraglist(struct sk_buff *skb)
269
{
270
        struct sk_buff *list;
271
 
272
        for (list = skb_shinfo(skb)->frag_list; list; list=list->next)
273
                skb_get(list);
274
}
275
 
276
static void skb_release_data(struct sk_buff *skb)
277
{
278
        if (!skb->cloned ||
279
            atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) {
280
                if (skb_shinfo(skb)->nr_frags) {
281
                        int i;
282
                        for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
283
                                put_page(skb_shinfo(skb)->frags[i].page);
284
                }
285
 
286
                if (skb_shinfo(skb)->frag_list)
287
                        skb_drop_fraglist(skb);
288
 
289
                kfree(skb->head);
290
        }
291
}
292
 
293
/*
294
 *      Free an skbuff by memory without cleaning the state.
295
 */
296
void kfree_skbmem(struct sk_buff *skb)
297
{
298
        skb_release_data(skb);
299
        skb_head_to_pool(skb);
300
}
301
 
302
/**
303
 *      __kfree_skb - private function
304
 *      @skb: buffer
305
 *
306
 *      Free an sk_buff. Release anything attached to the buffer.
307
 *      Clean the state. This is an internal helper function. Users should
308
 *      always call kfree_skb
309
 */
310
 
311
void __kfree_skb(struct sk_buff *skb)
312
{
313
        if (skb->list) {
314
                printk(KERN_WARNING "Warning: kfree_skb passed an skb still "
315
                       "on a list (from %p).\n", NET_CALLER(skb));
316
                BUG();
317
        }
318
 
319
        dst_release(skb->dst);
320
        if(skb->destructor) {
321
                if (in_irq()) {
322
                        printk(KERN_WARNING "Warning: kfree_skb on hard IRQ %p\n",
323
                                NET_CALLER(skb));
324
                }
325
                skb->destructor(skb);
326
        }
327
#ifdef CONFIG_NETFILTER
328
        nf_conntrack_put(skb->nfct);
329
#endif
330
        skb_headerinit(skb, NULL, 0);  /* clean state */
331
        kfree_skbmem(skb);
332
}
333
 
334
/**
335
 *      skb_clone       -       duplicate an sk_buff
336
 *      @skb: buffer to clone
337
 *      @gfp_mask: allocation priority
338
 *
339
 *      Duplicate an &sk_buff. The new one is not owned by a socket. Both
340
 *      copies share the same packet data but not structure. The new
341
 *      buffer has a reference count of 1. If the allocation fails the
342
 *      function returns %NULL otherwise the new buffer is returned.
343
 *
344
 *      If this function is called from an interrupt gfp_mask() must be
345
 *      %GFP_ATOMIC.
346
 */
347
 
348
struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask)
349
{
350
        struct sk_buff *n;
351
 
352
        n = skb_head_from_pool();
353
        if (!n) {
354
                n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
355
                if (!n)
356
                        return NULL;
357
        }
358
 
359
#define C(x) n->x = skb->x
360
 
361
        n->next = n->prev = NULL;
362
        n->list = NULL;
363
        n->sk = NULL;
364
        C(stamp);
365
        C(dev);
366
        C(real_dev);
367
        C(h);
368
        C(nh);
369
        C(mac);
370
        C(dst);
371
        dst_clone(n->dst);
372
        memcpy(n->cb, skb->cb, sizeof(skb->cb));
373
        C(len);
374
        C(data_len);
375
        C(csum);
376
        n->cloned = 1;
377
        C(pkt_type);
378
        C(ip_summed);
379
        C(priority);
380
        atomic_set(&n->users, 1);
381
        C(protocol);
382
        C(security);
383
        C(truesize);
384
        C(head);
385
        C(data);
386
        C(tail);
387
        C(end);
388
        n->destructor = NULL;
389
#ifdef CONFIG_NETFILTER
390
        C(nfmark);
391
        C(nfcache);
392
        C(nfct);
393
#ifdef CONFIG_NETFILTER_DEBUG
394
        C(nf_debug);
395
#endif
396
#endif /*CONFIG_NETFILTER*/
397
#if defined(CONFIG_HIPPI)
398
        C(private);
399
#endif
400
#ifdef CONFIG_NET_SCHED
401
        C(tc_index);
402
#endif
403
 
404
        atomic_inc(&(skb_shinfo(skb)->dataref));
405
        skb->cloned = 1;
406
#ifdef CONFIG_NETFILTER
407
        nf_conntrack_get(skb->nfct);
408
#endif
409
        return n;
410
}
411
 
412
static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
413
{
414
        /*
415
         *      Shift between the two data areas in bytes
416
         */
417
        unsigned long offset = new->data - old->data;
418
 
419
        new->list=NULL;
420
        new->sk=NULL;
421
        new->dev=old->dev;
422
        new->real_dev=old->real_dev;
423
        new->priority=old->priority;
424
        new->protocol=old->protocol;
425
        new->dst=dst_clone(old->dst);
426
        new->h.raw=old->h.raw+offset;
427
        new->nh.raw=old->nh.raw+offset;
428
        new->mac.raw=old->mac.raw+offset;
429
        memcpy(new->cb, old->cb, sizeof(old->cb));
430
        atomic_set(&new->users, 1);
431
        new->pkt_type=old->pkt_type;
432
        new->stamp=old->stamp;
433
        new->destructor = NULL;
434
        new->security=old->security;
435
#ifdef CONFIG_NETFILTER
436
        new->nfmark=old->nfmark;
437
        new->nfcache=old->nfcache;
438
        new->nfct=old->nfct;
439
        nf_conntrack_get(new->nfct);
440
#ifdef CONFIG_NETFILTER_DEBUG
441
        new->nf_debug=old->nf_debug;
442
#endif
443
#endif
444
#ifdef CONFIG_NET_SCHED
445
        new->tc_index = old->tc_index;
446
#endif
447
}
448
 
449
/**
450
 *      skb_copy        -       create private copy of an sk_buff
451
 *      @skb: buffer to copy
452
 *      @gfp_mask: allocation priority
453
 *
454
 *      Make a copy of both an &sk_buff and its data. This is used when the
455
 *      caller wishes to modify the data and needs a private copy of the
456
 *      data to alter. Returns %NULL on failure or the pointer to the buffer
457
 *      on success. The returned buffer has a reference count of 1.
458
 *
459
 *      As by-product this function converts non-linear &sk_buff to linear
460
 *      one, so that &sk_buff becomes completely private and caller is allowed
461
 *      to modify all the data of returned buffer. This means that this
462
 *      function is not recommended for use in circumstances when only
463
 *      header is going to be modified. Use pskb_copy() instead.
464
 */
465
 
466
struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask)
467
{
468
        struct sk_buff *n;
469
        int headerlen = skb->data-skb->head;
470
 
471
        /*
472
         *      Allocate the copy buffer
473
         */
474
        n=alloc_skb(skb->end - skb->head + skb->data_len, gfp_mask);
475
        if(n==NULL)
476
                return NULL;
477
 
478
        /* Set the data pointer */
479
        skb_reserve(n,headerlen);
480
        /* Set the tail pointer and length */
481
        skb_put(n,skb->len);
482
        n->csum = skb->csum;
483
        n->ip_summed = skb->ip_summed;
484
 
485
        if (skb_copy_bits(skb, -headerlen, n->head, headerlen+skb->len))
486
                BUG();
487
 
488
        copy_skb_header(n, skb);
489
 
490
        return n;
491
}
492
 
493
/* Keep head the same: replace data */
494
int skb_linearize(struct sk_buff *skb, int gfp_mask)
495
{
496
        unsigned int size;
497
        u8 *data;
498
        long offset;
499
        int headerlen = skb->data - skb->head;
500
        int expand = (skb->tail+skb->data_len) - skb->end;
501
 
502
        if (skb_shared(skb))
503
                BUG();
504
 
505
        if (expand <= 0)
506
                expand = 0;
507
 
508
        size = (skb->end - skb->head + expand);
509
        size = SKB_DATA_ALIGN(size);
510
        data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
511
        if (data == NULL)
512
                return -ENOMEM;
513
 
514
        /* Copy entire thing */
515
        if (skb_copy_bits(skb, -headerlen, data, headerlen+skb->len))
516
                BUG();
517
 
518
        /* Offset between the two in bytes */
519
        offset = data - skb->head;
520
 
521
        /* Free old data. */
522
        skb_release_data(skb);
523
 
524
        skb->head = data;
525
        skb->end  = data + size;
526
 
527
        /* Set up new pointers */
528
        skb->h.raw += offset;
529
        skb->nh.raw += offset;
530
        skb->mac.raw += offset;
531
        skb->tail += offset;
532
        skb->data += offset;
533
 
534
        /* Set up shinfo */
535
        atomic_set(&(skb_shinfo(skb)->dataref), 1);
536
        skb_shinfo(skb)->nr_frags = 0;
537
        skb_shinfo(skb)->frag_list = NULL;
538
 
539
        /* We are no longer a clone, even if we were. */
540
        skb->cloned = 0;
541
 
542
        skb->tail += skb->data_len;
543
        skb->data_len = 0;
544
        return 0;
545
}
546
 
547
 
548
/**
549
 *      pskb_copy       -       create copy of an sk_buff with private head.
550
 *      @skb: buffer to copy
551
 *      @gfp_mask: allocation priority
552
 *
553
 *      Make a copy of both an &sk_buff and part of its data, located
554
 *      in header. Fragmented data remain shared. This is used when
555
 *      the caller wishes to modify only header of &sk_buff and needs
556
 *      private copy of the header to alter. Returns %NULL on failure
557
 *      or the pointer to the buffer on success.
558
 *      The returned buffer has a reference count of 1.
559
 */
560
 
561
struct sk_buff *pskb_copy(struct sk_buff *skb, int gfp_mask)
562
{
563
        struct sk_buff *n;
564
 
565
        /*
566
         *      Allocate the copy buffer
567
         */
568
        n=alloc_skb(skb->end - skb->head, gfp_mask);
569
        if(n==NULL)
570
                return NULL;
571
 
572
        /* Set the data pointer */
573
        skb_reserve(n,skb->data-skb->head);
574
        /* Set the tail pointer and length */
575
        skb_put(n,skb_headlen(skb));
576
        /* Copy the bytes */
577
        memcpy(n->data, skb->data, n->len);
578
        n->csum = skb->csum;
579
        n->ip_summed = skb->ip_summed;
580
 
581
        n->data_len = skb->data_len;
582
        n->len = skb->len;
583
 
584
        if (skb_shinfo(skb)->nr_frags) {
585
                int i;
586
 
587
                for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
588
                        skb_shinfo(n)->frags[i] = skb_shinfo(skb)->frags[i];
589
                        get_page(skb_shinfo(n)->frags[i].page);
590
                }
591
                skb_shinfo(n)->nr_frags = i;
592
        }
593
 
594
        if (skb_shinfo(skb)->frag_list) {
595
                skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list;
596
                skb_clone_fraglist(n);
597
        }
598
 
599
        copy_skb_header(n, skb);
600
 
601
        return n;
602
}
603
 
604
/**
605
 *      pskb_expand_head - reallocate header of &sk_buff
606
 *      @skb: buffer to reallocate
607
 *      @nhead: room to add at head
608
 *      @ntail: room to add at tail
609
 *      @gfp_mask: allocation priority
610
 *
611
 *      Expands (or creates identical copy, if &nhead and &ntail are zero)
612
 *      header of skb. &sk_buff itself is not changed. &sk_buff MUST have
613
 *      reference count of 1. Returns zero in the case of success or error,
614
 *      if expansion failed. In the last case, &sk_buff is not changed.
615
 *
616
 *      All the pointers pointing into skb header may change and must be
617
 *      reloaded after call to this function.
618
 */
619
 
620
int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, int gfp_mask)
621
{
622
        int i;
623
        u8 *data;
624
        int size = nhead + (skb->end - skb->head) + ntail;
625
        long off;
626
 
627
        if (skb_shared(skb))
628
                BUG();
629
 
630
        size = SKB_DATA_ALIGN(size);
631
 
632
        data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
633
        if (data == NULL)
634
                goto nodata;
635
 
636
        /* Copy only real data... and, alas, header. This should be
637
         * optimized for the cases when header is void. */
638
        memcpy(data+nhead, skb->head, skb->tail-skb->head);
639
        memcpy(data+size, skb->end, sizeof(struct skb_shared_info));
640
 
641
        for (i=0; i<skb_shinfo(skb)->nr_frags; i++)
642
                get_page(skb_shinfo(skb)->frags[i].page);
643
 
644
        if (skb_shinfo(skb)->frag_list)
645
                skb_clone_fraglist(skb);
646
 
647
        skb_release_data(skb);
648
 
649
        off = (data+nhead) - skb->head;
650
 
651
        skb->head = data;
652
        skb->end  = data+size;
653
 
654
        skb->data += off;
655
        skb->tail += off;
656
        skb->mac.raw += off;
657
        skb->h.raw += off;
658
        skb->nh.raw += off;
659
        skb->cloned = 0;
660
        atomic_set(&skb_shinfo(skb)->dataref, 1);
661
        return 0;
662
 
663
nodata:
664
        return -ENOMEM;
665
}
666
 
667
/* Make private copy of skb with writable head and some headroom */
668
 
669
struct sk_buff *
670
skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)
671
{
672
        struct sk_buff *skb2;
673
        int delta = headroom - skb_headroom(skb);
674
 
675
        if (delta <= 0)
676
                return pskb_copy(skb, GFP_ATOMIC);
677
 
678
        skb2 = skb_clone(skb, GFP_ATOMIC);
679
        if (skb2 == NULL ||
680
            !pskb_expand_head(skb2, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC))
681
                return skb2;
682
 
683
        kfree_skb(skb2);
684
        return NULL;
685
}
686
 
687
 
688
/**
689
 *      skb_copy_expand -       copy and expand sk_buff
690
 *      @skb: buffer to copy
691
 *      @newheadroom: new free bytes at head
692
 *      @newtailroom: new free bytes at tail
693
 *      @gfp_mask: allocation priority
694
 *
695
 *      Make a copy of both an &sk_buff and its data and while doing so
696
 *      allocate additional space.
697
 *
698
 *      This is used when the caller wishes to modify the data and needs a
699
 *      private copy of the data to alter as well as more space for new fields.
700
 *      Returns %NULL on failure or the pointer to the buffer
701
 *      on success. The returned buffer has a reference count of 1.
702
 *
703
 *      You must pass %GFP_ATOMIC as the allocation priority if this function
704
 *      is called from an interrupt.
705
 */
706
 
707
 
708
struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
709
                                int newheadroom,
710
                                int newtailroom,
711
                                int gfp_mask)
712
{
713
        struct sk_buff *n;
714
 
715
        /*
716
         *      Allocate the copy buffer
717
         */
718
 
719
        n=alloc_skb(newheadroom + skb->len + newtailroom,
720
                    gfp_mask);
721
        if(n==NULL)
722
                return NULL;
723
 
724
        skb_reserve(n,newheadroom);
725
 
726
        /* Set the tail pointer and length */
727
        skb_put(n,skb->len);
728
 
729
        /* Copy the data only. */
730
        if (skb_copy_bits(skb, 0, n->data, skb->len))
731
                BUG();
732
 
733
        copy_skb_header(n, skb);
734
        return n;
735
}
736
 
737
/**
738
 *      skb_pad                 -       zero pad the tail of an skb
739
 *      @skb: buffer to pad
740
 *      @pad: space to pad
741
 *
742
 *      Ensure that a buffer is followed by a padding area that is zero
743
 *      filled. Used by network drivers which may DMA or transfer data
744
 *      beyond the buffer end onto the wire.
745
 *
746
 *      May return NULL in out of memory cases.
747
 */
748
 
749
struct sk_buff *skb_pad(struct sk_buff *skb, int pad)
750
{
751
        struct sk_buff *nskb;
752
 
753
        /* If the skbuff is non linear tailroom is always zero.. */
754
        if(skb_tailroom(skb) >= pad)
755
        {
756
                memset(skb->data+skb->len, 0, pad);
757
                return skb;
758
        }
759
 
760
        nskb = skb_copy_expand(skb, skb_headroom(skb), skb_tailroom(skb) + pad, GFP_ATOMIC);
761
        kfree_skb(skb);
762
        if(nskb)
763
                memset(nskb->data+nskb->len, 0, pad);
764
        return nskb;
765
}
766
 
767
/* Trims skb to length len. It can change skb pointers, if "realloc" is 1.
768
 * If realloc==0 and trimming is impossible without change of data,
769
 * it is BUG().
770
 */
771
 
772
int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc)
773
{
774
        int offset = skb_headlen(skb);
775
        int nfrags = skb_shinfo(skb)->nr_frags;
776
        int i;
777
 
778
        for (i=0; i<nfrags; i++) {
779
                int end = offset + skb_shinfo(skb)->frags[i].size;
780
                if (end > len) {
781
                        if (skb_cloned(skb)) {
782
                                if (!realloc)
783
                                        BUG();
784
                                if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
785
                                        return -ENOMEM;
786
                        }
787
                        if (len <= offset) {
788
                                put_page(skb_shinfo(skb)->frags[i].page);
789
                                skb_shinfo(skb)->nr_frags--;
790
                        } else {
791
                                skb_shinfo(skb)->frags[i].size = len-offset;
792
                        }
793
                }
794
                offset = end;
795
        }
796
 
797
        if (offset < len) {
798
                skb->data_len -= skb->len - len;
799
                skb->len = len;
800
        } else {
801
                if (len <= skb_headlen(skb)) {
802
                        skb->len = len;
803
                        skb->data_len = 0;
804
                        skb->tail = skb->data + len;
805
                        if (skb_shinfo(skb)->frag_list && !skb_cloned(skb))
806
                                skb_drop_fraglist(skb);
807
                } else {
808
                        skb->data_len -= skb->len - len;
809
                        skb->len = len;
810
                }
811
        }
812
 
813
        return 0;
814
}
815
 
816
/**
817
 *      __pskb_pull_tail - advance tail of skb header
818
 *      @skb: buffer to reallocate
819
 *      @delta: number of bytes to advance tail
820
 *
821
 *      The function makes a sense only on a fragmented &sk_buff,
822
 *      it expands header moving its tail forward and copying necessary
823
 *      data from fragmented part.
824
 *
825
 *      &sk_buff MUST have reference count of 1.
826
 *
827
 *      Returns %NULL (and &sk_buff does not change) if pull failed
828
 *      or value of new tail of skb in the case of success.
829
 *
830
 *      All the pointers pointing into skb header may change and must be
831
 *      reloaded after call to this function.
832
 */
833
 
834
/* Moves tail of skb head forward, copying data from fragmented part,
835
 * when it is necessary.
836
 * 1. It may fail due to malloc failure.
837
 * 2. It may change skb pointers.
838
 *
839
 * It is pretty complicated. Luckily, it is called only in exceptional cases.
840
 */
841
unsigned char * __pskb_pull_tail(struct sk_buff *skb, int delta)
842
{
843
        int i, k, eat;
844
 
845
        /* If skb has not enough free space at tail, get new one
846
         * plus 128 bytes for future expansions. If we have enough
847
         * room at tail, reallocate without expansion only if skb is cloned.
848
         */
849
        eat = (skb->tail+delta) - skb->end;
850
 
851
        if (eat > 0 || skb_cloned(skb)) {
852
                if (pskb_expand_head(skb, 0, eat>0 ? eat+128 : 0, GFP_ATOMIC))
853
                        return NULL;
854
        }
855
 
856
        if (skb_copy_bits(skb, skb_headlen(skb), skb->tail, delta))
857
                BUG();
858
 
859
        /* Optimization: no fragments, no reasons to preestimate
860
         * size of pulled pages. Superb.
861
         */
862
        if (skb_shinfo(skb)->frag_list == NULL)
863
                goto pull_pages;
864
 
865
        /* Estimate size of pulled pages. */
866
        eat = delta;
867
        for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
868
                if (skb_shinfo(skb)->frags[i].size >= eat)
869
                        goto pull_pages;
870
                eat -= skb_shinfo(skb)->frags[i].size;
871
        }
872
 
873
        /* If we need update frag list, we are in troubles.
874
         * Certainly, it possible to add an offset to skb data,
875
         * but taking into account that pulling is expected to
876
         * be very rare operation, it is worth to fight against
877
         * further bloating skb head and crucify ourselves here instead.
878
         * Pure masohism, indeed. 8)8)
879
         */
880
        if (eat) {
881
                struct sk_buff *list = skb_shinfo(skb)->frag_list;
882
                struct sk_buff *clone = NULL;
883
                struct sk_buff *insp = NULL;
884
 
885
                do {
886
                        if (list == NULL)
887
                                BUG();
888
 
889
                        if (list->len <= eat) {
890
                                /* Eaten as whole. */
891
                                eat -= list->len;
892
                                list = list->next;
893
                                insp = list;
894
                        } else {
895
                                /* Eaten partially. */
896
 
897
                                if (skb_shared(list)) {
898
                                        /* Sucks! We need to fork list. :-( */
899
                                        clone = skb_clone(list, GFP_ATOMIC);
900
                                        if (clone == NULL)
901
                                                return NULL;
902
                                        insp = list->next;
903
                                        list = clone;
904
                                } else {
905
                                        /* This may be pulled without
906
                                         * problems. */
907
                                        insp = list;
908
                                }
909
                                if (pskb_pull(list, eat) == NULL) {
910
                                        if (clone)
911
                                                kfree_skb(clone);
912
                                        return NULL;
913
                                }
914
                                break;
915
                        }
916
                } while (eat);
917
 
918
                /* Free pulled out fragments. */
919
                while ((list = skb_shinfo(skb)->frag_list) != insp) {
920
                        skb_shinfo(skb)->frag_list = list->next;
921
                        kfree_skb(list);
922
                }
923
                /* And insert new clone at head. */
924
                if (clone) {
925
                        clone->next = list;
926
                        skb_shinfo(skb)->frag_list = clone;
927
                }
928
        }
929
        /* Success! Now we may commit changes to skb data. */
930
 
931
pull_pages:
932
        eat = delta;
933
        k = 0;
934
        for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
935
                if (skb_shinfo(skb)->frags[i].size <= eat) {
936
                        put_page(skb_shinfo(skb)->frags[i].page);
937
                        eat -= skb_shinfo(skb)->frags[i].size;
938
                } else {
939
                        skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
940
                        if (eat) {
941
                                skb_shinfo(skb)->frags[k].page_offset += eat;
942
                                skb_shinfo(skb)->frags[k].size -= eat;
943
                                eat = 0;
944
                        }
945
                        k++;
946
                }
947
        }
948
        skb_shinfo(skb)->nr_frags = k;
949
 
950
        skb->tail += delta;
951
        skb->data_len -= delta;
952
 
953
        return skb->tail;
954
}
955
 
956
/* Copy some data bits from skb to kernel buffer. */
957
 
958
int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
959
{
960
        int i, copy;
961
        int start = skb->len - skb->data_len;
962
 
963
        if (offset > (int)skb->len-len)
964
                goto fault;
965
 
966
        /* Copy header. */
967
        if ((copy = start-offset) > 0) {
968
                if (copy > len)
969
                        copy = len;
970
                memcpy(to, skb->data + offset, copy);
971
                if ((len -= copy) == 0)
972
                        return 0;
973
                offset += copy;
974
                to += copy;
975
        }
976
 
977
        for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
978
                int end;
979
 
980
                BUG_TRAP(start <= offset+len);
981
 
982
                end = start + skb_shinfo(skb)->frags[i].size;
983
                if ((copy = end-offset) > 0) {
984
                        u8 *vaddr;
985
 
986
                        if (copy > len)
987
                                copy = len;
988
 
989
                        vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
990
                        memcpy(to, vaddr+skb_shinfo(skb)->frags[i].page_offset+
991
                               offset-start, copy);
992
                        kunmap_skb_frag(vaddr);
993
 
994
                        if ((len -= copy) == 0)
995
                                return 0;
996
                        offset += copy;
997
                        to += copy;
998
                }
999
                start = end;
1000
        }
1001
 
1002
        if (skb_shinfo(skb)->frag_list) {
1003
                struct sk_buff *list;
1004
 
1005
                for (list = skb_shinfo(skb)->frag_list; list; list=list->next) {
1006
                        int end;
1007
 
1008
                        BUG_TRAP(start <= offset+len);
1009
 
1010
                        end = start + list->len;
1011
                        if ((copy = end-offset) > 0) {
1012
                                if (copy > len)
1013
                                        copy = len;
1014
                                if (skb_copy_bits(list, offset-start, to, copy))
1015
                                        goto fault;
1016
                                if ((len -= copy) == 0)
1017
                                        return 0;
1018
                                offset += copy;
1019
                                to += copy;
1020
                        }
1021
                        start = end;
1022
                }
1023
        }
1024
        if (len == 0)
1025
                return 0;
1026
 
1027
fault:
1028
        return -EFAULT;
1029
}
1030
 
1031
/* Checksum skb data. */
1032
 
1033
unsigned int skb_checksum(const struct sk_buff *skb, int offset, int len, unsigned int csum)
1034
{
1035
        int i, copy;
1036
        int start = skb->len - skb->data_len;
1037
        int pos = 0;
1038
 
1039
        /* Checksum header. */
1040
        if ((copy = start-offset) > 0) {
1041
                if (copy > len)
1042
                        copy = len;
1043
                csum = csum_partial(skb->data+offset, copy, csum);
1044
                if ((len -= copy) == 0)
1045
                        return csum;
1046
                offset += copy;
1047
                pos = copy;
1048
        }
1049
 
1050
        for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
1051
                int end;
1052
 
1053
                BUG_TRAP(start <= offset+len);
1054
 
1055
                end = start + skb_shinfo(skb)->frags[i].size;
1056
                if ((copy = end-offset) > 0) {
1057
                        unsigned int csum2;
1058
                        u8 *vaddr;
1059
                        skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1060
 
1061
                        if (copy > len)
1062
                                copy = len;
1063
                        vaddr = kmap_skb_frag(frag);
1064
                        csum2 = csum_partial(vaddr + frag->page_offset +
1065
                                             offset-start, copy, 0);
1066
                        kunmap_skb_frag(vaddr);
1067
                        csum = csum_block_add(csum, csum2, pos);
1068
                        if (!(len -= copy))
1069
                                return csum;
1070
                        offset += copy;
1071
                        pos += copy;
1072
                }
1073
                start = end;
1074
        }
1075
 
1076
        if (skb_shinfo(skb)->frag_list) {
1077
                struct sk_buff *list;
1078
 
1079
                for (list = skb_shinfo(skb)->frag_list; list; list=list->next) {
1080
                        int end;
1081
 
1082
                        BUG_TRAP(start <= offset+len);
1083
 
1084
                        end = start + list->len;
1085
                        if ((copy = end-offset) > 0) {
1086
                                unsigned int csum2;
1087
                                if (copy > len)
1088
                                        copy = len;
1089
                                csum2 = skb_checksum(list, offset-start, copy, 0);
1090
                                csum = csum_block_add(csum, csum2, pos);
1091
                                if ((len -= copy) == 0)
1092
                                        return csum;
1093
                                offset += copy;
1094
                                pos += copy;
1095
                        }
1096
                        start = end;
1097
                }
1098
        }
1099
        if (len == 0)
1100
                return csum;
1101
 
1102
        BUG();
1103
        return csum;
1104
}
1105
 
1106
/* Both of above in one bottle. */
1107
 
1108
unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to, int len, unsigned int csum)
1109
{
1110
        int i, copy;
1111
        int start = skb->len - skb->data_len;
1112
        int pos = 0;
1113
 
1114
        /* Copy header. */
1115
        if ((copy = start-offset) > 0) {
1116
                if (copy > len)
1117
                        copy = len;
1118
                csum = csum_partial_copy_nocheck(skb->data+offset, to, copy, csum);
1119
                if ((len -= copy) == 0)
1120
                        return csum;
1121
                offset += copy;
1122
                to += copy;
1123
                pos = copy;
1124
        }
1125
 
1126
        for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
1127
                int end;
1128
 
1129
                BUG_TRAP(start <= offset+len);
1130
 
1131
                end = start + skb_shinfo(skb)->frags[i].size;
1132
                if ((copy = end-offset) > 0) {
1133
                        unsigned int csum2;
1134
                        u8 *vaddr;
1135
                        skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1136
 
1137
                        if (copy > len)
1138
                                copy = len;
1139
                        vaddr = kmap_skb_frag(frag);
1140
                        csum2 = csum_partial_copy_nocheck(vaddr + frag->page_offset +
1141
                                                      offset-start, to, copy, 0);
1142
                        kunmap_skb_frag(vaddr);
1143
                        csum = csum_block_add(csum, csum2, pos);
1144
                        if (!(len -= copy))
1145
                                return csum;
1146
                        offset += copy;
1147
                        to += copy;
1148
                        pos += copy;
1149
                }
1150
                start = end;
1151
        }
1152
 
1153
        if (skb_shinfo(skb)->frag_list) {
1154
                struct sk_buff *list;
1155
 
1156
                for (list = skb_shinfo(skb)->frag_list; list; list=list->next) {
1157
                        unsigned int csum2;
1158
                        int end;
1159
 
1160
                        BUG_TRAP(start <= offset+len);
1161
 
1162
                        end = start + list->len;
1163
                        if ((copy = end-offset) > 0) {
1164
                                if (copy > len)
1165
                                        copy = len;
1166
                                csum2 = skb_copy_and_csum_bits(list, offset-start, to, copy, 0);
1167
                                csum = csum_block_add(csum, csum2, pos);
1168
                                if ((len -= copy) == 0)
1169
                                        return csum;
1170
                                offset += copy;
1171
                                to += copy;
1172
                                pos += copy;
1173
                        }
1174
                        start = end;
1175
                }
1176
        }
1177
        if (len == 0)
1178
                return csum;
1179
 
1180
        BUG();
1181
        return csum;
1182
}
1183
 
1184
void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
1185
{
1186
        unsigned int csum;
1187
        long csstart;
1188
 
1189
        if (skb->ip_summed == CHECKSUM_HW)
1190
                csstart = skb->h.raw - skb->data;
1191
        else
1192
                csstart = skb->len - skb->data_len;
1193
 
1194
        if (csstart > skb->len - skb->data_len)
1195
                BUG();
1196
 
1197
        memcpy(to, skb->data, csstart);
1198
 
1199
        csum = 0;
1200
        if (csstart != skb->len)
1201
                csum = skb_copy_and_csum_bits(skb, csstart, to+csstart,
1202
                                skb->len-csstart, 0);
1203
 
1204
        if (skb->ip_summed == CHECKSUM_HW) {
1205
                long csstuff = csstart + skb->csum;
1206
 
1207
                *((unsigned short *)(to + csstuff)) = csum_fold(csum);
1208
        }
1209
}
1210
 
1211
#if 0
1212
/*
1213
 *      Tune the memory allocator for a new MTU size.
1214
 */
1215
void skb_add_mtu(int mtu)
1216
{
1217
        /* Must match allocation in alloc_skb */
1218
        mtu = SKB_DATA_ALIGN(mtu) + sizeof(struct skb_shared_info);
1219
 
1220
        kmem_add_cache_size(mtu);
1221
}
1222
#endif
1223
 
1224
void __init skb_init(void)
1225
{
1226
        int i;
1227
 
1228
        skbuff_head_cache = kmem_cache_create("skbuff_head_cache",
1229
                                              sizeof(struct sk_buff),
1230
                                              0,
1231
                                              SLAB_HWCACHE_ALIGN,
1232
                                              skb_headerinit, NULL);
1233
        if (!skbuff_head_cache)
1234
                panic("cannot create skbuff cache");
1235
 
1236
        for (i=0; i<NR_CPUS; i++)
1237
                skb_queue_head_init(&skb_head_pool[i].list);
1238
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.