diff --git a/src/capwap/mbag.c b/src/capwap/mbag.c new file mode 100644 index 00000000..7c94bdab --- /dev/null +++ b/src/capwap/mbag.c @@ -0,0 +1,81 @@ +#include "mbag.h" + + +const struct mbag_typedef mbag_type_byte = { + NULL +}; + +const struct mbag_typedef mbag_type_word = { + NULL +}; + +const struct mbag_typedef mbag_type_dword = { + NULL +}; + +const struct mbag_typedef mbag_type_bstr = { + free +}; + +const struct mbag_typedef mbag_type_bstr16 = { + free +}; + + + +static void mbag_type_mbag_del(void *i) +{ + + mavl_destroy(((struct mbag_item*)i)->data); +} + +const struct mbag_typedef mbag_type_mbag = { + mbag_type_mbag_del +}; + + +static void mbag_del_data(struct mbag_item *i) +{ + if (i->type->del) + i->type->del(i); +} + + +static void mbag_del_fun(void *e) +{ + mbag_del_data(e); + free(e); +} + + +static int mbag_cmp_fun(const void *x1, const void *x2) +{ + return ((struct mbag_item *) x1)->id - ((struct mbag_item *) x2)->id; +} + +mbag_t mbag_create() +{ + return mavl_create(mbag_cmp_fun, mbag_del_fun); +} + +struct mbag_item *mbag_item_create(mbag_t s, uint32_t id) +{ + struct mbag_item is; + is.id = id; + + struct mbag_item *i = mavl_get(s, &is); + if (i) { + mbag_del_data(i); + return i; + } + + i = malloc(sizeof(struct mbag_item)); + if (!i) + return NULL; + i->id = id; + return mavl_add(s, i); +} + + + + diff --git a/src/capwap/mbag.h b/src/capwap/mbag.h new file mode 100644 index 00000000..6310c046 --- /dev/null +++ b/src/capwap/mbag.h @@ -0,0 +1,226 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + + +#ifndef __MBAG_H +#define __MBAG_H + +/** + * @defgroup MBaglFunctions MBAG Functions + * @{ + */ + + +#include +#include "mavl.h" + + +struct mbag_item; + +struct mbag_typedef{ + void (*del)(void*); + +}; + + +struct mbag_item{ + uint32_t id; + const struct mbag_typedef * type; + union { + void *data; + uint8_t byte; + uint16_t word; + uint32_t dword; + }; +}; + +typedef mavl_t mbag_t; +typedef struct mbag_item mbag_item_t; + + + +extern const struct mbag_typedef mbag_type_byte; +extern const struct mbag_typedef mbag_type_word; +extern const struct mbag_typedef mbag_type_dword; +extern const struct mbag_typedef mbag_type_mbag; +extern const struct mbag_typedef mbag_type_bstr; +extern const struct mbag_typedef mbag_type_bstr16; + + +#define MBAG_BYTE (&mbag_type_byte) +#define MBAG_WORD (&mbag_type_word) +#define MBAG_DWORD (&mbag_type_dword) +#define MBAG_MBAG (&mbag_type_mbag) +#define MBAG_BSTR (&mbag_type_bstr) +#define MBAG_BSTR16 (&mbag_type_bstr16) + + + +extern mbag_t mbag_create(); + +extern struct mbag_item *mbag_item_create(mbag_t s, uint32_t id); + + + +static inline int mbag_set_byte(mbag_t s, uint32_t id, uint8_t byte) +{ + struct mbag_item *i = mbag_item_create(s, id); + if (!i) + return 0; + i->byte = byte; + i->type = &mbag_type_byte; + return 1; +} + +static inline int mbag_set_word(mbag_t s, uint32_t id, uint16_t word) +{ + struct mbag_item *i = mbag_item_create(s, id); + if (!i) + return 0; + i->word = word; + i->type = &mbag_type_word; + return 1; +} + + + +static inline int mbag_set_dword(mbag_t s, uint32_t id, uint32_t dword) +{ + struct mbag_item *i = mbag_item_create(s, id); + if (!i) + return 0; + i->dword = dword; + i->type = &mbag_type_dword; + return 1; +} + + + +static inline int mbag_set_mbag(mbag_t s, uint32_t id, mbag_t mbag) +{ + struct mbag_item *i = mbag_item_create(s, id); + if (!i) + return 0; + i->data = mbag; + i->type = &mbag_type_mbag; + return 1; +} + +static inline int mbag_set_data(mbag_t s, uint32_t id, struct mbag_typedef *type, void *data) +{ + struct mbag_item *i = mbag_item_create(s, id); + if (!i) + return 0; + i->data = data; + i->type = type; + return 1; + + +} + +#define mbag_set_bstr(m,i,d) mbag_set_data(m,i,MBAG_BSTR,d) +#define mbag_set_bstr16(m,i,d) mbag_set_data(m,i,MBAG_BSTR16,d) + + +static inline mbag_item_t *mbag_get(mbag_t s, uint32_t id) +{ + mbag_item_t i; + i.id = id; + return mavl_get(s, &i); +} + +static inline void mbag_del(mbag_t s,uint32_t id) +{ + mbag_item_t i; + i.id = id; + mavl_del(s, &i); +} + +static inline void * mbag_get_data(mbag_t s, uint32_t id, const struct mbag_typedef * type, void * def) +{ + struct mbag_item *i = mbag_get(s, id); + if (!i) + return def; + if (i->type != type) + return def; + return i->data; +} + +#define mbag_get_bstr(m,i,d) mbag_get_data(m,i,MBAG_BSTR,d) +#define mbag_get_bstr16(m,i,d) mbag_get_data(m,i,MBAG_BSTR16,d) + +static inline void * mbag_get_raw(mbag_t s, uint32_t id, void * def) +{ + struct mbag_item *i = mbag_get(s, id); + if (!i) + return def; + return i->data; +} + + + +static inline uint8_t mbag_get_byte(mbag_t s, uint32_t id, uint8_t def) +{ + struct mbag_item *i = mbag_get(s, id); + if (!i) + return def; + if (i->type != MBAG_BYTE) + return def; + return i->byte; +} + +static inline uint16_t mbag_get_word(mbag_t s, uint32_t id, uint16_t def) +{ + struct mbag_item *i = mbag_get(s, id); + if (!i) + return def; + if (i->type != MBAG_WORD) + return def; + return i->word; +} + + + +static inline uint32_t mbag_get_dword(mbag_t s, uint32_t id, uint32_t def) +{ + struct mbag_item *i = mbag_get(s, id); + if (!i) + return def; + if (i->type != MBAG_DWORD) + return def; + return i->dword; +} + + + +static inline mbag_t mbag_get_mbag(mbag_t s, uint32_t id, mbag_t def) +{ + struct mbag_item *i = mbag_get(s, id); + if (!i) + return def; + if (i->type != MBAG_MBAG) + return def; + return i->data; +} + + + +/** @} */ + + +#endif