Move include/malloc.h to include/gpxe/malloc.h, since everything in there
[people/xl0/gpxe.git] / src / net / pkbuff.c
1 /*
2  * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <stdint.h>
20 #include <gpxe/malloc.h>
21 #include <gpxe/pkbuff.h>
22
23 /** @file
24  *
25  * Packet buffers
26  *
27  */
28
29 /**
30  * Allocate packet buffer
31  *
32  * @v len       Required length of buffer
33  * @ret pkb     Packet buffer, or NULL if none available
34  *
35  * The packet buffer will be physically aligned to a multiple of
36  * @c PKBUFF_SIZE.
37  */
38 struct pk_buff * alloc_pkb ( size_t len ) {
39         struct pk_buff *pkb = NULL;
40         void *data;
41
42         /* Pad to minimum length */
43         if ( len < PKB_ZLEN )
44                 len = PKB_ZLEN;
45
46         /* Align buffer length */
47         len = ( len + __alignof__( *pkb ) - 1 ) & ~( __alignof__( *pkb ) - 1 );
48         
49         /* Allocate memory for buffer plus descriptor */
50         data = malloc_dma ( len + sizeof ( *pkb ), PKBUFF_ALIGN );
51         if ( ! data )
52                 return NULL;
53
54         pkb = ( struct pk_buff * ) ( data + len );
55         pkb->head = pkb->data = pkb->tail = data;
56         pkb->end = pkb;
57         return pkb;
58 }
59
60 /**
61  * Free packet buffer
62  *
63  * @v pkb       Packet buffer
64  */
65 void free_pkb ( struct pk_buff *pkb ) {
66         if ( pkb ) {
67                 assert ( pkb->head <= pkb->data );
68                 assert ( pkb->data <= pkb->tail );
69                 assert ( pkb->tail <= pkb->end );
70                 free_dma ( pkb->head,
71                            ( pkb->end - pkb->head ) + sizeof ( *pkb ) );
72         }
73 }