From 0d031ac26f7a40935cfabec7921e6c48af3f5d59 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 17 Aug 2014 23:42:14 +0000 Subject: [PATCH] Initial commit. FossilOrigin-Name: c2de1837d367aca63e691fdbc16a3672fdd63ba5f3b689a648a953bf91ffbfbf --- src/capwap/cw_readelem_result_code.c | 35 +++++++++ src/capwap/cw_util.c | 69 +++++++++++++++++ .../cwread_change_state_event_request.c | 74 +++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 src/capwap/cw_readelem_result_code.c create mode 100644 src/capwap/cw_util.c create mode 100644 src/capwap/cwread_change_state_event_request.c diff --git a/src/capwap/cw_readelem_result_code.c b/src/capwap/cw_readelem_result_code.c new file mode 100644 index 00000000..30fc69e8 --- /dev/null +++ b/src/capwap/cw_readelem_result_code.c @@ -0,0 +1,35 @@ +/* + This file is part of libcapwap. + + libcapwap 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 . + +*/ + +#include "capwap.h" + +#include "cw_log.h" + +int cw_readelem_result_code(uint32_t *result_code, int type, uint8_t * msgelem, int len) +{ + if (type != CWMSGELEM_RESULT_CODE) + return 0; + + if (len!=4){ + cw_dbg(DBG_CW_RFC,"Result code msg elem has wrong size, type=%d,len=%d",type,len); + return 0; + } + *result_code=ntohl(*((uint32_t*)msgelem)); + return 1; +} + diff --git a/src/capwap/cw_util.c b/src/capwap/cw_util.c new file mode 100644 index 00000000..19bb44a5 --- /dev/null +++ b/src/capwap/cw_util.c @@ -0,0 +1,69 @@ +/* + This file is part of libcapwap. + + libcapwap 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 . + +*/ + + +#include + +#include "cw_util.h" +#include "cw_log.h" +#include "capwap.h" + +void cw_mand_elem_found(int *l,int type) +{ + if (!cw_dbg_is_level(DBG_CW_RFC)) + return; + + int i; + for (i=0; l[i]!=-1; i++){ + if(l[i]==type){ + l[i]=0; + return; + } + + } +} + +void cw_get_missing_mand_elems(char *dst, int *l) +{ + if (!cw_dbg_is_level(DBG_CW_RFC)) + return; + + char *s = dst; + int i; + const char * k = ""; + for (i=0; l[i]!=-1; i++){ + if(l[i]){ + s += sprintf(s,"%s[%s]",k,cw_msgelemtostr(l[i])); + k=","; + } + + } +} + +int cw_is_missing_mand_elems(int *l) +{ + int i; + for (i=0; l[i]!=-1; i++){ + if(l[i]){ + return 1; + } + } + return 0; +} + + diff --git a/src/capwap/cwread_change_state_event_request.c b/src/capwap/cwread_change_state_event_request.c new file mode 100644 index 00000000..ebcb998a --- /dev/null +++ b/src/capwap/cwread_change_state_event_request.c @@ -0,0 +1,74 @@ +/* + This file is part of libcapwap. + + libcapwap 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 . + +*/ + + +#include + +#include "capwap.h" +#include "cw_log.h" +#include "cw_util.h" + +struct eparm { + int * mand; + uint32_t result_code; + struct wtpinfo * wtpinfo; +}; + + +static int readelem(void * eparm,int type,uint8_t* msgelem,int len) +{ + struct eparm * e = (struct eparm*)eparm; + cw_dbg(DBG_CW_MSGELEM,"Reading conf staus req msgelem, type=%d - %s ,len=%d\n",type,cw_msgelemtostr(type),len); + + /* mandatory elements */ + if (cw_readelem_result_code(&e->result_code,type,msgelem,len)) + goto foundX; + + return 0; + +foundX: + cw_mand_elem_found(e->mand,type); + return 1; + + +} + + +int cwread_change_state_event_request(struct wtpinfo * wtpinfo, uint8_t * msg, int len) +{ + int mand[] = { + CWMSGELEM_RADIO_OPERATIONAL_STATE, + CWMSGELEM_RESULT_CODE, + -1}; + + struct eparm eparm; + eparm.wtpinfo = wtpinfo; + eparm.mand=mand; + + cw_dbg(DBG_CW_MSGELEM,"Reading change state event request, len=%d",len); + cw_foreach_msgelem(msg,len,readelem,&eparm); + + + if (cw_is_missing_mand_elems(mand)){ + char str[512]; + cw_get_missing_mand_elems(str,mand); + cw_dbg(DBG_CW_RFC, "Missing msgelems in change state event request: %s",str); + } + return eparm.result_code; +} +