als cisco join functions implemented

FossilOrigin-Name: b63ca45f023666ba12e838e0c313536bf2a41dd6170191e150723b4dfbad4ba7
This commit is contained in:
7u83@mail.ru 2018-04-07 17:26:22 +00:00
parent 85c11eb0cb
commit 195c76dc88
15 changed files with 314 additions and 76 deletions

View File

@ -8,7 +8,12 @@ OBJS=\
cisco_in_wtp_descriptor.o \
cisco_out_wtp_descriptor.o \
cisco_in_ac_descriptor.o\
cisco_out_ac_descriptor.o\
cisco_out_radio_generic.o\
cisco_out_ap_timesync.o\
cisco_in_spam_vendor_specific.o\
cisco_out_lw_path_mtu.o\
cisco_out_capwap_local_ip_address.o
# cisco80211.o \

View File

@ -73,7 +73,7 @@
#define CW_CISCO_AC_NAME_WITH_INDEX 91
#define CW_CISCO_SPAM_DOMAIN_SECRET 96
#define CW_CISCO_SPAM_VENDOR_SPECIFIC 104
#define CISCO_ELEM_SPAM_VENDOR_SPECIFIC 104
#define CW_CISCO_AP_UPTIME 108

View File

@ -22,6 +22,8 @@
#include "cw/msgset.h"
#include "cw/ktv.h"
#include "cw/keys.h"
#include "cw/proto.h"
#include "lwapp_cisco.h"
#include "capwap_cisco.h"
#include "mod_cisco.h"
@ -49,6 +51,19 @@ static cw_KTVStruct_t ap_time_sync[] = {
{NULL,NULL,0,0}
};
static cw_KTVStruct_t mwar_addr[] = {
{CW_TYPE_BYTE, "mwar-type", 1,-1},
{CW_TYPE_IPADDRESS, "address", 4,-1},
{CW_TYPE_WORD, "unknown", 2,-1},
{NULL,NULL,0,0}
};
static cw_KTVStruct_t cisco_lw_path_mtu[] = {
{CW_TYPE_WORD, "max", 2,-1},
{CW_TYPE_WORD, "len", 2,-1},
};
static struct cw_ElemHandler handlers[] = {
{
"WTP Descriptor (Draft 7)", /* name */
@ -69,7 +84,7 @@ static struct cw_ElemHandler handlers[] = {
NULL, /* type */
"ac-descriptor", /* Key */
cisco_in_ac_descriptor, /* get */
NULL, /*cisco_out_ac_descriptor */ /* put */
cisco_out_ac_descriptor /* put */
}
,
{
@ -102,7 +117,7 @@ static struct cw_ElemHandler handlers[] = {
ap_time_sync, /* type */
"cisco/ap-timesync", /* Key */
cw_in_generic_struct, /* handler */
NULL /* put */
cisco_out_ap_timesync /* put */
}
,
@ -128,6 +143,86 @@ static struct cw_ElemHandler handlers[] = {
cisco_out_radio_generic /* put */
}
,
{
"Session ID (Cisco min len = 4)", /* name */
CAPWAP_ELEM_SESSION_ID, /* Element ID */
0,0, /* Vendor / Proto */
4,CAPWAP_SESSION_ID_LEN, /* min/max length */
CW_TYPE_BSTR16, /* type */
"session-id", /* Key */
cw_in_generic, /* get */
cw_out_generic /* put */
}
,
{
"AP Group Name", /* name */
CISCO_ELEM_AP_GROUP_NAME, /* Element ID */
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
1,512, /* min/max length */
CW_TYPE_BSTR16, /* type */
"cisco/ap-group-name", /* Key */
cw_in_generic, /* get */
cw_out_generic /* put */
}
,
{
"MWAR Addr", /* name */
CISCO_ELEM_MWAR_ADDR, /* Element ID */
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
7,7, /* min/max length */
mwar_addr, /* type */
"cisco/mwar-addr", /* Key */
cw_in_generic_struct, /* get */
cw_out_generic_struct /* put */
}
,
{
"WTP IPv4 Address (Draft 7)", /* name */
CAPWAP_ELEM_WTP_IPV4_IP_ADDRESS, /* Element ID */
0,0, /* Vendor / Proto */
4,4, /* min/max length */
CW_TYPE_IPADDRESS, /* type */
"capwap-local-ip-address", /* Key */
cw_in_generic, /* get */
cisco_out_capwap_local_ip_address /* put */
}
,
{
"WTP IPv6 Address (Draft 7)", /* name */
CAPWAP_ELEM_WTP_IPV6_IP_ADDRESS, /* Element ID */
0,0, /* Vendor / Proto */
16,16, /* min/max length */
CW_TYPE_IPADDRESS, /* type */
"capwap-local-ip-address", /* Key */
cw_in_generic, /* get */
cisco_out_capwap_local_ip_address /* put */
}
,
{
"SPAM Vendor Specific", /* name */
CISCO_ELEM_SPAM_VENDOR_SPECIFIC, /* Element ID */
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
0,0, /* min/max length */
NULL, /* type */
"cisco_spam_vendor_specific", /* Key */
cisco_in_spam_vendor_specific, /* get */
NULL /* put */
}
,
{
"Path MTU", /* name */
CISCO_LWELEM_PATH_MTU, /* Element ID */
CW_VENDOR_ID_CISCO,CW_PROTO_LWAPP, /* Vendor / Proto */
0,0, /* min/max length */
cisco_lw_path_mtu, /* type */
"cisco/lw_path_mtu", /* Key */
cw_in_generic_struct, /* get */
cisco_out_lw_path_mtu /* put */
}
,
{0,0,0,0,0,0,0,0}
};
@ -152,6 +247,28 @@ static struct cw_ElemDef discovery_response_elements[] ={
};
static int join_request_states[] = {CAPWAP_STATE_JOIN,0};
static struct cw_ElemDef join_request_elements[] ={
{0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_GROUP_NAME, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_MWAR_ADDR, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC,1, CW_IGNORE},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_PATH_MTU, 0, 0},
{0,0, CAPWAP_ELEM_WTP_IPV4_IP_ADDRESS,1,0},
{0,0, CAPWAP_ELEM_WTP_IPV6_IP_ADDRESS,1,0},
{0,0,CAPWAP_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS, 0, CW_DELETE},
{0,0,CAPWAP_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS, 0, CW_DELETE},
{0,0, CAPWAP_ELEM_ECN_SUPPORT, 0, CW_DELETE},
{0,0,0,00}
};
static struct cw_MsgDef messages[] = {
{
@ -168,6 +285,13 @@ static struct cw_MsgDef messages[] = {
discovery_response_states,
discovery_response_elements
},
{
NULL, /* name */
CAPWAP_MSG_JOIN_REQUEST, /* type */
CW_ROLE_AC,
join_request_states,
join_request_elements
},
{0,0,0,0}
};

View File

@ -129,7 +129,7 @@ static cw_action_in_t actions_in[] = {
.capwap_state = CW_STATE_RUN,
.vendor_id = CW_VENDOR_ID_CISCO,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CW_CISCO_AP_GROUP_NAME,
.elem_id = CISCO_ELEM_AP_GROUP_NAME,
.item_id = CIPWAP_ITEM_WTP_GROUP_NAME,
.start = cw_in_generic,
.min_len = 0,
@ -222,7 +222,7 @@ static cw_action_in_t actions_in[] = {
.capwap_state = CW_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_SPAM_VENDOR_SPECIFIC,
.elem_id = CISCO_ELEM_SPAM_VENDOR_SPECIFIC,
.start = lw_in_vendor_specific,
}
@ -232,7 +232,7 @@ static cw_action_in_t actions_in[] = {
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_SPAM_VENDOR_SPECIFIC,
.elem_id = CISCO_ELEM_SPAM_VENDOR_SPECIFIC,
.start = lw_in_vendor_specific,
}
,
@ -317,7 +317,7 @@ static cw_action_out_t actions_out[]={
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_GROUP_NAME,
.elem_id = CISCO_ELEM_AP_GROUP_NAME,
.item_id = CIPWAP_ITEM_WTP_GROUP_NAME,
.out = cw_out_generic,
/*.get = cw_out_get_config,*/

View File

@ -1,13 +1,29 @@
#include "cw/action.h"
#include "cw/lw.h"
#include "cw/dbg.h"
#include "cw/proto.h"
int cisco_in_spam_vendor_specific(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
struct sockaddr *from)
int cisco_in_spam_vendor_specific(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params,
uint8_t * data, int len)
{
struct cw_ElemHandler *vhandler;
uint32_t vendor_id, elem_id;
vendor_id = cw_get_dword(data);
elem_id = cw_get_word(data + 4);
return lw_in_vendor_specific(conn,a,data+6,len-6,from);
cw_dbg(DBG_X,"Cwin vendor spam");
return 0;
vhandler = cw_msgset_get_elemhandler(params->conn->msgset,CW_PROTO_LWAPP,vendor_id,elem_id);
if (!vhandler) {
cw_dbg(DBG_WARN,
"Can't handle Vendor Specific LWAPP Payload %s/%d, in msg %d (%s) in %s state.",
cw_strvendor(vendor_id), elem_id, params->msgdata->type,
params->msgdata->name, cw_strstate(params->conn->capwap_state));
return 0;
}
return cw_process_element(params,CW_PROTO_LWAPP,vendor_id,elem_id,data+6,len-6);
}

View File

@ -1,73 +1,86 @@
/*
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.
actube 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/>.
*/
#include "cw/log.h"
#include "cw/dbg.h"
#include "cw/conn.h"
#include "cw/capwap.h"
#include "cw/cw.h"
#include "cw/ktv.h"
#include "cw/keys.h"
extern mbag_t cisco_config;
int cisco_out_ac_descriptor(struct conn *conn,struct cw_action_out * a,uint8_t *dst)
{
uint8_t *d = dst+4;
struct mbag_item * i;
i = mbag_get(conn->local,CW_ITEM_AC_STATUS);
static int put_ac_status(mavl_t global, mavl_t local, uint8_t *dst, const char * parent_key){
uint8_t *d = dst;
uint8_t security;
char key[CW_KTV_MAX_KEY_LEN];
if (!i) {
cw_log(LOG_ERR,"Can't send AC Descriptor, no AC Status Item found");
return 0;
}
d+=cw_put_ac_status(d ,(struct cw_ac_status*)(i->u2.data),conn);
i = mbag_get(cisco_config,CW_ITEM_AC_SOFTWARE_VERSION);
if (!i){
/* Send back the same software version as the WTP has,
otherwise the AP wants us to send an image */
i = mbag_get(conn->incomming,CW_ITEM_WTP_SOFTWARE_VERSION);
}
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));
/*
if ( i ) {
d += cw_put_version(d,1,i->u2.data);
}
else {
cw_log(LOG_ERR, "Can't set Cisco Software Version in AC descriptor, No value defined.");
}
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;
i = mbag_get(cisco_config, CW_ITEM_AC_HARDWARE_VERSION);
if ( i ) {
d += cw_put_version(d,0,i->u2.data);
if (security == 0){
cw_log(LOG_WARNING,"No AC security selected");
}
else {
cw_log(LOG_ERR, "Can't set Cisco Hardware Version in AC descriptor, No value defined.");
}
*/
int len = d-dst-4;
d += cw_put_byte(dst,security);
*/
sprintf(key,"%s/%s",parent_key,"ac-descriptor/r-mac-field");
d += cw_put_byte(d,cw_ktv_get_byte(global,"ac-descriptor/r-mac-field",0));
/*d += cw_put_byte(d,3);*/
return len + cw_put_elem_hdr(dst,a->elem_id,len);
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;
}
int cisco_out_ac_descriptor(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst)
{
int len,l;
uint8_t *d = dst+4;
char key[CW_KTV_MAX_KEY_LEN];
d+=put_ac_status(params->conn->local_cfg,
params->conn->global_cfg,
d, eh->key);
/* it is important to send software version first,
* because APs don't check the type */
sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE);
d+=cw_write_descriptor_subelem (d, params->conn->local_cfg,
1, key);
sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE);
d+=cw_write_descriptor_subelem (d, params->conn->local_cfg,
0, key);
len = d-dst-4;
l = len + cw_put_elem_hdr(dst,eh->id,len);
cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,eh,dst,l);
return l;
}

