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); - -/* - // TODO XXXX -// af = cw_actionlist_in_get(conn->actions->in, &as); -*/ af = 0; + struct cw_ElemHandler *vhandler; - if (!af) { + uint32_t vendor_id, elem_id; + + vendor_id = cw_get_dword(data); + elem_id = cw_get_word(data + 4); + + 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 (!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; + n = cw_format_version(v, vstr, len); - } else { -/* -// elemname = cw_strelemp(conn->actions, msgelem); -*/ - elemname=handler->name; - } + sprintf(v + n, ", Vendor Id: %d, %s", vendor_id, cw_strvendor(vendor_id)); - - 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); - - cw_dbg(DBG_ELEM, "%d (%s), len=%d%s%s", - msgelem, elemname, len, get_dbg_color_ontext(DBG_ELEM_DMP), dmp); - - 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 }