Refactoring, work on mod_load

FossilOrigin-Name: ae3ed889283aac53bbbe900b6859605b153f90b91430d231767343bcf05447a8
This commit is contained in:
7u83@mail.ru 2018-02-26 11:21:50 +00:00
parent 775aa8d133
commit 7ecca3ef1f
15 changed files with 79 additions and 71 deletions

View File

@ -306,6 +306,7 @@
<File Name="src/cw/message_set.c"/> <File Name="src/cw/message_set.c"/>
<File Name="src/cw/message_set.h"/> <File Name="src/cw/message_set.h"/>
<File Name="src/mod/cisco/mod_cisco.h"/> <File Name="src/mod/cisco/mod_cisco.h"/>
<File Name="src/cw/cw_filename.c"/>
</VirtualDirectory> </VirtualDirectory>
</VirtualDirectory> </VirtualDirectory>
<Description/> <Description/>

View File

@ -93,15 +93,11 @@ extern struct cw_Mod * cw_get_mod_ac(const char *name);
extern void test_sets(); extern void test_sets();
#include "cw/file.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int rc = 0; int rc = 0;
/* parse arguments */ /* parse arguments */
@ -124,7 +120,8 @@ int main(int argc, char *argv[])
developers is turned on ;) */ developers is turned on ;) */
DBGX("Attention! %s", "DBG X is ON!"); DBGX("Attention! %s", "DBG X is ON!");
cw_mod_add_dynamic("../../lib/actube","capwap"); cw_mod_set_mod_path("../../lib/actube");
cw_mod_load("capwap");
exit(0); exit(0);

View File

