From 57187811383db6b882d9dd0172fbd8f60a3d153c Mon Sep 17 00:00:00 2001
From: "7u83@mail.ru" <7u83@mail.ru@noemail.net>
Date: Fri, 9 Mar 2018 06:44:17 +0000
Subject: [PATCH] New message handler format
FossilOrigin-Name: bb2a1847072e2bf5e381dfdf0c4465b064c3feaab0faf51f93a7f4b8d2bcd999
---
libcw.project | 3 +-
src/cw/capwap.h | 5 +-
src/cw/capwap_strings_elem.c | 2 +-
src/cw/conn_process_packet.c | 38 +++++++--
src/cw/connlist.c | 28 ++++---
src/cw/cw.h | 22 +++--
src/cw/cw_dbg_elem.c | 56 ++++++++-----
src/cw/cw_format_dump.c | 8 +-
src/cw/cw_in_generic.c | 7 +-
src/cw/cw_in_vendor_specific_payload.c | 43 +++++-----
src/cw/cw_kvstore_add.c | 10 ++-
src/cw/cw_read_descriptor_subelems.c | 2 +-
src/cw/cw_read_wtp_descriptor_7.c | 10 ++-
.../{cw_type_version.c => cw_type_bstr16.c} | 13 ++-
src/cw/cw_type_word.c | 47 +++++------
src/cw/cw_types.h | 5 +-
src/cw/dbg.c | 81 ++-----------------
src/cw/dbg.h | 7 +-
src/cw/dtls_gnutls_accept.c | 21 ++---
src/cw/mavl.h | 2 +-
src/cw/mavl_add.c | 11 ++-
src/cw/message_set.h | 13 ++-
src/mod/capwap/capwap_actions_ac.c | 30 ++++---
src/mod/capwap/capwap_actions_wtp.c | 4 +-
src/mod/capwap/capwap_in_wtp_board_data.c | 66 ++++++++++-----
src/mod/capwap/capwap_in_wtp_descriptor.c | 8 +-
src/mod/capwap/mod_capwap.h | 11 ++-
src/mod/cisco/cisco.h | 7 +-
src/mod/cisco/cisco_actions_ac.c | 32 +++++++-
src/mod/cisco/cisco_actions_wtp.c | 4 +-
src/mod/cisco/cisco_in_wtp_descriptor.c | 6 +-
src/mod/fortinet/fortinet_actions_ac.c | 4 +-
src/mod/fortinet/fortinet_actions_wtp.c | 4 +-
33 files changed, 350 insertions(+), 260 deletions(-)
rename src/cw/{cw_type_version.c => cw_type_bstr16.c} (90%)
diff --git a/libcw.project b/libcw.project
index df3e0d0a..f849bb58 100644
--- a/libcw.project
+++ b/libcw.project
@@ -318,7 +318,6 @@
-
@@ -326,6 +325,8 @@
+
+
diff --git a/src/cw/capwap.h b/src/cw/capwap.h
index a563e844..4cf25bfb 100644
--- a/src/cw/capwap.h
+++ b/src/cw/capwap.h
@@ -230,7 +230,7 @@
#define CAPWAP_ELEM_DISCOVERY_TYPE 20
#define CW_ELEM_DUPLICATE_IPV4_ADDRESS 21
#define CW_ELEM_DUPLICATE_IPV6_ADRESS 22
-#define CW_ELEM_ECN_SUPPORT 53
+#define CAPWAP_ELEM_ECN_SUPPORT 53
#define CW_ELEM_IDLE_TIMEOUT 23
#define CW_ELEM_IMAGE_DATA 24
#define CW_ELEM_IMAGE_IDENTIFIER 25
@@ -636,8 +636,11 @@ const char *cw_strelemp_(cw_strheap_t h, int msg_id);
//int cw_process_msg(struct conn *conn, uint8_t * rawmsg, int len);
*/
+/*
extern int cw_in_vendor_specific_payload(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len,struct sockaddr *from);
+*/
+
extern int cw_in_wtp_name(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
extern int cw_in_wtp_board_data(struct conn *conn, struct cw_action_in *a, uint8_t * data,
diff --git a/src/cw/capwap_strings_elem.c b/src/cw/capwap_strings_elem.c
index 87fff8bf..ee7a387a 100644
--- a/src/cw/capwap_strings_elem.c
+++ b/src/cw/capwap_strings_elem.c
@@ -29,7 +29,7 @@ struct cw_strlist_elem capwap_strings_elem[] = {
{CAPWAP_ELEM_DISCOVERY_TYPE, "Discovery Type"},
{CW_ELEM_DUPLICATE_IPV4_ADDRESS, "Duplicate IPv4 Address"},
{CW_ELEM_DUPLICATE_IPV6_ADRESS, "Duplicate IPv6 Address"},
- {CW_ELEM_ECN_SUPPORT, "ECN Support"},
+ {CAPWAP_ELEM_ECN_SUPPORT, "ECN Support"},
{CW_ELEM_IDLE_TIMEOUT, "Idle Timeout"},
{CW_ELEM_IMAGE_DATA, "Image Data"},
{CW_ELEM_IMAGE_IDENTIFIER, "Image Identifier"},
diff --git a/src/cw/conn_process_packet.c b/src/cw/conn_process_packet.c
index 011ceb4b..d7790217 100644
--- a/src/cw/conn_process_packet.c
+++ b/src/cw/conn_process_packet.c
@@ -372,9 +372,32 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
/* iterate through message elements */
cw_foreach_elem(elem, elems_ptr, elems_len) {
- struct cw_ElemHandler *handler;
- struct cw_ElemData * elem_data, elem_data_search;
- int elem_len, elem_id;
+ struct cw_ElemHandlerParams params;
+ int elem_len, elem_id, max_len;
+ uint8_t * elem_data;
+
+
+ elem_len = cw_get_elem_len(elem);
+ elem_data=cw_get_elem_data(elem);
+ elem_id = cw_get_elem_id(elem);
+
+ max_len=elems_len-(elem_data-elems_ptr);
+ if (elem_len > max_len){
+ cw_dbg(DBG_RFC,
+ "Messag element claims size of %d bytes, but only %d bytes are left in the payload, truncating.",
+ elem_len,max_len-4);
+ }
+
+
+
+ params.conn=conn;
+ params.from=from;
+ params.msgdata=message;
+
+ cw_process_element(¶ms,0,0,elem_id,elem_data,elem_len); //elems_len-(elem-elems_ptr));
+
+
+/*
elem_id = cw_get_elem_id(elem);
@@ -401,13 +424,14 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
elem_len = cw_get_elem_len(elem);
-/*printf ("Would start elem processing now %d - %s\n",handler->id, handler->name);
-*/
- cw_dbg_elem(DBG_ELEM, conn, message->type, handler->id,
+
+//printf ("Would start elem processing now %d - %s\n",handler->id, handler->name);
+
+ cw_dbg_elem(DBG_ELEM, conn, message->type, handler,
cw_get_elem_data(elem),elem_len);
handler->get(conn, handler, cw_get_elem_data(elem), elem_len, from);
-
+*/
continue;
exit(0);
diff --git a/src/cw/connlist.c b/src/cw/connlist.c
index 43cbe3ee..5ebbbcb7 100644
--- a/src/cw/connlist.c
+++ b/src/cw/connlist.c
@@ -37,19 +37,18 @@
-
-static int cmp_by_addr(const void * d1,const void *d2)
+static int cmp_by_addr(const mavldata_t * d1,const mavldata_t *d2)
{
- struct conn * c1=(struct conn *) d1;
- struct conn * c2=(struct conn *) d2;
+ struct conn * c1=(struct conn *) d1->ptr;
+ struct conn * c2=(struct conn *) d2->ptr;
return sock_cmpaddr((struct sockaddr*)&c1->addr,(struct sockaddr*)&c2->addr,1);
}
-static int cmp_by_session_id(const void *d1, const void *d2)
+static int cmp_by_session_id(const mavldata_t *d1, const mavldata_t *d2)
{
- struct conn * c1=(struct conn *) d1;
- struct conn * c2=(struct conn *) d2;
+ struct conn * c1=(struct conn *) d1->ptr;
+ struct conn * c2=(struct conn *) d2->ptr;
return memcmp(c1->session_id,c2->session_id,16);
}
@@ -111,7 +110,7 @@ struct conn * connlist_get(struct connlist * cl, const struct sockaddr * addr)
{
struct conn search;
sock_copyaddr(&search.addr,addr);
- return mavl_get(cl->by_addr,&search);
+ return mavl_get_ptr(cl->by_addr,&search);
}
@@ -121,23 +120,26 @@ struct conn * connlist_add(struct connlist * cl, struct conn * conn)
if (cl->by_addr->count>=cl->len)
return NULL;
conn->connlist=cl;
- return mavl_add(cl->by_addr,conn);
+ return mavl_add_ptr(cl->by_addr,conn);
}
struct conn * connlist_get_by_session_id(struct connlist *cl, struct conn * conn)
{
- return mavl_get(cl->by_session_id,conn);
+ return mavl_get_ptr(cl->by_session_id,conn);
}
struct conn * connlist_add_by_session_id(struct connlist * cl, struct conn * conn)
{
- return mavl_add(cl->by_session_id,conn);
+ return mavl_add_ptr(cl->by_session_id,conn);
}
void connlist_remove(struct connlist *cl,struct conn * conn)
{
- mavl_del(cl->by_session_id,conn);
- mavl_del(cl->by_addr,conn);
+ mavldata_t md;
+ md.ptr=conn;
+ mavl_del(cl->by_session_id,&md);
+ md.ptr=conn;
+ mavl_del(cl->by_addr,&md);
}
diff --git a/src/cw/cw.h b/src/cw/cw.h
index adad2aa3..ebe486b6 100644
--- a/src/cw/cw.h
+++ b/src/cw/cw.h
@@ -350,10 +350,14 @@ extern int cw_in_mtu_discovery_padding(struct conn *conn, struct cw_action_in *a
* @defgroup CWELEMIN Input Handlers for Message Elements
* @{
*/
+
+ /*
int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler,
uint8_t * elem_data, int elem_len, struct sockaddr * from);
+*/
-
+int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
+ uint8_t * elem_data, int elem_len);
@@ -364,8 +368,10 @@ extern int cw_in_wtp_reboot_statistics(struct conn *conn, struct cw_action_in *a
extern int cw_in_wtp_board_data(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len, struct sockaddr *from);
-extern int cw_in_vendor_specific_payload(struct conn *conn, struct cw_action_in *a,
- uint8_t * data, int len, struct sockaddr *from);
+
+int cw_in_vendor_specific_payload(struct cw_ElemHandler *handler,
+ struct cw_ElemHandlerParams *params,
+ uint8_t * data, int len);
extern int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len,
@@ -383,8 +389,14 @@ extern int cw_in_radio_operational_state(struct conn *conn, struct cw_action_in
uint8_t * data, int len, struct sockaddr *from);
-
-
+/*
+int cw_process_element(struct conn * conn,
+ struct cw_MsgData * msgdata, int proto, int vendor,
+ uint8_t * elem, int max_len);
+*/
+int cw_process_element(struct cw_ElemHandlerParams *params,
+ int proto, int vendor,int msgid,
+ uint8_t * elem, int max_len);
/**
* @}
diff --git a/src/cw/cw_dbg_elem.c b/src/cw/cw_dbg_elem.c
index 22d04918..985c277c 100644
--- a/src/cw/cw_dbg_elem.c
+++ b/src/cw/cw_dbg_elem.c
@@ -3,11 +3,16 @@
#include "dbg.h"
#include "format.h"
+
+
+
+
/**
* print debug info for message elements
*/
-void cw_dbg_elem_x(int level, struct conn *conn, int msg, int msgelem,
+void cw_dbg_elem(int level, struct conn *conn, int msg,
+ struct cw_ElemHandler * handler,
const uint8_t * msgbuf, int len)
{
@@ -16,46 +21,57 @@ void cw_dbg_elem_x(int level, struct conn *conn, int msg, int msgelem,
char vendorname[256];
char vendor_details[265];
+
if (!cw_dbg_is_level(level))
return;
*vendor_details = 0;
+/* handler = cw_msgset_get_elemhandler(conn->msgset,0,0,msgelem);
+ if (!handler)
+ return;
+*/
+
/*
/// TODO XXXX
*/
-
-/*
- if (msgelem == CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD) {
+/* if (msgelem == -1) {
uint32_t vendor_id = ntohl(*((uint32_t *) msgbuf));
int type = ntohs(*((uint16_t *) (msgbuf + 4)));
cw_format_vendor(vendor_details, vendor_id, type, msgbuf);
-// sprintf(vendorname, "%s/%s/%s",
-// cw_strelemp(conn->actions, msgelem),
-// (char *) cw_strvendor(vendor_id), vendor_details);
-
elemname = vendorname;
} else {
-
-// elemname = cw_strelemp(conn->actions, msgelem);
-
- elemname=0;
+ elemname=handler->name;
}
*/
+ if (handler->vendor){
+ sprintf(vendorname,"Vendor %s",cw_strvendor(handler->vendor));
+ }
+ else{
+ sprintf(vendorname,"");
+ }
-/*&
- if (!cw_dbg_is_level(DBG_ELEM_DMP)) {
- cw_dbg(DBG_ELEM, "%d (%s), len=%d", msgelem, elemname, len);
- } else {
+
+ if (cw_dbg_is_level(DBG_ELEM_DMP)) {
+ /*
+ char *dmp = cw_dbg_mkdmp(msgbuf, len);
+ */
char *dmp;
dmp = cw_format_dump(msgbuf,len,NULL);
- cw_dbg(DBG_ELEM, "%d (%s), len=%d%s%s",
- msgelem, elemname, len, get_dbg_color_ontext(DBG_ELEM_DMP), dmp);
+ cw_dbg(DBG_ELEM, "%s %d (%s), len=%d%s%s",
+ vendorname,
+ handler->id, handler->name, len, /*get_dbg_color_ontext(DBG_ELEM_DMP)*/ "", dmp);
free(dmp);
}
-*/
- }
\ No newline at end of file
+ else
+ cw_dbg(DBG_ELEM, "%s %d (%s), len=%d",
+ vendorname,
+ handler->id, handler->name, len);
+
+}
+
+
diff --git a/src/cw/cw_format_dump.c b/src/cw/cw_format_dump.c
index 1715a790..a7f89df6 100644
--- a/src/cw/cw_format_dump.c
+++ b/src/cw/cw_format_dump.c
@@ -7,14 +7,14 @@
static struct cw_FormatDumpSettings CW_FORMAT_DUMP_SETTINGS = {
- 32, /* row_len */
+ 24, /* row_len */
8, /* marker_distance */
'|', /* marker_char */
1, /* ascii */
0, /* inv_len */
'*', /* inv_char */
"\n\t", /* dump_prefix */
- "" /* dump_suffix */
+ "", /* dump_suffix */
" ", /* ascii_prefix */
"\n\t" /* newline */
};
@@ -81,7 +81,7 @@ char *cw_format_dump(const uint8_t * data, int len,
if (len % settings->row_len)
rows++;
- size = strlen(settings->dump_prefix) +
+ size = strlen(settings->dump_prefix) + strlen(settings->dump_suffix) +
rows * strlen(settings->newline) +
(settings->ascii ? rows*settings->row_len*3 : len * 3);
@@ -106,7 +106,7 @@ char *cw_format_dump(const uint8_t * data, int len,
rlen = len-pos;
}
pdst += cw_format_dump_row(pdst,data+pos, rlen, settings);
- if(rownewline);
else
pdst += sprintf(pdst,"%s",settings->dump_suffix);
diff --git a/src/cw/cw_in_generic.c b/src/cw/cw_in_generic.c
index 1cbad4b4..386f6f75 100644
--- a/src/cw/cw_in_generic.c
+++ b/src/cw/cw_in_generic.c
@@ -3,8 +3,8 @@
#include "kvstore.h"
#include "log.h"
-int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler,
- uint8_t * elem_data, int elem_len, struct sockaddr * from){
+int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
+ uint8_t * elem_data, int elem_len){
/* mavldata_t data, *result;
char str[30];
*/
@@ -13,7 +13,8 @@ int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler,
cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
return 0;
}
- cw_kvstore_add(conn->remote_cfg, handler->key, handler->type, elem_data,elem_len);
+ cw_kvstore_add(params->conn->remote_cfg, handler->key, handler->type, elem_data,elem_len);
+
/*
result = handler->type->get(&data,elem_data,elem_len);
diff --git a/src/cw/cw_in_vendor_specific_payload.c b/src/cw/cw_in_vendor_specific_payload.c
index 2651472c..f77d0d5a 100644
--- a/src/cw/cw_in_vendor_specific_payload.c
+++ b/src/cw/cw_in_vendor_specific_payload.c
@@ -2,7 +2,6 @@
#include "cw.h"
#include "dbg.h"
#include "log.h"
-#include "stravltree.h"
/**
* @file
@@ -12,38 +11,32 @@
/**
* Default handler for Vendor Specific Payload message elements.
*/
-int cw_in_vendor_specific_payload(struct conn *conn, struct cw_action_in *a,
- uint8_t * data, int len, struct sockaddr *from)
+int cw_in_vendor_specific_payload(struct cw_ElemHandler *handler,
+ struct cw_ElemHandlerParams *params,
+ uint8_t * data, int len)
{
- cw_action_in_t as, *af;
- as = *a;
-
- as.vendor_id = cw_get_dword(data);
- as.elem_id = cw_get_word(data + 4);
+ struct cw_ElemHandler *vhandler;
+
+ uint32_t vendor_id, elem_id;
+
+ vendor_id = cw_get_dword(data);
+ elem_id = cw_get_word(data + 4);
-/*
- // TODO XXXX
-// af = cw_actionlist_in_get(conn->actions->in, &as);
-*/ af = 0;
+ printf("Spec handler looking for %d %d %d\n",0,vendor_id,elem_id);
+ vhandler = cw_msgset_get_elemhandler(params->conn->msgset,0,vendor_id,elem_id);
+
- if (!af) {
+ if (!vhandler) {
cw_dbg(DBG_WARN,
"Can't handle Vendor Specific Payload %s/%d, in msg %d (%s) in %s state.",
- cw_strvendor(as.vendor_id), as.elem_id, as.msg_id,
- cw_strmsg(as.msg_id), cw_strstate(as.capwap_state));
+ cw_strvendor(vendor_id), elem_id, params->msgdata->type,
+ params->msgdata->name, cw_strstate(params->conn->capwap_state));
return 0;
}
-
- if (af->start) {
- int afrc = af->start(conn, af, data + 6, len - 6, from);
- if (af->mand && afrc) {
- /* add found mandatory message element
- to mand list */
- stravltree_add(conn->mand, af->item_id);
- }
- return afrc;
- }
+
+ cw_dbg_elem(DBG_ELEM,params->conn,0,vhandler,data+6,len-6);
+ vhandler->get(vhandler, params, data+6, len-6);
return 1;
diff --git a/src/cw/cw_kvstore_add.c b/src/cw/cw_kvstore_add.c
index cc393a69..ff454fc7 100644
--- a/src/cw/cw_kvstore_add.c
+++ b/src/cw/cw_kvstore_add.c
@@ -3,12 +3,16 @@
#include "cw.h"
#include "log.h"
+#include "dbg.h"
const char * cw_kvstore_add(mavl_t kvstore, const char *key, const struct cw_Type *type,
const uint8_t * data, int len)
{
mavldata_t mdata, *mresult;
-
+
+/* cw_dbg(DBG_ELEM,"KVStore (%p,%d) add elem (%s): %s", kvstore, kvstore->count,
+ type->name, key );
+*/
mdata.kv.key=cw_strdup(key);
if (!mdata.kv.key){
cw_log(LOG_ERR, "Can't allocate memory for key %s: %s",
@@ -30,9 +34,9 @@ const char * cw_kvstore_add(mavl_t kvstore, const char *key, const struct cw_Typ
cw_log(LOG_ERR, "Element already exists %s", key);
/* element already exists */
free(mdata.kv.key);
- type->del(mresult);
+ type->del(&mdata);
return key;
}
-
+
return mdata.kv.key;
}
diff --git a/src/cw/cw_read_descriptor_subelems.c b/src/cw/cw_read_descriptor_subelems.c
index 97c23c73..2b69d224 100644
--- a/src/cw/cw_read_descriptor_subelems.c
+++ b/src/cw/cw_read_descriptor_subelems.c
@@ -73,7 +73,7 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
/* version */
sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_KEY_VERSION);
- cw_kvstore_add(cfg,key,CW_TYPE_VERSION,data+sub+8,l);
+ cw_kvstore_add(cfg,key,CW_TYPE_BSTR16,data+sub+8,l);
sprintf(dbgstr, "%s", key);
cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype, vendor_id, data+sub+8,l);
diff --git a/src/cw/cw_read_wtp_descriptor_7.c b/src/cw/cw_read_wtp_descriptor_7.c
index be0f24c0..047f3eac 100644
--- a/src/cw/cw_read_wtp_descriptor_7.c
+++ b/src/cw/cw_read_wtp_descriptor_7.c
@@ -4,6 +4,7 @@
#include "capwap_items.h"
#include "cw_types.h"
#include "keys.h"
+#include "kvstore.h"
static struct cw_DescriptorSubelemDef allowed_default[] = {
@@ -28,12 +29,17 @@ int cw_read_wtp_descriptor_7(mavl_t cfg, struct conn *conn,
char key[64];
sprintf(key,"%s/%s",eh->key, "max_radios");
- md.kv.key=strdup(key);
+/* md.kv.key=strdup(key);
mavl_replace (cfg, cw_type_byte.get(&md,data,1));
+*/
+ cw_kvstore_add(cfg,key,CW_TYPE_BYTE,data,1);
sprintf(key,"%s/%s",eh->key, "radios_in_use");
- md.kv.key=strdup(key);
+ cw_kvstore_add(cfg,key,CW_TYPE_BYTE,data+1,1);
+
+/* md.kv.key=strdup(key);
mavl_replace (cfg, cw_type_byte.get(&md,data+1,1));
+*/
/* mbag_set_byte(mbag, CW_ITEM_WTP_MAX_RADIOS, cw_get_byte(data));
mbag_set_byte(mbag, CW_ITEM_WTP_RADIOS_IN_USE, cw_get_byte(data + 1));
diff --git a/src/cw/cw_type_version.c b/src/cw/cw_type_bstr16.c
similarity index 90%
rename from src/cw/cw_type_version.c
rename to src/cw/cw_type_bstr16.c
index d82b723d..09ff87cf 100644
--- a/src/cw/cw_type_version.c
+++ b/src/cw/cw_type_bstr16.c
@@ -22,6 +22,11 @@
#include "cw.h"
#include "cw_types.h"
+
+static void del(mavldata_t * data){
+ free (data->kv.val.ptr);
+}
+
static mavldata_t *get(mavldata_t * data, const uint8_t * src, int len)
{
@@ -30,7 +35,7 @@ static mavldata_t *get(mavldata_t * data, const uint8_t * src, int len)
if (!s)
return NULL;
- data->kv.priv = &cw_type_version;
+ data->kv.priv = &cw_type_bstr16;
data->kv.val.ptr=s;
return data;
}
@@ -61,9 +66,9 @@ static mavldata_t *from_str(mavldata_t * data, const char *src)
}
-const struct cw_Type cw_type_version = {
- "VersionStr", /* name */
- NULL, /* del */
+const struct cw_Type cw_type_bstr16 = {
+ "Bstr16", /* name */
+ del, /* del */
put, /* put */
get, /* get */
to_str, /* to_str */
diff --git a/src/cw/cw_type_word.c b/src/cw/cw_type_word.c
index 52dfb28a..a4622b64 100644
--- a/src/cw/cw_type_word.c
+++ b/src/cw/cw_type_word.c
@@ -21,43 +21,36 @@
#include "cw_types.h"
#include "cw.h"
-/*
-static struct mdata_Elem * from_str(const char *src)
-{
- struct mdata_Elem * e = mdata_elem_new(&cw_type_word);
- if (!e)
- return NULL;
- e->data.word=atoi(src);
- return e;
+static mavldata_t *get(mavldata_t * data, const uint8_t * src, int len)
+{
+ data->kv.priv = &cw_type_word;
+ data->kv.val.word = cw_get_word(src);
+ return data;
}
-
-static int to_str(const struct mdata_Elem *e, char *dst)
+static int put(mavldata_t *data, uint8_t * dst)
{
- return sprintf(dst, "%d", e->data.word);
+ return cw_put_word(dst, data->kv.val.word);
}
-static struct mdata_Elem * get(const uint8_t *src,int len)
+static int to_str(const mavldata_t *data, char *dst, int max_len)
{
- struct mdata_Elem * e = mdata_elem_new(&cw_type_word);
- if (!e)
- return NULL;
- e->data.word=cw_get_word(src);
- return e;
+ return sprintf(dst, "%d", data->kv.val.word);
}
-static int put(struct mdata_Elem * e, uint8_t *dst)
+static mavldata_t *from_str(mavldata_t * data, const char *src)
{
- return cw_put_word(dst,e->data.word);
+ data->kv.val.word = atoi(src);
+ return data;
}
-#define _I_NAME "Word"
-#define _I_PUT put
-#define _I_GET get
-#define _I_DEL NULL
-#define _I_TO_STR to_str
-#define _I_FROM_STR from_str
+const struct cw_Type cw_type_word = {
+ "Word", /* name */
+ cw_types_del_null, /* del */
+ put, /* put */
+ get, /* get */
+ to_str, /* to_str */
+ from_str /* from_str */
+};
-const struct mdata_Type cw_type_word = MDATA_TYPE_INIT();
-*/
diff --git a/src/cw/cw_types.h b/src/cw/cw_types.h
index 7c670060..7c240717 100644
--- a/src/cw/cw_types.h
+++ b/src/cw/cw_types.h
@@ -36,11 +36,12 @@ struct cw_Type{
extern const struct cw_Type cw_type_byte;
extern const struct cw_Type cw_type_word;
extern const struct cw_Type cw_type_dword;
-extern const struct cw_Type cw_type_version;
+extern const struct cw_Type cw_type_bstr16;
#define CW_TYPE_BYTE (&cw_type_byte)
+#define CW_TYPE_WORD (&cw_type_word)
#define CW_TYPE_DWORD (&cw_type_dword)
-#define CW_TYPE_VERSION (&cw_type_version)
+#define CW_TYPE_BSTR16 (&cw_type_bstr16)
void cw_types_del_null(mavldata_t *data);
diff --git a/src/cw/dbg.c b/src/cw/dbg.c
index 03401c44..a41fa904 100644
--- a/src/cw/dbg.c
+++ b/src/cw/dbg.c
@@ -375,65 +375,21 @@ static int cw_format_vendor(char *dst, uint32_t vendor_id, int elem_id,
-/**
- * print debug info for message elements
- */
-
-void cw_dbg_elem_colored(int level, struct conn *conn, int msg, int msgelem,
- const uint8_t * msgbuf, int len)
+void cw_dbg_version_subelem(int level, const char *context, int subtype,
+ uint32_t vendor_id, const uint8_t * vstr, int len)
{
-
-
- const char *elemname;
- char vendorname[256];
- char vendor_details[265];
- struct cw_ElemHandler * handler;
+ char v[2048];
+ int n;
if (!cw_dbg_is_level(level))
return;
-
- *vendor_details = 0;
-
- handler = cw_msgset_get_elemhandler(conn->msgset,0,0,msgelem);
- if (!handler)
+ if (!vstr)
return;
-
-
-/*
-/// TODO XXXX
-*/
- if (msgelem == CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD) {
- uint32_t vendor_id = ntohl(*((uint32_t *) msgbuf));
- int type = ntohs(*((uint16_t *) (msgbuf + 4)));
- cw_format_vendor(vendor_details, vendor_id, type, msgbuf);
-/* sprintf(vendorname, "%s/%s/%s",
- cw_strelemp(conn->actions, msgelem),
- (char *) cw_strvendor(vendor_id), vendor_details);
-*/
- elemname = vendorname;
-
- } else {
-/*
-// elemname = cw_strelemp(conn->actions, msgelem);
-*/
- elemname=handler->name;
- }
-
-
- if (!cw_dbg_is_level(DBG_ELEM_DMP)) {
- cw_dbg(DBG_ELEM, "%d (%s), len=%d", msgelem, elemname, len);
- } else {
- /*
- char *dmp = cw_dbg_mkdmp(msgbuf, len);
- */
- char *dmp;
- dmp = cw_format_dump(msgbuf,len,NULL);
+ n = cw_format_version(v, vstr, len);
- cw_dbg(DBG_ELEM, "%d (%s), len=%d%s%s",
- msgelem, elemname, len, get_dbg_color_ontext(DBG_ELEM_DMP), dmp);
+ sprintf(v + n, ", Vendor Id: %d, %s", vendor_id, cw_strvendor(vendor_id));
- free(dmp);
- }
+ cw_dbg(level, "%s: SubType %d, %s", context, subtype, v);
}
@@ -479,27 +435,6 @@ int cw_format_item(char *dst, mbag_item_t * item)
-void cw_dbg_version_subelem(int level, const char *context, int subtype,
- uint32_t vendor_id, const uint8_t * vstr, int len)
-{
- char v[2048];
- int n;
-
- if (!cw_dbg_is_level(level))
- return;
- if (!vstr)
- return;
- n = cw_format_version(v, vstr, len);
-
- sprintf(v + n, ", Vendor Id: %d, %s", vendor_id, cw_strvendor(vendor_id));
-
- cw_dbg(level, "%s: SubType %d, %s", context, subtype, v);
-}
-
-
-
-
-
diff --git a/src/cw/dbg.h b/src/cw/dbg.h
index 5a67d99b..cfce7037 100644
--- a/src/cw/dbg.h
+++ b/src/cw/dbg.h
@@ -26,6 +26,7 @@
#define __DBG_H
#include "conn.h"
+#include "cw.h"
#ifndef CW_LOG_DUMP_ROW_LEN
@@ -57,9 +58,10 @@ void cw_dbg_dmp(int level, const uint8_t * data, int len, const char *format, ..
*/
-
+/*
#define cw_dbg_elem(level,conn,msgtype,msgelemtype,msgbuf,msglen)\
cw_dbg_elem_colored(level,conn,msgtype,msgelemtype,msgbuf,msglen)
+*/
#endif
@@ -113,7 +115,8 @@ extern struct cw_strlist_elem cw_dbg_strings[];
void cw_dbg_dmp_(int level, const uint8_t * data, int len, const char *format, ...);
-extern void cw_dbg_elem_colored(int level, struct conn *conn, int msg, int msgelem,
+
+extern void cw_dbg_elem(int level, struct conn *conn, int msg, struct cw_ElemHandler * handler,
const uint8_t * msgbuf, int len);
diff --git a/src/cw/dtls_gnutls_accept.c b/src/cw/dtls_gnutls_accept.c
index 707532ac..99f99681 100644
--- a/src/cw/dtls_gnutls_accept.c
+++ b/src/cw/dtls_gnutls_accept.c
@@ -39,29 +39,33 @@ int dtls_gnutls_accept(struct conn *conn)
{
char sock_buf[SOCK_ADDR_BUFSIZE];
struct dtls_gnutls_data *d;
+ uint8_t buffer[2048];
+ int tlen, rc;
+ time_t c_timer;
gnutls_datum_t cookie_key;
-
+ gnutls_dtls_prestate_st prestate;
+
gnutls_key_generate(&cookie_key, GNUTLS_COOKIE_KEY_SIZE);
cw_dbg(DBG_DTLS, "Session cookie for %s generated: %s",
- sock_addr2str(&conn->addr,sock_buf), sock_hwaddr2idstr((uint8_t *) (&cookie_key),
- sizeof(cookie_key)));
+ sock_addr2str(&conn->addr,sock_buf), sock_hwaddrtostr((uint8_t *) (&cookie_key),
+ sizeof(cookie_key),sock_buf,""));
+
- gnutls_dtls_prestate_st prestate;
memset(&prestate, 0, sizeof(prestate));
- uint8_t buffer[2048];
- int tlen;
tlen = dtls_gnutls_bio_read(conn, buffer, sizeof(buffer));
gnutls_dtls_cookie_send(&cookie_key, &conn->addr, sizeof(conn->addr),
&prestate, (gnutls_transport_ptr_t) conn, dtls_gnutls_bio_write);
- int rc=-1;
+ rc=-1;
+
- time_t c_timer = cw_timer_start(10);
+
+ c_timer = cw_timer_start(10);
while(!cw_timer_timeout(c_timer)){
@@ -84,7 +88,6 @@ int dtls_gnutls_accept(struct conn *conn)
continue;
}
- // dtls_gnutls_bio_read(conn, buffer, sizeof(buffer));
break;
}
diff --git a/src/cw/mavl.h b/src/cw/mavl.h
index 3447767c..0d2ffbc2 100644
--- a/src/cw/mavl.h
+++ b/src/cw/mavl.h
@@ -121,7 +121,7 @@ void mavlnode_destroy(struct mavl *t, struct mavlnode *n);
void mavl_del_all(struct mavl *t);
union mavldata *mavl_del(struct mavl *t, union mavldata *data);
-union mavldata *mavl_add(struct mavl *t, const union mavldata *data);
+union mavldata *mavl_add(struct mavl *t, union mavldata *data);
union mavldata * mavl_get(struct mavl *t ,union mavldata *data);
struct mavlnode *mavl_get_node(struct mavl *t, union mavldata *data);
void * mavl_get_ptr(mavl_t tree, void * search);
diff --git a/src/cw/mavl_add.c b/src/cw/mavl_add.c
index 18fe8887..479c1d02 100644
--- a/src/cw/mavl_add.c
+++ b/src/cw/mavl_add.c
@@ -1,6 +1,6 @@
#include "mavl.h"
-static struct mavlnode *mavlnode_create(union mavldata *data)
+static struct mavlnode *mavlnode_create(const union mavldata *data)
{
struct mavlnode *n = malloc(sizeof(struct mavlnode));
if (!n)
@@ -169,16 +169,19 @@ static int mavl_add0(struct mavl *t, struct mavlnode **parent, union mavldata **
* @example mavl_add_example.c
*/
-union mavldata *mavl_add(struct mavl *t, const union mavldata *data)
+union mavldata *mavl_add(struct mavl *t, union mavldata *data)
{
union mavldata * d;
int rc;
- if (t->root == 0) {
+
+ if (t->root == NULL) {
t->root = mavlnode_create(data);
if (t->root)
t->count++;
- return &t->root->data;
+
+ /* return &t->root->data; */
+ return data;
}
d = data;
diff --git a/src/cw/message_set.h b/src/cw/message_set.h
index 7a85d273..1a50884f 100644
--- a/src/cw/message_set.h
+++ b/src/cw/message_set.h
@@ -28,6 +28,12 @@ struct cw_ElemData{
int mand;
};
+struct cw_ElemHandlerParams {
+ struct conn * conn;
+ struct cw_MsgData * msgdata;
+ struct sockaddr *from;
+};
+
struct cw_ElemHandler {
const char * name;
int id;
@@ -37,8 +43,8 @@ struct cw_ElemHandler {
int max_len;
const struct cw_Type * type;
const char * key;
- int (*get)(struct conn *conn, struct cw_ElemHandler * handler,
- uint8_t*data,int len,struct sockaddr *from);
+ int (*get)(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
+ uint8_t*data, int len);
/*
int (*end_in)(struct conn *conn,struct cw_action_in *a,uint8_t*elem,int len,struct sockaddr *from);
*/
@@ -66,6 +72,9 @@ struct cw_MsgData{
};
+
+
+
extern struct cw_MsgSet * cw_msgset_create();
extern void cw_msgset_destroy(struct cw_MsgSet * set);
diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c
index e101b805..5e5d8db7 100644
--- a/src/mod/capwap/capwap_actions_ac.c
+++ b/src/mod/capwap/capwap_actions_ac.c
@@ -25,7 +25,6 @@
#include "mod_capwap.h"
-
static struct cw_ElemHandler handlers[] = {
{
@@ -65,7 +64,7 @@ static struct cw_ElemHandler handlers[] = {
4,128, /* min/max length */
NULL, /* type */
"wtp_descriptor", /* Key */
- capwap_in_wtp_descriptor /* get */
+ capwap_in_wtp_descriptor /* get */
}
,
{
@@ -73,11 +72,23 @@ static struct cw_ElemHandler handlers[] = {
CAPWAP_ELEM_WTP_FRAME_TUNNEL_MODE, /* Element ID */
0,0, /* Vendor / Proto */
1,1, /* min/max length */
- CW_TYPE_BYTE, /* type */
+ CW_TYPE_BYTE, /* type */
"wtp_frame_tunnel_mode", /* Key */
- cw_in_generic /* get */
+ cw_in_generic /* get */
}
,
+
+ {
+ "Vendor Specific Payload", /* name */
+ CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD, /* Element ID */
+ 0,0, /* Vendor / Proto */
+ 0,0, /* min/max length */
+ NULL, /* type */
+ "vendor_specific_payload", /* Key */
+ cw_in_vendor_specific_payload /* get */
+ }
+ ,
+
{0,0,0,0,0,0,0,0}
};
@@ -85,11 +96,12 @@ static struct cw_ElemHandler handlers[] = {
static int discovery_request_states[] = {CAPWAP_STATE_DISCOVERY,0};
static struct cw_ElemDef discovery_request_elements[] ={
- {0,0,CAPWAP_ELEM_DISCOVERY_TYPE, 1, 0},
- {0,0,CAPWAP_ELEM_WTP_MAC_TYPE, 1, 0},
- {0,0,CAPWAP_ELEM_WTP_BOARD_DATA, 1, 0},
- {0,0,CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},
- {0,0,CAPWAP_ELEM_WTP_FRAME_TUNNEL_MODE, 1, 0},
+ {0,0,CAPWAP_ELEM_DISCOVERY_TYPE, 1, 0},
+ {0,0,CAPWAP_ELEM_WTP_MAC_TYPE, 1, 0},
+ {0,0,CAPWAP_ELEM_WTP_BOARD_DATA, 1, 0},
+ {0,0,CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},
+ {0,0,CAPWAP_ELEM_WTP_FRAME_TUNNEL_MODE, 1, 0},
+ {0,0,CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD, 0, 0},
{0,0,0,0,0}
};
diff --git a/src/mod/capwap/capwap_actions_wtp.c b/src/mod/capwap/capwap_actions_wtp.c
index 1739dd30..a860ec15 100644
--- a/src/mod/capwap/capwap_actions_wtp.c
+++ b/src/mod/capwap/capwap_actions_wtp.c
@@ -150,7 +150,7 @@ static cw_action_in_t actions_in[] = {
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic2,
.min_len = 1,
@@ -589,7 +589,7 @@ static cw_action_out_t actions_out[] = {
/* ECN Support - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.out = cw_out_generic,
.get = cw_out_get_config,
diff --git a/src/mod/capwap/capwap_in_wtp_board_data.c b/src/mod/capwap/capwap_in_wtp_board_data.c
index 293c060a..e0022b79 100644
--- a/src/mod/capwap/capwap_in_wtp_board_data.c
+++ b/src/mod/capwap/capwap_in_wtp_board_data.c
@@ -24,16 +24,22 @@
#include "cw/dbg.h"
#include "cw/cw.h"
+#include "cw/kvstore.h"
+#include "cw/cw_types.h"
+#include "cw/keys.h"
-/*
-static void readsubelems_wtp_board_data(mbag_t itemstore, uint8_t * msgelem,
+
+static void readsubelems_wtp_board_data(mavl_t cfg, uint8_t * msgelem,
int len)
{
+ int i = 0;
+ uint32_t val;
+ const char * key;
+
if (len<4)
return;
- int i = 0;
- uint32_t val;
+
do {
val = ntohl(*((uint32_t *) (msgelem + i)));
int subtype = (val >> 16) & 0xffff;
@@ -50,46 +56,66 @@ static void readsubelems_wtp_board_data(mbag_t itemstore, uint8_t * msgelem,
subtype, sublen);
switch (subtype) {
+
+
case CW_BOARDDATA_MODELNO:
- mbag_set_bstrn(itemstore,
+/* mbag_set_bstrn(itemstore,
CW_ITEM_WTP_BOARD_MODELNO,
msgelem + i, sublen);
+ */
+ key = "model_no";
break;
case CW_BOARDDATA_SERIALNO:
- mbag_set_bstrn(itemstore,
+/* mbag_set_bstrn(itemstore,
CW_ITEM_WTP_BOARD_SERIALNO,
msgelem + i, sublen);
+*/
+ key = "serial_no";
break;
case CW_BOARDDATA_MACADDRESS:
- mbag_set_bstrn(itemstore,
+/* mbag_set_bstrn(itemstore,
CW_ITEM_WTP_BOARD_MACADDRESS,
msgelem + i, sublen);
-
+*/
+ key = "mac_address";
break;
case CW_BOARDDATA_BOARDID:
- mbag_set_bstrn(itemstore, CW_ITEM_WTP_BOARD_ID,
+/* mbag_set_bstrn(itemstore, CW_ITEM_WTP_BOARD_ID,
msgelem + i, sublen);
+*/
+ key = "board_id";
break;
case CW_BOARDDATA_REVISION:
- mbag_set_bstrn(itemstore,
+/* mbag_set_bstrn(itemstore,
CW_ITEM_WTP_BOARD_REVISION,
msgelem + i, sublen);
+*/
+ key = "revision";
default:
+ key = NULL;
break;
}
+ if (key){
+ char add_key[256];
+ sprintf(add_key,"wtp_board_data/%s",key);
+ cw_kvstore_add(cfg,add_key,CW_TYPE_BSTR16,msgelem+i,sublen);
+
+ }
+
+
i += sublen;
} while (i < len);
}
-*/
+
/**
* Parse a WTP Board Data messag element and put results to itemstore.
*/
-int capwap_in_wtp_board_data(struct conn *conn, struct cw_ElemHandler *eh, uint8_t * data,
- int len, struct sockaddr *from)
+int capwap_in_wtp_board_data(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams *params,
+ uint8_t * data, int len)
{
/*
@@ -101,18 +127,22 @@ int capwap_in_wtp_board_data(struct conn *conn, struct cw_ElemHandler *eh, uint8
}
*/
- char vendor_key[64];
- printf("Have to read WTP Board Data\n");
- sprintf(vendor_key,"%s/%s",eh->key,"vendor");
+ char vendor_key[128];
+ mavl_t cfg = params->conn->remote_cfg;
+
+
+ sprintf(vendor_key,"%s/%s",eh->key,CW_KEY_VENDOR);
+
+ cw_kvstore_add(cfg,vendor_key,CW_TYPE_DWORD,data,len);
/*
mbag_t itemstore = conn->incomming;
mbag_set_dword(itemstore, CW_ITEM_WTP_BOARD_VENDOR, cw_get_dword(data));
*/
-/* readsubelems_wtp_board_data(itemstore, data + 4, len - 4);
-*/
+ readsubelems_wtp_board_data(cfg, data + 4, len - 4);
+
return 1;
}
diff --git a/src/mod/capwap/capwap_in_wtp_descriptor.c b/src/mod/capwap/capwap_in_wtp_descriptor.c
index 1ee3246e..f4aad977 100644
--- a/src/mod/capwap/capwap_in_wtp_descriptor.c
+++ b/src/mod/capwap/capwap_in_wtp_descriptor.c
@@ -22,15 +22,15 @@
#include "mod_capwap.h"
-int capwap_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh, uint8_t * data,
- int len, struct sockaddr *from)
+int capwap_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams *params, uint8_t * data,
+ int len)
{
int rc;
- printf("WTP Descriptor reader\n");
+ //printf("WTP Descriptor reader\n");
/*
// mbag_t mbag = conn->incomming;
*/
- rc =cw_read_wtp_descriptor(conn->remote_cfg, conn, eh, data, len, NULL);
+ rc =cw_read_wtp_descriptor(params->conn->remote_cfg, params->conn, eh, data, len, NULL);
return rc;
}
diff --git a/src/mod/capwap/mod_capwap.h b/src/mod/capwap/mod_capwap.h
index 368e401b..a1bf45a0 100644
--- a/src/mod/capwap/mod_capwap.h
+++ b/src/mod/capwap/mod_capwap.h
@@ -8,12 +8,17 @@ struct cw_Mod *mod_capwap_wtp();
#include "cw/conn.h"
-extern int capwap_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh,
- uint8_t * data, int len, struct sockaddr *from);
-
+/*extern int capwap_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh,
+ uint8_t * data, int len, struct sockaddr *from);*/
+int capwap_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams *params, uint8_t * data,
+ int len);
+/*
extern int capwap_in_wtp_board_data(struct conn *conn, struct cw_ElemHandler *a,
uint8_t * data, int len, struct sockaddr *from);
+*/
+int capwap_in_wtp_board_data(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams *params,
+ uint8_t * data, int len);
/*
extern int capwap_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a,
diff --git a/src/mod/cisco/cisco.h b/src/mod/cisco/cisco.h
index 26dfefd5..a715b159 100644
--- a/src/mod/cisco/cisco.h
+++ b/src/mod/cisco/cisco.h
@@ -6,8 +6,13 @@
extern int cisco_out_ap_timesync(struct conn *conn, struct cw_action_out *a,
uint8_t * dst);
+/*
extern int cisco_in_wtp_descriptor(struct conn *conn, struct cw_action_in *a,
- uint8_t * data, int len, struct sockaddr *from);
+ uint8_t * data, int len, struct sockaddr *from);*/
+
+int cisco_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams * params, uint8_t * data,
+ int len);
+
extern int cisco_out_ac_descriptor(struct conn *conn, struct cw_action_out *a,
uint8_t * dst);
extern int cisco_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a,
diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c
index a94feaf0..226eb3a2 100644
--- a/src/mod/cisco/cisco_actions_ac.c
+++ b/src/mod/cisco/cisco_actions_ac.c
@@ -38,11 +38,13 @@
#include "cisco_items.h"
+
#include "include/cipwap_items.h"
#include "cw/message_set.h"
#include "cw/cw_types.h"
+
static struct cw_ElemHandler handlers[] = {
{
"WTP Descriptor (Draft 7)", /* name */
@@ -51,7 +53,28 @@ static struct cw_ElemHandler handlers[] = {
4,128, /* min/max length */
NULL, /* type */
"wtp_descriptor", /* Key */
- cisco_in_wtp_descriptor /* get */
+ cisco_in_wtp_descriptor /* get */
+ }
+ ,
+ {
+ "RAD Name -> CAPWAP WTP Name", /* name */
+ CW_CISCO_RAD_NAME, /* Element ID */
+ CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
+ 1,512, /* min/max length */
+ CW_TYPE_BSTR16, /* type */
+ "wtp_name", /* Key */
+ cw_in_generic /* handler */
+ }
+
+ ,
+ {
+ "Board Data Options", /* name */
+ CW_CISCO_BOARD_DATA_OPTIONS, /* Element ID */
+ CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
+ 2,2, /* min/max length */
+ CW_TYPE_DWORD, /* type */
+ "cisco_board_data_options", /* Key */
+ cw_in_generic /* handler */
}
,
{0,0,0,0,0,0,0,0}
@@ -61,7 +84,8 @@ static struct cw_ElemHandler handlers[] = {
static int discovery_request_states[] = {CAPWAP_STATE_DISCOVERY,0};
static struct cw_ElemDef discovery_request_elements[] ={
- {0,0,CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},
+ {0,0, CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},
+ {0,CW_VENDOR_ID_CISCO, CW_CISCO_RAD_NAME, 1, 0},
{0,0,0,00}
};
@@ -213,7 +237,7 @@ static cw_action_in_t actions_in[] = {
* about ECN support, so make it non-mandatory */
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic,
.mand = 0,
@@ -418,7 +442,7 @@ static cw_action_out_t actions_out[]={
/* ECN Support - Join Response */
{
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT
}
,
diff --git a/src/mod/cisco/cisco_actions_wtp.c b/src/mod/cisco/cisco_actions_wtp.c
index ca7bba36..ccef8d41 100644
--- a/src/mod/cisco/cisco_actions_wtp.c
+++ b/src/mod/cisco/cisco_actions_wtp.c
@@ -68,7 +68,7 @@ static cw_action_in_t actions_in[] = {
/* Make ECN Support non-mand */
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic,
.mand = 0,
@@ -345,7 +345,7 @@ static cw_action_out_t actions_out[]={
/* Cisco doesn't know ECN support, so we
define no output method */
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.mand = 0
}
diff --git a/src/mod/cisco/cisco_in_wtp_descriptor.c b/src/mod/cisco/cisco_in_wtp_descriptor.c
index 859f9697..c45375d2 100644
--- a/src/mod/cisco/cisco_in_wtp_descriptor.c
+++ b/src/mod/cisco/cisco_in_wtp_descriptor.c
@@ -22,8 +22,8 @@
#include "cw/capwap_items.h"
-int cisco_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh, uint8_t * data,
- int len, struct sockaddr *from)
+int cisco_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams * params, uint8_t * data,
+ int len)
{
static struct cw_DescriptorSubelemDef allowed[] = {
@@ -35,7 +35,7 @@ int cisco_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh, uint8_
};
- return cw_read_wtp_descriptor_7(conn->remote_cfg, conn, eh, data, len, allowed);
+ return cw_read_wtp_descriptor_7(params->conn->remote_cfg, params->conn, eh, data, len, allowed);
}
diff --git a/src/mod/fortinet/fortinet_actions_ac.c b/src/mod/fortinet/fortinet_actions_ac.c
index 5e274626..7528cd62 100644
--- a/src/mod/fortinet/fortinet_actions_ac.c
+++ b/src/mod/fortinet/fortinet_actions_ac.c
@@ -135,7 +135,7 @@ static cw_action_in_t actions_in[] = {
* about ECN support, so make it non-mandatory */
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CW_MSG_JOIN_REQUEST,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic2,
.mand = 0,
@@ -216,7 +216,7 @@ static cw_action_out_t actions_out[]={
/* ECN Support - Join Response */
{
.msg_id = CW_MSG_JOIN_RESPONSE,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT
}
,
diff --git a/src/mod/fortinet/fortinet_actions_wtp.c b/src/mod/fortinet/fortinet_actions_wtp.c
index a5befb90..439f0b7e 100644
--- a/src/mod/fortinet/fortinet_actions_wtp.c
+++ b/src/mod/fortinet/fortinet_actions_wtp.c
@@ -62,7 +62,7 @@ static cw_action_in_t actions_in[] = {
/* Make ECN Support non-mand */
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CW_MSG_JOIN_RESPONSE,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic2,
.mand = 0,
@@ -222,7 +222,7 @@ static cw_action_out_t actions_out[]={
/* Cisco doesn't know ECN support, so we
define no output method */
.msg_id = CW_MSG_JOIN_REQUEST,
- .elem_id = CW_ELEM_ECN_SUPPORT,
+ .elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.mand = 0
}