View File

@ -1,12 +1,20 @@
#include <stdint.h>
#include <time.h>
#include "cisco.h"
#include "cw/capwap_cisco.h"
int cisco_out_ap_timesync(struct conn *conn,struct cw_action_out * a,uint8_t *dst)
#include "cw/msgset.h"
#include "cw/cw.h"
int cisco_out_ap_timesync(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst)
{
int l = cw_put_cisco_ap_timesync(dst+10,time(NULL),0);
return l + cw_put_elem_vendor_hdr(dst, a->vendor_id, a->elem_id, l);
cw_set_dword(dst+10 , time(NULL));
cw_set_byte(dst+10 + 4, 0);
return 5 + cw_put_elem_vendor_hdr(dst, eh->vendor , eh->id, 5);
}

View File

@ -0,0 +1,16 @@
#include "mod_cisco.h"
#include "cw/cw.h"
int cisco_out_capwap_local_ip_address(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst)
{
cw_KTV_t * ip;
ip = cw_ktv_get(params->conn->local_cfg,eh->key,CW_TYPE_IPADDRESS);
if (ip==NULL){
return 0;
}
return cw_put_local_ip_address(dst,eh->id,
CAPWAP_ELEM_WTP_IPV4_IP_ADDRESS,
CAPWAP_ELEM_WTP_IPV6_IP_ADDRESS,
ip->type->data(ip),ip->type->len(ip));
}

