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);
}