From d6aa56ded4f0bc681ad2eedc99558b38f412003e Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 26 Apr 2015 21:52:11 +0000 Subject: [PATCH] New Msg elements. FossilOrigin-Name: da49daaf31e87aedf07df5cbb40ec0ebdb7c2c4d4ea4370b84cfe2d5a86306b7 --- src/ac/ac_main.c | 2 + src/ac/conf.c | 2 +- src/ac/wtpman.c | 15 +-- src/capwap/Makefile | 2 + src/capwap/capwap.h | 4 + src/capwap/capwap_actions.h | 2 +- src/capwap/capwap_actions_ac.c | 56 ++++++++++- src/capwap/cipwap_actions_ac.c | 9 ++ src/capwap/cw_in_ac_descriptor.c | 127 +++++++++++++++++++++++- src/capwap/cw_out_cisco_ac_descriptor.c | 19 +++- src/capwap/dbg.c | 58 +++++++++++ src/capwap/dbg.h | 1 + src/capwap/mbag.h | 6 +- src/wtp/cfg.json | 4 +- src/wtp/wtp_main.c | 6 +- 15 files changed, 287 insertions(+), 26 deletions(-) diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index a14c3200..a141ec7c 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -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); } diff --git a/src/ac/conf.c b/src/ac/conf.c index fcb58a43..ef4fc4e3 100644 --- a/src/ac/conf.c +++ b/src/ac/conf.c @@ -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; diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index f08f292c..4b77be49 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -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; } diff --git a/src/capwap/Makefile b/src/capwap/Makefile index fb29c76f..59cdc646 100644 --- a/src/capwap/Makefile +++ b/src/capwap/Makefile @@ -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\ diff --git a/src/capwap/capwap.h b/src/capwap/capwap.h index c6df36dd..42abe9b5 100644 --- a/src/capwap/capwap.h +++ b/src/capwap/capwap.h @@ -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 diff --git a/src/capwap/capwap_actions.h b/src/capwap/capwap_actions.h index 44ad9a9a..060ba44d 100644 --- a/src/capwap/capwap_actions.h +++ b/src/capwap/capwap_actions.h @@ -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 */ diff --git a/src/capwap/capwap_actions_ac.c b/src/capwap/capwap_actions_ac.c index 0c2bac8c..fdfc2771 100644 --- a/src/capwap/capwap_actions_ac.c +++ b/src/capwap/capwap_actions_ac.c @@ -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 */ diff --git a/src/capwap/cipwap_actions_ac.c b/src/capwap/cipwap_actions_ac.c index 3f800069..c4e13759 100644 --- a/src/capwap/cipwap_actions_ac.c +++ b/src/capwap/cipwap_actions_ac.c @@ -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} diff --git a/src/capwap/cw_in_ac_descriptor.c b/src/capwap/cw_in_ac_descriptor.c index b97e78a7..423f7edb 100644 --- a/src/capwap/cw_in_ac_descriptor.c +++ b/src/capwap/cw_in_ac_descriptor.c @@ -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 (subincomming,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; } diff --git a/src/capwap/cw_out_cisco_ac_descriptor.c b/src/capwap/cw_out_cisco_ac_descriptor.c index 698ea642..0e898c3b 100644 --- a/src/capwap/cw_out_cisco_ac_descriptor.c +++ b/src/capwap/cw_out_cisco_ac_descriptor.c @@ -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); diff --git a/src/capwap/dbg.c b/src/capwap/dbg.c index ca66785e..a9736eb4 100644 --- a/src/capwap/dbg.c +++ b/src/capwap/dbg.c @@ -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; itype = MBAG_VENDORSTR; i->data = vendorstr_create(vendor_id,vendorstr,len); - return 1; + return i->data; } diff --git a/src/wtp/cfg.json b/src/wtp/cfg.json index cfb12b1f..0286aa61 100644 --- a/src/wtp/cfg.json +++ b/src/wtp/cfg.json @@ -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":"" diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index b876d625..2ae3f2e1 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -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();