New Msg elements.
FossilOrigin-Name: da49daaf31e87aedf07df5cbb40ec0ebdb7c2c4d4ea4370b84cfe2d5a86306b7
This commit is contained in:
parent
fef05e5f37
commit
d6aa56ded4
@ -165,9 +165,11 @@ int main (int argc, const char * argv[])
|
||||
|
||||
/* Locad CAPWAP base protocol */
|
||||
if (conf_capwap_mode==CW_MODE_CIPWAP){
|
||||
cw_dbg(DBG_INFO,"Locading CIPWAP Aactions");
|
||||
cw_register_actions_cipwap_ac(&capwap_actions);
|
||||
}
|
||||
else {
|
||||
cw_dbg(DBG_INFO,"Locading standard CAPWAP Aactions");
|
||||
cw_register_actions_capwap_ac(&capwap_actions);
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ uint8_t conf_macaddress_len=0;
|
||||
|
||||
|
||||
long conf_strict_capwap=1;
|
||||
long conf_strict_headers=1;
|
||||
long conf_strict_headers=0;
|
||||
char * conf_capwap_mode_str=NULL;
|
||||
int conf_capwap_mode=CW_MODE_STD;
|
||||
|
||||
|
@ -110,9 +110,8 @@ static void wtpman_run_discovery(void *arg)
|
||||
struct conn * conn = wtpman->conn;
|
||||
|
||||
|
||||
conn->capwap_mode=CW_MODE_CIPWAP;
|
||||
conn->config = mbag_create();
|
||||
conn->radios = mbag_create();
|
||||
//conn->config = mbag_create();
|
||||
//conn->radios = mbag_create();
|
||||
|
||||
|
||||
time_t timer = cw_timer_start(10);
|
||||
@ -129,7 +128,6 @@ conn->radios = mbag_create();
|
||||
*/
|
||||
|
||||
|
||||
wtpman->conn->local = ac_config;
|
||||
wtpman->conn->outgoing = mbag_create();
|
||||
wtpman->conn->incomming = mbag_create();
|
||||
|
||||
@ -226,7 +224,7 @@ static int wtpman_join(void *arg, time_t timer)
|
||||
|
||||
wtpman->conn->outgoing = mbag_create();
|
||||
wtpman->conn->incomming = mbag_create();
|
||||
wtpman->conn->local = ac_config;
|
||||
// wtpman->conn->local = ac_config;
|
||||
|
||||
mbag_set_str(conn->local,CW_ITEM_AC_NAME,conf_acname);
|
||||
|
||||
@ -440,8 +438,7 @@ static void wtpman_run(void *arg)
|
||||
conn->capwap_state=CW_STATE_RUN;
|
||||
|
||||
rc = 0;
|
||||
while (!cw_timer_timeout(timer)
|
||||
&& wtpman->conn->capwap_state == CW_STATE_RUN) {
|
||||
while (wtpman->conn->capwap_state == CW_STATE_RUN) {
|
||||
rc = cw_read_messages(wtpman->conn);
|
||||
if (rc < 0) {
|
||||
if (errno != EAGAIN)
|
||||
@ -485,6 +482,10 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr)
|
||||
wtpman->conn->strict_capwap = conf_strict_capwap;
|
||||
wtpman->conn->strict_hdr = conf_strict_headers;
|
||||
wtpman->conn->radios=mbag_create();
|
||||
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;
|
||||
|
||||
return wtpman;
|
||||
}
|
||||
|
@ -125,6 +125,7 @@ CAPWAPOBJS= \
|
||||
cw_in_vendor_specific_payload.o \
|
||||
cw_in_wtp_board_data.o \
|
||||
cw_in_check_disc_req.o \
|
||||
cw_in_check_chng_state_evnt_req.o\
|
||||
cw_in_check_disc_resp.o\
|
||||
cw_in_check_join_req.o \
|
||||
cw_in_check_cipwap_join_req.o \
|
||||
@ -138,6 +139,7 @@ CAPWAPOBJS= \
|
||||
cw_out_cisco_ac_descriptor.o \
|
||||
cw_out_cisco_ap_timesync.o \
|
||||
cw_in_cisco_image_identifier.o\
|
||||
cw_in_ac_descriptor.o\
|
||||
cw_out_capwap_local_ip_address.o\
|
||||
cw_out_capwap_control_ip_addr_list.o \
|
||||
cw_in_capwap_control_ipv4_address.o\
|
||||
|
@ -1113,10 +1113,14 @@ int cw_out_radio_administrative_states(struct conn *conn, struct cw_action_out *
|
||||
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
@ -130,7 +130,7 @@
|
||||
|
||||
#define CW_ACTION_IN_AC_DESCRIPTOR \
|
||||
CW_ELEM_AC_DESCRIPTOR, /* Element ID*/ \
|
||||
cw_in_generic, 0, /* start/end callback */ \
|
||||
cw_in_ac_descriptor, 0, /* start/end callback */ \
|
||||
MBAG_DATA, /* Type of element */ \
|
||||
CW_ITEM_AC_DESCRIPTOR, /* ID to use store */ \
|
||||
12, 8192 /* min/max length */
|
||||
|
@ -137,9 +137,9 @@ cw_action_in_t capwap_actions_ac_in[] = {
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/* Message: Change State Request - in Config State */
|
||||
/* Message: Change State Event Request - in Config State */
|
||||
{0, 0, CW_STATE_CONFIGURE, CW_MSG_CHANGE_STATE_EVENT_REQUEST, 0,
|
||||
0, 0}
|
||||
cw_in_check_chng_state_evnt_req, 0}
|
||||
,
|
||||
|
||||
/* Element: Result Code */
|
||||
@ -148,6 +148,18 @@ cw_action_in_t capwap_actions_ac_in[] = {
|
||||
,
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/* Message: Change State Event Request - in Config State */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_CHANGE_STATE_EVENT_REQUEST, 0,
|
||||
cw_in_check_chng_state_evnt_req, 0}
|
||||
,
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
@ -163,6 +175,25 @@ cw_action_in_t capwap_actions_ac_in[] = {
|
||||
,
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/* WTP Event Request */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_WTP_EVENT_REQUEST, 0,
|
||||
0, 0 }
|
||||
,
|
||||
/* Vendor Specific Payload */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_WTP_EVENT_REQUEST,
|
||||
CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD}
|
||||
,
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/* Echoh Request */
|
||||
{0, 0, CW_STATE_RUN, CW_MSG_ECHO_REQUEST, 0,
|
||||
0, 0 }
|
||||
,
|
||||
|
||||
|
||||
{0, 0, 0}
|
||||
@ -211,11 +242,16 @@ cw_action_out_t capwap_actions_ac_out[] = {
|
||||
CW_ELEM_AC_NAME, NULL, cw_out_generic, cw_out_get_local,1}
|
||||
,
|
||||
|
||||
/* AC Name */
|
||||
/* Local IP Address */
|
||||
{CW_MSG_JOIN_RESPONSE, CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS, 0,
|
||||
0, NULL, cw_out_capwap_local_ip_address, NULL,1}
|
||||
,
|
||||
|
||||
/* List of CAPWAP Control IPv4 and IPv6 addresses */
|
||||
{CW_MSG_JOIN_RESPONSE, CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST, 0,
|
||||
0, NULL, cw_out_capwap_control_ip_addr_list, cw_out_get_outgoing}
|
||||
,
|
||||
|
||||
|
||||
|
||||
|
||||
@ -266,6 +302,20 @@ cw_action_out_t capwap_actions_ac_out[] = {
|
||||
,
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* WTP Event Response OUT
|
||||
*/
|
||||
|
||||
{CW_MSG_WTP_EVENT_RESPONSE, CW_ITEM_NONE}
|
||||
,
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* Echo Response
|
||||
*/
|
||||
|
||||
{CW_MSG_ECHO_RESPONSE, CW_ITEM_NONE}
|
||||
,
|
||||
|
||||
|
||||
/* End of list */
|
||||
|
@ -141,6 +141,15 @@ cw_action_out_t cipwap_actions_ac_out[] = {
|
||||
,
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* Echo Response OUT
|
||||
*/
|
||||
|
||||
{CW_MSG_ECHO_RESPONSE, CW_ITEM_AC_TIMESTAMP, CW_VENDOR_ID_CISCO,
|
||||
CW_CISCO_AP_TIMESYNC, NULL,cw_out_cisco_ap_timesync, 0}
|
||||
,
|
||||
|
||||
|
||||
|
||||
|
||||
{0,0,0}
|
||||
|
@ -1,9 +1,130 @@
|
||||
|
||||
#include "capwap.h"
|
||||
#include "capwap_items.h"
|
||||
#include "dbg.h"
|
||||
#include "mbag.h"
|
||||
|
||||
|
||||
int cw_in_ac_descriptor(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len)
|
||||
/*
|
||||
static int read_subelem_cisco(struct ac_info* acinfo,int subtype,uint8_t * elem, int len)
|
||||
{
|
||||
switch (subtype) {
|
||||
case 0:
|
||||
bstr_replace(&acinfo->hardware_version,bstr_create(elem,len));
|
||||
break;
|
||||
case 1:
|
||||
bstr_replace(&acinfo->software_version,bstr_create(elem,len));
|
||||
break;
|
||||
|
||||
default:
|
||||
//printf("What? %d\n",subtype);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
static int read_subelem(struct ac_info* acinfo,int subtype,uint8_t *elem, int len)
|
||||
{
|
||||
switch (subtype){
|
||||
case 0:
|
||||
case 4:
|
||||
bstr_replace(&acinfo->hardware_version,bstr_create(elem,len));
|
||||
break;
|
||||
case 1:
|
||||
case 5:
|
||||
bstr_replace(&acinfo->software_version,bstr_create(elem,len));
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int read_subeelms(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len,struct sockaddr *from)
|
||||
{
|
||||
int sub=12;
|
||||
int sublen;
|
||||
|
||||
|
||||
while (sub<len){
|
||||
if (len-sub<8)
|
||||
return 0;
|
||||
|
||||
|
||||
uint32_t vendor_id = cw_get_dword(data+sub);
|
||||
int sublen = cw_get_word(data+sub+6);
|
||||
int subtype = cw_get_word(data+sub+4);
|
||||
printf("substart : %d\n",sub);
|
||||
|
||||
vendorstr_t vstr=NULL;
|
||||
switch (subtype){
|
||||
case 0:
|
||||
case 4:
|
||||
/* hardware version */
|
||||
vstr = mbag_set_vendorstr(conn->incomming,CW_ITEM_AC_HARDWARE_VERSION,
|
||||
vendor_id,data+sub+8,sublen);
|
||||
break;
|
||||
case 1:
|
||||
case 5:
|
||||
/* software version */
|
||||
vstr = mbag_set_vendorstr(conn->incomming,CW_ITEM_AC_SOFTWARE_VERSION,
|
||||
vendor_id,data+sub+8,sublen);
|
||||
break;
|
||||
}
|
||||
|
||||
cw_dbg_version_subelem(DBG_SUBELEM,"AC Descriptor", subtype, vstr);
|
||||
|
||||
|
||||
if (sub+sublen>len)
|
||||
return -1;
|
||||
|
||||
sub+=sublen+8;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int cw_in_ac_descriptor(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len,struct sockaddr *from)
|
||||
{
|
||||
struct cw_ac_status *status = malloc(sizeof(struct cw_ac_status));
|
||||
if (!status)
|
||||
return 0;
|
||||
|
||||
status->stations = cw_get_word(data);
|
||||
status->limit = cw_get_word(data+2);
|
||||
status->active_wtps=cw_get_word(data+4);
|
||||
status->max_wtps=cw_get_word(data+6);
|
||||
status->security=cw_get_byte(data+8);
|
||||
status->rmac_field=cw_get_byte(data+9);
|
||||
status->dtls_policy=cw_get_byte(data+11);
|
||||
|
||||
cw_dbg(DBG_SUBELEM,"AC Desriptor: WTPs:%d/%d, Stations:%d/%d, Security:%d, Rmac:%d, DTLS-Policy:%d",
|
||||
status->active_wtps,status->max_wtps,
|
||||
status->stations,status->limit,
|
||||
status->security,
|
||||
status->rmac_field,
|
||||
status->dtls_policy);
|
||||
|
||||
|
||||
mbag_set_ptr(conn->incomming,CW_ITEM_AC_STATUS,status);
|
||||
|
||||
read_subeelms(conn,a,data,len,from);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -21,15 +21,26 @@ int cw_out_cisco_ac_descriptor(struct conn *conn,struct cw_action_out * a,uint8_
|
||||
d+=cw_put_ac_status(d ,(struct cw_ac_status*)(i->data));
|
||||
|
||||
|
||||
i = mbag_get(conn->local,CW_ITEM_AC_SOFTWARE_VERSION);
|
||||
|
||||
// i = mbag_get(conn->local,CW_ITEM_AC_SOFTWARE_VERSION);
|
||||
i = mbag_get(conn->incomming,CW_ITEM_WTP_SOFTWARE_VERSION);
|
||||
if ( i ) {
|
||||
d += cw_put_version(d,5,i->data);
|
||||
d += cw_put_version(d,1,i->data);
|
||||
}
|
||||
else {
|
||||
cw_log(LOG_ERR, "Can't set Software Version in AC descriptor, No value defined.");
|
||||
cw_log(LOG_ERR, "Can't set Cisco Software Version in AC descriptor, No value defined.");
|
||||
}
|
||||
|
||||
i = mbag_get(conn->local,CW_ITEM_AC_HARDWARE_VERSION);
|
||||
if ( i ) {
|
||||
d += cw_put_version(d,0,i->data);
|
||||
}
|
||||
else {
|
||||
cw_log(LOG_ERR, "Can't set Cisco Hardware Version in AC descriptor, No value defined.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int len = d-dst-4;
|
||||
|
||||
return len + cw_put_elem_hdr(dst,a->elem_id,len);
|
||||
|
@ -511,6 +511,64 @@ int cw_format_item(char *dst,mbag_item_t * item)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cw_format_version(char *s, vendorstr_t ver, char * def)
|
||||
{
|
||||
if (!ver)
|
||||
return sprintf(s,"%s",def);
|
||||
|
||||
|
||||
uint8_t * version = vendorstr_data(ver);
|
||||
int len = vendorstr_len(ver);
|
||||
|
||||
|
||||
|
||||
int rs=0;
|
||||
int i;
|
||||
|
||||
|
||||
if ( cw_is_utf8(version,len) ){
|
||||
if (len != 0 )
|
||||
rs+=sprintf(s+rs,"%.*s",len,version);
|
||||
else
|
||||
rs+=sprintf(s+rs,"''");
|
||||
}
|
||||
else{
|
||||
for (i=0; i<len && i<20; i++){
|
||||
rs+=sprintf(s+rs,"%02X",version[i]);
|
||||
}
|
||||
|
||||
int dot=0;
|
||||
|
||||
rs+=sprintf(s+rs," (");
|
||||
for (i=0; i<len && i<20; i++){
|
||||
if (dot)
|
||||
rs+=sprintf(s+rs,".");
|
||||
dot=1;
|
||||
rs+=sprintf(s+rs,"%d",version[i]);
|
||||
}
|
||||
rs+=sprintf(s+rs,")");
|
||||
}
|
||||
|
||||
uint32_t vendor = vendorstr_get_vendor_id(ver);
|
||||
rs+=sprintf(s+rs,", Vendor Id: %d, %s",vendor, lw_vendor_id_to_str(vendor));
|
||||
return rs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void cw_dbg_version_subelem(int level,const char*context,int subtype,vendorstr_t vstr)
|
||||
{
|
||||
if ( !cw_dbg_is_level(level))
|
||||
return;
|
||||
if (!vstr)
|
||||
return;
|
||||
char v[256];
|
||||
cw_format_version(v,vstr,"");
|
||||
cw_dbg(level,"%s: SubType %d, %s",context,subtype,v);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
void dbg_istore_dmp(mbag_t s)
|
||||
{
|
||||
|
@ -175,6 +175,7 @@ extern void cw_dbg_elem_colored(int level, struct conn *conn, int msg, int msgel
|
||||
void cw_dbg_pkt(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
||||
void cw_dbg_msg(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
||||
char * cw_dbg_mkdmp(const uint8_t * data, int len);
|
||||
void cw_dbg_version_subelem(int level,const char*context,int subtype,vendorstr_t vstr);
|
||||
|
||||
|
||||
|
||||
|
@ -152,16 +152,16 @@ static inline int mbag_set_data(mbag_t s, uint32_t id, const struct mbag_typedef
|
||||
}
|
||||
|
||||
|
||||
static inline int mbag_set_vendorstr(mbag_t s, uint32_t id, uint32_t vendor_id,
|
||||
static inline vendorstr_t mbag_set_vendorstr(mbag_t s, uint32_t id, uint32_t vendor_id,
|
||||
uint8_t * vendorstr, int len)
|
||||
{
|
||||
mbag_item_t *i = mbag_item_create(s, id);
|
||||
if (!i)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
i->type = MBAG_VENDORSTR;
|
||||
i->data = vendorstr_create(vendor_id,vendorstr,len);
|
||||
return 1;
|
||||
return i->data;
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,11 +28,11 @@
|
||||
"radios":{
|
||||
"0":{
|
||||
"admin_state":"2",
|
||||
"radio_type":"7"
|
||||
"radio_type":"1"
|
||||
},
|
||||
"1":{
|
||||
"admin_state":"2",
|
||||
"radio_type":"8"
|
||||
"radio_type":"2"
|
||||
}
|
||||
},
|
||||
"bssid":""
|
||||
|
@ -111,7 +111,7 @@ mavl_destroy(b);
|
||||
|
||||
|
||||
|
||||
cw_register_actions_capwap_wtp(&capwap_actions);
|
||||
cw_register_actions_cipwap_wtp(&capwap_actions);
|
||||
cw_register_actions_capwap_80211_wtp(&capwap_actions);
|
||||
|
||||
|
||||
@ -132,7 +132,9 @@ mavl_destroy(b);
|
||||
conn->base_rmac=get_base_rmac();
|
||||
|
||||
conn->capwap_mode = CW_MODE_STD;
|
||||
the_conn->strict_capwap=1;
|
||||
conn->capwap_mode = CW_MODE_CISCO;
|
||||
|
||||
the_conn->strict_capwap=0;
|
||||
|
||||
|
||||
conn->config=mbag_create();
|
||||
|
Loading…
Reference in New Issue
Block a user