LMS 2012
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
wpabuf.h
Go to the documentation of this file.
1 /*
2  * Dynamic data buffer
3  * Copyright (c) 2007-2009, Jouni Malinen <j@w1.fi>
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);
39 struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b);
40 struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len);
41 void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3);
42 
43 
49 static inline size_t wpabuf_size(const struct wpabuf *buf)
50 {
51  return buf->size;
52 }
53 
59 static inline size_t wpabuf_len(const struct wpabuf *buf)
60 {
61  return buf->used;
62 }
63 
69 static inline size_t wpabuf_tailroom(const struct wpabuf *buf)
70 {
71  return buf->size - buf->used;
72 }
73 
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 
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 
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 
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 {
153  buf->ext_data = (u8 *) data;
154  buf->size = buf->used = len;
155 }
156 
157 static inline void wpabuf_put_str(struct wpabuf *dst, const char *str)
158 {
159  wpabuf_put_data(dst, str, os_strlen(str));
160 }
161 
162 #endif /* WPABUF_H */
#define WPA_PUT_BE24(a, val)
Definition: common.h:265
struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b)
uint8_t u8
Definition: common.h:160
void * wpabuf_put(struct wpabuf *buf, size_t len)
#define PRINTF_FORMAT(a, b)
Definition: common.h:341
struct wpabuf * wpabuf_dup(const struct wpabuf *src)
struct wpabuf * wpabuf_alloc(size_t len)
struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len)
struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len)
Definition: wpabuf.h:23
size_t size
Definition: wpabuf.h:24
#define WPA_PUT_BE16(a, val)
Definition: common.h:250
#define WPA_PUT_LE16(a, val)
Definition: common.h:257
int wpabuf_resize(struct wpabuf **buf, size_t add_len)
#define WPA_PUT_BE32(a, val)
Definition: common.h:274
#define os_memcpy(d, s, n)
Definition: os.h:407
uint16_t u16
Definition: common.h:159
void wpabuf_free(struct wpabuf *buf)
void wpabuf_printf(struct wpabuf *buf, char *fmt,...) PRINTF_FORMAT(2
struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len)
size_t used
Definition: wpabuf.h:25
#define os_strlen(s)
Definition: os.h:420
uint32_t u32
Definition: common.h:158
u8 * ext_data
Definition: wpabuf.h:26