Line data Source code
1 : /*
2 : * Dynamic data buffer
3 : * Copyright (c) 2007-2012, Jouni Malinen <j@w1.fi>
4 : *
5 : * This software may be distributed under the terms of the BSD license.
6 : * See README for more details.
7 : */
8 :
9 : #ifndef WPABUF_H
10 : #define WPABUF_H
11 :
12 : /* wpabuf::buf is a pointer to external data */
13 : #define WPABUF_FLAG_EXT_DATA BIT(0)
14 :
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 */
23 : u8 *buf; /* pointer to the head of the buffer */
24 : unsigned int flags;
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);
35 : void * wpabuf_put(struct wpabuf *buf, size_t len);
36 : struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b);
37 : struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len);
38 : void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3);
39 :
40 :
41 : /**
42 : * wpabuf_size - Get the currently allocated size of a wpabuf buffer
43 : * @buf: wpabuf buffer
44 : * Returns: Currently allocated size of the buffer
45 : */
46 1421 : static inline size_t wpabuf_size(const struct wpabuf *buf)
47 : {
48 1421 : return buf->size;
49 : }
50 :
51 : /**
52 : * wpabuf_len - Get the current length of a wpabuf buffer data
53 : * @buf: wpabuf buffer
54 : * Returns: Currently used length of the buffer
55 : */
56 882315 : static inline size_t wpabuf_len(const struct wpabuf *buf)
57 : {
58 882315 : return buf->used;
59 : }
60 :
61 : /**
62 : * wpabuf_tailroom - Get size of available tail room in the end of the buffer
63 : * @buf: wpabuf buffer
64 : * Returns: Tail room (in bytes) of available space in the end of the buffer
65 : */
66 69967 : static inline size_t wpabuf_tailroom(const struct wpabuf *buf)
67 : {
68 69967 : return buf->size - buf->used;
69 : }
70 :
71 : /**
72 : * wpabuf_head - Get pointer to the head of the buffer data
73 : * @buf: wpabuf buffer
74 : * Returns: Pointer to the head of the buffer data
75 : */
76 223252 : static inline const void * wpabuf_head(const struct wpabuf *buf)
77 : {
78 223252 : return buf->buf;
79 : }
80 :
81 67683 : static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf)
82 : {
83 67683 : return wpabuf_head(buf);
84 : }
85 :
86 : /**
87 : * wpabuf_mhead - Get modifiable pointer to the head of the buffer data
88 : * @buf: wpabuf buffer
89 : * Returns: Pointer to the head of the buffer data
90 : */
91 820596 : static inline void * wpabuf_mhead(struct wpabuf *buf)
92 : {
93 820596 : return buf->buf;
94 : }
95 :
96 811766 : static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf)
97 : {
98 811766 : return wpabuf_mhead(buf);
99 : }
100 :
101 155928 : static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data)
102 : {
103 155928 : u8 *pos = wpabuf_put(buf, 1);
104 155928 : *pos = data;
105 155928 : }
106 :
107 13109 : static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data)
108 : {
109 13109 : u8 *pos = wpabuf_put(buf, 2);
110 13109 : WPA_PUT_LE16(pos, data);
111 13109 : }
112 :
113 3 : static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data)
114 : {
115 3 : u8 *pos = wpabuf_put(buf, 4);
116 3 : WPA_PUT_LE32(pos, data);
117 3 : }
118 :
119 182189 : static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data)
120 : {
121 182189 : u8 *pos = wpabuf_put(buf, 2);
122 182189 : WPA_PUT_BE16(pos, data);
123 182189 : }
124 :
125 10988 : static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data)
126 : {
127 10988 : u8 *pos = wpabuf_put(buf, 3);
128 10988 : WPA_PUT_BE24(pos, data);
129 10988 : }
130 :
131 16306 : static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data)
132 : {
133 16306 : u8 *pos = wpabuf_put(buf, 4);
134 16306 : WPA_PUT_BE32(pos, data);
135 16306 : }
136 :
137 136230 : static inline void wpabuf_put_data(struct wpabuf *buf, const void *data,
138 : size_t len)
139 : {
140 136230 : if (data)
141 135504 : os_memcpy(wpabuf_put(buf, len), data, len);
142 136230 : }
143 :
144 11621 : static inline void wpabuf_put_buf(struct wpabuf *dst,
145 : const struct wpabuf *src)
146 : {
147 11621 : wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src));
148 11621 : }
149 :
150 4016 : static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len)
151 : {
152 4016 : buf->buf = (u8 *) data;
153 4016 : buf->flags = WPABUF_FLAG_EXT_DATA;
154 4016 : buf->size = buf->used = len;
155 4016 : }
156 :
157 6716 : static inline void wpabuf_put_str(struct wpabuf *dst, const char *str)
158 : {
159 6716 : wpabuf_put_data(dst, str, os_strlen(str));
160 6716 : }
161 :
162 : #endif /* WPABUF_H */
|