From 2055a0d64480905e7e1693bd452d62c597236b68 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Wed, 7 Mar 2018 07:57:04 +0000 Subject: [PATCH] Reading wtp descriptor works now - at least cisco FossilOrigin-Name: ee2e8a3fdf9d353237161a0af0148367afc20e8020315108c02154d9df521938 --- libcw.project | 3 + src/cw/conn_process_packet.c | 10 +-- src/cw/cw.h | 2 +- src/cw/cw_dbg_elem.c | 61 +++++++++++++++++++ src/cw/cw_format_version.c | 44 +++++++++++++ src/cw/cw_in_ac_descriptor.c | 2 +- src/cw/cw_in_generic.c | 3 +- ...mavl_delete.c => cw_kvstore_mavl_delete.c} | 9 ++- src/cw/cw_read_ac_descriptor.c | 2 +- src/cw/cw_read_descriptor_subelems.c | 57 +++++++++-------- src/cw/cw_read_wtp_descriptor.c | 2 +- src/cw/cw_read_wtp_descriptor_7.c | 23 ++++--- src/cw/cw_type_byte.c | 1 - src/cw/cw_types.h | 9 +-- src/cw/dbg.c | 60 +++--------------- src/cw/dbg.h | 3 +- src/cw/format.h | 3 +- src/cw/format_is_utf8.c | 2 +- src/cw/mavl.h | 2 +- src/mod/cisco/cisco_in_wtp_descriptor.c | 12 ++-- 20 files changed, 199 insertions(+), 111 deletions(-) create mode 100644 src/cw/cw_dbg_elem.c create mode 100644 src/cw/cw_format_version.c rename src/cw/{cw_types_mavl_delete.c => cw_kvstore_mavl_delete.c} (56%) diff --git a/libcw.project b/libcw.project index e8bca398..5280ade5 100644 --- a/libcw.project +++ b/libcw.project @@ -319,6 +319,9 @@ + + + diff --git a/src/cw/conn_process_packet.c b/src/cw/conn_process_packet.c index d512a624..8d53a7fe 100644 --- a/src/cw/conn_process_packet.c +++ b/src/cw/conn_process_packet.c @@ -216,7 +216,7 @@ int cw_in_check_generic(struct conn *conn, struct cw_action_in *a, uint8_t * dat } - +/* void cw_read_elem(struct cw_ElemHandler * handler, struct conn * conn, uint8_t * elem_data, int elem_len, struct sockaddr * from){ mavldata_t data, *result; @@ -226,8 +226,10 @@ void cw_read_elem(struct cw_ElemHandler * handler, struct conn * conn, handler->type->to_str(result,str,30); printf("Read %d-%s: %s %s\n", handler->id, handler->name, handler->key, str); - /*mavl_add(conn->remote_cfg*/ + //mavl_add(conn->remote_cfg } +*/ + static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, struct sockaddr *from) @@ -399,8 +401,8 @@ 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); - +/*printf ("Would start elem processing now %d - %s\n",handler->id, handler->name); +*/ handler->get(conn, handler, cw_get_elem_data(elem), elem_len, from); diff --git a/src/cw/cw.h b/src/cw/cw.h index 6c39ae21..c776d97e 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -311,7 +311,7 @@ struct cw_DescriptorSubelemDef { -extern int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len, +extern int cw_read_descriptor_subelems(mavl_t store, const char * key, uint8_t * data, int len, struct cw_DescriptorSubelemDef *elems); /* diff --git a/src/cw/cw_dbg_elem.c b/src/cw/cw_dbg_elem.c new file mode 100644 index 00000000..22d04918 --- /dev/null +++ b/src/cw/cw_dbg_elem.c @@ -0,0 +1,61 @@ +#include + +#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, + const uint8_t * msgbuf, int len) +{ + + + const char *elemname; + char vendorname[256]; + char vendor_details[265]; + + if (!cw_dbg_is_level(level)) + return; + + *vendor_details = 0; + + +/* +/// 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=0; + } +*/ + +/*& + if (!cw_dbg_is_level(DBG_ELEM_DMP)) { + cw_dbg(DBG_ELEM, "%d (%s), len=%d", msgelem, elemname, len); + } else { + 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); + } +*/ + } \ No newline at end of file diff --git a/src/cw/cw_format_version.c b/src/cw/cw_format_version.c new file mode 100644 index 00000000..2c9584e8 --- /dev/null +++ b/src/cw/cw_format_version.c @@ -0,0 +1,44 @@ +#include +#include "format.h" + +/** + * @brief Format a version element + * @param s + * @param version + * @param len + * @return number of bytes written + */ +int cw_format_version(char *s, const uint8_t * version, int len) +{ + int dot,rs,i;; + + rs = 0; + + if (format_is_utf8(version, len)) { + if (len != 0) + rs += sprintf(s + rs, "%.*s", len, version); + else + rs += sprintf(s + rs, "''"); + } else { + for (i = 0; i < len && i < 20; i++) { + rs += sprintf(s + rs, "%02X", version[i]); + } + + dot = 0; + + rs += sprintf(s + rs, " ("); + for (i = 0; i < len && i < 20; i++) { + if (dot) + rs += sprintf(s + rs, "."); + dot = 1; + rs += sprintf(s + rs, "%d", version[i]); + } + rs += sprintf(s + rs, ")"); + } +/* + vendor = bstrv_get_vendor_id(ver); + rs += sprintf(s + rs, ", Vendor Id: %d, %s", vendor, cw_strvendor(vendor)); +*/ + return rs; +} + diff --git a/src/cw/cw_in_ac_descriptor.c b/src/cw/cw_in_ac_descriptor.c index 89b8dec2..4a3559a6 100644 --- a/src/cw/cw_in_ac_descriptor.c +++ b/src/cw/cw_in_ac_descriptor.c @@ -36,7 +36,7 @@ int cw_in_ac_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * dat {0,0, NULL,0, 0} }; - cw_read_descriptor_subelems(conn->config, data + 12, len - 12, allowed); + cw_read_descriptor_subelems(conn->config,"ackey" , data + 12, len - 12, allowed); return 1; } diff --git a/src/cw/cw_in_generic.c b/src/cw/cw_in_generic.c index 92bddf8f..c80abbf4 100644 --- a/src/cw/cw_in_generic.c +++ b/src/cw/cw_in_generic.c @@ -10,7 +10,8 @@ int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler, result->kv.key = strdup(handler->key); handler->type->to_str(result,str,30); - printf("Read %d-%s: %s %s\n", handler->id, handler->name, handler->key, str); +/* printf("Read %d-%s: %s %s\n", handler->id, handler->name, handler->key, str); + */ mavl_add(conn->remote_cfg, result); return 0; } diff --git a/src/cw/cw_types_mavl_delete.c b/src/cw/cw_kvstore_mavl_delete.c similarity index 56% rename from src/cw/cw_types_mavl_delete.c rename to src/cw/cw_kvstore_mavl_delete.c index c58e7535..3d05cce0 100644 --- a/src/cw/cw_types_mavl_delete.c +++ b/src/cw/cw_kvstore_mavl_delete.c @@ -1,8 +1,13 @@ -#include "cw_types.h" -void cw_types_mavl_delete(mavldata_t *data){ +#include + +#include "cw_types.h" +#include "kvstore.h" + +void cw_types_kvstore_mavl_delete(mavldata_t *data){ const struct cw_Type * type = data->kv.priv; if (type->del) type->del(data); free(data->kv.key); } + diff --git a/src/cw/cw_read_ac_descriptor.c b/src/cw/cw_read_ac_descriptor.c index 807e99c6..6ebfc71c 100644 --- a/src/cw/cw_read_ac_descriptor.c +++ b/src/cw/cw_read_ac_descriptor.c @@ -34,7 +34,7 @@ int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len, if (!allowed) allowed=allowed_default; - return cw_read_descriptor_subelems(store, data + 12, len - 12, allowed); + return cw_read_descriptor_subelems(store, "key", data + 12, len - 12, allowed); } diff --git a/src/cw/cw_read_descriptor_subelems.c b/src/cw/cw_read_descriptor_subelems.c index 0adc41e8..2e4d773f 100644 --- a/src/cw/cw_read_descriptor_subelems.c +++ b/src/cw/cw_read_descriptor_subelems.c @@ -17,29 +17,29 @@ */ #include "cw.h" +#include "cw_types.h" #include "dbg.h" +#include "keys.h" -int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len, +int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key, + uint8_t * data, int len, struct cw_DescriptorSubelemDef *elems) { - - printf("sub reader\n"); - - + uint32_t vendor_id; + int sublen,subtype; int errors = 0; int success = 0; int sub = 0; while (sub < len) { - + int i; + if (len - sub < 8) { return 0; } - uint32_t vendor_id = cw_get_dword(data + sub); - int sublen = cw_get_word(data + sub + 6); - int subtype = cw_get_word(data + sub + 4); + vendor_id = cw_get_dword(data + sub); + sublen = cw_get_word(data + sub + 6); + subtype = cw_get_word(data + sub + 4); - bstrv_t vstr = NULL; - int i; /* search sub-element */ for (i = 0; elems[i].maxlen; i++) { @@ -49,15 +49,15 @@ int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len, if (!elems[i].maxlen) { - vstr = bstrv_create(vendor_id, data + sub + 8, sublen); - if (vstr) { - cw_dbg_version_subelem(DBG_ELEM_ERR, "Not allowed", - subtype, vstr); - free(vstr); - } + cw_dbg_version_subelem(DBG_ELEM_ERR, "Not allowed", + subtype, vendor_id, data+sub+8, sublen); errors++; } else { int l = sublen; + mavldata_t mdata, *mdata_result; + char dbgstr[1048]; + char key[1024]; + if (elems[i].maxlen < sublen) { cw_dbg(DBG_ELEM_ERR, "SubType %d Too long (truncating), len = %d,max. len=%d", @@ -65,13 +65,24 @@ int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len, l = elems[i].maxlen; } - vstr = - mbag_set_bstrv(store, elems[i].key, vendor_id, - data + sub + 8, l); - char dbgstr[128]; + /* vendor */ + sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_KEY_VENDOR); + mdata.kv.key = strdup(key); + mdata.kv.val.dword = vendor_id; + mdata.kv.priv=CW_TYPE_DWORD; + mavl_add(cfg,&mdata); + + + /* version */ + sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_KEY_VERSION); + mdata_result = cw_type_version.get(&mdata,data+sub+8,l); + mdata.kv.key = strdup(key); + mavl_add(cfg,mdata_result); + + cw_type_version.to_str(mdata_result,dbgstr,90); sprintf(dbgstr, "Storing '%s'", elems[i].key); - cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype, vstr); + cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype, vendor_id, data+sub+8,l); success++; } @@ -82,7 +93,5 @@ int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len, } - - return success; } diff --git a/src/cw/cw_read_wtp_descriptor.c b/src/cw/cw_read_wtp_descriptor.c index 4eb20f07..e2caccae 100644 --- a/src/cw/cw_read_wtp_descriptor.c +++ b/src/cw/cw_read_wtp_descriptor.c @@ -59,5 +59,5 @@ int cw_read_wtp_descriptor(mavl_t cfg, struct conn *conn, allowed=allowed_default; } printf("call read subelems\n"); - return cw_read_descriptor_subelems(cfg, data + pos, len - pos, allowed); + return cw_read_descriptor_subelems(cfg,eh->key , data + pos, len - pos, allowed); } diff --git a/src/cw/cw_read_wtp_descriptor_7.c b/src/cw/cw_read_wtp_descriptor_7.c index ceb0cadd..be0f24c0 100644 --- a/src/cw/cw_read_wtp_descriptor_7.c +++ b/src/cw/cw_read_wtp_descriptor_7.c @@ -3,6 +3,18 @@ #include "capwap.h" #include "capwap_items.h" #include "cw_types.h" +#include "keys.h" + + +static struct cw_DescriptorSubelemDef allowed_default[] = { + {-1,CW_SUBELEM_WTP_HARDWARE_VERSION, CW_KEY_HARDWARE, 1024,0}, + {-1,CW_SUBELEM_WTP_SOFTWARE_VERSION, CW_KEY_SOFTWARE, 1024.0}, + {-1,CW_SUBELEM_WTP_BOOTLOADER_VERSION, CW_KEY_BOOTLOADER, 1024,0}, + {-1,CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION, CW_KEY_OTHER_SOFTWARE, 1024,0}, + {0,0, NULL, 0,0} +}; + + /** * Read WTP Descriptor in Cisco-Style (Draft 7) @@ -30,20 +42,13 @@ int cw_read_wtp_descriptor_7(mavl_t cfg, struct conn *conn, pos = 2; /* Encryption element, for now dumy XXX */ - //cw_get_word(data + pos + 2); +/* //cw_get_word(data + pos + 2);*/ pos += 2; - static struct cw_DescriptorSubelemDef allowed_default[] = { - {-1,CW_SUBELEM_WTP_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,0}, - {-1,CW_SUBELEM_WTP_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024.0}, - {-1,CW_SUBELEM_WTP_BOOTLOADER_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,0}, - {-1,CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,0}, - {0,0, NULL, 0,0} - }; if (!allowed) allowed=allowed_default; - return cw_read_descriptor_subelems(cfg, data + pos, len - pos, allowed); + return cw_read_descriptor_subelems(cfg, eh->key, data + pos, len - pos, allowed); } diff --git a/src/cw/cw_type_byte.c b/src/cw/cw_type_byte.c index 54377064..d6a2b6f2 100644 --- a/src/cw/cw_type_byte.c +++ b/src/cw/cw_type_byte.c @@ -53,4 +53,3 @@ const struct cw_Type cw_type_byte = { to_str, /* to_str */ from_str /* from_str */ }; - diff --git a/src/cw/cw_types.h b/src/cw/cw_types.h index 6e16749b..dec738d3 100644 --- a/src/cw/cw_types.h +++ b/src/cw/cw_types.h @@ -34,15 +34,12 @@ struct cw_Type{ extern const struct cw_Type cw_type_byte; -#define CW_TYPE_BYTE (&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; -void cw_types_mavl_delete(mavldata_t *data); - -#define cw_types_mavl_create()\ - mavl_create(mavl_cmp_kv, cw_types_mavl_delete) +#define CW_TYPE_BYTE (&cw_type_byte) +#define CW_TYPE_DWORD (&cw_type_dword) +#define CW_TYPE_VERSION (&cw_type_version) #endif /* __CW_TYPES_H */ diff --git a/src/cw/dbg.c b/src/cw/dbg.c index a503def0..254f7a97 100644 --- a/src/cw/dbg.c +++ b/src/cw/dbg.c @@ -472,63 +472,23 @@ int cw_format_item(char *dst, mbag_item_t * item) return 0; } -static int cw_format_version(char *s, bstrv_t ver, char *def) + + +void cw_dbg_version_subelem(int level, const char *context, int subtype, + uint32_t vendor_id, const uint8_t * vstr, int len) { - int dot; - uint8_t *version; - int len,rs,i; - uint32_t vendor; + char v[2048]; + int n; - if (!ver) - return sprintf(s, "%s", def); - - - version = bstrv_data(ver); - len = bstrv_len(ver); - - rs = 0; - - - - if (format_is_utf8(version, len)) { - if (len != 0) - rs += sprintf(s + rs, "%.*s", len, version); - else - rs += sprintf(s + rs, "''"); - } else { - for (i = 0; i < len && i < 20; i++) { - rs += sprintf(s + rs, "%02X", version[i]); - } - - dot = 0; - - rs += sprintf(s + rs, " ("); - for (i = 0; i < len && i < 20; i++) { - if (dot) - rs += sprintf(s + rs, "."); - dot = 1; - rs += sprintf(s + rs, "%d", version[i]); - } - rs += sprintf(s + rs, ")"); - } - - vendor = bstrv_get_vendor_id(ver); - rs += sprintf(s + rs, ", Vendor Id: %d, %s", vendor, cw_strvendor(vendor)); - return rs; -} - - - -void cw_dbg_version_subelem(int level, const char *context, int subtype, bstrv_t vstr) -{ - char v[256]; if (!cw_dbg_is_level(level)) return; if (!vstr) return; - cw_format_version(v, vstr, ""); - cw_dbg(level, "%s: SubType %d, %s", context, subtype, v); + 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 6f1b03e0..5a67d99b 100644 --- a/src/cw/dbg.h +++ b/src/cw/dbg.h @@ -121,7 +121,8 @@ void cw_dbg_pkt_nc(int level,struct netconn *nc, uint8_t * packet, int len,struc void cw_dbg_msg(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from); char * cw_dbg_mkdmp(const uint8_t * data, int len); -void cw_dbg_version_subelem(int level,const char*context,int subtype,bstrv_t vstr); +void cw_dbg_version_subelem(int level, const char *context, int subtype, + uint32_t vendor_id, const uint8_t * vstr, int len); /** diff --git a/src/cw/format.h b/src/cw/format.h index 1e4832ee..0d2bdeec 100644 --- a/src/cw/format.h +++ b/src/cw/format.h @@ -81,7 +81,7 @@ struct avltree; int format_hdr_flags(char *dst, uint8_t * th); -int format_is_utf8(unsigned char *str, size_t len); +int format_is_utf8(const unsigned char *str, size_t len); int format_dot11_fc(char *dst, uint16_t fc); @@ -109,6 +109,7 @@ char *cw_format_dump(const uint8_t * data, int len, void cw_format_get_dump_defaults(struct cw_FormatDumpSettings * settings); int cw_format_pkt_hdr(char *dst, int incomming, uint8_t * packet, int len, struct sockaddr *from); +int cw_format_version(char *s, const uint8_t * version, int len); /**@}*/ diff --git a/src/cw/format_is_utf8.c b/src/cw/format_is_utf8.c index 724b508b..6b7d69df 100644 --- a/src/cw/format_is_utf8.c +++ b/src/cw/format_is_utf8.c @@ -30,7 +30,7 @@ * @return 0 if the string is not in UTF8 format, otherwise it is UTF8. */ -int format_is_utf8(unsigned char *str, size_t len) +int format_is_utf8(const unsigned char *str, size_t len) { size_t i = 0; size_t bytes = 0; diff --git a/src/cw/mavl.h b/src/cw/mavl.h index 4f91a737..71df95bf 100644 --- a/src/cw/mavl.h +++ b/src/cw/mavl.h @@ -54,7 +54,7 @@ */ struct mavl_KeyVal{ - const char *key; + char *key; const void *priv; union{ void * ptr; diff --git a/src/mod/cisco/cisco_in_wtp_descriptor.c b/src/mod/cisco/cisco_in_wtp_descriptor.c index 83c178d7..859f9697 100644 --- a/src/mod/cisco/cisco_in_wtp_descriptor.c +++ b/src/mod/cisco/cisco_in_wtp_descriptor.c @@ -16,7 +16,7 @@ */ - +#include "cw/keys.h" #include "cw/cw.h" #include "cw/vendors.h" #include "cw/capwap_items.h" @@ -27,15 +27,15 @@ int cisco_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh, uint8_ { static struct cw_DescriptorSubelemDef allowed[] = { - {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,0}, - {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024.0}, - {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_BOOTLOADER_VERSION, CW_ITEM_WTP_BOOTLOADER_VERSION, 1024.0}, - {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION, "other", 1024.0}, + {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_HARDWARE_VERSION, CW_KEY_HARDWARE, 1024,0}, + {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_SOFTWARE_VERSION, CW_KEY_SOFTWARE, 1024.0}, + {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_BOOTLOADER_VERSION, CW_KEY_BOOTLOADER, 1024.0}, + {CW_VENDOR_ID_CISCO,CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION, CW_KEY_OTHER_SOFTWARE, 1024.0}, {0,0, NULL, 0,0} }; - return cw_read_wtp_descriptor_7(conn->incomming, conn, eh, data, len, allowed); + return cw_read_wtp_descriptor_7(conn->remote_cfg, conn, eh, data, len, allowed); }