2014-07-11 22:12:11 +02:00
|
|
|
/*
|
|
|
|
This file is part of actube.
|
|
|
|
|
|
|
|
actube is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
libcapwap is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
#include <stdio.h>
|
2015-03-30 07:56:42 +02:00
|
|
|
#include <stdlib.h>
|
2015-10-18 10:14:33 +02:00
|
|
|
#include <unistd.h>
|
2014-07-11 22:12:11 +02:00
|
|
|
#include <errno.h>
|
|
|
|
#include <stdint.h>
|
2018-03-17 12:32:40 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
|
|
|
|
#include "actube.h"
|
|
|
|
#include "wtplist.h"
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/dtls.h"
|
|
|
|
#include "cw/log.h"
|
|
|
|
#include "cw/dbg.h"
|
|
|
|
#include "cw/sock.h"
|
2015-10-18 10:14:33 +02:00
|
|
|
#include "conf.h"
|
2014-07-11 22:12:11 +02:00
|
|
|
|
|
|
|
#include "socklist.h"
|
|
|
|
|
2018-03-17 18:01:17 +01:00
|
|
|
|
|
|
|
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/capwap_crypto.h"
|
2018-03-17 18:01:17 +01:00
|
|
|
|
2015-04-29 12:22:28 +02:00
|
|
|
|
2015-03-30 07:56:42 +02:00
|
|
|
|
2015-04-05 02:07:59 +02:00
|
|
|
#include "ac.h"
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/format.h"
|
2015-03-30 07:56:42 +02:00
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
|
|
|
|
#include "dataman.h"
|
|
|
|
|
2022-07-31 09:49:14 +02:00
|
|
|
#include "cw/cfg.h"
|
2016-04-10 16:04:58 +02:00
|
|
|
|
2022-08-01 10:01:25 +02:00
|
|
|
int ac_run(cw_Cfg_t * cfg);
|
|
|
|
|
2022-08-11 00:21:01 +02:00
|
|
|
#include "statemachine.h"
|
2015-04-29 12:22:28 +02:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
#include <getopt.h>
|
2022-08-23 02:35:54 +02:00
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <sys/un.h>
|
2018-03-17 12:32:40 +01:00
|
|
|
|
2022-08-23 02:35:54 +02:00
|
|
|
/*
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2018-03-17 12:32:40 +01:00
|
|
|
|
2022-08-23 02:35:54 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
*/
|
2018-03-17 12:32:40 +01:00
|
|
|
|
|
|
|
struct bootcfg {
|
|
|
|
const char * cfgfilename;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
|
2015-04-07 07:42:36 +02:00
|
|
|
{
|
2018-03-17 12:32:40 +01:00
|
|
|
int c;
|
|
|
|
opterr = 1;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-01 10:01:25 +02:00
|
|
|
bootcfg->cfgfilename = "config.ckv";
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-24 00:29:26 +02:00
|
|
|
while ( (c = getopt (argc, argv, "hvc:d:p:")) != -1) {
|
2018-03-17 12:32:40 +01:00
|
|
|
|
|
|
|
switch (c) {
|
|
|
|
case 'c':
|
|
|
|
bootcfg->cfgfilename = optarg;
|
2015-10-18 10:14:33 +02:00
|
|
|
break;
|
|
|
|
case 'v':
|
2018-03-17 12:32:40 +01:00
|
|
|
printf("AC-Tube version 0.0.1, %s\n", SYS_ARCH);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
break;
|
|
|
|
case 'd':{
|
2022-08-22 01:59:23 +02:00
|
|
|
if (!cw_dbg_set_level_from_str(optarg)){
|
|
|
|
fprintf(stderr,"Invalid debug option: %s\n",optarg);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* int b = cw_strlist_get_id(cw_dbg_strings, optarg);
|
2018-03-17 12:32:40 +01:00
|
|
|
if (b==-1){
|
|
|
|
fprintf(stderr,"Invalid debug option: %s\n",optarg);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
2022-08-22 01:59:23 +02:00
|
|
|
cw_dbg_set_level(b, 1);*/
|
2018-03-17 12:32:40 +01:00
|
|
|
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;
|
2015-10-18 10:14:33 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
2015-05-01 12:50:28 +02:00
|
|
|
}
|
|
|
|
|
2016-02-22 09:18:35 +01:00
|
|
|
|
2018-03-17 12:32:40 +01:00
|
|
|
|
2022-07-31 22:08:12 +02:00
|
|
|
struct cw_DiscoveryCache * discovery_cache;
|
2018-03-17 12:32:40 +01:00
|
|
|
|
2022-07-31 22:08:12 +02:00
|
|
|
int ac_global_init()
|
|
|
|
{
|
|
|
|
/* initialize discovery cache */
|
|
|
|
discovery_cache = discovery_cache_create(100);
|
|
|
|
if (discovery_cache==NULL)
|
|
|
|
goto errX;
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
errX:
|
|
|
|
return 0;
|
|
|
|
}
|
2018-03-17 12:32:40 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/mod.h"
|
2018-03-11 00:56:41 +01:00
|
|
|
extern struct cw_Mod * cw_get_mod_ac (const char *name);
|
2016-02-22 09:18:35 +01:00
|
|
|
|
2016-03-03 20:46:20 +01:00
|
|
|
#include "cw/mlist.h"
|
2016-02-28 13:41:45 +01:00
|
|
|
|
|
|
|
|
2018-02-24 00:30:44 +01:00
|
|
|
extern void test_sets();
|
2018-02-26 12:21:50 +01:00
|
|
|
#include "cw/file.h"
|
2022-07-31 17:15:32 +02:00
|
|
|
#include "cw/val.h"
|
2018-02-24 00:30:44 +01:00
|
|
|
|
2018-03-03 08:15:19 +01:00
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
#include "discovery_cache.h"
|
2022-07-31 09:49:14 +02:00
|
|
|
/*
|
|
|
|
{
|
|
|
|
cw_Cfg_t * cfg;
|
|
|
|
cfg=cw_cfg_create();
|
2022-07-31 17:15:32 +02:00
|
|
|
char *val;
|
2022-07-31 09:49:14 +02:00
|
|
|
|
|
|
|
cw_cfg_load("tube.akv",cfg);
|
2022-07-30 19:44:57 +02:00
|
|
|
|
2022-07-31 09:49:14 +02:00
|
|
|
// cw_cfg_set(cfg,"cisco/tube","99");
|
|
|
|
// cw_cfg_set(cfg,"Hello","30");
|
|
|
|
|
|
|
|
cw_cfg_dump(cfg);
|
2022-07-30 19:44:57 +02:00
|
|
|
|
2022-07-31 17:15:32 +02:00
|
|
|
val = cw_cfg_get(cfg,"birth");
|
|
|
|
if (val){
|
|
|
|
printf("Birts: %s\n",val);
|
|
|
|
}
|
2022-07-31 09:49:14 +02:00
|
|
|
|
2022-07-31 17:15:32 +02:00
|
|
|
mavl_destroy(cfg);
|
|
|
|
}
|
|
|
|
cw_Val_t x;
|
|
|
|
CW_TYPE_STR->from_str(&x,"hallo");
|
|
|
|
x.type->del(&x);
|
2022-07-31 09:49:14 +02:00
|
|
|
|
2022-07-31 17:15:32 +02:00
|
|
|
return 0;
|
|
|
|
*/
|
2022-07-31 09:49:14 +02:00
|
|
|
|
2022-08-09 09:52:30 +02:00
|
|
|
static cw_Cfg_t * global_cfg = NULL;
|
2018-03-12 11:22:06 +01:00
|
|
|
|
2022-07-31 22:08:12 +02:00
|
|
|
|
|
|
|
int main (int argc, char *argv[])
|
|
|
|
{
|
|
|
|
int rc = 0;
|
|
|
|
struct bootcfg bootcfg;
|
|
|
|
|
2022-08-13 09:47:12 +02:00
|
|
|
/* parse arguments */
|
|
|
|
parse_args (argc, argv, &bootcfg);
|
|
|
|
|
2022-08-11 00:21:01 +02:00
|
|
|
|
2022-07-31 22:08:12 +02:00
|
|
|
global_cfg=cw_cfg_create();
|
|
|
|
if (!global_cfg){
|
|
|
|
fprintf(stderr,"Can't create global_cfg: %s\n",strerror(errno));
|
|
|
|
goto errX;
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = cw_cfg_load(bootcfg.cfgfilename,global_cfg);
|
|
|
|
if (rc)
|
|
|
|
{
|
2022-08-01 10:01:25 +02:00
|
|
|
if (rc)
|
2022-07-31 22:08:12 +02:00
|
|
|
fprintf(stderr,"Can't load cfg '%s': %s\n",bootcfg.cfgfilename,strerror(errno));
|
|
|
|
goto errX;
|
|
|
|
};
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
cw_log_name = "AC-Tube";
|
2022-08-14 12:26:34 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
cw_Cfg_t * cfg = global_cfg;
|
|
|
|
struct cw_Cfg_entry e, *result;
|
|
|
|
|
|
|
|
e.key="hi";
|
|
|
|
|
|
|
|
rc = cw_cfg_base_exists(cfg,"ac-descriptor");
|
|
|
|
if (!rc ){
|
|
|
|
printf("No!\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("RESULT: %d\n",rc);
|
|
|
|
|
|
|
|
cw_cfg_set(tcfg,"tube.0","hallo");
|
|
|
|
cw_cfg_set(tcfg,"tube.1","welt");
|
|
|
|
cw_cfg_set(tcfg,"tube.2","der guten laune");
|
|
|
|
cw_cfg_dump(tcfg);
|
|
|
|
|
|
|
|
printf("Next Index: %d\n",cw_cfg_get_next_index(tcfg,"kinder"));
|
|
|
|
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
*/
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
2018-05-02 11:03:05 +02:00
|
|
|
|
2015-04-29 12:42:04 +02:00
|
|
|
/* Init DTLS library */
|
|
|
|
dtls_init();
|
2018-04-02 21:00:37 +02:00
|
|
|
|
2015-04-05 02:07:59 +02:00
|
|
|
ac_global_init();
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
if (!socklist_init())
|
|
|
|
goto errX;
|
2022-07-31 23:00:20 +02:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
if (!wtplist_init())
|
|
|
|
goto errX;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
if (!dataman_list_init())
|
|
|
|
goto errX;
|
2022-08-01 10:01:25 +02:00
|
|
|
|
2022-08-23 02:35:54 +02:00
|
|
|
|
|
|
|
|
2022-08-01 10:01:25 +02:00
|
|
|
ac_conf_init(global_cfg);
|
|
|
|
|
2022-08-24 00:29:26 +02:00
|
|
|
if (!start_rpc(global_cfg))
|
2022-08-23 02:35:54 +02:00
|
|
|
goto errX;
|
|
|
|
|
|
|
|
|
|
|
|
// cw_cfg_dump(global_cfg);
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-08 23:14:11 +02:00
|
|
|
cw_log (LOG_INFO, "Starting AC-Tube, Name=%s, ID=%s", cw_cfg_get(global_cfg,"capwap/ac-name",NULL), conf_acid);
|
2022-08-01 10:01:25 +02:00
|
|
|
rc = ac_run(global_cfg);
|
2022-07-31 23:00:20 +02:00
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
errX:
|
2022-07-31 22:08:12 +02:00
|
|
|
if (global_cfg)
|
2022-08-22 01:59:23 +02:00
|
|
|
cw_cfg_destroy(global_cfg);
|
2022-07-31 22:08:12 +02:00
|
|
|
|
2022-07-31 23:00:20 +02:00
|
|
|
if (discovery_cache)
|
|
|
|
discovery_cache_destroy(discovery_cache);
|
2022-07-31 22:08:12 +02:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
wtplist_destroy();
|
|
|
|
socklist_destroy();
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2015-04-05 02:07:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
void process_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len);
|
2014-07-26 20:29:30 +02:00
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
void process_cw_data_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len);
|
2014-07-26 20:29:30 +02:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
|
2022-08-08 23:14:11 +02:00
|
|
|
|
2022-08-01 10:01:25 +02:00
|
|
|
int ac_run(cw_Cfg_t * cfg)
|
2014-07-11 22:12:11 +02:00
|
|
|
{
|
2022-08-08 23:14:11 +02:00
|
|
|
struct cw_Cfg_iter cfi;
|
|
|
|
const char *s;
|
2022-08-19 22:23:55 +02:00
|
|
|
struct cw_Cfg_entry *e;
|
2022-08-08 23:14:11 +02:00
|
|
|
int i;
|
2014-07-11 22:12:11 +02:00
|
|
|
|
2022-08-01 10:01:25 +02:00
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
/* it is important to create the unicast sockets first,
|
|
|
|
* because when we create the mcast an bcast sockets next
|
2014-07-11 22:12:11 +02:00
|
|
|
* we will look for already created sockets to find a
|
|
|
|
* good unicast reply socket */
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-08 23:14:11 +02:00
|
|
|
cw_cfg_iter_init(cfg, &cfi, "actube/listen");
|
2022-08-19 22:23:55 +02:00
|
|
|
for (i=0; (e = cw_cfg_iter_next(&cfi, NULL)) != NULL; i++) {
|
2022-08-08 23:14:11 +02:00
|
|
|
|
2016-02-17 16:16:39 +01:00
|
|
|
char addr[100];
|
|
|
|
char port[50];
|
|
|
|
int proto;
|
2022-08-19 22:23:55 +02:00
|
|
|
s=e->val;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-08 23:14:11 +02:00
|
|
|
conf_parse_listen_addr (s, addr, port, &proto);
|
|
|
|
socklist_add_unicast (addr, port, proto,
|
2022-08-22 01:59:23 +02:00
|
|
|
cw_cfg_get_bool(cfg,"actube/ipv4",1),
|
|
|
|
cw_cfg_get_bool(cfg,"actube/ipv6",1)
|
2022-08-08 23:14:11 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
if (!i) {
|
|
|
|
cw_log (LOG_ERR, "Fatal error: No listen addresses found.");
|
|
|
|
return 1;
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2022-08-01 10:01:25 +02:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (socklist_len == 0) {
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_log (LOG_ERR, "Fatal error: Could not setup any listen socket");
|
2014-07-11 22:12:11 +02:00
|
|
|
return 1;
|
|
|
|
}
|
2022-08-08 23:14:11 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
/* create multicast sockets */
|
2015-10-18 10:14:33 +02:00
|
|
|
for (i = 0; i < conf_mcast_groups_len; i++) {
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
socklist_add_multicast (conf_mcast_groups[i], conf_control_port,
|
|
|
|
AC_PROTO_CAPWAP);
|
2014-07-26 20:29:30 +02:00
|
|
|
#ifdef WITH_LWAPP
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (conf_lwapp)
|
2018-03-11 00:56:41 +01:00
|
|
|
socklist_add_multicast (conf_mcast_groups[i], conf_lw_control_port,
|
|
|
|
AC_PROTO_LWAPP);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
#endif
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2016-02-16 08:13:34 +01:00
|
|
|
/* broadcast socket ipv4 only */
|
2022-08-08 23:14:11 +02:00
|
|
|
|
|
|
|
//mavl_print(cfg,pcb,180);
|
|
|
|
|
|
|
|
cw_cfg_iter_init(cfg, &cfi, "actube/bcast");
|
2022-08-19 22:23:55 +02:00
|
|
|
for (i=0; (e = cw_cfg_iter_next(&cfi, NULL)) != NULL; i++) {
|
2022-08-08 23:14:11 +02:00
|
|
|
// for (i = 0; i < conf_bcast_addrs_len; i++) {
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
char addr[50], port[50];
|
2016-02-17 20:25:19 +01:00
|
|
|
int proto;
|
2022-08-19 22:23:55 +02:00
|
|
|
s=e->val;
|
2022-08-08 23:14:11 +02:00
|
|
|
conf_parse_listen_addr (s, addr, port, &proto);
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
socklist_add_broadcast (addr, port, proto);
|
2022-08-08 23:14:11 +02:00
|
|
|
|
|
|
|
|
2014-07-26 20:29:30 +02:00
|
|
|
#ifdef WITH_LWAPP
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
// printf("Adding %d\n",socklist_len);
|
|
|
|
if (conf_lwapp)
|
2018-03-11 00:56:41 +01:00
|
|
|
socklist_add_broadcast (conf_bcast_addrs[i], conf_lw_control_port,
|
|
|
|
AC_PROTO_LWAPP);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
// printf ("SI %d, PROTO: %d\n",socklist_len-1,socklist[socklist_len-1].ac_proto);
|
|
|
|
#endif
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-03-26 15:11:57 +02:00
|
|
|
/*//get_acinfo();*/
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
while (1) {
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
/* prepare fdset */
|
|
|
|
fd_set fset;
|
|
|
|
int max = 0;
|
2018-03-11 00:56:41 +01:00
|
|
|
FD_ZERO (&fset);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
for (i = 0; i < socklist_len; i++) {
|
2018-03-11 00:56:41 +01:00
|
|
|
FD_SET (socklist[i].sockfd, &fset);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (socklist[i].sockfd > max)
|
|
|
|
max = socklist[i].sockfd;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2016-03-20 15:48:13 +01:00
|
|
|
if (socklist[i].data_sockfd) {
|
2018-03-11 00:56:41 +01:00
|
|
|
FD_SET (socklist[i].data_sockfd, &fset);
|
|
|
|
|
2016-03-20 15:48:13 +01:00
|
|
|
if (socklist[i].sockfd > max)
|
|
|
|
max = socklist[i].sockfd;
|
|
|
|
}
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
/* wait for an event */
|
|
|
|
int n;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
while ( (n = select (max + 1, &fset, NULL, NULL, NULL)) < 0) {
|
2015-10-18 10:14:33 +02:00
|
|
|
if (errno != EINTR)
|
2014-07-11 22:12:11 +02:00
|
|
|
return n;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
/* process the received packet */
|
2015-10-18 10:14:33 +02:00
|
|
|
for (i = 0; i < socklist_len; i++) {
|
2014-07-11 22:12:11 +02:00
|
|
|
uint8_t buffer[4096];
|
2016-03-20 15:48:13 +01:00
|
|
|
struct sockaddr_storage srcaddr;
|
|
|
|
socklen_t srcaddrlen;
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
if (FD_ISSET (socklist[i].data_sockfd, &fset)) {
|
|
|
|
|
|
|
|
int len = sock_receive (socklist[i].data_sockfd,
|
|
|
|
buffer, sizeof (buffer),
|
|
|
|
0,
|
|
|
|
(struct sockaddr *) &srcaddr,
|
|
|
|
&srcaddrlen);
|
|
|
|
|
|
|
|
process_cw_data_packet (i, (struct sockaddr *) &srcaddr, buffer, len);
|
2016-03-20 15:48:13 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
if (FD_ISSET (socklist[i].sockfd, &fset)) {
|
|
|
|
|
|
|
|
int len = sock_receive (socklist[i].sockfd,
|
|
|
|
buffer, sizeof (buffer),
|
|
|
|
0,
|
|
|
|
(struct sockaddr *) &srcaddr,
|
|
|
|
&srcaddrlen);
|
|
|
|
|
|
|
|
process_ctrl_packet (i, (struct sockaddr *) &srcaddr, buffer, len);
|
2016-03-20 15:48:13 +01:00
|
|
|
}
|
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
void process_cw_data_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
|
2016-03-20 15:48:13 +01:00
|
|
|
{
|
2018-03-05 12:23:16 +01:00
|
|
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_dbg (DBG_X, "There is a data packet now");
|
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
dataman_list_lock();
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_dbg (DBG_X, "Dataman list locked, now getting");
|
|
|
|
struct dataman * dm = dataman_list_get (socklist[index].data_sockfd, addr);
|
|
|
|
cw_dbg (DBG_X, "Dataman list locked, now gotted");
|
|
|
|
|
|
|
|
cw_dbg (DBG_INFO, "Packet for dataman %s,%d", sock_addr2str_p (addr, sock_buf), socklist[index].data_sockfd);
|
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
if (!dm) {
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_dbg (DBG_INFO, "No dataman %s,%d", sock_addr2str_p (addr, sock_buf), socklist[index].data_sockfd);
|
|
|
|
dm = dataman_create (socklist[index].data_sockfd, addr);
|
|
|
|
|
|
|
|
if (!dm) {
|
|
|
|
cw_log (LOG_ERR, "Can't create dataman for packet from %s", sock_addr2str_p (addr, sock_buf));
|
2016-04-10 16:04:58 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
dataman_list_add (dm);
|
|
|
|
|
|
|
|
dataman_start (dm);
|
|
|
|
|
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
dataman_list_unlock();
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-13 09:47:12 +02:00
|
|
|
//dataman_add_packet (dm, buffer, len);
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2016-04-10 16:04:58 +02:00
|
|
|
return;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
exit (0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf ("Data packet received len = %d\n", len);
|
|
|
|
exit (0);
|
|
|
|
struct wtpman *wtpman = wtplist_get (addr);
|
|
|
|
|
|
|
|
if (!wtpman) {
|
|
|
|
cw_dbg (DBG_PKT_ERR, "Discarding packet on data channel from %s - No wtpman found.", sock_addr2str (addr, sock_buf));
|
2016-04-10 16:04:58 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
wtpman_addpacket (wtpman, buffer, len);
|
2016-03-20 15:48:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
void process_cw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
|
2014-07-11 22:12:11 +02:00
|
|
|
{
|
2018-03-05 12:23:16 +01:00
|
|
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
/* first of all check preamble */
|
2018-03-11 00:56:41 +01:00
|
|
|
int preamble = cw_get_hdr_preamble (buffer);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (preamble != CAPWAP_PACKET_PREAMBLE && preamble != CAPWAP_DTLS_PACKET_PREAMBLE) {
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_dbg (DBG_PKT_ERR,
|
|
|
|
"Discarding packet from %s, wrong preamble, preamble = 0x%01X",
|
|
|
|
sock_addr2str (addr, sock_buf), preamble);
|
2014-07-11 22:12:11 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
2014-07-11 22:12:11 +02:00
|
|
|
wtplist_lock();
|
2018-03-11 00:56:41 +01:00
|
|
|
struct wtpman *wtpman = wtplist_get (addr);
|
2018-04-02 01:39:08 +02:00
|
|
|
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (!wtpman) {
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-09 09:52:30 +02:00
|
|
|
wtpman = wtpman_create (index, addr, preamble & 0xf, global_cfg);
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (!wtpman) {
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_log (LOG_ERR, "Error creating wtpman: %s", strerror (errno));
|
2014-07-11 22:12:11 +02:00
|
|
|
wtplist_unlock();
|
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
if (!wtplist_add (wtpman)) {
|
|
|
|
cw_log (LOG_ERR, "Error adding wtpman: Too many wtp connections");
|
|
|
|
wtpman_destroy (wtpman);
|
2014-07-11 22:12:11 +02:00
|
|
|
wtplist_unlock();
|
|
|
|
return;
|
|
|
|
};
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
wtpman_start (wtpman, preamble & 0xf);
|
2014-07-11 22:12:11 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2022-08-13 09:47:12 +02:00
|
|
|
//printf("Got Packet with len: %d\n",len);
|
2022-08-10 13:16:09 +02:00
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
wtpman_addpacket (wtpman, buffer, len);
|
2014-07-11 22:12:11 +02:00
|
|
|
wtplist_unlock();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
/*
|
2018-03-11 00:56:41 +01:00
|
|
|
void process_lw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
|
2014-07-26 20:29:30 +02:00
|
|
|
{
|
2018-04-02 21:00:37 +02:00
|
|
|
//int sock = socklist[index].reply_sockfd;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
uint8_t *m = buffer + 6;
|
2018-03-11 00:56:41 +01:00
|
|
|
uint32_t val = ntohl (* ( (uint32_t *) (m)));
|
|
|
|
|
|
|
|
|
|
|
|
printf ("VAL: %08X\n", val);
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
// first of all check preamble
|
2018-03-11 00:56:41 +01:00
|
|
|
int version = LWTH_GET_VERSION (m);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (version != LW_VERSION) {
|
2018-04-02 21:00:37 +02:00
|
|
|
// cw_log_debug1("Discarding LWAPP packet, wrong verson");
|
2014-07-26 20:29:30 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
int l = LWTH_GET_LENGTH (m);
|
|
|
|
printf ("LEN = %d\n", l);
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (l + 12 != len) {
|
2018-04-02 21:00:37 +02:00
|
|
|
// cw_log_debug1("Discarding LWAPP packet, wrong length");
|
2014-07-26 20:29:30 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2014-07-26 20:29:30 +02:00
|
|
|
wtplist_lock();
|
2018-03-11 00:56:41 +01:00
|
|
|
struct wtpman *wtpman = wtplist_get (addr);
|
2018-04-02 01:39:08 +02:00
|
|
|
|
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (!wtpman) {
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
wtpman = wtpman_create (index, addr);
|
2018-04-02 01:39:08 +02:00
|
|
|
|
2015-10-18 10:14:33 +02:00
|
|
|
if (!wtpman) {
|
2018-03-11 00:56:41 +01:00
|
|
|
cw_log (LOG_ERR, "Error creating wtpman: %s", strerror (errno));
|
2014-07-26 20:29:30 +02:00
|
|
|
wtplist_unlock();
|
|
|
|
return;
|
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
if (!wtplist_add (wtpman)) {
|
|
|
|
cw_log (LOG_ERR, "Error adding wtpman: Too many wtp connections");
|
|
|
|
wtpman_destroy (wtpman);
|
2014-07-26 20:29:30 +02:00
|
|
|
wtplist_unlock();
|
|
|
|
return;
|
|
|
|
};
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
//wtpman_lw_start(wtpman);
|
2014-07-26 20:29:30 +02:00
|
|
|
}
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
//wtpman_lw_addpacket(wtpman,buffer,len);
|
2014-07-26 20:29:30 +02:00
|
|
|
wtplist_unlock();
|
|
|
|
}
|
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
*/
|
2014-07-26 20:29:30 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-03-11 00:56:41 +01:00
|
|
|
void process_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
|
2014-07-26 20:29:30 +02:00
|
|
|
{
|
2015-10-18 10:14:33 +02:00
|
|
|
switch (socklist[index].ac_proto) {
|
2014-07-26 20:29:30 +02:00
|
|
|
case AC_PROTO_CAPWAP:
|
2018-03-11 00:56:41 +01:00
|
|
|
process_cw_ctrl_packet (index, addr, buffer, len);
|
2014-07-26 20:29:30 +02:00
|
|
|
return;
|
2018-03-11 00:56:41 +01:00
|
|
|
|
2018-04-02 21:00:37 +02:00
|
|
|
/*case AC_PROTO_LWAPP:
|
2018-03-11 00:56:41 +01:00
|
|
|
process_lw_ctrl_packet (index, addr, buffer, len);
|
2018-04-02 21:00:37 +02:00
|
|
|
return;*/
|
2014-07-26 20:29:30 +02:00
|
|
|
}
|
|
|
|
}
|