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