Moved Callbacks to mods

This commit is contained in:
7u83 2022-09-01 10:24:40 +02:00
parent 2064f7dba1
commit 5ed35979cd
26 changed files with 3728 additions and 431 deletions

View File

@ -225,6 +225,10 @@ int main (int argc, char *argv[])
goto errX;
};
//const char *ttt = cw_cfg_get(global_cfg,"cisco/ssl-cipher",NULL);
//printf("CFG: %s\n",ttt);
//stop();
cw_log_name = "AC-Tube";
/*

View File

@ -90,3 +90,38 @@ capwap/timers/max-discovery-interval: 10
capwap/decryption-error-report-period: 120
capwap/idle-timeout: 300
radio-cfg-a/capwap80211/wtp-radio-config/beacon-period: 100
radio-cfg-a/capwap80211/wtp-radio-config/bssid: .x003a9902fac0
radio-cfg-a/capwap80211/wtp-radio-config/cfg-period: 4
radio-cfg-a/capwap80211/wtp-radio-config/beacon-period: 100
radio-cfg-a/capwap80211/wtp-radio-config/bssid: .x003a9902fac0
radio-cfg-a/capwap80211/wtp-radio-config/cfg-period: 4
radio-cfg-a/capwap80211/wtp-radio-config/cfg-type: 1
radio-cfg-a/capwap80211/wtp-radio-config/cfp-maximum-duration: 60
radio-cfg-a/capwap80211/wtp-radio-config/country-str1: "DE "
radio-cfg-a/capwap80211/wtp-radio-config/country-str2: "DE "
radio-cfg-a/capwap80211/wtp-radio-config/occupancy-limit: 100
radio-cfg-a/capwap80211/wtp-radio-config/reg: 167772416
radio-cfg-b/capwap80211/wtp-radio-config/beacon-period: 100
radio-cfg-b/capwap80211/wtp-radio-config/bssid: .x003a9902fac0
radio-cfg-b/capwap80211/wtp-radio-config/cfg-period: 4
radio-cfg-b/capwap80211/wtp-radio-config/beacon-period: 100
radio-cfg-b/capwap80211/wtp-radio-config/bssid: .x003a9902fac0
radio-cfg-b/capwap80211/wtp-radio-config/cfg-period: 4
radio-cfg-b/capwap80211/wtp-radio-config/cfg-type: 1
radio-cfg-b/capwap80211/wtp-radio-config/cfp-maximum-duration: 60
radio-cfg-b/capwap80211/wtp-radio-config/country-str1: "DE "
radio-cfg-b/capwap80211/wtp-radio-config/country-str2: "DE "
radio-cfg-b/capwap80211/wtp-radio-config/occupancy-limit: 100
radio-cfg-b/capwap80211/wtp-radio-config/reg: 167772416

View File

@ -415,7 +415,7 @@ static void copy(struct cw_ElemHandlerParams * params)
cw_cfg_copy(params->cfg, params->conn->remote_cfg,DBG_CFG_UPDATES,"GlobalCfg");
}
static int discovery_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int discovery_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data * d)
{
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
char filename[200];
@ -431,10 +431,16 @@ static int discovery_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_pt
return 0;
}
static int join_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
/*
static int join_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d)
{
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
char filename[200];
int rc;
rc = 0;
if (d->parent)
rc =d->parent->fun(params,d->parent);
cw_dbg(DBG_X,"JOIN Callback");
copy(params);
@ -442,9 +448,11 @@ static int join_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, in
sprintf(filename,"wtp-join-%s.ckv",wtpname);
cw_cfg_save(filename,params->cfg,NULL);
cw_cfg_clear(params->cfg);
return 0;
return rc;
}
*/
/*
static int fill_update_cfg(struct cw_Conn * conn)
{
struct cw_Cfg_iter cfi;
@ -469,18 +477,21 @@ static int fill_update_cfg(struct cw_Conn * conn)
return 0;
}
*/
static int update_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int update_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d)
{
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
char filename[200];
int rc = 0;
if (d->parent)
rc =d->parent->fun(params,d->parent);
cw_dbg(DBG_X,"UPDATE Callback");
copy(params);
fill_update_cfg(params->conn);
//fill_update_cfg(params->conn);
const char * wtpname = cw_cfg_get(conn->remote_cfg,"capwap/wtp-name","default");
sprintf(filename,"wtp-status-%s.ckv",wtpname);
@ -489,7 +500,7 @@ static int update_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr,
return 0;
}
static int event_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int event_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d)
{
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
struct wtpman * wtpman = (struct wtpman *)conn->data;
@ -507,7 +518,7 @@ static int event_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, i
return 0;
}
static int change_state_event_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int change_state_event_cb(struct cw_ElemHandlerParams * params,struct cw_MsgCb_data * d)
{
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
struct wtpman * wtpman = (struct wtpman *)conn->data;
@ -579,6 +590,8 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
wtpman_destroy(wtpman);
return NULL;
}
wtpman->conn->global_cfg = global_cfg;
wtpman->conn->local_cfg = cw_cfg_create();
wtpman->wtp_cfg = cw_cfg_create();
@ -598,27 +611,6 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
sock_copyaddr(&wtpman->conn->data_addr,
(struct sockaddr *) &wtpman->conn->addr);
cw_conn_set_msg_cb(wtpman->conn,
CAPWAP_MSG_DISCOVERY_REQUEST,
discovery_cb);
cw_conn_set_msg_cb(wtpman->conn,
CAPWAP_MSG_JOIN_REQUEST,
join_cb);
cw_conn_set_msg_cb(wtpman->conn,
CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
update_cb);
cw_conn_set_msg_cb(wtpman->conn,
CAPWAP_MSG_WTP_EVENT_REQUEST,
event_cb);
cw_conn_set_msg_cb(wtpman->conn,
CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST,
change_state_event_cb);
// wtpman->conn->mods = conf_mods;
@ -658,9 +650,33 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
// wtpman->conn->setup_complete(wtpman->conn);
cw_conn_register_msg_cb(wtpman->conn,
CAPWAP_MSG_DISCOVERY_REQUEST,
discovery_cb);
/* cw_conn_set_msg_cb(wtpman->conn,
CAPWAP_MSG_JOIN_REQUEST,
join_cb);*/
/* cw_conn_register_msg_cb(wtpman->conn,
CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
update_cb);*/
cw_conn_register_msg_cb(wtpman->conn,
CAPWAP_MSG_WTP_EVENT_REQUEST,
event_cb);
/* cw_conn_register_msg_cb(wtpman->conn,
CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST,
change_state_event_cb);*/
}
}
cw_dbg(DBG_X,"WTPMAN_CREATED: %p",wtpman);
return wtpman;

