Work in progress

FossilOrigin-Name: 155605fd55cbb193d4f5ac8c704930c050a11cda541f1a5cdb93c57a8c51534f
bsdmakefiles
7u83@mail.ru 6 years ago
parent c4307d9e70
commit b668a8f4a9
  1. 4
      actube.workspace
  2. 13
      libcw.project
  3. 2
      mod_capwap.project
  4. 16
      src/ac/ac.h
  5. 2
      src/ac/ac_global.c
  6. 374
      src/ac/ac_main.c
  7. 3
      src/ac/conf.c
  8. 8
      src/ac/wtpman.c
  9. 2
      src/ac/wtpman.h
  10. 9
      src/cw/bstr16_create_from_str.c
  11. 116
      src/cw/capwap.h
  12. 4
      src/cw/capwap_strings_elem.c
  13. 1
      src/cw/conn.h
  14. 2
      src/cw/conn_init.c
  15. 51
      src/cw/conn_process_packet.c
  16. 1
      src/cw/cw_in_check_img_data_req_ac.c
  17. 1
      src/cw/cw_ktv_add_from_str.c
  18. 30
      src/cw/cw_ktv_dump.c
  19. 11
      src/cw/cw_ktv_get_byte.c
  20. 11
      src/cw/cw_ktv_get_word.c
  21. 4
      src/cw/cw_ktv_read_file.c
  22. 9
      src/cw/cw_ktv_std_types.c
  23. 111
      src/cw/cw_out_wtp_board_data.c
  24. 9
      src/cw/cw_out_wtp_descriptor.c
  25. 8
      src/cw/cw_put_ac_status.c
  26. 36
      src/cw/cw_put_msg.c
  27. 4
      src/cw/cw_read_descriptor_subelems.c
  28. 56
      src/cw/cw_read_wtp_descriptor.c
  29. 11
      src/cw/cw_write_descriptor_subelem.c
  30. 2
      src/cw/cwmsg_addelem_mtu_discovery_padding.c
  31. 17
      src/cw/keys.h
  32. 13
      src/cw/ktv.h
  33. 59
      src/cw/lw_put_sockaddr.c
  34. 2
      src/cw/lwmsg_init.c
  35. 2
      src/cw/mavl_del_all.c
  36. 8
      src/cw/mdata.c
  37. 57
      src/cw/mdata.h
  38. 15
      src/cw/mdata_elem_new.c
  39. 51
      src/cw/mlist.c
  40. 1
      src/cw/mlist_create.c
  41. 4
      src/cw/mod.c
  42. 24
      src/cw/mod.h
  43. 2
      src/cw/vendors.h
  44. 2
      src/mod/Makefile
  45. 1
      src/mod/capwap/Makefile
  46. 53
      src/mod/capwap/capwap_actions_ac.c
  47. 6
      src/mod/capwap/capwap_actions_wtp.c
  48. 9
      src/mod/capwap/capwap_in_wtp_board_data.c
  49. 5
      src/mod/capwap/capwap_in_wtp_descriptor.c
  50. 80
      src/mod/capwap/capwap_out_ac_descriptor.c
  51. 74
      src/mod/capwap/capwap_out_wtp_board_data.c
  52. 108
      src/mod/capwap/capwap_out_wtp_descriptor.c
  53. 23
      src/mod/capwap/mod_capwap.h
  54. 59
      src/mod/capwap/mod_capwap_ac.c
  55. 2
      src/mod/cisco/Makefile
  56. 18
      src/mod/cisco/cisco_actions_ac.c
  57. 12
      src/mod/cisco/cisco_actions_wtp.c
  58. 74
      src/mod/cisco/cisco_out_wtp_descriptor.c
  59. 9
      src/mod/cisco/mod_cisco.h
  60. 2
      src/mod/cisco/mod_cisco_ac.c
  61. 2
      src/mod/fortinet/fortinet_actions_ac.c
  62. 6
      src/mod/modload.h
  63. 35
      src/wtp/wtp_main.c

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<CodeLite_Workspace Name="actube" Database="">
<Project Name="ac" Path="ac.project" Active="No"/>
<Project Name="wtp" Path="wtp.project" Active="No"/>
<Project Name="wtp" Path="wtp.project" Active="Yes"/>
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
<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="Yes"/>
<Project Name="libcw" Path="libcw.project" Active="No"/>
<Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/>
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
<BuildMatrix>

