New Msg elements.

FossilOrigin-Name: da49daaf31e87aedf07df5cbb40ec0ebdb7c2c4d4ea4370b84cfe2d5a86306b7
This commit is contained in:
7u83@mail.ru 2015-04-26 21:52:11 +00:00
parent fef05e5f37
commit d6aa56ded4
15 changed files with 287 additions and 26 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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\

View File

@ -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

View File

@ -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 */

View File

@ -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 */

View File

@ -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}

View File

@ -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;
}

View File

@ -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);

View File

@ -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)
{

View File

@ -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);

View File

@ -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;
}

View File

@ -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":""

View File

@ -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();