From 4cedc04193787b1fca73d646050e95806dd7606a Mon Sep 17 00:00:00 2001
From: "7u83@mail.ru" <7u83@mail.ru@noemail.net>
Date: Sun, 25 Mar 2018 22:00:21 +0000
Subject: [PATCH] cw_in_generic_struct works - see cisco ap time sync
FossilOrigin-Name: 3a33d8a0104938c2274c1c28dc284e50a3df308452e9147c704de9af2a1f9e69
---
libcw.project | 1 +
src/cw/cw.h | 3 +++
src/cw/cw_in_generic_struct.c | 25 +++++++++++++++++++++++++
src/cw/cw_ktv_read_struct.c | 2 +-
src/cw/cw_read_descriptor_subelems.c | 2 --
src/cw/ktv.h | 2 +-
src/mod/cisco/capwap_cisco.h | 2 +-
src/mod/cisco/cisco_actions_ac.c | 24 +++++++++++++++++++-----
8 files changed, 51 insertions(+), 10 deletions(-)
create mode 100644 src/cw/cw_in_generic_struct.c
diff --git a/libcw.project b/libcw.project
index be77301b..7622096c 100644
--- a/libcw.project
+++ b/libcw.project
@@ -263,6 +263,7 @@
+
diff --git a/src/cw/cw.h b/src/cw/cw.h
index d144c465..126374ef 100644
--- a/src/cw/cw.h
+++ b/src/cw/cw.h
@@ -381,6 +381,9 @@ int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler,
int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
uint8_t * elem_data, int elem_len);
+int cw_in_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
+ uint8_t * elem_data, int elem_len);
+
int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
, uint8_t * dst);
diff --git a/src/cw/cw_in_generic_struct.c b/src/cw/cw_in_generic_struct.c
new file mode 100644
index 00000000..8a6d8565
--- /dev/null
+++ b/src/cw/cw_in_generic_struct.c
@@ -0,0 +1,25 @@
+
+#include "capwap.h"
+#include "msgset.h"
+#include "ktv.h"
+#include "log.h"
+
+int cw_in_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
+ uint8_t * elem_data, int elem_len)
+{
+ /*cw_KTV_t * result;*/
+
+ if (!handler->type){
+ cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
+ return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
+ }
+
+/* result = cw_ktv_add(params->conn->remote_cfg, handler->key,
+ handler->type, elem_data,elem_len);
+*/
+ cw_ktv_read_struct(params->conn->remote_cfg,handler->type,handler->key,elem_data,elem_len);
+
+ /*params->elem=result;*/
+
+ return CAPWAP_RESULT_SUCCESS;
+}
diff --git a/src/cw/cw_ktv_read_struct.c b/src/cw/cw_ktv_read_struct.c
index 468555ad..f3658752 100644
--- a/src/cw/cw_ktv_read_struct.c
+++ b/src/cw/cw_ktv_read_struct.c
@@ -1,7 +1,7 @@
#include "ktv.h"
#include "dbg.h"
-int cw_ktv_read_struct(mavl_t ktv,cw_KTVStruct_t * stru, const char *pkey,
+int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey,
uint8_t * data, int len)
{
char key[CW_KTV_MAX_KEY_LEN];
diff --git a/src/cw/cw_read_descriptor_subelems.c b/src/cw/cw_read_descriptor_subelems.c
index c2627cac..bfd89e03 100644
--- a/src/cw/cw_read_descriptor_subelems.c
+++ b/src/cw/cw_read_descriptor_subelems.c
@@ -45,8 +45,6 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
/* search sub-element */
for (i = 0; elems[i].maxlen; i++) {
- printf("subcmp: %d %d\n",elems[i].type,subtype);
-
if (elems[i].type == subtype /* && elems[i].vendor_id==vendor_id*/)
break;
}
diff --git a/src/cw/ktv.h b/src/cw/ktv.h
index 9c07d3f5..c59a7c4c 100644
--- a/src/cw/ktv.h
+++ b/src/cw/ktv.h
@@ -88,7 +88,7 @@ struct cw_KTVStruct {
int position;
};
typedef struct cw_KTVStruct cw_KTVStruct_t;
-int cw_ktv_read_struct(mavl_t ktv,cw_KTVStruct_t * stru, const char *pkey,
+int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey,
uint8_t * data, int len);
extern const struct cw_Type cw_type_byte;
diff --git a/src/mod/cisco/capwap_cisco.h b/src/mod/cisco/capwap_cisco.h
index ac2095e3..f488141c 100644
--- a/src/mod/cisco/capwap_cisco.h
+++ b/src/mod/cisco/capwap_cisco.h
@@ -96,7 +96,7 @@
#define CW_CISCO_AP_BACKUP_SOFTWARE_VERSION 183
#define CW_CISCO_BOARD_DATA_OPTIONS 207
-#define CW_CISCO_MWAR_TYPE 208
+#define CISCO_ELEM_MWAR_TYPE 208
#define CW_CISCO_80211_ASSOC_LIMIT 213
#define CW_CISCO_TLV_PAYLOAD 215
#define CW_CISCO_AP_LOG_FACILITY 224
diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c
index e2876ee4..b7d89535 100644
--- a/src/mod/cisco/cisco_actions_ac.c
+++ b/src/mod/cisco/cisco_actions_ac.c
@@ -44,7 +44,8 @@
static cw_KTVStruct_t ap_time_sync[] = {
{CW_TYPE_DWORD, "timestamp", 4,-1},
- {CW_TYPE_BYTE, "type", 1,-1}
+ {CW_TYPE_BYTE, "type", 1,-1},
+ {NULL,NULL,0,0}
};
static struct cw_ElemHandler handlers[] = {
@@ -99,11 +100,23 @@ static struct cw_ElemHandler handlers[] = {
5,5, /* min/max length */
ap_time_sync, /* type */
"cisco/ap-timesync", /* Key */
- NULL, /* handler */
+ cw_in_generic_struct, /* handler */
NULL /* put */
}
,
-
+
+ {
+ "MWAR Type", /* name */
+ CISCO_ELEM_MWAR_TYPE, /* Element ID */
+ CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
+ 1,1, /* min/max length */
+ CW_TYPE_BYTE, /* type */
+ "cisco/mwar-type", /* Key */
+ cw_in_generic, /* handler */
+ cw_out_generic /* put */
+ }
+ ,
+
{0,0,0,0,0,0,0,0}
};
@@ -111,8 +124,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_BOARD_DATA, 0, 0},
+/* {0,0, CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},*/
+ {0,0, CAPWAP_ELEM_WTP_BOARD_DATA, 0, 0},
{0,CW_VENDOR_ID_CISCO, CW_CISCO_RAD_NAME, 1, 0},
{0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 0, 0},
{0,0,0,00}
@@ -122,6 +135,7 @@ static struct cw_ElemDef discovery_request_elements[] ={
static int discovery_response_states[] = {CAPWAP_STATE_DISCOVERY,0};
static struct cw_ElemDef discovery_response_elements[] ={
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_TIMESYNC, 1, 0},
+ {0,CW_VENDOR_ID_CISCO, CISCO_ELEM_MWAR_TYPE, 0, 0},
{0,0,0,00}
};