2018-02-19 10:48:24 +01:00
|
|
|
#include <confuse.h>
|
2016-02-27 05:33:57 +01:00
|
|
|
|
2016-03-11 22:23:00 +01:00
|
|
|
#include "cw/cw.h"
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/mod.h"
|
|
|
|
#include "cw/log.h"
|
|
|
|
#include "cw/dbg.h"
|
2016-02-27 05:33:57 +01:00
|
|
|
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/action.h"
|
2016-02-27 05:33:57 +01:00
|
|
|
|
|
|
|
#include "mod_cisco.h"
|
2016-02-27 10:47:37 +01:00
|
|
|
#include "../modload.h"
|
2016-02-27 05:33:57 +01:00
|
|
|
|
2016-03-13 09:43:43 +01:00
|
|
|
#include "cw/vendors.h"
|
|
|
|
|
2018-02-19 03:27:37 +01:00
|
|
|
#include "cw/capwap_items.h"
|
|
|
|
|
2016-02-27 05:33:57 +01:00
|
|
|
|
2016-03-11 09:40:01 +01:00
|
|
|
extern int cisco_register_actions80211_ac(struct cw_actiondef *def);
|
2016-02-27 05:33:57 +01:00
|
|
|
extern int cisco_register_actions_ac(struct cw_actiondef *def);
|
|
|
|
|
2018-02-19 03:27:37 +01:00
|
|
|
mbag_t cisco_config = NULL;
|
|
|
|
|
|
|
|
|
2018-02-26 22:26:48 +01:00
|
|
|
static struct cw_MsgSet * register_messages(struct cw_MsgSet *set, int mode)
|
2016-02-27 05:33:57 +01:00
|
|
|
{
|
2016-03-11 09:40:01 +01:00
|
|
|
switch (mode) {
|
2018-02-26 12:21:50 +01:00
|
|
|
case CW_MOD_MODE_CAPWAP:
|
2016-03-11 09:40:01 +01:00
|
|
|
{
|
|
|
|
|
2018-02-26 22:26:48 +01:00
|
|
|
struct cw_Mod *cmod = cw_mod_load("capwap");// NULL; //modload_ac("cipwap");
|
2016-03-11 09:40:01 +01:00
|
|
|
if (!cmod) {
|
|
|
|
cw_log(LOG_ERR,
|
2018-02-26 22:26:48 +01:00
|
|
|
"Can't initialize mod_cisco, failed to load base module mod_cipwap");
|
2016-03-11 09:40:01 +01:00
|
|
|
return 1;
|
|
|
|
}
|
2018-02-26 22:26:48 +01:00
|
|
|
cmod->register_messages(set, CW_MOD_MODE_CAPWAP);
|
|
|
|
cisco_register_msg_set(set,CW_MOD_MODE_CAPWAP);
|
|
|
|
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d messafe", 7);
|
2016-03-11 09:40:01 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case MOD_MODE_BINDINGS:
|
|
|
|
{
|
2018-02-26 15:00:05 +01:00
|
|
|
struct cw_Mod *cmod = NULL; //modload_ac("capwap80211");
|
2016-03-11 09:40:01 +01:00
|
|
|
if (!cmod) {
|
|
|
|
cw_log(LOG_ERR,
|
2016-03-24 21:40:20 +01:00
|
|
|
"Can't initialize mod_cisco, failed to load base mod mod_capwap80211");
|
2016-03-11 09:40:01 +01:00
|
|
|
return 1;
|
|
|
|
}
|
2018-02-26 22:26:48 +01:00
|
|
|
cmod->register_messages(set, MOD_MODE_BINDINGS);
|
|
|
|
int rc = cisco_register_actions80211_ac(set);
|
|
|
|
cw_dbg(DBG_INFO, "Initialized mod_cisco 80211 with %d actions", 12);
|
2016-03-11 09:40:01 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-27 10:47:37 +01:00
|
|
|
}
|
2016-03-11 09:40:01 +01:00
|
|
|
|
|
|
|
|
2016-02-27 05:33:57 +01:00
|
|
|
return 0;
|
2016-03-08 01:45:14 +01:00
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-02-19 10:48:24 +01:00
|
|
|
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);
|
|
|
|
}
|
2016-03-08 01:45:14 +01:00
|
|
|
|
|
|
|
static int init()
|
|
|
|
{
|
2018-02-19 10:48:24 +01:00
|
|
|
int rc = 1;
|
2016-03-08 01:45:14 +01:00
|
|
|
cw_dbg(DBG_INFO, "Initialiazing mod_cisco ...");
|
2018-02-19 03:27:37 +01:00
|
|
|
cisco_config = mbag_create();
|
2018-02-19 10:48:24 +01:00
|
|
|
|
|
|
|
char * hardware_version = strdup(".x01000001");
|
|
|
|
char * software_version = NULL;
|
|
|
|
|
|
|
|
cfg_opt_t opts[] = {
|
|
|
|
CFG_SIMPLE_STR("hardware_version", &hardware_version),
|
|
|
|
CFG_SIMPLE_STR("software_version",&software_version),
|
|
|
|
CFG_END()
|
|
|
|
};
|
|
|
|
|
|
|
|
cfg_t *cfg;
|
|
|
|
cfg = cfg_init(opts, CFGF_NONE);
|
2018-02-19 03:27:37 +01:00
|
|
|
|
2018-02-19 10:48:24 +01:00
|
|
|
cfg_set_error_function(cfg, errfunc);
|
2018-02-19 03:27:37 +01:00
|
|
|
|
2018-02-19 10:48:24 +01:00
|
|
|
char *filename = "cisco.conf";
|
|
|
|
FILE * f = fopen(filename,"r");
|
|
|
|
if (f){
|
|
|
|
fclose(f);
|
|
|
|
if (cfg_parse(cfg, filename)){
|
|
|
|
rc = 0;
|
|
|
|
goto errX;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-19 03:27:37 +01:00
|
|
|
uint8_t * str;
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2018-02-19 10:48:24 +01:00
|
|
|
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;
|
2016-02-27 05:33:57 +01:00
|
|
|
}
|
|
|
|
|
2016-03-08 01:20:22 +01:00
|
|
|
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
|
|
|
|
struct sockaddr *from, int mode)
|
2016-02-27 05:33:57 +01:00
|
|
|
{
|
2016-02-27 10:47:37 +01:00
|
|
|
|
|
|
|
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;
|
2016-03-08 01:20:22 +01:00
|
|
|
|
2016-02-27 10:47:37 +01:00
|
|
|
|
2016-02-29 08:18:14 +01:00
|
|
|
/* To detect a Cisco AP we look for any vendor
|
|
|
|
* specific payload Cisco identifier */
|
2016-02-27 10:47:37 +01:00
|
|
|
cw_foreach_elem(elem, elems_ptr, elems_len) {
|
|
|
|
int id = cw_get_elem_id(elem);
|
2018-02-24 23:58:31 +01:00
|
|
|
if (id == CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD) {
|
2016-02-27 10:47:37 +01:00
|
|
|
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
|
2016-03-08 01:20:22 +01:00
|
|
|
if (vendor_id == CW_VENDOR_ID_CISCO) {
|
2016-03-11 09:40:01 +01:00
|
|
|
// conn->actions = &actions;
|
2018-02-26 12:21:50 +01:00
|
|
|
if (mode == CW_MOD_MODE_CAPWAP) {
|
2016-03-11 09:40:01 +01:00
|
|
|
cw_dbg(DBG_MOD, "CISCO capwap detected: yes");
|
|
|
|
} else {
|
|
|
|
cw_dbg(DBG_MOD, "CISCO bindings detected: yes");
|
|
|
|
}
|
|
|
|
|
2016-02-27 10:47:37 +01:00
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-02-26 12:21:50 +01:00
|
|
|
if (mode == CW_MOD_MODE_CAPWAP) {
|
2016-03-11 09:40:01 +01:00
|
|
|
cw_dbg(DBG_MOD, "CISCO capwap detected: no");
|
|
|
|
} else {
|
|
|
|
cw_dbg(DBG_MOD, "CISCO bindings detected: no");
|
|
|
|
}
|
|
|
|
|
2016-02-27 10:47:37 +01:00
|
|
|
return 0;
|
2016-02-27 05:33:57 +01:00
|
|
|
}
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
static struct cw_Mod capwap_ac = {
|
2016-03-08 01:20:22 +01:00
|
|
|
.name = "cisco",
|
2016-02-27 05:33:57 +01:00
|
|
|
.init = init,
|
2016-03-08 01:20:22 +01:00
|
|
|
.detect = detect,
|
2018-02-26 20:18:53 +01:00
|
|
|
// .register_actions = register_actions,
|
2018-02-26 22:26:48 +01:00
|
|
|
.register_messages = register_messages
|
2016-02-27 05:33:57 +01:00
|
|
|
};
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
struct cw_Mod *mod_cisco_ac()
|
2016-03-08 01:20:22 +01:00
|
|
|
{
|
2016-02-27 05:33:57 +01:00
|
|
|
return &capwap_ac;
|
|
|
|
};
|
2018-02-19 03:27:37 +01:00
|
|
|
|
|
|
|
|
2018-02-26 15:00:05 +01:00
|
|
|
struct cw_Mod *mod_cisco()
|
|
|
|
{
|
|
|
|
return &capwap_ac;
|
|
|
|
};
|