View File

@ -465,9 +465,9 @@ enum cw_reboot_failure_types {
/**
* The Missing AC List Result Code is sent by the
* WTP to the AC when the AC List is missing */
#define CW_RESULT_MISSING_AC_LIST 1
#define CAPWAP_RESULT_SUCCESS_NAT 2
#define CW_RESULT_JOIN_FAILURE 3
#define CW_RESULT_MISSING_AC_LIST 1
#define CAPWAP_RESULT_SUCCESS_NAT 2
#define CAPWAP_RESULT_JOIN_FAILURE 3
#define CW_RESULT_JOIN_RESOURCE_DEPLETION 4
#define CW_RESULT_JOIN_UNKNOWN_SOURCE 5
#define CW_RESULT_JOIN_INCORRECT_DATA 6
@ -491,7 +491,7 @@ enum cw_reboot_failure_types {
13 Configuration Failure (Unable to Apply Requested Configuration
- Service Not Provided)
*/
#define CAPWAP_RESULT_CONFIGURATION_FAILURE_SERVICE_NOT PROVIDED 13
#define CAPWAP_RESULT_CONFIGURATION_FAILURE_SERVICE_NOT_PROVIDED 13
/**
* Image Data Error (Invalid Checksum)
*/

View File

@ -637,11 +637,15 @@ struct cw_Cfg_entry *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *nnkey
}
}
d = strchr(e->key, '.');
if (e->key[bl]!='.' && e->key[bl]!='/')
return NULL;
/* d = strchr(e->key, '.');
if (d == NULL)
return NULL;
if (d - e->key != bl)
return NULL;
return NULL;*/
if (strncmp(cfi->base, e->key, bl) != 0)
return NULL;
@ -684,6 +688,14 @@ uint8_t cw_cfg_get_byte_l(cw_Cfg_t ** cfgs, char *key, uint8_t def)
return v.val.byte;
}
uint16_t cw_cfg_get_int(cw_Cfg_t * cfg, const char *key, int def)
{
const char *s = cw_cfg_get(cfg,key,NULL);
if (s==NULL)
return def;
return atoi(s);
}
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, const char *key, uint16_t def)
@ -708,7 +720,6 @@ uint16_t cw_cfg_get_word_l(cw_Cfg_t ** cfg, const char *key, uint16_t def)
/*
int cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def)
{

View File

@ -89,6 +89,7 @@ void cw_cfg_del(cw_Cfg_t * cfg, const char *key);
int cw_cfg_get_first_index(cw_Cfg_t * cfg, const char *key, int n);
int cw_cfg_get_first_index_l(cw_Cfg_t ** cfgs, const char *key, int n);
uint16_t cw_cfg_get_int(cw_Cfg_t * cfg, const char *key, int def);

View File

@ -24,11 +24,12 @@
#include "dtls.h"
#define MAX_MSG_CBS 5
struct msg_callback{
int type; /**< message type */
cw_MsgCallbackFun fun;
int type; /**< message type */
struct cw_MsgCb_data data[MAX_MSG_CBS];
int count;
};
int msg_callback_cmp(const void *v1,const void *v2)
@ -62,19 +63,55 @@ void cw_conn_init(struct cw_Conn * conn)
conn->remote_cfg = cw_cfg_create();
conn->local_cfg = cw_cfg_create();
conn->cfg_list[0]=NULL;
conn->remote_addr[0]=0;
}
int cw_conn_set_msg_cb(struct cw_Conn *conn, int type, cw_MsgCallbackFun fun)
/**
* Register a message callback function.
* @param conn the connection the registered cb functions belongs to
* @param type The associated msg type. Whenever a message of this type is
* received, the callback function will be called
* @param fun A pinter to the callback function
*
*/
int cw_conn_register_msg_cb(struct cw_Conn *conn, int type, cw_MsgCallbackFun fun)
{
struct msg_callback cb;
struct msg_callback cb, *result;
int exists;
cb.type = type;
cb.fun = fun;
mavl_insert(conn->msg_callbacks,&cb,&exists);
cb.data[0].fun = fun;
cb.data[0].parent = NULL;
cb.count = 0;
result = mavl_insert(conn->msg_callbacks,&cb,&exists);
cw_dbg(DBG_X, "Registering msg callback: %d %p",type,result);
if (result==NULL)
return 0;
if (exists){
if (result->count>=MAX_MSG_CBS){
cw_log(LOG_ERROR,"Too many msg callback registrations for msg id %d",type);
return 0;
}
result->count++;
result->data[result->count].fun=fun;
result->data[result->count].parent=&(result->data[result->count-1]);
cw_dbg(DBG_X,"The result exists: %p %p %d %p",result,&cb,result->count,
result->data[result->count].parent
);
}
return 1;
}
/*
cw_MsgCallbackFun cw_conn_get_msg_cb(struct cw_Conn *conn, int type)
{
struct msg_callback cb,*result;
@ -83,8 +120,22 @@ cw_MsgCallbackFun cw_conn_get_msg_cb(struct cw_Conn *conn, int type)
if (result == NULL)
return NULL;
return result->fun;
}*/
int cw_conn_run_msg_cbs(struct cw_Conn * conn, int type, struct cw_ElemHandlerParams *params)
{
struct msg_callback cb,*result;
cb.type=type;
result = mavl_get(conn->msg_callbacks,&cb);
if (result == NULL)
return -1;
return result->data[result->count].fun(params,&(result->data[result->count]));
}
/**
* Create a conn object
* @param sock a socket
@ -106,8 +157,10 @@ struct cw_Conn * cw_conn_create(int sock, struct sockaddr * addr, int qsize)
conn->sock=sock;
if (addr)
if (addr){
sock_copyaddr(&conn->addr,addr);
sock_addr2str_p(addr, conn->remote_addr);
}
conn->fragman = fragman_create();
@ -516,12 +569,12 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
message->postprocess(&params,elems_ptr, elems_len);
}
cw_MsgCallbackFun cb_fun = cw_conn_get_msg_cb(conn,message->type);
if (cb_fun != NULL){
result_code = cb_fun(&params,elems_ptr, elems_len);
}
else{
result_code = cw_conn_run_msg_cbs(conn,message->type,&params);
// cw_MsgCallbackFun cb_fun = cw_conn_get_msg_cb(conn,message->type);
if (result_code==-1){
cw_cfg_clear(conn->update_cfg);
result_code=0;
}
// conn->remote_cfg=params.cfg;

View File

@ -58,6 +58,8 @@ struct cw_action_in;
struct cw_Conn {
int sock;
struct sockaddr_storage addr;
char remote_addr[64]; /* Contains a printfable string, of the connections
peer address */
struct connlist * connlist;
@ -71,19 +73,19 @@ struct cw_Conn {
int recv_timeout;
cw_Cfg_t * global_cfg; /**< This should set the global cfg of the program
cw_Cfg_t * global_cfg; /**< This should set to the global cfg of the program
which is using this conn object.
Teh global_cfg has to be treated read-only. */
cw_Cfg_t * local_cfg; /**< local_cfg contains overrides for global_cfg
wich are related to this conn object. */
wich are related to this conniection. */
cw_Cfg_t * remote_cfg; /**< contains the configuration we now from the
device this conn object ist connected to.
Typically this is what we have got from discovery
response or join response in WTP mode.
And in AC mode this contains date receive from
configuration status request. */
And in AC mode this contains datia received by
configuration status and join request. */
cw_Cfg_t * update_cfg;
@ -311,7 +313,18 @@ int conn_send_msg(struct cw_Conn *conn, uint8_t * rawmsg);
void conn_clear_upd(struct cw_Conn*conn, int merge);
int cw_conn_set_msg_cb(struct cw_Conn *conn, int type, cw_MsgCallbackFun fun);
struct cw_MsgCb_data;
//typedef int (*cw_MsgCallbackFun)(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len,
// struct cw_MsgCb_data *d);
typedef int (*cw_MsgCallbackFun)(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d);
struct cw_MsgCb_data{
cw_MsgCallbackFun fun;
struct cw_MsgCb_data * parent;
};
int cw_conn_register_msg_cb(struct cw_Conn *conn, int type, cw_MsgCallbackFun fun);
cw_MsgCallbackFun cw_conn_get_msg_cb(struct cw_Conn *conn, int type);
int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,

View File

@ -3,9 +3,10 @@
#include "dbg.h"
#include "cw.h"
#include "cfg.h"
/**
* @brief Detect NAT after a join/discovery request
* @brief Detect NAT after a Join Request
* @param conn Connection object
* @retval 1 NAT detected
* @retval 0 no NAT was detected
@ -15,7 +16,8 @@ int cw_detect_nat(struct cw_ElemHandlerParams *params)
const char * remote_str;
char local_str[128];
remote_str = cw_cfg_get(params->cfg,"capwap-local-ip-address",NULL);
remote_str = cw_cfg_get(params->cfg,"capwap/local-ip-address",NULL);
if (remote_str == NULL){
cw_dbg(DBG_WARN,"Can't detect NAT. No local IP from peer received.");
return 0;
@ -29,9 +31,12 @@ int cw_detect_nat(struct cw_ElemHandlerParams *params)
/* if connected and sent address is the same, there is
* no NAT */
if (strcmp(remote_str,local_str)==0)
if (strcmp(remote_str,local_str)==0){
cw_dbg(DBG_INFO,"Connection from %s: no NAT detected.",local_str);
return 0;
}
/* otherwise ther must be something between AC and WTP */
cw_dbg(DBG_INFO,"Connection from %s: NAT detected.",local_str);
return 1;
}