View File

@ -0,0 +1,31 @@
#include "cw/lw.h"
#include "cw/cw.h"
#include "capwap_cisco.h"
#include "mod_cisco.h"
int cisco_out_lw_path_mtu(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst)
{
char key[CW_KTV_MAX_KEY_LEN];
int len,max;
sprintf(key,"%s/%s",eh->key,"len");
len = cw_ktv_get_word(params->conn->local_cfg,key,0);
if (len == 0)
return 0;
sprintf(key,"%s/%s",eh->key,"max");
max = cw_ktv_get_word(params->conn->local_cfg,key,0);
lw_set_word(dst+16,max);
lw_set_word(dst+16+2,len);
memset(dst+16+4,0,len-4);
/* put the lwap elem header */
lw_set_dword(dst + 10, eh->vendor);
lw_set_word(dst + 14, eh->id);
return len + 6 + cw_put_elem_vendor_hdr(dst, eh->vendor, CISCO_ELEM_SPAM_VENDOR_SPECIFIC, len+6);
}

View File

@ -25,7 +25,7 @@ uint8_t arr1[] = {
int l=sizeof(arr1);
l = l + lw_put_vendor(dst+10, LW_VENDOR_ID_CISCO, LW_CISCO_DOT11R_WLC_MAC_AND_IP, l);
return l+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_SPAM_VENDOR_SPECIFIC,l);
return l+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CISCO_ELEM_SPAM_VENDOR_SPECIFIC,l);
@ -37,6 +37,6 @@ uint8_t arr1[] = {
memcpy(d,&(((struct sockaddr_in *) &ss)->sin_addr),4);
l=4;
l = l + lw_put_vendor(dst+10, LW_VENDOR_ID_CISCO, LW_CISCO_MANAGER_IP_ADDR, l);
return l+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_SPAM_VENDOR_SPECIFIC,l);
return l+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CISCO_ELEM_SPAM_VENDOR_SPECIFIC,l);
}

