Compare commits
3 Commits
05963edc98
...
3ee1d725a5
Author | SHA1 | Date | |
---|---|---|---|
3ee1d725a5 | |||
d94239679d | |||
23360febfa |
@ -1,9 +1,7 @@
|
||||
#ifndef __ACTUBE_AC_H
|
||||
#define __ACTUBE_AC_H
|
||||
|
||||
#include "mavl.h"
|
||||
#include "cw/mavltypes.h"
|
||||
|
||||
#include "cw/cfg.h"
|
||||
|
||||
extern struct ac_status ac_global_status;
|
||||
|
||||
@ -19,7 +17,7 @@ enum {
|
||||
AC_PROTO_UNKNOWN
|
||||
};
|
||||
|
||||
void start_shell();
|
||||
int start_shell(cw_Cfg_t *global_cfg);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -52,8 +52,34 @@ int ac_run(cw_Cfg_t * cfg);
|
||||
#include "statemachine.h"
|
||||
|
||||
#include <getopt.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
/*
|
||||
void tshell_run(int fd)
|
||||
{
|
||||
int rc;
|
||||
printf("listening\n");
|
||||
rc = listen(fd,5);
|
||||
printf("listen returned %d\n",rc);
|
||||
clientsock = accept (sockfd, (struct sockaddr*) &client, &client_size);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void tshell()
|
||||
{
|
||||
printf("tshell start\n");
|
||||
struct sockaddr_un addr;
|
||||
|
||||
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, "./tsocket", sizeof(addr.sun_path)-1);
|
||||
bind(fd, (struct sockaddr*)&addr, sizeof(addr));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
|
||||
struct bootcfg {
|
||||
const char * cfgfilename;
|
||||
@ -181,8 +207,6 @@ int main (int argc, char *argv[])
|
||||
int rc = 0;
|
||||
struct bootcfg bootcfg;
|
||||
|
||||
|
||||
|
||||
/* parse arguments */
|
||||
parse_args (argc, argv, &bootcfg);
|
||||
|
||||
@ -237,10 +261,6 @@ int main (int argc, char *argv[])
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
start_shell();
|
||||
|
||||
/* Init DTLS library */
|
||||
dtls_init();
|
||||
|
||||
@ -255,9 +275,15 @@ int main (int argc, char *argv[])
|
||||
if (!dataman_list_init())
|
||||
goto errX;
|
||||
|
||||
|
||||
|
||||
ac_conf_init(global_cfg);
|
||||
|
||||
cw_cfg_dump(global_cfg);
|
||||
if (!start_shell(global_cfg))
|
||||
goto errX;
|
||||
|
||||
|
||||
// cw_cfg_dump(global_cfg);
|
||||
|
||||
cw_log (LOG_INFO, "Starting AC-Tube, Name=%s, ID=%s", cw_cfg_get(global_cfg,"capwap/ac-name",NULL), conf_acid);
|
||||
rc = ac_run(global_cfg);
|
||||
|
@ -298,7 +298,7 @@ int init_bcast_addrs(cw_Cfg_t *cfg)
|
||||
sr = mavl_add_str(t, s);
|
||||
|
||||
|
||||
printf("BCAST = %p --- %p: %s\n",str,s,str);
|
||||
// printf("BCAST = %p --- %p: %s\n",str,s,str);
|
||||
}
|
||||
|
||||
}
|
||||
@ -549,7 +549,6 @@ int conf_parse_listen_addr(const char *addrstr, char *saddr, char *port, int *pr
|
||||
|
||||
void ac_conf_init(cw_Cfg_t *cfg)
|
||||
{
|
||||
printf("ac conf\n");
|
||||
init_listen_addrs(cfg);
|
||||
init_bcast_addrs(cfg);
|
||||
init_ac_name(cfg);
|
||||
|
@ -36,10 +36,15 @@ actube/ipv6: false
|
||||
#actube/mod.2: capwap80211
|
||||
#
|
||||
|
||||
actube/mod.0: cisco
|
||||
#actube/mod.0: cisco
|
||||
actube/mod.1: capwap
|
||||
actube/mod.2: capwap80211
|
||||
|
||||
#actube/shell/listen: unix:/tmp/actube
|
||||
actube/shell/listen: tcp:127.0.0.1:5000
|
||||
actube/shell/enable: true
|
||||
actube/shell/term: ansi
|
||||
|
||||
|
||||
ac-descriptor/dtls-policy: 1
|
||||
ac-descriptor/hardware/vendor: 4232704
|
||||
|
377
src/ac/shell.c
377
src/ac/shell.c
@ -5,6 +5,10 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <arpa/telnet.h>
|
||||
|
||||
|
||||
|
||||
#include "cw/sock.h"
|
||||
#include "cw/log.h"
|
||||
@ -16,13 +20,25 @@
|
||||
|
||||
#include "wtplist.h"
|
||||
|
||||
|
||||
#include "ac.h"
|
||||
|
||||
|
||||
struct shelldata{
|
||||
FILE *out;
|
||||
char prompt[1024];
|
||||
mavl_t update_cfg;
|
||||
char *history[2000];
|
||||
char line[4096];
|
||||
int pos;
|
||||
char esc[8];
|
||||
int escpos;
|
||||
int quit;
|
||||
};
|
||||
|
||||
struct sockdata{
|
||||
const char *name;
|
||||
int fd;
|
||||
cw_Cfg_t * global_cfg;
|
||||
};
|
||||
|
||||
void select_cmd(struct shelldata *sd, const char *cmd);
|
||||
@ -33,6 +49,7 @@ void set_cmd(struct shelldata *sd, const char * cmd);
|
||||
void del_cmd(struct shelldata *sd, const char * cmd);
|
||||
void send_cmd(struct shelldata *sd, const char * cmd);
|
||||
void wlan0_cmd(struct shelldata *sd, const char * cmd);
|
||||
void exit_cmd(struct shelldata *sd, const char * cmd);
|
||||
//void show_cfg (FILE *out, mavl_t ktv);
|
||||
void show_aps (FILE *out);
|
||||
|
||||
@ -44,6 +61,7 @@ struct command{
|
||||
};
|
||||
|
||||
static struct command cmdlist[]={
|
||||
{"exit",exit_cmd},
|
||||
{"cfg", cfg_cmd },
|
||||
{"del", del_cmd },
|
||||
{"ucfg", ucfg_cmd},
|
||||
@ -70,6 +88,13 @@ void list_cmd(struct shelldata *sd, const char *cmd)
|
||||
show_aps(sd->out);
|
||||
}
|
||||
|
||||
void exit_cmd(struct shelldata *sd, const char *cmd)
|
||||
{
|
||||
sd->quit=1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void cfg_cmd(struct shelldata *sd, const char *cmd)
|
||||
{
|
||||
struct cw_Conn * conn;
|
||||
@ -356,7 +381,7 @@ void execute_cmd (struct shelldata * sd, const char *str)
|
||||
}
|
||||
}
|
||||
else{
|
||||
fprintf(sd->out,"Unknown command: '%s'\n",cmd);
|
||||
fprintf(sd->out,"Unknown command: '%s'\n\r",cmd);
|
||||
}
|
||||
|
||||
return;
|
||||
@ -408,6 +433,163 @@ void execute_cmd (struct shelldata * sd, const char *str)
|
||||
|
||||
}
|
||||
|
||||
struct esc_strings {
|
||||
char *str;
|
||||
char * result;
|
||||
};
|
||||
|
||||
struct esc_strings estr[] = {
|
||||
{"\x1b[H", "home"},
|
||||
{"\x1b[F", "end"},
|
||||
{"\x1b[A", "up"},
|
||||
{"\x1b[B", "donw"},
|
||||
{"\x1b[D", "left"},
|
||||
{"\x1b[C", "right"},
|
||||
|
||||
{NULL,NULL}
|
||||
|
||||
};
|
||||
|
||||
static int cmpansi(char * str,char * ansistr)
|
||||
{
|
||||
int sl,al;
|
||||
sl = strlen(str);
|
||||
al = strlen(ansistr);
|
||||
|
||||
|
||||
if(sl>al){
|
||||
return 0;
|
||||
}
|
||||
if (sl<al){
|
||||
if (strncmp(str,ansistr,sl)==0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (strcmp(str,ansistr)==0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void get_line_char_mode(FILE * file, struct shelldata *sd)
|
||||
{
|
||||
int c;
|
||||
struct esc_strings * es;
|
||||
|
||||
es = NULL;
|
||||
sd->line[0]=0;
|
||||
sd->pos=0;
|
||||
sd->esc[0]=0;
|
||||
sd->escpos=0;
|
||||
|
||||
// fprintf (file, "\xff\xfc\22");
|
||||
|
||||
/* Put telnet into char mode */
|
||||
fprintf (file,"%c%c%c",IAC,WILL,TELOPT_ECHO );
|
||||
fprintf (file,"%c%c%c",IAC,WILL,TELOPT_SGA );
|
||||
fprintf (file,"%c%c%c",IAC,DONT,TELOPT_LINEMODE );
|
||||
|
||||
|
||||
fprintf (file, "actube[%s]:>", sd->prompt);
|
||||
fflush (file);
|
||||
|
||||
while ( (c=fgetc(file))!= EOF){
|
||||
printf ("%02x\n",c);
|
||||
if (sd->escpos){
|
||||
int i;
|
||||
int a=0;
|
||||
|
||||
sd->esc[sd->escpos++]=c;
|
||||
sd->esc[sd->escpos]=0;
|
||||
|
||||
for (i=0; estr[i].str != NULL; i++){
|
||||
int rc;
|
||||
rc = cmpansi(sd->esc,estr[i].str);
|
||||
if (rc==1){
|
||||
sd->esc[0]=0;
|
||||
sd->escpos=0;
|
||||
es = &estr[i];
|
||||
break;
|
||||
}
|
||||
a |= rc;
|
||||
|
||||
}
|
||||
if (a==0){
|
||||
sd->esc[0]=0;
|
||||
sd->escpos=0;
|
||||
}else{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (c==0x1b){
|
||||
sd->esc[sd->escpos++]=c;
|
||||
sd->esc[sd->escpos]=0;
|
||||
printf("ESC start\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (!es){
|
||||
if (c=='\r'){
|
||||
printf("CMD: %s\n",sd->line);
|
||||
fprintf (file, "\n\r");
|
||||
fflush(file);
|
||||
//fprintf (file, "\n\ractube[%s]:>", sd->prompt);
|
||||
return;
|
||||
sd->pos=0;
|
||||
sd->line[0]=0;
|
||||
continue;
|
||||
}
|
||||
if (c=='\x7f'){
|
||||
if (sd->pos==0)
|
||||
continue;
|
||||
|
||||
printf("Backspace\n");
|
||||
fprintf(file,"%c %c",8,8);
|
||||
sd->line[--sd->pos]=0;
|
||||
continue;
|
||||
|
||||
}
|
||||
if (c>240 || c<30){
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
sd->line[sd->pos++]=c;
|
||||
sd->line[sd->pos]=0;
|
||||
printf("putout: %c %02X\n",c,c);
|
||||
fprintf(file,"\x1b[1@%c",c);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf ("ES: %s\n",es->result);
|
||||
|
||||
if (strcmp(es->result,"left")==0){
|
||||
if (sd->pos>0){
|
||||
sd->pos--;
|
||||
fprintf(file,es->str);
|
||||
}
|
||||
}
|
||||
if (strcmp(es->result,"right")==0){
|
||||
if (sd->line[sd->pos]!=0){
|
||||
sd->pos++;
|
||||
fprintf(file,es->str);
|
||||
}
|
||||
}
|
||||
|
||||
// fprintf(file,es->str);
|
||||
|
||||
es = NULL;
|
||||
// fflush(file);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void shell_loop (FILE *file)
|
||||
{
|
||||
@ -419,20 +601,30 @@ void shell_loop (FILE *file)
|
||||
*/
|
||||
|
||||
char str[2048];
|
||||
stop();
|
||||
// sd.update_cfg = cw_ktv_create();
|
||||
|
||||
|
||||
|
||||
sd.out = file;
|
||||
sprintf(sd.prompt,"%s","*");
|
||||
sd.quit=0;
|
||||
|
||||
do {
|
||||
fprintf (file, "actube[%s]:>", sd.prompt);
|
||||
fflush (file);
|
||||
int c;
|
||||
get_line_char_mode(file,&sd);
|
||||
printf("THE CMD FROM LINE '%s'\n",sd.line);
|
||||
|
||||
str[0]=0;
|
||||
fgets (str, sizeof (str), file);
|
||||
execute_cmd (&sd, str);
|
||||
// c=fgetc(file);
|
||||
|
||||
//printf("%c\n",c);
|
||||
|
||||
// fgets (str, sizeof (str), file);
|
||||
|
||||
// printf("My String: %s\n",str);
|
||||
|
||||
execute_cmd (&sd, sd.line);
|
||||
if (sd.quit)
|
||||
break;
|
||||
|
||||
} while (c != EOF);
|
||||
|
||||
@ -440,24 +632,61 @@ void shell_loop (FILE *file)
|
||||
|
||||
|
||||
void * run_shell (void * arg)
|
||||
{
|
||||
char sockstr[SOCK_ADDR_BUFSIZE];
|
||||
struct sockdata * sockdata;
|
||||
int clientsock;
|
||||
struct sockaddr_storage client;
|
||||
socklen_t client_size;
|
||||
|
||||
sockdata = (struct sockdata *)arg;
|
||||
|
||||
memset(&client,0,sizeof(client));
|
||||
client_size=sizeof(client);
|
||||
|
||||
cw_dbg(DBG_INFO,"Starting shell, listening on: %s (sock fd: %d)",sockdata->name, sockdata->fd);
|
||||
|
||||
while(1){
|
||||
clientsock = accept (sockdata->fd, (struct sockaddr*) &client, &client_size);
|
||||
if (clientsock == -1){
|
||||
cw_log (LOG_ERR, "Accept error '%s', %s", "addr", strerror (errno));
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
if (clientsock > 0) {
|
||||
sock_addr2str_p (&client, sockstr);
|
||||
cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
|
||||
cw_dbg (DBG_INFO, "Start shell");
|
||||
shell_loop (fdopen (clientsock, "a+"));
|
||||
cw_dbg (DBG_INFO, "Stop shell");
|
||||
close (clientsock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//cw_dbg (DBG_INFO,"Accepting shell session %i, %s", rc, strerror (errno));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int create_tcp_fd(const char *name)
|
||||
{
|
||||
struct sockaddr_storage server, client;
|
||||
socklen_t client_size;
|
||||
char sockstr[SOCK_ADDR_BUFSIZE];
|
||||
|
||||
int rc;
|
||||
const char * addr = "127.0.0.1:5000";
|
||||
const char * addr = name;
|
||||
int sockfd, clientsock;
|
||||
int yes;
|
||||
|
||||
|
||||
cw_dbg(DBG_INFO,"Staring shelli listening at: %s",addr);
|
||||
|
||||
|
||||
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
|
||||
|
||||
if (! rc) {
|
||||
cw_log (LOG_ERR, "Can't parse address '%s', %s", addr, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
sockfd = socket ( ( (struct sockaddr*) &server)->sa_family, SOCK_STREAM, 0);
|
||||
@ -472,43 +701,99 @@ void * run_shell (void * arg)
|
||||
|
||||
if (rc) {
|
||||
cw_log (LOG_ERR, "Can't bind socket address '%s', %s", addr, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = listen (sockfd, 5);
|
||||
|
||||
if (rc) {
|
||||
cw_log (LOG_ERR, "Can't listen on address '%s', %s", addr, strerror (errno));
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
|
||||
client_size = sizeof (client);
|
||||
while(1){
|
||||
|
||||
clientsock = accept (sockfd, (struct sockaddr*) &client, &client_size);
|
||||
|
||||
if (clientsock > 0) {
|
||||
sock_addr2str_p (&client, sockstr);
|
||||
cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
|
||||
cw_dbg (DBG_INFO, "Start shell");
|
||||
shell_loop (fdopen (clientsock, "a+"));
|
||||
cw_dbg (DBG_INFO, "Stop shell");
|
||||
close (clientsock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
cw_dbg (DBG_INFO,"Accepting shell session %i, %s", rc, strerror (errno));
|
||||
}
|
||||
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void start_shell()
|
||||
static int create_unix_fd(const char *name)
|
||||
{
|
||||
struct sockaddr_storage client;
|
||||
socklen_t client_size;
|
||||
struct sockaddr_un addr;
|
||||
int rc,fd;
|
||||
|
||||
unlink(name);
|
||||
fd = socket(PF_UNIX, SOCK_STREAM, 0);
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, name, sizeof(addr.sun_path)-1);
|
||||
rc = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
|
||||
if (rc) {
|
||||
cw_log (LOG_ERR, "Can't bind socket 'unix:%s', %s", name, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
int clientsock = accept (fd, (struct sockaddr*) &client, &client_size);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
int start_shell(cw_Cfg_t *global_cfg)
|
||||
{
|
||||
struct sockdata * sockdata;
|
||||
const char *sockname;
|
||||
int rc, type;
|
||||
int fd;
|
||||
|
||||
rc = cw_cfg_get_bool(global_cfg,"actube/shell/enable",1);
|
||||
if (!rc)
|
||||
return 1;
|
||||
|
||||
sockdata = malloc(sizeof(struct sockdata));
|
||||
if (sockdata==NULL)
|
||||
return 0;
|
||||
|
||||
memset(sockdata,0,sizeof(struct sockdata));
|
||||
|
||||
sockdata->global_cfg = global_cfg;
|
||||
sockdata->fd=-1;
|
||||
|
||||
sockname = cw_cfg_get(global_cfg,"actube/shell/listen",NULL);
|
||||
|
||||
if (sockname==NULL) {
|
||||
cw_log (LOG_ERR, "Can't get shell listen address from global_cfg 'actube/shell/listen");
|
||||
goto errX;
|
||||
}
|
||||
|
||||
if (strncmp("unix:",sockname,strlen("unix:"))==0){
|
||||
fd = create_unix_fd(strchr(sockname,':')+1);
|
||||
if (fd==-1)
|
||||
goto errX;
|
||||
sockdata->name=cw_strdup(sockname);
|
||||
sockdata->fd=fd;
|
||||
}else if (strncmp("tcp:",sockname,strlen("tcp:"))==0){
|
||||
fd = create_tcp_fd(strchr(sockname,':')+1);
|
||||
if (fd==-1)
|
||||
goto errX;
|
||||
sockdata->name=cw_strdup(sockname);
|
||||
sockdata->fd=fd;
|
||||
}else {
|
||||
fd = create_tcp_fd(sockname);
|
||||
if (fd==-1)
|
||||
goto errX;
|
||||
sockdata->name=cw_strdup(sockname);
|
||||
sockdata->fd=fd;
|
||||
}
|
||||
|
||||
|
||||
rc = listen (sockdata->fd, 5);
|
||||
if (rc) {
|
||||
cw_log (LOG_ERR, "Can't listen on address '%s', %s", "addr", strerror (errno));
|
||||
goto errX;
|
||||
}
|
||||
|
||||
pthread_t thread;
|
||||
pthread_create (&thread, NULL, run_shell,
|
||||
NULL);
|
||||
sockdata);
|
||||
return 1;
|
||||
errX:
|
||||
if (sockdata->fd!=-1)
|
||||
close(sockdata->fd);
|
||||
if (sockdata->name)
|
||||
free(sockdata->name);
|
||||
|
||||
free(sockdata);
|
||||
return 0;
|
||||
}
|
||||
|
@ -25,4 +25,8 @@
|
||||
#define ANSI_ITALIC "\x1b[3m"
|
||||
#define ANSI_BOLD "\x1b[1m"
|
||||
|
||||
|
||||
#define ANSI_HOME "[H"
|
||||
|
||||
|
||||
#endif /* __ANSI_COLORS_H */
|
||||
|
89
src/cw/cw.c
89
src/cw/cw.c
@ -158,9 +158,14 @@ int cw_header_len(struct cw_ElemHandler * handler)
|
||||
|
||||
|
||||
|
||||
|
||||
int cw_put_ac_status(cw_Cfg_t ** cfg_list, uint8_t *dst, const char * parent_key){
|
||||
stop();
|
||||
/**
|
||||
* Put the "status part" of an an AC Descriptor to memory
|
||||
* @param cfg_list Cfg list to read status from
|
||||
* @param dst Where to put the status to
|
||||
* @param parent_key prefix to each key
|
||||
*/
|
||||
int
|
||||
cw_put_ac_status(uint8_t *dst, cw_Cfg_t ** cfg_list, const char * parent_key){
|
||||
|
||||
uint8_t *d = dst;
|
||||
|
||||
@ -174,26 +179,92 @@ int cw_put_ac_status(cw_Cfg_t ** cfg_list, uint8_t *dst, const char * parent_key
|
||||
sprintf(key,"%s/%s",parent_key,"station-limit");
|
||||
d += cw_put_word(d,cw_cfg_get_word_l(cfg_list,key,0));
|
||||
|
||||
/* Put number of active WTPS */
|
||||
/* Put number of active WTPs */
|
||||
sprintf(key,"%s/%s",parent_key,"active-wtps");
|
||||
d += cw_put_word(d,cw_cfg_get_word_l(cfg_list,key,0));
|
||||
|
||||
d += cw_put_word(d,cw_cfg_get_word_l(cfg_list,"ac-descriptor/max-wtps",0));
|
||||
/* Put max WTPs */
|
||||
sprintf(key,"%s/%s",parent_key,"max-wtps");
|
||||
d += cw_put_word(d,cw_cfg_get_word_l(cfg_list,key,0));
|
||||
|
||||
d += cw_put_byte(d,cw_cfg_get_byte_l(cfg_list,"ac-descriptor/security",0));
|
||||
/* Put security flags */
|
||||
sprintf(key,"%s/%s",parent_key,"security");
|
||||
d += cw_put_byte(d,cw_cfg_get_byte_l(cfg_list,key,0));
|
||||
|
||||
sprintf(key,"%s/%s",parent_key,CW_SKEY_RMAC_FIELD);
|
||||
/* Put rmac-filed */
|
||||
sprintf(key,"%s/%s",parent_key,"rmac-field");
|
||||
d += cw_put_byte(d,cw_cfg_get_byte_l(cfg_list,key,0));
|
||||
|
||||
/* reserved field, must be zero - RFC5415 */
|
||||
d += cw_put_byte(d,0);
|
||||
|
||||
|
||||
sprintf(key,"%s/%s",parent_key,CW_SKEY_DTLS_POLICY);
|
||||
sprintf(key,"%s/%s",parent_key,"dtls-policy");
|
||||
d += cw_put_byte(d,cw_cfg_get_byte_l(cfg_list,key,0));
|
||||
|
||||
return d - dst;
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a descripter sub element like harware vendor/version etc.
|
||||
* Used when putting AC Descriptors or WTP Descriptors
|
||||
* @param dst Where to write to
|
||||
* @param cfg_list list of cfgs
|
||||
* @subelem_id Id of subelement
|
||||
* @parent_key parent key
|
||||
*/
|
||||
int
|
||||
cw_put_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
|
||||
int subelem_id, const char * parent_key )
|
||||
{
|
||||
char key[256];
|
||||
uint32_t vendor;
|
||||
//bstr16_t version;
|
||||
const char *vendor_s;
|
||||
|
||||
uint8_t *d;
|
||||
|
||||
|
||||
/* d += cw_put_dword(d, bstrv_get_vendor_id(v));
|
||||
d += cw_put_dword(d, (subelem_id << 16) | bstrv_len(v));
|
||||
d += cw_put_data(d, bstrv_data(v), bstrv_len(v));
|
||||
*/
|
||||
sprintf (key, "%s/%s", parent_key, CW_SKEY_VENDOR);
|
||||
vendor_s = cw_cfg_get_l (cfg_list, key, NULL);
|
||||
|
||||
if (vendor_s == NULL) {
|
||||
cw_log (LOG_ERR, "Can't put subelem %s, no value of type Dword found.", key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
vendor = atoi(vendor_s);
|
||||
|
||||
|
||||
|
||||
sprintf (key, "%s/%s", parent_key, CW_SKEY_VERSION);
|
||||
cw_Val_t * val = cw_cfg_get_val_l(cfg_list, key, CW_TYPE_BSTR16);
|
||||
|
||||
//version = cw_cfg_get_bstr16 (cfg, key, NULL);
|
||||
|
||||
|
||||
if (val == NULL) {
|
||||
cw_log (LOG_ERR, "Can't put subelem %s, no value of type Bstr16 found.", key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
d = dst;
|
||||
|
||||
/* put vendor */
|
||||
d += cw_put_dword(d, vendor); //->type->put (vendor, d);
|
||||
|
||||
/* put version */
|
||||
|
||||
d += cw_put_dword (d, (subelem_id << 16) | val->type->len(val));
|
||||
// d += cw_put_bstr16(d, version);
|
||||
d += val->type->put(val,d);
|
||||
|
||||
cw_val_destroy(val);
|
||||
|
||||
// free(version);
|
||||
|
||||
return d-dst;
|
||||
}
|
||||
|
@ -552,6 +552,9 @@ int cw_write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len);
|
||||
int cw_header_len(struct cw_ElemHandler * handler);
|
||||
|
||||
int cw_compose_message(struct cw_Conn *conn, uint8_t * rawout);
|
||||
int cw_put_ac_status(uint8_t *dst, cw_Cfg_t ** cfg_list, const char * parent_key);
|
||||
int cw_put_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
|
||||
int subelem_id, const char * parent_key );
|
||||
|
||||
|
||||
/**
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
@ -104,10 +105,16 @@ char *sock_addrtostr(const struct sockaddr *sa, char *s, size_t maxlen, int addp
|
||||
}
|
||||
break;
|
||||
#endif /* AF_PACKET */
|
||||
case AF_UNIX:
|
||||
{
|
||||
struct sockaddr_un *addr = (struct sockaddr_un *) sa;
|
||||
snprintf(s, maxlen, "%s", addr->sun_path);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
strncpy(s, "Unknown AF", maxlen);
|
||||
snprintf(s,maxlen, "Unknown AF: %d", sa->sa_family);
|
||||
return NULL;
|
||||
}
|
||||
return s;
|
||||
|
@ -9,15 +9,12 @@ int capwap_in_ac_descriptor(struct cw_ElemHandler *eh,
|
||||
struct cw_ElemHandlerParams *params,
|
||||
uint8_t * data, int len)
|
||||
{
|
||||
stop();
|
||||
|
||||
static struct cw_DescriptorSubelemDef allowed[] = {
|
||||
{0,CAPWAP_SUBELEM_AC_HARDWARE_VERSION, "hardware", 1024,1},
|
||||
{0,CAPWAP_SUBELEM_AC_SOFTWARE_VERSION, "software", 1024,1},
|
||||
{0,0, NULL,0, 0}
|
||||
};
|
||||
|
||||
|
||||
return cw_read_ac_descriptor(params->cfg,eh,params,data,len,allowed);
|
||||
|
||||
}
|
||||
|
@ -3,74 +3,27 @@
|
||||
#include "cw/dbg.h"
|
||||
#include "cw/conn.h"
|
||||
|
||||
|
||||
|
||||
#include "cw/capwap.h"
|
||||
#include "cw/cw.h"
|
||||
#include "cw/val.h"
|
||||
#include "cw/keys.h"
|
||||
|
||||
|
||||
|
||||
static int put_ac_status(mavl_t global, mavl_t local, uint8_t *dst, const char * parent_key){
|
||||
|
||||
stop();
|
||||
|
||||
uint8_t *d = dst;
|
||||
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
|
||||
|
||||
d += cw_put_word(d,cw_ktv_get_word(global,"ac-descriptor/stations",0));
|
||||
d += cw_put_word(d,cw_ktv_get_word(global,"ac-descriptor/station-limit",0));
|
||||
d += cw_put_word(d,cw_ktv_get_word(global,"ac-descriptor/active-wtps",0));
|
||||
d += cw_put_word(d,cw_ktv_get_word(global,"ac-descriptor/max-wtps",0));
|
||||
|
||||
d += cw_put_byte(d,cw_ktv_get_byte(global,"ac-descriptor/security",0));
|
||||
/*
|
||||
security = 0;
|
||||
if (cw_ktv_get(local,"dtls-cert-file",CW_TYPE_BSTR16))
|
||||
security |= CAPWAP_FLAG_AC_SECURITY_X;
|
||||
|
||||
if (cw_ktv_get(local,"dtls-psk",CW_TYPE_BSTR16))
|
||||
security |= CAPWAP_FLAG_AC_SECURITY_S;
|
||||
|
||||
if (security == 0){
|
||||
cw_log(LOG_WARNING,"No AC security selected");
|
||||
}
|
||||
d += cw_put_byte(dst,security);
|
||||
*/
|
||||
sprintf(key,"%s/%s",parent_key,CW_SKEY_RMAC_FIELD);
|
||||
d += cw_put_byte(d,cw_ktv_get_byte(local,key,0));
|
||||
|
||||
d += cw_put_byte(d,0);
|
||||
|
||||
|
||||
sprintf(key,"%s/%s",parent_key,CW_SKEY_DTLS_POLICY);
|
||||
d += cw_put_byte(d,cw_ktv_get_byte(local,key,0));
|
||||
|
||||
return d - dst;
|
||||
}
|
||||
|
||||
#include "mod_capwap.h"
|
||||
|
||||
int capwap_out_ac_descriptor(struct cw_ElemHandler * eh,
|
||||
struct cw_ElemHandlerParams * params, uint8_t * dst)
|
||||
{
|
||||
stop();
|
||||
/* int len,l;
|
||||
int len,l;
|
||||
uint8_t *d = dst+4;
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
|
||||
d+=put_ac_status(params->cfg,
|
||||
params->global_cfg,
|
||||
d, eh->key);
|
||||
d+=cw_put_ac_status(d, params->cfg_list, eh->key);
|
||||
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
d+=cw_put_descriptor_subelem (d, params->cfg_list,
|
||||
CAPWAP_SUBELEM_AC_HARDWARE_VERSION, key);
|
||||
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
d+=cw_put_descriptor_subelem (d, params->cfg_list,
|
||||
CAPWAP_SUBELEM_AC_SOFTWARE_VERSION, key);
|
||||
|
||||
len = d-dst-4;
|
||||
@ -78,6 +31,5 @@ int capwap_out_ac_descriptor(struct cw_ElemHandler * eh,
|
||||
l = len + cw_put_elem_hdr(dst,eh->id,len);
|
||||
cw_dbg_elem(DBG_ELEM_OUT,NULL,params->msgdata->type,eh,dst,l);
|
||||
return l;
|
||||
*/
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
@ -50,7 +50,6 @@ int static setup_cfg(struct cw_Conn * conn)
|
||||
security = cw_setup_dtls(conn,conn->local_cfg,"capwap",CAPWAP_CIPHER);
|
||||
|
||||
|
||||
printf ("ROLE: %d\n",conn->role);
|
||||
// stop();
|
||||
// cw_ktv_set_byte(conn->local_cfg,"ac-descriptor/security",security);
|
||||
|
||||
|
@ -6,8 +6,8 @@ ac-name-with-index.0:
|
||||
ac-name-with-index.1:
|
||||
ac-name-with-index.2:
|
||||
capwap-local-ip-address: 192.168.0.13
|
||||
capwap-timers/echo-interval: 30
|
||||
capwap-timers/max-discovery-interval: 10
|
||||
capwap-timers/echo-interval: 0
|
||||
capwap-timers/max-discovery-interval: 0
|
||||
capwap/ac-name:
|
||||
cisco-8011-assoc-limit/enable: false
|
||||
cisco-8011-assoc-limit/interval: 500
|
||||
@ -117,7 +117,7 @@ radio.0/cisco/elem146: .x690f
|
||||
radio.0/cisco/elem153: .x00
|
||||
radio.0/cisco/elem156: .x020100
|
||||
radio.0/cisco/elem16: .x02040b0c
|
||||
radio.0/cisco/elem19: .xc0a800a10001000cc0a800a103000101001ecd774fc43bd27db633509934957d3acb000000000000000052464d000000000000000000000000000000000000000000000000000000000001060b010101
|
||||
radio.0/cisco/elem19: .xc0a800a10001000cc0a800a103000101003ccd774fc43bd27db633509934957d3acb000000000000000052464d000000000000000000000000000000000000000000000000000000000001060b010101
|
||||
radio.0/cisco/elem22: .x0d00b400320102030405060708090a0b0c0d
|
||||
radio.0/cisco/elem24: .x003c000c
|
||||
radio.0/cisco/elem47: .x0100000000000000000000000000000000
|
||||
@ -170,7 +170,7 @@ radio.0/wlan.1/add-wlan/scan-defer-time: 100
|
||||
radio.0/wlan.1/add-wlan/session-timout: 1800
|
||||
radio.0/wlan.1/add-wlan/ssid: tubeC
|
||||
radio.0/wlan.1/add-wlan/wep-encryption: false
|
||||
radio.0/wlan.1/add-wlan/wep-key: .xe90245968787036bf1e1756fc8
|
||||
radio.0/wlan.1/add-wlan/wep-key: .x31772582ab25934f97c565949f
|
||||
radio.0/wlan.1/add-wlan/wep-key-index: 1
|
||||
radio.0/wlan.1/add-wlan/wlan-capability: 1073
|
||||
radio.0/wlan.1/add-wlan/wlan-id: 1
|
||||
@ -187,7 +187,7 @@ radio.0/wlan.13/add-wlan/scan-defer-time: 100
|
||||
radio.0/wlan.13/add-wlan/session-timout: 1800
|
||||
radio.0/wlan.13/add-wlan/ssid: SuperSSID
|
||||
radio.0/wlan.13/add-wlan/wep-encryption: false
|
||||
radio.0/wlan.13/add-wlan/wep-key: .xe90245968787036bf1e1756fc8
|
||||
radio.0/wlan.13/add-wlan/wep-key: .x31772582ab25934f97c565949f
|
||||
radio.0/wlan.13/add-wlan/wep-key-index: 1
|
||||
radio.0/wlan.13/add-wlan/wlan-capability: 1057
|
||||
radio.0/wlan.13/add-wlan/wlan-id: 13
|
||||
@ -205,12 +205,12 @@ radio.1/cisco/antenna-payload/unknown: 3
|
||||
radio.1/cisco/channel-power: .x0808102408221c16100a04fefe2808221c16100a04fefe2c08221c16100a04fefe3008221c16100a04fefe3408221c16100a04fefe3808221c16100a04fefe3c08221c16100a04fefe4008221c16100a04fefe6408221c16100a04fefe6808221c16100a04fefe6c08221c16100a04fefe7008221c16100a04fefe7408221c16100a04fefe8408221c16100a04fefe8808221c16100a04fefe8c08221c16100a04fefe
|
||||
radio.1/cisco/elem145: .x01
|
||||
radio.1/cisco/elem15/cfg-type: 1 - global
|
||||
radio.1/cisco/elem15/channel: 48
|
||||
radio.1/cisco/elem15/rest: .x07ffffffce000000
|
||||
radio.1/cisco/elem15/channel: 140
|
||||
radio.1/cisco/elem15/rest: .x07ffffffce010101
|
||||
radio.1/cisco/elem153: .x00
|
||||
radio.1/cisco/elem156: .x020100
|
||||
radio.1/cisco/elem16: .x0c121824
|
||||
radio.1/cisco/elem19: .xc0a800a10001000bc0a800a110000101001ecd774fc43bd27db633509934957d3acb000000000000000052464d000000000000000000000000000000000000000000000000000000000024282c3034383c4064686c707484888c01010101010101010101010101010101
|
||||
radio.1/cisco/elem19: .xc0a800a10001000bc0a800a110000101003ccd774fc43bd27db633509934957d3acb000000000000000052464d000000000000000000000000000000000000000000000000000000000024282c3034383c4064686c707484888c01010101010101010101010101010101
|
||||
radio.1/cisco/elem22: .x1000b4003224282c3034383c4064686c707484888c
|
||||
radio.1/cisco/elem24: .x003c000c
|
||||
radio.1/cisco/elem47: .x0100000000000000000000000000000000
|
||||
@ -263,7 +263,7 @@ radio.1/wlan.1/add-wlan/scan-defer-time: 100
|
||||
radio.1/wlan.1/add-wlan/session-timout: 1800
|
||||
radio.1/wlan.1/add-wlan/ssid: tubeC
|
||||
radio.1/wlan.1/add-wlan/wep-encryption: false
|
||||
radio.1/wlan.1/add-wlan/wep-key: .x495089a65b115670f2f2bd7c99
|
||||
radio.1/wlan.1/add-wlan/wep-key: .x4b0706ccd5d0a8b98b0b4084f1
|
||||
radio.1/wlan.1/add-wlan/wep-key-index: 1
|
||||
radio.1/wlan.1/add-wlan/wlan-capability: 17
|
||||
radio.1/wlan.1/add-wlan/wlan-id: 1
|
||||
@ -280,7 +280,7 @@ radio.1/wlan.13/add-wlan/scan-defer-time: 100
|
||||
radio.1/wlan.13/add-wlan/session-timout: 1800
|
||||
radio.1/wlan.13/add-wlan/ssid: SuperSSID
|
||||
radio.1/wlan.13/add-wlan/wep-encryption: false
|
||||
radio.1/wlan.13/add-wlan/wep-key: .x495089a65b115670f2f2bd7c99
|
||||
radio.1/wlan.13/add-wlan/wep-key: .x4b0706ccd5d0a8b98b0b4084f1
|
||||
radio.1/wlan.13/add-wlan/wep-key-index: 1
|
||||
radio.1/wlan.13/add-wlan/wlan-capability: 1
|
||||
radio.1/wlan.13/add-wlan/wlan-id: 13
|
||||
|
Loading…
Reference in New Issue
Block a user