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