can partially read wtp descriptor

FossilOrigin-Name: 87c986decab2956c060dc9212e5bd4d89bed829ec528477817f8ab795c396853
This commit is contained in:
7u83@mail.ru 2018-03-06 02:08:14 +00:00
parent 8817d54d14
commit 14a9c95eb8
30 changed files with 329 additions and 382 deletions

View File

@ -3,9 +3,9 @@
<Project Name="ac" Path="ac.project" Active="No"/>
<Project Name="wtp" Path="wtp.project" Active="No"/>
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
<Project Name="mod_capwap" Path="mod_capwap.project" Active="Yes"/>
<Project Name="mod_capwap" Path="mod_capwap.project" Active="No"/>
<Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="Yes"/>
<Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/>
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
<BuildMatrix>

View File

@ -1,48 +0,0 @@
#include "cw.h"
#include "capwap.h"
#include "capwap_items.h"
#include "dbg.h"
int cw_read_wtp_descriptor(mbag_t mbag, struct conn *conn,
struct cw_action_in *a, uint8_t * data, int len,struct cw_descriptor_subelem_def *allowed)
{
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));
/* Get number of encryption elements */
int ncrypt = cw_get_byte(data + 2);
if (ncrypt == 0) {
if (conn->strict_capwap) {
cw_dbg(DBG_ELEM_ERR,
"Bad WTP Descriptor, number of encryption elements is 0.");
return 0;
}
cw_dbg(DBG_RFC,
"Non standard conform WTP Descriptor, number of encryptoin elements is 0.");
}
int pos = 3;
int i;
for (i = 0; i < ncrypt; i++) {
// It's a dummy for now
pos += 3;
}
static struct cw_descriptor_subelem_def allowed_default[] = {
{0,CW_SUBELEM_WTP_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,1},
{0,CW_SUBELEM_WTP_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
{0,CW_SUBELEM_WTP_BOOTLOADER_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
{0,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(conn->incomming, data + pos, len - pos, allowed);
}

View File

@ -328,7 +328,6 @@
<File Name="src/cw/mavl_cmp_kv.c"/>
<File Name="src/cw/mavl_add_kv_byte.c"/>
<File Name="src/cw/cw_types_mavl_delete.c"/>
<File Name="src/cw/cw_read_elem.c"/>
</VirtualDirectory>
</VirtualDirectory>
<Description/>

View File

@ -139,8 +139,9 @@ extern const char CW_ITEM_CAPWAP_TRANSPORT_PROTOCOL[];
/* CIPWAP and Cisco */
/*
//extern const char CW_ITEM_WTP_GROUP_NAME[];
*/
/* Other Items */
extern const char CW_ITEM_AC_IMAGE_DIR[]; /* Path where WTP images are stored */
@ -177,10 +178,10 @@ extern const char CW_ITEM_WTP_MAX_RADIOS[];
extern const char CW_ITEM_RADIO_INFOS[];
extern const char CW_ITEM_ECN_SUPPORT[];
/*
//extern const char CW_ITEM_SSH_ENABLE[];
//extern const char CW_ITEM_TELNET_ENABLE[];
*/

View File

@ -399,10 +399,11 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
elem_len = cw_get_elem_len(elem);
cw_read_elem(handler, conn, cw_get_elem_data(elem), elem_len, from);
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);
continue;
exit(0);
@ -476,6 +477,29 @@ exit(0);
/* all message elements are processed, do now after processing
by calling the "end" function for the message */
{
mavliter_t it;
const struct cw_Type * type;
printf("********** THE REMODE CFG **************\n");
mavliter_init(&it,conn->remote_cfg);
mavliter_foreach(&it){
char value[500];
mavldata_t * data;
data = mavliter_get(&it);
type = data->kv.priv;
type->to_str(data,value,0);
printf("Got %s (%s): %s\n",data->kv.key,type->name, value);
}
}
//int result_code = 0;

View File

@ -10,6 +10,7 @@
#include "lw.h"
#include "capwap.h"
#include "message_set.h"
/**
* @defgroup CW CW
@ -275,7 +276,7 @@ extern int cw_put_mbag_item(uint8_t * dst, struct mbag_item *item);
/**
* Put encryption capabilities as described in CAWAP
* draft 7 fpr WTP Descriptor
* draft 7 fpr WTP DescriptorSubelemDef
* @param dst Destination buffer
* @param cap Capability
* @return number of bytes put
@ -295,10 +296,10 @@ int cw_put_version(uint8_t * dst, uint16_t subelem_id, bstrv_t v);
extern int cw_put_ac_status(uint8_t * dst, struct cw_ac_status *s, struct conn *conn);
struct cw_descriptor_subelem_def {
struct cw_DescriptorSubelemDef {
int vendor_id;
int type;
const char *item_id;
const char *key;
int maxlen;
int mand;
};
@ -310,19 +311,26 @@ struct cw_descriptor_subelem_def {
extern int cw_read_descriptor_subelems(mbag_t store, uint8_t * data, int len,
struct cw_descriptor_subelem_def *elems);
extern int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *elems);
extern int cw_read_wtp_descriptor(mbag_t mbag, struct conn *conn,
struct cw_action_in *a, uint8_t * data, int len,
struct cw_descriptor_subelem_def *allowed);
/*
int cw_read_wtp_descriptor(mavl_t mbag, struct conn *conn,
struct cw_ElemHandler *eh, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed);
*/
extern int cw_read_wtp_descriptor_7(mbag_t mbag, struct conn *conn,
struct cw_action_in *a, uint8_t * data, int len,
struct cw_descriptor_subelem_def *allowed);
int cw_read_wtp_descriptor(mavl_t mbag, struct conn *conn,
struct cw_ElemHandler *eh, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed);
extern int cw_read_wtp_descriptor_7(mavl_t mbag, struct conn *conn,
struct cw_ElemHandler *eh, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed);
extern int cw_read_ac_descriptor(mbag_t store, uint8_t * data, int len,
struct cw_descriptor_subelem_def *allowed);
struct cw_DescriptorSubelemDef *allowed);
extern int cw_read_wtp_descriptor_versions(mbag_t mbag, uint8_t * data, int len);
@ -342,11 +350,9 @@ 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);
extern int cw_in_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
extern int cw_in_generic2(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);