@ -89,7 +89,6 @@
<File Name="src/cw/lw_readelem_wtp_name.c"/>
<File Name="src/cw/capwap_cisco.h"/>
<File Name="src/cw/cw_in_wtp_reboot_statistics.c"/>
<File Name="src/cw/mlist.c"/>
<File Name="src/cw/netconn.c"/>
<File Name="src/cw/cw_in_capwap_local_ipv6_address.c"/>
<File Name="src/cw/cw_out_capwap_local_ip_address.c"/>
@ -168,7 +167,6 @@
<File Name="src/cw/mavl_add.c"/>
<File Name="src/cw/dtls_gnutls_get_cipher.c"/>
<File Name="src/cw/cw_in_check_cipwap_join_req.c"/>
<File Name="src/cw/wtpinfo_readelem_wtp_board_data.c"/>
<File Name="src/cw/vendors.h"/>
<File Name="src/cw/cw_read_wtp_descriptor_7.c"/>
<File Name="src/cw/dbg.h"/>
@ -220,7 +218,6 @@
<File Name="src/cw/lwmsg.h"/>
<File Name="src/cw/cw_check_missing_mand.c"/>
<File Name="src/cw/format_dot11_fc.c"/>
<File Name="src/cw/wtpinfo_lwreadelem_wtp_descriptor.c"/>
<File Name="src/cw/dbg_strings.c"/>
<File Name="src/cw/dtls_gnutls.c"/>
<File Name="src/cw/conn_prepare_configuration_update_request.c"/>
@ -266,7 +263,6 @@
<File Name="src/cw/mavl_foreach.c"/>
<File Name="src/cw/lwapp_cisco.h"/>
<File Name="src/cw/hdr_print.c"/>
<File Name="src/cw/cw_out_wtp_board_data.c"/>
<File Name="src/cw/mbag_type_str.c"/>
<File Name="src/cw/cw_init_data_keep_alive_msg.c"/>
<File Name="src/cw/cw_in_check_chng_state_evnt_req.c"/>
@ -281,11 +277,7 @@
<File Name="src/cw/capwap_strings_state.c"/>
<File Name="src/cw/cw_out_radio_info.c"/>
<File Name="src/cw/capwap_items.c"/>
<File Name="src/mod/cisco/mod_cisco.h"/>
<File Name="src/cw/cw_filename.c"/>
<File Name="src/cw/mdata.h"/>
<File Name="src/cw/mdata.c"/>
<File Name="src/cw/mdata_elem_new.c"/>
<File Name="src/cw/cw_type_byte.c"/>
<File Name="src/cw/cw_type_word.c"/>
<File Name="src/cw/cw_type_dword.c"/>
@ -330,7 +322,12 @@
<File Name="src/cw/cw_ktv_put.c"/>
<File Name="src/cw/cw_ktv_get.c"/>
<File Name="src/cw/cw_write_descriptor_subelem.c"/>
<File Name="src/cw/cw_ktv_dump.c"/>
<File Name="src/cw/cw_ktv_get_word.c"/>
<File Name="src/cw/cw_ktv_get_byte.c"/>
<File Name="src/cw/cw_ktv_std_types.c"/>
</VirtualDirectory>
<File Name="src/mod/capwap/capwap_out_wtp_descriptor.c"/>
</VirtualDirectory>
<Description/>
<Dependencies/>

@ -4,7 +4,6 @@
<VirtualDirectory Name="mod">
<VirtualDirectory Name="capwap">
<File Name="src/mod/capwap/capwap_out_ac_ip_list.c"/>
<File Name="src/mod/capwap/capwap_out_wtp_descriptor.c"/>
<File Name="src/mod/capwap/capwap_actions.h"/>
<File Name="src/mod/capwap/mod_capwap_ac.c"/>
<File Name="src/mod/capwap/capwap_in_wtp_board_data.c"/>
@ -20,6 +19,7 @@
<File Name="src/mod/capwap/capwap_actions_ac.c"/>
<File Name="src/mod/capwap/capwap_in_vendor_specific_payload.c"/>
<File Name="src/mod/capwap/capwap_in_mtu_discovery_padding.c"/>
<File Name="src/mod/capwap/capwap_out_wtp_board_data.c"/>
</VirtualDirectory>
</VirtualDirectory>
</VirtualDirectory>