@ -573,11 +573,15 @@ static int conf_read_mods(cfg_t *cfg){
conf_mods = malloc(sizeof(struct cw_Mod *)*(n+1)); conf_mods = malloc(sizeof(struct cw_Mod *)*(n+1));
cw_dbg(DBG_INFO,"Mods directory: %s",conf_mods_dir); cw_dbg(DBG_INFO,"Mods directory: %s",conf_mods_dir);
cw_mod_set_mod_path(conf_mods_dir);
for (i=0; i < n; i++){ for (i=0; i < n; i++){
char *modname = cfg_getnstr(cfg, CFG_ENTRY_MODS, i); char *modname = cfg_getnstr(cfg, CFG_ENTRY_MODS, i);
struct cw_Mod * mod = cw_mod_add_dynamic(conf_mods_dir,modname); printf("Modname: %s\n",modname);
struct cw_Mod * mod = cw_mod_load(modname);
if (!mod) if (!mod)
return 0; return 0;

View File

@ -191,7 +191,7 @@ static struct cw_actiondef *load_mods(struct conn *conn, uint8_t * rawmsg, int l
{ {
struct cw_Mod *cmod = struct cw_Mod *cmod =
detect_mod(conn, rawmsg, len, elems_len, from, MOD_MODE_CAPWAP); detect_mod(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_CAPWAP);
if (cmod == MOD_NULL) { if (cmod == MOD_NULL) {
cw_dbg(DBG_MSG_ERR, cw_dbg(DBG_MSG_ERR,
"Can't find mod to handle connection from %s, discarding message", "Can't find mod to handle connection from %s, discarding message",

View File

@ -125,7 +125,7 @@ struct cw_actiondef *mod_cache_add(struct conn *conn, struct cw_Mod *c, struct c
memset(i, 0, sizeof(struct cache_item)); memset(i, 0, sizeof(struct cache_item));
if (c) { if (c) {
i->capwap = c->name; i->capwap = c->name;
c->register_actions(&(i->actions), MOD_MODE_CAPWAP); c->register_actions(&(i->actions), CW_MOD_MODE_CAPWAP);
} }
if (b) { if (b) {
i->bindings = b->name; i->bindings = b->name;
@ -149,40 +149,38 @@ static int mod_cmp(const void *e1, const void *e2){
return strcmp(m1->name,m2->name); return strcmp(m1->name,m2->name);
} }
static const char * mod_path="./";
/** void cw_mod_set_mod_path(const char * path){
* @brief Load a module mod_path = path;
* @param name Name of the module
* @return pointer to the module structure or NULL if the
* module cannot be loaded.
*/
struct cw_Mod * cw_mod_get(const char *name)
{
/*int i;
for (i=0; modlist[i];i++){
struct cw_Mod * m = modlist[i]();
if (strcmp(m->name,name)==0)
return m;
}
return NULL;
*/
} }
int cw_mod_add(struct cw_Mod * (*modfn)() ){ static int cw_mod_add(struct cw_Mod * mod ){
if (modlist == NULL){ if (modlist == NULL){
modlist = mavl_create(mod_cmp,NULL); modlist = mavl_create(mod_cmp,NULL);
if (modlist==NULL){ if (modlist==NULL){
return 0; return 0;
} }
} }
mavl_add(modlist,modfn); //mavl_add(modlist,modfn);
return 1; return 1;
} }
/**
struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * mod_name){ * @brief Load a module
* @param path
* @param mod_name
* @return
*/
struct cw_Mod * cw_mod_load(const char * mod_name){
/* if modlist is not initialized, initialize ... */
if (modlist==NULL){
modlist=mavl_create(mod_cmp,NULL);
if (modlist==NULL){
cw_log(LOG_ERROR, "Can't init modlist, no memory");
return NULL;
}
}
/* Search for the module in modlist, to see if it is /* Search for the module in modlist, to see if it is
* already loaded or was statically linked */ * already loaded or was statically linked */
@ -195,17 +193,20 @@ struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * mod_name){
return mod; return mod;
} }
if (strlen(mod_name)>CW_MOD_MAX_MOD_NAME_LEN){
cw_log(LOG_ERROR,"Mod name too long: %s (max allowed = %d",
mod_name,CW_MOD_MAX_MOD_NAME_LEN);
return NULL;
}
char mod_filename[CW_MOD_MAX_MOD_NAME_LEN+5];
sprintf(mod_filename,"mod_%s",mod_name);
int n = strlen(path)+strlen(mod_name)+8; /* we have to load the module dynamically */
char * filename;
char * filename = malloc(n); filename = cw_filename(mod_path,mod_filename,".so");
if (filename==NULL)
if (!filename) return NULL;
return 0;
strcpy(filename,path);
strcat(filename,"/");
strcat(filename,mod_name);
strcat(filename,".so");
/* Open the DLL */ /* Open the DLL */
void * handle; void * handle;
@ -217,7 +218,9 @@ struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * mod_name){
} }
struct cw_Mod * (*mod_get_interface)(); struct cw_Mod * (*mod_get_interface)();
mod_get_interface = dlsym(handle,"mod_get_interface"); mod_get_interface = dlsym(handle,"mod_get_interface");
if (!mod_get_interface){ if (!mod_get_interface){
cw_log(LOG_ERROR,"Failed to load module: %s",dlerror()); cw_log(LOG_ERROR,"Failed to load module: %s",dlerror());
goto errX; goto errX;

View File

@ -35,7 +35,7 @@ struct cw_actiondef;
enum { enum {
MOD_MODE_CAPWAP, CW_MOD_MODE_CAPWAP,
MOD_MODE_BINDINGS MOD_MODE_BINDINGS
}; };
@ -91,6 +91,9 @@ extern int mod_caching;
#define mod_set_caching(var) (mod_caching=var) #define mod_set_caching(var) (mod_caching=var)
#define mod_get_caching() (mod_caching) #define mod_get_caching() (mod_caching)
struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * file); struct cw_Mod * cw_mod_load(const char * mod_name);
#define CW_MOD_MAX_MOD_NAME_LEN 128
#define CW_MOD_INTERFACE_FUNCTION_NAME_SUFFIX "_get_interface"
#endif #endif

View File

@ -27,7 +27,7 @@ static int init()
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len, static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode) struct sockaddr *from, int mode)
{ {
if (mode != MOD_MODE_CAPWAP) if (mode != CW_MOD_MODE_CAPWAP)
return 0; return 0;
cw_dbg(DBG_MOD,"CAPWAP detected: yes"); cw_dbg(DBG_MOD,"CAPWAP detected: yes");
return 1; return 1;
@ -35,7 +35,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
static int register_actions(struct cw_actiondef *def, int mode) static int register_actions(struct cw_actiondef *def, int mode)
{ {
if (mode != MOD_MODE_CAPWAP) if (mode != CW_MOD_MODE_CAPWAP)
return 0; return 0;
return capwap_register_actions_ac(def); return capwap_register_actions_ac(def);
} }

View File

@ -27,7 +27,7 @@ static int init()
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len, static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode) struct sockaddr *from, int mode)
{ {
if (mode != MOD_MODE_CAPWAP) if (mode != CW_MOD_MODE_CAPWAP)
return 0; return 0;
conn->detected = 1; conn->detected = 1;
conn->actions = &actions; conn->actions = &actions;
@ -36,7 +36,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
static int register_actions(struct cw_actiondef *def, int mode) static int register_actions(struct cw_actiondef *def, int mode)
{ {
if (mode != MOD_MODE_CAPWAP) if (mode != CW_MOD_MODE_CAPWAP)
return 0; return 0;
return capwap_register_actions_wtp(def); return capwap_register_actions_wtp(def);
} }

View File

@ -18,7 +18,7 @@ int cipwap_init()
static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode) static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode)
{ {
if (mode == MOD_MODE_CAPWAP) if (mode == CW_MOD_MODE_CAPWAP)
return 1; return 1;
return 0; return 0;
@ -27,7 +27,7 @@ static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_
static int register_actions(struct cw_actiondef *actions, int mode) static int register_actions(struct cw_actiondef *actions, int mode)
{ {
switch (mode) { switch (mode) {
case MOD_MODE_CAPWAP: case CW_MOD_MODE_CAPWAP:
{ {
struct cw_Mod *cmod = modload_ac("capwap"); struct cw_Mod *cmod = modload_ac("capwap");
@ -36,7 +36,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_cisco, failed to load base mod mod_capwap"); "Can't initialize mod_cisco, failed to load base mod mod_capwap");
return 1; return 1;
} }
cmod->register_actions(actions, MOD_MODE_CAPWAP); cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cipwap_register_actions_ac(actions); int rc = cipwap_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc); cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc);
return rc; return rc;

View File

@ -18,7 +18,7 @@ int cipwap_init()
static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode) static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode)
{ {
if (mode == MOD_MODE_CAPWAP) if (mode == CW_MOD_MODE_CAPWAP)
return 1; return 1;
return 0; return 0;
@ -27,7 +27,7 @@ static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_
static int register_actions(struct cw_actiondef *actions, int mode) static int register_actions(struct cw_actiondef *actions, int mode)
{ {
switch (mode) { switch (mode) {
case MOD_MODE_CAPWAP: case CW_MOD_MODE_CAPWAP:
{ {
struct cw_Mod *cmod = modload_wtp("capwap"); struct cw_Mod *cmod = modload_wtp("capwap");
@ -36,7 +36,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_cisco, failed to load base mod mod_capwap"); "Can't initialize mod_cisco, failed to load base mod mod_capwap");
return 1; return 1;
} }
cmod->register_actions(actions, MOD_MODE_CAPWAP); cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cipwap_register_actions_ac(actions); int rc = cipwap_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc); cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc);
return rc; return rc;

View File

@ -24,7 +24,7 @@ mbag_t cisco_config = NULL;
static int register_actions(struct cw_actiondef *actions, int mode) static int register_actions(struct cw_actiondef *actions, int mode)
{ {
switch (mode) { switch (mode) {
case MOD_MODE_CAPWAP: case CW_MOD_MODE_CAPWAP:
{ {
struct cw_Mod *cmod = modload_ac("cipwap"); struct cw_Mod *cmod = modload_ac("cipwap");
@ -33,7 +33,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_cisco, failed to load base mod mod_cipwap"); "Can't initialize mod_cisco, failed to load base mod mod_cipwap");
return 1; return 1;
} }
cmod->register_actions(actions, MOD_MODE_CAPWAP); cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cisco_register_actions_ac(actions); int rc = cisco_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc); cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc);
return 0; return 0;
@ -144,7 +144,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem)); uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_CISCO) { if (vendor_id == CW_VENDOR_ID_CISCO) {
// conn->actions = &actions; // conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: yes"); cw_dbg(DBG_MOD, "CISCO capwap detected: yes");
} else { } else {
cw_dbg(DBG_MOD, "CISCO bindings detected: yes"); cw_dbg(DBG_MOD, "CISCO bindings detected: yes");
@ -158,7 +158,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
} }
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: no"); cw_dbg(DBG_MOD, "CISCO capwap detected: no");
} else { } else {
cw_dbg(DBG_MOD, "CISCO bindings detected: no"); cw_dbg(DBG_MOD, "CISCO bindings detected: no");

View File

@ -21,7 +21,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
{ {
switch (mode) { switch (mode) {
case MOD_MODE_CAPWAP: case CW_MOD_MODE_CAPWAP:
{ {
struct cw_Mod *cmod = modload_wtp("cipwap"); struct cw_Mod *cmod = modload_wtp("cipwap");
@ -31,7 +31,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
return 1; return 1;
} }
cmod->register_actions(actions, MOD_MODE_CAPWAP); cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cisco_register_actions_wtp(actions); int rc = cisco_register_actions_wtp(actions);
@ -132,7 +132,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem)); uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_CISCO) { if (vendor_id == CW_VENDOR_ID_CISCO) {
// conn->actions = &actions; // conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: yes"); cw_dbg(DBG_MOD, "CISCO capwap detected: yes");
} else { } else {
cw_dbg(DBG_MOD, "CISCO bindings detected: yes"); cw_dbg(DBG_MOD, "CISCO bindings detected: yes");
@ -146,7 +146,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
} }
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: no"); cw_dbg(DBG_MOD, "CISCO capwap detected: no");
} else { } else {
cw_dbg(DBG_MOD, "CISCO bindings detected: no"); cw_dbg(DBG_MOD, "CISCO bindings detected: no");

View File

@ -18,7 +18,7 @@ extern int fortinet_register_actions_ac(struct cw_actiondef *def);
static int register_actions(struct cw_actiondef *actions, int mode) static int register_actions(struct cw_actiondef *actions, int mode)
{ {
switch (mode) { switch (mode) {
case MOD_MODE_CAPWAP: case CW_MOD_MODE_CAPWAP:
{ {
struct cw_Mod *cmod = modload_ac("capwap"); struct cw_Mod *cmod = modload_ac("capwap");
@ -27,7 +27,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_fortinet, failed to load base mod mod_capwap"); "Can't initialize mod_fortinet, failed to load base mod mod_capwap");
return 1; return 1;
} }
cmod->register_actions(actions, MOD_MODE_CAPWAP); cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = fortinet_register_actions_ac(actions); int rc = fortinet_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod fortinet with %d actions", rc); cw_dbg(DBG_INFO, "Initialized mod fortinet with %d actions", rc);
return 0; return 0;
@ -85,7 +85,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem)); uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_FORTINET) { if (vendor_id == CW_VENDOR_ID_FORTINET) {
// conn->actions = &actions; // conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: yes"); cw_dbg(DBG_MOD, "Fortinet capwap detected: yes");
} else { } else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: yes"); cw_dbg(DBG_MOD, "Fortinet bindings detected: yes");
@ -99,7 +99,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
} }
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: no"); cw_dbg(DBG_MOD, "Fortinet capwap detected: no");
} else { } else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: no"); cw_dbg(DBG_MOD, "Fortinet bindings detected: no");

View File

@ -18,7 +18,7 @@ extern int cisco_register_actions_wtp(struct cw_actiondef *def);
static int register_actions(struct cw_actiondef *actions, int mode) static int register_actions(struct cw_actiondef *actions, int mode)
{ {
switch (mode) { switch (mode) {
case MOD_MODE_CAPWAP: case CW_MOD_MODE_CAPWAP:
{ {
struct cw_Mod *cmod = modload_wtp("capwap"); struct cw_Mod *cmod = modload_wtp("capwap");
@ -28,7 +28,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
return 1; return 1;
} }
cmod->register_actions(actions, MOD_MODE_CAPWAP); cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cisco_register_actions_wtp(actions); int rc = cisco_register_actions_wtp(actions);
@ -130,7 +130,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem)); uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_FORTINET) { if (vendor_id == CW_VENDOR_ID_FORTINET) {
// conn->actions = &actions; // conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: yes"); cw_dbg(DBG_MOD, "Fortinet capwap detected: yes");
} else { } else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: yes"); cw_dbg(DBG_MOD, "Fortinet bindings detected: yes");
@ -144,7 +144,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
} }
if (mode == MOD_MODE_CAPWAP) { if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: no"); cw_dbg(DBG_MOD, "Fortinet capwap detected: no");
} else { } else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: no"); cw_dbg(DBG_MOD, "Fortinet bindings detected: no");

View File

@ -130,7 +130,7 @@ int main()
} }
mod->init(); mod->init();
mod->register_actions(&capwap_actions,MOD_MODE_CAPWAP); mod->register_actions(&capwap_actions,CW_MOD_MODE_CAPWAP);
mod = modload_wtp(CWBIND); mod = modload_wtp(CWBIND);
if (!mod) { if (!mod) {
printf("Can't load mod capwap80211\n"); printf("Can't load mod capwap80211\n");