can partially read wtp descriptor
FossilOrigin-Name: 87c986decab2956c060dc9212e5bd4d89bed829ec528477817f8ab795c396853
This commit is contained in:
parent
8817d54d14
commit
14a9c95eb8
@ -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>
|
||||
|
@ -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);
|
||||
}
|
@ -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/>
|
||||
|
@ -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[];
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
@ -398,11 +398,12 @@ 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;
|
||||
|
||||
|
||||
|
38
src/cw/cw.h
38
src/cw/cw.h
@ -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);
|
||||
|
||||
|
||||
|
||||
|
@ -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}
|
||||
|
@ -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"
|
||||
|
||||
/// 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);
|
||||
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);
|
||||
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];
|
||||
|
||||
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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
*/
|
||||
|
@ -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}
|
||||
};
|
||||
|
||||
|
@ -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++;
|
||||
}
|
||||
|
@ -1,2 +0,0 @@
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
"Byte", /* name */
|
||||
NULL, /* del */
|
||||
put, /* put */
|
||||
get, /* get */
|
||||
to_str, /* to_str */
|
||||
from_str /* from_str */
|
||||
};
|
||||
|
||||
|
||||
|
@ -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();
|
||||
*/
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -3,7 +3,8 @@
|
||||
union mavldata *mavl_replace(struct mavl *t,union mavldata *data){
|
||||
struct mavlnode * node = mavl_get_node(t,data);
|
||||
if (node){
|
||||
t->del(&node->data);
|
||||
if (t->del)
|
||||
t->del(&node->data);
|
||||
node->data=*data;
|
||||
return &node->data;
|
||||
}
|
||||
|
@ -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,9 +37,10 @@ struct cw_ElemHandler {
|
||||
int max_len;
|
||||
const struct cw_Type * type;
|
||||
const char * key;
|
||||
/*
|
||||
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);
|
||||
int (*get)(struct conn *conn, struct cw_ElemHandler * handler,
|
||||
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);
|
||||
*/
|
||||
};
|
||||
|
||||
|
83
src/cw/mod.c
83
src/cw/mod.c
@ -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);
|
||||
|
@ -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 \
|
||||
|
@ -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,8 +79,9 @@ 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}
|
||||
|
||||
};
|
||||
|
||||
static struct cw_MsgDef messages[] = {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
,
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user