@ -1,10 +1,15 @@
#include "cw/capwap.h"
#include "cw/mbag.h"
#ifndef __ACTUBE_AC_H
#define __ACTUBE_AC_H
#include "cw/mavl.h"
extern mavl_t actube_global_cfg;
extern struct ac_status ac_global_status;
extern int ac_global_init();
extern mbag_t ac_config;
extern struct cw_actiondef capwap_actions;
int actube_global_init();
/* the protocol we understand */
@ -17,3 +22,4 @@ enum {
#endif

@ -17,8 +17,8 @@ struct cw_ac_status ac_status;
struct cw_actiondef capwap_actions;
mbag_t ac_config;
mavl_t actube_global_cfg;
cw_aciplist_t get_aciplist()
{

@ -21,7 +21,7 @@
#include <unistd.h>
#include <errno.h>
#include <stdint.h>
//#include <netinet/in.h>
#include "actube.h"
#include "wtplist.h"
@ -63,32 +63,69 @@ static void *alive_thread (void *data)
#include <getopt.h>
static int parse_args (int argc, char *argv[])
struct bootcfg {
const char * cfgfilename;
};
static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
{
// int getopt_ret;
int option_index;
static struct option long_options[] = {
{"version", optional_argument, NULL, 'v'},
{0, 0, 0, 0}
};
int o;
while ( (o = getopt_long (argc, argv, "v", long_options, &option_index)) != -1) {
switch (o) {
case 0:
int c;
opterr = 1;
bootcfg->cfgfilename = "config.ktv";
while ( (c = getopt (argc, argv, "vc:d:p:")) != -1) {
switch (c) {
case 'c':
bootcfg->cfgfilename = optarg;
break;
case 'v':
printf ("AC-Tube 0.01, %s\n", SYS_ARCH);
exit (0);
printf("AC-Tube version 0.0.1, %s\n", SYS_ARCH);
exit(EXIT_SUCCESS);
break;
case 'd':{
int b = cw_strlist_get_id(cw_dbg_strings, optarg);
if (b==-1){
fprintf(stderr,"Invalid debug option: %s\n",optarg);
exit(EXIT_FAILURE);
}
cw_dbg_set_level(b, 1);
break;
}
case 'p':
cw_mod_set_path(optarg);
break;
case '?':
exit(EXIT_FAILURE);
default:
case 'h':
printf("%s: -vcmh\n",argv[0]);
exit(EXIT_SUCCESS);
break;
}
}
return 0;
}
#include "cw/mod.h"
extern struct cw_Mod * cw_get_mod_ac (const char *name);
@ -151,274 +188,55 @@ int stcmp (const void * sa1, const void *sa2)
return rc;
}
int main (int argc, char *argv[])
{
mlist_t list;
mlistelem_t * elem;
list = mlist_create_conststr();
mlist_append_ptr(list, "helo");
mlist_append_ptr(list, "tobias");
mlist_append_ptr(list, "nase");
mlist_foreach(elem,list){
// data = mlistelem_dataptr(elem);
// char * str = ((char**)data)[0];
// printf("%p %p\n",data,str);
printf("String: %s\n", mlistelem_get_str(elem));
}
mlist_destroy(list);
int rc = 0;
struct bootcfg bootcfg;
FILE * file;
mavl_t types_tree, global_cfg;
const cw_Type_t **ti;
mlist_foreach(elem,list){
// data = mlistelem_dataptr(elem);
// char * str = ((char**)data)[0];
// printf("%p %p\n",data,str);
printf("String: %s\n", mlistelem_get_str(elem));
/* parse arguments */
parse_args (argc, argv, &bootcfg);
/* open config file */
file = fopen(bootcfg.cfgfilename,"r");
if (file == NULL){
cw_log(LOG_ERR,"Cant open config file '%s': %s",
bootcfg.cfgfilename, strerror(errno));
exit(EXIT_FAILURE);
}
/* create types tree with default types */
types_tree = cw_ktv_create_types_tree();
for (ti=CW_KTV_STD_TYPES;*ti;ti++){
mavl_add_ptr(types_tree,*ti);
}
//exit(0);
/* mavl_t tree;
int i;
mavliter_t it;
mlist_t list;
struct mlistelem * elem;
int x;
list = mlist_create(NULL,sizeof(int));
x=8;
mlist_append(list,&x);
x=13;
mlist_append(list,&x);
x=11;
mlist_append(list,&x);
for(i=0; i<100000000; i++){
int val;
val = i;
mlistelem_t * result;
result = mlist_append(list,&val);
if (result == NULL){
printf("error\n");
}
global_cfg = cw_ktv_create();
if (global_cfg == NULL){
cw_log(LOG_ERR,"Can't create local_cfg: %s",strerror(errno));
exit(EXIT_FAILURE);
}
printf("Count %d\n",list->count);
mlist_foreach(elem,list){
int * data = mlistelem_dataptr(elem);
printf("Here is %d\n",*data);
}
exit(0);
*/
/*tree = mavl_create_ptr( (int(*)(const void*,const void*))strcmp,free);
*/
/*
tree = mavl_create_ptr(mycmp,NULL);
struct mykv * mdata;
mdata = malloc(sizeof(struct mykv));
mdata->key=14;
mdata->value=15;
mavl_add_ptr(tree, mdata);
mdata = malloc(sizeof(struct mykv));
mdata->key=16;
mdata->value=17;
mavl_add_ptr(tree, mdata);
mdata = malloc(sizeof(struct mykv));
mdata->key=12;
mdata->value=13;
mavl_add_ptr(tree, mdata);
mavliter_init(&it,tree);
mavliter_foreach(&it){
mdata = mavliter_get_ptr(&it);
printf("MAVLIT: %d %d\n",mdata->key,mdata->value);
struct mykv search;
search.key=mdata->key;
mdata = mavl_get_ptr(tree,&search);
printf("Search T: %d %d\n",mdata->key,mdata->value);
}
exit(0);
*/
/*
if (tree==NULL)
return 0;
tree = mavl_create_str();
mavl_add_str(tree,cw_strdup("7u83"));
mavl_add_str(tree,cw_strdup("Herre"));
mavl_add_str(tree,cw_strdup("Tube"));
mavl_add_str(tree,cw_strdup("Tobias"));
printf("Count: %d\n", mavl_get_count(tree));
mavliter_init(&it,tree);
mavliter_foreach(&it){
printf("iterWert %s\n",mavliter_get_str(&it));
}
*/
/*
tree = mavl_create (mycmp, NULL, sizeof (struct mykv));
struct mykv nwert;
int result;
struct mykv * mr;
nwert.key = 7;
nwert.value = 777;
mr = mavl_add_exists (tree, &nwert, &result);
printf ("7Result %d: %d %d\n", result, mr->key, mr->value);
for (i = 0; i < 10; i++) {
//cw_rand(&nwert.key,sizeof(nwert.key));
// printf("Addwert: %u\n",nwert.key);
// printf("add %u\n", i);
nwert.key = 9 - i;
nwert.value = 100 + i;
result=0;
mr = mavl_add_exists (tree, &nwert, &result);
printf ("Result %d: %d %d\n", result, mr->key, mr->value);
}
mavliter_init (&it, tree);
mavliter_foreach (&it) {
struct mykv *kv;
kv = mavliter_get (&it);
printf ("iterWert %u\n", kv->key);
}
exit (0);
*/
/* mavl_t kv;
mavliter_t kviter;
uint8_t bytes[] = { 99,4,5,7 };
kv = cw_types_mavl_create();
//mavl_cmp_kv,cw_type_delete);
mavldata_t data, *result;
data.kv.key="wtp_board_data";
result = cw_type_byte.get(&data,bytes,1);
mavl_add(kv,result);
data.kv.key="wtp_next_data";
result = cw_type_byte.get(&data,bytes+1,1);
mavl_add(kv,result);
mavliter_init(&kviter,kv);
mavliter_foreach(&kviter){
char value[500];
mavldata_t * data;
data = mavliter_get(&kviter);
struct cw_Type * type = data->kv.priv;
type->to_str(data,value,0);
printf("Got %s (%s): %s\n",data->kv.key,type->name, value);
}
mavl_destroy(kv);
exit(0);
*/
/* cw_log_init();
cw_log(LOG_ERROR,"Hello Debug World222");
exit(0);
*/
/*
char * dump_data = "Eine kleine Mickey Maus zog sich mal die Hosen\
aus, zog sie wieder an, und du bist dran. Dran bist du noch lange nicht\
musst erst sagen, wie alt du bist.";
char * result = cw_format_dump(dump_data,strlen(dump_data),NULL);
printf("Dump Result:\n%s\n", result);
exit(0);
*/
/* char data[100];
mavl_t im;
mavldata_t * val, * val2,itt, itt2, * result, search ;
mavliter_t myit;
im = mavl_create(mavl_cmp_dword,NULL);
itt.dword = 7;
itt2.dword = 7;
val = mavl_add(im,&itt);
val2 = mavl_add(im,&itt2);
search.dword = 7;
result = mavl_get(im,&search);
printf("Result: (%p, %p) (%p, %p) (%p, %p)\n",val, &itt, val2, &itt2, result, &search);
exit(0);
for (itt.dword=100; itt.dword>0; itt.dword--){
printf("Copunting: %d\n",itt.dword);
mavl_add(im,&itt);
}
mavliter_init(&myit,im);
mavliter_foreach(&myit){
union mavldata * result;
result = mavliter_get(&myit);
printf("Got Value %d\n",result->dword);
}
mavl_destroy(im);
*/
int rc = 0;
/* parse arguments */
parse_args (argc, argv);
cw_ktv_read_file(file,global_cfg,types_tree);
fclose(file);
cw_ktv_dump(global_cfg,DBG_INFO,NULL,"CFG:",NULL);
actube_global_cfg = global_cfg;
cw_log_name = "AC-Tube";
if (!read_config ("ac.conf"))

@ -577,7 +577,8 @@ static int conf_read_mods(cfg_t *cfg){
for (i=0; i < n; i++){
char *modname = cfg_getnstr(cfg, CFG_ENTRY_MODS, i);
struct cw_Mod * mod = cw_mod_load(modname);
struct cw_Mod * mod = cw_mod_load(modname, actube_global_cfg, CW_ROLE_AC);
if (!mod)
return 0;
cw_mod_add_to_list(mod);

@ -751,11 +751,17 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr)
wtpman->conn->strict_hdr = conf_strict_headers;
wtpman->conn->radios = mbag_i_create();
wtpman->conn->radios_upd = mbag_i_create();
wtpman->conn->local = ac_config;
// wtpman->conn->local = ac_config;
//wtpman->conn->capwap_mode=0; //CW_MODE_STD; //CISCO;
wtpman->conn->capwap_mode = CW_MODE_CISCO;
//wtpman->conn->strict_capwap_hdr=0;
wtpman->conn->local_cfg = cw_ktv_create();
wtpman->conn->global_cfg = actube_global_cfg;
return wtpman;
}

@ -29,7 +29,7 @@ struct wtpman{
uint8_t * session_id;
uint8_t wtp_mactype;
//struct wtpinfo wtpinfo;
/* //struct wtpinfo wtpinfo;*/
int socklistindex;

@ -4,7 +4,10 @@
uint8_t * bstr16_create_from_str(const char *s)
{
int l = strlen(s);
uint8_t * mem;
int msize;
int l;
l = strlen(s);
if (s[0]!='.')
return bstr16_create((uint8_t*)s,l);
@ -19,10 +22,10 @@ uint8_t * bstr16_create_from_str(const char *s)
/* the string starts with ".x" - read hexbytes */
l-=2;
int msize=l/2;
msize=l/2;
if(l&1)
msize++;
uint8_t * mem = malloc(2+msize);
mem = malloc(2+msize);
*((uint16_t*)mem)=msize;
cw_format_scan_hex_bytes(mem+2,s+2,l);
return mem;

@ -188,12 +188,12 @@
*/
#define CAPWAP_ELEM_AC_DESCRIPTOR 1 /**< AC Descriptor */
#define CAPWAP_ELEM_AC_DESCRIPTOR 1 /**< AC Descriptor */
#define CAPWAP_ELEM_AC_IPV4_LIST 2 /**< AC IP V4 List */
#define CW_ELEM_AC_IPV6_LIST 3 /**< AC IP V6 List */
#define CW_ELEM_AC_NAME 4 /**< AC Name */
#define CW_ELEM_AC_NAME_WITH_PRIORITY 5
#define CAPWAP_ELEM_AC_IPV4_LIST 2 /**< AC IP V4 List */
#define CAPWAP_ELEM_AC_IPV6_LIST 3 /**< AC IP V6 List */
#define CAPWAP_ELEM_AC_NAME 4 /**< AC Name */
#define CW_ELEM_AC_NAME_WITH_PRIORITY 5
/**
* In CAPWAP RFC draft 7 the message element 5 was named
@ -380,9 +380,9 @@
* @{
*/
/** X.509 Support */
#define CW_FLAG_AC_SECURITY_X 2
#define CAPWAP_FLAG_AC_SECURITY_X 2
/* PSK Support */
#define CW_FLAG_AC_SECURITY_S 4
#define CAPWAP_FLAG_AC_SECURITY_S 4
/**
* @}
*/
@ -432,15 +432,18 @@ struct cwimage_identifier{
/*
//extern void cwmsg_addelem_wtp_radio_infos(struct cwmsg * cwmsg,struct wtpinfo * wtpinfo);
*/
/*
extern void cwmsg_addelem_wtp_radio_infos(struct cwmsg *msg,
struct radioinfo *radioinfos);
struct radioinfo *radioinfos);*/
/*
//extern void cwmsg_addelem_result_code(struct cwmsg *msg, int rc);
*/
/*
extern void cwmsg_addelem_vendor_specific_payload(struct cwmsg *msg, int vendor_id,
int type, uint8_t * payload, int len);
*/
/*
extern int hdr_print(char *str, uint8_t * packet, int len);
@ -464,7 +467,7 @@ extern int cw_readelem_ecn_support(uint8_t * ecn_support, int type, uint8_t * ms
// uint8_t * msgelem, int len);
*/
/*
extern int cw_readelem_statistics_timer(uint16_t * timer, int type, uint8_t * msgelem,
int len);
extern int cw_readelem_result_code(uint32_t * result_code, int type, uint8_t * msgelem,
@ -473,7 +476,7 @@ extern int cw_readelem_result_code(uint32_t * result_code, int type, uint8_t * m
extern int cw_readelem_vendor_specific_payload(void *data, int msgtype, int elemtype,
uint8_t * msgelem, int len);
*/
@ -635,6 +638,7 @@ extern struct cw_strlist_elem mbag_item_strings[];
#define cw_strerror(rc) cw_strrc(rc)
*/
#include "strheap.h"
const char * cw_strerror(int rc);
int cw_result_is_ok(int rc);
@ -658,12 +662,14 @@ extern int cw_in_vendor_specific_payload(struct conn *conn, struct cw_action_in
uint8_t * data, int len,struct sockaddr *from);
*/
/*
extern int cw_in_wtp_name(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
extern int cw_in_wtp_board_data(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
extern int cw_in_wtp_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
*/
/*
//extern int cw_out_generic(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len);
@ -677,21 +683,21 @@ extern int cw_out_generic(struct conn *conn, struct cw_action_out *a, uint8_t *
//extern int cw_out_ac_descriptor(struct conn *conn, uint32_t elem_id, uint8_t * dst,
//struct mbag_item *item);
*/
extern int cw_out_ac_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
extern int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a,
uint8_t * dst);
/*
//extern int cw_out_capwap_control_ip_addrs(struct conn *conn, uint32_t elem_id,
// uint8_t * dst, struct mbag_item *item);
*/
/*
extern int cw_out_capwap_control_ip_addr_list(struct conn *conn, struct cw_action_out *a,
uint8_t * dst);
*/
/*
extern int cw_put_msg(struct conn *conn, uint8_t * rawout);
int cw_out_image_data(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
*/
struct cw_ac_status {
int stations;
@ -732,84 +738,6 @@ enum capwap_states {
int cw_register_actions_capwap_ac(struct cw_actiondef *def);
int cw_register_actions_cipwap_ac(struct cw_actiondef *def);
int cw_register_actions_capwap_wtp(struct cw_actiondef *def);
int cw_in_set_state_none(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len);
struct mbag_item *cw_out_get_outgoing(struct conn *conn, struct cw_action_out *a);
struct mbag_item *cw_out_get_local(struct conn *conn, struct cw_action_out *a);
extern int cw_in_check_join_resp(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len,struct sockaddr *from);
extern int cw_in_check_disc_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
int cw_in_check_disc_resp(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
int cw_in_check_join_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
extern int cw_in_check_img_data_req_wtp(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len,struct sockaddr *from);
extern int cw_in_check_img_data_req_ac(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len,struct sockaddr *from);
int cw_in_check_img_data_resp(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
void cw_init_request(struct conn *conn, int msg_id);
struct mbag_item *cw_out_get_session_id(struct conn *conn, struct cw_action_out *a);
struct mbag_item *cw_out_get_config(struct conn *conn, struct cw_action_out *a);
extern int cw_in_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from);
int cw_out_ac_name_with_priority(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
int cw_send_request(struct conn *conn, int msg_id);
/*
//int cw_is_utf8(unsigned char *str, size_t len);
*/
int cw_in_ac_name_with_priority(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from);
int cw_out_radio_administrative_states(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
int cw_in_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from);
int cw_in_ac_descriptor(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len,struct sockaddr *from);
int cw_in_radio_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from);
/*
//int cw_out_capwap_local_ip_address(struct conn *conn, struct cw_action_out *action, uint8_t * dst);
*/
int cw_in_check_chng_state_evnt_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
/*
//int cw_out_radio_operational_states(struct conn *conn, struct cw_action_out *a, uint8_t * dst);
*/
int cw_in_check_cfg_update_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len,struct sockaddr *from);
int cw_radio_set_admin_state(mbag_t radios,int rid, int state,int cause);
int cw_in_radio_administrative_state_wtp(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from);
#endif

@ -5,8 +5,8 @@ struct cw_strlist_elem capwap_strings_elem[] = {
{CAPWAP_ELEM_AC_DESCRIPTOR, "AC Descriptor"},
{CAPWAP_ELEM_AC_IPV4_LIST, "AC IPv4 List"},
{CW_ELEM_AC_IPV6_LIST, "AC IPv6 List"},
{CW_ELEM_AC_NAME, "AC Name"},
{CAPWAP_ELEM_AC_IPV6_LIST, "AC IPv6 List"},
{CAPWAP_ELEM_AC_NAME, "AC Name"},
{CW_ELEM_AC_NAME_WITH_PRIORITY, "AC Name with Priority"},
// {CW_ELEM_AC_NAME_WITH_INDEX, "AC Name with Index"},
{CAPWAP_ELEM_AC_TIMESTAMP, "AC Timestamp"},

@ -74,6 +74,7 @@ struct conn {
mavl_t remote_cfg;
mavl_t local_cfg;
mavl_t global_cfg;

@ -40,7 +40,7 @@ void conn_init(struct conn * conn)
conn->wait_dtls=CAPWAP_WAIT_DTLS;
conn->wait_join=CAPWAP_WAIT_JOIN;
conn->mtu_discovery=1;
conn->capwap_mode = CW_MODE_AUTO;
conn->capwap_mode = 0;
conn->strict_capwap=1;
conn->remote = mbag_create();

@ -116,8 +116,10 @@ void cw_init_data_msg(struct conn *conn)
*/
int cw_send_response(struct conn *conn, uint8_t * rawmsg, int len)
{
int rc;
cw_init_response(conn, rawmsg);
if (cw_put_msg(conn, conn->resp_buffer) == -1)
rc = cw_put_msg(conn, conn->resp_buffer);
if (!cw_result_is_ok(rc))
return 0;
conn_send_msg(conn, conn->resp_buffer);
return 1;
@ -125,7 +127,6 @@ int cw_send_response(struct conn *conn, uint8_t * rawmsg, int len)
/**
* Special case error message, which is sent when an unexpected messages
* was received or something else happened.
@ -330,10 +331,10 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
if (conn->msg_start){
/* if (conn->msg_start){
conn->msg_start(conn, afm, rawmsg, len, from);
}
*/
/* Execute start processor for message */
/*
// if (afm->start) {
@ -353,6 +354,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
/* iterate through message elements */
cw_foreach_elem(elem, elems_ptr, elems_len) {
int rc;
struct cw_ElemHandlerParams params;
int elem_len, elem_id, max_len;
@ -377,26 +379,16 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
params.msgdata=message;
params.mand_found=mand_found;
result_code = cw_process_element(&params,0,0,elem_id,elem_data,elem_len);
rc = cw_process_element(&params,0,0,elem_id,elem_data,elem_len);
if (cw_result_is_ok(result_code))
if (cw_result_is_ok(rc))
continue;
if (result_code == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
if (rc == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
mlist_append(unrecognized,&elem);
}
continue;
exit(0);
/* if (!check_len(conn, af, cw_get_elem_data(elem), elem_len, from)) {
continue;
}
cw_dbg_elem(DBG_ELEM, conn, as.msg_id, as.elem_id, cw_get_elem_data(elem),
elem_len);
*/
}
@ -426,10 +418,7 @@ exit(0);
}
mavliter_init(&it,mand_found);
mavliter_foreach(&it){
printf("MAnd found: %s", mavliter_get_str(&it));
}
{
mlistelem_t *e;
@ -445,13 +434,10 @@ exit(0);
}
//int result_code = 0;
//int unrecognized =3;
int rct = cw_in_check_generic(conn, afm, rawmsg, len, from);
/** int rct = cw_in_check_generic(conn, afm, rawmsg, len, from); */
if (rct && conn->strict_capwap)
/* if (rct && conn->strict_capwap)
{
result_code = rct;
}
@ -465,11 +451,11 @@ exit(0);
conn->msg_end(conn, afm, rawmsg, len, from);
}
}
if (unrecognized) {
*/
/* if (unrecognized) {
cw_dbg(DBG_RFC, "Message has %d unrecognized message elements.",
unrecognized);
/* set only resultcode for request messages */
// set only resultcode for request messages
if ( (!result_code) && ((afm->msg_id & 1))) {
if (conn->strict_capwap) {
@ -478,14 +464,19 @@ exit(0);
}
}
*/
/* if we've got a request message, we always have to send a response message */
if (as.msg_id & 1) {
if (message->type & 1) {
if (result_code > 0) {
/* the end method gave us an result code>0, so
send an error message */
printf("Here we are, error response %i %s\n", result_code, cw_strerror(result_code));
exit(0);
cw_send_error_response(conn, rawmsg, result_code);
} else if (result_code == 0) {
/* All ok, send regular response message */
cw_send_response(conn, rawmsg, len);
} else {

@ -53,4 +53,5 @@ int cw_in_check_img_data_req_ac(struct conn *conn, struct cw_action_in *a, uint8
return CAPWAP_RESULT_IMAGE_DATA_ERROR;
*/
return 0;
}

@ -20,7 +20,6 @@ const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key, const struct
return NULL;
}
printf("Want To Add: %s:%s (%s)\n",key,str,type->name);
mresult = type->from_str(&mdata,str);
if (!mresult){
cw_log(LOG_ERR, "Can't create kvstore element for key %s of type %s: %s",

@ -0,0 +1,30 @@
#include "ktv.h"
#include "dbg.h"
void cw_ktv_dump(mavl_t ktv, uint32_t dbglevel,
const char *header, const char *prefix, const char *footer )
{
char value[500];
struct cw_KTV * data;
mavliter_t it;
const struct cw_Type * type;
if (header != NULL)
cw_dbg (dbglevel, header);
mavliter_init(&it,ktv);
mavliter_foreach(&it){
data = mavliter_get(&it);
type = data->type;
type->to_str(data,value,0);
cw_dbg(dbglevel,"%s%s (%s): %s",prefix,data->key,type->name, value);
}
if (footer != NULL)
cw_dbg (dbglevel, footer);
}

@ -0,0 +1,11 @@
#include "ktv.h"
uint8_t cw_ktv_get_byte(mavl_t ktv,const char *key, uint8_t def)
{
cw_KTV_t * k;
k = cw_ktv_get(ktv,key,CW_TYPE_BYTE);
if (k != NULL){
return k->val.byte;
}
return def;
}

@ -0,0 +1,11 @@
#include "ktv.h"
uint16_t cw_ktv_get_word(mavl_t ktv,const char *key, uint16_t def)
{
cw_KTV_t * k;
k = cw_ktv_get(ktv,key,CW_TYPE_WORD);
if (k != NULL){
return k->val.word;
}
return def;
}

@ -27,8 +27,10 @@ int cw_ktv_read_file(FILE * file, mavl_t ktv, mavl_t types)
if (cwtype != NULL){
// printf("Yes! I know the type: %s\n",cwtype->name);
}
else
else {
printf("Unknown type: %s\n",typesearch.name);
continue;
}

@ -0,0 +1,9 @@
#include "ktv.h"
const cw_Type_t * cw_ktv_std_types[] = {
CW_TYPE_BYTE,
CW_TYPE_WORD,
CW_TYPE_DWORD,
CW_TYPE_BSTR16,
NULL
};

@ -1,111 +0,0 @@
#include "log.h"
#include "mbag.h"
#include "conn.h"
#include "mbag.h"
#include "capwap_items.h"
#include "cw.h"
int cw_get_out_item(struct conn * conn, struct cw_action_out *a, void *dst, mbagtype_t type)
{
if (!a->get)
return 0;
/* Get the item */
struct mbag_item *item = a->get(conn, a);
if (!item)
return 0;
if (item->type != type){
return 0;
}
return cw_put_mbag_item(dst,item);
}
int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t * dst)
{
mbag_t board_data;
// mbag_get_mbag(conn->config, CW_ITEM_WTP_BOARD_DATA,NULL);
if (!cw_get_out_item(conn,a,&board_data,MBAG_MBAG)){
cw_log(LOG_ERROR,"Can't get item '%s' for msg %d, elem %d",a->item_id,a->msg_id,a->elem_id);
return 0;
}
/* if (!board_data) {
cw_log(LOG_ERR, "Error: Can't send WTP Board Data element. \"%s\" is undefined.",CW_ITEM_WTP_BOARD_DATA);
return 0;
}
*/
struct mbag_item *i;
i = mbag_get(board_data, CW_ITEM_WTP_BOARD_VENDOR);
if (!i) {
cw_log(LOG_ERR,
"Error: Can't send WTP Board Data element - no vendor defined");
return 0;
}
uint8_t *d = dst + 4;
d += cw_put_dword(d, i->u2.dword);
char buf[90];
i = mbag_get(board_data, CW_ITEM_WTP_BOARD_MODELNO);
if (i) {
printf("We have got an i %p\n",i);
printf("len: %d\n",bstr16_len(i->u2.data));
memcpy(buf,bstr16_data(i->u2.data),bstr16_len(i->u2.data));
buf[bstr16_len(i->u2.data)]=0;
printf("Val: %s\n",buf);
d += cw_put_word(d, CW_BOARDDATA_MODELNO);
d += cw_put_word(d, bstr16_len(i->u2.data));
d += cw_put_data(d, bstr16_data(i->u2.data), bstr16_len(i->u2.data));
} else {
cw_log(LOG_ERR,
"Error: Can't set sub-element \"WTP Model Number\" in WTP Board Data.");
}
i = mbag_get(board_data, CW_ITEM_WTP_BOARD_SERIALNO);
if (i) {
d += cw_put_word(d, CW_BOARDDATA_SERIALNO);
d += cw_put_word(d, bstr16_len(i->u2.data));
d += cw_put_data(d, bstr16_data(i->u2.data), bstr16_len(i->u2.data));
}else {
cw_log(LOG_ERR,
"Error: Can't set sub-element \"WTP Serial Number\" in WTP Board Data.");
}
i = mbag_get(board_data, CW_ITEM_WTP_BOARD_ID);
if (i) {
d += cw_put_word(d, CW_BOARDDATA_BOARDID);
d += cw_put_word(d, bstr16_len(i->u2.data));
d += cw_put_data(d, bstr16_data(i->u2.data), bstr16_len(i->u2.data));
}
i = mbag_get(board_data, CW_ITEM_WTP_BOARD_REVISION);
if (i) {
d += cw_put_word(d, CW_BOARDDATA_REVISION);
d += cw_put_word(d, bstr16_len(i->u2.data));
d += cw_put_data(d, bstr16_data(i->u2.data), bstr16_len(i->u2.data));
}
i = mbag_get(board_data, CW_ITEM_WTP_BOARD_MACADDRESS);
if (i) {
d += cw_put_word(d, CW_BOARDDATA_MACADDRESS);
d += cw_put_word(d, bstr_len(i->u2.data));
d += cw_put_data(d, bstr_data(i->u2.data), bstr_len(i->u2.data));
}
int l = d - dst-4;
return l + cw_put_elem_hdr(dst, CAPWAP_ELEM_WTP_BOARD_DATA, l );
}

@ -31,7 +31,7 @@ static int cw_put_encryption_subelems(uint8_t *dst,int capwap_mode)
}
/*
int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * dst)
{
@ -77,7 +77,8 @@ int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t *
else {
cw_log(LOG_INFO, "Can't send Other Version in WTP descriptor, not set.");
}
*/
int len = d-dst-4;
return len + cw_put_elem_hdr(dst,a->elem_id,len);
*
// int len = d-dst-4;
// return len + cw_put_elem_hdr(dst,a->elem_id,len);
}
*/

@ -10,15 +10,17 @@
*/
int cw_put_ac_status(uint8_t * dst, struct cw_ac_status *s, struct conn * conn)
{
uint8_t *d = dst;
uint8_t *d;
d = dst;
d += cw_put_dword(d, (s->stations << 16) | (s->limit));
d += cw_put_dword(d, (s->active_wtps << 16) | (s->max_wtps));
int security = 0;
security |= conn->dtls_cert_file ? CW_FLAG_AC_SECURITY_X : 0;
security |= conn->dtls_psk ? CW_FLAG_AC_SECURITY_S : 0;
security |= conn->dtls_cert_file ? CAPWAP_FLAG_AC_SECURITY_X : 0;
security |= conn->dtls_psk ? CAPWAP_FLAG_AC_SECURITY_S : 0;
d += cw_put_dword(d,

@ -44,6 +44,8 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
struct mlistelem * elem;
int len,l;
\
/* rawout is already initialized, so we can get
* msg type from buffer */
msgptr = rawout + cw_get_hdr_msg_offset(rawout);
@ -53,8 +55,11 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
if (msg == NULL){
cw_log(LOG_ERR,"Error: Can't create message of type %d (%s) - no definition found.",
type, cw_strmsg(type));
return CAPWAP_RESULT_MSG_UNRECOGNIZED;
}
printf("Message to send: %s (elems %d)\n",msg->name, msg->elements_list->count);
dst = msgptr+8;