View File

@ -133,7 +133,7 @@ static struct cw_StrListElem prefix[] = {
{DBG_RFC, " RFC - "},
{DBG_DTLS, "DTLS - "},
{DBG_DTLS_DETAIL, "DTLS - "},
{DBG_WARN, " Warning - "},
{DBG_WARN, "Warning - "},
{DBG_MOD, "Mod - "},
{DBG_MOD_DETAIL, "Mod - "},
{DBG_STATE, "STATEMACHINE - "},

View File

@ -27,6 +27,8 @@
#include "cw.h"
#include "capwap80211.h"
/**
* Format bytes as hex string.
* @param dst Destination buffer
@ -87,4 +89,18 @@ int format_hdr_flags(char *dst, uint8_t * th)
}
char * cw_format_radio_information(char * dst, int ri)
{
char *d = dst;
if (ri & CW_80211_RADIO_TYPE_A)
*d++='a';
if (ri & CW_80211_RADIO_TYPE_B)
*d++='b';
if (ri & CW_80211_RADIO_TYPE_G)
*d++='g';
if (ri & CW_80211_RADIO_TYPE_N)
*d++='n';
*d=0;
return dst;
}

View File

@ -112,6 +112,9 @@ 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);
char * cw_format_radio_information(char * dst, int ri);
/**@}*/
#endif

View File

@ -56,7 +56,7 @@ struct cw_Mod {
int elems_len, struct sockaddr * from, int mode);
struct cw_MsgSet * (*register_messages)(struct cw_MsgSet * set, int mode);
struct cw_MsgSet * (*register_messages)(struct cw_MsgSet * set, int mode );
/**
* Handle returned by dlopen, if this module was loaded

View File

@ -405,7 +405,9 @@ struct cw_MsgData *cw_msgset_get_msgdata(struct cw_MsgSet *set, int type)
return NULL;
}
typedef int (*cw_MsgCallbackFun)(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len);
//typedef int (*cw_MsgCallbackFun)(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len);
//
/*
cw_MsgCallbackFun cw_msgset_set_postprocess(struct cw_MsgSet * set,int msg_id,
cw_MsgCallbackFun fun)
@ -420,5 +422,5 @@ cw_MsgCallbackFun cw_msgset_set_postprocess(struct cw_MsgSet * set,int msg_id,
return old_callback;
}
*/

View File

@ -146,9 +146,8 @@ struct cw_ElemHandler * cw_msgset_get_elemhandler(struct cw_MsgSet * set,
#define CW_MSGSET_POSTPROCESS 1
#define CW_MSGSET_PREPROCESS 2
typedef int (*cw_MsgCallbackFun)(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len);
cw_MsgCallbackFun cw_msgset_set_postprocess(struct cw_MsgSet * set,int msg_id,
cw_MsgCallbackFun fun);
//cw_MsgCallbackFun cw_msgset_set_postprocess(struct cw_MsgSet * set,int msg_id,
// cw_MsgCallbackFun fun);
#endif

View File

@ -2,7 +2,7 @@ include ../../Defs.mak
SOURCES=\
mod_capwap_ac.c \
mod_capwap.c \
capwap_actions.c \
capwap_in_wtp_board_data.c \
capwap_in_ac_descriptor.c \

View File

@ -27,7 +27,6 @@
#include "mod_capwap.h"
#include "cw/mavltypes.h"
static int postprocess_join_request(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len);

View File

@ -1,68 +0,0 @@
#include "cw/mod.h"
#include "cw/log.h"
#include "cw/dbg.h"
#include "cw/val.h"
#include "cw/keys.h"
#include "cw/dtls.h"
#include "cw/cfg.h"
#include "mod_capwap.h"
static int init(struct cw_Mod * mod, cw_Cfg_t * global_cfg, int role)
{
cw_dbg(DBG_INFO,"CAPWAP: Inititalizing mod_capwap.");
switch (role){
case CW_ROLE_AC:{
cw_dbg(DBG_MOD, "CAPWAP: Initialiazing mod_capwap in AC mode");
cw_cfg_set(global_cfg,
"capwap/ac-descriptor/hardware/version",
"0.0.0.1");
cw_cfg_set(global_cfg,
"capwap/ac-descriptor/hardware/vendor","0");
cw_cfg_set(global_cfg,
"capwap/ac-descriptor/software/version","0.0.0.1");
cw_cfg_set(global_cfg,
"capwap/ac-descriptor/software/vendor", "0");
}
break;
}
return 1;
}
static int detect(struct cw_Conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode)
{
if (mode != CW_MOD_MODE_CAPWAP)
return 0;
cw_dbg(DBG_MOD,"CAPWAP detected: yes");
return 1;
}
int static setup_cfg(struct cw_Conn * conn)
{
int security;
security = cw_setup_dtls(conn,conn->local_cfg,"capwap",CAPWAP_CIPHER);
// stop();
cw_cfg_set_int(conn->local_cfg,"ac-descriptor/security",security);
return 0;
}
struct cw_Mod mod_capwap = {
"capwap", /* name */
init, /* init */
detect, /* detect */
capwap_register_msg_set, /* register_messages */
NULL, /* dll_handle */
NULL, /* data */
setup_cfg /* setup_cfg */
};

View File

@ -3,8 +3,7 @@ include ../../Defs.mak
SOURCES=\
mod_cisco_ac.c \
cisco_actions.c \
mod_cisco.c \
cisco_in_wtp_descriptor.c \
cisco_out_wtp_descriptor.c \
cisco_in_ac_descriptor.c\

View File

@ -951,12 +951,12 @@ static struct cw_ElemHandler handlers70[] = {
}
,
{
"RAD Name -> CAPWAP WTP Name", /* name */
"Cisco RAD Name", /* name */
CISCO_ELEM_RAD_NAME, /* Element ID */
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
1,512, /* min/max length */
CW_TYPE_BSTR16, /* type */
"capwap/wtp-name", /* Key */
"cisco/rad-name", /* Key */
cw_in_generic, /* get */
cw_out_generic /* put */
}
@ -2323,11 +2323,20 @@ static struct cw_ElemHandler handlers70[] = {
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,CW_VENDOR_ID_CISCO, CISCO_ELEM_RAD_NAME, 1, 0},
{0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 0, 0},
{0,0, CAPWAP80211_ELEM_WTP_RADIO_INFORMATION, 1, 0},
/* This is Cisco's version of WTP Name msg elemnt. */
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_RAD_NAME, 1, 0},
/* Cisco dosn't sends WTP radio information in discovery
* requests and no WTP Board Data element, so we make them
* non-mandatory here */
{0,0, CAPWAP80211_ELEM_WTP_RADIO_INFORMATION, 0, 0},
{0,0, CAPWAP_ELEM_WTP_BOARD_DATA, 0, 0},
/* Instead of WTP Board Data we get Board Data Options from
* Ciso's APs */
{0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 0, 0},
{0,0,0,00}
};
@ -2341,19 +2350,19 @@ static struct cw_ElemDef discovery_response_elements[] ={
};
/*static uint16_t join_request_states[] = {CAPWAP_STATE_JOIN,0};*/
static struct cw_ElemDef join_request_elements[] ={
{0,0, CAPWAP_ELEM_WTP_IPV4_IP_ADDRESS,1,0},
{0,0, CAPWAP_ELEM_WTP_IPV6_IP_ADDRESS,1,0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_GROUP_NAME, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_MWAR_ADDR, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC,0, CW_IGNORE},
{0,0, CAPWAP_ELEM_WTP_IPV4_IP_ADDRESS, 1, 0},
{0,0, CAPWAP_ELEM_WTP_IPV6_IP_ADDRESS, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_GROUP_NAME, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_MWAR_ADDR, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC, 0, CW_IGNORE},
{0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 1, 0},
{0,0,CAPWAP_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS, 0, CW_DELETE},
{0,0,CAPWAP_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS, 0, CW_DELETE},
{0,0, CAPWAP_ELEM_ECN_SUPPORT, 0, CW_DELETE},
{0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 1, 0},
{0,0,CAPWAP_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS, 0, CW_DELETE},
{0,0,CAPWAP_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS, 0, CW_DELETE},
{0,0, CAPWAP_ELEM_ECN_SUPPORT, 0, CW_DELETE},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_PATH_MTU, 0, 0},
@ -3023,7 +3032,6 @@ static int postprocess_discovery(struct cw_ElemHandlerParams * params, uint8_t *
{
if (params->conn->role == CW_ROLE_AC ){
set_ac_version(params);
cw_detect_nat(params);
}
return 1;
}
@ -3032,6 +3040,7 @@ static int postprocess_join_request(struct cw_ElemHandlerParams * params, uint8_
{
if (postprocess_join_request_parent!=NULL){
postprocess_join_request_parent(params,elems_ptr,elems_len);
cw_detect_nat(params);
}
postprocess_discovery(params,elems_ptr,elems_len);
return 1;

View File

@ -26,7 +26,7 @@ cw_dbg(DBG_X,"NUM RADIOS: %d",radios);
}
/*
int cisco_out_radio_info(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
, uint8_t * dst)
{
@ -39,6 +39,6 @@ int cisco_out_radio_info(struct cw_ElemHandler * handler, struct cw_ElemHandlerP
return cw_out_radio_generic(handler,params,dst);
}
*/

3471
src/mod/cisco/mod_cisco.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,271 +0,0 @@
#include "cw/cw.h"
#include "cw/mod.h"
#include "cw/log.h"
#include "cw/dbg.h"
#include "cw/dtls.h"
#include "cw/cfg.h"
/*#include "mod_cisco.h"*/
/*#include "../modload.h"*/
#include "cw/vendors.h"
#include "mod_cisco.h"
#include "capwap_cisco.h"
/*
extern int cisco_register_actions80211_ac(struct cw_actiondef *def);
extern int cisco_register_actions_ac(struct cw_actiondef *def);
*/
/*mbag_t cisco_config = NULL;*/
static struct cw_Mod * capwap_mod = NULL;
static struct cw_Mod * capwap80211_mod = NULL;
static int write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
{
if (handler->proto == 0){
if (handler->vendor)
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
return len + cw_put_elem_hdr(dst, handler->id, len);
}
/* put the lwap elem header */
lw_set_dword(dst + 10, handler->vendor);
lw_set_word(dst + 14, handler->id);
return len + 6 + cw_put_elem_vendor_hdr(dst, handler->vendor,
CISCO_ELEM_SPAM_VENDOR_SPECIFIC, len+6);
}
static int header_len(struct cw_ElemHandler * handler)
{
if (handler->proto==0)
return handler->vendor ? 10 : 4;
return 16;
}
static struct cw_MsgSet * register_messages(struct cw_MsgSet *set, int mode)
{
cw_dbg(DBG_INFO,"CISCO: Register messages");
switch (mode) {
case CW_MOD_MODE_CAPWAP:
{
capwap_mod->register_messages(set, CW_MOD_MODE_CAPWAP);
capwap80211_mod->register_messages(set, CW_MOD_MODE_BINDINGS);
cisco_register_msg_set(set,CW_MOD_MODE_CAPWAP);
set->write_header = write_header;
set->header_len = header_len;
/* cw_dbg(DBG_MOD,"Cisco: loading cisco message set");*/
/* cw_dbg(DBG_INFO, "Initialized mod_cisco with %d messages", 7);*/
break;
}
case CW_MOD_MODE_BINDINGS:
{
break;
}
}
cw_dbg(DBG_INFO,"CISCO: Done register messages");
return 0;
}
/*
static void errfunc(cfg_t *cfg, const char *fmt, va_list ap){
if (cfg && cfg->filename && cfg->line)
cw_log(LOG_ERR, "MOD Cisco cfg file in %s:%d: ",
cfg->filename, cfg->line);
else if (cfg && cfg->filename)
cw_log(LOG_ERR, "MOD Cisco cfg file in %s:", cfg->filename);
}
*/
static int init(struct cw_Mod *mod, cw_Cfg_t * global_cfg, int role)
{
/* uint8_t * str;*/
// static char * hardware_version; /*strdup(".x01000001");* /
// static char * software_version; /* = NULL; * /
/* cfg_t *cfg;*/
int rc = 1;
/* cfg_opt_t opts[] = {
CFG_SIMPLE_STR("hardware_version", &hardware_version),
CFG_SIMPLE_STR("software_version",&software_version),
CFG_END()
};
*/
cw_dbg(DBG_INFO, "CISCO: Initialiazing mod_cisco ...");
cw_dbg(DBG_MOD, "CISCO: Loading base module: capwap");
capwap_mod = cw_mod_load("capwap",global_cfg,role);
if (capwap_mod == NULL){
cw_log(LOG_ERR, "CISCO: failed to load base module 'capwap");
return 0;
}
cw_dbg(DBG_MOD, "CISCO: Loading base module: capwap80211");
capwap80211_mod = cw_mod_load("capwap80211", global_cfg,role);
if (capwap_mod == NULL){
cw_log(LOG_ERR, "CISCO: failed to load base module 'capwap80211");
return 0;
}
cw_dbg(DBG_MOD, "CISCO: All base modules are sucessfully loaded.");
/*cisco_config = mbag_create();*/
/*
cfg = cfg_init(opts, CFGF_NONE);
cfg_set_error_function(cfg, errfunc);
char *filename = "cisco.conf";
FILE * f = fopen(filename,"r");
if (f){
fclose(f);
if (cfg_parse(cfg, filename)){
rc = 0;
goto errX;
}
}
*/
/*
str = bstr_create_from_cfgstr(hardware_version);
mbag_set_bstrv(cisco_config, CW_ITEM_AC_HARDWARE_VERSION,
CW_VENDOR_ID_CISCO,
bstr_data(str),bstr_len(str)
);
free(str);
if (software_version){
str = bstr_create_from_cfgstr(software_version);
mbag_set_bstrv(cisco_config, CW_ITEM_AC_SOFTWARE_VERSION,
CW_VENDOR_ID_CISCO,
bstr_data(str),bstr_len(str)
);
free(str);
}
*/
/*errX:*/
/* if (hardware_version)
free (hardware_version);
if (software_version)
free(software_version);*/
return rc;
}
static int detect(struct cw_Conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode)
{
int offset = cw_get_hdr_msg_offset(rawmsg);
const uint8_t *msg_ptr = rawmsg + offset;
const uint8_t *elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
const uint8_t *elem;
/* To detect a Cisco AP we look for any vendor
* specific payload Cisco identifier */
cw_foreach_elem(elem, elems_ptr, elems_len) {
int id = cw_get_elem_id(elem);
if (id == CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD) {
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_CISCO) {
/* // conn->actions = &actions;*/
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: yes");
} else {
cw_dbg(DBG_MOD, "CISCO bindings detected: yes");
}
return 1;
}
}
}
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: no");
} else {
cw_dbg(DBG_MOD, "CISCO bindings detected: no");
}
return 0;
}
/*
static struct cw_Mod capwap_ac = {
.name = "cisco",
.init = init,
.detect = detect,
// .register_actions = register_actions,
.register_messages = register_messages
};
*/
int static setup_cfg(struct cw_Conn * conn)
{
int security;
// conn->write_header=write_header;
// conn->header_len=header_len;
security = cw_setup_dtls(conn,conn->global_cfg,"cisco",CAPWAP_CIPHER);
if (conn->role == CW_ROLE_AC){
cw_cfg_set_int(conn->local_cfg,"capwap/ac-descriptor/security",security);
// if (conn->default_cfg==NULL){
// conn->default_cfg=cw_cfg_create();
// }
}
return 0;
}
struct cw_Mod mod_cisco = {
"cisco", /* name */
init, /* init */
detect, /* detect */
register_messages, /* register_messages */
NULL, /* dll_handle */
NULL, /* data */
setup_cfg /* setup_cfg */
};
/*
struct cw_Mod *mod_cisco()
{
return &cisco_data;
}
*/

View File

@ -10,7 +10,7 @@
#include "wtp.h"
static int config_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int config_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d)
{
cw_dbg(DBG_X,"*** Configurations Status Response received ****");
cw_cfg_copy(params->cfg, params->conn->global_cfg,DBG_CFG_UPDATES,"GlbalCfg");

View File

@ -22,7 +22,7 @@
static int discovery_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int discovery_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d)
{
struct cw_DiscoveryResults *results = (struct cw_DiscoveryResults *)params->conn->data;
// cw_Cfg_t * cfg = cw_cfg_create();

View File

@ -30,7 +30,7 @@ int update =1;
static int update_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
static int update_cb(struct cw_ElemHandlerParams * params, struct cw_MsgCb_data *d)
{
// cw_dbg(DBG_X," **** Configuration Update Request Received ***");
// cw_cfg_dump(params->conn->global_cfg);