View File

@ -30,7 +30,7 @@ int cw_in_ac_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * dat
mbag_set_ptr(conn->incomming, CW_ITEM_AC_STATUS, status);
static struct cw_descriptor_subelem_def allowed[] = {
static struct cw_DescriptorSubelemDef allowed[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
{0,0, NULL,0, 0}

View File

@ -1,125 +1,16 @@
#include "message_set.h"
#include "cw_types.h"
#include "mbag.h"
#include "action.h"
#include "dbg.h"
#include "log.h"
#include "mbag.h"
#include "cw.h"
int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler,
uint8_t * elem_data, int elem_len, struct sockaddr * from){
mavldata_t data, *result;
char str[30];
/// TODO XXXX
int static check_len(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from)
{
/*
if (len < a->min_len) {
cw_dbg(DBG_ELEM_ERR,
"%d (%s) message element too short, len=%d, min len=%d",
a->elem_id, cw_strelemp(conn->actions, a->elem_id), len,
a->min_len);
result = handler->type->get(&data,elem_data,elem_len);
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);
mavl_add(conn->remote_cfg, result);
return 0;
}
if (len > a->max_len) {
cw_dbg(DBG_ELEM_ERR,
"%d (%s) message element too big, len=%d, max len=%d", a->elem_id,
cw_strelemp(conn->actions, a->elem_id), len, a->max_len);
return 0;
}
*/
return 1;
}
int static do_save(mbag_t itemstore, struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len, struct sockaddr *from)
{
if (a->itemtype == MBAG_BYTE) {
mbag_set_byte(itemstore, a->item_id, *data);
return 1;
}
if (a->itemtype == MBAG_WORD) {
mbag_set_word(itemstore, a->item_id, cw_get_word(data));
return 1;
}
if (a->itemtype == MTYPE_DWORD) {
mbag_set_dword(itemstore, a->item_id, cw_get_dword(data));
return 1;
}
if (a->itemtype == MBAG_STR) {
mbag_set_strn(itemstore, a->item_id, (char *) data, len);
return 1;
}
if (a->itemtype == MBAG_BSTR) {
mbag_set_bstrn(itemstore, a->item_id, data, len);
return 1;
}
if (a->itemtype == MBAG_BSTR16) {
mbag_set_bstr16n(itemstore, a->item_id, data, len);
return 1;
}
/* if (a->itemtype == MBAG_DATA) {
mbag_set_data(itemstore, a->item_id, data, len);
return 1;
}
*/
if (a->itemtype == MBAG_VENDORSTR) {
mbag_set_bstrv(itemstore, a->item_id,
cw_get_dword(data), data + 4, len - 4);
return 1;
}
cw_log(LOG_ERR,
"Can't handle item type %d in definition for incomming msg %d (%s) - %d, cw_in_generic.",
a->itemtype, a->msg_id, cw_strmsg(a->msg_id), a->elem_id);
return 0;
}
int cw_in_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from)
{
if (!check_len(conn, a, data, len, from))
return 0;
mbag_t itemstore;
/// if (!a->target)
itemstore = conn->incomming;
// else
// itemstore = a->target(conn, a);
return do_save(itemstore, conn, a, data, len, from);
}
/*
int cw_in_radio_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len, struct sockaddr *from)
{
// if (!check_len(conn, a, data, len, from))
// return 0;
int rid = cw_get_byte(data);
mbag_t radio = mbag_i_get_mbag(conn->radios, rid, NULL);
if (!radio) {
if (a->vendor_id != 0
|| ( (a->vendor_id == 0) && (a->msg_id != CW_MSG_DISCOVERY_REQUEST
&& a->msg_id != CW_MSG_JOIN_REQUEST) )) {
cw_dbg(DBG_ELEM_ERR, "Radio not found %d", rid);
return 0;
}
mbag_i_set_mbag(conn->radios,rid,mbag_create());
}
return 1;
}
*/

View File

@ -3,7 +3,8 @@
#include "dbg.h"
#include "mbag.h"
int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len, struct cw_descriptor_subelem_def *allowed)
int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len,
struct cw_DescriptorSubelemDef *allowed)
{
struct cw_ac_status *status = malloc(sizeof(struct cw_ac_status));
if (!status)
@ -24,9 +25,9 @@ int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len, struct cw_descri
mbag_set_ptr(store, CW_ITEM_AC_STATUS, status);
static struct cw_descriptor_subelem_def allowed_default[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
static struct cw_DescriptorSubelemDef allowed_default[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1},
{0,0, NULL,0, 0}
};

View File

@ -19,9 +19,13 @@
#include "cw.h"
#include "dbg.h"
int cw_read_descriptor_subelems(mbag_t store, uint8_t * data, int len,
struct cw_descriptor_subelem_def *elems)
int cw_read_descriptor_subelems(mavl_t store, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *elems)
{
printf("sub reader\n");
int errors = 0;
int success = 0;
int sub = 0;
@ -36,10 +40,14 @@ int cw_read_descriptor_subelems(mbag_t store, uint8_t * data, int len,
bstrv_t vstr = NULL;
int i;
/* search sub-element */
for (i = 0; elems[i].maxlen; i++) {
if (elems[i].type == subtype && elems[i].vendor_id==vendor_id)
break;
}
if (!elems[i].maxlen) {
vstr = bstrv_create(vendor_id, data + sub + 8, sublen);
if (vstr) {
@ -58,11 +66,11 @@ int cw_read_descriptor_subelems(mbag_t store, uint8_t * data, int len,
}
vstr =
mbag_set_bstrv(store, elems[i].item_id, vendor_id,
mbag_set_bstrv(store, elems[i].key, vendor_id,
data + sub + 8, l);
char dbgstr[128];
sprintf(dbgstr, "Storing '%s'", elems[i].item_id);
sprintf(dbgstr, "Storing '%s'", elems[i].key);
cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype, vstr);
success++;
}

View File

@ -1,2 +0,0 @@

View File

@ -3,18 +3,41 @@
#include "capwap.h"
#include "capwap_items.h"
#include "dbg.h"
#include "cw_types.h"
int cw_read_wtp_descriptor(mbag_t mbag, struct conn *conn,
struct cw_action_in *a, uint8_t * data, int len,struct cw_descriptor_subelem_def *allowed)
static struct cw_DescriptorSubelemDef allowed_default[] = {
{0,CW_SUBELEM_WTP_HARDWARE_VERSION, "hardware_version", 1024,1},
{0,CW_SUBELEM_WTP_SOFTWARE_VERSION, "software_version", 1024,1},
{0,CW_SUBELEM_WTP_BOOTLOADER_VERSION, "bootloader_version", 1024,1},
{0,CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION, "other_software_version", 1024,0},
{0,0, NULL, 0,0}
};
int cw_read_wtp_descriptor(mavl_t cfg, struct conn *conn,
struct cw_ElemHandler *eh, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed)
{
int ncrypt, pos,i;
mavldata_t md;
char key[64];
mbag_set_byte(mbag, CW_ITEM_WTP_MAX_RADIOS, cw_get_byte(data));
sprintf(key,"%s/%s",eh->key, "max_radios");
md.kv.key=strdup(key);
mavl_replace (cfg, cw_type_byte.get(&md,data,1));
sprintf(key,"%s/%s",eh->key, "radios_in_use");
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));
*/
/* Get number of encryption elements */
int ncrypt = cw_get_byte(data + 2);
ncrypt = cw_get_byte(data + 2);
if (ncrypt == 0) {
if (conn->strict_capwap) {
cw_dbg(DBG_ELEM_ERR,
@ -25,24 +48,16 @@ int cw_read_wtp_descriptor(mbag_t mbag, struct conn *conn,
"Non standard conform WTP Descriptor, number of encryptoin elements is 0.");
}
int pos = 3;
int i;
pos = 3;
for (i = 0; i < ncrypt; i++) {
// It's a dummy for now
/* // It's a dummy for now */
pos += 3;
}
static struct cw_descriptor_subelem_def allowed_default[] = {
{0,CW_SUBELEM_WTP_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,1},
{0,CW_SUBELEM_WTP_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
{0,CW_SUBELEM_WTP_BOOTLOADER_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
{0,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(conn->incomming, data + pos, len - pos, allowed);
printf("call read subelems\n");
return cw_read_descriptor_subelems(cfg, data + pos, len - pos, allowed);
}

View File

@ -2,27 +2,39 @@
#include "capwap.h"
#include "capwap_items.h"
#include "cw_types.h"
/**
* Read WTP Descriptor in Cisco-Style (Draft 7)
*/
int cw_read_wtp_descriptor_7(mbag_t mbag, struct conn *conn,
struct cw_action_in *a, uint8_t * data, int len,
struct cw_descriptor_subelem_def *allowed)
int cw_read_wtp_descriptor_7(mavl_t cfg, struct conn *conn,
struct cw_ElemHandler *eh, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed)
{
int ncrypt, pos,i;
mavldata_t md;
char key[64];
mbag_set_byte(mbag, CW_ITEM_WTP_MAX_RADIOS, cw_get_byte(data));
sprintf(key,"%s/%s",eh->key, "max_radios");
md.kv.key=strdup(key);
mavl_replace (cfg, cw_type_byte.get(&md,data,1));
sprintf(key,"%s/%s",eh->key, "radios_in_use");
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));
*/
int pos = 2;
pos = 2;
/* Encryption element, for now dumy XXX */
//cw_get_word(data + pos + 2);
pos += 2;
static struct cw_descriptor_subelem_def allowed_default[] = {
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},
@ -33,5 +45,5 @@ int cw_read_wtp_descriptor_7(mbag_t mbag, struct conn *conn,
if (!allowed)
allowed=allowed_default;
return cw_read_descriptor_subelems(mbag, data + pos, len - pos, allowed);
return cw_read_descriptor_subelems(cfg, data + pos, len - pos, allowed);
}

View File

@ -21,24 +21,6 @@
#include "cw.h"
#include "cw_types.h"
/*
static struct mdata_Elem *from_str(const char *src)
{
struct mdata_Elem *i = mdata_elem_new(&cw_type_byte);
if (!i)
return NULL;
i->data.byte = atoi(src);
return i;
}
static int to_str(const struct mdata_Elem *e, char *dst)
{
return sprintf(dst, "%d", e->data.byte);
}
*/
static mavldata_t *get(mavldata_t * data, const uint8_t * src, int len)
{
data->kv.priv = &cw_type_byte;
@ -56,12 +38,19 @@ static int to_str(const mavldata_t *data, char *dst, int max_len)
return sprintf(dst, "%d", data->kv.val.byte);
}
static mavldata_t *from_str(mavldata_t * data, const char *src)
{
data->kv.val.byte = atoi(src);
return data;
}
const struct cw_Type cw_type_byte = {
"Byte", /* name */
NULL, /* del */
put, /* put */
get, /* get */
to_str /* to_str */
to_str, /* to_str */
from_str /* from_str */
};

View File

@ -18,45 +18,38 @@
#include <stdio.h>
#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_dword);
if (!e)
return NULL;
#include "cw_types.h"
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_byte;
data->kv.val.dword = cw_get_dword(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_dword(dst, data->kv.val.dword);
}
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_dword);
if (!e)
return NULL;
e->data.word=cw_get_dword(src);
return e;
return sprintf(dst, "%d", data->kv.val.dword);
}
static int put(struct mdata_Elem * e, uint8_t *dst)
static mavldata_t *from_str(mavldata_t * data, const char *src)
{
return cw_put_dword(dst,e->data.word);
data->kv.val.dword = atoi(src);
return data;
}
#define _I_NAME "Dword"
#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_dword = {
"Dword", /* name */
NULL, /* del */
put, /* put */
get, /* get */
to_str, /* to_str */
from_str /* from_str */
};
const struct mdata_Type cw_type_dword = MDATA_TYPE_INIT();
*/

View File

@ -23,7 +23,7 @@ struct cw_Type{
/** Cereate an item of this type from a string, which was previously
created by the #del function. */
/* struct mdata_Elem * (*from_str)(const char *src);*/
mavldata_t * (*from_str)(mavldata_t * data, const char *src);
/*
int (*def)(void *, void *);
@ -44,4 +44,4 @@ void cw_types_mavl_delete(mavldata_t *data);
#define cw_types_mavl_create()\
mavl_create(mavl_cmp_kv, cw_types_mavl_delete)
#endif
#endif /* __CW_TYPES_H */

View File

@ -4,4 +4,5 @@ void cw_types_mavl_delete(mavldata_t *data){
const struct cw_Type * type = data->kv.priv;
if (type->del)
type->del(data);
free(data->kv.key);
}

View File

@ -3,6 +3,7 @@
union mavldata *mavl_replace(struct mavl *t,union mavldata *data){
struct mavlnode * node = mavl_get_node(t,data);
if (node){
if (t->del)
t->del(&node->data);
node->data=*data;
return &node->data;

View File

@ -2,6 +2,9 @@
#define __MESSAGE_SET_H
#include "mlist.h"
#include "sock.h"
#include "mavl.h"
#include "conn.h"
struct cw_MsgSet {
mavl_t messages;
@ -34,8 +37,9 @@ 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 (*start_in)(struct conn *conn,struct cw_action_in *a,uint8_t*data,int len,struct sockaddr *from);
int (*end_in)(struct conn *conn,struct cw_action_in *a,uint8_t*elem,int len,struct sockaddr *from);
*/
};

View File

@ -25,8 +25,6 @@
#include <errno.h>
#include <dlfcn.h>
//#include "action.h"
#include "mbag.h"
#include "mavl.h"
#include "dbg.h"
@ -57,27 +55,32 @@ struct cache_item {
};
static struct mavl *msgset_cache = NULL;
/*
static int mod_null_register_actions(struct cw_actiondef *def, int mode)
{
return 0;
}
*/
/**
* mod_null is a dummy mod
*/
struct cw_Mod mod_null = {
.name = "none",
.register_actions = mod_null_register_actions,
"none", /* name */
NULL, /* init */
NULL, /* init_config */
NULL, /* detect */
NULL /* data */
};
static int cmp(const void *p1, const void *p2)
static int cmp(const mavldata_t *p1, const mavldata_t *p2)
{
struct cache_item *c1 = (struct cache_item *) p1;
struct cache_item *c2 = (struct cache_item *) p2;
struct cache_item *c1 = (struct cache_item *) p1->ptr;
struct cache_item *c2 = (struct cache_item *) p2->ptr;
int r;
r = strcmp(c1->capwap, c2->capwap);
@ -96,6 +99,10 @@ struct cw_actiondef *mod_cache_get(const char *capwap, const char *bindings)
struct cw_MsgSet *cw_mod_get_msg_set(struct conn *conn,
struct cw_Mod * capwap_mod, struct cw_Mod *bindings_mod)
{
struct cache_item search;
struct cache_item * cached_set;
struct cw_MsgSet * set;
if (!msgset_cache) {
msgset_cache = mavl_create(cmp, NULL);
if (!msgset_cache) {
@ -105,11 +112,11 @@ struct cw_MsgSet *cw_mod_get_msg_set(struct conn *conn,
}
}
struct cache_item search;
search.capwap = capwap_mod->name;
search.bindings = bindings_mod->name;
struct cache_item * cached_set = mavl_get(msgset_cache, &search);
cached_set = mavl_get_ptr(msgset_cache, &search);
if (cached_set) {
cw_dbg(DBG_INFO, "Using cached message set for %s,%s", capwap_mod->name, bindings_mod->name);
return cached_set->msgset;
@ -124,7 +131,7 @@ struct cw_MsgSet *cw_mod_get_msg_set(struct conn *conn,
}
memset(cached_set, 0, sizeof(struct cache_item));
struct cw_MsgSet * set = cw_msgset_create();
set = cw_msgset_create();
if (!set) {
free(cached_set);
cw_log(LOG_ERR, "Can't allocate memory for mod cache item %s",
@ -140,18 +147,16 @@ struct cw_MsgSet *cw_mod_get_msg_set(struct conn *conn,
if (capwap_mod) {
cached_set->capwap = capwap_mod->name;
//c->register_actions(&(i->actions), CW_MOD_MODE_CAPWAP);
capwap_mod->register_messages(cached_set->msgset,CW_MOD_MODE_CAPWAP);
}
if (bindings_mod) {
cached_set->bindings = bindings_mod->name;
//b->register_actions(&(i->actions), MOD_MODE_BINDINGS);
}
/*
// if (actions_registered_cb)
// actions_registered_cb(capwap_mod, bindings_mod, &(cached_set->actions));
mavl_add(msgset_cache, cached_set);
*/
mavl_add_ptr(msgset_cache, cached_set);
return cached_set->msgset;
}
@ -159,12 +164,20 @@ struct cw_MsgSet *cw_mod_get_msg_set(struct conn *conn,
/* static mavl to store modules */
static struct mavl * mods_loaded = NULL;
static int mod_cmp(const void *e1, const void *e2){
static int mod_cmp_mavl(const mavldata_t *e1, const mavldata_t *e2){
const struct cw_Mod * m1 = e1->ptr;
const struct cw_Mod * m2 = e2->ptr;
return strcmp(m1->name,m2->name);
}
static int mod_cmp_mlist(const void *e1, const void *e2){
const struct cw_Mod * m1 = e1;
const struct cw_Mod * m2 = e2;
return strcmp(m1->name,m2->name);
}
static const char * mod_path="./";
void cw_mod_set_mod_path(const char * path){
@ -177,11 +190,16 @@ void cw_mod_set_mod_path(const char * path){
* @return a pointer to the module interface
*/
struct cw_Mod * cw_mod_load(const char * mod_name){
struct cw_Mod search;
struct cw_Mod * mod;
char mod_filename[CW_MOD_MAX_MOD_NAME_LEN+5];
char * filename;
void * handle;
struct cw_Mod * (*mod_get_interface)();
/* if modlist is not initialized, initialize ... */
if (mods_loaded==NULL){
mods_loaded=mavl_create(mod_cmp,NULL);
mods_loaded=mavl_create(mod_cmp_mavl,NULL);
if (mods_loaded==NULL){
cw_log(LOG_ERROR, "Can't init modlist, no memory");
return NULL;
@ -190,11 +208,11 @@ struct cw_Mod * cw_mod_load(const char * mod_name){
/* Search for the module in mods_loaded, to see if it is
* already loaded or was statically linked */
struct cw_Mod search;
memset(&search,0,sizeof(search));
search.name=mod_name;
struct cw_Mod * mod;
mod = mavl_find(mods_loaded,&search);
mod = mavl_find_ptr(mods_loaded,&search);
if (mod){
return mod;
}
@ -205,17 +223,16 @@ struct cw_Mod * cw_mod_load(const char * mod_name){
return NULL;
}
char mod_filename[CW_MOD_MAX_MOD_NAME_LEN+5];
sprintf(mod_filename,"mod_%s",mod_name);
/* we have to load the module dynamically */
char * filename;
filename = cw_filename(mod_path,mod_filename,".so");
if (filename==NULL)
return NULL;
cw_log(LOG_ERROR,"DLOPEN now !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
/* Open the DLL */
void * handle;
handle = dlopen(filename,RTLD_NOW);
if (!handle){
@ -223,9 +240,8 @@ cw_log(LOG_ERROR,"DLOPEN now !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
goto errX;
}
struct cw_Mod * (*mod_get_interface)();
mod_get_interface = dlsym(handle,mod_filename);
mod_get_interface = (struct cw_Mod*(*)()) dlsym(handle,mod_filename);
if (!mod_get_interface){
cw_log(LOG_ERROR,"Failed to load module: %s",dlerror());
@ -235,7 +251,7 @@ cw_log(LOG_ERROR,"DLOPEN now !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
mod = mod_get_interface();
mod->dll_handle=handle;
if (!mavl_add(mods_loaded,mod)){
if (!mavl_add_ptr(mods_loaded,mod)){
dlclose(handle);
cw_log(LOG_ERR,"Can' add module %s",mod_name);
goto errX;
@ -253,7 +269,7 @@ static struct mlist * mods_list = NULL;
struct cw_Mod * cw_mod_add_to_list(struct cw_Mod * mod ){
if (!mods_list){
mods_list = mlist_create(mod_cmp);
mods_list = mlist_create(mod_cmp_mlist);
if (!mods_list){
cw_log(LOG_ERROR,"Can't init mods_list");
return 0;
@ -266,10 +282,13 @@ struct cw_Mod * cw_mod_detect(struct conn *conn,
uint8_t * rawmsg, int len,
int elems_len, struct sockaddr *from,
int mode){
struct mlist_elem * e;
if (mods_list==NULL)
return MOD_NULL;
struct mlist_elem * e;
mlist_foreach(e,mods_list){
struct cw_Mod * mod = e->data;
cw_dbg(DBG_MOD,"Checking mod: %s",mod->name);

View File

@ -6,9 +6,7 @@ include ../../Config.local.mak
OBJS=\
mod_capwap_ac.o \
mod_capwap_wtp.o\
capwap_actions_ac.o \
capwap_actions_wtp.o \
capwap_in_wtp_board_data.o \
capwap_out_ac_descriptor.o \
capwap_out_get_session_id.o \

View File

@ -25,6 +25,7 @@
#include "mod_capwap.h"
static struct cw_ElemHandler handlers[] = {
{
@ -33,7 +34,8 @@ static struct cw_ElemHandler handlers[] = {
0,0, /* Vendor / Proto */
1,1, /* min/max length */
CW_TYPE_BYTE, /* type */
"discovery_type" /* Key */
"discovery_type", /* Key */
cw_in_generic /* get */
}
,
{
@ -42,9 +44,31 @@ static struct cw_ElemHandler handlers[] = {
0,0, /* Vendor / Proto */
1,1, /* min/max length */
CW_TYPE_BYTE, /* type */
"wtp_mac_type" /* Key */
"wtp_mac_type", /* Key */
cw_in_generic /* get */
}
,
{
"WTP Board Data", /* name */
CAPWAP_ELEM_WTP_BOARD_DATA, /* Element ID */
0,0, /* Vendor / Proto */
4,128, /* min/max length */
NULL, /* type */
"wtp_board_data", /* Key */
capwap_in_wtp_board_data /* get */
}
,
{
"WTP Descriptor", /* name */
CAPWAP_ELEM_WTP_DESCRIPTOR, /* Element ID */
0,0, /* Vendor / Proto */
4,128, /* min/max length */
NULL, /* type */
"wtp_descriptor", /* Key */
capwap_in_wtp_descriptor /* get */
}
,
{0,0,0,0,0,0,0,0}
};
@ -55,7 +79,8 @@ 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,0,00}
{0,0,CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},
{0,0,0,0,0}
};

View File

@ -16,22 +16,16 @@
*/
#include <stdlib.h>
#include <string.h>
#include "mod_capwap.h"
#include "cw/cw.h"
#include "cw/capwap_items.h"
#include "cw/mbag.h"
#include "cw/cw_util.h"
#include "cw/dbg.h"
#include "cw/cw.h"
/*
static void readsubelems_wtp_board_data(mbag_t itemstore, uint8_t * msgelem,
int len)
{
@ -89,26 +83,36 @@ static void readsubelems_wtp_board_data(mbag_t itemstore, uint8_t * msgelem,
} 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_action_in *a, uint8_t * data,
int capwap_in_wtp_board_data(struct conn *conn, struct cw_ElemHandler *eh, uint8_t * data,
int len, struct sockaddr *from)
{
/*
if (len < 4) {
cw_dbg(DBG_ELEM_ERR,
"Discarding WTP_BOARD_DATA msgelem, wrong size, type=%d, len=%d",
a->elem_id, len);
return 0;
}
*/
char vendor_key[64];
printf("Have to read WTP Board Data\n");
sprintf(vendor_key,"%s/%s",eh->key,"vendor");
/*
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(itemstore, data + 4, len - 4);
*/
return 1;
}

View File

@ -17,17 +17,21 @@
*/
#include "cw/sock.h"
#include "cw/cw.h"
int capwap_in_wtp_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * data,
#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 rc;
printf("WTP Descriptor reader\n");
/*
// mbag_t mbag = conn->incomming;
*/
rc =cw_read_wtp_descriptor(conn->remote_cfg, conn, eh, data, len, NULL);
mbag_t mbag = conn->incomming;
int rc =cw_read_wtp_descriptor(mbag, conn, a, data, len, NULL);
return rc;
}

View File

@ -4,13 +4,18 @@
struct cw_Mod *mod_capwap_ac();
struct cw_Mod *mod_capwap_wtp();
#include "cw/message_set.h"
#include "cw/conn.h"
extern int capwap_in_wtp_descriptor(struct conn *conn, struct cw_action_in *a,
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_board_data(struct conn *conn, struct cw_action_in *a,
extern int capwap_in_wtp_board_data(struct conn *conn, struct cw_ElemHandler *a,
uint8_t * data, int len, struct sockaddr *from);
/*
extern int capwap_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a,
uint8_t * dst);
@ -27,6 +32,7 @@ extern struct mbag_item * capwap_out_get_capwap_timers(struct conn *conn,struct
extern int capwap_out_ac_ip_list(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
*/
struct cw_MsgSet * capwap_register_msg_set(struct cw_MsgSet * set, int mode);

View File

@ -44,23 +44,14 @@
#include "cw/cw_types.h"
static struct cw_ElemHandler handlers[] = {
{
"Discovery Type", /* name */
CAPWAP_ELEM_DISCOVERY_TYPE, /* Element ID */
"WTP Descriptor (Draft 7)", /* name */
CAPWAP_ELEM_WTP_DESCRIPTOR, /* Element ID */
0,0, /* Vendor / Proto */
1,1, /* min/max length */
CW_TYPE_BYTE, /* type */
"discovery_type" /* Key */
}
,
{
"WTP Mac Type", /* name */
CAPWAP_ELEM_WTP_MAC_TYPE, /* Element ID */
0,0, /* Vendor / Proto */
1,1, /* min/max length */
CW_TYPE_BYTE, /* type */
"wtp_mac_type" /* Key */
4,128, /* min/max length */
NULL, /* type */
"wtp_descriptor", /* Key */
cisco_in_wtp_descriptor /* get */
}
,
{0,0,0,0,0,0,0,0}
@ -70,7 +61,7 @@ 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_DESCRIPTOR, 1, 0},
{0,0,0,00}
};
@ -136,7 +127,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_RAD_NAME,
.start=cw_in_generic2,
.start=cw_in_generic,
.item_id = "wtp_name",
.min_len=1,
.max_len=512,
@ -224,7 +215,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CW_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic2,
.start = cw_in_generic,
.mand = 0,
.min_len = 1,
.max_len = 1
@ -245,7 +236,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.elem_id = CW_ELEM_AC_NAME,
.item_id = CW_ITEM_AC_NAME,
.start = cw_in_generic2,
.start = cw_in_generic,
.min_len = 0,
.max_len = 512,
.mand = 1
@ -273,7 +264,7 @@ static cw_action_in_t actions_in[] = {
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_LED_STATE_CONFIG,
.item_id = CISCO_ITEM_AP_LED_STATE_CONFIG,
.start = cw_in_generic2
.start = cw_in_generic
}
,
@ -285,7 +276,7 @@ static cw_action_in_t actions_in[] = {
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_LED_FLASH_CONFIG,
.item_id = CISCO_ITEM_AP_LED_FLASH_CONFIG,
.start = cw_in_generic2
.start = cw_in_generic
}
,
@ -329,7 +320,7 @@ static cw_action_in_t actions_in[] = {
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_MODE_AND_TYPE,
.item_id = CISCO_ITEM_AP_MODE_AND_TYPE,
.start = cw_in_generic2
.start = cw_in_generic
}
,
@ -341,7 +332,7 @@ static cw_action_in_t actions_in[] = {
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_LOG_FACILITY,
.item_id = CIPWAP_ITEM_LOG_FACILITY,
.start = cw_in_generic2
.start = cw_in_generic
}
,

View File

@ -70,7 +70,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CW_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic2,
.start = cw_in_generic,
.mand = 0,
.min_len = 1,
.max_len = 1
@ -103,7 +103,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = LW_ELEM_LOCATION_DATA,
.item_id = CW_ITEM_LOCATION_DATA,
.start = cw_in_generic2,
.start = cw_in_generic,
.min_len = 0,
.max_len = 1024,
.mand = 0
@ -117,7 +117,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CW_CISCO_RAD_NAME,
.item_id = CW_ITEM_WTP_NAME,
.start = cw_in_generic2,
.start = cw_in_generic,
.min_len = 0,
.max_len = 1024,
.mand = 0
@ -132,7 +132,7 @@ static cw_action_in_t actions_in[] = {
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CW_CISCO_AP_GROUP_NAME,
.item_id = CIPWAP_ITEM_WTP_GROUP_NAME,
.start = cw_in_generic2,
.start = cw_in_generic,
.min_len = 0,
.max_len = 1024,
.mand = 0
@ -162,7 +162,7 @@ static cw_action_in_t actions_in[] = {
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_MODE_AND_TYPE,
.item_id = CISCO_ITEM_AP_MODE_AND_TYPE,
.start = cw_in_generic2
.start = cw_in_generic
}
,
@ -250,7 +250,7 @@ static cw_action_in_t actions_in[] = {
.vendor_id = LW_VENDOR_ID_CISCO,
.elem_id = LW_CISCO_MWAR_HASH_VALUE,
.item_id = CIPWAP_ITEM_AC_HASH_VALUE,
.start = cw_in_generic2, //cisco_in_telnet_ssh
.start = cw_in_generic, //cisco_in_telnet_ssh
}
,
@ -473,7 +473,7 @@ static cw_action_in_t actions80211_in[] = {
.vendor_id = LW_VENDOR_ID_CISCO,
.elem_id = LW_CISCO_ADD_WLAN,
// .item_id = CIPWAP_ITEM_AC_HASH_VALUE,
// .start = cw_in_generic2, //cisco_in_telnet_ssh
// .start = cw_in_generic, //cisco_in_telnet_ssh
.start = cisco_in_add_wlan
}

View File

@ -8,7 +8,7 @@
int cisco_in_ac_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len, struct sockaddr *from)
{
static struct cw_descriptor_subelem_def allowed[] = {
static struct cw_DescriptorSubelemDef allowed[] = {
{CW_VENDOR_ID_CISCO,0, CW_ITEM_AC_HARDWARE_VERSION, 1024,1},
{CW_VENDOR_ID_CISCO,1, CW_ITEM_AC_SOFTWARE_VERSION, 1024,1},
{0,0, NULL,0, 0}

View File

@ -22,11 +22,11 @@
#include "cw/capwap_items.h"
int cisco_in_wtp_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int cisco_in_wtp_descriptor(struct conn *conn, struct cw_ElemHandler *eh, uint8_t * data,
int len, struct sockaddr *from)
{
static struct cw_descriptor_subelem_def allowed[] = {
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},
@ -35,7 +35,7 @@ int cisco_in_wtp_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t *
};
return cw_read_wtp_descriptor_7(conn->incomming, conn, a, data, len, allowed);
return cw_read_wtp_descriptor_7(conn->incomming, conn, eh, data, len, allowed);
}

View File

@ -26,14 +26,19 @@ static struct cw_MsgSet * register_messages(struct cw_MsgSet *set, int mode)
switch (mode) {
case CW_MOD_MODE_CAPWAP:
{
cw_dbg(DBG_MOD,"Cisco: loading base med capwap");
struct cw_Mod *cmod = cw_mod_load("capwap");// NULL; //modload_ac("cipwap");
struct cw_Mod *cmod = cw_mod_load("capwap");
if (!cmod) {
cw_log(LOG_ERR,
"Can't initialize mod_cisco, failed to load base module mod_cipwap");
return 1;
}
\
cmod->register_messages(set, CW_MOD_MODE_CAPWAP);
cw_dbg(DBG_MOD,"Cisco: loading cisco message set");
cisco_register_msg_set(set,CW_MOD_MODE_CAPWAP);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d messafe", 7);
return 0;