View File

@ -50,7 +50,7 @@ int cw_cisco_put_telnet_ssh(struct conn *conn,uint8_t type,const char * item_id,
if (l==0)
return 0;
cw_dbg(DBG_X,"CISL = %d",l);
return l + cw_put_elem_vendor_hdr(dst, CW_VENDOR_ID_CISCO, CW_CISCO_SPAM_VENDOR_SPECIFIC, l);
return l + cw_put_elem_vendor_hdr(dst, CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC, l);
}

View File

@ -21,7 +21,7 @@
#include <stdint.h>
#include "lwapp.h"
#include "cw/lwapp.h"
/**
@ -42,7 +42,7 @@
#define LW_CISCO_PRIMED_DISCOVERY_TIMEOUT 50
#define LW_CISCO_DELETE_WLAN 52
#define LW_CISCO_PATH_MTU 73
#define CISCO_LWELEM_PATH_MTU 73
#define LW_CISCO_PRIMED_JOIN_TIMEOUT 85
#define LW_CISCO_AP_DTLS_DATA_CFG 74

View File

@ -1,6 +1,8 @@
#ifndef __MOD_CISCO_H
#define __MOD_CISCO_H
#include <stdint.h>
#include "cw/msgset.h"
int cisco_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams * params, uint8_t * data,
int len);
@ -11,10 +13,32 @@ int cisco_out_wtp_descriptor(struct cw_ElemHandler * handler, struct cw_ElemHand
int cisco_in_ac_descriptor(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params,
uint8_t * data, int len);
int cisco_out_ac_descriptor(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst);
int cisco_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
, uint8_t * dst);
int cisco_out_ap_timesync(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst);
int cisco_in_spam_vendor_specific(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params,
uint8_t * data, int len);
int cisco_in_lw_path_mtu(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params,
uint8_t * data, int len);
int cisco_out_capwap_local_ip_address(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst);
int cisco_out_lw_path_mtu(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst);
struct cw_MsgSet * cisco_register_msg_set(struct cw_MsgSet * set, int mode);
#endif

View File

@ -195,6 +195,7 @@ int static setup_cfg(struct conn * conn)
{
int security;
security = cw_setup_dtls(conn,conn->local_cfg,"cisco",CAPWAP_CIPHER);
cw_ktv_set_byte(conn->local_cfg,"ac-descriptor/security",security);