]>
Commit | Line | Data |
---|---|---|
6fc6879b JM |
1 | /* |
2 | * Dynamic data buffer | |
f620268f | 3 | * Copyright (c) 2007-2009, Jouni Malinen <j@w1.fi> |
6fc6879b JM |
4 | * |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License version 2 as | |
7 | * published by the Free Software Foundation. | |
8 | * | |
9 | * Alternatively, this software may be distributed under the terms of BSD | |
10 | * license. | |
11 | * | |
12 | * See README and COPYING for more details. | |
13 | */ | |
14 | ||
15 | #ifndef WPABUF_H | |
16 | #define WPABUF_H | |
17 | ||
18 | /* | |
19 | * Internal data structure for wpabuf. Please do not touch this directly from | |
20 | * elsewhere. This is only defined in header file to allow inline functions | |
21 | * from this file to access data. | |
22 | */ | |
23 | struct wpabuf { | |
24 | size_t size; /* total size of the allocated buffer */ | |
25 | size_t used; /* length of data in the buffer */ | |
26 | u8 *ext_data; /* pointer to external data; NULL if data follows | |
27 | * struct wpabuf */ | |
28 | /* optionally followed by the allocated buffer */ | |
29 | }; | |
30 | ||
31 | ||
32 | int wpabuf_resize(struct wpabuf **buf, size_t add_len); | |
33 | struct wpabuf * wpabuf_alloc(size_t len); | |
34 | struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len); | |
35 | struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len); | |
36 | struct wpabuf * wpabuf_dup(const struct wpabuf *src); | |
37 | void wpabuf_free(struct wpabuf *buf); | |
38 | void * wpabuf_put(struct wpabuf *buf, size_t len); | |
7914585f | 39 | struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); |
b3ddab21 | 40 | struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); |
f620268f | 41 | void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); |
6fc6879b JM |
42 | |
43 | ||
44 | /** | |
45 | * wpabuf_size - Get the currently allocated size of a wpabuf buffer | |
46 | * @buf: wpabuf buffer | |
47 | * Returns: Currently allocated size of the buffer | |
48 | */ | |
49 | static inline size_t wpabuf_size(const struct wpabuf *buf) | |
50 | { | |
51 | return buf->size; | |
52 | } | |
53 | ||
54 | /** | |
55 | * wpabuf_len - Get the current length of a wpabuf buffer data | |
56 | * @buf: wpabuf buffer | |
57 | * Returns: Currently used length of the buffer | |
58 | */ | |
59 | static inline size_t wpabuf_len(const struct wpabuf *buf) | |
60 | { | |
61 | return buf->used; | |
62 | } | |
63 | ||
64 | /** | |
65 | * wpabuf_tailroom - Get size of available tail room in the end of the buffer | |
66 | * @buf: wpabuf buffer | |
67 | * Returns: Tail room (in bytes) of available space in the end of the buffer | |
68 | */ | |
69 | static inline size_t wpabuf_tailroom(const struct wpabuf *buf) | |
70 | { | |
71 | return buf->size - buf->used; | |
72 | } | |
73 | ||
74 | /** | |
75 | * wpabuf_head - Get pointer to the head of the buffer data | |
76 | * @buf: wpabuf buffer | |
77 | * Returns: Pointer to the head of the buffer data | |
78 | */ | |
79 | static inline const void * wpabuf_head(const struct wpabuf *buf) | |
80 | { | |
81 | if (buf->ext_data) | |
82 | return buf->ext_data; | |
83 | return buf + 1; | |
84 | } | |
85 | ||
86 | static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) | |
87 | { | |
88 | return wpabuf_head(buf); | |
89 | } | |
90 | ||
91 | /** | |
92 | * wpabuf_mhead - Get modifiable pointer to the head of the buffer data | |
93 | * @buf: wpabuf buffer | |
94 | * Returns: Pointer to the head of the buffer data | |
95 | */ | |
96 | static inline void * wpabuf_mhead(struct wpabuf *buf) | |
97 | { | |
98 | if (buf->ext_data) | |
99 | return buf->ext_data; | |
100 | return buf + 1; | |
101 | } | |
102 | ||
103 | static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) | |
104 | { | |
105 | return wpabuf_mhead(buf); | |
106 | } | |
107 | ||
108 | static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) | |
109 | { | |
110 | u8 *pos = wpabuf_put(buf, 1); | |
111 | *pos = data; | |
112 | } | |
113 | ||
babfbf15 JM |
114 | static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) |
115 | { | |
116 | u8 *pos = wpabuf_put(buf, 2); | |
117 | WPA_PUT_LE16(pos, data); | |
118 | } | |
119 | ||
b22128ef JM |
120 | static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) |
121 | { | |
122 | u8 *pos = wpabuf_put(buf, 4); | |
123 | WPA_PUT_LE32(pos, data); | |
124 | } | |
125 | ||
6fc6879b JM |
126 | static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) |
127 | { | |
128 | u8 *pos = wpabuf_put(buf, 2); | |
129 | WPA_PUT_BE16(pos, data); | |
130 | } | |
131 | ||
132 | static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) | |
133 | { | |
134 | u8 *pos = wpabuf_put(buf, 3); | |
135 | WPA_PUT_BE24(pos, data); | |
136 | } | |
137 | ||
138 | static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) | |
139 | { | |
140 | u8 *pos = wpabuf_put(buf, 4); | |
141 | WPA_PUT_BE32(pos, data); | |
142 | } | |
143 | ||
144 | static inline void wpabuf_put_data(struct wpabuf *buf, const void *data, | |
145 | size_t len) | |
146 | { | |
147 | if (data) | |
148 | os_memcpy(wpabuf_put(buf, len), data, len); | |
149 | } | |
150 | ||
151 | static inline void wpabuf_put_buf(struct wpabuf *dst, | |
152 | const struct wpabuf *src) | |
153 | { | |
154 | wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); | |
155 | } | |
156 | ||
157 | static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) | |
158 | { | |
159 | buf->ext_data = (u8 *) data; | |
160 | buf->size = buf->used = len; | |
161 | } | |
162 | ||
f620268f JM |
163 | static inline void wpabuf_put_str(struct wpabuf *dst, const char *str) |
164 | { | |
165 | wpabuf_put_data(dst, str, os_strlen(str)); | |
166 | } | |
167 | ||
6fc6879b | 168 | #endif /* WPABUF_H */ |