Add RFC2090 TFTP multicast support.
[people/sha0/gpxe.git] / src / include / gpxe / bitmap.h
1 #ifndef _GPXE_BITMAP_H
2 #define _GPXE_BITMAP_H
3
4 /** @file
5  *
6  * Bitmaps for multicast downloads
7  *
8  */
9
10 #include <stdint.h>
11 #include <stddef.h>
12 #include <stdlib.h>
13
14 /** A single block of bits within a bitmap */
15 typedef unsigned long bitmap_block_t;
16
17 /** Size of a block of bits (in bits) */
18 #define BITMAP_BLKSIZE ( sizeof ( bitmap_block_t ) * 8 )
19
20 /**
21  * Block index within bitmap
22  *
23  * @v bit               Bit index
24  * @ret index           Block index
25  */
26 #define BITMAP_INDEX( bit ) ( (bit) / BITMAP_BLKSIZE )
27
28 /**
29  * Block mask within bitmap
30  *
31  * @v bit               Bit index
32  * @ret mask            Block mask
33  */
34 #define BITMAP_MASK( bit ) ( 1 << ( (bit) % BITMAP_BLKSIZE ) )
35
36 /** A bitmap */
37 struct bitmap {
38         /** Bitmap data */
39         bitmap_block_t *blocks;
40         /** Length of the bitmap, in bits */
41         unsigned int length;
42         /** Index of first gap in the bitmap */
43         unsigned int first_gap;
44 };
45
46 extern int bitmap_resize ( struct bitmap *bitmap, unsigned int new_length );
47 extern int bitmap_test ( struct bitmap *bitmap, unsigned int bit );
48 extern void bitmap_set ( struct bitmap *bitmap, unsigned int bit );
49
50 /**
51  * Free bitmap resources
52  *
53  * @v bitmap            Bitmap
54  */
55 static inline void bitmap_free ( struct bitmap *bitmap ) {
56         free ( bitmap->blocks );
57 }
58
59 /**
60  * Get first gap within bitmap
61  *
62  * @v bitmap            Bitmap
63  * @ret first_gap       First gap
64  *
65  * The first gap is the first unset bit within the bitmap.
66  */
67 static inline unsigned int bitmap_first_gap ( struct bitmap *bitmap ) {
68         return bitmap->first_gap;
69 }
70
71 /**
72  * Check to see if bitmap is full
73  *
74  * @v bitmap            Bitmap
75  * @ret is_full         Bitmap is full
76  *
77  * The bitmap is full if it has no gaps (i.e. no unset bits).
78  */
79 static inline int bitmap_full ( struct bitmap *bitmap ) {
80         return ( bitmap->first_gap == bitmap->length );
81 }
82
83 #endif /* _GPXE_BITMAP_H */