]>
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); |
6fc6879b JM |
40 | |
41 | ||
42 | /** | |
43 | * wpabuf_size - Get the currently allocated size of a wpabuf buffer | |
44 | * @buf: wpabuf buffer | |
45 | * Returns: Currently allocated size of the buffer | |
46 | */ | |
47 | static inline size_t wpabuf_size(const struct wpabuf *buf) | |
48 | { | |
49 | return buf->size; | |
50 | } | |
51 | ||
52 | /** | |
53 | * wpabuf_len - Get the current length of a wpabuf buffer data | |
54 | * @buf: wpabuf buffer | |
55 | * Returns: Currently used length of the buffer | |
56 | */ | |
57 | static inline size_t wpabuf_len(const struct wpabuf *buf) | |
58 | { | |
59 | return buf->used; | |
60 | } | |
61 | ||
62 | /** | |
63 | * wpabuf_tailroom - Get size of available tail room in the end of the buffer | |
64 | * @buf: wpabuf buffer | |
65 | * Returns: Tail room (in bytes) of available space in the end of the buffer | |
66 | */ | |
67 | static inline size_t wpabuf_tailroom(const struct wpabuf *buf) | |
68 | { | |
69 | return buf->size - buf->used; | |
70 | } | |
71 | ||
72 | /** | |
73 | * wpabuf_head - Get pointer to the head of the buffer data | |
74 | * @buf: wpabuf buffer | |
75 | * Returns: Pointer to the head of the buffer data | |
76 | */ | |
77 | static inline const void * wpabuf_head(const struct wpabuf *buf) | |
78 | { | |
1871f711 | 79 | return buf->buf; |
6fc6879b JM |
80 | } |
81 | ||
82 | static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) | |
83 | { | |
84 | return wpabuf_head(buf); | |
85 | } | |
86 | ||
87 | /** | |
88 | * wpabuf_mhead - Get modifiable pointer to the head of the buffer data | |
89 | * @buf: wpabuf buffer | |
90 | * Returns: Pointer to the head of the buffer data | |
91 | */ | |
92 | static inline void * wpabuf_mhead(struct wpabuf *buf) | |
93 | { | |
1871f711 | 94 | return buf->buf; |
6fc6879b JM |
95 | } |
96 | ||
97 | static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) | |
98 | { | |
99 | return wpabuf_mhead(buf); | |
100 | } | |
101 | ||
102 | static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) | |
103 | { | |
104 | u8 *pos = wpabuf_put(buf, 1); | |
105 | *pos = data; | |
106 | } | |
107 | ||
babfbf15 JM |
108 | static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) |
109 | { | |
110 | u8 *pos = wpabuf_put(buf, 2); | |
111 | WPA_PUT_LE16(pos, data); | |
112 | } | |
113 | ||
b22128ef JM |
114 | static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) |
115 | { | |
116 | u8 *pos = wpabuf_put(buf, 4); | |
117 | WPA_PUT_LE32(pos, data); | |
118 | } | |
119 | ||
6fc6879b JM |
120 | static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) |
121 | { | |
122 | u8 *pos = wpabuf_put(buf, 2); | |
123 | WPA_PUT_BE16(pos, data); | |
124 | } | |
125 | ||
126 | static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) | |
127 | { | |
128 | u8 *pos = wpabuf_put(buf, 3); | |
129 | WPA_PUT_BE24(pos, data); | |
130 | } | |
131 | ||
132 | static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) | |
133 | { | |
134 | u8 *pos = wpabuf_put(buf, 4); | |
135 | WPA_PUT_BE32(pos, data); | |
136 | } | |
137 | ||
138 | static inline void wpabuf_put_data(struct wpabuf *buf, const void *data, | |
139 | size_t len) | |
140 | { | |
141 | if (data) | |
142 | os_memcpy(wpabuf_put(buf, len), data, len); | |
143 | } | |
144 | ||
145 | static inline void wpabuf_put_buf(struct wpabuf *dst, | |
146 | const struct wpabuf *src) | |
147 | { | |
148 | wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); | |
149 | } | |
150 | ||
151 | static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) | |
152 | { | |
1871f711 JM |
153 | buf->buf = (u8 *) data; |
154 | buf->flags = WPABUF_FLAG_EXT_DATA; | |
6fc6879b JM |
155 | buf->size = buf->used = len; |
156 | } | |
157 | ||
f620268f JM |
158 | static inline void wpabuf_put_str(struct wpabuf *dst, const char *str) |
159 | { | |
160 | wpabuf_put_data(dst, str, os_strlen(str)); | |
161 | } | |
162 | ||
6fc6879b | 163 | #endif /* WPABUF_H */ |