Some work on WTP.
FossilOrigin-Name: 6ec1370311c5b83dc78adbfb75f8241e0916b171a9c0f939d24ec28ebdf908c8
This commit is contained in:
@ -76,6 +76,10 @@ MAVLOBJS= \
|
||||
mavl_del.o \
|
||||
mavl_add.o \
|
||||
mavl_create.o\
|
||||
mavl_get.o\
|
||||
mavl_del_all.o\
|
||||
mavliter_seek.o \
|
||||
mavliter_next.o \
|
||||
utf8.o
|
||||
|
||||
# cw_foreach_msgelem.o \
|
||||
@ -316,7 +320,12 @@ CWACTION=action.o \
|
||||
capwap_strings_result.o\
|
||||
cw_put_msg.o \
|
||||
capwap_action_helpers.o \
|
||||
cw_put_image_data.o
|
||||
cw_put_image_data.o \
|
||||
cisco.o \
|
||||
item_strings.o \
|
||||
mbag.o\
|
||||
radio.o \
|
||||
cw_out_radio_info.o
|
||||
|
||||
# cw_process_msg.o \
|
||||
|
||||
|
@ -132,14 +132,14 @@ struct capwap_ctrlhdr
|
||||
//extern int capwap_parse_ctrlhdr(struct capwap_ctrlhdr * ch,uint8_t * msg, int len);
|
||||
|
||||
/**
|
||||
*@defgroup CAPWAPMessages CAPWAP Messages
|
||||
*@addtogroup CAPWAPConstants
|
||||
*@{
|
||||
*/
|
||||
|
||||
/**
|
||||
* CAPWAP message types as defined in RFC 5416
|
||||
*/
|
||||
typedef enum {
|
||||
enum cw_message_types{
|
||||
|
||||
/**Discovery Request */
|
||||
CW_MSG_DISCOVERY_REQUEST = 1,
|
||||
@ -183,7 +183,9 @@ CW_STATION_CONFIGURATION_RESPONSE = 26,
|
||||
|
||||
CW_MSG_MAXMSG = 26
|
||||
|
||||
}cw_msg_t;
|
||||
};
|
||||
|
||||
//cw_msg_t;
|
||||
|
||||
/**@}*/
|
||||
|
||||
@ -590,6 +592,7 @@ extern int cw_readmsg_configuration_update_request(uint8_t * elems, int elems_le
|
||||
#define cw_put_dword lw_put_dword
|
||||
#define cw_put_data lw_put_data
|
||||
#define cw_put_bstr lw_put_bstr
|
||||
#define cw_put_bstr16 lw_put_bstr16
|
||||
|
||||
#define cw_set_dword lw_set_dword
|
||||
|
||||
@ -929,6 +932,9 @@ extern struct cw_str capwap_strings_state[];
|
||||
extern struct cw_str capwap_strings_vendor[];
|
||||
extern struct cw_str capwap_strings_elem[];
|
||||
extern struct cw_str capwap_strings_result[];
|
||||
extern struct cw_str cw_item_strings[];
|
||||
|
||||
|
||||
|
||||
|
||||
#define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id)
|
||||
@ -937,6 +943,8 @@ extern struct cw_str capwap_strings_result[];
|
||||
#define cw_strvendor(id) cw_strlist_get_str(capwap_strings_vendor,id)
|
||||
#define cw_strresult(id) cw_strlist_get_str(capwap_strings_result,(id))
|
||||
|
||||
#define cw_stritem(id) cw_strlist_get_str(cw_item_strings,(id))
|
||||
|
||||
/*
|
||||
#define cw_strrc(rc) \
|
||||
((rc)<0 ? ((rc)!=EAGAIN ? strerror(errno):"Timed out"): cw_strresult(rc))
|
||||
|
@ -13,10 +13,12 @@
|
||||
#define CWMSG_80211_WLAN_CONFIGURATION_REQUEST 3398913
|
||||
#define CWMSG_80211_WLAN_CONFIGURATION_REPONSE 3398914
|
||||
|
||||
|
||||
|
||||
#define CW_ELEM80211_ADD_WLAN 1024
|
||||
#define CW_ELEM80211_ANTENNA 1025
|
||||
/** 802.11 Message Elements */
|
||||
enum radioelems {
|
||||
/** Add WLAN Message element */
|
||||
CW_ELEM80211_ADD_WLAN =1024,
|
||||
/** Antenna Message element */
|
||||
CW_ELEM80211_ANTENNA =1025,
|
||||
/*
|
||||
IEEE 802.11 Assigned WTP BSSID 1026
|
||||
IEEE 802.11 Delete WLAN 1027
|
||||
@ -26,8 +28,10 @@
|
||||
IEEE 802.11 MIC Countermeasures 1031
|
||||
IEEE 802.11 Multi-Domain Capability 1032
|
||||
IEEE 802.11 OFDM Control 1033
|
||||
IEEE 802.11 Rate Set 1034
|
||||
IEEE 802.11 RSNA Error Report From Station 1035
|
||||
*/
|
||||
/** Supported WLAN Rates */
|
||||
CW_ELEM80211_RATE_SET=1034,
|
||||
/* IEEE 802.11 RSNA Error Report From Station 1035
|
||||
IEEE 802.11 Station 1036
|
||||
IEEE 802.11 Station QoS Profile 1037
|
||||
IEEE 802.11 Station Session Key 1038
|
||||
@ -42,7 +46,9 @@
|
||||
IEEE 802.11 WTP Radio Fail Alarm Indication 1047
|
||||
*/
|
||||
|
||||
#define CW_ELEM80211_WTP_RADIO_INFORMATION 1048
|
||||
/** Radio Information Message Element */
|
||||
CW_ELEM80211_WTP_RADIO_INFORMATION=1048
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -80,6 +86,7 @@ struct cw_wlan {
|
||||
|
||||
|
||||
|
||||
int cw_out_radio_infos(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
|
||||
|
||||
|
||||
extern int cw_register_actions_capwap_80211_wtp(struct cw_actiondef *def);
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "action.h"
|
||||
#include "capwap_80211_actions.h"
|
||||
#include "capwap_80211.h"
|
||||
#include "capwap.h"
|
||||
|
||||
|
||||
@ -21,11 +22,20 @@ cw_action_in_t capwap_80211_actions_wtp_in[] = {
|
||||
};
|
||||
|
||||
|
||||
cw_action_out_t capwap_80211_actions_wtp_out[]={
|
||||
/* Session ID */
|
||||
{CW_MSG_JOIN_REQUEST, CW_ELEM80211_WTP_RADIO_INFORMATION, 0,
|
||||
CW_ELEM80211_WTP_RADIO_INFORMATION, NULL,cw_out_radio_infos, NULL,1}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
int cw_register_actions_capwap_80211_wtp(struct cw_actiondef *def)
|
||||
{
|
||||
|
||||
cw_actionlist_in_register_actions(def->in, capwap_80211_actions_wtp_in);
|
||||
// cw_actionlist_out_register_actions(def->out, capwap_actions_wtp_out);
|
||||
cw_actionlist_out_register_actions(def->out, capwap_80211_actions_wtp_out);
|
||||
|
||||
int rc;
|
||||
rc = cw_strheap_register_strings(def->strelem, capwap_strings_elem80211);
|
||||
|
@ -41,7 +41,7 @@ struct cw_item * cw_out_get_session_id(struct conn *conn,struct cw_action_out *
|
||||
|
||||
int slen;
|
||||
if ( conn->capwap_mode == CW_MODE_CISCO){
|
||||
slen=4;
|
||||
slen=2;
|
||||
}
|
||||
else
|
||||
slen=16;
|
||||
|
@ -91,6 +91,50 @@ cw_action_in_t capwap_actions_wtp_in[] = {
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/* Message Config Status Response IN */
|
||||
{0, 0, CW_STATE_CONFIGURE, CW_MSG_CONFIGURATION_STATUS_RESPONSE, 0,
|
||||
0,0 }
|
||||
,
|
||||
|
||||
{0, 0, CW_STATE_CONFIGURE, CW_MSG_CONFIGURATION_STATUS_RESPONSE,
|
||||
CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD, 0}
|
||||
,
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/* Message Change State Response IN */
|
||||
{0, 0, CW_STATE_CONFIGURE, CW_MSG_CHANGE_STATE_EVENT_RESPONSE, 0,
|
||||
0,0 }
|
||||
,
|
||||
|
||||
|
||||
/* Message Change State Response IN */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST,
|
||||
0, 0,0 }
|
||||
,
|
||||
|
||||
/* Element: Vendor Specific */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST,
|
||||
CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD, 0}
|
||||
,
|
||||
|
||||
|
||||
|
||||
/* Echo Response Response IN */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_ECHO_RESPONSE, 0,
|
||||
0,0 }
|
||||
,
|
||||
|
||||
/* Element: Vendor Specific */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_ECHO_RESPONSE,
|
||||
CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD, 0}
|
||||
,
|
||||
|
||||
|
||||
|
||||
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
@ -202,11 +246,33 @@ cw_action_out_t capwap_actions_wtp_out[] = {
|
||||
*/
|
||||
{CW_MSG_CONFIGURATION_STATUS_REQUEST, CW_ITEM_NONE}
|
||||
,
|
||||
/* AC Name */
|
||||
{CW_MSG_CONFIGURATION_STATUS_REQUEST, CW_ITEM_AC_NAME, 0,
|
||||
CW_ELEM_AC_NAME, NULL, cw_out_generic, cw_out_get_local,1}
|
||||
,
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* Configuration Status Request OUT
|
||||
*/
|
||||
{CW_MSG_CHANGE_STATE_EVENT_REQUEST, CW_ITEM_NONE}
|
||||
,
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* Echo Request Request OUT
|
||||
*/
|
||||
{CW_MSG_ECHO_REQUEST, CW_ITEM_NONE}
|
||||
,
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* Echo Request Request OUT
|
||||
*/
|
||||
{CW_MSG_CONFIGURATION_UPDATE_RESPONSE, CW_ITEM_NONE}
|
||||
,
|
||||
|
||||
{0, 0}
|
||||
|
||||
};
|
||||
|
@ -63,6 +63,7 @@
|
||||
#define CW_CISCO_AP_STATIC_IP_ADDR 83
|
||||
|
||||
#define CW_CISCO_AC_NAME_WITH_INDEX 91
|
||||
#define CW_CISCO_SPAM_DOMAIN_SECRET 96
|
||||
|
||||
#define CW_CISCO_SPAM_VENDOR_SPECIFIC 104
|
||||
|
||||
@ -203,6 +204,8 @@ int cw_in_check_cipwap_join_req(struct conn *conn, struct cw_action_in *a, uint8
|
||||
|
||||
|
||||
|
||||
int cw_out_cisco_wtp_radio_cfg(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
|
||||
|
||||
|
||||
/*
|
||||
#define cw_addelem_cisco_rad(dst,acinfo)\
|
||||
@ -213,6 +216,8 @@ int cw_in_check_cipwap_join_req(struct conn *conn, struct cw_action_in *a, uint8
|
||||
|
||||
|
||||
/* cwmsg methods */
|
||||
|
||||
/*
|
||||
#define cwmsg_addelem_cisco_ap_timesync(cwmsg,time,type)\
|
||||
(cwmsg)->pos+=cw_addelem_cisco_ap_timesync(((cwmsg)->msgelems+(cwmsg)->pos),time,type)
|
||||
|
||||
@ -234,5 +239,7 @@ int cw_in_check_cipwap_join_req(struct conn *conn, struct cw_action_in *a, uint8
|
||||
#define cwmsg_addelem_cisco_wtp_radio_cfg(cwmsg,radioinfo)\
|
||||
(cwmsg)->pos+=cw_addelem_cisco_wtp_radio_cfg(((cwmsg)->msgelems+(cwmsg)->pos),radioinfo)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -56,7 +56,11 @@ enum capwap_items {
|
||||
CW_ITEM_IMAGE_FILENAME, /* Full path of image filename */
|
||||
CW_ITEM_DISCOVERIES,
|
||||
CW_ITEM_AC_PRIO_LIST, /* AC Name with Priority list */
|
||||
CW_ITEM_IMAGE_FILEHANDLE /* FILE handle for uploading and downloading images */
|
||||
|
||||
/** FILE handle for uploading and downloading images */
|
||||
CW_ITEM_IMAGE_FILEHANDLE,
|
||||
|
||||
CW_ITEM_RADIO_CFG
|
||||
|
||||
};
|
||||
|
||||
|
@ -21,7 +21,7 @@ struct cw_str capwap_strings_elem[] = {
|
||||
{CW_ELEM_DATA_TRANSFER_DATA, "Data Transfer Data"},
|
||||
{CW_ELEM_DATA_TRANSFER_MODE, "Data Transfer Mode"},
|
||||
{CW_ELEM_DECRYPTION_ERROR_REPORT, "Encryption Error Report"},
|
||||
{CW_ELEM_DECRYPTION_ERROR_REPORT_PERIOD, "Encryption Error Report Period"},
|
||||
{CW_ELEM_DECRYPTION_ERROR_REPORT_PERIOD, "Decryption Error Report Period"},
|
||||
{CW_ELEM_DELETE_MAC_ACL_ENTRY, "Delete MAC ACL Entry"},
|
||||
{CW_ELEM_DELETE_STATION, "Delete Station"},
|
||||
{CW_ELEM_RESERVED_19, "Reserved 19"},
|
||||
|
@ -3,9 +3,10 @@
|
||||
|
||||
struct cw_str capwap_strings_elem80211[] = {
|
||||
|
||||
{CW_ELEM80211_WTP_RADIO_INFORMATION, "802.11 WTP Radio Information"},
|
||||
{CW_STR_STOP,"Unknown"}
|
||||
|
||||
{CW_ELEM80211_ADD_WLAN, "802.11 Add WLAN"},
|
||||
{CW_ELEM80211_ANTENNA, "802.11 Antenna"},
|
||||
{CW_ELEM80211_RATE_SET, " 802.11 Rate Set"},
|
||||
{CW_ELEM80211_WTP_RADIO_INFORMATION, " 802.11 WTP Radio Information"},
|
||||
{CW_STR_STOP, " Unknown "}
|
||||
|
||||
};
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
cw_in_generic, 0, /* start/end callback */ \
|
||||
CW_ITEMTYPE_BSTR, /* Type of element */ \
|
||||
CW_ITEM_SESSION_ID, /* ID to use store */ \
|
||||
4, 16 /* min/max length */
|
||||
2, 16 /* min/max length */
|
||||
|
||||
#define CW_ACTION_IN_CIPWAP_AC_NAME \
|
||||
CW_ELEM_AC_NAME, /* Element ID*/ \
|
||||
|
@ -1,12 +1,16 @@
|
||||
|
||||
#include "capwap.h"
|
||||
#include "cipwap.h"
|
||||
#include "capwap_cisco.h"
|
||||
|
||||
|
||||
struct cw_str cipwap_strings_elem[] = {
|
||||
|
||||
{CW_ELEM_WTP_IPV4_IP_ADDRESS, "WTP IPv4 IP Address"},
|
||||
{CW_ELEM_WTP_IPV6_IP_ADDRESS, "WTP IPv6 IP Address"},
|
||||
|
||||
{CW_CISCO_AP_GROUP_NAME, "WTP Group Name" },
|
||||
|
||||
{0,"Unknown Element"}
|
||||
|
||||
};
|
||||
|
@ -40,6 +40,8 @@
|
||||
#include "itemstore.h"
|
||||
#include "intavltree.h"
|
||||
|
||||
#include "mbag.h"
|
||||
|
||||
/**
|
||||
* Connection Object
|
||||
*/
|
||||
@ -53,6 +55,8 @@ struct conn {
|
||||
cw_itemstore_t remote;
|
||||
cw_itemstore_t local;
|
||||
|
||||
mbag_t radios;
|
||||
|
||||
/** base_mac */
|
||||
bstr_t base_rmac;
|
||||
|
||||
|
@ -444,9 +444,12 @@ int conn_process_packet(struct conn *conn, uint8_t * packet, int len,struct sock
|
||||
/* fragmented, add the packet to fragman */
|
||||
uint8_t *f;
|
||||
f = fragman_add(conn->fragman, packet, offs, payloadlen);
|
||||
if (f == NULL)
|
||||
return 0;
|
||||
if (f == NULL){
|
||||
errno=EAGAIN;
|
||||
return -1;
|
||||
}
|
||||
|
||||
cw_dbg_pkt(DBG_PKT_IN, conn, f+4, *(uint32_t*)f,from);
|
||||
cw_dbg_msg(DBG_MSG_IN, conn, f+4, *(uint32_t*)f,from);
|
||||
int rc = process_message(conn, f + 4, *(uint32_t *) f, from);
|
||||
|
||||
|
@ -105,6 +105,8 @@ const char * cw_cisco_id_to_str(int elem_id)
|
||||
return "Antenna Payload";
|
||||
case CW_CISCO_SUPPORTED_RATES:
|
||||
return "Supported Rates";
|
||||
case CW_CISCO_SPAM_DOMAIN_SECRET:
|
||||
return "SPAM Domain Secret";
|
||||
|
||||
|
||||
default:
|
||||
|
@ -25,9 +25,7 @@ int cw_in_check_img_data_req_ac(struct conn *conn, struct cw_action_in *a, uint8
|
||||
uint32_t vendor_id = vendorstr_get_vendor_id(i->data);
|
||||
|
||||
const char * image_dir;
|
||||
image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR);
|
||||
if ( !image_dir )
|
||||
image_dir="./img/"; //XXX
|
||||
image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR,"./img");
|
||||
|
||||
char * image_filename = malloc(6+vendorstr_len(i->data)+1+strlen(image_dir));
|
||||
if (!image_filename)
|
||||
|
@ -36,9 +36,7 @@ int cw_in_check_img_data_req_wtp(struct conn *conn, struct cw_action_in *a, uint
|
||||
uint32_t vendor_id = vendorstr_get_vendor_id(i->data);
|
||||
|
||||
const char * image_dir;
|
||||
image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR);
|
||||
if ( !image_dir )
|
||||
image_dir="./img/"; //XXX
|
||||
image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR,"./img");
|
||||
|
||||
char * image_filename = malloc(6+vendorstr_len(i->data)+1+strlen(image_dir));
|
||||
if (!image_filename)
|
||||
|
@ -21,6 +21,8 @@ int cw_put_item(uint8_t * dst, struct cw_item *item)
|
||||
return cw_put_dword(dst, item->dword);
|
||||
case CW_ITEMTYPE_BSTR:
|
||||
return cw_put_bstr(dst, item->data);
|
||||
case CW_ITEMTYPE_BSTR16:
|
||||
return cw_put_bstr16(dst,item->data);
|
||||
case CW_ITEMTYPE_VENDORSTR:
|
||||
{
|
||||
int l=0;
|
||||
@ -54,15 +56,21 @@ int cw_out_generic(struct conn *conn, struct cw_action_out *a, uint8_t * dst) //
|
||||
|
||||
int len;
|
||||
if (!item) {
|
||||
const char *vendor="";
|
||||
if ( a->vendor_id ) {
|
||||
vendor=cw_strvendor(a->vendor_id);
|
||||
}
|
||||
if (a->mand) {
|
||||
cw_log(LOG_ERR,
|
||||
"Can't put mandatory element %d - (%s) into %s. No value found.",
|
||||
"Can't put mandatory element %s%d - (%s) into %s. No value found.",
|
||||
vendor,
|
||||
a->elem_id, cw_strelemp(conn->actions, a->elem_id)
|
||||
, cw_strmsg(a->msg_id)
|
||||
);
|
||||
}
|
||||
else{
|
||||
cw_dbg(DBG_WARN,"No output for element %d -(%s) in %s. Item %d not found.",
|
||||
cw_dbg(DBG_WARN,"No output for element %s%d -(%s) in %s. Item %d not found.",
|
||||
vendor,
|
||||
a->elem_id, cw_strelemp(conn->actions, a->elem_id)
|
||||
, cw_strmsg(a->msg_id),a->item_id);
|
||||
|
||||
|
@ -32,16 +32,24 @@ int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t *
|
||||
uint8_t *d = dst+4;
|
||||
|
||||
d+=cw_put_byte(d,2); //max radios
|
||||
d+=cw_put_byte(d,0); //radios in use
|
||||
d+=cw_put_byte(d,2); //radios in use
|
||||
d+=cw_put_encryption_subelems(d);
|
||||
|
||||
cw_item_t * i;
|
||||
i = cw_itemstore_get(conn->outgoing,CW_ITEM_WTP_HARDWARE_VERSION);
|
||||
i = cw_itemstore_get(conn->local,CW_ITEM_WTP_HARDWARE_VERSION);
|
||||
if ( i ) {
|
||||
d += cw_put_version(d,CW_SUBELEM_WTP_HARDWARE_VERSION,i->data);
|
||||
}
|
||||
else {
|
||||
cw_log(LOG_ERR, "Can't send hard version in WTP descriptor, not set.");
|
||||
cw_log(LOG_ERR, "Can't send Hardware Version in WTP Descriptor, not set.");
|
||||
}
|
||||
|
||||
i = cw_itemstore_get(conn->local,CW_ITEM_WTP_SOFTWARE_VERSION);
|
||||
if ( i ) {
|
||||
d += cw_put_version(d,CW_SUBELEM_WTP_SOFTWARE_VERSION,i->data);
|
||||
}
|
||||
else {
|
||||
cw_log(LOG_ERR, "Can't send Software Version in WTP descriptor, not set.");
|
||||
}
|
||||
|
||||
|
||||
|
@ -495,5 +495,45 @@ void cw_dbg_colored(int level, const char *file, int line, const char *format, .
|
||||
|
||||
}
|
||||
|
||||
int cw_is_utf8(unsigned char *str, size_t len);
|
||||
|
||||
|
||||
int cw_format_item(char *dst,cw_item_t * item)
|
||||
{
|
||||
*dst=0;
|
||||
switch (item->type) {
|
||||
case CW_ITEMTYPE_BSTR16:
|
||||
strncpy(dst,bstr16_data(item->data),bstr16_len(item->data));
|
||||
*(dst+bstr16_len(item->data))=0;
|
||||
return bstr16_len(item->data);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_istore_dmp(cw_itemstore_t s)
|
||||
{
|
||||
DEFINE_AVLITER(it,s);
|
||||
avliter_foreach(&it) {
|
||||
|
||||
cw_item_t *i = avliter_get(&it);
|
||||
|
||||
char buffer[1000];
|
||||
|
||||
struct cw_str * strings = cw_item_strings;
|
||||
|
||||
const char * in = cw_strlist_get_str(strings,i->id);
|
||||
|
||||
cw_format_item(buffer,i);
|
||||
printf("Item ID %d-%s: %s\n",i->id,in,buffer);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**@}*/
|
||||
|
||||
|
@ -88,15 +88,17 @@ int cw_itemstore_set_bstr16n(cw_itemstore_t s, uint32_t id, uint8_t * data, int
|
||||
extern int cw_itemstore_set_data(cw_itemstore_t s, uint32_t id, const uint8_t * data,
|
||||
int len);
|
||||
|
||||
static inline char *cw_itemstore_get_str(cw_itemstore_t s, uint32_t id)
|
||||
static inline char *cw_itemstore_get_str(cw_itemstore_t s, uint32_t id, char *def)
|
||||
{
|
||||
struct cw_item *i = cw_itemstore_get(s, id);
|
||||
if (!i)
|
||||
return NULL;
|
||||
return def;
|
||||
return i->data;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
static inline struct avltree *cw_itemstore_get_avltree(cw_itemstore_t s, uint32_t id)
|
||||
{
|
||||
struct cw_item *i = cw_itemstore_get(s, id);
|
||||
@ -139,5 +141,34 @@ int cw_itemstore_set(cw_itemstore_t itemstore, uint32_t item_id, int item_type,
|
||||
struct cw_item *cw_item_create(cw_itemstore_t s, uint32_t id);
|
||||
|
||||
|
||||
static inline void * cw_istore_get_data(cw_itemstore_t s,int id,void *def)
|
||||
{
|
||||
struct cw_item *i = cw_itemstore_get(s, id);
|
||||
if (!i)
|
||||
return def;
|
||||
return i->data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline uint8_t cw_istore_get_byte(cw_itemstore_t s, uint32_t id, uint8_t def)
|
||||
{
|
||||
struct cw_item *i = cw_itemstore_get(s, id);
|
||||
if (!i)
|
||||
return def;
|
||||
return i->byte;
|
||||
}
|
||||
|
||||
static inline uint16_t cw_istore_get_word(cw_itemstore_t s, uint32_t id, uint8_t def)
|
||||
{
|
||||
struct cw_item *i = cw_itemstore_get(s, id);
|
||||
if (!i)
|
||||
return def;
|
||||
return i->word;
|
||||
}
|
||||
|
||||
#define cw_istore_get_bstr(s,id,def) cw_istore_get_data(s,id,def)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -226,6 +226,13 @@ static inline int lw_put_bstr(uint8_t * dst, const bstr_t b){
|
||||
return bstr_len(b);
|
||||
}
|
||||
|
||||
static inline int lw_put_bstr16(uint8_t * dst, const bstr16_t b){
|
||||
lw_put_data(dst,bstr16_data(b),bstr16_len(b));
|
||||
return bstr16_len(b);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline int lw_put_str(uint8_t*dst,const uint8_t *str) {
|
||||
return lw_put_data(dst,str,strlen((char*)str));
|
||||
}
|
||||
|
@ -21,8 +21,15 @@
|
||||
* @brief Yet another avl tree implementation!
|
||||
*/
|
||||
|
||||
#ifndef __AVLTREE_H
|
||||
#define __AVLTREE_H
|
||||
|
||||
/**
|
||||
* @defgroup MavlFunctions MAVL Functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MAVL_H
|
||||
#define __MAVL_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@ -34,7 +41,7 @@
|
||||
The number of nodes is calculated by 2^depth.
|
||||
So a value of 32 should be enough for around 4
|
||||
billion nodes. */
|
||||
#define AVLTREE_MAX_DEPTH 32
|
||||
#define MAVL_MAX_DEPTH 32
|
||||
|
||||
/**
|
||||
* Defines the structure of an AVL Node.
|
||||
@ -50,12 +57,19 @@ struct mavlnode {
|
||||
* AVL Tree
|
||||
*/
|
||||
struct mavl {
|
||||
/** Pointer to root node */
|
||||
struct mavlnode *root;
|
||||
/** Compare function */
|
||||
int (*cmp) (const void *, const void *);
|
||||
/** Delete element function */
|
||||
void (*del) (void *);
|
||||
/** Number of elements currently stored in the tree */
|
||||
int count;
|
||||
};
|
||||
|
||||
/**
|
||||
* MAVL AVL Tree type
|
||||
*/
|
||||
typedef struct mavl * mavl_t;
|
||||
|
||||
|
||||
@ -64,6 +78,7 @@ typedef struct mavl * mavl_t;
|
||||
struct mavl *mavl_create(int (*cmp) (const void *, const void *),
|
||||
void (*del) (void *));
|
||||
//void mavl_destroy(struct mavl *t);
|
||||
void mavlnode_destroy(struct mavl *t, struct mavlnode *n);
|
||||
|
||||
void mavl_del_all(struct mavl *t);
|
||||
void *mavl_del(struct mavl *t, void *data);
|
||||
@ -120,7 +135,7 @@ static inline void mavl_destroy(struct mavl *t)
|
||||
|
||||
|
||||
struct mavliter{
|
||||
struct mavlnode *stack[AVLTREE_MAX_DEPTH*2];
|
||||
struct mavlnode *stack[MAVL_MAX_DEPTH*2];
|
||||
|
||||
struct mavlnode *cur;
|
||||
int stack_ptr;
|
||||
@ -171,11 +186,17 @@ static inline void * mavliter_get(mavliter_t *i){
|
||||
|
||||
extern void * mavliter_seek(mavliter_t *i,void *d);
|
||||
|
||||
|
||||
#define DEFINE_MAVLITER(i,t)\
|
||||
/**
|
||||
* Define a AVL Iterator Varialble and acciciate it with
|
||||
* an AVL Tree.
|
||||
* @param i Name of Variable to define
|
||||
* @param t #mavl_t Tree to associate.
|
||||
*/
|
||||
#define MAVLITER_DEFINE(i,t)\
|
||||
mavliter_t i; mavliter_init(&i,t)
|
||||
|
||||
|
||||
|
||||
#define mavliter_foreach(i)\
|
||||
for (mavliter_seek_set(i); NULL != mavliter_get(i); mavliter_next(i))
|
||||
|
||||
@ -186,6 +207,7 @@ extern void * mavliter_seek(mavliter_t *i,void *d);
|
||||
while(NULL != (val = mavliter_next(iter)))
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "mavl.h"
|
||||
|
||||
static void mavlnode_destroy(struct mavl *t, struct mavlnode *n)
|
||||
void mavlnode_destroy(struct mavl *t, struct mavlnode *n)
|
||||
{
|
||||
if (t->del) {
|
||||
t->del(n->data);
|
||||
|
@ -31,7 +31,7 @@
|
||||
*/
|
||||
void * mavl_get(struct mavl *t ,void *data)
|
||||
{
|
||||
struct avlnode *n = t->root;
|
||||
struct mavlnode *n = t->root;
|
||||
while(n){
|
||||
int rc=t->cmp(data,n->data);
|
||||
if (rc==0)
|
||||
|
@ -28,6 +28,12 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* CAPWAP timer type, used in #cw_timer_start and #cw_timer_timeout.
|
||||
*/
|
||||
typedef time_t cw_timer_t;
|
||||
|
||||
|
||||
/**
|
||||
* Start a timer.
|
||||
* @param t number of seconds until the timer expires
|
||||
@ -55,7 +61,7 @@
|
||||
*
|
||||
* @param c name of the variable
|
||||
*/
|
||||
#define DEFINE_CLOCK(c)\
|
||||
#define CLOCK_DEFINE(c)\
|
||||
struct timeval c;
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user