Moved Callbacks to mods
This commit is contained in:
@ -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)
|
||||
*/
|
||||
|
17
src/cw/cfg.c
17
src/cw/cfg.c
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
@ -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(¶ms,elems_ptr, elems_len);
|
||||
}
|
||||
|
||||
cw_MsgCallbackFun cb_fun = cw_conn_get_msg_cb(conn,message->type);
|
||||
if (cb_fun != NULL){
|
||||
result_code = cb_fun(¶ms,elems_ptr, elems_len);
|
||||
}
|
||||
else{
|
||||
result_code = cw_conn_run_msg_cbs(conn,message->type,¶ms);
|
||||
|
||||
// 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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 - "},
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user