Compare commits
87 Commits
Author | SHA1 | Date | |
---|---|---|---|
6f7c26d0af | |||
fdf256553c | |||
ecf7a24eac | |||
57bcb0e183 | |||
9fbf441896 | |||
01919fffd9 | |||
02e8d534b5 | |||
3626927722 | |||
2ac3944e7a | |||
a131e17a6e | |||
0e19b53e28 | |||
9ded0bb87b | |||
b0aaaa4436 | |||
6024cc15cf | |||
d51873dd4b | |||
480f5d8782 | |||
651ccc0d33 | |||
baf1ccbc73 | |||
4f3fe0c339 | |||
813f24b8ac | |||
bca5c91ae1 | |||
619c40d5be | |||
7b4e386057 | |||
5195ea9e37 | |||
8f03ecca9b | |||
4b1caad54b | |||
c19da7ffb8 | |||
9096bff7a5 | |||
c132036914 | |||
f3fb11ac81 | |||
f7e3ba846f | |||
146939a716 | |||
bb684e92ea | |||
934c7ea64d | |||
ca010916ae | |||
ca74624d96 | |||
5d69226ace | |||
3761122c83 | |||
62af47a2f6 | |||
537e00d5b5 | |||
29ed6544c5 | |||
dd6f6fcfe2 | |||
cadbfa3d7e | |||
9572de350a | |||
a4cb96da7c | |||
84859e20c4 | |||
622f148150 | |||
32e9567f7b | |||
40a98c9075 | |||
a3c2e52d3c | |||
7eddb74767 | |||
73afba9a6d | |||
0842a2c6f5 | |||
43dde134b7 | |||
4117ab1f71 | |||
e6d1472824 | |||
1091aa0830 | |||
f85928e0b0 | |||
e92c257ac4 | |||
13ef6c0d62 | |||
258c8ff750 | |||
de9b54e8b1 | |||
26415cae34 | |||
067f920d81 | |||
ad27e80521 | |||
f0a7b848f4 | |||
ea87da11ba | |||
3b7c0adda7 | |||
aa5af8056b | |||
fbe31bda21 | |||
8e0b88cc4e | |||
7293ce43da | |||
64012e792c | |||
94e232abe4 | |||
afd76e003d | |||
40071fb06d | |||
e8241b2d3f | |||
29295d1434 | |||
2109c62b80 | |||
e3a977e40a | |||
730f110a25 | |||
471d1058c4 | |||
140be9b143 | |||
38f7681608 | |||
627a38a556 | |||
1436fc9e5f | |||
78a8a75c6b |
30
NEWS.md
Normal file
30
NEWS.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
SmartCAPWAP
|
||||||
|
===========
|
||||||
|
|
||||||
|
CAPWAP WTP and AC implementation
|
||||||
|
|
||||||
|
Version 1.3.1 - 11 Aug 2016
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
* fix hw queue selection for 802.11 raw frame injection
|
||||||
|
* initial Linux ftrace support
|
||||||
|
|
||||||
|
Version 1.3.0 - 08 Aug 2016
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
* forward PAE (IEEE 802.1X Authentication) frames as raw 802.11 frames to AC
|
||||||
|
* implement encryption support for group and peer temporal keys (CCMP only)
|
||||||
|
|
||||||
|
Version 1.2.1 - 06 May 2016
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
* fix Add WLAN's capability field
|
||||||
|
* fix mssing IEEE 802.11 Assigned WTP BSSID IE in Add WLAN response
|
||||||
|
|
||||||
|
Version 1.2.0 - 29 Apr 2016
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
* 802.11n support
|
||||||
|
* WMM/WME support
|
||||||
|
* ported to libev
|
||||||
|
* ported to Linux 4.4
|
45
README.md
45
README.md
@ -6,22 +6,29 @@ This fork is currently focusing on the WTP side only.
|
|||||||
|
|
||||||
## STATUS
|
## STATUS
|
||||||
|
|
||||||
|
NOTE: The WTP has been ported to libev, the AC has not been adjusted and is therefor broken for the moment.
|
||||||
|
|
||||||
### WTP tested and working features:
|
### WTP tested and working features:
|
||||||
|
|
||||||
* 802.11b
|
* 802.11b
|
||||||
* 802.11g
|
* 802.11g
|
||||||
|
* 802.11a
|
||||||
* WMM/WME (mostly)
|
* WMM/WME (mostly)
|
||||||
* Local MAC
|
* Local MAC
|
||||||
* single radio, single WLAN mode
|
* single radio, single WLAN mode
|
||||||
|
* 802.11n ([draft-ietf-opsawg-capwap-extension-06](https://tools.ietf.org/html/draft-ietf-opsawg-capwap-extension-06))
|
||||||
|
* WPA2-PSK
|
||||||
|
|
||||||
Only cards with cfg80211 netlink API are supported and only
|
Only cards with cfg80211 netlink API are supported. The following devices
|
||||||
ath9k cards (in particular Qualcomm Atheros AR5418) have
|
have been tested:
|
||||||
been tested.
|
|
||||||
|
* Atheros AR9280 (Compex WLE200NX)
|
||||||
|
* Mediatek MT7602E, MT7612E (ZBT WG2626, ALL-WR1200AC_WRT)
|
||||||
|
|
||||||
### Planned WTP features:
|
### Planned WTP features:
|
||||||
|
|
||||||
* 802.11n ([draft-ietf-opsawg-capwap-extension-06](https://tools.ietf.org/html/draft-ietf-opsawg-capwap-extension-06))
|
* WPA2 Enterprise
|
||||||
* encryption (WPA2)
|
* 802.11r - BSS fast transition
|
||||||
* Hybrid-MAC ([RFC-7494](https://tools.ietf.org/html/rfc7494))
|
* Hybrid-MAC ([RFC-7494](https://tools.ietf.org/html/rfc7494))
|
||||||
|
|
||||||
## INSTALLATION
|
## INSTALLATION
|
||||||
@ -37,10 +44,12 @@ NOTE: To run WTP you must have a wireless card that has Linux driver based on th
|
|||||||
* libconfig-dev
|
* libconfig-dev
|
||||||
* libjson0-dev
|
* libjson0-dev
|
||||||
* libnl-dev
|
* libnl-dev
|
||||||
|
* libev-dev
|
||||||
* libtool
|
* libtool
|
||||||
* libxml2-dev
|
* libxml2-dev
|
||||||
* wolfssl 3.8 or newer
|
* wolfssl 3.8 or newer
|
||||||
|
|
||||||
|
|
||||||
### Build
|
### Build
|
||||||
|
|
||||||
WolfSSL:
|
WolfSSL:
|
||||||
@ -56,6 +65,30 @@ WolfSSL:
|
|||||||
SmartCAPWAP:
|
SmartCAPWAP:
|
||||||
|
|
||||||
autoreconf -f -i
|
autoreconf -f -i
|
||||||
./configure --without-ac
|
./configure --disable-ac
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
### Debugging / Traceing
|
||||||
|
|
||||||
|
The smartcapwap kernel module defines a number of static ftrace events. For a detailed
|
||||||
|
guide on how to use those, see: https://www.kernel.org/doc/Documentation/trace/ftrace.txt
|
||||||
|
|
||||||
|
A sample trace session might lock like this:
|
||||||
|
|
||||||
|
# echo 1 > /sys/kernel/debug/tracing/events/capwap/enable
|
||||||
|
# echo 1 > /sys/kernel/debug/tracing/tracing_on
|
||||||
|
# cat /sys/kernel/debug/tracing/trace_pipe
|
||||||
|
<...>-890 [000] ...1 12030.725012: sc_capwap_create: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
<...>-890 [000] ...1 12030.725048: sc_capwap_sendkeepalive: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
<...>-890 [000] ...1 12030.725052: sc_capwap_createkeepalive: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
<...>-890 [000] ...1 12030.725053: sc_capwap_send: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
ksoftirqd/0-3 [000] ..s1 12030.727270: sc_capwap_parsingpacket: session:9e04b10c75b3c6537da18d38da5bc70d skb:ffff8802306c8900
|
||||||
|
wtp-890 [001] ...1 12060.764008: sc_capwap_sendkeepalive: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
wtp-890 [001] ...1 12060.764530: sc_capwap_createkeepalive: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
wtp-890 [001] ...1 12060.764637: sc_capwap_send: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
<idle>-0 [000] ..s2 12060.787527: sc_capwap_parsingpacket: session:9e04b10c75b3c6537da18d38da5bc70d skb:ffff8800b8a85900
|
||||||
|
wtp-890 [001] ...1 12082.953847: sc_capwap_resetsession: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
wtp-890 [001] ...1 12082.954005: sc_capwap_close: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
wtp-890 [001] ...1 12082.954130: sc_capwap_freesession: session:9e04b10c75b3c6537da18d38da5bc70d
|
||||||
|
# echo 0 > /sys/kernel/debug/tracing/tracing_on
|
||||||
|
@ -100,7 +100,10 @@ capwap_SOURCES = $(top_srcdir)/src/common/capwap.c \
|
|||||||
$(top_srcdir)/src/common/capwap_element_80211_wtpqos.c \
|
$(top_srcdir)/src/common/capwap_element_80211_wtpqos.c \
|
||||||
$(top_srcdir)/src/common/capwap_element_80211_wtpradioconf.c \
|
$(top_srcdir)/src/common/capwap_element_80211_wtpradioconf.c \
|
||||||
$(top_srcdir)/src/common/capwap_element_80211_wtpradiofailalarm.c \
|
$(top_srcdir)/src/common/capwap_element_80211_wtpradiofailalarm.c \
|
||||||
$(top_srcdir)/src/common/capwap_element_80211_wtpradioinformation.c
|
$(top_srcdir)/src/common/capwap_element_80211_wtpradioinformation.c \
|
||||||
|
$(top_srcdir)/src/common/capwap_element_80211n_radioconf.c \
|
||||||
|
$(top_srcdir)/src/common/capwap_element_80211n_station_information.c \
|
||||||
|
$(top_srcdir)/src/common/capwap_element_vendor_travelping_wtp_timestamp.c
|
||||||
|
|
||||||
if DEBUG_BUILD
|
if DEBUG_BUILD
|
||||||
capwap_SOURCES += $(top_srcdir)/src/common/capwap_debug.c
|
capwap_SOURCES += $(top_srcdir)/src/common/capwap_debug.c
|
||||||
|
@ -23,6 +23,7 @@ bin_PROGRAMS = wtp
|
|||||||
|
|
||||||
AM_CFLAGS = -D_REENTRANT \
|
AM_CFLAGS = -D_REENTRANT \
|
||||||
-D_GNU_SOURCE \
|
-D_GNU_SOURCE \
|
||||||
|
-fno-strict-aliasing \
|
||||||
${LIBNL_CFLAGS}
|
${LIBNL_CFLAGS}
|
||||||
|
|
||||||
if DTLS_ENABLED
|
if DTLS_ENABLED
|
||||||
|
@ -49,6 +49,7 @@ application: {
|
|||||||
|
|
||||||
timer: {
|
timer: {
|
||||||
statistics = 120;
|
statistics = 120;
|
||||||
|
inactivity = 300;
|
||||||
};
|
};
|
||||||
|
|
||||||
dtls: {
|
dtls: {
|
||||||
@ -149,6 +150,17 @@ application: {
|
|||||||
dscp = 0; # not used yet
|
dscp = 0; # not used yet
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
ieee80211n = {
|
||||||
|
a-msdu = true;
|
||||||
|
a-mpdu = true;
|
||||||
|
require-ht = false;
|
||||||
|
short-gi = true;
|
||||||
|
ht40 = false;
|
||||||
|
max-sup-mcs = 15;
|
||||||
|
max-mand-mcs = 7;
|
||||||
|
tx-antenna = 0;
|
||||||
|
rx-antenna = 0;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
18
configure.ac
18
configure.ac
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
|
|
||||||
AC_INIT([SmartCAPWAP], [1.1.0], [https://github.com/travelping/smartcapwap], [smartcapwap])
|
AC_INIT([SmartCAPWAP], [1.2.1], [https://github.com/travelping/smartcapwap], [smartcapwap])
|
||||||
AC_CONFIG_AUX_DIR([build])
|
AC_CONFIG_AUX_DIR([build])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AM_INIT_AUTOMAKE([1.11 -Wall])
|
AM_INIT_AUTOMAKE([1.11 -Wall])
|
||||||
@ -60,12 +60,8 @@ AC_ARG_ENABLE(
|
|||||||
[enable_logging="yes"]
|
[enable_logging="yes"]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_ENABLE(
|
AC_ARG_ENABLE([ac],
|
||||||
[ac],
|
[AS_HELP_STRING([--enable-ac], [enable ac support])])
|
||||||
[AS_HELP_STRING([--disable-ac], [disable ac support])],
|
|
||||||
,
|
|
||||||
[enable_ac="yes"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(
|
AC_ARG_ENABLE(
|
||||||
[wtp],
|
[wtp],
|
||||||
@ -178,6 +174,7 @@ AC_DEFINE_UNQUOTED([LIBCONFIG_LOOKUP_INT_ARG], [$LIBCONFIG_LOOKUP_INT_ARG], [con
|
|||||||
# Check PTHREAD library
|
# Check PTHREAD library
|
||||||
AC_CHECK_HEADER([pthread.h], [], [AC_MSG_ERROR(You need the pthread headers)])
|
AC_CHECK_HEADER([pthread.h], [], [AC_MSG_ERROR(You need the pthread headers)])
|
||||||
AC_CHECK_LIB([pthread], [pthread_create], [PTHREAD_LIBS="-lpthread"], [AC_MSG_ERROR(You need the pthread library)])
|
AC_CHECK_LIB([pthread], [pthread_create], [PTHREAD_LIBS="-lpthread"], [AC_MSG_ERROR(You need the pthread library)])
|
||||||
|
AC_CHECK_LIB([ev], [ev_run],, [AC_MSG_ERROR(Required library ev missing)])
|
||||||
|
|
||||||
# Check SSL library
|
# Check SSL library
|
||||||
PKG_CHECK_MODULES([WOLFSSL], [wolfssl >= 3.8.0], [have_wolfssl_ssl="yes"], [have_wolfssl_ssl="no"])
|
PKG_CHECK_MODULES([WOLFSSL], [wolfssl >= 3.8.0], [have_wolfssl_ssl="yes"], [have_wolfssl_ssl="no"])
|
||||||
@ -190,12 +187,7 @@ if test "${enable_ac}" = "yes"; then
|
|||||||
[LIBJSON],
|
[LIBJSON],
|
||||||
[json-c >= 0.11],
|
[json-c >= 0.11],
|
||||||
[],
|
[],
|
||||||
[PKG_CHECK_MODULES(
|
|
||||||
[LIBJSON],
|
|
||||||
[json >= 0.9],
|
|
||||||
[],
|
|
||||||
[AC_MSG_ERROR(You need the libjson)]
|
[AC_MSG_ERROR(You need the libjson)]
|
||||||
)]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check XML2 library
|
# Check XML2 library
|
||||||
@ -208,7 +200,7 @@ fi
|
|||||||
# Check Netlink library
|
# Check Netlink library
|
||||||
PKG_CHECK_MODULES(
|
PKG_CHECK_MODULES(
|
||||||
[LIBNL3],
|
[LIBNL3],
|
||||||
[libnl-3.0 >= 3.1],
|
[libnl-3.0 >= 3.1 libnl-genl-3.0 >= 3.1],
|
||||||
[have_libnl3=yes],
|
[have_libnl3=yes],
|
||||||
[PKG_CHECK_MODULES(
|
[PKG_CHECK_MODULES(
|
||||||
[LIBNL],
|
[LIBNL],
|
||||||
|
@ -9,10 +9,21 @@ include $(TOPDIR)/rules.mk
|
|||||||
include $(INCLUDE_DIR)/kernel.mk
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
|
||||||
PKG_NAME:=smartcapwap
|
PKG_NAME:=smartcapwap
|
||||||
PKG_VERSION:=1.0
|
PKG_VERSION:=1.2.1
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
SRC_SMARTCAPWAP := /usr/src/tplino/components/smartcapwap
|
||||||
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_SOURCE_URL:=git://github.com/travelping/smartcapwap.git
|
||||||
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
PKG_SOURCE_VERSION:=v1.2.1
|
||||||
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
|
|
||||||
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
PKG_MAINTAINER:=Travelping GmbH <info@travelping.com>
|
||||||
|
|
||||||
|
PKG_LICENSE:=GPL-v2
|
||||||
|
PKG_LICENSE_FILES:=LICENSE
|
||||||
|
|
||||||
PKG_FIXUP:=autoreconf
|
PKG_FIXUP:=autoreconf
|
||||||
|
|
||||||
@ -29,18 +40,25 @@ define Package/smartcapwap
|
|||||||
CATEGORY:=Network
|
CATEGORY:=Network
|
||||||
TITLE:=SmartCAPWAP WTP
|
TITLE:=SmartCAPWAP WTP
|
||||||
MAINTAINER:=Massimo Vellucci <vemax78@gmail.com>
|
MAINTAINER:=Massimo Vellucci <vemax78@gmail.com>
|
||||||
DEPENDS:=+libnl-tiny +libconfig +libwolfssl +kmod-smartcapwap
|
DEPENDS:=+libnl +libev +libconfig +libcyassl +kmod-smartcapwap
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/smartcapwap/description
|
define Package/smartcapwap/description
|
||||||
This package contains the SmartCAPWAP WTP daemon.
|
This package contains the SmartCAPWAP WTP daemon.
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define Package/smartcapwap/conffiles
|
||||||
|
/etc/capwap/wtp.conf
|
||||||
|
/etc/capwap/ca.crt
|
||||||
|
/etc/capwap/wtp.crt
|
||||||
|
/etc/capwap/wtp.key
|
||||||
|
endef
|
||||||
|
|
||||||
define KernelPackage/smartcapwap
|
define KernelPackage/smartcapwap
|
||||||
SUBMENU:=Network Support
|
SUBMENU:=Network Support
|
||||||
TITLE:=SmartCAPWAP Data Channel Module
|
TITLE:=SmartCAPWAP Data Channel Module
|
||||||
MAINTAINER:=Massimo Vellucci <vemax78@gmail.com>
|
MAINTAINER:=Massimo Vellucci <vemax78@gmail.com>
|
||||||
DEPENDS:=+kmod-mac80211 +kmod-ipv6
|
DEPENDS:=+kmod-mac80211 +kmod-udptunnel4 +IPV6:kmod-udptunnel6
|
||||||
FILES:=$(PKG_BUILD_DIR)/src/wtp/kmod/smartcapwap.ko
|
FILES:=$(PKG_BUILD_DIR)/src/wtp/kmod/smartcapwap.ko
|
||||||
AUTOLOAD:=$(call AutoLoad,70,smartcapwap)
|
AUTOLOAD:=$(call AutoLoad,70,smartcapwap)
|
||||||
endef
|
endef
|
||||||
@ -49,8 +67,7 @@ define KernelPackage/smartcapwap/description
|
|||||||
This package contains the SmartCAPWAP Data Transport kernel module.
|
This package contains the SmartCAPWAP Data Transport kernel module.
|
||||||
endef
|
endef
|
||||||
|
|
||||||
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny
|
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/libnl3
|
||||||
SRC_SMARTCAPWAP := /mnt/hgfs/shared/smartcapwap
|
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
mkdir -p $(PKG_BUILD_DIR)
|
mkdir -p $(PKG_BUILD_DIR)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
From 03b6aa026d60cd49931934338d8ca82d05acc818 Mon Sep 17 00:00:00 2001
|
From 664ed7a49f0d9f879e22e7e3da904a2e5793c33d Mon Sep 17 00:00:00 2001
|
||||||
From: Andreas Schultz <aschultz@tpip.net>
|
From: Andreas Schultz <aschultz@tpip.net>
|
||||||
Date: Thu, 4 Feb 2016 15:57:11 +0100
|
Date: Thu, 4 Feb 2016 15:57:11 +0100
|
||||||
Subject: [PATCH] support patch for smartcapwap
|
Subject: [PATCH] support patch for smartcapwap
|
||||||
@ -8,9 +8,9 @@ Allows for kernel side interception and injection of IEEE 802.11 frames.
|
|||||||
include/net/mac80211.h | 25 ++++
|
include/net/mac80211.h | 25 ++++
|
||||||
net/mac80211/ieee80211_i.h | 6 +
|
net/mac80211/ieee80211_i.h | 6 +
|
||||||
net/mac80211/iface.c | 56 +++++++++
|
net/mac80211/iface.c | 56 +++++++++
|
||||||
net/mac80211/rx.c | 81 ++++++++++--
|
net/mac80211/rx.c | 81 +++++++++++--
|
||||||
net/mac80211/tx.c | 306 +++++++++++++++++++++++++++++++++++++++++++++
|
net/mac80211/tx.c | 279 +++++++++++++++++++++++++++++++++++++++++++++
|
||||||
5 files changed, 462 insertions(+), 12 deletions(-)
|
5 files changed, 435 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
|
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
|
||||||
index 760bc4d..6722da6 100644
|
index 760bc4d..6722da6 100644
|
||||||
@ -334,10 +334,10 @@ index 82af407..29cc59b 100644
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
||||||
index bdc224d..3769c33 100644
|
index bdc224d..5da49f0 100644
|
||||||
--- a/net/mac80211/tx.c
|
--- a/net/mac80211/tx.c
|
||||||
+++ b/net/mac80211/tx.c
|
+++ b/net/mac80211/tx.c
|
||||||
@@ -2939,6 +2939,138 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
@@ -2939,6 +2939,111 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,8 +353,9 @@ index bdc224d..3769c33 100644
|
|||||||
+ struct ieee80211_chanctx_conf *chanctx_conf;
|
+ struct ieee80211_chanctx_conf *chanctx_conf;
|
||||||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
+ struct ieee80211_sub_if_data *tmp_sdata, *sdata;
|
+ struct ieee80211_sub_if_data *sdata;
|
||||||
+ struct cfg80211_chan_def *chandef;
|
+ struct cfg80211_chan_def *chandef;
|
||||||
|
+ int tid;
|
||||||
+ int hdrlen;
|
+ int hdrlen;
|
||||||
+
|
+
|
||||||
+ /* check for not even having the fixed 802.11 header */
|
+ /* check for not even having the fixed 802.11 header */
|
||||||
@ -367,13 +368,13 @@ index bdc224d..3769c33 100644
|
|||||||
+ if (unlikely(skb->len < hdrlen))
|
+ if (unlikely(skb->len < hdrlen))
|
||||||
+ goto fail; /* skb too short for claimed header length */
|
+ goto fail; /* skb too short for claimed header length */
|
||||||
+
|
+
|
||||||
+ skb_reset_mac_header(skb);
|
+ skb_set_mac_header(skb, 0);
|
||||||
+ /*
|
+ /*
|
||||||
+ * these are just fixed to the end of the rt area since we
|
+ * these are just fixed to the end of the rt area since we
|
||||||
+ * don't have any better information and at this point, nobody cares
|
+ * don't have any better information and at this point, nobody cares
|
||||||
+ */
|
+ */
|
||||||
+ skb_reset_network_header(skb);
|
+ skb_set_network_header(skb, hdrlen);
|
||||||
+ skb_reset_transport_header(skb);
|
+ skb_set_transport_header(skb, hdrlen);
|
||||||
+
|
+
|
||||||
+ /*
|
+ /*
|
||||||
+ * Initialize skb->protocol if the injected frame is a data frame
|
+ * Initialize skb->protocol if the injected frame is a data frame
|
||||||
@ -388,12 +389,17 @@ index bdc224d..3769c33 100644
|
|||||||
+ payload[7]);
|
+ payload[7]);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ memset(info, 0, sizeof(*info));
|
+ if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||||
|
+ u8 *p = ieee80211_get_qos_ctl(hdr);
|
||||||
+
|
+
|
||||||
|
+ skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||||
|
+ }
|
||||||
|
+ skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
|
||||||
|
+
|
||||||
|
+ memset(info, 0, sizeof(*info));
|
||||||
+ info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
+ info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||||
+ IEEE80211_TX_CTL_INJECTED;
|
+ IEEE80211_TX_CTL_INJECTED;
|
||||||
+
|
+
|
||||||
+
|
|
||||||
+ /*
|
+ /*
|
||||||
+ * we might have set these flags later.....
|
+ * we might have set these flags later.....
|
||||||
+ * info->flags &= ~IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
+ * info->flags &= ~IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
||||||
@ -405,46 +411,17 @@ index bdc224d..3769c33 100644
|
|||||||
+ sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
+ sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
+
|
+
|
||||||
+ chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
+ chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||||
+ if (!chanctx_conf) {
|
+ if (!chanctx_conf)
|
||||||
+ tmp_sdata = rcu_dereference(local->monitor_sdata);
|
|
||||||
+ if (tmp_sdata)
|
|
||||||
+ chanctx_conf =
|
|
||||||
+ rcu_dereference(tmp_sdata->vif.chanctx_conf);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (chanctx_conf)
|
|
||||||
+ chandef = &chanctx_conf->def;
|
|
||||||
+ else if (!local->use_chanctx)
|
|
||||||
+ chandef = &local->_oper_chandef;
|
|
||||||
+ else
|
|
||||||
+ goto fail_rcu;
|
+ goto fail_rcu;
|
||||||
+
|
+
|
||||||
+ /*
|
+ info->band = chanctx_conf->def.chan->band;
|
||||||
+ * Frame injection is not allowed if beaconing is not allowed
|
+
|
||||||
+ * or if we need radar detection. Beaconing is usually not allowed when
|
+ ieee80211_tx_stats(dev, skb->len);
|
||||||
+ * the mode or operation (Adhoc, AP, Mesh) does not support DFS.
|
|
||||||
+ * Passive scan is also used in world regulatory domains where
|
|
||||||
+ * your country is not known and as such it should be treated as
|
|
||||||
+ * NO TX unless the channel is explicitly allowed in which case
|
|
||||||
+ * your current regulatory domain would not have the passive scan
|
|
||||||
+ * flag.
|
|
||||||
+ *
|
|
||||||
+ * Since AP mode uses monitor interfaces to inject/TX management
|
|
||||||
+ * frames we can make AP mode the exception to this rule once it
|
|
||||||
+ * supports radar detection as its implementation can deal with
|
|
||||||
+ * radar detection by itself. We can do that later by adding a
|
|
||||||
+ * monitor flag interfaces used for AP support.
|
|
||||||
+ */
|
|
||||||
+ if (!cfg80211_reg_can_beacon(local->hw.wiphy, chandef,
|
|
||||||
+ sdata->vif.type))
|
|
||||||
+ goto fail_rcu;
|
|
||||||
+
|
+
|
||||||
+ info->band = chandef->chan->band;
|
|
||||||
+ ieee80211_xmit(sdata, NULL, skb);
|
+ ieee80211_xmit(sdata, NULL, skb);
|
||||||
+ rcu_read_unlock();
|
+ rcu_read_unlock();
|
||||||
+
|
+
|
||||||
+ return;
|
+ return;
|
||||||
+
|
|
||||||
+fail_rcu:
|
+fail_rcu:
|
||||||
+ rcu_read_unlock();
|
+ rcu_read_unlock();
|
||||||
+fail:
|
+fail:
|
||||||
@ -461,10 +438,6 @@ index bdc224d..3769c33 100644
|
|||||||
+netdev_tx_t ieee80211_capwap_subif_start_xmit(struct sk_buff *skb,
|
+netdev_tx_t ieee80211_capwap_subif_start_xmit(struct sk_buff *skb,
|
||||||
+ struct net_device *dev)
|
+ struct net_device *dev)
|
||||||
+{
|
+{
|
||||||
+ if (skb->protocol != htons(ETH_P_IP))
|
|
||||||
+ printk(KERN_DEBUG "capwap xmit %s: protocol: %04X, data: %p, MAC: %p\n",
|
|
||||||
+ dev->name, ntohs(skb->protocol), skb->data, skb_mac_header(skb));
|
|
||||||
+
|
|
||||||
+ if (skb->protocol == htons(ETH_P_CONTROL)) {
|
+ if (skb->protocol == htons(ETH_P_CONTROL)) {
|
||||||
+ __ieee80211_capwap_inject_start_xmit(skb, dev);
|
+ __ieee80211_capwap_inject_start_xmit(skb, dev);
|
||||||
+ } else
|
+ } else
|
||||||
@ -476,7 +449,7 @@ index bdc224d..3769c33 100644
|
|||||||
struct sk_buff *
|
struct sk_buff *
|
||||||
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
|
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sk_buff *skb, u32 info_flags)
|
struct sk_buff *skb, u32 info_flags)
|
||||||
@@ -3914,3 +4046,177 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
|
@@ -3914,3 +4019,177 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
|
||||||
ieee80211_xmit(sdata, NULL, skb);
|
ieee80211_xmit(sdata, NULL, skb);
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
}
|
}
|
||||||
@ -655,5 +628,5 @@ index bdc224d..3769c33 100644
|
|||||||
+EXPORT_SYMBOL(ieee80211_inject_xmit);
|
+EXPORT_SYMBOL(ieee80211_inject_xmit);
|
||||||
+
|
+
|
||||||
--
|
--
|
||||||
2.7.0
|
2.8.1
|
||||||
|
|
||||||
|
86
src/ac/ac.c
86
src/ac/ac.c
@ -214,22 +214,22 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
/* Logging configuration */
|
/* Logging configuration */
|
||||||
if (config_lookup_bool(config, "logging.enable", &configBool) == CONFIG_TRUE) {
|
if (config_lookup_bool(config, "logging.enable", &configBool) == CONFIG_TRUE) {
|
||||||
if (!configBool) {
|
if (!configBool) {
|
||||||
capwap_logging_verboselevel(CAPWAP_LOGGING_NONE);
|
capwap_logging_verboselevel(LOG_NONE);
|
||||||
capwap_logging_disable_allinterface();
|
capwap_logging_disable_allinterface();
|
||||||
} else {
|
} else {
|
||||||
if (config_lookup_string(config, "logging.level", &configString) == CONFIG_TRUE) {
|
if (config_lookup_string(config, "logging.level", &configString) == CONFIG_TRUE) {
|
||||||
if (!strcmp(configString, "fatal")) {
|
if (!strcmp(configString, "fatal")) {
|
||||||
capwap_logging_verboselevel(CAPWAP_LOGGING_FATAL);
|
capwap_logging_verboselevel(LOG_EMERG);
|
||||||
} else if (!strcmp(configString, "error")) {
|
} else if (!strcmp(configString, "error")) {
|
||||||
capwap_logging_verboselevel(CAPWAP_LOGGING_ERROR);
|
capwap_logging_verboselevel(LOG_ERR);
|
||||||
} else if (!strcmp(configString, "warning")) {
|
} else if (!strcmp(configString, "warning")) {
|
||||||
capwap_logging_verboselevel(CAPWAP_LOGGING_WARNING);
|
capwap_logging_verboselevel(LOG_WARNING);
|
||||||
} else if (!strcmp(configString, "info")) {
|
} else if (!strcmp(configString, "info")) {
|
||||||
capwap_logging_verboselevel(CAPWAP_LOGGING_INFO);
|
capwap_logging_verboselevel(LOG_INFO);
|
||||||
} else if (!strcmp(configString, "debug")) {
|
} else if (!strcmp(configString, "debug")) {
|
||||||
capwap_logging_verboselevel(CAPWAP_LOGGING_DEBUG);
|
capwap_logging_verboselevel(LOG_DEBUG);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown logging.level value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown logging.level value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -251,7 +251,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
} else if (!strcmp(configString, "stderr")) {
|
} else if (!strcmp(configString, "stderr")) {
|
||||||
capwap_logging_enable_console(1);
|
capwap_logging_enable_console(1);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown logging.output value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown logging.output value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -268,7 +268,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
/* Set name of AC */
|
/* Set name of AC */
|
||||||
if (config_lookup_string(config, "application.name", &configString) == CONFIG_TRUE) {
|
if (config_lookup_string(config, "application.name", &configString) == CONFIG_TRUE) {
|
||||||
if (strlen(configString) > CAPWAP_ACNAME_MAXLENGTH) {
|
if (strlen(configString) > CAPWAP_ACNAME_MAXLENGTH) {
|
||||||
capwap_logging_error("Invalid configuration file, application.name string length exceeded");
|
log_printf(LOG_ERR, "Invalid configuration file, application.name string length exceeded");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,7 +291,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
} else if (!strcmp(bindingName, "EPCGlobal")) {
|
} else if (!strcmp(bindingName, "EPCGlobal")) {
|
||||||
*binding = CAPWAP_WIRELESS_BINDING_EPCGLOBAL;
|
*binding = CAPWAP_WIRELESS_BINDING_EPCGLOBAL;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.binding value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.binding value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -303,7 +303,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if ((configInt > 0) && (configInt < 65536)) {
|
if ((configInt > 0) && (configInt < 65536)) {
|
||||||
g_ac.descriptor.stationlimit = (unsigned short)configInt;
|
g_ac.descriptor.stationlimit = (unsigned short)configInt;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.descriptor.maxstations value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.descriptor.maxstations value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,7 +313,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if ((configInt > 0) && (configInt < 65536)) {
|
if ((configInt > 0) && (configInt < 65536)) {
|
||||||
g_ac.descriptor.maxwtp = (unsigned short)configInt;
|
g_ac.descriptor.maxwtp = (unsigned short)configInt;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.descriptor.maxwtp value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.descriptor.maxwtp value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -379,7 +379,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
} else if (!strcmp(configType, "software")) {
|
} else if (!strcmp(configType, "software")) {
|
||||||
type = CAPWAP_ACDESC_SUBELEMENT_SOFTWAREVERSION;
|
type = CAPWAP_ACDESC_SUBELEMENT_SOFTWAREVERSION;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.descriptor.info.type value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.descriptor.info.type value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,19 +392,19 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
strcpy((char*)desc->data, configValue);
|
strcpy((char*)desc->data, configValue);
|
||||||
desc->data[desc->length] = 0;
|
desc->data[desc->length] = 0;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, application.descriptor.info.value string length exceeded");
|
log_printf(LOG_ERR, "Invalid configuration file, application.descriptor.info.value string length exceeded");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, element application.descriptor.info.value not found");
|
log_printf(LOG_ERR, "Invalid configuration file, element application.descriptor.info.value not found");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, element application.descriptor.info.type not found");
|
log_printf(LOG_ERR, "Invalid configuration file, element application.descriptor.info.type not found");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, element application.descriptor.info.idvendor not found");
|
log_printf(LOG_ERR, "Invalid configuration file, element application.descriptor.info.idvendor not found");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -418,7 +418,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
} else if (!strcmp(configString, "limited")) {
|
} else if (!strcmp(configString, "limited")) {
|
||||||
g_ac.dfa.ecn.flag = CAPWAP_LIMITED_ECN_SUPPORT;
|
g_ac.dfa.ecn.flag = CAPWAP_LIMITED_ECN_SUPPORT;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.ecn value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.ecn value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -429,7 +429,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if ((configInt >= AC_MIN_DISCOVERY_INTERVAL) && (configInt <= AC_MAX_DISCOVERY_INTERVAL)) {
|
if ((configInt >= AC_MIN_DISCOVERY_INTERVAL) && (configInt <= AC_MAX_DISCOVERY_INTERVAL)) {
|
||||||
g_ac.dfa.timers.discovery = (unsigned char)(configInt / 1000);
|
g_ac.dfa.timers.discovery = (unsigned char)(configInt / 1000);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, invalid application.timer.discovery value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid application.timer.discovery value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -439,7 +439,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if ((configInt >= AC_MIN_ECHO_INTERVAL) && (configInt <= AC_MAX_ECHO_INTERVAL)) {
|
if ((configInt >= AC_MIN_ECHO_INTERVAL) && (configInt <= AC_MAX_ECHO_INTERVAL)) {
|
||||||
g_ac.dfa.timers.echorequest = (unsigned char)(configInt / 1000);
|
g_ac.dfa.timers.echorequest = (unsigned char)(configInt / 1000);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, invalid application.timer.echorequest value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid application.timer.echorequest value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -448,7 +448,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if ((configInt > 0) && (configInt < 65536)) {
|
if ((configInt > 0) && (configInt < 65536)) {
|
||||||
g_ac.dfa.decrypterrorreport_interval = (unsigned short)configInt;
|
g_ac.dfa.decrypterrorreport_interval = (unsigned short)configInt;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, invalid application.timer.decrypterrorreport value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid application.timer.decrypterrorreport value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -457,7 +457,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if (configInt > 0) {
|
if (configInt > 0) {
|
||||||
g_ac.dfa.idletimeout.timeout = (unsigned long)configInt;
|
g_ac.dfa.idletimeout.timeout = (unsigned long)configInt;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, invalid application.timer.idletimeout value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid application.timer.idletimeout value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -483,7 +483,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
} else if (!strcmp(configString, "presharedkey")) {
|
} else if (!strcmp(configString, "presharedkey")) {
|
||||||
dtlsparam.mode = CAPWAP_DTLS_MODE_PRESHAREDKEY;
|
dtlsparam.mode = CAPWAP_DTLS_MODE_PRESHAREDKEY;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.dtls.type value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.dtls.type value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -576,7 +576,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
/* Set interface binding of AC */
|
/* Set interface binding of AC */
|
||||||
if (config_lookup_string(config, "application.network.binding", &configString) == CONFIG_TRUE) {
|
if (config_lookup_string(config, "application.network.binding", &configString) == CONFIG_TRUE) {
|
||||||
if (strlen(configString) > (IFNAMSIZ - 1)) {
|
if (strlen(configString) > (IFNAMSIZ - 1)) {
|
||||||
capwap_logging_error("Invalid configuration file, application.network.binding string length exceeded");
|
log_printf(LOG_ERR, "Invalid configuration file, application.network.binding string length exceeded");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,7 +588,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if ((configInt > 0) && (configInt < 65536)) {
|
if ((configInt > 0) && (configInt < 65536)) {
|
||||||
g_ac.mtu = (unsigned short)configInt;
|
g_ac.mtu = (unsigned short)configInt;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, invalid application.network.mtu value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid application.network.mtu value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -600,7 +600,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
} else if (!strcmp(configString, "udplite")) {
|
} else if (!strcmp(configString, "udplite")) {
|
||||||
g_ac.dfa.transport.type = CAPWAP_UDPLITE_TRANSPORT;
|
g_ac.dfa.transport.type = CAPWAP_UDPLITE_TRANSPORT;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unknown application.network.transport value");
|
log_printf(LOG_ERR, "Invalid configuration file, unknown application.network.transport value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -633,7 +633,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
/* */
|
/* */
|
||||||
server = ac_soapclient_create_server(configString);
|
server = ac_soapclient_create_server(configString);
|
||||||
if (!server) {
|
if (!server) {
|
||||||
capwap_logging_error("Invalid configuration file, invalid backend.server value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid backend.server value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -647,7 +647,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
/* */
|
/* */
|
||||||
configSSL = config_setting_get_member(configServer, "x509");
|
configSSL = config_setting_get_member(configServer, "x509");
|
||||||
if (!configSSL) {
|
if (!configSSL) {
|
||||||
capwap_logging_error("Invalid configuration file, invalid backend.server.x509 value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid backend.server.x509 value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -673,11 +673,11 @@ static int ac_parsing_configuration_1_0(config_t* config) {
|
|||||||
if (calist && certificate && privatekey) {
|
if (calist && certificate && privatekey) {
|
||||||
server->sslcontext = capwap_socket_crypto_createcontext(calist, certificate, privatekey);
|
server->sslcontext = capwap_socket_crypto_createcontext(calist, certificate, privatekey);
|
||||||
if (!server->sslcontext) {
|
if (!server->sslcontext) {
|
||||||
capwap_logging_error("Invalid configuration file, unable to initialize crypto library");
|
log_printf(LOG_ERR, "Invalid configuration file, unable to initialize crypto library");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, invalid backend.server.x509 value");
|
log_printf(LOG_ERR, "Invalid configuration file, invalid backend.server.x509 value");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -707,9 +707,9 @@ static int ac_parsing_configuration(config_t* config) {
|
|||||||
return ac_parsing_configuration_1_0(config);
|
return ac_parsing_configuration_1_0(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
capwap_logging_error("Invalid configuration file, '%s' is not supported", configString);
|
log_printf(LOG_ERR, "Invalid configuration file, '%s' is not supported", configString);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid configuration file, unable to found version tag");
|
log_printf(LOG_ERR, "Invalid configuration file, unable to found version tag");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -738,7 +738,7 @@ static int ac_load_configuration(int argc, char** argv) {
|
|||||||
if (strlen(optarg) < sizeof(g_configurationfile)) {
|
if (strlen(optarg) < sizeof(g_configurationfile)) {
|
||||||
strcpy(g_configurationfile, optarg);
|
strcpy(g_configurationfile, optarg);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Invalid -%c argument", optopt);
|
log_printf(LOG_ERR, "Invalid -%c argument", optopt);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -747,9 +747,9 @@ static int ac_load_configuration(int argc, char** argv) {
|
|||||||
|
|
||||||
case '?': {
|
case '?': {
|
||||||
if (optopt == 'c') {
|
if (optopt == 'c') {
|
||||||
capwap_logging_error("Option -%c requires an argument", optopt);
|
log_printf(LOG_ERR, "Option -%c requires an argument", optopt);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Unknown option character `\\x%x'", optopt);
|
log_printf(LOG_ERR, "Unknown option character `\\x%x'", optopt);
|
||||||
}
|
}
|
||||||
|
|
||||||
ac_print_usage();
|
ac_print_usage();
|
||||||
@ -766,7 +766,7 @@ static int ac_load_configuration(int argc, char** argv) {
|
|||||||
result = ac_parsing_configuration(&config);
|
result = ac_parsing_configuration(&config);
|
||||||
} else {
|
} else {
|
||||||
result = -1;
|
result = -1;
|
||||||
capwap_logging_error("Unable load the configuration file '%s': %s (%d)", g_configurationfile, config_error_text(&config), config_error_line(&config));
|
log_printf(LOG_ERR, "Unable load the configuration file '%s': %s (%d)", g_configurationfile, config_error_text(&config), config_error_line(&config));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free libconfig */
|
/* Free libconfig */
|
||||||
@ -778,7 +778,7 @@ static int ac_load_configuration(int argc, char** argv) {
|
|||||||
static int ac_configure(void) {
|
static int ac_configure(void) {
|
||||||
/* Bind control channel to any address */
|
/* Bind control channel to any address */
|
||||||
if (capwap_bind_sockets(&g_ac.net)) {
|
if (capwap_bind_sockets(&g_ac.net)) {
|
||||||
capwap_logging_fatal("Cannot bind address");
|
log_printf(LOG_EMERG, "Cannot bind address");
|
||||||
return AC_ERROR_NETWORK;
|
return AC_ERROR_NETWORK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,7 +821,7 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
/* Init capwap */
|
/* Init capwap */
|
||||||
if (geteuid() != 0) {
|
if (geteuid() != 0) {
|
||||||
capwap_logging_fatal("Request root privileges");
|
log_printf(LOG_EMERG, "Request root privileges");
|
||||||
return CAPWAP_REQUEST_ROOT;
|
return CAPWAP_REQUEST_ROOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -830,7 +830,7 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
/* Init crypt */
|
/* Init crypt */
|
||||||
if (capwap_crypt_init()) {
|
if (capwap_crypt_init()) {
|
||||||
capwap_logging_fatal("Error to init crypt engine");
|
log_printf(LOG_EMERG, "Error to init crypt engine");
|
||||||
return CAPWAP_CRYPT_ERROR;
|
return CAPWAP_CRYPT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -852,7 +852,7 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
/* Console logging is disabled in daemon mode */
|
/* Console logging is disabled in daemon mode */
|
||||||
capwap_logging_disable_console();
|
capwap_logging_disable_console();
|
||||||
capwap_logging_info("Running AC in daemon mode");
|
log_printf(LOG_INFO, "Running AC in daemon mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Complete configuration AC */
|
/* Complete configuration AC */
|
||||||
@ -862,18 +862,18 @@ int main(int argc, char** argv) {
|
|||||||
if (!ac_kmod_init()) {
|
if (!ac_kmod_init()) {
|
||||||
/* Bind data channel */
|
/* Bind data channel */
|
||||||
if (!ac_kmod_createdatachannel(g_ac.net.localaddr.ss.ss_family, CAPWAP_GET_NETWORK_PORT(&g_ac.net.localaddr) + 1)) {
|
if (!ac_kmod_createdatachannel(g_ac.net.localaddr.ss.ss_family, CAPWAP_GET_NETWORK_PORT(&g_ac.net.localaddr) + 1)) {
|
||||||
capwap_logging_info("SmartCAPWAP kernel module connected");
|
log_printf(LOG_INFO, "SmartCAPWAP kernel module connected");
|
||||||
|
|
||||||
/* Running AC */
|
/* Running AC */
|
||||||
result = ac_execute();
|
result = ac_execute();
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_fatal("Unable to create kernel data channel");
|
log_printf(LOG_EMERG, "Unable to create kernel data channel");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disconnect kernel module */
|
/* Disconnect kernel module */
|
||||||
ac_kmod_free();
|
ac_kmod_free();
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_fatal("Unable to connect to kernel module");
|
log_printf(LOG_EMERG, "Unable to connect to kernel module");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close connection */
|
/* Close connection */
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <linux/if_ether.h>
|
#include <linux/if_ether.h>
|
||||||
#include <json/json.h>
|
#include <json-c/json.h>
|
||||||
|
|
||||||
#include <ac_kmod.h>
|
#include <ac_kmod.h>
|
||||||
|
|
||||||
|
@ -31,27 +31,30 @@ static struct ac_json_ieee80211_ops* ac_json_80211_message_elements[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static struct ac_json_ieee80211_ops* ac_json_80211_getops_by_capwaptype(uint16_t type) {
|
static struct ac_json_ieee80211_ops *
|
||||||
|
ac_json_80211_getops_by_capwaptype(const struct capwap_message_element_id type)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < CAPWAP_80211_MESSAGE_ELEMENTS_COUNT; i++) {
|
for (i = 0; i < CAPWAP_80211_MESSAGE_ELEMENTS_COUNT; i++) {
|
||||||
if (ac_json_80211_message_elements[i] && (ac_json_80211_message_elements[i]->type == type)) {
|
if (ac_json_80211_message_elements[i] &&
|
||||||
|
memcmp(&ac_json_80211_message_elements[i]->type, &type, sizeof(type)) == 0)
|
||||||
return ac_json_80211_message_elements[i];
|
return ac_json_80211_message_elements[i];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static struct ac_json_ieee80211_ops* ac_json_80211_getops_by_jsontype(char* type) {
|
static struct ac_json_ieee80211_ops* ac_json_80211_getops_by_jsontype(char* type)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < CAPWAP_80211_MESSAGE_ELEMENTS_COUNT; i++) {
|
for (i = 0; i < CAPWAP_80211_MESSAGE_ELEMENTS_COUNT; i++) {
|
||||||
if (ac_json_80211_message_elements[i] && !strcmp(ac_json_80211_message_elements[i]->json_type, type)) {
|
if (ac_json_80211_message_elements[i] &&
|
||||||
|
strcmp(ac_json_80211_message_elements[i]->json_type, type) == 0)
|
||||||
return ac_json_80211_message_elements[i];
|
return ac_json_80211_message_elements[i];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -74,111 +77,113 @@ void ac_json_ieee80211_free(struct ac_json_ieee80211_wtpradio* wtpradio) {
|
|||||||
|
|
||||||
if (item->valid) {
|
if (item->valid) {
|
||||||
if (item->addwlan) {
|
if (item->addwlan) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN)->free_message_element(item->addwlan);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN)->free(item->addwlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->antenna) {
|
if (item->antenna) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ANTENNA)->free_message_element(item->antenna);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ANTENNA)->free(item->antenna);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->assignbssid) {
|
if (item->assignbssid) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID)->free_message_element(item->assignbssid);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID)->free(item->assignbssid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->deletewlan) {
|
if (item->deletewlan) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN)->free_message_element(item->deletewlan);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN)->free(item->deletewlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->directsequencecontrol) {
|
if (item->directsequencecontrol) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL)->free_message_element(item->directsequencecontrol);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL)->free(item->directsequencecontrol);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->iearray) {
|
if (item->iearray) {
|
||||||
struct capwap_message_elements_ops* ieops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_IE);
|
const struct capwap_message_elements_ops* ieops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_IE);
|
||||||
|
|
||||||
for (j = 0; j < item->iearray->count; j++) {
|
for (j = 0; j < item->iearray->count; j++) {
|
||||||
ieops->free_message_element(*(struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, j));
|
ieops->free(*(struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, j));
|
||||||
}
|
}
|
||||||
|
|
||||||
capwap_array_free(item->iearray);
|
capwap_array_free(item->iearray);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->macoperation) {
|
if (item->macoperation) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MACOPERATION)->free_message_element(item->macoperation);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MACOPERATION)->free(item->macoperation);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->miccountermeasures) {
|
if (item->miccountermeasures) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES)->free_message_element(item->miccountermeasures);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES)->free(item->miccountermeasures);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->multidomaincapability) {
|
if (item->multidomaincapability) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY)->free_message_element(item->multidomaincapability);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY)->free(item->multidomaincapability);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->ofdmcontrol) {
|
if (item->ofdmcontrol) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL)->free_message_element(item->ofdmcontrol);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL)->free(item->ofdmcontrol);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->rateset) {
|
if (item->rateset) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RATESET)->free_message_element(item->rateset);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RATESET)->free(item->rateset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->rsnaerrorreport) {
|
if (item->rsnaerrorreport) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT)->free_message_element(item->rsnaerrorreport);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT)->free(item->rsnaerrorreport);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->statistics) {
|
if (item->statistics) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_STATISTICS)->free_message_element(item->statistics);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_STATISTICS)->free(item->statistics);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->supportedrates) {
|
if (item->supportedrates) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES)->free_message_element(item->supportedrates);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES)->free(item->supportedrates);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->txpower) {
|
if (item->txpower) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWER)->free_message_element(item->txpower);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWER)->free(item->txpower);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->txpowerlevel) {
|
if (item->txpowerlevel) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL)->free_message_element(item->txpowerlevel);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL)->free(item->txpowerlevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->updatewlan) {
|
if (item->updatewlan) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN)->free_message_element(item->updatewlan);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN)->free(item->updatewlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->wtpqos) {
|
if (item->wtpqos) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_QOS)->free_message_element(item->wtpqos);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_QOS)->free(item->wtpqos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->wtpradioconf) {
|
if (item->wtpradioconf) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF)->free_message_element(item->wtpradioconf);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF)->free(item->wtpradioconf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->wtpradiofailalarm) {
|
if (item->wtpradiofailalarm) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM)->free_message_element(item->wtpradiofailalarm);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM)->free(item->wtpradiofailalarm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->wtpradioinformation) {
|
if (item->wtpradioinformation) {
|
||||||
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION)->free_message_element(item->wtpradioinformation);
|
capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION)->free(item->wtpradioinformation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, uint16_t type, void* data, int overwrite) {
|
int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio *wtpradio,
|
||||||
|
const struct capwap_message_element_id id,
|
||||||
|
void *data, int overwrite)
|
||||||
|
{
|
||||||
struct ac_json_ieee80211_ops* ops;
|
struct ac_json_ieee80211_ops* ops;
|
||||||
|
|
||||||
ASSERT(wtpradio != NULL);
|
ASSERT(wtpradio != NULL);
|
||||||
ASSERT(IS_80211_MESSAGE_ELEMENTS(type));
|
ASSERT(IS_80211_MESSAGE_ELEMENTS(id));
|
||||||
ASSERT(data != NULL);
|
ASSERT(data != NULL);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
ops = ac_json_80211_getops_by_capwaptype(type);
|
ops = ac_json_80211_getops_by_capwaptype(id);
|
||||||
if (!ops) {
|
if (!ops)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
return ops->add_message_element(wtpradio, data, overwrite);
|
return ops->add_message_element(wtpradio, data, overwrite);
|
||||||
}
|
}
|
||||||
@ -189,21 +194,27 @@ int ac_json_ieee80211_parsingmessageelement(struct ac_json_ieee80211_wtpradio* w
|
|||||||
|
|
||||||
ASSERT(wtpradio != NULL);
|
ASSERT(wtpradio != NULL);
|
||||||
ASSERT(messageelement != NULL);
|
ASSERT(messageelement != NULL);
|
||||||
ASSERT(IS_80211_MESSAGE_ELEMENTS(messageelement->type));
|
ASSERT(IS_80211_MESSAGE_ELEMENTS(messageelement->id));
|
||||||
|
|
||||||
if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
switch (messageelement->category) {
|
||||||
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->type, messageelement->data, 0)) {
|
case CAPWAP_MESSAGE_ELEMENT_SINGLE:
|
||||||
|
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->id,
|
||||||
|
messageelement->data, 0))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
break;
|
||||||
} else if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
|
|
||||||
struct capwap_array* items = (struct capwap_array*)messageelement->data;
|
|
||||||
|
|
||||||
for (i = 0; i < items->count; i++) {
|
case CAPWAP_MESSAGE_ELEMENT_ARRAY: {
|
||||||
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->type, *(void**)capwap_array_get_item_pointer(items, i), 0)) {
|
struct capwap_array* items =
|
||||||
|
(struct capwap_array*)messageelement->data;
|
||||||
|
|
||||||
|
for (i = 0; i < items->count; i++)
|
||||||
|
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->id,
|
||||||
|
*(void**)capwap_array_get_item_pointer(items, i), 0))
|
||||||
return 0;
|
return 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,13 +250,13 @@ int ac_json_ieee80211_parsingjson(struct ac_json_ieee80211_wtpradio* wtpradio, s
|
|||||||
for(entry = json_object_get_object(jsonradio)->head; entry != NULL; entry = entry->next) {
|
for(entry = json_object_get_object(jsonradio)->head; entry != NULL; entry = entry->next) {
|
||||||
struct ac_json_ieee80211_ops* ops = ac_json_80211_getops_by_jsontype((char*)entry->k); /* Retrieve JSON handler */
|
struct ac_json_ieee80211_ops* ops = ac_json_80211_getops_by_jsontype((char*)entry->k); /* Retrieve JSON handler */
|
||||||
if (ops) {
|
if (ops) {
|
||||||
void* data = ops->create_message_element((struct json_object*)entry->v, radioid);
|
void* data = ops->create((struct json_object*)entry->v, radioid);
|
||||||
if (data) {
|
if (data) {
|
||||||
/* Message element complete */
|
/* Message element complete */
|
||||||
ac_json_ieee80211_addmessageelement(wtpradio, ops->type, data, 1);
|
ac_json_ieee80211_addmessageelement(wtpradio, ops->type, data, 1);
|
||||||
|
|
||||||
/* Free resource */
|
/* Free resource */
|
||||||
capwap_get_message_element_ops(ops->type)->free_message_element(data);
|
capwap_get_message_element_ops(ops->type)->free(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_addwlan_createmessageelement(struct json_object* json
|
|||||||
static int ac_json_80211_addwlan_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_addwlan_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_addwlan_element* addwlan = (struct capwap_80211_addwlan_element*)data;
|
struct capwap_80211_addwlan_element* addwlan = (struct capwap_80211_addwlan_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[addwlan->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[addwlan->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN);
|
const struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN);
|
||||||
|
|
||||||
if (item->addwlan) {
|
if (item->addwlan) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->addwlan);
|
ops->free(item->addwlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->addwlan = (struct capwap_80211_addwlan_element*)ops->clone_message_element(addwlan);
|
item->addwlan = (struct capwap_80211_addwlan_element*)ops->clone(addwlan);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_addwlan_createjson(struct json_object* jsonparent, voi
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_addwlan_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_addwlan_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_ADD_WLAN,
|
.type = CAPWAP_ELEMENT_80211_ADD_WLAN,
|
||||||
.json_type = "IEEE80211AddWLAN",
|
.json_type = "IEEE80211AddWLAN",
|
||||||
.create_message_element = ac_json_80211_addwlan_createmessageelement,
|
.create = ac_json_80211_addwlan_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_addwlan_addmessageelement,
|
.add_message_element = ac_json_80211_addwlan_addmessageelement,
|
||||||
.create_json = ac_json_80211_addwlan_createjson
|
.create_json = ac_json_80211_addwlan_createjson
|
||||||
};
|
};
|
||||||
|
@ -64,18 +64,18 @@ static void* ac_json_80211_antenna_createmessageelement(struct json_object* json
|
|||||||
static int ac_json_80211_antenna_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_antenna_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_antenna_element* antenna = (struct capwap_80211_antenna_element*)data;
|
struct capwap_80211_antenna_element* antenna = (struct capwap_80211_antenna_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[antenna->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[antenna->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ANTENNA);
|
const struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ANTENNA);
|
||||||
|
|
||||||
if (item->antenna) {
|
if (item->antenna) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->antenna);
|
ops->free(item->antenna);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->antenna = (struct capwap_80211_antenna_element*)ops->clone_message_element(antenna);
|
item->antenna = (struct capwap_80211_antenna_element*)ops->clone(antenna);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ static void ac_json_80211_antenna_createjson(struct json_object* jsonparent, voi
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_antenna_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_antenna_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_ANTENNA,
|
.type = CAPWAP_ELEMENT_80211_ANTENNA,
|
||||||
.json_type = "IEEE80211Antenna",
|
.json_type = "IEEE80211Antenna",
|
||||||
.create_message_element = ac_json_80211_antenna_createmessageelement,
|
.create = ac_json_80211_antenna_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_antenna_addmessageelement,
|
.add_message_element = ac_json_80211_antenna_addmessageelement,
|
||||||
.create_json = ac_json_80211_antenna_createjson
|
.create_json = ac_json_80211_antenna_createjson
|
||||||
};
|
};
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_assignbssid_createmessageelement(struct json_object*
|
|||||||
static int ac_json_80211_assignbssid_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_assignbssid_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_assignbssid_element* assignbssid = (struct capwap_80211_assignbssid_element*)data;
|
struct capwap_80211_assignbssid_element* assignbssid = (struct capwap_80211_assignbssid_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[assignbssid->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[assignbssid->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID);
|
||||||
|
|
||||||
if (item->assignbssid) {
|
if (item->assignbssid) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->assignbssid);
|
ops->free(item->assignbssid);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->assignbssid = (struct capwap_80211_assignbssid_element*)ops->clone_message_element(assignbssid);
|
item->assignbssid = (struct capwap_80211_assignbssid_element*)ops->clone(assignbssid);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_assignbssid_createjson(struct json_object* jsonparent,
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_assignbssid_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_assignbssid_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_ASSIGN_BSSID,
|
.type = CAPWAP_ELEMENT_80211_ASSIGN_BSSID,
|
||||||
.json_type = "IEEE80211AssignBSSID",
|
.json_type = "IEEE80211AssignBSSID",
|
||||||
.create_message_element = ac_json_80211_assignbssid_createmessageelement,
|
.create = ac_json_80211_assignbssid_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_assignbssid_addmessageelement,
|
.add_message_element = ac_json_80211_assignbssid_addmessageelement,
|
||||||
.create_json = ac_json_80211_assignbssid_createjson
|
.create_json = ac_json_80211_assignbssid_createjson
|
||||||
};
|
};
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_deletewlan_createmessageelement(struct json_object* j
|
|||||||
static int ac_json_80211_deletewlan_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_deletewlan_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_deletewlan_element* deletewlan = (struct capwap_80211_deletewlan_element*)data;
|
struct capwap_80211_deletewlan_element* deletewlan = (struct capwap_80211_deletewlan_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[deletewlan->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[deletewlan->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN);
|
||||||
|
|
||||||
if (item->deletewlan) {
|
if (item->deletewlan) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->deletewlan);
|
ops->free(item->deletewlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->deletewlan = (struct capwap_80211_deletewlan_element*)ops->clone_message_element(deletewlan);
|
item->deletewlan = (struct capwap_80211_deletewlan_element*)ops->clone(deletewlan);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_deletewlan_createjson(struct json_object* jsonparent,
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_deletewlan_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_deletewlan_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_DELETE_WLAN,
|
.type = CAPWAP_ELEMENT_80211_DELETE_WLAN,
|
||||||
.json_type = "IEEE80211DeleteWLAN",
|
.json_type = "IEEE80211DeleteWLAN",
|
||||||
.create_message_element = ac_json_80211_deletewlan_createmessageelement,
|
.create = ac_json_80211_deletewlan_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_deletewlan_addmessageelement,
|
.add_message_element = ac_json_80211_deletewlan_addmessageelement,
|
||||||
.create_json = ac_json_80211_deletewlan_createjson
|
.create_json = ac_json_80211_deletewlan_createjson
|
||||||
};
|
};
|
||||||
|
@ -50,18 +50,18 @@ static void* ac_json_80211_directsequencecontrol_createmessageelement(struct jso
|
|||||||
static int ac_json_80211_directsequencecontrol_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_directsequencecontrol_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_directsequencecontrol_element* directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)data;
|
struct capwap_80211_directsequencecontrol_element* directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[directsequencecontrol->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[directsequencecontrol->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL);
|
||||||
|
|
||||||
if (item->directsequencecontrol) {
|
if (item->directsequencecontrol) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->directsequencecontrol);
|
ops->free(item->directsequencecontrol);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)ops->clone_message_element(directsequencecontrol);
|
item->directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)ops->clone(directsequencecontrol);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ static void ac_json_80211_directsequencecontrol_createjson(struct json_object* j
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_directsequencecontrol_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_directsequencecontrol_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL,
|
.type = CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL,
|
||||||
.json_type = "IEEE80211DirectSequenceControl",
|
.json_type = "IEEE80211DirectSequenceControl",
|
||||||
.create_message_element = ac_json_80211_directsequencecontrol_createmessageelement,
|
.create = ac_json_80211_directsequencecontrol_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_directsequencecontrol_addmessageelement,
|
.add_message_element = ac_json_80211_directsequencecontrol_addmessageelement,
|
||||||
.create_json = ac_json_80211_directsequencecontrol_createjson
|
.create_json = ac_json_80211_directsequencecontrol_createjson
|
||||||
};
|
};
|
||||||
|
@ -11,7 +11,7 @@ static int ac_json_80211_ie_addmessageelement(struct ac_json_ieee80211_wtpradio*
|
|||||||
struct capwap_80211_ie_element** ieclone;
|
struct capwap_80211_ie_element** ieclone;
|
||||||
struct capwap_80211_ie_element* ie = (struct capwap_80211_ie_element*)data;
|
struct capwap_80211_ie_element* ie = (struct capwap_80211_ie_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[ie->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[ie->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_IE);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_IE);
|
||||||
|
|
||||||
if (!item->iearray) {
|
if (!item->iearray) {
|
||||||
item->iearray = capwap_array_create(sizeof(struct capwap_80211_ie_element*), 0, 0);
|
item->iearray = capwap_array_create(sizeof(struct capwap_80211_ie_element*), 0, 0);
|
||||||
@ -19,7 +19,7 @@ static int ac_json_80211_ie_addmessageelement(struct ac_json_ieee80211_wtpradio*
|
|||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
ieclone = (struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, item->iearray->count);
|
ieclone = (struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, item->iearray->count);
|
||||||
*ieclone = (struct capwap_80211_ie_element*)ops->clone_message_element(ie);
|
*ieclone = (struct capwap_80211_ie_element*)ops->clone(ie);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -33,7 +33,7 @@ static void ac_json_80211_ie_createjson(struct json_object* jsonparent, void* da
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_ie_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_ie_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_IE,
|
.type = CAPWAP_ELEMENT_80211_IE,
|
||||||
.json_type = "IEEE80211IE",
|
.json_type = "IEEE80211IE",
|
||||||
.create_message_element = ac_json_80211_ie_createmessageelement,
|
.create = ac_json_80211_ie_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_ie_addmessageelement,
|
.add_message_element = ac_json_80211_ie_addmessageelement,
|
||||||
.create_json = ac_json_80211_ie_createjson
|
.create_json = ac_json_80211_ie_createjson
|
||||||
};
|
};
|
||||||
|
@ -77,18 +77,18 @@ static void* ac_json_80211_macoperation_createmessageelement(struct json_object*
|
|||||||
static int ac_json_80211_macoperation_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_macoperation_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_macoperation_element* macoperation = (struct capwap_80211_macoperation_element*)data;
|
struct capwap_80211_macoperation_element* macoperation = (struct capwap_80211_macoperation_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[macoperation->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[macoperation->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MACOPERATION);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MACOPERATION);
|
||||||
|
|
||||||
if (item->macoperation) {
|
if (item->macoperation) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->macoperation);
|
ops->free(item->macoperation);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->macoperation = (struct capwap_80211_macoperation_element*)ops->clone_message_element(macoperation);
|
item->macoperation = (struct capwap_80211_macoperation_element*)ops->clone(macoperation);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -112,7 +112,7 @@ static void ac_json_80211_macoperation_createjson(struct json_object* jsonparent
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_macoperation_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_macoperation_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_MACOPERATION,
|
.type = CAPWAP_ELEMENT_80211_MACOPERATION,
|
||||||
.json_type = "IEEE80211MACOperation",
|
.json_type = "IEEE80211MACOperation",
|
||||||
.create_message_element = ac_json_80211_macoperation_createmessageelement,
|
.create = ac_json_80211_macoperation_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_macoperation_addmessageelement,
|
.add_message_element = ac_json_80211_macoperation_addmessageelement,
|
||||||
.create_json = ac_json_80211_macoperation_createjson
|
.create_json = ac_json_80211_macoperation_createjson
|
||||||
};
|
};
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_miccountermeasures_createmessageelement(struct json_o
|
|||||||
static int ac_json_80211_miccountermeasures_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_miccountermeasures_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_miccountermeasures_element* miccountermeasures = (struct capwap_80211_miccountermeasures_element*)data;
|
struct capwap_80211_miccountermeasures_element* miccountermeasures = (struct capwap_80211_miccountermeasures_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[miccountermeasures->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[miccountermeasures->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES);
|
||||||
|
|
||||||
if (item->miccountermeasures) {
|
if (item->miccountermeasures) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->miccountermeasures);
|
ops->free(item->miccountermeasures);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->miccountermeasures = (struct capwap_80211_miccountermeasures_element*)ops->clone_message_element(miccountermeasures);
|
item->miccountermeasures = (struct capwap_80211_miccountermeasures_element*)ops->clone(miccountermeasures);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_miccountermeasures_createjson(struct json_object* json
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_miccountermeasures_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_miccountermeasures_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES,
|
.type = CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES,
|
||||||
.json_type = "IEEE80211MicCounterMeasures",
|
.json_type = "IEEE80211MicCounterMeasures",
|
||||||
.create_message_element = ac_json_80211_miccountermeasures_createmessageelement,
|
.create = ac_json_80211_miccountermeasures_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_miccountermeasures_addmessageelement,
|
.add_message_element = ac_json_80211_miccountermeasures_addmessageelement,
|
||||||
.create_json = ac_json_80211_miccountermeasures_createjson
|
.create_json = ac_json_80211_miccountermeasures_createjson
|
||||||
};
|
};
|
||||||
|
@ -50,18 +50,18 @@ static void* ac_json_80211_multidomaincapability_createmessageelement(struct jso
|
|||||||
static int ac_json_80211_multidomaincapability_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_multidomaincapability_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_multidomaincapability_element* multidomaincapability = (struct capwap_80211_multidomaincapability_element*)data;
|
struct capwap_80211_multidomaincapability_element* multidomaincapability = (struct capwap_80211_multidomaincapability_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[multidomaincapability->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[multidomaincapability->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY);
|
||||||
|
|
||||||
if (item->multidomaincapability) {
|
if (item->multidomaincapability) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->multidomaincapability);
|
ops->free(item->multidomaincapability);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->multidomaincapability = (struct capwap_80211_multidomaincapability_element*)ops->clone_message_element(multidomaincapability);
|
item->multidomaincapability = (struct capwap_80211_multidomaincapability_element*)ops->clone(multidomaincapability);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ static void ac_json_80211_multidomaincapability_createjson(struct json_object* j
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_multidomaincapability_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_multidomaincapability_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY,
|
.type = CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY,
|
||||||
.json_type = "IEEE80211MultiDomainCapability",
|
.json_type = "IEEE80211MultiDomainCapability",
|
||||||
.create_message_element = ac_json_80211_multidomaincapability_createmessageelement,
|
.create = ac_json_80211_multidomaincapability_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_multidomaincapability_addmessageelement,
|
.add_message_element = ac_json_80211_multidomaincapability_addmessageelement,
|
||||||
.create_json = ac_json_80211_multidomaincapability_createjson
|
.create_json = ac_json_80211_multidomaincapability_createjson
|
||||||
};
|
};
|
||||||
|
@ -50,18 +50,18 @@ static void* ac_json_80211_ofdmcontrol_createmessageelement(struct json_object*
|
|||||||
static int ac_json_80211_ofdmcontrol_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_ofdmcontrol_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_ofdmcontrol_element* ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)data;
|
struct capwap_80211_ofdmcontrol_element* ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[ofdmcontrol->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[ofdmcontrol->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL);
|
||||||
|
|
||||||
if (item->ofdmcontrol) {
|
if (item->ofdmcontrol) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->ofdmcontrol);
|
ops->free(item->ofdmcontrol);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)ops->clone_message_element(ofdmcontrol);
|
item->ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)ops->clone(ofdmcontrol);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ static void ac_json_80211_ofdmcontrol_createjson(struct json_object* jsonparent,
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_ofdmcontrol_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_ofdmcontrol_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_OFDMCONTROL,
|
.type = CAPWAP_ELEMENT_80211_OFDMCONTROL,
|
||||||
.json_type = "IEEE80211OFDMControl",
|
.json_type = "IEEE80211OFDMControl",
|
||||||
.create_message_element = ac_json_80211_ofdmcontrol_createmessageelement,
|
.create = ac_json_80211_ofdmcontrol_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_ofdmcontrol_addmessageelement,
|
.add_message_element = ac_json_80211_ofdmcontrol_addmessageelement,
|
||||||
.create_json = ac_json_80211_ofdmcontrol_createjson
|
.create_json = ac_json_80211_ofdmcontrol_createjson
|
||||||
};
|
};
|
||||||
|
@ -41,18 +41,18 @@ static void* ac_json_80211_rateset_createmessageelement(struct json_object* json
|
|||||||
static int ac_json_80211_rateset_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_rateset_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_rateset_element* rateset = (struct capwap_80211_rateset_element*)data;
|
struct capwap_80211_rateset_element* rateset = (struct capwap_80211_rateset_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[rateset->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[rateset->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RATESET);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RATESET);
|
||||||
|
|
||||||
if (item->rateset) {
|
if (item->rateset) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->rateset);
|
ops->free(item->rateset);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->rateset = (struct capwap_80211_rateset_element*)ops->clone_message_element(rateset);
|
item->rateset = (struct capwap_80211_rateset_element*)ops->clone(rateset);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ static void ac_json_80211_rateset_createjson(struct json_object* jsonparent, voi
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_rateset_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_rateset_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_RATESET,
|
.type = CAPWAP_ELEMENT_80211_RATESET,
|
||||||
.json_type = "IEEE80211Rateset",
|
.json_type = "IEEE80211Rateset",
|
||||||
.create_message_element = ac_json_80211_rateset_createmessageelement,
|
.create = ac_json_80211_rateset_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_rateset_addmessageelement,
|
.add_message_element = ac_json_80211_rateset_addmessageelement,
|
||||||
.create_json = ac_json_80211_rateset_createjson
|
.create_json = ac_json_80211_rateset_createjson
|
||||||
};
|
};
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_rsnaerrorreport_createmessageelement(struct json_obje
|
|||||||
static int ac_json_80211_rsnaerrorreport_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_rsnaerrorreport_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_rsnaerrorreport_element* rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)data;
|
struct capwap_80211_rsnaerrorreport_element* rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[rsnaerrorreport->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[rsnaerrorreport->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT);
|
||||||
|
|
||||||
if (item->rsnaerrorreport) {
|
if (item->rsnaerrorreport) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->rsnaerrorreport);
|
ops->free(item->rsnaerrorreport);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)ops->clone_message_element(rsnaerrorreport);
|
item->rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)ops->clone(rsnaerrorreport);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_rsnaerrorreport_createjson(struct json_object* jsonpar
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_rsnaerrorreport_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_rsnaerrorreport_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT,
|
.type = CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT,
|
||||||
.json_type = "IEEE80211RSNAErrorReport",
|
.json_type = "IEEE80211RSNAErrorReport",
|
||||||
.create_message_element = ac_json_80211_rsnaerrorreport_createmessageelement,
|
.create = ac_json_80211_rsnaerrorreport_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_rsnaerrorreport_addmessageelement,
|
.add_message_element = ac_json_80211_rsnaerrorreport_addmessageelement,
|
||||||
.create_json = ac_json_80211_rsnaerrorreport_createjson
|
.create_json = ac_json_80211_rsnaerrorreport_createjson
|
||||||
};
|
};
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_statistics_createmessageelement(struct json_object* j
|
|||||||
static int ac_json_80211_statistics_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_statistics_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_statistics_element* statistics = (struct capwap_80211_statistics_element*)data;
|
struct capwap_80211_statistics_element* statistics = (struct capwap_80211_statistics_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[statistics->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[statistics->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_STATISTICS);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_STATISTICS);
|
||||||
|
|
||||||
if (item->statistics) {
|
if (item->statistics) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->statistics);
|
ops->free(item->statistics);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->statistics = (struct capwap_80211_statistics_element*)ops->clone_message_element(statistics);
|
item->statistics = (struct capwap_80211_statistics_element*)ops->clone(statistics);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_statistics_createjson(struct json_object* jsonparent,
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_statistics_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_statistics_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_STATISTICS,
|
.type = CAPWAP_ELEMENT_80211_STATISTICS,
|
||||||
.json_type = "IEEE80211Statistics",
|
.json_type = "IEEE80211Statistics",
|
||||||
.create_message_element = ac_json_80211_statistics_createmessageelement,
|
.create = ac_json_80211_statistics_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_statistics_addmessageelement,
|
.add_message_element = ac_json_80211_statistics_addmessageelement,
|
||||||
.create_json = ac_json_80211_statistics_createjson
|
.create_json = ac_json_80211_statistics_createjson
|
||||||
};
|
};
|
||||||
|
@ -41,18 +41,18 @@ static void* ac_json_80211_supportedrates_createmessageelement(struct json_objec
|
|||||||
static int ac_json_80211_supportedrates_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_supportedrates_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_supportedrates_element* supportedrates = (struct capwap_80211_supportedrates_element*)data;
|
struct capwap_80211_supportedrates_element* supportedrates = (struct capwap_80211_supportedrates_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[supportedrates->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[supportedrates->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES);
|
||||||
|
|
||||||
if (item->supportedrates) {
|
if (item->supportedrates) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->supportedrates);
|
ops->free(item->supportedrates);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->supportedrates = (struct capwap_80211_supportedrates_element*)ops->clone_message_element(supportedrates);
|
item->supportedrates = (struct capwap_80211_supportedrates_element*)ops->clone(supportedrates);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ static void ac_json_80211_supportedrates_createjson(struct json_object* jsonpare
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_supportedrates_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_supportedrates_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_SUPPORTEDRATES,
|
.type = CAPWAP_ELEMENT_80211_SUPPORTEDRATES,
|
||||||
.json_type = "IEEE80211SupportedRates",
|
.json_type = "IEEE80211SupportedRates",
|
||||||
.create_message_element = ac_json_80211_supportedrates_createmessageelement,
|
.create = ac_json_80211_supportedrates_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_supportedrates_addmessageelement,
|
.add_message_element = ac_json_80211_supportedrates_addmessageelement,
|
||||||
.create_json = ac_json_80211_supportedrates_createjson
|
.create_json = ac_json_80211_supportedrates_createjson
|
||||||
};
|
};
|
||||||
|
@ -32,18 +32,18 @@ static void* ac_json_80211_txpower_createmessageelement(struct json_object* json
|
|||||||
static int ac_json_80211_txpower_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_txpower_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_txpower_element* txpower = (struct capwap_80211_txpower_element*)data;
|
struct capwap_80211_txpower_element* txpower = (struct capwap_80211_txpower_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[txpower->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[txpower->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWER);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWER);
|
||||||
|
|
||||||
if (item->txpower) {
|
if (item->txpower) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->txpower);
|
ops->free(item->txpower);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->txpower = (struct capwap_80211_txpower_element*)ops->clone_message_element(txpower);
|
item->txpower = (struct capwap_80211_txpower_element*)ops->clone(txpower);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ static void ac_json_80211_txpower_createjson(struct json_object* jsonparent, voi
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_txpower_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_txpower_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_TXPOWER,
|
.type = CAPWAP_ELEMENT_80211_TXPOWER,
|
||||||
.json_type = "IEEE80211TxPower",
|
.json_type = "IEEE80211TxPower",
|
||||||
.create_message_element = ac_json_80211_txpower_createmessageelement,
|
.create = ac_json_80211_txpower_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_txpower_addmessageelement,
|
.add_message_element = ac_json_80211_txpower_addmessageelement,
|
||||||
.create_json = ac_json_80211_txpower_createjson
|
.create_json = ac_json_80211_txpower_createjson
|
||||||
};
|
};
|
||||||
|
@ -41,18 +41,18 @@ static void* ac_json_80211_txpowerlevel_createmessageelement(struct json_object*
|
|||||||
static int ac_json_80211_txpowerlevel_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_txpowerlevel_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_txpowerlevel_element* txpowerlevel = (struct capwap_80211_txpowerlevel_element*)data;
|
struct capwap_80211_txpowerlevel_element* txpowerlevel = (struct capwap_80211_txpowerlevel_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[txpowerlevel->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[txpowerlevel->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL);
|
||||||
|
|
||||||
if (item->txpowerlevel) {
|
if (item->txpowerlevel) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->txpowerlevel);
|
ops->free(item->txpowerlevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->txpowerlevel = (struct capwap_80211_txpowerlevel_element*)ops->clone_message_element(txpowerlevel);
|
item->txpowerlevel = (struct capwap_80211_txpowerlevel_element*)ops->clone(txpowerlevel);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ static void ac_json_80211_txpowerlevel_createjson(struct json_object* jsonparent
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_txpowerlevel_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_txpowerlevel_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_TXPOWERLEVEL,
|
.type = CAPWAP_ELEMENT_80211_TXPOWERLEVEL,
|
||||||
.json_type = "IEEE80211TXPowerLevel",
|
.json_type = "IEEE80211TXPowerLevel",
|
||||||
.create_message_element = ac_json_80211_txpowerlevel_createmessageelement,
|
.create = ac_json_80211_txpowerlevel_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_txpowerlevel_addmessageelement,
|
.add_message_element = ac_json_80211_txpowerlevel_addmessageelement,
|
||||||
.create_json = ac_json_80211_txpowerlevel_createjson
|
.create_json = ac_json_80211_txpowerlevel_createjson
|
||||||
};
|
};
|
||||||
|
@ -10,18 +10,18 @@ static void* ac_json_80211_updatewlan_createmessageelement(struct json_object* j
|
|||||||
static int ac_json_80211_updatewlan_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_updatewlan_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_updatewlan_element* updatewlan = (struct capwap_80211_updatewlan_element*)data;
|
struct capwap_80211_updatewlan_element* updatewlan = (struct capwap_80211_updatewlan_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[updatewlan->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[updatewlan->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN);
|
||||||
|
|
||||||
if (item->updatewlan) {
|
if (item->updatewlan) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->updatewlan);
|
ops->free(item->updatewlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->updatewlan = (struct capwap_80211_updatewlan_element*)ops->clone_message_element(updatewlan);
|
item->updatewlan = (struct capwap_80211_updatewlan_element*)ops->clone(updatewlan);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ static void ac_json_80211_updatewlan_createjson(struct json_object* jsonparent,
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_updatewlan_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_updatewlan_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_UPDATE_WLAN,
|
.type = CAPWAP_ELEMENT_80211_UPDATE_WLAN,
|
||||||
.json_type = "IEEE80211UpdateWLAN",
|
.json_type = "IEEE80211UpdateWLAN",
|
||||||
.create_message_element = ac_json_80211_updatewlan_createmessageelement,
|
.create = ac_json_80211_updatewlan_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_updatewlan_addmessageelement,
|
.add_message_element = ac_json_80211_updatewlan_addmessageelement,
|
||||||
.create_json = ac_json_80211_updatewlan_createjson
|
.create_json = ac_json_80211_updatewlan_createjson
|
||||||
};
|
};
|
||||||
|
@ -48,18 +48,18 @@ static void* ac_json_80211_wtpqos_createmessageelement(struct json_object* jsonp
|
|||||||
static int ac_json_80211_wtpqos_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_wtpqos_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_wtpqos_element* wtpqos = (struct capwap_80211_wtpqos_element*)data;
|
struct capwap_80211_wtpqos_element* wtpqos = (struct capwap_80211_wtpqos_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpqos->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpqos->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_QOS);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_QOS);
|
||||||
|
|
||||||
if (item->wtpqos) {
|
if (item->wtpqos) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->wtpqos);
|
ops->free(item->wtpqos);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->wtpqos = (struct capwap_80211_wtpqos_element*)ops->clone_message_element(wtpqos);
|
item->wtpqos = (struct capwap_80211_wtpqos_element*)ops->clone(wtpqos);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -73,7 +73,7 @@ static void ac_json_80211_wtpqos_createjson(struct json_object* jsonparent, void
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_wtpqos_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_wtpqos_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_WTP_QOS,
|
.type = CAPWAP_ELEMENT_80211_WTP_QOS,
|
||||||
.json_type = "IEEE80211WTPQoS",
|
.json_type = "IEEE80211WTPQoS",
|
||||||
.create_message_element = ac_json_80211_wtpqos_createmessageelement,
|
.create = ac_json_80211_wtpqos_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_wtpqos_addmessageelement,
|
.add_message_element = ac_json_80211_wtpqos_addmessageelement,
|
||||||
.create_json = ac_json_80211_wtpqos_createjson
|
.create_json = ac_json_80211_wtpqos_createjson
|
||||||
};
|
};
|
||||||
|
@ -86,18 +86,18 @@ static void* ac_json_80211_wtpradioconf_createmessageelement(struct json_object*
|
|||||||
static int ac_json_80211_wtpradioconf_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_wtpradioconf_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_wtpradioconf_element* wtpradioconf = (struct capwap_80211_wtpradioconf_element*)data;
|
struct capwap_80211_wtpradioconf_element* wtpradioconf = (struct capwap_80211_wtpradioconf_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradioconf->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradioconf->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF);
|
||||||
|
|
||||||
if (item->wtpradioconf) {
|
if (item->wtpradioconf) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->wtpradioconf);
|
ops->free(item->wtpradioconf);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->wtpradioconf = (struct capwap_80211_wtpradioconf_element*)ops->clone_message_element(wtpradioconf);
|
item->wtpradioconf = (struct capwap_80211_wtpradioconf_element*)ops->clone(wtpradioconf);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -122,7 +122,7 @@ static void ac_json_80211_wtpradioconf_createjson(struct json_object* jsonparent
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_wtpradioconf_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_wtpradioconf_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_WTP_RADIO_CONF,
|
.type = CAPWAP_ELEMENT_80211_WTP_RADIO_CONF,
|
||||||
.json_type = "IEEE80211WTPRadioConfiguration",
|
.json_type = "IEEE80211WTPRadioConfiguration",
|
||||||
.create_message_element = ac_json_80211_wtpradioconf_createmessageelement,
|
.create = ac_json_80211_wtpradioconf_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_wtpradioconf_addmessageelement,
|
.add_message_element = ac_json_80211_wtpradioconf_addmessageelement,
|
||||||
.create_json = ac_json_80211_wtpradioconf_createjson
|
.create_json = ac_json_80211_wtpradioconf_createjson
|
||||||
};
|
};
|
||||||
|
@ -42,18 +42,18 @@ static void* ac_json_80211_wtpradiofailalarm_createmessageelement(struct json_ob
|
|||||||
static int ac_json_80211_wtpradiofailalarm_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_wtpradiofailalarm_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_wtpradiofailalarm_element* wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)data;
|
struct capwap_80211_wtpradiofailalarm_element* wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradiofailalarm->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradiofailalarm->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM);
|
||||||
|
|
||||||
if (item->wtpradiofailalarm) {
|
if (item->wtpradiofailalarm) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->wtpradiofailalarm);
|
ops->free(item->wtpradiofailalarm);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)ops->clone_message_element(wtpradiofailalarm);
|
item->wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)ops->clone(wtpradiofailalarm);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -73,7 +73,7 @@ static void ac_json_80211_wtpradiofailalarm_createjson(struct json_object* jsonp
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_wtpradiofailalarm_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_wtpradiofailalarm_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM,
|
.type = CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM,
|
||||||
.json_type = "IEEE80211WTPRadioFailAlarm",
|
.json_type = "IEEE80211WTPRadioFailAlarm",
|
||||||
.create_message_element = ac_json_80211_wtpradiofailalarm_createmessageelement,
|
.create = ac_json_80211_wtpradiofailalarm_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_wtpradiofailalarm_addmessageelement,
|
.add_message_element = ac_json_80211_wtpradiofailalarm_addmessageelement,
|
||||||
.create_json = ac_json_80211_wtpradiofailalarm_createjson
|
.create_json = ac_json_80211_wtpradiofailalarm_createjson
|
||||||
};
|
};
|
||||||
|
@ -32,18 +32,18 @@ static void* ac_json_80211_wtpradioinformation_createmessageelement(struct json_
|
|||||||
static int ac_json_80211_wtpradioinformation_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
static int ac_json_80211_wtpradioinformation_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite) {
|
||||||
struct capwap_80211_wtpradioinformation_element* wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)data;
|
struct capwap_80211_wtpradioinformation_element* wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)data;
|
||||||
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradioinformation->radioid - 1];
|
struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradioinformation->radioid - 1];
|
||||||
struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION);
|
const struct capwap_message_elements_ops *ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION);
|
||||||
|
|
||||||
if (item->wtpradioinformation) {
|
if (item->wtpradioinformation) {
|
||||||
if (!overwrite) {
|
if (!overwrite) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ops->free_message_element(item->wtpradioinformation);
|
ops->free(item->wtpradioinformation);
|
||||||
}
|
}
|
||||||
|
|
||||||
item->valid = 1;
|
item->valid = 1;
|
||||||
item->wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)ops->clone_message_element(wtpradioinformation);
|
item->wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)ops->clone(wtpradioinformation);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ static void ac_json_80211_wtpradioinformation_createjson(struct json_object* jso
|
|||||||
struct ac_json_ieee80211_ops ac_json_80211_wtpradioinformation_ops = {
|
struct ac_json_ieee80211_ops ac_json_80211_wtpradioinformation_ops = {
|
||||||
.type = CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION,
|
.type = CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION,
|
||||||
.json_type = "IEEE80211WTPRadioInformation",
|
.json_type = "IEEE80211WTPRadioInformation",
|
||||||
.create_message_element = ac_json_80211_wtpradioinformation_createmessageelement,
|
.create = ac_json_80211_wtpradioinformation_createmessageelement,
|
||||||
.add_message_element = ac_json_80211_wtpradioinformation_addmessageelement,
|
.add_message_element = ac_json_80211_wtpradioinformation_addmessageelement,
|
||||||
.create_json = ac_json_80211_wtpradioinformation_createjson
|
.create_json = ac_json_80211_wtpradioinformation_createjson
|
||||||
};
|
};
|
||||||
|
@ -66,7 +66,7 @@ static int ac_backend_parsing_closewtpsession_event(const char* idevent, struct
|
|||||||
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
||||||
|
|
||||||
/* Async close session */
|
/* Async close session */
|
||||||
capwap_logging_debug("Receive close wtp session for WTP %s", session->wtpid);
|
log_printf(LOG_DEBUG, "Receive close wtp session for WTP %s", session->wtpid);
|
||||||
ac_session_send_action(session, AC_SESSION_ACTION_CLOSE, 0, NULL, 0);
|
ac_session_send_action(session, AC_SESSION_ACTION_CLOSE, 0, NULL, 0);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -138,7 +138,7 @@ static int ac_backend_parsing_resetwtp_event(const char* idevent, struct json_ob
|
|||||||
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
||||||
|
|
||||||
/* Notify Action */
|
/* Notify Action */
|
||||||
capwap_logging_debug("Receive reset request for WTP %s", session->wtpid);
|
log_printf(LOG_DEBUG, "Receive reset request for WTP %s", session->wtpid);
|
||||||
ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)reset, length);
|
ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)reset, length);
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
@ -289,7 +289,7 @@ static int ac_backend_parsing_addwlan_event(const char* idevent, struct json_obj
|
|||||||
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
||||||
|
|
||||||
/* Notify Action */
|
/* Notify Action */
|
||||||
capwap_logging_debug("Receive AddWLAN request for WTP %s with SSID: %s", session->wtpid, addwlan->ssid);
|
log_printf(LOG_DEBUG, "Receive AddWLAN request for WTP %s with SSID: %s", session->wtpid, addwlan->ssid);
|
||||||
ac_session_send_action(session, AC_SESSION_ACTION_ADDWLAN, 0, (void*)addwlan, length);
|
ac_session_send_action(session, AC_SESSION_ACTION_ADDWLAN, 0, (void*)addwlan, length);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -506,7 +506,7 @@ static int ac_backend_soap_join(int forcereset) {
|
|||||||
/* Retrieve AC configuration */
|
/* Retrieve AC configuration */
|
||||||
if (g_ac_backend.backendsessionid && forcereset) {
|
if (g_ac_backend.backendsessionid && forcereset) {
|
||||||
if (ac_backend_soap_getconfiguration()) {
|
if (ac_backend_soap_getconfiguration()) {
|
||||||
capwap_logging_error("Unable to get AC configuration from Backend Server");
|
log_printf(LOG_ERR, "Unable to get AC configuration from Backend Server");
|
||||||
capwap_free(g_ac_backend.backendsessionid);
|
capwap_free(g_ac_backend.backendsessionid);
|
||||||
g_ac_backend.backendsessionid = NULL;
|
g_ac_backend.backendsessionid = NULL;
|
||||||
}
|
}
|
||||||
@ -725,7 +725,7 @@ static void ac_backend_run(void) {
|
|||||||
|
|
||||||
/* Connection error, change Backend Server */
|
/* Connection error, change Backend Server */
|
||||||
connected = 0;
|
connected = 0;
|
||||||
capwap_logging_debug("Lost connection with Backend Server");
|
log_printf(LOG_DEBUG, "Lost connection with Backend Server");
|
||||||
capwap_lock_enter(&g_ac_backend.backendlock);
|
capwap_lock_enter(&g_ac_backend.backendlock);
|
||||||
|
|
||||||
/* Lost session id */
|
/* Lost session id */
|
||||||
@ -738,7 +738,7 @@ static void ac_backend_run(void) {
|
|||||||
} else {
|
} else {
|
||||||
/* Join with a Backend Server */
|
/* Join with a Backend Server */
|
||||||
if (!ac_backend_soap_join(forcereset)) {
|
if (!ac_backend_soap_join(forcereset)) {
|
||||||
capwap_logging_debug("Joined with Backend Server");
|
log_printf(LOG_DEBUG, "Joined with Backend Server");
|
||||||
|
|
||||||
/* Join Complete */
|
/* Join Complete */
|
||||||
connected = 1;
|
connected = 1;
|
||||||
@ -753,7 +753,7 @@ static void ac_backend_run(void) {
|
|||||||
|
|
||||||
/* Wait timeout before continue */
|
/* Wait timeout before continue */
|
||||||
if (g_ac_backend.errorjoinbackend >= g_ac.availablebackends->count) {
|
if (g_ac_backend.errorjoinbackend >= g_ac.availablebackends->count) {
|
||||||
capwap_logging_debug("Unable to join with Backend Server");
|
log_printf(LOG_DEBUG, "Unable to join with Backend Server");
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
forcereset = 1;
|
forcereset = 1;
|
||||||
@ -792,9 +792,9 @@ static void ac_backend_run(void) {
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
static void* ac_backend_thread(void* param) {
|
static void* ac_backend_thread(void* param) {
|
||||||
capwap_logging_debug("Backend start");
|
log_printf(LOG_DEBUG, "Backend start");
|
||||||
ac_backend_run();
|
ac_backend_run();
|
||||||
capwap_logging_debug("Backend stop");
|
log_printf(LOG_DEBUG, "Backend stop");
|
||||||
|
|
||||||
/* Thread exit */
|
/* Thread exit */
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
@ -843,13 +843,13 @@ int ac_backend_start(void) {
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
if (!g_ac.backendacid) {
|
if (!g_ac.backendacid) {
|
||||||
capwap_logging_error("AC Backend ID isn't set");
|
log_printf(LOG_ERR, "AC Backend ID isn't set");
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!g_ac.backendversion) {
|
} else if (!g_ac.backendversion) {
|
||||||
capwap_logging_error("Backend Protocol Version isn't set");
|
log_printf(LOG_ERR, "Backend Protocol Version isn't set");
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!g_ac.availablebackends->count) {
|
} else if (!g_ac.availablebackends->count) {
|
||||||
capwap_logging_error("List of available backends is empty");
|
log_printf(LOG_ERR, "List of available backends is empty");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -861,7 +861,7 @@ int ac_backend_start(void) {
|
|||||||
/* Create thread */
|
/* Create thread */
|
||||||
result = pthread_create(&g_ac_backend.threadid, NULL, ac_backend_thread, NULL);
|
result = pthread_create(&g_ac_backend.threadid, NULL, ac_backend_thread, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_debug("Unable create backend thread");
|
log_printf(LOG_DEBUG, "Unable create backend thread");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "ac_session.h"
|
#include "ac_session.h"
|
||||||
#include "ac_json.h"
|
#include "ac_json.h"
|
||||||
#include "ac_wlans.h"
|
#include "ac_wlans.h"
|
||||||
#include <json/json.h>
|
#include <json-c/json.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -222,7 +222,7 @@ static struct ac_soap_response* ac_dfa_state_configure_parsing_request(struct ac
|
|||||||
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
||||||
|
|
||||||
/* Parsing only IEEE 802.11 message element */
|
/* Parsing only IEEE 802.11 message element */
|
||||||
if (IS_80211_MESSAGE_ELEMENTS(messageelement->type)) {
|
if (IS_80211_MESSAGE_ELEMENTS(messageelement->id)) {
|
||||||
if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) {
|
if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) {
|
||||||
json_object_put(jsonparam);
|
json_object_put(jsonparam);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -759,7 +759,7 @@ void ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_p
|
|||||||
/* Send Configure response to WTP */
|
/* Send Configure response to WTP */
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
||||||
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
||||||
capwap_logging_debug("Warning: error to send configuration status response packet");
|
log_printf(LOG_DEBUG, "Warning: error to send configuration status response packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change state */
|
/* Change state */
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "capwap_array.h"
|
#include "capwap_array.h"
|
||||||
#include "ac_session.h"
|
#include "ac_session.h"
|
||||||
#include "ac_json.h"
|
#include "ac_json.h"
|
||||||
#include <json/json.h>
|
#include <json-c/json.h>
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static struct ac_soap_response* ac_dfa_state_datacheck_parsing_request(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
static struct ac_soap_response* ac_dfa_state_datacheck_parsing_request(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
||||||
@ -91,7 +91,7 @@ static struct ac_soap_response* ac_dfa_state_datacheck_parsing_request(struct ac
|
|||||||
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
||||||
|
|
||||||
/* Parsing only IEEE 802.11 message element */
|
/* Parsing only IEEE 802.11 message element */
|
||||||
if (IS_80211_MESSAGE_ELEMENTS(messageelement->type)) {
|
if (IS_80211_MESSAGE_ELEMENTS(messageelement->id)) {
|
||||||
if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) {
|
if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) {
|
||||||
json_object_put(jsonparam);
|
json_object_put(jsonparam);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -205,7 +205,7 @@ void ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_p
|
|||||||
/* Send Change event response to WTP */
|
/* Send Change event response to WTP */
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
||||||
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
||||||
capwap_logging_debug("Warning: error to send change event response packet");
|
log_printf(LOG_DEBUG, "Warning: error to send change event response packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change state */
|
/* Change state */
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "ac_session.h"
|
#include "ac_session.h"
|
||||||
#include "ac_backend.h"
|
#include "ac_backend.h"
|
||||||
#include "ac_json.h"
|
#include "ac_json.h"
|
||||||
#include <json/json.h>
|
#include <json-c/json.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -240,7 +240,7 @@ static struct ac_soap_response* ac_dfa_state_join_parsing_request(struct ac_sess
|
|||||||
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
||||||
|
|
||||||
/* Parsing only IEEE 802.11 message element */
|
/* Parsing only IEEE 802.11 message element */
|
||||||
if (IS_80211_MESSAGE_ELEMENTS(messageelement->type)) {
|
if (IS_80211_MESSAGE_ELEMENTS(messageelement->id)) {
|
||||||
if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) {
|
if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) {
|
||||||
json_object_put(jsonparam);
|
json_object_put(jsonparam);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -590,7 +590,7 @@ void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet
|
|||||||
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
|
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_info("WTP Id %s already used in another session", wtpid);
|
log_printf(LOG_INFO, "WTP Id %s already used in another session", wtpid);
|
||||||
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
|
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -606,7 +606,7 @@ void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet
|
|||||||
char sessionname[33];
|
char sessionname[33];
|
||||||
|
|
||||||
capwap_sessionid_printf(sessionid, sessionname);
|
capwap_sessionid_printf(sessionid, sessionname);
|
||||||
capwap_logging_info("Session Id %s already used in another session", sessionname);
|
log_printf(LOG_INFO, "Session Id %s already used in another session", sessionname);
|
||||||
|
|
||||||
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_ID_ALREADY_IN_USE;
|
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_ID_ALREADY_IN_USE;
|
||||||
}
|
}
|
||||||
@ -657,7 +657,7 @@ void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Error to send packets */
|
/* Error to send packets */
|
||||||
capwap_logging_debug("Warning: error to send join response packet");
|
log_printf(LOG_DEBUG, "Warning: error to send join response packet");
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ void ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packe
|
|||||||
/* Check the success of the Request */
|
/* Check the success of the Request */
|
||||||
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
|
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
|
||||||
if (resultcode && !CAPWAP_RESULTCODE_OK(resultcode->code)) {
|
if (resultcode && !CAPWAP_RESULTCODE_OK(resultcode->code)) {
|
||||||
capwap_logging_warning("Receive Reset Response with error: %d", (int)resultcode->code);
|
log_printf(LOG_WARNING, "Receive Reset Response with error: %d", (int)resultcode->code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
|
@ -58,14 +58,14 @@ static int receive_echo_request(struct ac_session_t* session, struct capwap_pars
|
|||||||
{
|
{
|
||||||
char sessionname[33];
|
char sessionname[33];
|
||||||
capwap_sessionid_printf(&session->sessionid, sessionname);
|
capwap_sessionid_printf(&session->sessionid, sessionname);
|
||||||
capwap_logging_debug("Send Echo Response to %s", sessionname);
|
log_printf(LOG_DEBUG, "Send Echo Response to %s", sessionname);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Send Configure response to WTP */
|
/* Send Configure response to WTP */
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
||||||
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
||||||
capwap_logging_debug("Warning: error to send echo response packet");
|
log_printf(LOG_DEBUG, "Warning: error to send echo response packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -88,7 +88,7 @@ static void execute_ieee80211_wlan_configuration_addwlan(struct ac_session_t* se
|
|||||||
|
|
||||||
/* Assign BSSID to session */
|
/* Assign BSSID to session */
|
||||||
if (ac_wlans_assign_bssid(session, wlan)) {
|
if (ac_wlans_assign_bssid(session, wlan)) {
|
||||||
capwap_logging_warning("Unable to add new wlan with radioid: %d, wlanid: %d", (int)assignbssid->radioid, (int)assignbssid->wlanid);
|
log_printf(LOG_WARNING, "Unable to add new wlan with radioid: %d, wlanid: %d", (int)assignbssid->radioid, (int)assignbssid->wlanid);
|
||||||
ac_wlans_free_bssid(wlan);
|
ac_wlans_free_bssid(wlan);
|
||||||
|
|
||||||
/* TODO: add remove wlan from wtp */
|
/* TODO: add remove wlan from wtp */
|
||||||
@ -142,7 +142,7 @@ static void receive_ieee80211_wlan_configuration_response(struct ac_session_t* s
|
|||||||
capwap_packet_rxmng_free(rxmngrequestpacket);
|
capwap_packet_rxmng_free(rxmngrequestpacket);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Receive IEEE802.11 WLAN Configuration Response with error: %d", (int)resultcode->code);
|
log_printf(LOG_WARNING, "Receive IEEE802.11 WLAN Configuration Response with error: %d", (int)resultcode->code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -170,7 +170,8 @@ static void execute_ieee80211_station_configuration_response_addstation(struct a
|
|||||||
station = ac_stations_get_station(session, station80211->radioid, wlan->address, addstation->address);
|
station = ac_stations_get_station(session, station80211->radioid, wlan->address, addstation->address);
|
||||||
if (station) {
|
if (station) {
|
||||||
if (CAPWAP_RESULTCODE_OK(resultcode->code)) {
|
if (CAPWAP_RESULTCODE_OK(resultcode->code)) {
|
||||||
capwap_logging_info("Authorized station: %s", station->addrtext);
|
log_printf(LOG_INFO, "Authorized station: " MACSTR,
|
||||||
|
MAC2STR(station->address));
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
station->flags |= AC_STATION_FLAGS_AUTHORIZED;
|
station->flags |= AC_STATION_FLAGS_AUTHORIZED;
|
||||||
@ -198,7 +199,8 @@ static void execute_ieee80211_station_configuration_response_deletestation(struc
|
|||||||
/* */
|
/* */
|
||||||
station = ac_stations_get_station(session, deletestation->radioid, NULL, deletestation->address);
|
station = ac_stations_get_station(session, deletestation->radioid, NULL, deletestation->address);
|
||||||
if (station) {
|
if (station) {
|
||||||
capwap_logging_info("Deauthorized station: %s with %d result code", station->addrtext, (int)resultcode->code);
|
log_printf(LOG_INFO, "Deauthorized station: " MACSTR " with %d result code",
|
||||||
|
MAC2STR(station->address), (int)resultcode->code);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
@ -258,7 +260,7 @@ void ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet*
|
|||||||
{
|
{
|
||||||
char sessionname[33];
|
char sessionname[33];
|
||||||
capwap_sessionid_printf(&session->sessionid, sessionname);
|
capwap_sessionid_printf(&session->sessionid, sessionname);
|
||||||
capwap_logging_debug("Receive Echo Request from %s", sessionname);
|
log_printf(LOG_DEBUG, "Receive Echo Request from %s", sessionname);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ static void ac_discovery_run(void) {
|
|||||||
struct capwap_packet_txmng* txmngpacket;
|
struct capwap_packet_txmng* txmngpacket;
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_debug("Receive discovery request packet");
|
log_printf(LOG_DEBUG, "Receive discovery request packet");
|
||||||
|
|
||||||
/* Creare discovery response */
|
/* Creare discovery response */
|
||||||
txmngpacket = ac_create_discovery_response(&packet);
|
txmngpacket = ac_create_discovery_response(&packet);
|
||||||
@ -186,7 +186,7 @@ static void ac_discovery_run(void) {
|
|||||||
|
|
||||||
/* Send discovery response to WTP */
|
/* Send discovery response to WTP */
|
||||||
if (!capwap_sendto_fragmentpacket(acpacket->sendsock, responsefragmentpacket, &acpacket->sender)) {
|
if (!capwap_sendto_fragmentpacket(acpacket->sendsock, responsefragmentpacket, &acpacket->sender)) {
|
||||||
capwap_logging_debug("Warning: error to send discovery response packet");
|
log_printf(LOG_DEBUG, "Warning: error to send discovery response packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't buffering a packets sent */
|
/* Don't buffering a packets sent */
|
||||||
@ -211,9 +211,9 @@ static void ac_discovery_run(void) {
|
|||||||
/* */
|
/* */
|
||||||
static void* ac_discovery_thread(void* param) {
|
static void* ac_discovery_thread(void* param) {
|
||||||
|
|
||||||
capwap_logging_debug("Discovery start");
|
log_printf(LOG_DEBUG, "Discovery start");
|
||||||
ac_discovery_run();
|
ac_discovery_run();
|
||||||
capwap_logging_debug("Discovery stop");
|
log_printf(LOG_DEBUG, "Discovery stop");
|
||||||
|
|
||||||
/* Thread exit */
|
/* Thread exit */
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
@ -234,7 +234,7 @@ int ac_discovery_start(void) {
|
|||||||
/* Create thread */
|
/* Create thread */
|
||||||
result = pthread_create(&g_ac_discovery.threadid, NULL, ac_discovery_thread, NULL);
|
result = pthread_create(&g_ac_discovery.threadid, NULL, ac_discovery_thread, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_debug("Unable create discovery thread");
|
log_printf(LOG_DEBUG, "Unable create discovery thread");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ static void ac_session_msgqueue_parsing_item(struct ac_session_msgqueue_item_t*
|
|||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
capwap_logging_debug("Unknown message queue item: %lu", item->message);
|
log_printf(LOG_DEBUG, "Unknown message queue item: %lu", item->message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -215,11 +215,11 @@ static void ac_wait_terminate_allsessions(void) {
|
|||||||
|
|
||||||
/* Wait that list is empty */
|
/* Wait that list is empty */
|
||||||
while (g_ac.sessionsthread->count > 0) {
|
while (g_ac.sessionsthread->count > 0) {
|
||||||
capwap_logging_debug("Waiting for %d session terminate", g_ac.sessionsthread->count);
|
log_printf(LOG_DEBUG, "Waiting for %d session terminate", g_ac.sessionsthread->count);
|
||||||
|
|
||||||
/* Receive message queue packet */
|
/* Receive message queue packet */
|
||||||
if (!ac_recvmsgqueue(g_ac.fdmsgsessions[1], &item)) {
|
if (!ac_recvmsgqueue(g_ac.fdmsgsessions[1], &item)) {
|
||||||
capwap_logging_debug("Unable to receive message queue");
|
log_printf(LOG_DEBUG, "Unable to receive message queue");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ static void ac_wait_terminate_allsessions(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
capwap_logging_debug("Close all sessions");
|
log_printf(LOG_DEBUG, "Close all sessions");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize message queue */
|
/* Initialize message queue */
|
||||||
@ -682,7 +682,7 @@ static struct ac_session_t* ac_create_session(int sock, union sockaddr_capwap* f
|
|||||||
/* */
|
/* */
|
||||||
capwap_itemlist_insert_after(g_ac.sessionsthread, NULL, itemlist);
|
capwap_itemlist_insert_after(g_ac.sessionsthread, NULL, itemlist);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_fatal("Unable create session thread, error code %d", result);
|
log_printf(LOG_EMERG, "Unable create session thread, error code %d", result);
|
||||||
capwap_exit(CAPWAP_OUT_OF_MEMORY);
|
capwap_exit(CAPWAP_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -828,7 +828,7 @@ int ac_execute(void) {
|
|||||||
|
|
||||||
/* Set file descriptor pool */
|
/* Set file descriptor pool */
|
||||||
if (ac_execute_init_fdspool(&fds, &g_ac.net, g_ac.fdmsgsessions[1]) <= 0) {
|
if (ac_execute_init_fdspool(&fds, &g_ac.net, g_ac.fdmsgsessions[1]) <= 0) {
|
||||||
capwap_logging_debug("Unable to initialize file descriptor pool");
|
log_printf(LOG_DEBUG, "Unable to initialize file descriptor pool");
|
||||||
return AC_ERROR_SYSTEM_FAILER;
|
return AC_ERROR_SYSTEM_FAILER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -841,7 +841,7 @@ int ac_execute(void) {
|
|||||||
/* Start discovery thread */
|
/* Start discovery thread */
|
||||||
if (!ac_discovery_start()) {
|
if (!ac_discovery_start()) {
|
||||||
ac_execute_free_fdspool(&fds);
|
ac_execute_free_fdspool(&fds);
|
||||||
capwap_logging_debug("Unable to start discovery thread");
|
log_printf(LOG_DEBUG, "Unable to start discovery thread");
|
||||||
return AC_ERROR_SYSTEM_FAILER;
|
return AC_ERROR_SYSTEM_FAILER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -849,7 +849,7 @@ int ac_execute(void) {
|
|||||||
if (!ac_backend_start()) {
|
if (!ac_backend_start()) {
|
||||||
ac_execute_free_fdspool(&fds);
|
ac_execute_free_fdspool(&fds);
|
||||||
ac_discovery_stop();
|
ac_discovery_stop();
|
||||||
capwap_logging_error("Unable start backend management");
|
log_printf(LOG_ERR, "Unable start backend management");
|
||||||
return AC_ERROR_SYSTEM_FAILER;
|
return AC_ERROR_SYSTEM_FAILER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -859,7 +859,7 @@ int ac_execute(void) {
|
|||||||
buffersize = sizeof(buffer);
|
buffersize = sizeof(buffer);
|
||||||
index = ac_recvfrom(&fds, buffer, &buffersize, &fromaddr, &toaddr);
|
index = ac_recvfrom(&fds, buffer, &buffersize, &fromaddr, &toaddr);
|
||||||
if (!g_ac.running) {
|
if (!g_ac.running) {
|
||||||
capwap_logging_debug("Closing AC");
|
log_printf(LOG_DEBUG, "Closing AC");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,8 @@ static void ac_ieee80211_mgmt_authentication_packet(struct ac_session_t* session
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_info("Receive IEEE802.11 Authentication Request from %s station", station->addrtext);
|
log_printf(LOG_INFO, "Receive IEEE802.11 Authentication Request "
|
||||||
|
"from " MACSTR " station", MAC2STR(station->address));
|
||||||
|
|
||||||
/* A station is removed if the association does not complete within a given period of time */
|
/* A station is removed if the association does not complete within a given period of time */
|
||||||
station->timeoutaction = AC_STATION_TIMEOUT_ACTION_DEAUTHENTICATE;
|
station->timeoutaction = AC_STATION_TIMEOUT_ACTION_DEAUTHENTICATE;
|
||||||
@ -62,7 +63,8 @@ static void ac_ieee80211_mgmt_authentication_packet(struct ac_session_t* session
|
|||||||
|
|
||||||
/* Parsing Information Elements */
|
/* Parsing Information Elements */
|
||||||
if (ieee80211_retrieve_information_elements_position(&ieitems, &mgmt->authetication.ie[0], ielength)) {
|
if (ieee80211_retrieve_information_elements_position(&ieitems, &mgmt->authetication.ie[0], ielength)) {
|
||||||
capwap_logging_info("Invalid IEEE802.11 Authentication Request from %s station", station->addrtext);
|
log_printf(LOG_INFO, "Invalid IEEE802.11 Authentication Request "
|
||||||
|
"from " MACSTR " station", MAC2STR(station->address));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,14 +97,18 @@ static void ac_ieee80211_mgmt_authentication_packet(struct ac_session_t* session
|
|||||||
if (responselength > 0) {
|
if (responselength > 0) {
|
||||||
/* Send authentication response */
|
/* Send authentication response */
|
||||||
if (!ac_kmod_send_data(&session->sessionid, wlan->device->radioid, session->binding, buffer, responselength)) {
|
if (!ac_kmod_send_data(&session->sessionid, wlan->device->radioid, session->binding, buffer, responselength)) {
|
||||||
capwap_logging_info("Sent IEEE802.11 Authentication Response to %s station with %d status code", station->addrtext, (int)responsestatuscode);
|
log_printf(LOG_INFO, "Sent IEEE802.11 Authentication Response "
|
||||||
|
"to " MACSTR " station with %d status code",
|
||||||
|
MAC2STR(station->address), (int)responsestatuscode);
|
||||||
station->flags |= AC_STATION_FLAGS_AUTHENTICATED;
|
station->flags |= AC_STATION_FLAGS_AUTHENTICATED;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to send IEEE802.11 Authentication Response to %s station", station->addrtext);
|
log_printf(LOG_WARNING, "Unable to send IEEE802.11 Authentication Response "
|
||||||
|
"to " MACSTR " station", MAC2STR(station->address));
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to create IEEE802.11 Authentication Response to %s station", station->addrtext);
|
log_printf(LOG_WARNING, "Unable to create IEEE802.11 Authentication Response "
|
||||||
|
"to " MACSTR " station", MAC2STR(station->address));
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -117,7 +123,9 @@ static void ac_ieee80211_mgmt_authentication_packet(struct ac_session_t* session
|
|||||||
statuscode = __le16_to_cpu(mgmt->authetication.statuscode);
|
statuscode = __le16_to_cpu(mgmt->authetication.statuscode);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_info("Receive IEEE802.11 Authentication Response to %s station with %d status code", station->addrtext, (int)statuscode);
|
log_printf(LOG_INFO, "Receive IEEE802.11 Authentication Response "
|
||||||
|
"to " MACSTR " station with %d status code",
|
||||||
|
MAC2STR(station->address), (int)statuscode);
|
||||||
|
|
||||||
if (statuscode == IEEE80211_STATUS_SUCCESS) {
|
if (statuscode == IEEE80211_STATUS_SUCCESS) {
|
||||||
algorithm = __le16_to_cpu(mgmt->authetication.algorithm);
|
algorithm = __le16_to_cpu(mgmt->authetication.algorithm);
|
||||||
@ -155,13 +163,15 @@ static void ac_ieee80211_mgmt_association_request_packet(struct ac_session_t* se
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_info("Receive IEEE802.11 Association Request from %s station", station->addrtext);
|
log_printf(LOG_INFO, "Receive IEEE802.11 Association Request "
|
||||||
|
"from " MACSTR " station", MAC2STR(station->address));
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
wlan = station->wlan;
|
wlan = station->wlan;
|
||||||
if (!(station->flags & AC_STATION_FLAGS_AUTHENTICATED)) {
|
if (!(station->flags & AC_STATION_FLAGS_AUTHENTICATED)) {
|
||||||
/* Invalid station, delete station */
|
/* Invalid station, delete station */
|
||||||
capwap_logging_info("Receive IEEE802.11 Association Request from %s unauthorized station", station->addrtext);
|
log_printf(LOG_INFO, "Receive IEEE802.11 Association Request "
|
||||||
|
"from " MACSTR " unauthorized station", MAC2STR(station->address));
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -191,7 +201,8 @@ static void ac_ieee80211_mgmt_association_request_packet(struct ac_session_t* se
|
|||||||
|
|
||||||
/* Parsing Information Elements */
|
/* Parsing Information Elements */
|
||||||
if (ieee80211_retrieve_information_elements_position(&ieitems, &mgmt->associationrequest.ie[0], ielength)) {
|
if (ieee80211_retrieve_information_elements_position(&ieitems, &mgmt->associationrequest.ie[0], ielength)) {
|
||||||
capwap_logging_info("Invalid IEEE802.11 Association Request from %s station", station->addrtext);
|
log_printf(LOG_INFO, "Invalid IEEE802.11 Association Request "
|
||||||
|
"from " MACSTR " station", MAC2STR(station->address));
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -237,17 +248,21 @@ static void ac_ieee80211_mgmt_association_request_packet(struct ac_session_t* se
|
|||||||
if (responselength > 0) {
|
if (responselength > 0) {
|
||||||
/* Send association response */
|
/* Send association response */
|
||||||
if (!ac_kmod_send_data(&session->sessionid, wlan->device->radioid, session->binding, buffer, responselength)) {
|
if (!ac_kmod_send_data(&session->sessionid, wlan->device->radioid, session->binding, buffer, responselength)) {
|
||||||
capwap_logging_info("Sent IEEE802.11 Association Response to %s station with %d status code", station->addrtext, (int)resultstatuscode);
|
log_printf(LOG_INFO, "Sent IEEE802.11 Association Response "
|
||||||
|
"to " MACSTR " station with %d status code",
|
||||||
|
MAC2STR(station->address), (int)resultstatuscode);
|
||||||
|
|
||||||
/* Active Station */
|
/* Active Station */
|
||||||
station->flags |= AC_STATION_FLAGS_ASSOCIATE;
|
station->flags |= AC_STATION_FLAGS_ASSOCIATE;
|
||||||
ac_stations_authorize_station(session, station);
|
ac_stations_authorize_station(session, station);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to send IEEE802.11 Association Response to %s station", station->addrtext);
|
log_printf(LOG_WARNING, "Unable to send IEEE802.11 Association Response "
|
||||||
|
"to " MACSTR " station", MAC2STR(station->address));
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to create IEEE802.11 Association Response to %s station", station->addrtext);
|
log_printf(LOG_WARNING, "Unable to create IEEE802.11 Association Response "
|
||||||
|
"to " MACSTR " station", MAC2STR(station->address));
|
||||||
ac_stations_delete_station(session, station);
|
ac_stations_delete_station(session, station);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -271,7 +286,9 @@ static void ac_ieee80211_mgmt_association_response_packet(struct ac_session_t* s
|
|||||||
if (!memcmp(mgmt->bssid, mgmt->sa, MACADDRESS_EUI48_LENGTH) && memcmp(mgmt->bssid, mgmt->da, MACADDRESS_EUI48_LENGTH)) {
|
if (!memcmp(mgmt->bssid, mgmt->sa, MACADDRESS_EUI48_LENGTH) && memcmp(mgmt->bssid, mgmt->da, MACADDRESS_EUI48_LENGTH)) {
|
||||||
station = ac_stations_get_station(session, radioid, mgmt->bssid, mgmt->da);
|
station = ac_stations_get_station(session, radioid, mgmt->bssid, mgmt->da);
|
||||||
if (station && station->wlan && (station->wlan->macmode == CAPWAP_ADD_WLAN_MACMODE_LOCAL)) {
|
if (station && station->wlan && (station->wlan->macmode == CAPWAP_ADD_WLAN_MACMODE_LOCAL)) {
|
||||||
capwap_logging_info("Receive IEEE802.11 Association Response to %s station with %d status code", station->addrtext, (int)mgmt->associationresponse.statuscode);
|
log_printf(LOG_INFO, "Receive IEEE802.11 Association Response "
|
||||||
|
"to " MACSTR " station with %d status code",
|
||||||
|
MAC2STR(station->address), (int)mgmt->associationresponse.statuscode);
|
||||||
|
|
||||||
if (mgmt->associationresponse.statuscode == IEEE80211_STATUS_SUCCESS) {
|
if (mgmt->associationresponse.statuscode == IEEE80211_STATUS_SUCCESS) {
|
||||||
/* Get Station Info */
|
/* Get Station Info */
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define __AC_JSON_HEADER__
|
#define __AC_JSON_HEADER__
|
||||||
|
|
||||||
#include "capwap_array.h"
|
#include "capwap_array.h"
|
||||||
#include <json/json.h>
|
#include <json-c/json.h>
|
||||||
|
|
||||||
#define IEEE80211_BINDING_JSON_ROOT "WTPRadio"
|
#define IEEE80211_BINDING_JSON_ROOT "WTPRadio"
|
||||||
|
|
||||||
@ -61,13 +61,13 @@ struct ac_json_ieee80211_wtpradio {
|
|||||||
/* */
|
/* */
|
||||||
struct ac_json_ieee80211_ops {
|
struct ac_json_ieee80211_ops {
|
||||||
/* Message Element Type */
|
/* Message Element Type */
|
||||||
uint16_t type;
|
struct capwap_message_element_id type;
|
||||||
|
|
||||||
/* Message Element JSON Type */
|
/* Message Element JSON Type */
|
||||||
char* json_type;
|
char* json_type;
|
||||||
|
|
||||||
/* Build message element */
|
/* Build message element */
|
||||||
void* (*create_message_element)(struct json_object* jsonparent, uint16_t radioid);
|
void* (*create)(struct json_object* jsonparent, uint16_t radioid);
|
||||||
int (*add_message_element)(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite);
|
int (*add_message_element)(struct ac_json_ieee80211_wtpradio* wtpradio, void* data, int overwrite);
|
||||||
|
|
||||||
/* Build JSON */
|
/* Build JSON */
|
||||||
@ -79,7 +79,9 @@ void ac_json_ieee80211_init(struct ac_json_ieee80211_wtpradio* wtpradio);
|
|||||||
void ac_json_ieee80211_free(struct ac_json_ieee80211_wtpradio* wtpradio);
|
void ac_json_ieee80211_free(struct ac_json_ieee80211_wtpradio* wtpradio);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, uint16_t type, void* data, int overwrite);
|
int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio *wtpradio,
|
||||||
|
const struct capwap_message_element_id id,
|
||||||
|
void *data, int overwrite);
|
||||||
int ac_json_ieee80211_parsingmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_message_element_itemlist* messageelement);
|
int ac_json_ieee80211_parsingmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_message_element_itemlist* messageelement);
|
||||||
int ac_json_ieee80211_parsingjson(struct ac_json_ieee80211_wtpradio* wtpradio, struct json_object* jsonroot);
|
int ac_json_ieee80211_parsingjson(struct ac_json_ieee80211_wtpradio* wtpradio, struct json_object* jsonroot);
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ static int ac_kmod_link(void) {
|
|||||||
if (result == -EALREADY) {
|
if (result == -EALREADY) {
|
||||||
result = 0;
|
result = 0;
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to connect kernel module, error code: %d", result);
|
log_printf(LOG_WARNING, "Unable to connect kernel module, error code: %d", result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ static void ac_kmod_event_receive(int fd, void** params, int paramscount) {
|
|||||||
/* */
|
/* */
|
||||||
res = nl_recvmsgs((struct nl_sock*)params[0], (struct nl_cb*)params[1]);
|
res = nl_recvmsgs((struct nl_sock*)params[0], (struct nl_cb*)params[1]);
|
||||||
if (res) {
|
if (res) {
|
||||||
capwap_logging_warning("Receive kernel module message failed: %d", res);
|
log_printf(LOG_WARNING, "Receive kernel module message failed: %d", res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,12 +233,12 @@ int ac_kmod_send_keepalive(struct capwap_sessionid_element* sessionid) {
|
|||||||
nla_put(msg, NLSMARTCAPWAP_ATTR_SESSION_ID, sizeof(struct capwap_sessionid_element), sessionid);
|
nla_put(msg, NLSMARTCAPWAP_ATTR_SESSION_ID, sizeof(struct capwap_sessionid_element), sessionid);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_debug("Prepare to send keep-alive");
|
log_printf(LOG_DEBUG, "Prepare to send keep-alive");
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to send keep-alive: %d", result);
|
log_printf(LOG_ERR, "Unable to send keep-alive: %d", result);
|
||||||
}
|
}
|
||||||
capwap_logging_debug("Sent keep-alive");
|
log_printf(LOG_DEBUG, "Sent keep-alive");
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
@ -270,7 +270,7 @@ int ac_kmod_send_data(struct capwap_sessionid_element* sessionid, uint8_t radioi
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to send data: %d", result);
|
log_printf(LOG_ERR, "Unable to send data: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -342,7 +342,7 @@ int ac_kmod_createdatachannel(int family, unsigned short port) {
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to bind kernel socket: %d", result);
|
log_printf(LOG_ERR, "Unable to bind kernel socket: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -372,7 +372,7 @@ int ac_kmod_new_datasession(struct capwap_sessionid_element* sessionid, uint8_t
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to create data session: %d", result);
|
log_printf(LOG_ERR, "Unable to create data session: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -400,7 +400,7 @@ int ac_kmod_delete_datasession(struct capwap_sessionid_element* sessionid) {
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result && (result != ENOENT)) {
|
if (result && (result != ENOENT)) {
|
||||||
capwap_logging_error("Unable to delete data session: %d", result);
|
log_printf(LOG_ERR, "Unable to delete data session: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -436,7 +436,7 @@ int ac_kmod_addwlan(struct capwap_sessionid_element* sessionid, uint8_t radioid,
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to add wlan: %d", result);
|
log_printf(LOG_ERR, "Unable to add wlan: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -464,7 +464,7 @@ int ac_kmod_removewlan(struct capwap_sessionid_element* sessionid) {
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result && (result != ENOENT)) {
|
if (result && (result != ENOENT)) {
|
||||||
capwap_logging_error("Unable to remove wlan: %d", result);
|
log_printf(LOG_ERR, "Unable to remove wlan: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -512,7 +512,7 @@ int ac_kmod_create_iface(const char* ifname, uint16_t mtu) {
|
|||||||
if (!result) {
|
if (!result) {
|
||||||
result = (ifindex ? (int)ifindex : -1);
|
result = (ifindex ? (int)ifindex : -1);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_error("Unable to create data session: %d", result);
|
log_printf(LOG_ERR, "Unable to create data session: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -540,7 +540,7 @@ int ac_kmod_delete_iface(int ifindex) {
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result && (result != ENOENT)) {
|
if (result && (result != ENOENT)) {
|
||||||
capwap_logging_error("Unable to delete interface: %d", result);
|
log_printf(LOG_ERR, "Unable to delete interface: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -580,7 +580,7 @@ int ac_kmod_authorize_station(struct capwap_sessionid_element* sessionid, const
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to authorize station: %d", result);
|
log_printf(LOG_ERR, "Unable to authorize station: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -610,7 +610,7 @@ int ac_kmod_deauthorize_station(struct capwap_sessionid_element* sessionid, cons
|
|||||||
/* */
|
/* */
|
||||||
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
result = ac_kmod_send_and_recv_msg(msg, NULL, NULL);
|
||||||
if (result) {
|
if (result) {
|
||||||
capwap_logging_error("Unable to deauthorize station: %d", result);
|
log_printf(LOG_ERR, "Unable to deauthorize station: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -644,7 +644,7 @@ int ac_kmod_init(void) {
|
|||||||
/* Get nlsmartcapwap netlink family */
|
/* Get nlsmartcapwap netlink family */
|
||||||
g_ac.kmodhandle.nlsmartcapwap_id = genl_ctrl_resolve(g_ac.kmodhandle.nl, NLSMARTCAPWAP_GENL_NAME);
|
g_ac.kmodhandle.nlsmartcapwap_id = genl_ctrl_resolve(g_ac.kmodhandle.nl, NLSMARTCAPWAP_GENL_NAME);
|
||||||
if (g_ac.kmodhandle.nlsmartcapwap_id < 0) {
|
if (g_ac.kmodhandle.nlsmartcapwap_id < 0) {
|
||||||
capwap_logging_warning("Unable to found kernel module");
|
log_printf(LOG_WARNING, "Unable to found kernel module");
|
||||||
ac_kmod_free();
|
ac_kmod_free();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -165,12 +165,12 @@ static int ac_session_action_authorizestation_response(struct ac_session_t* sess
|
|||||||
session->retransmitcount = 0;
|
session->retransmitcount = 0;
|
||||||
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to authorize station into kernel module data channel");
|
log_printf(LOG_WARNING, "Unable to authorize station into kernel module data channel");
|
||||||
ac_free_reference_last_request(session);
|
ac_free_reference_last_request(session);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Warning: error to send Station Configuration Request packet");
|
log_printf(LOG_DEBUG, "Warning: error to send Station Configuration Request packet");
|
||||||
ac_free_reference_last_request(session);
|
ac_free_reference_last_request(session);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
}
|
}
|
||||||
@ -219,7 +219,7 @@ static int ac_session_action_resetwtp(struct ac_session_t* session, struct ac_no
|
|||||||
ac_dfa_change_state(session, CAPWAP_RESET_STATE);
|
ac_dfa_change_state(session, CAPWAP_RESET_STATE);
|
||||||
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Warning: error to send Reset Request packet");
|
log_printf(LOG_DEBUG, "Warning: error to send Reset Request packet");
|
||||||
ac_free_reference_last_request(session);
|
ac_free_reference_last_request(session);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
}
|
}
|
||||||
@ -279,7 +279,7 @@ static int ac_session_action_addwlan(struct ac_session_t* session, struct ac_not
|
|||||||
session->retransmitcount = 0;
|
session->retransmitcount = 0;
|
||||||
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Warning: error to send WLAN Configuration Request packet");
|
log_printf(LOG_DEBUG, "Warning: error to send WLAN Configuration Request packet");
|
||||||
ac_free_reference_last_request(session);
|
ac_free_reference_last_request(session);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
}
|
}
|
||||||
@ -302,7 +302,7 @@ static int ac_session_action_station_configuration_ieee8011_add_station(struct a
|
|||||||
response = ac_session_action_authorizestation_request(session, notify->radioid, notify->wlanid, notify->address);
|
response = ac_session_action_authorizestation_request(session, notify->radioid, notify->wlanid, notify->address);
|
||||||
if (response) {
|
if (response) {
|
||||||
if (ac_session_action_authorizestation_response(session, response, notify)) {
|
if (ac_session_action_authorizestation_response(session, response, notify)) {
|
||||||
capwap_logging_info("Station is not authorized");
|
log_printf(LOG_INFO, "Station is not authorized");
|
||||||
/* TODO kickoff station */
|
/* TODO kickoff station */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ static int ac_session_action_station_configuration_ieee8011_delete_station(struc
|
|||||||
session->retransmitcount = 0;
|
session->retransmitcount = 0;
|
||||||
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Warning: error to send Station Configuration Request packet");
|
log_printf(LOG_DEBUG, "Warning: error to send Station Configuration Request packet");
|
||||||
ac_free_reference_last_request(session);
|
ac_free_reference_last_request(session);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
}
|
}
|
||||||
@ -399,7 +399,7 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses
|
|||||||
{
|
{
|
||||||
char sessionname[33];
|
char sessionname[33];
|
||||||
capwap_sessionid_printf(&session->sessionid, sessionname);
|
capwap_sessionid_printf(&session->sessionid, sessionname);
|
||||||
capwap_logging_debug("Receive Keep-Alive from %s", sessionname);
|
log_printf(LOG_DEBUG, "Receive Keep-Alive from %s", sessionname);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Send keep-alive response */
|
/* Send keep-alive response */
|
||||||
@ -601,7 +601,7 @@ static void ac_dfa_execute(struct ac_session_t* session, struct capwap_parsed_pa
|
|||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
capwap_logging_debug("Unknown AC action event: %lu", session->state);
|
log_printf(LOG_DEBUG, "Unknown AC action event: %lu", session->state);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -659,7 +659,7 @@ static void ac_session_destroy(struct ac_session_t* session) {
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
capwap_sessionid_printf(&session->sessionid, sessionname);
|
capwap_sessionid_printf(&session->sessionid, sessionname);
|
||||||
capwap_logging_debug("Release Session AC %s", sessionname);
|
log_printf(LOG_DEBUG, "Release Session AC %s", sessionname);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Release last reference */
|
/* Release last reference */
|
||||||
@ -674,7 +674,7 @@ static void ac_session_destroy(struct ac_session_t* session) {
|
|||||||
/* Check if all reference is release */
|
/* Check if all reference is release */
|
||||||
while (session->count > 0) {
|
while (session->count > 0) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
capwap_logging_debug("Wait for release Session AC %s (count=%d)", sessionname, session->count);
|
log_printf(LOG_DEBUG, "Wait for release Session AC %s (count=%d)", sessionname, session->count);
|
||||||
#endif
|
#endif
|
||||||
/* */
|
/* */
|
||||||
capwap_event_reset(&session->changereference);
|
capwap_event_reset(&session->changereference);
|
||||||
@ -777,9 +777,9 @@ static void ac_session_run(struct ac_session_t* session) {
|
|||||||
if (capwap_is_request_type(session->rxmngpacket->ctrlmsg.type) && (session->remotetype == session->rxmngpacket->ctrlmsg.type) && (session->remoteseqnumber == session->rxmngpacket->ctrlmsg.seq)) {
|
if (capwap_is_request_type(session->rxmngpacket->ctrlmsg.type) && (session->remotetype == session->rxmngpacket->ctrlmsg.type) && (session->remoteseqnumber == session->rxmngpacket->ctrlmsg.seq)) {
|
||||||
/* Retransmit response */
|
/* Retransmit response */
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
|
||||||
capwap_logging_error("Error to resend response packet");
|
log_printf(LOG_ERR, "Error to resend response packet");
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Retrasmitted control packet");
|
log_printf(LOG_DEBUG, "Retrasmitted control packet");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Check message type */
|
/* Check message type */
|
||||||
@ -832,24 +832,24 @@ static void ac_session_run(struct ac_session_t* session) {
|
|||||||
/* */
|
/* */
|
||||||
ac_dfa_execute(session, &packet);
|
ac_dfa_execute(session, &packet);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Failed validation parsed control packet");
|
log_printf(LOG_DEBUG, "Failed validation parsed control packet");
|
||||||
if (capwap_is_request_type(session->rxmngpacket->ctrlmsg.type)) {
|
if (capwap_is_request_type(session->rxmngpacket->ctrlmsg.type)) {
|
||||||
capwap_logging_warning("Missing Mandatory Message Element, send Response Packet with error");
|
log_printf(LOG_WARNING, "Missing Mandatory Message Element, send Response Packet with error");
|
||||||
ac_send_invalid_request(session, CAPWAP_RESULTCODE_FAILURE_MISSING_MANDATORY_MSG_ELEMENT);
|
ac_send_invalid_request(session, CAPWAP_RESULTCODE_FAILURE_MISSING_MANDATORY_MSG_ELEMENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Failed parsing packet");
|
log_printf(LOG_DEBUG, "Failed parsing packet");
|
||||||
if ((res == UNRECOGNIZED_MESSAGE_ELEMENT) && capwap_is_request_type(session->rxmngpacket->ctrlmsg.type)) {
|
if ((res == UNRECOGNIZED_MESSAGE_ELEMENT) && capwap_is_request_type(session->rxmngpacket->ctrlmsg.type)) {
|
||||||
capwap_logging_warning("Unrecognized Message Element, send Response Packet with error");
|
log_printf(LOG_WARNING, "Unrecognized Message Element, send Response Packet with error");
|
||||||
ac_send_invalid_request(session, CAPWAP_RESULTCODE_FAILURE_UNRECOGNIZED_MESSAGE_ELEMENT);
|
ac_send_invalid_request(session, CAPWAP_RESULTCODE_FAILURE_UNRECOGNIZED_MESSAGE_ELEMENT);
|
||||||
/* TODO: add the unrecognized message element */
|
/* TODO: add the unrecognized message element */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Invalid message type");
|
log_printf(LOG_DEBUG, "Invalid message type");
|
||||||
if (res == INVALID_REQUEST_MESSAGE_TYPE) {
|
if (res == INVALID_REQUEST_MESSAGE_TYPE) {
|
||||||
capwap_logging_warning("Unexpected Unrecognized Request, send Response Packet with error");
|
log_printf(LOG_WARNING, "Unexpected Unrecognized Request, send Response Packet with error");
|
||||||
ac_send_invalid_request(session, CAPWAP_RESULTCODE_MSG_UNEXPECTED_UNRECOGNIZED_REQUEST);
|
ac_send_invalid_request(session, CAPWAP_RESULTCODE_MSG_UNEXPECTED_UNRECOGNIZED_REQUEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -890,7 +890,7 @@ void ac_dfa_change_state(struct ac_session_t* session, int state) {
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
char sessionname[33];
|
char sessionname[33];
|
||||||
capwap_sessionid_printf(&session->sessionid, sessionname);
|
capwap_sessionid_printf(&session->sessionid, sessionname);
|
||||||
capwap_logging_debug("Session AC %s change state from %s to %s", sessionname, capwap_dfa_getname(session->state), capwap_dfa_getname(state));
|
log_printf(LOG_DEBUG, "Session AC %s change state from %s to %s", sessionname, capwap_dfa_getname(session->state), capwap_dfa_getname(state));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
session->state = state;
|
session->state = state;
|
||||||
@ -984,9 +984,9 @@ void* ac_session_thread(void* param) {
|
|||||||
threadid = session->threadid;
|
threadid = session->threadid;
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_debug("Session start");
|
log_printf(LOG_DEBUG, "Session start");
|
||||||
ac_session_run(session);
|
ac_session_run(session);
|
||||||
capwap_logging_debug("Session end");
|
log_printf(LOG_DEBUG, "Session end");
|
||||||
|
|
||||||
/* Notify terminate thread */
|
/* Notify terminate thread */
|
||||||
ac_msgqueue_notify_closethread(threadid);
|
ac_msgqueue_notify_closethread(threadid);
|
||||||
@ -1100,21 +1100,21 @@ void ac_dfa_retransmition_timeout(struct capwap_timeout* timeout, unsigned long
|
|||||||
struct ac_session_t* session = (struct ac_session_t*)context;
|
struct ac_session_t* session = (struct ac_session_t*)context;
|
||||||
|
|
||||||
if (!session->requestfragmentpacket->count) {
|
if (!session->requestfragmentpacket->count) {
|
||||||
capwap_logging_warning("Invalid retransmition request packet");
|
log_printf(LOG_WARNING, "Invalid retransmition request packet");
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
} else {
|
} else {
|
||||||
session->retransmitcount++;
|
session->retransmitcount++;
|
||||||
if (session->retransmitcount >= AC_MAX_RETRANSMIT) {
|
if (session->retransmitcount >= AC_MAX_RETRANSMIT) {
|
||||||
capwap_logging_info("Retransmition request packet timeout");
|
log_printf(LOG_INFO, "Retransmition request packet timeout");
|
||||||
|
|
||||||
/* Timeout reset state */
|
/* Timeout reset state */
|
||||||
ac_free_reference_last_request(session);
|
ac_free_reference_last_request(session);
|
||||||
ac_session_teardown(session);
|
ac_session_teardown(session);
|
||||||
} else {
|
} else {
|
||||||
/* Retransmit Request */
|
/* Retransmit Request */
|
||||||
capwap_logging_debug("Retransmition request packet");
|
log_printf(LOG_DEBUG, "Retransmition request packet");
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->requestfragmentpacket)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->requestfragmentpacket)) {
|
||||||
capwap_logging_error("Error to send request packet");
|
log_printf(LOG_ERR, "Error to send request packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update timeout */
|
/* Update timeout */
|
||||||
@ -1124,6 +1124,6 @@ void ac_dfa_retransmition_timeout(struct capwap_timeout* timeout, unsigned long
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ac_dfa_teardown_timeout(struct capwap_timeout* timeout, unsigned long index, void* context, void* param) {
|
void ac_dfa_teardown_timeout(struct capwap_timeout* timeout, unsigned long index, void* context, void* param) {
|
||||||
capwap_logging_info("Session timeout, teardown");
|
log_printf(LOG_INFO, "Session timeout, teardown");
|
||||||
ac_session_teardown((struct ac_session_t*)context);
|
ac_session_teardown((struct ac_session_t*)context);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ static void ac_stations_destroy_station(struct ac_session_t* session, struct ac_
|
|||||||
ASSERT(station != NULL);
|
ASSERT(station != NULL);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_info("Destroy station: %s", station->addrtext);
|
log_printf(LOG_INFO, "Destroy station: " MACSTR, MAC2STR(station->address));
|
||||||
|
|
||||||
/* Remove reference from Authoritative Stations List */
|
/* Remove reference from Authoritative Stations List */
|
||||||
capwap_rwlock_wrlock(&g_ac.authstationslock);
|
capwap_rwlock_wrlock(&g_ac.authstationslock);
|
||||||
@ -139,9 +139,8 @@ void ac_wlans_destroy(struct ac_session_t* session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
int ac_wlans_assign_bssid(struct ac_session_t* session, struct ac_wlan* wlan) {
|
int ac_wlans_assign_bssid(struct ac_session_t* session, struct ac_wlan* wlan)
|
||||||
char buffer[CAPWAP_MACADDRESS_EUI48_BUFFER];
|
{
|
||||||
|
|
||||||
ASSERT(session != NULL);
|
ASSERT(session != NULL);
|
||||||
ASSERT(session->wlans != NULL);
|
ASSERT(session->wlans != NULL);
|
||||||
ASSERT(wlan != NULL);
|
ASSERT(wlan != NULL);
|
||||||
@ -166,7 +165,8 @@ int ac_wlans_assign_bssid(struct ac_session_t* session, struct ac_wlan* wlan) {
|
|||||||
capwap_itemlist_insert_after(session->wlans->devices[wlan->device->radioid - 1].wlans, NULL, wlan->wlanitem);
|
capwap_itemlist_insert_after(session->wlans->devices[wlan->device->radioid - 1].wlans, NULL, wlan->wlanitem);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_logging_info("Added new wlan with radioid: %d, wlanid: %d, bssid: %s", (int)wlan->device->radioid, (int)wlan->wlanid, capwap_printf_macaddress(buffer, wlan->address, MACADDRESS_EUI48_LENGTH));
|
log_printf(LOG_INFO, "Added new wlan with radioid: %d, wlanid: %d, bssid: " MACSTR,
|
||||||
|
(int)wlan->device->radioid, (int)wlan->wlanid, MAC2STR(wlan->address));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,9 +325,8 @@ struct ac_station* ac_stations_get_station(struct ac_session_t* session, uint8_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct ac_station* ac_stations_create_station(struct ac_session_t* session, uint8_t radioid, const uint8_t* bssid, const uint8_t* address) {
|
struct ac_station* ac_stations_create_station(struct ac_session_t* session, uint8_t radioid, const uint8_t* bssid, const uint8_t* address)
|
||||||
char buffer1[CAPWAP_MACADDRESS_EUI48_BUFFER];
|
{
|
||||||
char buffer2[CAPWAP_MACADDRESS_EUI48_BUFFER];
|
|
||||||
struct ac_wlan* wlan;
|
struct ac_wlan* wlan;
|
||||||
struct ac_station* authoritativestation;
|
struct ac_station* authoritativestation;
|
||||||
struct ac_station* station = NULL;
|
struct ac_station* station = NULL;
|
||||||
@ -340,9 +339,8 @@ struct ac_station* ac_stations_create_station(struct ac_session_t* session, uint
|
|||||||
ASSERT(address != NULL);
|
ASSERT(address != NULL);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_printf_macaddress(buffer1, bssid, MACADDRESS_EUI48_LENGTH);
|
log_printf(LOG_INFO, "Create station to radioid: %d, bssid: " MACSTR ", station address: " MACSTR,
|
||||||
capwap_printf_macaddress(buffer2, address, MACADDRESS_EUI48_LENGTH);
|
(int)radioid, MAC2STR(bssid), MAC2STR(address));
|
||||||
capwap_logging_info("Create station to radioid: %d, bssid: %s, station address: %s", (int)radioid, buffer1, buffer2);
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
wlan = ac_wlans_get_bssid(session, radioid, bssid);
|
wlan = ac_wlans_get_bssid(session, radioid, bssid);
|
||||||
@ -357,7 +355,6 @@ struct ac_station* ac_stations_create_station(struct ac_session_t* session, uint
|
|||||||
/* */
|
/* */
|
||||||
station->idtimeout = CAPWAP_TIMEOUT_INDEX_NO_SET;
|
station->idtimeout = CAPWAP_TIMEOUT_INDEX_NO_SET;
|
||||||
memcpy(station->address, address, MACADDRESS_EUI48_LENGTH);
|
memcpy(station->address, address, MACADDRESS_EUI48_LENGTH);
|
||||||
capwap_printf_macaddress(station->addrtext, address, MACADDRESS_EUI48_LENGTH);
|
|
||||||
station->wlanitem = stationitem;
|
station->wlanitem = stationitem;
|
||||||
station->session = session;
|
station->session = session;
|
||||||
|
|
||||||
@ -392,7 +389,8 @@ struct ac_station* ac_stations_create_station(struct ac_session_t* session, uint
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_warning("Unable to find radioid: %d, bssid: %s", (int)radioid, buffer1);
|
log_printf(LOG_WARNING, "Unable to find radioid: %d, bssid: " MACSTR,
|
||||||
|
(int)radioid, MAC2STR(bssid));
|
||||||
}
|
}
|
||||||
|
|
||||||
return station;
|
return station;
|
||||||
@ -479,7 +477,8 @@ void ac_stations_timeout(struct capwap_timeout* timeout, unsigned long index, vo
|
|||||||
if (station->idtimeout == index) {
|
if (station->idtimeout == index) {
|
||||||
switch (station->timeoutaction) {
|
switch (station->timeoutaction) {
|
||||||
case AC_STATION_TIMEOUT_ACTION_DEAUTHENTICATE: {
|
case AC_STATION_TIMEOUT_ACTION_DEAUTHENTICATE: {
|
||||||
capwap_logging_warning("The %s station has not completed the association in time", station->addrtext);
|
log_printf(LOG_WARNING, "The " MACSTR " station has not completed "
|
||||||
|
"the association in time", MAC2STR(station->address));
|
||||||
ac_stations_delete_station((struct ac_session_t*)param, station);
|
ac_stations_delete_station((struct ac_session_t*)param, station);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,6 @@ struct ac_wlans {
|
|||||||
/* AC Station */
|
/* AC Station */
|
||||||
struct ac_station {
|
struct ac_station {
|
||||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||||
char addrtext[CAPWAP_MACADDRESS_EUI48_BUFFER];
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -764,3 +764,27 @@ int ieee80211_create_deauthentication(uint8_t* buffer, int length, struct ieee80
|
|||||||
|
|
||||||
return (int)((uint8_t*)&header->deauthetication.ie[0] - (uint8_t*)header);
|
return (int)((uint8_t*)&header->deauthetication.ie[0] - (uint8_t*)header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
int ieee80211_create_disassociation(uint8_t* buffer, int length,
|
||||||
|
struct ieee80211_disassociation_params* params)
|
||||||
|
{
|
||||||
|
struct ieee80211_header_mgmt* header;
|
||||||
|
|
||||||
|
ASSERT(buffer != NULL);
|
||||||
|
|
||||||
|
/* */
|
||||||
|
header = (struct ieee80211_header_mgmt*)buffer;
|
||||||
|
|
||||||
|
/* Management header frame */
|
||||||
|
header->framecontrol = IEEE80211_FRAME_CONTROL(IEEE80211_FRAMECONTROL_TYPE_MGMT,
|
||||||
|
IEEE80211_FRAMECONTROL_MGMT_SUBTYPE_DISASSOCIATION);
|
||||||
|
header->durationid = __cpu_to_le16(0);
|
||||||
|
memcpy(header->da, params->station, ETH_ALEN);
|
||||||
|
memcpy(header->sa, params->bssid, ETH_ALEN);
|
||||||
|
memcpy(header->bssid, params->bssid, ETH_ALEN);
|
||||||
|
header->sequencecontrol = __cpu_to_le16(0);
|
||||||
|
header->disassociation.reasoncode = __cpu_to_le16(params->reasoncode);
|
||||||
|
|
||||||
|
return (int)((uint8_t*)&header->disassociation.ie[0] - (uint8_t*)header);
|
||||||
|
}
|
||||||
|
@ -420,6 +420,9 @@ struct ieee80211_ie_erp {
|
|||||||
uint8_t params;
|
uint8_t params;
|
||||||
} STRUCT_PACKED;
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
|
/* 802.11 RSN information element */
|
||||||
|
#define IEEE80211_IE_RSN_INFORMATION 48
|
||||||
|
|
||||||
/* 802.11 Extended Supported Rates information element */
|
/* 802.11 Extended Supported Rates information element */
|
||||||
#define IEEE80211_IE_EXTENDED_SUPPORTED_RATES 50
|
#define IEEE80211_IE_EXTENDED_SUPPORTED_RATES 50
|
||||||
#define IEEE80211_IE_EXTENDED_SUPPORTED_MIN_LENGTH 1
|
#define IEEE80211_IE_EXTENDED_SUPPORTED_MIN_LENGTH 1
|
||||||
@ -500,6 +503,80 @@ struct ieee80211_ie_wmm_information_element {
|
|||||||
uint8_t qos_info;
|
uint8_t qos_info;
|
||||||
} STRUCT_PACKED;
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
|
#define IEEE80211_HT_MCS_MASK_LEN 10
|
||||||
|
|
||||||
|
struct ieee80211_mcs_info {
|
||||||
|
uint8_t rx_mask[IEEE80211_HT_MCS_MASK_LEN];
|
||||||
|
uint16_t rx_highest;
|
||||||
|
uint8_t tx_params;
|
||||||
|
uint8_t reserved[3];
|
||||||
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct ieee80211_ht_cap - HT capabilities
|
||||||
|
*
|
||||||
|
* This structure is the "HT capabilities element" as
|
||||||
|
* described in 802.11n D5.0 7.3.2.57
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IEEE80211_IE_HT_CAPABILITY 45
|
||||||
|
|
||||||
|
struct ieee80211_ht_cap {
|
||||||
|
uint16_t cap_info;
|
||||||
|
uint8_t ampdu_params_info;
|
||||||
|
|
||||||
|
/* 16 bytes MCS information */
|
||||||
|
struct ieee80211_mcs_info mcs;
|
||||||
|
|
||||||
|
uint16_t extended_ht_cap_info;
|
||||||
|
uint32_t tx_BF_cap_info;
|
||||||
|
uint8_t antenna_selection_info;
|
||||||
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
|
struct ieee80211_ie_ht_cap {
|
||||||
|
uint8_t id;
|
||||||
|
uint8_t len;
|
||||||
|
struct ieee80211_ht_cap ht_cap;
|
||||||
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
|
|
||||||
|
/* 802.11n HT capabilities masks (for cap_info) */
|
||||||
|
#define IEEE80211_HT_CAP_LDPC_CODING 0x0001
|
||||||
|
#define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002
|
||||||
|
#define IEEE80211_HT_CAP_SM_PS 0x000C
|
||||||
|
#define IEEE80211_HT_CAP_SM_PS_SHIFT 2
|
||||||
|
#define IEEE80211_HT_CAP_GRN_FLD 0x0010
|
||||||
|
#define IEEE80211_HT_CAP_SGI_20 0x0020
|
||||||
|
#define IEEE80211_HT_CAP_SGI_40 0x0040
|
||||||
|
#define IEEE80211_HT_CAP_TX_STBC 0x0080
|
||||||
|
#define IEEE80211_HT_CAP_RX_STBC 0x0300
|
||||||
|
#define IEEE80211_HT_CAP_RX_STBC_SHIFT 8
|
||||||
|
#define IEEE80211_HT_CAP_DELAY_BA 0x0400
|
||||||
|
#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
|
||||||
|
#define IEEE80211_HT_CAP_DSSSCCK40 0x1000
|
||||||
|
#define IEEE80211_HT_CAP_RESERVED 0x2000
|
||||||
|
#define IEEE80211_HT_CAP_40MHZ_INTOLERANT 0x4000
|
||||||
|
#define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct ieee80211_ht_operation - HT operation IE
|
||||||
|
*
|
||||||
|
* This structure is the "HT operation element" as
|
||||||
|
* described in 802.11n-2009 7.3.2.57
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IEEE80211_IE_HT_OPERATION 61
|
||||||
|
|
||||||
|
struct ieee80211_ht_operation {
|
||||||
|
uint8_t id;
|
||||||
|
uint8_t len;
|
||||||
|
uint8_t primary_chan;
|
||||||
|
uint8_t ht_param;
|
||||||
|
uint16_t operation_mode;
|
||||||
|
uint16_t stbc_param;
|
||||||
|
uint8_t basic_set[16];
|
||||||
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
/* 802.11 All information elements */
|
/* 802.11 All information elements */
|
||||||
struct ieee80211_ie_items {
|
struct ieee80211_ie_items {
|
||||||
struct ieee80211_ie_ssid *ssid;
|
struct ieee80211_ie_ssid *ssid;
|
||||||
@ -514,6 +591,8 @@ struct ieee80211_ie_items {
|
|||||||
struct ieee80211_ie_power_constraint *power_constraint;
|
struct ieee80211_ie_power_constraint *power_constraint;
|
||||||
struct ieee80211_ie_ssid_list *ssid_list;
|
struct ieee80211_ie_ssid_list *ssid_list;
|
||||||
struct ieee80211_ie_wmm_information_element *wmm_ie;
|
struct ieee80211_ie_wmm_information_element *wmm_ie;
|
||||||
|
struct ieee80211_ie_ht_cap *ht_cap;
|
||||||
|
struct ieee80211_ht_operation *ht_oper;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* IEEE 802.11 functions */
|
/* IEEE 802.11 functions */
|
||||||
@ -621,6 +700,16 @@ struct ieee80211_deauthentication_params {
|
|||||||
|
|
||||||
int ieee80211_create_deauthentication(uint8_t* buffer, int length, struct ieee80211_deauthentication_params* params);
|
int ieee80211_create_deauthentication(uint8_t* buffer, int length, struct ieee80211_deauthentication_params* params);
|
||||||
|
|
||||||
|
/* Management Disassociation */
|
||||||
|
struct ieee80211_disassociation_params {
|
||||||
|
uint8_t bssid[ETH_ALEN];
|
||||||
|
uint8_t station[ETH_ALEN];
|
||||||
|
|
||||||
|
uint16_t reasoncode;
|
||||||
|
};
|
||||||
|
|
||||||
|
int ieee80211_create_disassociation(uint8_t* buffer, int length, struct ieee80211_disassociation_params* params);
|
||||||
|
|
||||||
/* Utils */
|
/* Utils */
|
||||||
int ieee80211_retrieve_information_elements_position(struct ieee80211_ie_items* items, const uint8_t* data, int length);
|
int ieee80211_retrieve_information_elements_position(struct ieee80211_ie_items* items, const uint8_t* data, int length);
|
||||||
unsigned long ieee80211_frequency_to_channel(uint32_t freq);
|
unsigned long ieee80211_frequency_to_channel(uint32_t freq);
|
||||||
|
@ -76,7 +76,7 @@ void capwap_daemon(void);
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
#define capwap_outofmemory() do { \
|
#define capwap_outofmemory() do { \
|
||||||
capwap_logging_fatal("Out of memory %s(%d)", __FILE__, __LINE__); \
|
log_printf(LOG_EMERG, "Out of memory %s(%d)", __FILE__, __LINE__); \
|
||||||
capwap_exit(CAPWAP_OUT_OF_MEMORY); \
|
capwap_exit(CAPWAP_OUT_OF_MEMORY); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
@ -36,14 +36,14 @@ void* capwap_alloc_debug(size_t size, const char* file, const int line) {
|
|||||||
|
|
||||||
/* Request size > 0 */
|
/* Request size > 0 */
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
capwap_logging_debug("%s(%d): Invalid memory size %d", file, line, size);
|
log_printf(LOG_DEBUG, "%s(%d): Invalid memory size %zu", file, line, size);
|
||||||
exit(CAPWAP_ASSERT_CONDITION);
|
exit(CAPWAP_ASSERT_CONDITION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Alloc block with memory block */
|
/* Alloc block with memory block */
|
||||||
block = (struct capwap_memory_block*)malloc(sizeof(struct capwap_memory_block) + size);
|
block = (struct capwap_memory_block*)malloc(sizeof(struct capwap_memory_block) + size);
|
||||||
if (!block) {
|
if (!block) {
|
||||||
capwap_logging_debug("Out of memory %s(%d)", file, line);
|
log_printf(LOG_DEBUG, "Out of memory %s(%d)", file, line);
|
||||||
exit(CAPWAP_OUT_OF_MEMORY);
|
exit(CAPWAP_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,19 +69,19 @@ void capwap_free_debug(void* p, const char* file, const int line) {
|
|||||||
struct capwap_memory_block* prevblock;
|
struct capwap_memory_block* prevblock;
|
||||||
|
|
||||||
if (!p) {
|
if (!p) {
|
||||||
capwap_logging_debug("%s(%d): Free NULL pointer", file, line);
|
log_printf(LOG_DEBUG, "%s(%d): Free NULL pointer", file, line);
|
||||||
exit(CAPWAP_ASSERT_CONDITION);
|
exit(CAPWAP_ASSERT_CONDITION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory block */
|
/* Memory block */
|
||||||
if ((size_t)p <= sizeof(struct capwap_memory_block)) {
|
if ((size_t)p <= sizeof(struct capwap_memory_block)) {
|
||||||
capwap_logging_debug("%s(%d): Invalid pointer", file, line);
|
log_printf(LOG_DEBUG, "%s(%d): Invalid pointer", file, line);
|
||||||
exit(CAPWAP_ASSERT_CONDITION);
|
exit(CAPWAP_ASSERT_CONDITION);
|
||||||
}
|
}
|
||||||
|
|
||||||
block = (struct capwap_memory_block*)((char*)p - sizeof(struct capwap_memory_block));
|
block = (struct capwap_memory_block*)((char*)p - sizeof(struct capwap_memory_block));
|
||||||
if (block->item != p) {
|
if (block->item != p) {
|
||||||
capwap_logging_debug("%s(%d): Invalid pointer", file, line);
|
log_printf(LOG_DEBUG, "%s(%d): Invalid pointer", file, line);
|
||||||
exit(CAPWAP_ASSERT_CONDITION);
|
exit(CAPWAP_ASSERT_CONDITION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ void capwap_free_debug(void* p, const char* file, const int line) {
|
|||||||
findblock = findblock->next;
|
findblock = findblock->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
capwap_logging_debug("%s(%d): Unable to find memory block", file, line);
|
log_printf(LOG_DEBUG, "%s(%d): Unable to find memory block", file, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump memory alloced */
|
/* Dump memory alloced */
|
||||||
@ -119,7 +119,8 @@ void capwap_dump_memory(void) {
|
|||||||
|
|
||||||
findblock = g_memoryblocks;
|
findblock = g_memoryblocks;
|
||||||
while (findblock != NULL) {
|
while (findblock != NULL) {
|
||||||
capwap_logging_debug("%s(%d): block at %p, %d bytes long", findblock->file, findblock->line, findblock->item, findblock->size);
|
log_printf(LOG_DEBUG, "%s(%d): block at %p, %zu bytes long",
|
||||||
|
findblock->file, findblock->line, findblock->item, findblock->size);
|
||||||
|
|
||||||
#ifdef USE_DEBUG_BACKTRACE
|
#ifdef USE_DEBUG_BACKTRACE
|
||||||
backtrace_functions = backtrace_symbols(findblock->backtrace, findblock->backtrace_count);
|
backtrace_functions = backtrace_symbols(findblock->backtrace, findblock->backtrace_count);
|
||||||
@ -128,7 +129,7 @@ void capwap_dump_memory(void) {
|
|||||||
|
|
||||||
/* Skipping capwap_alloc_debug function print out */
|
/* Skipping capwap_alloc_debug function print out */
|
||||||
for (j = 1; j < findblock->backtrace_count; j++) {
|
for (j = 1; j < findblock->backtrace_count; j++) {
|
||||||
capwap_logging_debug("\t%s", backtrace_functions[j]);
|
log_printf(LOG_DEBUG, "\t%s", backtrace_functions[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(backtrace_functions);
|
free(backtrace_functions);
|
||||||
@ -143,9 +144,9 @@ void capwap_dump_memory(void) {
|
|||||||
/* Check if all memory is free */
|
/* Check if all memory is free */
|
||||||
int capwap_check_memory_leak(int verbose) {
|
int capwap_check_memory_leak(int verbose) {
|
||||||
if ((g_memoryblocks != NULL) && (verbose != 0)) {
|
if ((g_memoryblocks != NULL) && (verbose != 0)) {
|
||||||
capwap_logging_debug("*** Detected memory leaks ! ***");
|
log_printf(LOG_DEBUG, "*** Detected memory leaks ! ***");
|
||||||
capwap_dump_memory();
|
capwap_dump_memory();
|
||||||
capwap_logging_debug("*******************************");
|
log_printf(LOG_DEBUG, "*******************************");
|
||||||
}
|
}
|
||||||
|
|
||||||
return ((g_memoryblocks != NULL) ? 1 : 0);
|
return ((g_memoryblocks != NULL) ? 1 : 0);
|
||||||
@ -167,7 +168,7 @@ void capwap_backtrace_callstack(void) {
|
|||||||
|
|
||||||
/* Skipping capwap_backtrace_callstack function print out */
|
/* Skipping capwap_backtrace_callstack function print out */
|
||||||
for (i = 1; i < count; i++) {
|
for (i = 1; i < count; i++) {
|
||||||
capwap_logging_debug("\t%s", functions[i]);
|
log_printf(LOG_DEBUG, "\t%s", functions[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(functions);
|
free(functions);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
#define ASSERT(expr) if (!(expr)) { capwap_logging_fatal("Assertion failed \'%s\': %s(%d)", #expr, __FILE__, __LINE__); capwap_exit(CAPWAP_ASSERT_CONDITION); }
|
#define ASSERT(expr) if (!(expr)) { log_printf(LOG_EMERG, "Assertion failed \'%s\': %s(%d)", #expr, __FILE__, __LINE__); capwap_exit(CAPWAP_ASSERT_CONDITION); }
|
||||||
|
|
||||||
/* Custom memory management */
|
/* Custom memory management */
|
||||||
#define capwap_alloc(x) capwap_alloc_debug(x, __FILE__, __LINE__)
|
#define capwap_alloc(x) capwap_alloc_debug(x, __FILE__, __LINE__)
|
||||||
@ -29,7 +29,7 @@ void capwap_backtrace_callstack(void);
|
|||||||
/* Standard memory management */
|
/* Standard memory management */
|
||||||
#define capwap_alloc(l) ({ void* __x = malloc(l); if (!__x) capwap_outofmemory(); __x; })
|
#define capwap_alloc(l) ({ void* __x = malloc(l); if (!__x) capwap_outofmemory(); __x; })
|
||||||
#define capwap_free(x) free(x)
|
#define capwap_free(x) free(x)
|
||||||
#define capwap_check_memory_leak(x)
|
#define capwap_check_memory_leak(x) (0)
|
||||||
#define capwap_dump_memory()
|
#define capwap_dump_memory()
|
||||||
#define capwap_backtrace_callstack()
|
#define capwap_backtrace_callstack()
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ static int capwap_bio_method_recv(WOLFSSL* ssl, char* buffer, int length, void*
|
|||||||
/* Check DTLS Capwap Preamble */
|
/* Check DTLS Capwap Preamble */
|
||||||
dtlspreamble = (struct capwap_dtls_header*)dtls->buffer;
|
dtlspreamble = (struct capwap_dtls_header*)dtls->buffer;
|
||||||
if ((dtlspreamble->preamble.version != CAPWAP_PROTOCOL_VERSION) || (dtlspreamble->preamble.type != CAPWAP_PREAMBLE_DTLS_HEADER)) {
|
if ((dtlspreamble->preamble.version != CAPWAP_PROTOCOL_VERSION) || (dtlspreamble->preamble.type != CAPWAP_PREAMBLE_DTLS_HEADER)) {
|
||||||
capwap_logging_debug("Wrong DTLS Capwap Preamble");
|
log_printf(LOG_DEBUG, "Wrong DTLS Capwap Preamble");
|
||||||
return WOLFSSL_CBIO_ERR_GENERAL; /* Wrong DTLS Capwap Preamble */
|
return WOLFSSL_CBIO_ERR_GENERAL; /* Wrong DTLS Capwap Preamble */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ static int capwap_bio_method_send(WOLFSSL* ssl, char* buffer, int length, void*
|
|||||||
/* Send packet */
|
/* Send packet */
|
||||||
err = capwap_sendto(dtls->sock, data, length + sizeof(struct capwap_dtls_header), &dtls->peeraddr);
|
err = capwap_sendto(dtls->sock, data, length + sizeof(struct capwap_dtls_header), &dtls->peeraddr);
|
||||||
if (err <= 0) {
|
if (err <= 0) {
|
||||||
capwap_logging_warning("Unable to send crypt packet, sentto return error %d", err);
|
log_printf(LOG_WARNING, "Unable to send crypt packet, sentto return error %d", err);
|
||||||
return WOLFSSL_CBIO_ERR_GENERAL;
|
return WOLFSSL_CBIO_ERR_GENERAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
/* Alloc context */
|
/* Alloc context */
|
||||||
dtlscontext->sslcontext = (void*)wolfSSL_CTX_new(((param->type == CAPWAP_DTLS_SERVER) ? wolfDTLSv1_server_method() : wolfDTLSv1_client_method()));
|
dtlscontext->sslcontext = (void*)wolfSSL_CTX_new(((param->type == CAPWAP_DTLS_SERVER) ? wolfDTLSv1_server_method() : wolfDTLSv1_client_method()));
|
||||||
if (!dtlscontext->sslcontext) {
|
if (!dtlscontext->sslcontext) {
|
||||||
capwap_logging_debug("Error to initialize dtls context");
|
log_printf(LOG_DEBUG, "Error to initialize dtls context");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,42 +249,42 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
if (dtlscontext->mode == CAPWAP_DTLS_MODE_CERTIFICATE) {
|
if (dtlscontext->mode == CAPWAP_DTLS_MODE_CERTIFICATE) {
|
||||||
/* Check context */
|
/* Check context */
|
||||||
if (!param->cert.filecert || !strlen(param->cert.filecert)) {
|
if (!param->cert.filecert || !strlen(param->cert.filecert)) {
|
||||||
capwap_logging_debug("Error, request certificate file");
|
log_printf(LOG_DEBUG, "Error, request certificate file");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!param->cert.filekey || !strlen(param->cert.filekey)) {
|
} else if (!param->cert.filekey || !strlen(param->cert.filekey)) {
|
||||||
capwap_logging_debug("Error, request privatekey file");
|
log_printf(LOG_DEBUG, "Error, request privatekey file");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!param->cert.fileca || !strlen(param->cert.fileca)) {
|
} else if (!param->cert.fileca || !strlen(param->cert.fileca)) {
|
||||||
capwap_logging_debug("Error, request ca file");
|
log_printf(LOG_DEBUG, "Error, request ca file");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Public certificate */
|
/* Public certificate */
|
||||||
if (!wolfSSL_CTX_use_certificate_file((WOLFSSL_CTX*)dtlscontext->sslcontext, param->cert.filecert, SSL_FILETYPE_PEM)) {
|
if (!wolfSSL_CTX_use_certificate_file((WOLFSSL_CTX*)dtlscontext->sslcontext, param->cert.filecert, SSL_FILETYPE_PEM)) {
|
||||||
capwap_logging_debug("Error to load certificate file");
|
log_printf(LOG_DEBUG, "Error to load certificate file");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Private key */
|
/* Private key */
|
||||||
if (!wolfSSL_CTX_use_PrivateKey_file((WOLFSSL_CTX*)dtlscontext->sslcontext, param->cert.filekey, SSL_FILETYPE_PEM)) {
|
if (!wolfSSL_CTX_use_PrivateKey_file((WOLFSSL_CTX*)dtlscontext->sslcontext, param->cert.filekey, SSL_FILETYPE_PEM)) {
|
||||||
capwap_logging_debug("Error to load private key file");
|
log_printf(LOG_DEBUG, "Error to load private key file");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wolfSSL_CTX_check_private_key((WOLFSSL_CTX*)dtlscontext->sslcontext)) {
|
if (!wolfSSL_CTX_check_private_key((WOLFSSL_CTX*)dtlscontext->sslcontext)) {
|
||||||
capwap_logging_debug("Error to check private key");
|
log_printf(LOG_DEBUG, "Error to check private key");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Certificate Authority */
|
/* Certificate Authority */
|
||||||
if (!wolfSSL_CTX_load_verify_locations((WOLFSSL_CTX*)dtlscontext->sslcontext, param->cert.fileca, NULL)) {
|
if (!wolfSSL_CTX_load_verify_locations((WOLFSSL_CTX*)dtlscontext->sslcontext, param->cert.fileca, NULL)) {
|
||||||
capwap_logging_debug("Error to load ca file");
|
log_printf(LOG_DEBUG, "Error to load ca file");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -299,7 +299,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
||||||
*/
|
*/
|
||||||
if (!wolfSSL_CTX_set_cipher_list((WOLFSSL_CTX*)dtlscontext->sslcontext, "AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA:DHE-RSA-AES256-SHA")) {
|
if (!wolfSSL_CTX_set_cipher_list((WOLFSSL_CTX*)dtlscontext->sslcontext, "AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA:DHE-RSA-AES256-SHA")) {
|
||||||
capwap_logging_debug("Error to select cipher list");
|
log_printf(LOG_DEBUG, "Error to select cipher list");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -311,7 +311,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
TLS_DHE_PSK_WITH_AES_256_CBC_SHA
|
TLS_DHE_PSK_WITH_AES_256_CBC_SHA
|
||||||
*/
|
*/
|
||||||
if (!wolfSSL_CTX_set_cipher_list((WOLFSSL_CTX*)dtlscontext->sslcontext, "PSK-AES128-CBC-SHA:PSK-AES256-CBC-SHA")) {
|
if (!wolfSSL_CTX_set_cipher_list((WOLFSSL_CTX*)dtlscontext->sslcontext, "PSK-AES128-CBC-SHA:PSK-AES256-CBC-SHA")) {
|
||||||
capwap_logging_debug("Error to select cipher list");
|
log_printf(LOG_DEBUG, "Error to select cipher list");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -321,7 +321,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
if (param->presharedkey.hint) {
|
if (param->presharedkey.hint) {
|
||||||
wolfSSL_CTX_use_psk_identity_hint((WOLFSSL_CTX*)dtlscontext->sslcontext, param->presharedkey.hint);
|
wolfSSL_CTX_use_psk_identity_hint((WOLFSSL_CTX*)dtlscontext->sslcontext, param->presharedkey.hint);
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Error to presharedkey hint");
|
log_printf(LOG_DEBUG, "Error to presharedkey hint");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -331,7 +331,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
dtlscontext->presharedkey.identity = capwap_duplicate_string(param->presharedkey.identity);
|
dtlscontext->presharedkey.identity = capwap_duplicate_string(param->presharedkey.identity);
|
||||||
dtlscontext->presharedkey.pskkeylength = capwap_crypt_psk_to_bin(param->presharedkey.pskkey, &dtlscontext->presharedkey.pskkey);
|
dtlscontext->presharedkey.pskkeylength = capwap_crypt_psk_to_bin(param->presharedkey.pskkey, &dtlscontext->presharedkey.pskkey);
|
||||||
if (!dtlscontext->presharedkey.pskkeylength) {
|
if (!dtlscontext->presharedkey.pskkeylength) {
|
||||||
capwap_logging_debug("Error to presharedkey");
|
log_printf(LOG_DEBUG, "Error to presharedkey");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -343,7 +343,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
|
|||||||
wolfSSL_CTX_set_psk_client_callback((WOLFSSL_CTX*)dtlscontext->sslcontext, capwap_crypt_psk_client);
|
wolfSSL_CTX_set_psk_client_callback((WOLFSSL_CTX*)dtlscontext->sslcontext, capwap_crypt_psk_client);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
capwap_logging_debug("Invalid DTLS mode");
|
log_printf(LOG_DEBUG, "Invalid DTLS mode");
|
||||||
capwap_crypt_freecontext(dtlscontext);
|
capwap_crypt_freecontext(dtlscontext);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -383,7 +383,7 @@ int capwap_crypt_createsession(struct capwap_dtls* dtls, struct capwap_dtls_cont
|
|||||||
/* Create ssl session */
|
/* Create ssl session */
|
||||||
dtls->sslsession = (void*)wolfSSL_new((WOLFSSL_CTX*)dtlscontext->sslcontext);
|
dtls->sslsession = (void*)wolfSSL_new((WOLFSSL_CTX*)dtlscontext->sslcontext);
|
||||||
if (!dtls->sslsession) {
|
if (!dtls->sslsession) {
|
||||||
capwap_logging_debug("Error to initialize dtls session");
|
log_printf(LOG_DEBUG, "Error to initialize dtls session");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,7 +498,7 @@ int capwap_crypt_sendto(struct capwap_dtls* dtls, void* buffer, int size) {
|
|||||||
if (!dtls->enable) {
|
if (!dtls->enable) {
|
||||||
err = capwap_sendto(dtls->sock, buffer, size, &dtls->peeraddr);
|
err = capwap_sendto(dtls->sock, buffer, size, &dtls->peeraddr);
|
||||||
if (err <= 0) {
|
if (err <= 0) {
|
||||||
capwap_logging_warning("Unable to send plain packet, sentto return error %d", err);
|
log_printf(LOG_WARNING, "Unable to send plain packet, sentto return error %d", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@ -535,7 +535,7 @@ int capwap_crypt_sendto_fragmentpacket(struct capwap_dtls* dtls, struct capwap_l
|
|||||||
|
|
||||||
err = capwap_crypt_sendto(dtls, fragmentpacket->buffer, fragmentpacket->offset);
|
err = capwap_crypt_sendto(dtls, fragmentpacket->buffer, fragmentpacket->offset);
|
||||||
if (err <= 0) {
|
if (err <= 0) {
|
||||||
capwap_logging_warning("Unable to send crypt fragment, sentto return error %d", err);
|
log_printf(LOG_WARNING, "Unable to send crypt fragment, sentto return error %d", err);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,7 +572,7 @@ int capwap_decrypt_packet(struct capwap_dtls* dtls, void* encrybuffer, int size,
|
|||||||
/* */
|
/* */
|
||||||
if (dtls->action == CAPWAP_DTLS_ACTION_HANDSHAKE) {
|
if (dtls->action == CAPWAP_DTLS_ACTION_HANDSHAKE) {
|
||||||
if (capwap_crypt_handshake(dtls) == CAPWAP_HANDSHAKE_ERROR) {
|
if (capwap_crypt_handshake(dtls) == CAPWAP_HANDSHAKE_ERROR) {
|
||||||
capwap_logging_debug("Error in DTLS handshake");
|
log_printf(LOG_DEBUG, "Error in DTLS handshake");
|
||||||
result = CAPWAP_ERROR_CLOSE; /* Error handshake */
|
result = CAPWAP_ERROR_CLOSE; /* Error handshake */
|
||||||
} else {
|
} else {
|
||||||
result = CAPWAP_ERROR_AGAIN; /* Don't parsing DTLS packet */
|
result = CAPWAP_ERROR_AGAIN; /* Don't parsing DTLS packet */
|
||||||
|
@ -4,136 +4,132 @@
|
|||||||
#include "capwap_array.h"
|
#include "capwap_array.h"
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
int capwap_get_message_element_category(uint16_t type) {
|
#define element_ops(Id, Ops) [(Id) - CAPWAP_MESSAGE_ELEMENTS_START] = &(Ops)
|
||||||
switch (type) {
|
static const struct capwap_message_elements_ops * capwap_message_elements[] = {
|
||||||
case CAPWAP_ELEMENT_ACNAMEPRIORITY:
|
element_ops(CAPWAP_ELEMENT_ACDESCRIPTION_TYPE, capwap_element_acdescriptor_ops),
|
||||||
case CAPWAP_ELEMENT_CONTROLIPV4:
|
element_ops(CAPWAP_ELEMENT_ACIPV4LIST_TYPE, capwap_element_acipv4list_ops),
|
||||||
case CAPWAP_ELEMENT_CONTROLIPV6:
|
element_ops(CAPWAP_ELEMENT_ACIPV6LIST_TYPE, capwap_element_acipv6list_ops),
|
||||||
case CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD:
|
element_ops(CAPWAP_ELEMENT_ACNAME_TYPE, capwap_element_acname_ops),
|
||||||
case CAPWAP_ELEMENT_RADIOADMSTATE:
|
element_ops(CAPWAP_ELEMENT_ACNAMEPRIORITY_TYPE, capwap_element_acnamepriority_ops),
|
||||||
case CAPWAP_ELEMENT_RADIOOPRSTATE:
|
element_ops(CAPWAP_ELEMENT_ACTIMESTAMP_TYPE, capwap_element_actimestamp_ops),
|
||||||
case CAPWAP_ELEMENT_RETURNEDMESSAGE:
|
element_ops(CAPWAP_ELEMENT_ADDMACACL_TYPE, capwap_element_addmacacl_ops),
|
||||||
case CAPWAP_ELEMENT_VENDORPAYLOAD:
|
element_ops(CAPWAP_ELEMENT_ADDSTATION_TYPE, capwap_element_addstation_ops),
|
||||||
case CAPWAP_ELEMENT_80211_ANTENNA:
|
element_ops(CAPWAP_ELEMENT_CONTROLIPV4_TYPE, capwap_element_controlipv4_ops),
|
||||||
case CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL:
|
element_ops(CAPWAP_ELEMENT_CONTROLIPV6_TYPE, capwap_element_controlipv6_ops),
|
||||||
case CAPWAP_ELEMENT_80211_IE:
|
element_ops(CAPWAP_ELEMENT_TIMERS_TYPE, capwap_element_timers_ops),
|
||||||
case CAPWAP_ELEMENT_80211_MACOPERATION:
|
element_ops(CAPWAP_ELEMENT_DATATRANSFERDATA_TYPE, capwap_element_datatransferdata_ops),
|
||||||
case CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY:
|
element_ops(CAPWAP_ELEMENT_DATATRANSFERMODE_TYPE, capwap_element_datatransfermode_ops),
|
||||||
case CAPWAP_ELEMENT_80211_OFDMCONTROL:
|
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORT_TYPE, capwap_element_decrypterrorreport_ops),
|
||||||
case CAPWAP_ELEMENT_80211_RATESET:
|
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD_TYPE, capwap_element_decrypterrorreportperiod_ops),
|
||||||
case CAPWAP_ELEMENT_80211_STATISTICS:
|
element_ops(CAPWAP_ELEMENT_DELETEMACACL_TYPE, capwap_element_deletemacacl_ops),
|
||||||
case CAPWAP_ELEMENT_80211_SUPPORTEDRATES:
|
element_ops(CAPWAP_ELEMENT_DELETESTATION_TYPE, capwap_element_deletestation_ops),
|
||||||
case CAPWAP_ELEMENT_80211_TXPOWER:
|
element_ops(CAPWAP_ELEMENT_DISCOVERYTYPE_TYPE, capwap_element_discoverytype_ops),
|
||||||
case CAPWAP_ELEMENT_80211_TXPOWERLEVEL:
|
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV4_TYPE, capwap_element_duplicateipv4_ops),
|
||||||
case CAPWAP_ELEMENT_80211_WTP_QOS:
|
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV6_TYPE, capwap_element_duplicateipv6_ops),
|
||||||
case CAPWAP_ELEMENT_80211_WTP_RADIO_CONF:
|
element_ops(CAPWAP_ELEMENT_IDLETIMEOUT_TYPE, capwap_element_idletimeout_ops),
|
||||||
case CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION: {
|
element_ops(CAPWAP_ELEMENT_IMAGEDATA_TYPE, capwap_element_imagedata_ops),
|
||||||
return CAPWAP_MESSAGE_ELEMENT_ARRAY;
|
element_ops(CAPWAP_ELEMENT_IMAGEIDENTIFIER_TYPE, capwap_element_imageidentifier_ops),
|
||||||
}
|
element_ops(CAPWAP_ELEMENT_IMAGEINFO_TYPE, capwap_element_imageinfo_ops),
|
||||||
}
|
element_ops(CAPWAP_ELEMENT_INITIATEDOWNLOAD_TYPE, capwap_element_initdownload_ops),
|
||||||
|
element_ops(CAPWAP_ELEMENT_LOCATION_TYPE, capwap_element_location_ops),
|
||||||
return CAPWAP_MESSAGE_ELEMENT_SINGLE;
|
element_ops(CAPWAP_ELEMENT_MAXIMUMLENGTH_TYPE, capwap_element_maximumlength_ops),
|
||||||
}
|
element_ops(CAPWAP_ELEMENT_LOCALIPV4_TYPE, capwap_element_localipv4_ops),
|
||||||
|
element_ops(CAPWAP_ELEMENT_RADIOADMSTATE_TYPE, capwap_element_radioadmstate_ops),
|
||||||
/* */
|
element_ops(CAPWAP_ELEMENT_RADIOOPRSTATE_TYPE, capwap_element_radiooprstate_ops),
|
||||||
static struct capwap_message_elements_ops* capwap_message_elements[] = {
|
element_ops(CAPWAP_ELEMENT_RESULTCODE_TYPE, capwap_element_resultcode_ops),
|
||||||
/* CAPWAP_ELEMENT_ACDESCRIPTION */ &capwap_element_acdescriptor_ops,
|
element_ops(CAPWAP_ELEMENT_RETURNEDMESSAGE_TYPE, capwap_element_returnedmessage_ops),
|
||||||
/* CAPWAP_ELEMENT_ACIPV4LIST */ &capwap_element_acipv4list_ops,
|
element_ops(CAPWAP_ELEMENT_SESSIONID_TYPE, capwap_element_sessionid_ops),
|
||||||
/* CAPWAP_ELEMENT_ACIPV6LIST */ &capwap_element_acipv6list_ops,
|
element_ops(CAPWAP_ELEMENT_STATISTICSTIMER_TYPE, capwap_element_statisticstimer_ops),
|
||||||
/* CAPWAP_ELEMENT_ACNAME */ &capwap_element_acname_ops,
|
element_ops(CAPWAP_ELEMENT_VENDORPAYLOAD_TYPE, capwap_element_vendorpayload_ops),
|
||||||
/* CAPWAP_ELEMENT_ACNAMEPRIORITY */ &capwap_element_acnamepriority_ops,
|
element_ops(CAPWAP_ELEMENT_WTPBOARDDATA_TYPE, capwap_element_wtpboarddata_ops),
|
||||||
/* CAPWAP_ELEMENT_ACTIMESTAMP */ &capwap_element_actimestamp_ops,
|
element_ops(CAPWAP_ELEMENT_WTPDESCRIPTOR_TYPE, capwap_element_wtpdescriptor_ops),
|
||||||
/* CAPWAP_ELEMENT_ADDMACACL */ &capwap_element_addmacacl_ops,
|
element_ops(CAPWAP_ELEMENT_WTPFALLBACK_TYPE, capwap_element_wtpfallback_ops),
|
||||||
/* CAPWAP_ELEMENT_ADDSTATION */ &capwap_element_addstation_ops,
|
element_ops(CAPWAP_ELEMENT_WTPFRAMETUNNELMODE_TYPE, capwap_element_wtpframetunnelmode_ops),
|
||||||
/* Reserved */ NULL,
|
element_ops(CAPWAP_ELEMENT_WTPMACTYPE_TYPE, capwap_element_wtpmactype_ops),
|
||||||
/* CAPWAP_ELEMENT_CONTROLIPV4 */ &capwap_element_controlipv4_ops,
|
element_ops(CAPWAP_ELEMENT_WTPNAME_TYPE, capwap_element_wtpname_ops),
|
||||||
/* CAPWAP_ELEMENT_CONTROLIPV6 */ &capwap_element_controlipv6_ops,
|
element_ops(CAPWAP_ELEMENT_WTPRADIOSTAT_TYPE, capwap_element_wtpradiostat_ops),
|
||||||
/* CAPWAP_ELEMENT_TIMERS */ &capwap_element_timers_ops,
|
element_ops(CAPWAP_ELEMENT_WTPREBOOTSTAT_TYPE, capwap_element_wtprebootstat_ops),
|
||||||
/* CAPWAP_ELEMENT_DATATRANSFERDATA */ &capwap_element_datatransferdata_ops,
|
element_ops(CAPWAP_ELEMENT_WTPSTATICIPADDRESS_TYPE, capwap_element_wtpstaticipaddress_ops),
|
||||||
/* CAPWAP_ELEMENT_DATATRANSFERMODE */ &capwap_element_datatransfermode_ops,
|
element_ops(CAPWAP_ELEMENT_LOCALIPV6_TYPE, capwap_element_localipv6_ops),
|
||||||
/* CAPWAP_ELEMENT_DECRYPTERRORREPORT */ &capwap_element_decrypterrorreport_ops,
|
element_ops(CAPWAP_ELEMENT_TRANSPORT_TYPE, capwap_element_transport_ops),
|
||||||
/* CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD */ &capwap_element_decrypterrorreportperiod_ops,
|
element_ops(CAPWAP_ELEMENT_MTUDISCOVERY_TYPE, capwap_element_mtudiscovery_ops),
|
||||||
/* CAPWAP_ELEMENT_DELETEMACACL */ &capwap_element_deletemacacl_ops,
|
element_ops(CAPWAP_ELEMENT_ECNSUPPORT_TYPE, capwap_element_ecnsupport_ops)
|
||||||
/* CAPWAP_ELEMENT_DELETESTATION */ &capwap_element_deletestation_ops,
|
|
||||||
/* Reserved */ NULL,
|
|
||||||
/* CAPWAP_ELEMENT_DISCOVERYTYPE */ &capwap_element_discoverytype_ops,
|
|
||||||
/* CAPWAP_ELEMENT_DUPLICATEIPV4 */ &capwap_element_duplicateipv4_ops,
|
|
||||||
/* CAPWAP_ELEMENT_DUPLICATEIPV6 */ &capwap_element_duplicateipv6_ops,
|
|
||||||
/* CAPWAP_ELEMENT_IDLETIMEOUT */ &capwap_element_idletimeout_ops,
|
|
||||||
/* CAPWAP_ELEMENT_IMAGEDATA */ &capwap_element_imagedata_ops,
|
|
||||||
/* CAPWAP_ELEMENT_IMAGEIDENTIFIER */ &capwap_element_imageidentifier_ops,
|
|
||||||
/* CAPWAP_ELEMENT_IMAGEINFO */ &capwap_element_imageinfo_ops,
|
|
||||||
/* CAPWAP_ELEMENT_INITIATEDOWNLOAD */ &capwap_element_initdownload_ops,
|
|
||||||
/* CAPWAP_ELEMENT_LOCATION */ &capwap_element_location_ops,
|
|
||||||
/* CAPWAP_ELEMENT_MAXIMUMLENGTH */ &capwap_element_maximumlength_ops,
|
|
||||||
/* CAPWAP_ELEMENT_LOCALIPV4 */ &capwap_element_localipv4_ops,
|
|
||||||
/* CAPWAP_ELEMENT_RADIOADMSTATE */ &capwap_element_radioadmstate_ops,
|
|
||||||
/* CAPWAP_ELEMENT_RADIOOPRSTATE */ &capwap_element_radiooprstate_ops,
|
|
||||||
/* CAPWAP_ELEMENT_RESULTCODE */ &capwap_element_resultcode_ops,
|
|
||||||
/* CAPWAP_ELEMENT_RETURNEDMESSAGE */ &capwap_element_returnedmessage_ops,
|
|
||||||
/* CAPWAP_ELEMENT_SESSIONID */ &capwap_element_sessionid_ops,
|
|
||||||
/* CAPWAP_ELEMENT_STATISTICSTIMER */ &capwap_element_statisticstimer_ops,
|
|
||||||
/* CAPWAP_ELEMENT_VENDORPAYLOAD */ &capwap_element_vendorpayload_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPBOARDDATA */ &capwap_element_wtpboarddata_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPDESCRIPTOR */ &capwap_element_wtpdescriptor_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPFALLBACK */ &capwap_element_wtpfallback_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPFRAMETUNNELMODE */ &capwap_element_wtpframetunnelmode_ops,
|
|
||||||
/* Reserved */ NULL,
|
|
||||||
/* Reserved */ NULL,
|
|
||||||
/* CAPWAP_ELEMENT_WTPMACTYPE */ &capwap_element_wtpmactype_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPNAME */ &capwap_element_wtpname_ops,
|
|
||||||
/* Reserved */ NULL,
|
|
||||||
/* CAPWAP_ELEMENT_WTPRADIOSTAT */ &capwap_element_wtpradiostat_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPREBOOTSTAT */ &capwap_element_wtprebootstat_ops,
|
|
||||||
/* CAPWAP_ELEMENT_WTPSTATICIPADDRESS */ &capwap_element_wtpstaticipaddress_ops,
|
|
||||||
/* CAPWAP_ELEMENT_LOCALIPV6 */ &capwap_element_localipv6_ops,
|
|
||||||
/* CAPWAP_ELEMENT_TRANSPORT */ &capwap_element_transport_ops,
|
|
||||||
/* CAPWAP_ELEMENT_MTUDISCOVERY */ &capwap_element_mtudiscovery_ops,
|
|
||||||
/* CAPWAP_ELEMENT_ECNSUPPORT */ &capwap_element_ecnsupport_ops
|
|
||||||
};
|
};
|
||||||
|
#undef element_ops
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static struct capwap_message_elements_ops* capwap_80211_message_elements[] = {
|
#define element_ops(Id, Ops) [(Id) - CAPWAP_80211_MESSAGE_ELEMENTS_START] = &(Ops)
|
||||||
/* CAPWAP_ELEMENT_80211_ADD_WLAN */ &capwap_element_80211_addwlan_ops,
|
static const struct capwap_message_elements_ops * capwap_80211_message_elements[] = {
|
||||||
/* CAPWAP_ELEMENT_80211_ANTENNA */ &capwap_element_80211_antenna_ops,
|
element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN_TYPE, capwap_element_80211_addwlan_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_ASSIGN_BSSID */ &capwap_element_80211_assignbssid_ops,
|
element_ops(CAPWAP_ELEMENT_80211_ANTENNA_TYPE, capwap_element_80211_antenna_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_DELETE_WLAN */ &capwap_element_80211_deletewlan_ops,
|
element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID_TYPE, capwap_element_80211_assignbssid_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL */ &capwap_element_80211_directsequencecontrol_ops,
|
element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN_TYPE, capwap_element_80211_deletewlan_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_IE */ &capwap_element_80211_ie_ops,
|
element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_TYPE, capwap_element_80211_directsequencecontrol_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_MACOPERATION */ &capwap_element_80211_macoperation_ops,
|
element_ops(CAPWAP_ELEMENT_80211_IE_TYPE, capwap_element_80211_ie_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES */ &capwap_element_80211_miccountermeasures_ops,
|
element_ops(CAPWAP_ELEMENT_80211_MACOPERATION_TYPE, capwap_element_80211_macoperation_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY */ &capwap_element_80211_multidomaincapability_ops,
|
element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_TYPE, capwap_element_80211_miccountermeasures_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_OFDMCONTROL */ &capwap_element_80211_ofdmcontrol_ops,
|
element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_TYPE, capwap_element_80211_multidomaincapability_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_RATESET */ &capwap_element_80211_rateset_ops,
|
element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL_TYPE, capwap_element_80211_ofdmcontrol_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT */ &capwap_element_80211_rsnaerrorreport_ops,
|
element_ops(CAPWAP_ELEMENT_80211_RATESET_TYPE, capwap_element_80211_rateset_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_STATION */ &capwap_element_80211_station_ops,
|
element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_TYPE, capwap_element_80211_rsnaerrorreport_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE */ &capwap_element_80211_stationqos_ops,
|
element_ops(CAPWAP_ELEMENT_80211_STATION_TYPE, capwap_element_80211_station_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE */ &capwap_element_80211_stationkey_ops,
|
element_ops(CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_TYPE, capwap_element_80211_stationqos_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_STATISTICS */ &capwap_element_80211_statistics_ops,
|
element_ops(CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_TYPE, capwap_element_80211_stationkey_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_SUPPORTEDRATES */ &capwap_element_80211_supportedrates_ops,
|
element_ops(CAPWAP_ELEMENT_80211_STATISTICS_TYPE, capwap_element_80211_statistics_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_TXPOWER */ &capwap_element_80211_txpower_ops,
|
element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES_TYPE, capwap_element_80211_supportedrates_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_TXPOWERLEVEL */ &capwap_element_80211_txpowerlevel_ops,
|
element_ops(CAPWAP_ELEMENT_80211_TXPOWER_TYPE, capwap_element_80211_txpower_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS */ &capwap_element_80211_updatestationqos_ops,
|
element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL_TYPE, capwap_element_80211_txpowerlevel_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_UPDATE_WLAN */ &capwap_element_80211_updatewlan_ops,
|
element_ops(CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_TYPE, capwap_element_80211_updatestationqos_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_WTP_QOS */ &capwap_element_80211_wtpqos_ops,
|
element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN_TYPE, capwap_element_80211_updatewlan_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_WTP_RADIO_CONF */ &capwap_element_80211_wtpradioconf_ops,
|
element_ops(CAPWAP_ELEMENT_80211_WTP_QOS_TYPE, capwap_element_80211_wtpqos_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM */ &capwap_element_80211_wtpradiofailalarm_ops,
|
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_TYPE, capwap_element_80211_wtpradioconf_ops),
|
||||||
/* CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION */ &capwap_element_80211_wtpradioinformation_ops
|
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM_TYPE, capwap_element_80211_wtpradiofailalarm_ops),
|
||||||
|
element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION_TYPE, capwap_element_80211_wtpradioinformation_ops)
|
||||||
};
|
};
|
||||||
|
#undef element_ops
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops* capwap_get_message_element_ops(unsigned short code) {
|
#define element_ops(Id, Ops) [(Id) - 1] = &(Ops)
|
||||||
if (IS_MESSAGE_ELEMENTS(code)) {
|
static const struct capwap_message_elements_ops * capwap_vendor_travelping_message_elements[] = {
|
||||||
return capwap_message_elements[code - CAPWAP_MESSAGE_ELEMENTS_START];
|
element_ops(CAPWAP_ELEMENT_VENDOR_TRAVELPING_WTP_TIMESTAMP_TYPE, capwap_element_vendor_travelping_wtp_timestamp_ops),
|
||||||
} else if (IS_80211_MESSAGE_ELEMENTS(code)) {
|
element_ops(CAPWAP_ELEMENT_80211N_RADIO_CONF_TYPE, capwap_element_80211n_radioconf_ops),
|
||||||
return capwap_80211_message_elements[code - CAPWAP_80211_MESSAGE_ELEMENTS_START];
|
element_ops(CAPWAP_ELEMENT_80211N_STATION_INFO_TYPE, capwap_element_80211n_station_info_ops)
|
||||||
|
};
|
||||||
|
#undef element_ops
|
||||||
|
|
||||||
|
/* */
|
||||||
|
const struct capwap_message_elements_ops *
|
||||||
|
capwap_get_message_element_ops(const struct capwap_message_element_id id)
|
||||||
|
{
|
||||||
|
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
|
||||||
|
|
||||||
|
switch (id.vendor) {
|
||||||
|
case 0:
|
||||||
|
if (id.type >= CAPWAP_MESSAGE_ELEMENTS_START &&
|
||||||
|
id.type - CAPWAP_MESSAGE_ELEMENTS_START < ARRAY_SIZE(capwap_message_elements)) {
|
||||||
|
return capwap_message_elements[id.type - CAPWAP_MESSAGE_ELEMENTS_START];
|
||||||
|
}
|
||||||
|
else if (id.type >= CAPWAP_80211_MESSAGE_ELEMENTS_START &&
|
||||||
|
id.type - CAPWAP_80211_MESSAGE_ELEMENTS_START < ARRAY_SIZE(capwap_80211_message_elements)) {
|
||||||
|
return capwap_80211_message_elements[id.type - CAPWAP_80211_MESSAGE_ELEMENTS_START];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CAPWAP_VENDOR_TRAVELPING_ID:
|
||||||
|
if (id.type >= 1 &&
|
||||||
|
id.type - 1 < ARRAY_SIZE(capwap_vendor_travelping_message_elements))
|
||||||
|
return capwap_vendor_travelping_message_elements[id.type - 1];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#undef ARRAY_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet* packet, uint16_t type) {
|
struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet* packet,
|
||||||
|
const struct capwap_message_element_id id)
|
||||||
|
{
|
||||||
struct capwap_list_item* search;
|
struct capwap_list_item* search;
|
||||||
|
|
||||||
ASSERT(packet != NULL);
|
ASSERT(packet != NULL);
|
||||||
@ -141,11 +137,10 @@ struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet*
|
|||||||
|
|
||||||
search = packet->messages->first;
|
search = packet->messages->first;
|
||||||
while (search) {
|
while (search) {
|
||||||
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
struct capwap_message_element_itemlist* messageelement =
|
||||||
|
(struct capwap_message_element_itemlist*)search->item;
|
||||||
if (messageelement->type == type) {
|
if (message_element_id_eq(id, messageelement->id))
|
||||||
return search;
|
return search;
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
search = search->next;
|
search = search->next;
|
||||||
@ -155,12 +150,14 @@ struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet*
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
void* capwap_get_message_element_data(struct capwap_parsed_packet* packet, uint16_t type) {
|
void* capwap_get_message_element_data(struct capwap_parsed_packet* packet,
|
||||||
|
const struct capwap_message_element_id id)
|
||||||
|
{
|
||||||
struct capwap_list_item* itemlist;
|
struct capwap_list_item* itemlist;
|
||||||
struct capwap_message_element_itemlist* messageelement;
|
struct capwap_message_element_itemlist* messageelement;
|
||||||
|
|
||||||
/* Retrieve item list */
|
/* Retrieve item list */
|
||||||
itemlist = capwap_get_message_element(packet, type);
|
itemlist = capwap_get_message_element(packet, id);
|
||||||
if (!itemlist) {
|
if (!itemlist) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -193,53 +190,75 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
|||||||
/* */
|
/* */
|
||||||
bodylength = rxmngpacket->ctrlmsg.length - CAPWAP_CONTROL_MESSAGE_MIN_LENGTH;
|
bodylength = rxmngpacket->ctrlmsg.length - CAPWAP_CONTROL_MESSAGE_MIN_LENGTH;
|
||||||
while (bodylength > 0) {
|
while (bodylength > 0) {
|
||||||
uint16_t type;
|
struct capwap_message_element_id id = { .vendor = 0 };
|
||||||
uint16_t msglength;
|
uint16_t msglength;
|
||||||
int category;
|
|
||||||
struct capwap_list_item* itemlist;
|
struct capwap_list_item* itemlist;
|
||||||
struct capwap_message_element_itemlist* messageelement;
|
struct capwap_message_element_itemlist* messageelement;
|
||||||
struct capwap_message_elements_ops* read_ops;
|
void *element;
|
||||||
|
const struct capwap_message_elements_ops* read_ops;
|
||||||
|
|
||||||
/* Get type and length */
|
/* Get type and length */
|
||||||
rxmngpacket->readerpacketallowed = sizeof(struct capwap_message_element);
|
rxmngpacket->readerpacketallowed = sizeof(struct capwap_message_element);
|
||||||
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &type) != sizeof(uint16_t)) {
|
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &id.type) != sizeof(uint16_t) ||
|
||||||
|
rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &msglength) != sizeof(uint16_t) ||
|
||||||
|
msglength > bodylength)
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
return INVALID_MESSAGE_ELEMENT;
|
||||||
}
|
|
||||||
|
|
||||||
/* Check type */
|
|
||||||
capwap_logging_debug("MESSAGE ELEMENT: %d", type);
|
|
||||||
if (!IS_VALID_MESSAGE_ELEMENTS(type)) {
|
|
||||||
return UNRECOGNIZED_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check binding */
|
|
||||||
if (IS_80211_MESSAGE_ELEMENTS(type) && (binding != CAPWAP_WIRELESS_BINDING_IEEE80211)) {
|
|
||||||
return UNRECOGNIZED_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &msglength) != sizeof(uint16_t)) {
|
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check length */
|
|
||||||
if (msglength > bodylength) {
|
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reader function */
|
|
||||||
read_ops = capwap_get_message_element_ops(type);
|
|
||||||
capwap_logging_debug("read_ops: %p", read_ops);
|
|
||||||
if (!read_ops) {
|
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allowed to parsing only the size of message element */
|
/* Allowed to parsing only the size of message element */
|
||||||
rxmngpacket->readerpacketallowed = msglength;
|
rxmngpacket->readerpacketallowed = msglength;
|
||||||
|
|
||||||
|
/* Check binding */
|
||||||
|
if (IS_80211_MESSAGE_ELEMENTS(id) &&
|
||||||
|
(binding != CAPWAP_WIRELESS_BINDING_IEEE80211))
|
||||||
|
return UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||||
|
|
||||||
|
log_printf(LOG_DEBUG, "MESSAGE ELEMENT: %d", id.type);
|
||||||
|
|
||||||
|
if (id.type == CAPWAP_ELEMENT_VENDORPAYLOAD_TYPE) {
|
||||||
|
struct capwap_message_element_id vendor_id;
|
||||||
|
|
||||||
|
if (msglength < 7) {
|
||||||
|
log_printf(LOG_DEBUG, "Invalid Vendor Specific Payload element: underbuffer");
|
||||||
|
return INVALID_MESSAGE_ELEMENT;
|
||||||
|
}
|
||||||
|
if ((msglength - 6) > CAPWAP_VENDORPAYLOAD_MAXLENGTH) {
|
||||||
|
log_printf(LOG_DEBUG, "Invalid Vendor Specific Payload element: overbuffer");
|
||||||
|
return INVALID_MESSAGE_ELEMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxmngpacket->read_ops.read_u32((capwap_message_elements_handle)rxmngpacket, &vendor_id.vendor);
|
||||||
|
rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &vendor_id.type);
|
||||||
|
|
||||||
|
log_printf(LOG_DEBUG, "VENDOR MESSAGE ELEMENT: %06x:%d", vendor_id.vendor, vendor_id.type);
|
||||||
|
|
||||||
|
read_ops = capwap_get_message_element_ops(vendor_id);
|
||||||
|
log_printf(LOG_DEBUG, "vendor read_ops: %p", read_ops);
|
||||||
|
if (read_ops) {
|
||||||
|
id = vendor_id;
|
||||||
|
element = read_ops->parse((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
|
||||||
|
} else {
|
||||||
|
read_ops = capwap_get_message_element_ops(id);
|
||||||
|
element = capwap_unknown_vendorpayload_element_parsing((capwap_message_elements_handle)rxmngpacket,
|
||||||
|
&rxmngpacket->read_ops, msglength - 6, vendor_id);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Reader function */
|
||||||
|
read_ops = capwap_get_message_element_ops(id);
|
||||||
|
log_printf(LOG_DEBUG, "read_ops: %p", read_ops);
|
||||||
|
|
||||||
|
if (!read_ops)
|
||||||
|
return UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||||
|
|
||||||
|
/* Get message element */
|
||||||
|
element = read_ops->parse((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!element)
|
||||||
|
return INVALID_MESSAGE_ELEMENT;
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
itemlist = capwap_get_message_element(packet, type);
|
itemlist = capwap_get_message_element(packet, id);
|
||||||
category = capwap_get_message_element_category(type);
|
if (read_ops->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
||||||
if (category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
|
||||||
/* Check for multiple message element */
|
/* Check for multiple message element */
|
||||||
if (itemlist) {
|
if (itemlist) {
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
return INVALID_MESSAGE_ELEMENT;
|
||||||
@ -248,18 +267,14 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
|||||||
/* Create new message element */
|
/* Create new message element */
|
||||||
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
|
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
|
||||||
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
||||||
messageelement->type = type;
|
messageelement->id = id;
|
||||||
messageelement->category = CAPWAP_MESSAGE_ELEMENT_SINGLE;
|
messageelement->category = CAPWAP_MESSAGE_ELEMENT_SINGLE;
|
||||||
messageelement->data = read_ops->parsing_message_element((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
|
messageelement->data = element;
|
||||||
if (!messageelement->data) {
|
|
||||||
capwap_itemlist_free(itemlist);
|
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
capwap_itemlist_insert_after(packet->messages, NULL, itemlist);
|
capwap_itemlist_insert_after(packet->messages, NULL, itemlist);
|
||||||
} else if (category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
|
}
|
||||||
void* datamsgelement;
|
else if (read_ops->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
|
||||||
struct capwap_array* arraymessageelement;
|
struct capwap_array* arraymessageelement;
|
||||||
|
|
||||||
if (itemlist) {
|
if (itemlist) {
|
||||||
@ -271,7 +286,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
|||||||
/* */
|
/* */
|
||||||
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
|
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
|
||||||
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
||||||
messageelement->type = type;
|
messageelement->id = id;
|
||||||
messageelement->category = CAPWAP_MESSAGE_ELEMENT_ARRAY;
|
messageelement->category = CAPWAP_MESSAGE_ELEMENT_ARRAY;
|
||||||
messageelement->data = (void*)arraymessageelement;
|
messageelement->data = (void*)arraymessageelement;
|
||||||
|
|
||||||
@ -279,14 +294,8 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
|||||||
capwap_itemlist_insert_after(packet->messages, NULL, itemlist);
|
capwap_itemlist_insert_after(packet->messages, NULL, itemlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get message element */
|
|
||||||
datamsgelement = read_ops->parsing_message_element((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
|
|
||||||
if (!datamsgelement) {
|
|
||||||
return INVALID_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
memcpy(capwap_array_get_item_pointer(arraymessageelement, arraymessageelement->count), &datamsgelement, sizeof(void*));
|
*(void **)capwap_array_get_item_pointer(arraymessageelement, arraymessageelement->count) = element;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if read all data of message element */
|
/* Check if read all data of message element */
|
||||||
@ -630,7 +639,7 @@ void capwap_free_parsed_packet(struct capwap_parsed_packet* packet) {
|
|||||||
int i;
|
int i;
|
||||||
struct capwap_list_item* itemlist;
|
struct capwap_list_item* itemlist;
|
||||||
struct capwap_message_element_itemlist* messageelement;
|
struct capwap_message_element_itemlist* messageelement;
|
||||||
struct capwap_message_elements_ops* msgops;
|
const struct capwap_message_elements_ops* msgops;
|
||||||
|
|
||||||
ASSERT(packet != NULL);
|
ASSERT(packet != NULL);
|
||||||
|
|
||||||
@ -639,15 +648,15 @@ void capwap_free_parsed_packet(struct capwap_parsed_packet* packet) {
|
|||||||
while (itemlist) {
|
while (itemlist) {
|
||||||
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
||||||
if (messageelement->data) {
|
if (messageelement->data) {
|
||||||
msgops = capwap_get_message_element_ops(messageelement->type);
|
msgops = capwap_get_message_element_ops(messageelement->id);
|
||||||
|
|
||||||
if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
||||||
msgops->free_message_element(messageelement->data);
|
msgops->free(messageelement->data);
|
||||||
} else if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
|
} else if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
|
||||||
struct capwap_array* arraymessageelement = (struct capwap_array*)messageelement->data;
|
struct capwap_array* arraymessageelement = (struct capwap_array*)messageelement->data;
|
||||||
|
|
||||||
for (i = 0; i < arraymessageelement->count; i++) {
|
for (i = 0; i < arraymessageelement->count; i++) {
|
||||||
msgops->free_message_element(*(void**)capwap_array_get_item_pointer(arraymessageelement, i));
|
msgops->free(*(void**)capwap_array_get_item_pointer(arraymessageelement, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
|
@ -4,6 +4,15 @@
|
|||||||
#include "capwap_array.h"
|
#include "capwap_array.h"
|
||||||
#include "capwap_list.h"
|
#include "capwap_list.h"
|
||||||
|
|
||||||
|
struct capwap_message_element_id
|
||||||
|
{
|
||||||
|
uint32_t vendor;
|
||||||
|
uint16_t type;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define message_element_id_eq(a, b) \
|
||||||
|
(((a).vendor == (b).vendor) && ((a).type == (b).type))
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
typedef void* capwap_message_elements_handle;
|
typedef void* capwap_message_elements_handle;
|
||||||
struct capwap_write_message_elements_ops {
|
struct capwap_write_message_elements_ops {
|
||||||
@ -21,21 +30,25 @@ struct capwap_read_message_elements_ops {
|
|||||||
int (*read_block)(capwap_message_elements_handle handle, uint8_t* data, unsigned short length);
|
int (*read_block)(capwap_message_elements_handle handle, uint8_t* data, unsigned short length);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct capwap_message_elements_ops {
|
struct capwap_message_elements_ops
|
||||||
|
{
|
||||||
|
int category;
|
||||||
|
|
||||||
/* Build message element */
|
/* Build message element */
|
||||||
void (*create_message_element)(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func);
|
void (*create)(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func);
|
||||||
|
|
||||||
/* Parsing message element */
|
/* Parsing message element */
|
||||||
void* (*parsing_message_element)(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func);
|
void* (*parse)(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func);
|
||||||
|
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
void* (*clone_message_element)(void*);
|
void* (*clone)(void*);
|
||||||
void (*free_message_element)(void*);
|
void (*free)(void*);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct capwap_message_elements_ops* capwap_get_message_element_ops(unsigned short code);
|
const struct capwap_message_elements_ops *capwap_get_message_element_ops(const struct capwap_message_element_id id);
|
||||||
|
|
||||||
/*********************************************************************************************************************/
|
/*********************************************************************************************************************/
|
||||||
|
|
||||||
/* Standard message elements */
|
/* Standard message elements */
|
||||||
#include "capwap_element_acdescriptor.h" /* 00001 */
|
#include "capwap_element_acdescriptor.h" /* 00001 */
|
||||||
#include "capwap_element_acipv4list.h" /* 00002 */
|
#include "capwap_element_acipv4list.h" /* 00002 */
|
||||||
@ -118,13 +131,16 @@ struct capwap_message_elements_ops* capwap_get_message_element_ops(unsigned shor
|
|||||||
#include "capwap_element_80211_wtpradiofailalarm.h" /* 01047 */
|
#include "capwap_element_80211_wtpradiofailalarm.h" /* 01047 */
|
||||||
#include "capwap_element_80211_wtpradioinformation.h" /* 01048 */
|
#include "capwap_element_80211_wtpradioinformation.h" /* 01048 */
|
||||||
|
|
||||||
|
#include "capwap_vendor_travelping.h"
|
||||||
|
|
||||||
/*********************************************************************************************************************/
|
/*********************************************************************************************************************/
|
||||||
#define CAPWAP_MESSAGE_ELEMENT_SINGLE 0
|
#define CAPWAP_MESSAGE_ELEMENT_SINGLE 0
|
||||||
#define CAPWAP_MESSAGE_ELEMENT_ARRAY 1
|
#define CAPWAP_MESSAGE_ELEMENT_ARRAY 1
|
||||||
int capwap_get_message_element_category(uint16_t type);
|
int capwap_get_message_element_category(uint16_t type);
|
||||||
|
|
||||||
struct capwap_message_element_itemlist {
|
struct capwap_message_element_itemlist
|
||||||
uint16_t type;
|
{
|
||||||
|
struct capwap_message_element_id id;
|
||||||
int category;
|
int category;
|
||||||
void* data;
|
void* data;
|
||||||
};
|
};
|
||||||
@ -143,7 +159,9 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
|||||||
int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct capwap_array* returnedmessage);
|
int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct capwap_array* returnedmessage);
|
||||||
void capwap_free_parsed_packet(struct capwap_parsed_packet* packet);
|
void capwap_free_parsed_packet(struct capwap_parsed_packet* packet);
|
||||||
|
|
||||||
struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet* packet, uint16_t type);
|
struct capwap_list_item *capwap_get_message_element(struct capwap_parsed_packet *packet,
|
||||||
void* capwap_get_message_element_data(struct capwap_parsed_packet* packet, uint16_t type);
|
const struct capwap_message_element_id id);
|
||||||
|
void *capwap_get_message_element_data(struct capwap_parsed_packet *packet,
|
||||||
|
const struct capwap_message_element_id id);
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_HEADER__ */
|
||||||
|
@ -99,7 +99,7 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 20) {
|
if (length < 20) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Add WLAN element: underbuffer");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Add WLAN element: underbuffer");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,11 +113,11 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
|
|||||||
|
|
||||||
if (!IS_VALID_RADIOID(data->radioid)) {
|
if (!IS_VALID_RADIOID(data->radioid)) {
|
||||||
capwap_80211_addwlan_element_free((void*)data);
|
capwap_80211_addwlan_element_free((void*)data);
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Add WLAN element: invalid radioid");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Add WLAN element: invalid radioid");
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (!IS_VALID_WLANID(data->wlanid)) {
|
} else if (!IS_VALID_WLANID(data->wlanid)) {
|
||||||
capwap_80211_addwlan_element_free((void*)data);
|
capwap_80211_addwlan_element_free((void*)data);
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Add WLAN element: invalid wlanid");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Add WLAN element: invalid wlanid");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
|
|||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (!length || (length > CAPWAP_ADD_WLAN_SSID_LENGTH)) {
|
if (!length || (length > CAPWAP_ADD_WLAN_SSID_LENGTH)) {
|
||||||
capwap_80211_addwlan_element_free((void*)data);
|
capwap_80211_addwlan_element_free((void*)data);
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Add WLAN element: invalid ssid");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Add WLAN element: invalid ssid");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,9 +153,10 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_addwlan_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_addwlan_ops = {
|
||||||
.create_message_element = capwap_80211_addwlan_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_addwlan_element_parsing,
|
.create = capwap_80211_addwlan_element_create,
|
||||||
.clone_message_element = capwap_80211_addwlan_element_clone,
|
.parse = capwap_80211_addwlan_element_parsing,
|
||||||
.free_message_element = capwap_80211_addwlan_element_free
|
.clone = capwap_80211_addwlan_element_clone,
|
||||||
|
.free = capwap_80211_addwlan_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_ADD_WLAN_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_ADD_WLAN_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_ADD_WLAN_HEADER__
|
#define __CAPWAP_ELEMENT_80211_ADD_WLAN_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_ADD_WLAN 1024
|
#define CAPWAP_ELEMENT_80211_ADD_WLAN_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_ADD_WLAN_TYPE 1024
|
||||||
|
#define CAPWAP_ELEMENT_80211_ADD_WLAN (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_ADD_WLAN_VENDOR, .type = CAPWAP_ELEMENT_80211_ADD_WLAN_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_ADD_WLAN_GROUPTSC_LENGTH 6
|
#define CAPWAP_ADD_WLAN_GROUPTSC_LENGTH 6
|
||||||
#define CAPWAP_ADD_WLAN_SSID_LENGTH 32
|
#define CAPWAP_ADD_WLAN_SSID_LENGTH 32
|
||||||
@ -59,6 +62,6 @@ struct capwap_80211_addwlan_element {
|
|||||||
uint8_t* ssid;
|
uint8_t* ssid;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_addwlan_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_addwlan_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_ADD_WLAN_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_ADD_WLAN_HEADER__ */
|
||||||
|
@ -75,13 +75,13 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 5) {
|
if (length < 5) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Antenna element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
length -= 4;
|
length -= 4;
|
||||||
if (length > CAPWAP_ANTENNASELECTIONS_MAXLENGTH) {
|
if (length > CAPWAP_ANTENNASELECTIONS_MAXLENGTH) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Antenna element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle
|
|||||||
func->read_u8(handle, &data->radioid);
|
func->read_u8(handle, &data->radioid);
|
||||||
if (!IS_VALID_RADIOID(data->radioid)) {
|
if (!IS_VALID_RADIOID(data->radioid)) {
|
||||||
capwap_80211_antenna_element_free((void*)data);
|
capwap_80211_antenna_element_free((void*)data);
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Antenna element element: invalid radio");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Antenna element element: invalid radio");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle
|
|||||||
|
|
||||||
/* Check */
|
/* Check */
|
||||||
if (count != length) {
|
if (count != length) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Antenna element");
|
||||||
capwap_free(data);
|
capwap_free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -142,9 +142,10 @@ void capwap_element_80211_antenna_copy(struct capwap_80211_antenna_element* dst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_antenna_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_antenna_ops = {
|
||||||
.create_message_element = capwap_80211_antenna_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_antenna_element_parsing,
|
.create = capwap_80211_antenna_element_create,
|
||||||
.clone_message_element = capwap_80211_antenna_element_clone,
|
.parse = capwap_80211_antenna_element_parsing,
|
||||||
.free_message_element = capwap_80211_antenna_element_free
|
.clone = capwap_80211_antenna_element_clone,
|
||||||
|
.free = capwap_80211_antenna_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__
|
#define __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_ANTENNA 1025
|
#define CAPWAP_ELEMENT_80211_ANTENNA_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_ANTENNA_TYPE 1025
|
||||||
|
#define CAPWAP_ELEMENT_80211_ANTENNA (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_ANTENNA_VENDOR, .type = CAPWAP_ELEMENT_80211_ANTENNA_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_ANTENNA_DIVERSITY_DISABLE 0
|
#define CAPWAP_ANTENNA_DIVERSITY_DISABLE 0
|
||||||
#define CAPWAP_ANTENNA_DIVERSITY_ENABLE 1
|
#define CAPWAP_ANTENNA_DIVERSITY_ENABLE 1
|
||||||
@ -23,7 +26,7 @@ struct capwap_80211_antenna_element {
|
|||||||
struct capwap_array* selections;
|
struct capwap_array* selections;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_antenna_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_antenna_ops;
|
||||||
void capwap_element_80211_antenna_copy(struct capwap_80211_antenna_element* dst, struct capwap_80211_antenna_element* src);
|
void capwap_element_80211_antenna_copy(struct capwap_80211_antenna_element* dst, struct capwap_80211_antenna_element* src);
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__ */
|
||||||
|
@ -36,7 +36,7 @@ static void* capwap_80211_assignbssid_element_parsing(capwap_message_elements_ha
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 8) {
|
if (func->read_ready(handle) != 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Assigned WTP BSSID element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Assigned WTP BSSID element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,9 +67,10 @@ static void capwap_80211_assignbssid_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops = {
|
||||||
.create_message_element = capwap_80211_assignbssid_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_assignbssid_element_parsing,
|
.create = capwap_80211_assignbssid_element_create,
|
||||||
.clone_message_element = capwap_80211_assignbssid_element_clone,
|
.parse = capwap_80211_assignbssid_element_parsing,
|
||||||
.free_message_element = capwap_80211_assignbssid_element_free
|
.clone = capwap_80211_assignbssid_element_clone,
|
||||||
|
.free = capwap_80211_assignbssid_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__
|
#define __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_ASSIGN_BSSID 1026
|
#define CAPWAP_ELEMENT_80211_ASSIGN_BSSID_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_ASSIGN_BSSID_TYPE 1026
|
||||||
|
#define CAPWAP_ELEMENT_80211_ASSIGN_BSSID (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_ASSIGN_BSSID_VENDOR, .type = CAPWAP_ELEMENT_80211_ASSIGN_BSSID_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_assignbssid_element {
|
struct capwap_80211_assignbssid_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
@ -9,6 +12,6 @@ struct capwap_80211_assignbssid_element {
|
|||||||
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
|
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__ */
|
||||||
|
@ -33,7 +33,7 @@ static void* capwap_80211_deletewlan_element_parsing(capwap_message_elements_han
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 2) {
|
if (func->read_ready(handle) != 2) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Delete WLAN element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Delete WLAN element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,9 +63,10 @@ static void capwap_80211_deletewlan_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops = {
|
||||||
.create_message_element = capwap_80211_deletewlan_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_deletewlan_element_parsing,
|
.create = capwap_80211_deletewlan_element_create,
|
||||||
.clone_message_element = capwap_80211_deletewlan_element_clone,
|
.parse = capwap_80211_deletewlan_element_parsing,
|
||||||
.free_message_element = capwap_80211_deletewlan_element_free
|
.clone = capwap_80211_deletewlan_element_clone,
|
||||||
|
.free = capwap_80211_deletewlan_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__
|
#define __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_DELETE_WLAN 1027
|
#define CAPWAP_ELEMENT_80211_DELETE_WLAN_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_DELETE_WLAN_TYPE 1027
|
||||||
|
#define CAPWAP_ELEMENT_80211_DELETE_WLAN (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_DELETE_WLAN_VENDOR, .type = CAPWAP_ELEMENT_80211_DELETE_WLAN_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_deletewlan_element {
|
struct capwap_80211_deletewlan_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
uint8_t wlanid;
|
uint8_t wlanid;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__ */
|
||||||
|
@ -54,7 +54,7 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 8) {
|
if (func->read_ready(handle) != 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Direct Sequence Control element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Direct Sequence Control element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e
|
|||||||
func->read_u8(handle, &data->radioid);
|
func->read_u8(handle, &data->radioid);
|
||||||
if (!IS_VALID_RADIOID(data->radioid)) {
|
if (!IS_VALID_RADIOID(data->radioid)) {
|
||||||
capwap_80211_directsequencecontrol_element_free((void*)data);
|
capwap_80211_directsequencecontrol_element_free((void*)data);
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Direct Sequence Control element: invalid radio");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Direct Sequence Control element: invalid radio");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,9 +79,10 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops = {
|
||||||
.create_message_element = capwap_80211_directsequencecontrol_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_directsequencecontrol_element_parsing,
|
.create = capwap_80211_directsequencecontrol_element_create,
|
||||||
.clone_message_element = capwap_80211_directsequencecontrol_element_clone,
|
.parse = capwap_80211_directsequencecontrol_element_parsing,
|
||||||
.free_message_element = capwap_80211_directsequencecontrol_element_free
|
.clone = capwap_80211_directsequencecontrol_element_clone,
|
||||||
|
.free = capwap_80211_directsequencecontrol_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_HEADER__
|
#define __CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL 1028
|
#define CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_TYPE 1028
|
||||||
|
#define CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_VENDOR, .type = CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_DSCONTROL_CCA_EDONLY 1
|
#define CAPWAP_DSCONTROL_CCA_EDONLY 1
|
||||||
#define CAPWAP_DSCONTROL_CCA_CSONLY 2
|
#define CAPWAP_DSCONTROL_CCA_CSONLY 2
|
||||||
@ -17,6 +20,6 @@ struct capwap_80211_directsequencecontrol_element {
|
|||||||
uint32_t enerydetectthreshold;
|
uint32_t enerydetectthreshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_HEADER__ */
|
||||||
|
@ -37,7 +37,7 @@ static void* capwap_80211_ie_element_parsing(capwap_message_elements_handle hand
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 4) {
|
if (length < 4) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Information Element element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Information Element element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,9 +83,10 @@ static void capwap_80211_ie_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_ie_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_ie_ops = {
|
||||||
.create_message_element = capwap_80211_ie_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_ie_element_parsing,
|
.create = capwap_80211_ie_element_create,
|
||||||
.clone_message_element = capwap_80211_ie_element_clone,
|
.parse = capwap_80211_ie_element_parsing,
|
||||||
.free_message_element = capwap_80211_ie_element_free
|
.clone = capwap_80211_ie_element_clone,
|
||||||
|
.free = capwap_80211_ie_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_IE_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_IE_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_IE_HEADER__
|
#define __CAPWAP_ELEMENT_80211_IE_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_IE 1029
|
#define CAPWAP_ELEMENT_80211_IE_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_IE_TYPE 1029
|
||||||
|
#define CAPWAP_ELEMENT_80211_IE (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_IE_VENDOR, .type = CAPWAP_ELEMENT_80211_IE_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_IE_BEACONS_ASSOCIATED 0x80
|
#define CAPWAP_IE_BEACONS_ASSOCIATED 0x80
|
||||||
#define CAPWAP_IE_PROBE_RESPONSE_ASSOCIATED 0x40
|
#define CAPWAP_IE_PROBE_RESPONSE_ASSOCIATED 0x40
|
||||||
@ -14,6 +17,6 @@ struct capwap_80211_ie_element {
|
|||||||
uint8_t* ie;
|
uint8_t* ie;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_ie_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_ie_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_IE_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_IE_HEADER__ */
|
||||||
|
@ -46,7 +46,7 @@ static void* capwap_80211_macoperation_element_parsing(capwap_message_elements_h
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 16) {
|
if (func->read_ready(handle) != 16) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 MAC Operation element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 MAC Operation element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,9 +82,10 @@ static void capwap_80211_macoperation_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_macoperation_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_macoperation_ops = {
|
||||||
.create_message_element = capwap_80211_macoperation_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_macoperation_element_parsing,
|
.create = capwap_80211_macoperation_element_create,
|
||||||
.clone_message_element = capwap_80211_macoperation_element_clone,
|
.parse = capwap_80211_macoperation_element_parsing,
|
||||||
.free_message_element = capwap_80211_macoperation_element_free
|
.clone = capwap_80211_macoperation_element_clone,
|
||||||
|
.free = capwap_80211_macoperation_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_MACOPERATION_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_MACOPERATION_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_MACOPERATION_HEADER__
|
#define __CAPWAP_ELEMENT_80211_MACOPERATION_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_MACOPERATION 1030
|
#define CAPWAP_ELEMENT_80211_MACOPERATION_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_MACOPERATION_TYPE 1030
|
||||||
|
#define CAPWAP_ELEMENT_80211_MACOPERATION (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_MACOPERATION_VENDOR, .type = CAPWAP_ELEMENT_80211_MACOPERATION_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_macoperation_element {
|
struct capwap_80211_macoperation_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
@ -13,6 +16,6 @@ struct capwap_80211_macoperation_element {
|
|||||||
uint32_t rxmsdulifetime;
|
uint32_t rxmsdulifetime;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_macoperation_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_macoperation_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_MACOPERATION_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_MACOPERATION_HEADER__ */
|
||||||
|
@ -36,7 +36,7 @@ static void* capwap_80211_miccountermeasures_element_parsing(capwap_message_elem
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 8) {
|
if (func->read_ready(handle) != 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 MIC Countermeasures element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 MIC Countermeasures element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,9 +67,10 @@ static void capwap_80211_miccountermeasures_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops = {
|
||||||
.create_message_element = capwap_80211_miccountermeasures_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_miccountermeasures_element_parsing,
|
.create = capwap_80211_miccountermeasures_element_create,
|
||||||
.clone_message_element = capwap_80211_miccountermeasures_element_clone,
|
.parse = capwap_80211_miccountermeasures_element_parsing,
|
||||||
.free_message_element = capwap_80211_miccountermeasures_element_free
|
.clone = capwap_80211_miccountermeasures_element_clone,
|
||||||
|
.free = capwap_80211_miccountermeasures_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_HEADER__
|
#define __CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES 1031
|
#define CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_TYPE 1031
|
||||||
|
#define CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_VENDOR, .type = CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_miccountermeasures_element {
|
struct capwap_80211_miccountermeasures_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
@ -9,6 +12,6 @@ struct capwap_80211_miccountermeasures_element {
|
|||||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_HEADER__ */
|
||||||
|
@ -39,7 +39,7 @@ static void* capwap_80211_multidomaincapability_element_parsing(capwap_message_e
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 8) {
|
if (func->read_ready(handle) != 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Multi-Domain Capability element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Multi-Domain Capability element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,9 +72,10 @@ static void capwap_80211_multidomaincapability_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops = {
|
||||||
.create_message_element = capwap_80211_multidomaincapability_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_multidomaincapability_element_parsing,
|
.create = capwap_80211_multidomaincapability_element_create,
|
||||||
.clone_message_element = capwap_80211_multidomaincapability_element_clone,
|
.parse = capwap_80211_multidomaincapability_element_parsing,
|
||||||
.free_message_element = capwap_80211_multidomaincapability_element_free
|
.clone = capwap_80211_multidomaincapability_element_clone,
|
||||||
|
.free = capwap_80211_multidomaincapability_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_HEADER__
|
#define __CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY 1032
|
#define CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_TYPE 1032
|
||||||
|
#define CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_VENDOR, .type = CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_multidomaincapability_element {
|
struct capwap_80211_multidomaincapability_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
@ -10,6 +13,6 @@ struct capwap_80211_multidomaincapability_element {
|
|||||||
uint16_t maxtxpowerlevel;
|
uint16_t maxtxpowerlevel;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_HEADER__ */
|
||||||
|
@ -39,7 +39,7 @@ static void* capwap_80211_ofdmcontrol_element_parsing(capwap_message_elements_ha
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 8) {
|
if (func->read_ready(handle) != 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 OFDM Control element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 OFDM Control element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,9 +72,10 @@ static void capwap_80211_ofdmcontrol_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops = {
|
||||||
.create_message_element = capwap_80211_ofdmcontrol_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_ofdmcontrol_element_parsing,
|
.create = capwap_80211_ofdmcontrol_element_create,
|
||||||
.clone_message_element = capwap_80211_ofdmcontrol_element_clone,
|
.parse = capwap_80211_ofdmcontrol_element_parsing,
|
||||||
.free_message_element = capwap_80211_ofdmcontrol_element_free
|
.clone = capwap_80211_ofdmcontrol_element_clone,
|
||||||
|
.free = capwap_80211_ofdmcontrol_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_OFDMCONTROL_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_OFDMCONTROL_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_OFDMCONTROL_HEADER__
|
#define __CAPWAP_ELEMENT_80211_OFDMCONTROL_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_OFDMCONTROL 1033
|
#define CAPWAP_ELEMENT_80211_OFDMCONTROL_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_OFDMCONTROL_TYPE 1033
|
||||||
|
#define CAPWAP_ELEMENT_80211_OFDMCONTROL (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_OFDMCONTROL_VENDOR, .type = CAPWAP_ELEMENT_80211_OFDMCONTROL_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_OFDMCONTROL_BAND_515_525 0x01
|
#define CAPWAP_OFDMCONTROL_BAND_515_525 0x01
|
||||||
#define CAPWAP_OFDMCONTROL_BAND_525_535 0x02
|
#define CAPWAP_OFDMCONTROL_BAND_525_535 0x02
|
||||||
@ -19,6 +22,6 @@ struct capwap_80211_ofdmcontrol_element {
|
|||||||
uint32_t tithreshold;
|
uint32_t tithreshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_OFDMCONTROL_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_OFDMCONTROL_HEADER__ */
|
||||||
|
@ -35,13 +35,13 @@ static void* capwap_80211_rateset_element_parsing(capwap_message_elements_handle
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 3) {
|
if (length < 3) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Rate Set element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Rate Set element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
length -= 1;
|
length -= 1;
|
||||||
if (length > CAPWAP_RATESET_MAXLENGTH) {
|
if (length > CAPWAP_RATESET_MAXLENGTH) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Rate Set element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Rate Set element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,9 +72,10 @@ static void capwap_80211_rateset_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_rateset_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_rateset_ops = {
|
||||||
.create_message_element = capwap_80211_rateset_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_rateset_element_parsing,
|
.create = capwap_80211_rateset_element_create,
|
||||||
.clone_message_element = capwap_80211_rateset_element_clone,
|
.parse = capwap_80211_rateset_element_parsing,
|
||||||
.free_message_element = capwap_80211_rateset_element_free
|
.clone = capwap_80211_rateset_element_clone,
|
||||||
|
.free = capwap_80211_rateset_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_RATESET_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_RATESET_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_RATESET_HEADER__
|
#define __CAPWAP_ELEMENT_80211_RATESET_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_RATESET 1034
|
#define CAPWAP_ELEMENT_80211_RATESET_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_RATESET_TYPE 1034
|
||||||
|
#define CAPWAP_ELEMENT_80211_RATESET (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_RATESET_VENDOR, .type = CAPWAP_ELEMENT_80211_RATESET_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_RATESET_MINLENGTH 2
|
#define CAPWAP_RATESET_MINLENGTH 2
|
||||||
#define CAPWAP_RATESET_MAXLENGTH 8
|
#define CAPWAP_RATESET_MAXLENGTH 8
|
||||||
@ -12,6 +15,6 @@ struct capwap_80211_rateset_element {
|
|||||||
uint8_t rateset[CAPWAP_RATESET_MAXLENGTH];
|
uint8_t rateset[CAPWAP_RATESET_MAXLENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_rateset_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_rateset_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_RATESET_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_RATESET_HEADER__ */
|
||||||
|
@ -61,7 +61,7 @@ static void* capwap_80211_rsnaerrorreport_element_parsing(capwap_message_element
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 40) {
|
if (func->read_ready(handle) != 40) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 RSNA Error Report From Station element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 RSNA Error Report From Station element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,9 +100,10 @@ static void capwap_80211_rsnaerrorreport_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops = {
|
||||||
.create_message_element = capwap_80211_rsnaerrorreport_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_rsnaerrorreport_element_parsing,
|
.create = capwap_80211_rsnaerrorreport_element_create,
|
||||||
.clone_message_element = capwap_80211_rsnaerrorreport_element_clone,
|
.parse = capwap_80211_rsnaerrorreport_element_parsing,
|
||||||
.free_message_element = capwap_80211_rsnaerrorreport_element_free
|
.clone = capwap_80211_rsnaerrorreport_element_clone,
|
||||||
|
.free = capwap_80211_rsnaerrorreport_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_HEADER__
|
#define __CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT 1035
|
#define CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_TYPE 1035
|
||||||
|
#define CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_VENDOR, .type = CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_rsnaerrorreport_element {
|
struct capwap_80211_rsnaerrorreport_element {
|
||||||
uint8_t client[MACADDRESS_EUI48_LENGTH];
|
uint8_t client[MACADDRESS_EUI48_LENGTH];
|
||||||
@ -16,6 +19,6 @@ struct capwap_80211_rsnaerrorreport_element {
|
|||||||
uint32_t tkipreplays;
|
uint32_t tkipreplays;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_HEADER__ */
|
||||||
|
@ -46,13 +46,13 @@ static void* capwap_80211_station_element_parsing(capwap_message_elements_handle
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 14) {
|
if (length < 14) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Station element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Station element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
length -= 13;
|
length -= 13;
|
||||||
if (length > CAPWAP_STATION_RATES_MAXLENGTH) {
|
if (length > CAPWAP_STATION_RATES_MAXLENGTH) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Station element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Station element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,9 +88,10 @@ static void capwap_80211_station_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_station_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_station_ops = {
|
||||||
.create_message_element = capwap_80211_station_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_station_element_parsing,
|
.create = capwap_80211_station_element_create,
|
||||||
.clone_message_element = capwap_80211_station_element_clone,
|
.parse = capwap_80211_station_element_parsing,
|
||||||
.free_message_element = capwap_80211_station_element_free
|
.clone = capwap_80211_station_element_clone,
|
||||||
|
.free = capwap_80211_station_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_STATION_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_STATION_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_STATION_HEADER__
|
#define __CAPWAP_ELEMENT_80211_STATION_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_STATION 1036
|
#define CAPWAP_ELEMENT_80211_STATION_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATION_TYPE 1036
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATION (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_STATION_VENDOR, .type = CAPWAP_ELEMENT_80211_STATION_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_STATION_RATES_MAXLENGTH 128
|
#define CAPWAP_STATION_RATES_MAXLENGTH 128
|
||||||
|
|
||||||
@ -16,6 +19,6 @@ struct capwap_80211_station_element {
|
|||||||
uint8_t supportedrates[CAPWAP_STATION_RATES_MAXLENGTH];
|
uint8_t supportedrates[CAPWAP_STATION_RATES_MAXLENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_station_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_station_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_STATION_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_STATION_HEADER__ */
|
||||||
|
@ -39,7 +39,9 @@ static void capwap_80211_stationkey_element_create(void* data, capwap_message_el
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static void* capwap_80211_stationkey_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
|
static void* capwap_80211_stationkey_element_parsing(capwap_message_elements_handle handle,
|
||||||
|
struct capwap_read_message_elements_ops* func)
|
||||||
|
{
|
||||||
unsigned short length;
|
unsigned short length;
|
||||||
struct capwap_80211_stationkey_element* data;
|
struct capwap_80211_stationkey_element* data;
|
||||||
|
|
||||||
@ -48,15 +50,16 @@ static void* capwap_80211_stationkey_element_parsing(capwap_message_elements_han
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 25) {
|
if (length < 25) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Station Session Key element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Station Session Key element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
data = (struct capwap_80211_stationkey_element*)capwap_alloc(sizeof(struct capwap_80211_stationkey_element));
|
data = (struct capwap_80211_stationkey_element *)
|
||||||
|
capwap_alloc(sizeof(struct capwap_80211_stationkey_element));
|
||||||
|
memset(data, 0, sizeof(struct capwap_80211_stationkey_element));
|
||||||
data->keylength = length - 20;
|
data->keylength = length - 20;
|
||||||
data->key = (uint8_t*)capwap_alloc(data->keylength);
|
data->key = (uint8_t*)capwap_alloc(data->keylength);
|
||||||
memset(data, 0, sizeof(struct capwap_80211_stationkey_element));
|
|
||||||
|
|
||||||
/* Retrieve data */
|
/* Retrieve data */
|
||||||
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
|
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
|
||||||
@ -96,9 +99,10 @@ static void capwap_80211_stationkey_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_stationkey_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_stationkey_ops = {
|
||||||
.create_message_element = capwap_80211_stationkey_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_stationkey_element_parsing,
|
.create = capwap_80211_stationkey_element_create,
|
||||||
.clone_message_element = capwap_80211_stationkey_element_clone,
|
.parse = capwap_80211_stationkey_element_parsing,
|
||||||
.free_message_element = capwap_80211_stationkey_element_free
|
.clone = capwap_80211_stationkey_element_clone,
|
||||||
|
.free = capwap_80211_stationkey_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_HEADER__
|
#define __CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE 1038
|
#define CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_TYPE 1038
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_VENDOR, .type = CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_STATION_SESSION_KEY_PAIRWISE_TSC_LENGTH 6
|
#define CAPWAP_STATION_SESSION_KEY_PAIRWISE_TSC_LENGTH 6
|
||||||
#define CAPWAP_STATION_SESSION_KEY_PAIRWISE_RSC_LENGTH 6
|
#define CAPWAP_STATION_SESSION_KEY_PAIRWISE_RSC_LENGTH 6
|
||||||
@ -18,6 +21,6 @@ struct capwap_80211_stationkey_element {
|
|||||||
uint8_t* key;
|
uint8_t* key;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_stationkey_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_stationkey_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_HEADER__ */
|
||||||
|
@ -36,7 +36,7 @@ static void* capwap_80211_stationqos_element_parsing(capwap_message_elements_han
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 8) {
|
if (func->read_ready(handle) != 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Station QoS Profile element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Station QoS Profile element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,9 +67,10 @@ static void capwap_80211_stationqos_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_stationqos_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_stationqos_ops = {
|
||||||
.create_message_element = capwap_80211_stationqos_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_stationqos_element_parsing,
|
.create = capwap_80211_stationqos_element_create,
|
||||||
.clone_message_element = capwap_80211_stationqos_element_clone,
|
.parse = capwap_80211_stationqos_element_parsing,
|
||||||
.free_message_element = capwap_80211_stationqos_element_free
|
.clone = capwap_80211_stationqos_element_clone,
|
||||||
|
.free = capwap_80211_stationqos_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_HEADER__
|
#define __CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE 1037
|
#define CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_TYPE 1037
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_VENDOR, .type = CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_stationqos_element {
|
struct capwap_80211_stationqos_element {
|
||||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||||
uint8_t priority;
|
uint8_t priority;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_stationqos_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_stationqos_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_HEADER__ */
|
||||||
|
@ -91,7 +91,7 @@ static void* capwap_80211_statistics_element_parsing(capwap_message_elements_han
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 80) {
|
if (func->read_ready(handle) != 80) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Statistics element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Statistics element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,9 +140,10 @@ static void capwap_80211_statistics_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_statistics_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_statistics_ops = {
|
||||||
.create_message_element = capwap_80211_statistics_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_statistics_element_parsing,
|
.create = capwap_80211_statistics_element_create,
|
||||||
.clone_message_element = capwap_80211_statistics_element_clone,
|
.parse = capwap_80211_statistics_element_parsing,
|
||||||
.free_message_element = capwap_80211_statistics_element_free
|
.clone = capwap_80211_statistics_element_clone,
|
||||||
|
.free = capwap_80211_statistics_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_STATISTICS_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_STATISTICS_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_STATISTICS_HEADER__
|
#define __CAPWAP_ELEMENT_80211_STATISTICS_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_STATISTICS 1039
|
#define CAPWAP_ELEMENT_80211_STATISTICS_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATISTICS_TYPE 1039
|
||||||
|
#define CAPWAP_ELEMENT_80211_STATISTICS (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_STATISTICS_VENDOR, .type = CAPWAP_ELEMENT_80211_STATISTICS_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_statistics_element {
|
struct capwap_80211_statistics_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
@ -26,6 +29,6 @@ struct capwap_80211_statistics_element {
|
|||||||
uint32_t qoscfpollsunusable;
|
uint32_t qoscfpollsunusable;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_statistics_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_statistics_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_STATISTICS_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_STATISTICS_HEADER__ */
|
||||||
|
@ -35,13 +35,13 @@ static void* capwap_80211_supportedrates_element_parsing(capwap_message_elements
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 3) {
|
if (length < 3) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Supported Rates element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Supported Rates element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
length -= 1;
|
length -= 1;
|
||||||
if (length > CAPWAP_RATESET_MAXLENGTH) {
|
if (length > CAPWAP_RATESET_MAXLENGTH) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Supported Rates element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Supported Rates element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,9 +72,10 @@ static void capwap_80211_supportedrates_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops = {
|
||||||
.create_message_element = capwap_80211_supportedrates_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_supportedrates_element_parsing,
|
.create = capwap_80211_supportedrates_element_create,
|
||||||
.clone_message_element = capwap_80211_supportedrates_element_clone,
|
.parse = capwap_80211_supportedrates_element_parsing,
|
||||||
.free_message_element = capwap_80211_supportedrates_element_free
|
.clone = capwap_80211_supportedrates_element_clone,
|
||||||
|
.free = capwap_80211_supportedrates_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_SUPPORTEDRATES_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_SUPPORTEDRATES_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_SUPPORTEDRATES_HEADER__
|
#define __CAPWAP_ELEMENT_80211_SUPPORTEDRATES_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_SUPPORTEDRATES 1040
|
#define CAPWAP_ELEMENT_80211_SUPPORTEDRATES_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_SUPPORTEDRATES_TYPE 1040
|
||||||
|
#define CAPWAP_ELEMENT_80211_SUPPORTEDRATES (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_SUPPORTEDRATES_VENDOR, .type = CAPWAP_ELEMENT_80211_SUPPORTEDRATES_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_SUPPORTEDRATES_MINLENGTH 2
|
#define CAPWAP_SUPPORTEDRATES_MINLENGTH 2
|
||||||
#define CAPWAP_SUPPORTEDRATES_MAXLENGTH 8
|
#define CAPWAP_SUPPORTEDRATES_MAXLENGTH 8
|
||||||
@ -12,6 +15,6 @@ struct capwap_80211_supportedrates_element {
|
|||||||
uint8_t supportedrates[CAPWAP_SUPPORTEDRATES_MAXLENGTH];
|
uint8_t supportedrates[CAPWAP_SUPPORTEDRATES_MAXLENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_SUPPORTEDRATES_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_SUPPORTEDRATES_HEADER__ */
|
||||||
|
@ -35,7 +35,7 @@ static void* capwap_80211_txpower_element_parsing(capwap_message_elements_handle
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 4) {
|
if (func->read_ready(handle) != 4) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Tx Power element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Tx Power element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,9 +66,10 @@ static void capwap_80211_txpower_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_txpower_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_txpower_ops = {
|
||||||
.create_message_element = capwap_80211_txpower_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_txpower_element_parsing,
|
.create = capwap_80211_txpower_element_create,
|
||||||
.clone_message_element = capwap_80211_txpower_element_clone,
|
.parse = capwap_80211_txpower_element_parsing,
|
||||||
.free_message_element = capwap_80211_txpower_element_free
|
.clone = capwap_80211_txpower_element_clone,
|
||||||
|
.free = capwap_80211_txpower_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_TXPOWER_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_TXPOWER_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_TXPOWER_HEADER__
|
#define __CAPWAP_ELEMENT_80211_TXPOWER_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_TXPOWER 1041
|
#define CAPWAP_ELEMENT_80211_TXPOWER_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_TXPOWER_TYPE 1041
|
||||||
|
#define CAPWAP_ELEMENT_80211_TXPOWER (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_TXPOWER_VENDOR, .type = CAPWAP_ELEMENT_80211_TXPOWER_TYPE }
|
||||||
|
|
||||||
|
|
||||||
struct capwap_80211_txpower_element {
|
struct capwap_80211_txpower_element {
|
||||||
uint8_t radioid;
|
uint8_t radioid;
|
||||||
uint16_t currenttxpower;
|
uint16_t currenttxpower;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_txpower_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_txpower_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_TXPOWER_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_TXPOWER_HEADER__ */
|
||||||
|
@ -40,13 +40,13 @@ static void* capwap_80211_txpowerlevel_element_parsing(capwap_message_elements_h
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 4) {
|
if (length < 4) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Tx Power Level element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Tx Power Level element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
length -= 2;
|
length -= 2;
|
||||||
if ((length % sizeof(uint16_t)) || ((length / sizeof(uint16_t)) > CAPWAP_TXPOWERLEVEL_MAXLENGTH)) {
|
if ((length % sizeof(uint16_t)) || ((length / sizeof(uint16_t)) > CAPWAP_TXPOWERLEVEL_MAXLENGTH)) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Tx Power Level element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Tx Power Level element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ static void* capwap_80211_txpowerlevel_element_parsing(capwap_message_elements_h
|
|||||||
|
|
||||||
/* Check */
|
/* Check */
|
||||||
if ((data->numlevels * sizeof(uint16_t)) != length) {
|
if ((data->numlevels * sizeof(uint16_t)) != length) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Tx Power Level element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Tx Power Level element");
|
||||||
capwap_free(data);
|
capwap_free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -87,9 +87,10 @@ static void capwap_80211_txpowerlevel_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_txpowerlevel_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_txpowerlevel_ops = {
|
||||||
.create_message_element = capwap_80211_txpowerlevel_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_txpowerlevel_element_parsing,
|
.create = capwap_80211_txpowerlevel_element_create,
|
||||||
.clone_message_element = capwap_80211_txpowerlevel_element_clone,
|
.parse = capwap_80211_txpowerlevel_element_parsing,
|
||||||
.free_message_element = capwap_80211_txpowerlevel_element_free
|
.clone = capwap_80211_txpowerlevel_element_clone,
|
||||||
|
.free = capwap_80211_txpowerlevel_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_TXPOWERLEVEL_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_TXPOWERLEVEL_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_TXPOWERLEVEL_HEADER__
|
#define __CAPWAP_ELEMENT_80211_TXPOWERLEVEL_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_TXPOWERLEVEL 1042
|
#define CAPWAP_ELEMENT_80211_TXPOWERLEVEL_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_TXPOWERLEVEL_TYPE 1042
|
||||||
|
#define CAPWAP_ELEMENT_80211_TXPOWERLEVEL (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_TXPOWERLEVEL_VENDOR, .type = CAPWAP_ELEMENT_80211_TXPOWERLEVEL_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_TXPOWERLEVEL_MAXLENGTH 8
|
#define CAPWAP_TXPOWERLEVEL_MAXLENGTH 8
|
||||||
|
|
||||||
@ -11,6 +14,6 @@ struct capwap_80211_txpowerlevel_element {
|
|||||||
uint16_t powerlevel[CAPWAP_TXPOWERLEVEL_MAXLENGTH];
|
uint16_t powerlevel[CAPWAP_TXPOWERLEVEL_MAXLENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_txpowerlevel_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_txpowerlevel_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_TXPOWERLEVEL_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_TXPOWERLEVEL_HEADER__ */
|
||||||
|
@ -47,7 +47,7 @@ static void* capwap_80211_updatestationqos_element_parsing(capwap_message_elemen
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 14) {
|
if (func->read_ready(handle) != 14) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Update Station QoS element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Update Station QoS element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,9 +83,10 @@ static void capwap_80211_updatestationqos_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops = {
|
||||||
.create_message_element = capwap_80211_updatestationqos_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_updatestationqos_element_parsing,
|
.create = capwap_80211_updatestationqos_element_create,
|
||||||
.clone_message_element = capwap_80211_updatestationqos_element_clone,
|
.parse = capwap_80211_updatestationqos_element_parsing,
|
||||||
.free_message_element = capwap_80211_updatestationqos_element_free
|
.clone = capwap_80211_updatestationqos_element_clone,
|
||||||
|
.free = capwap_80211_updatestationqos_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_HEADER__
|
#define __CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS 1043
|
#define CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_TYPE 1043
|
||||||
|
#define CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_VENDOR, .type = CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS 4
|
#define CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS 4
|
||||||
|
|
||||||
@ -19,6 +22,6 @@ struct capwap_80211_updatestationqos_element {
|
|||||||
struct capwap_80211_updatestationqos_subelement qos[CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS];
|
struct capwap_80211_updatestationqos_subelement qos[CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_HEADER__ */
|
||||||
|
@ -73,7 +73,7 @@ static void* capwap_80211_updatewlan_element_parsing(capwap_message_elements_han
|
|||||||
|
|
||||||
length = func->read_ready(handle);
|
length = func->read_ready(handle);
|
||||||
if (length < 8) {
|
if (length < 8) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Update WLAN element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Update WLAN element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ static void* capwap_80211_updatewlan_element_parsing(capwap_message_elements_han
|
|||||||
|
|
||||||
if (length != data->keylength) {
|
if (length != data->keylength) {
|
||||||
capwap_80211_updatewlan_element_free((void*)data);
|
capwap_80211_updatewlan_element_free((void*)data);
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 Update WLAN element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Update WLAN element");
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (data->keylength > 0) {
|
} else if (data->keylength > 0) {
|
||||||
data->key = (uint8_t*)capwap_alloc(data->keylength);
|
data->key = (uint8_t*)capwap_alloc(data->keylength);
|
||||||
@ -104,9 +104,10 @@ static void* capwap_80211_updatewlan_element_parsing(capwap_message_elements_han
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_updatewlan_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_updatewlan_ops = {
|
||||||
.create_message_element = capwap_80211_updatewlan_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||||
.parsing_message_element = capwap_80211_updatewlan_element_parsing,
|
.create = capwap_80211_updatewlan_element_create,
|
||||||
.clone_message_element = capwap_80211_updatewlan_element_clone,
|
.parse = capwap_80211_updatewlan_element_parsing,
|
||||||
.free_message_element = capwap_80211_updatewlan_element_free
|
.clone = capwap_80211_updatewlan_element_clone,
|
||||||
|
.free = capwap_80211_updatewlan_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_UPDATE_WLAN_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_UPDATE_WLAN_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_UPDATE_WLAN_HEADER__
|
#define __CAPWAP_ELEMENT_80211_UPDATE_WLAN_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_UPDATE_WLAN 1044
|
#define CAPWAP_ELEMENT_80211_UPDATE_WLAN_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_UPDATE_WLAN_TYPE 1044
|
||||||
|
#define CAPWAP_ELEMENT_80211_UPDATE_WLAN (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_UPDATE_WLAN_VENDOR, .type = CAPWAP_ELEMENT_80211_UPDATE_WLAN_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_UPDATE_WLAN_CAPABILITY_ESS 0x8000
|
#define CAPWAP_UPDATE_WLAN_CAPABILITY_ESS 0x8000
|
||||||
#define CAPWAP_UPDATE_WLAN_CAPABILITY_IBSS 0x4000
|
#define CAPWAP_UPDATE_WLAN_CAPABILITY_IBSS 0x4000
|
||||||
@ -34,6 +37,6 @@ struct capwap_80211_updatewlan_element {
|
|||||||
uint8_t* key;
|
uint8_t* key;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_updatewlan_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_updatewlan_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_UPDATE_WLAN_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_UPDATE_WLAN_HEADER__ */
|
||||||
|
@ -51,7 +51,7 @@ static void* capwap_80211_wtpqos_element_parsing(capwap_message_elements_handle
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 34) {
|
if (func->read_ready(handle) != 34) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 WTP QoS element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 WTP QoS element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +91,10 @@ static void capwap_80211_wtpqos_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops = {
|
||||||
.create_message_element = capwap_80211_wtpqos_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_wtpqos_element_parsing,
|
.create = capwap_80211_wtpqos_element_create,
|
||||||
.clone_message_element = capwap_80211_wtpqos_element_clone,
|
.parse = capwap_80211_wtpqos_element_parsing,
|
||||||
.free_message_element = capwap_80211_wtpqos_element_free
|
.clone = capwap_80211_wtpqos_element_clone,
|
||||||
|
.free = capwap_80211_wtpqos_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_WTP_QOS_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_WTP_QOS_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_WTP_QOS_HEADER__
|
#define __CAPWAP_ELEMENT_80211_WTP_QOS_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_WTP_QOS 1045
|
#define CAPWAP_ELEMENT_80211_WTP_QOS_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_WTP_QOS_TYPE 1045
|
||||||
|
#define CAPWAP_ELEMENT_80211_WTP_QOS (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_WTP_QOS_VENDOR, .type = CAPWAP_ELEMENT_80211_WTP_QOS_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_WTP_QOS_SUBELEMENT_VOICE 0
|
#define CAPWAP_WTP_QOS_SUBELEMENT_VOICE 0
|
||||||
#define CAPWAP_WTP_QOS_SUBELEMENT_VIDEO 1
|
#define CAPWAP_WTP_QOS_SUBELEMENT_VIDEO 1
|
||||||
@ -29,6 +32,6 @@ struct capwap_80211_wtpqos_element {
|
|||||||
struct capwap_80211_wtpqos_subelement qos[CAPWAP_WTP_QOS_SUBELEMENTS];
|
struct capwap_80211_wtpqos_subelement qos[CAPWAP_WTP_QOS_SUBELEMENTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_WTP_QOS_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_WTP_QOS_HEADER__ */
|
||||||
|
@ -44,7 +44,7 @@ static void* capwap_80211_wtpradioconf_element_parsing(capwap_message_elements_h
|
|||||||
ASSERT(func != NULL);
|
ASSERT(func != NULL);
|
||||||
|
|
||||||
if (func->read_ready(handle) != 16) {
|
if (func->read_ready(handle) != 16) {
|
||||||
capwap_logging_debug("Invalid IEEE 802.11 WTP WLAN Radio Configuration element");
|
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 WTP WLAN Radio Configuration element");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,9 +79,10 @@ static void capwap_80211_wtpradioconf_element_free(void* data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops = {
|
const struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops = {
|
||||||
.create_message_element = capwap_80211_wtpradioconf_element_create,
|
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
|
||||||
.parsing_message_element = capwap_80211_wtpradioconf_element_parsing,
|
.create = capwap_80211_wtpradioconf_element_create,
|
||||||
.clone_message_element = capwap_80211_wtpradioconf_element_clone,
|
.parse = capwap_80211_wtpradioconf_element_parsing,
|
||||||
.free_message_element = capwap_80211_wtpradioconf_element_free
|
.clone = capwap_80211_wtpradioconf_element_clone,
|
||||||
|
.free = capwap_80211_wtpradioconf_element_free
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_HEADER__
|
#ifndef __CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_HEADER__
|
||||||
#define __CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_HEADER__
|
#define __CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_HEADER__
|
||||||
|
|
||||||
#define CAPWAP_ELEMENT_80211_WTP_RADIO_CONF 1046
|
#define CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_VENDOR 0
|
||||||
|
#define CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_TYPE 1046
|
||||||
|
#define CAPWAP_ELEMENT_80211_WTP_RADIO_CONF (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_VENDOR, .type = CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_TYPE }
|
||||||
|
|
||||||
|
|
||||||
#define CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH 4
|
#define CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH 4
|
||||||
|
|
||||||
@ -18,6 +21,6 @@ struct capwap_80211_wtpradioconf_element {
|
|||||||
uint8_t country[CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH];
|
uint8_t country[CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops;
|
extern const struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops;
|
||||||
|
|
||||||
#endif /* __CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_HEADER__ */
|
#endif /* __CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_HEADER__ */
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user