92 Commits

Author SHA1 Message Date
76cd5d7484 release 1.3.2 2016-08-15 15:39:06 +02:00
a488af66cf add vendor VSA to set additional key and IGTK support
IGTK == Management Frame Protection
2016-08-15 15:30:29 +02:00
ac135e16c4 add VSA to report supported ciphers per radio 2016-08-12 12:08:06 +02:00
6f7c26d0af release 1.3.1 2016-08-11 16:03:57 +02:00
fdf256553c [mac80211] remove obsolete debugging output 2016-08-11 16:00:41 +02:00
ecf7a24eac [wtp-kmod] replace some printk based tracing with ftrace events 2016-08-11 15:43:19 +02:00
57bcb0e183 fix hw queue selection for 802.11 raw frame injection
Update mac80211 support patch:
 * remove obsolte monitor sdata handling (we don't use
   a monitor interface, so accessing that data is a bug)
 * initialize the skb queue mapping to match the tid,
   at least ath9k does not like it when the tid and
   queue mapping disagree
2016-08-11 12:35:11 +02:00
9fbf441896 release 1.3.0 2016-08-08 09:28:18 +02:00
01919fffd9 update support for group key updates with Update WLAN 2016-08-08 09:25:01 +02:00
02e8d534b5 preserve QoS tid for injected QoS data frames
The TX path will overwrite the TID based on the SKB
priority. Load the QoS TID from 802.11 frames into
the skb priority to preserve it during TX handling.
2016-08-02 15:46:07 +02:00
3626927722 reset timeout_action on assoc response frame
Assoziation is complete when we get a response frame. We need to
reset the timeout action here, otherwise the client gets detached
as soon as the timer fires.
2016-08-01 18:14:00 +02:00
2ac3944e7a implement WPA2 Stations Key handling
Implement the required support for extrace the cipher
suite settings from the the RS Information Element and
set the station key based on the 802.11 Station Key
CAPWAP message element.

Group Key update handling is currently not implemented nor is
Station Key update handling.
2016-07-27 12:36:34 +02:00
a131e17a6e fix 802.11 Station Key IE handling
memsetting the data to zero right after assigning them
is obviously wrong
2016-07-27 12:17:00 +02:00
0e19b53e28 forward PAE (IEEE 802.1X Authentication) frames as raw 802.11 frames to AC 2016-05-10 17:07:46 +02:00
9ded0bb87b release 1.2.1 2016-05-06 17:58:27 +02:00
b0aaaa4436 replace memcmp on message id struct with direct compare
cset 3761122c fixed one place, but a few others remained.
This should take care of them all and fix a missing
IE in Add WLAN responses.
2016-05-06 17:52:39 +02:00
6024cc15cf fix interpretation of Add WLAN's capability field
RFC 5416 copies the order of the capability flags from the
IEEE 802.11 capability IE. However, the bit ordering assumtions
in RFC 5416 differ from IEEE 802.11 (in the RFC the MSB is
numbered 0, in IEEE 802.11 the MSB is numbere 15).

RFC 5416 therefore specifies the capability flags bit reversed
compared to IEEE 802.11.
2016-05-03 10:28:38 +02:00
d51873dd4b adjust OpenWRT package for v1.2.0 and OpenWRT HEAD 2016-04-29 09:04:52 +02:00
480f5d8782 update README and NEWS for 1.2.0 release 2016-04-29 08:58:26 +02:00
651ccc0d33 rework debug output to be more helpful for radio config failures 2016-04-29 08:32:49 +02:00
baf1ccbc73 add Vendor TP WTP Timestamp to Echo Request 2016-04-08 15:18:53 +02:00
4f3fe0c339 fix error-condition for invalid WLAN ID 2016-04-08 13:16:19 +02:00
813f24b8ac implement station inactivity timeout
After the max station inactivity has expired, a probe request
(a data null frame) is sent to the station. It the station does
not ACK this frame, it is removed from the WTP.

Note: inactivity timeout is not the same as the CAPWAP Idle Timeout.
The CAPWAP Idle Timeout would remove a station due to inactivity
even when it is still reachable from the WTP. In contrast, the
inactivity timeout probes whether the station is still present
and only removes it when not.
2016-04-07 15:15:50 +02:00
bca5c91ae1 fix spelling of Deauthentication 2016-04-07 14:41:39 +02:00
619c40d5be move nlmsg_free into nl send_and_recv
Simplify resource cleanup and return handling for all
callers of nl send_and_recv.
2016-04-07 11:54:07 +02:00
7b4e386057 add nl80211_wlan_send_and_recv_msg helper 2016-04-07 11:31:11 +02:00
5195ea9e37 rework nl80211_wlan_event in preparation of more events to handle 2016-04-07 11:31:11 +02:00
8f03ecca9b add support functions to handle station inactivity
Detect support for AP side inactivity timer and reading
to the inactivity time for a station.
2016-04-07 11:31:11 +02:00
4b1caad54b consolidate nl msg generation into helper and add more error handling to it 2016-04-07 11:31:04 +02:00
c19da7ffb8 move access to device ops into wrappers 2016-04-06 14:39:20 +02:00
9096bff7a5 coding style updates in wifi_drivers 2016-04-06 14:13:33 +02:00
c132036914 use MACSTR and MAC2STR where appropriate
Replace capwap_printf_macaddress with MACSTR and MAC2STR
macro for all EUI48 MAC addresses. Save a text buffer in
the station structure and some buffers in functions.
2016-04-06 12:57:56 +02:00
f3fb11ac81 rework wifi device capability detection
get rid of deep indention, split into functions, no
functional changes.
2016-04-05 16:22:15 +02:00
f7e3ba846f rework station reuse in deauth logic to make it clearer
The hidden station clean logic in wifi_wlan_deauthentication_station
obfuscated the station object reuse in the only caller that actually
used it.
2016-04-05 13:19:58 +02:00
146939a716 delete station from kmod before reusing it
The AC is supposed to react to WiFi Authorization requests
with Add Station messages. Such an Add Station will fail
with the station is already present in the data path.

A Authorization request for a station that the WTP already
in authorized state means that the station lost its assoziation
without the WTP detecting that. So, clearing it from the data
path seems to be appropriate.
2016-04-05 13:06:00 +02:00
bb684e92ea stop timeout when authorization completes 2016-04-05 13:05:43 +02:00
934c7ea64d Don't reply to Probe Requests on an adjacent channel 2016-04-05 10:09:41 +02:00
ca010916ae bump versionin configure.ac -> 1.2 2016-04-04 17:12:48 +02:00
ca74624d96 don't respond to probe requests with wildcard SSID's when running a hidden ssid
A hidden ssid should not be reveal to probe request wirh wildcard SSId'.
Only probe request for our hidden ssid should be answered.
2016-04-04 08:26:33 +02:00
5d69226ace Merge pull request #6 from nm-mrt/invalid-compare-of-struct-variable
Bugfix for memcmp of struct failing on PPC hardware
2016-03-31 16:46:30 +02:00
3761122c83 Bugfix for memcmp of struct failing on PPC hardware 2016-03-31 15:54:27 +02:00
62af47a2f6 Merge pull request #5 from nm-mrt/log-to-syslog
Log to syslog
2016-03-30 16:50:37 +02:00
537e00d5b5 Logging to syslog is standard in Linux environment and should be used. 2016-03-30 16:37:35 +02:00
29ed6544c5 switch everything to new log API and drop old one 2016-03-30 14:47:57 +02:00
dd6f6fcfe2 add format string atrribute to logging and fix all error found by it 2016-03-30 14:30:27 +02:00
cadbfa3d7e switch to more a syslog like logging style 2016-03-30 14:29:53 +02:00
9572de350a switch timeout processing to libev
Rework the timeout and network code to use libev.
2016-03-30 14:06:43 +02:00
a4cb96da7c save and restore errno in logging function
this makes it save to use logging functions in statements that
expect errno to be unchanged
2016-03-30 13:10:51 +02:00
84859e20c4 also clear the local control port when resetting the WTP state
Without reseting the port, the new control socket will be
bound to the same port as the old one.
2016-03-30 09:22:02 +02:00
622f148150 Wrong option for ./configure in README.md 2016-03-29 16:54:02 +02:00
32e9567f7b rework bssid handling and stop all used bssids when leaving RUN
Instead of haing a pool of unsused BSS Id's and a list of active
BSS's (wlans), use a single array and only mark the BSS Id as used
or unused.

When leaving RUN state, release (stop) all used BSS.
2016-03-29 15:28:40 +02:00
40a98c9075 move packet processing from main receive loop into function 2016-03-29 11:51:39 +02:00
a3c2e52d3c reset WTP state when going into DTLS TD 2016-03-29 11:51:39 +02:00
7eddb74767 rework overly deep if statement in wtp_dfa_run 2016-03-29 11:51:39 +02:00
73afba9a6d rework overly deep if statement in wtp_dfa_state_join 2016-03-29 11:51:39 +02:00
0842a2c6f5 rework error path in dfa dtls 2016-03-29 11:51:39 +02:00
43dde134b7 simplify if statement in wtp_dfa_state_discovery 2016-03-29 11:51:39 +02:00
4117ab1f71 move discovery request generation into function 2016-03-29 11:51:39 +02:00
e6d1472824 simplify if statement in wtp_dfa_state_datacheck 2016-03-29 11:48:28 +02:00
1091aa0830 simplify if statement in wtp_dfa_state_configure 2016-03-29 11:48:28 +02:00
f85928e0b0 rework error exits path to simplify if statement 2016-03-29 11:48:28 +02:00
e92c257ac4 move deep if statement in wtp_send_configure into function 2016-03-29 11:48:28 +02:00
13ef6c0d62 rework deep indented if statement in wtp_dfa_retransmition_timeout 2016-03-29 11:48:28 +02:00
258c8ff750 rework overly deep if statement in wtp_dfa_running 2016-03-29 11:48:28 +02:00
de9b54e8b1 reindent wtp_dfa_execute 2016-03-29 11:48:28 +02:00
26415cae34 [wtp] remove curly brackets from single line if statements 2016-03-29 11:48:28 +02:00
067f920d81 reformat some overly long code lines 2016-03-29 11:48:28 +02:00
ad27e80521 Merge pull request #2 from nm-mrt/dns-support
Handle no DNS at system start
2016-03-25 13:16:20 +01:00
f9bb716dac Changed name of addr_capwap.socket to addr_capwap.sockaddr
Changed FQDN size from 128 to 256 according to RFC1035
2016-03-25 12:41:43 +01:00
f0a7b848f4 whitespace fix 2016-03-24 17:15:12 +01:00
ea87da11ba [wtp] use goto error exit instead of deep nested if conditions
Convert WTP main() function to linux kernel style goto error exits.
2016-03-24 17:15:12 +01:00
3b7c0adda7 [wtp] move overly deep indented wtp descriptor config parser into function 2016-03-24 17:15:12 +01:00
aa5af8056b [wtp] move overly deep indented config parser into function 2016-03-24 17:15:12 +01:00
fbe31bda21 rename variable to avoid potential type clash 2016-03-24 17:15:12 +01:00
8e0b88cc4e [wtp] update config for 802.11n support 2016-03-24 17:15:12 +01:00
7293ce43da [ac] drop old libjson compatibility
json-c >= 0.11 is required now
2016-03-24 17:15:12 +01:00
64012e792c update README, 802.11n is supported now 2016-03-24 17:15:12 +01:00
94e232abe4 build without AC by default 2016-03-24 17:15:12 +01:00
afd76e003d fix non-debug builds 2016-03-24 17:15:12 +01:00
40071fb06d fix AC compilation 2016-03-24 17:15:12 +01:00
e8241b2d3f fix libnl-genl detection for libnl3 2016-03-24 17:15:12 +01:00
29295d1434 [ac] rename last remaining CyaSSL refrence to wolfSSL 2016-03-24 17:15:12 +01:00
2109c62b80 implement basic 802.11n support
Add suport to enable 80211n support on the BSS and set
station parameters through the "Add Station" procedure.

Setting 802.11n radio parameters is rudementary and does
not work yet.
2016-03-24 17:15:11 +01:00
e3a977e40a [wtp] rework wtp_radio_setconfiguration
no functional changes, only code shuffeling:
* move 802.11 IE handling into function
* rework deep if conditions to be simple
* reformat
2016-03-24 17:15:11 +01:00
730f110a25 [wtp] implement vendor specific elements 2016-03-24 17:15:11 +01:00
7b9f515bd7 If there is no DNS available on system start the capwap-wtp will stop while evaluating the configuration. I fixed that by checking if the address was yet translated on every address access. If not a DNS request is started before continuing. 2016-03-24 07:09:29 +01:00
471d1058c4 [wtp] prepare message elements for vendor element handling
convert message element type into a struct{ vendor, type }.
Vendor will be 0 for all RFC types.
2016-03-08 10:21:51 +01:00
140be9b143 simplify element list handling
Doing all the work to create a list element only to fail when we can
not decode the element is a waste of effort.
Decode the element first and only on success handle the list operations.
2016-03-07 18:25:49 +01:00
38f7681608 constify capwap_message_elements_ops 2016-03-07 18:25:49 +01:00
627a38a556 move the category setting into the element ops
this prepares the element ops for decoding vendor
ies into seperate types.

It also makes sense to keep all information about a IE
in one place.
2016-03-07 18:09:13 +01:00
1436fc9e5f rename overly verbose capwap_message_elements_ops
The struct is already conveys the scope of the operations,
repeating it in the name of ops again is redundant and
bloats the resulting source code.

Rename the opt to shorter versions.
2016-03-07 17:12:48 +01:00
78a8a75c6b start 802.11n 2016-03-07 16:23:49 +01:00
251 changed files with 8572 additions and 4888 deletions

35
NEWS.md Normal file
View File

@ -0,0 +1,35 @@
SmartCAPWAP
===========
CAPWAP WTP and AC implementation
Version 1.3.2 - 15 Aug 2016
---------------------------
* support management frame protection
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

View File

@ -6,22 +6,29 @@ This fork is currently focusing on the WTP side only.
## 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:
* 802.11b
* 802.11g
* 802.11a
* WMM/WME (mostly)
* Local MAC
* 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
ath9k cards (in particular Qualcomm Atheros AR5418) have
been tested.
Only cards with cfg80211 netlink API are supported. The following devices
have been tested:
* Atheros AR9280 (Compex WLE200NX)
* Mediatek MT7602E, MT7612E (ZBT WG2626, ALL-WR1200AC_WRT)
### Planned WTP features:
* 802.11n ([draft-ietf-opsawg-capwap-extension-06](https://tools.ietf.org/html/draft-ietf-opsawg-capwap-extension-06))
* encryption (WPA2)
* WPA2 Enterprise
* 802.11r - BSS fast transition
* Hybrid-MAC ([RFC-7494](https://tools.ietf.org/html/rfc7494))
## INSTALLATION
@ -37,10 +44,12 @@ NOTE: To run WTP you must have a wireless card that has Linux driver based on th
* libconfig-dev
* libjson0-dev
* libnl-dev
* libev-dev
* libtool
* libxml2-dev
* wolfssl 3.8 or newer
### Build
WolfSSL:
@ -56,6 +65,30 @@ WolfSSL:
SmartCAPWAP:
autoreconf -f -i
./configure --without-ac
./configure --disable-ac
make
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

View File

@ -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_wtpradioconf.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
capwap_SOURCES += $(top_srcdir)/src/common/capwap_debug.c

View File

@ -23,6 +23,7 @@ bin_PROGRAMS = wtp
AM_CFLAGS = -D_REENTRANT \
-D_GNU_SOURCE \
-fno-strict-aliasing \
${LIBNL_CFLAGS}
if DTLS_ENABLED

View File

@ -49,6 +49,7 @@ application: {
timer: {
statistics = 120;
inactivity = 300;
};
dtls: {
@ -149,6 +150,17 @@ application: {
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;
};
}
);

View File

@ -19,7 +19,7 @@
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_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.11 -Wall])
@ -60,12 +60,8 @@ AC_ARG_ENABLE(
[enable_logging="yes"]
)
AC_ARG_ENABLE(
[ac],
[AS_HELP_STRING([--disable-ac], [disable ac support])],
,
[enable_ac="yes"]
)
AC_ARG_ENABLE([ac],
[AS_HELP_STRING([--enable-ac], [enable ac support])])
AC_ARG_ENABLE(
[wtp],
@ -178,6 +174,7 @@ AC_DEFINE_UNQUOTED([LIBCONFIG_LOOKUP_INT_ARG], [$LIBCONFIG_LOOKUP_INT_ARG], [con
# Check PTHREAD library
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([ev], [ev_run],, [AC_MSG_ERROR(Required library ev missing)])
# Check SSL library
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],
[json-c >= 0.11],
[],
[PKG_CHECK_MODULES(
[LIBJSON],
[json >= 0.9],
[],
[AC_MSG_ERROR(You need the libjson)]
)]
)
# Check XML2 library
@ -208,7 +200,7 @@ fi
# Check Netlink library
PKG_CHECK_MODULES(
[LIBNL3],
[libnl-3.0 >= 3.1],
[libnl-3.0 >= 3.1 libnl-genl-3.0 >= 3.1],
[have_libnl3=yes],
[PKG_CHECK_MODULES(
[LIBNL],

View File

@ -9,10 +9,21 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=smartcapwap
PKG_VERSION:=1.0
PKG_VERSION:=1.3.2
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.3.2
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
@ -29,18 +40,25 @@ define Package/smartcapwap
CATEGORY:=Network
TITLE:=SmartCAPWAP WTP
MAINTAINER:=Massimo Vellucci <vemax78@gmail.com>
DEPENDS:=+libnl-tiny +libconfig +libwolfssl +kmod-smartcapwap
DEPENDS:=+libnl +libev +libconfig +libcyassl +kmod-smartcapwap
endef
define Package/smartcapwap/description
This package contains the SmartCAPWAP WTP daemon.
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
SUBMENU:=Network Support
TITLE:=SmartCAPWAP Data Channel Module
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
AUTOLOAD:=$(call AutoLoad,70,smartcapwap)
endef
@ -49,8 +67,7 @@ define KernelPackage/smartcapwap/description
This package contains the SmartCAPWAP Data Transport kernel module.
endef
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny
SRC_SMARTCAPWAP := /mnt/hgfs/shared/smartcapwap
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/libnl3
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)

View File

@ -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>
Date: Thu, 4 Feb 2016 15:57:11 +0100
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 ++++
net/mac80211/ieee80211_i.h | 6 +
net/mac80211/iface.c | 56 +++++++++
net/mac80211/rx.c | 81 ++++++++++--
net/mac80211/tx.c | 306 +++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 462 insertions(+), 12 deletions(-)
net/mac80211/rx.c | 81 +++++++++++--
net/mac80211/tx.c | 279 +++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 435 insertions(+), 12 deletions(-)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 760bc4d..6722da6 100644
@ -334,10 +334,10 @@ index 82af407..29cc59b 100644
rcu_read_unlock();
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
+++ 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;
}
@ -353,8 +353,9 @@ index bdc224d..3769c33 100644
+ struct ieee80211_chanctx_conf *chanctx_conf;
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ 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;
+ int tid;
+ int hdrlen;
+
+ /* check for not even having the fixed 802.11 header */
@ -367,13 +368,13 @@ index bdc224d..3769c33 100644
+ if (unlikely(skb->len < hdrlen))
+ 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
+ * don't have any better information and at this point, nobody cares
+ */
+ skb_reset_network_header(skb);
+ skb_reset_transport_header(skb);
+ skb_set_network_header(skb, hdrlen);
+ skb_set_transport_header(skb, hdrlen);
+
+ /*
+ * Initialize skb->protocol if the injected frame is a data frame
@ -388,12 +389,17 @@ index bdc224d..3769c33 100644
+ 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 |
+ IEEE80211_TX_CTL_INJECTED;
+
+
+ /*
+ * we might have set these flags later.....
+ * info->flags &= ~IEEE80211_TX_INTFL_DONT_ENCRYPT;
@ -405,46 +411,17 @@ index bdc224d..3769c33 100644
+ sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+
+ chanctx_conf = rcu_dereference(sdata->vif.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
+ if (!chanctx_conf)
+ goto fail_rcu;
+
+ /*
+ * Frame injection is not allowed if beaconing is not allowed
+ * or if we need radar detection. Beaconing is usually not allowed when
+ * 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 = chanctx_conf->def.chan->band;
+
+ ieee80211_tx_stats(dev, skb->len);
+
+ info->band = chandef->chan->band;
+ ieee80211_xmit(sdata, NULL, skb);
+ rcu_read_unlock();
+
+ return;
+
+fail_rcu:
+ rcu_read_unlock();
+fail:
@ -461,10 +438,6 @@ index bdc224d..3769c33 100644
+netdev_tx_t ieee80211_capwap_subif_start_xmit(struct sk_buff *skb,
+ 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)) {
+ __ieee80211_capwap_inject_start_xmit(skb, dev);
+ } else
@ -476,7 +449,7 @@ index bdc224d..3769c33 100644
struct sk_buff *
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
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);
local_bh_enable();
}
@ -655,5 +628,5 @@ index bdc224d..3769c33 100644
+EXPORT_SYMBOL(ieee80211_inject_xmit);
+
--
2.7.0
2.8.1

View File

@ -214,22 +214,22 @@ static int ac_parsing_configuration_1_0(config_t* config) {
/* Logging configuration */
if (config_lookup_bool(config, "logging.enable", &configBool) == CONFIG_TRUE) {
if (!configBool) {
capwap_logging_verboselevel(CAPWAP_LOGGING_NONE);
capwap_logging_verboselevel(LOG_NONE);
capwap_logging_disable_allinterface();
} else {
if (config_lookup_string(config, "logging.level", &configString) == CONFIG_TRUE) {
if (!strcmp(configString, "fatal")) {
capwap_logging_verboselevel(CAPWAP_LOGGING_FATAL);
capwap_logging_verboselevel(LOG_EMERG);
} else if (!strcmp(configString, "error")) {
capwap_logging_verboselevel(CAPWAP_LOGGING_ERROR);
capwap_logging_verboselevel(LOG_ERR);
} else if (!strcmp(configString, "warning")) {
capwap_logging_verboselevel(CAPWAP_LOGGING_WARNING);
capwap_logging_verboselevel(LOG_WARNING);
} else if (!strcmp(configString, "info")) {
capwap_logging_verboselevel(CAPWAP_LOGGING_INFO);
capwap_logging_verboselevel(LOG_INFO);
} else if (!strcmp(configString, "debug")) {
capwap_logging_verboselevel(CAPWAP_LOGGING_DEBUG);
capwap_logging_verboselevel(LOG_DEBUG);
} else {
capwap_logging_error("Invalid configuration file, unknown logging.level value");
log_printf(LOG_ERR, "Invalid configuration file, unknown logging.level value");
return 0;
}
}
@ -251,7 +251,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
} else if (!strcmp(configString, "stderr")) {
capwap_logging_enable_console(1);
} else {
capwap_logging_error("Invalid configuration file, unknown logging.output value");
log_printf(LOG_ERR, "Invalid configuration file, unknown logging.output value");
return 0;
}
}
@ -268,7 +268,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
/* Set name of AC */
if (config_lookup_string(config, "application.name", &configString) == CONFIG_TRUE) {
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;
}
@ -291,7 +291,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
} else if (!strcmp(bindingName, "EPCGlobal")) {
*binding = CAPWAP_WIRELESS_BINDING_EPCGLOBAL;
} else {
capwap_logging_error("Invalid configuration file, unknown application.binding value");
log_printf(LOG_ERR, "Invalid configuration file, unknown application.binding value");
return 0;
}
}
@ -303,7 +303,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
if ((configInt > 0) && (configInt < 65536)) {
g_ac.descriptor.stationlimit = (unsigned short)configInt;
} 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;
}
}
@ -313,7 +313,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
if ((configInt > 0) && (configInt < 65536)) {
g_ac.descriptor.maxwtp = (unsigned short)configInt;
} 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;
}
}
@ -379,7 +379,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
} else if (!strcmp(configType, "software")) {
type = CAPWAP_ACDESC_SUBELEMENT_SOFTWAREVERSION;
} 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;
}
@ -392,19 +392,19 @@ static int ac_parsing_configuration_1_0(config_t* config) {
strcpy((char*)desc->data, configValue);
desc->data[desc->length] = 0;
} 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;
}
} 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;
}
} 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;
}
} 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;
}
}
@ -418,7 +418,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
} else if (!strcmp(configString, "limited")) {
g_ac.dfa.ecn.flag = CAPWAP_LIMITED_ECN_SUPPORT;
} else {
capwap_logging_error("Invalid configuration file, unknown application.ecn value");
log_printf(LOG_ERR, "Invalid configuration file, unknown application.ecn value");
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)) {
g_ac.dfa.timers.discovery = (unsigned char)(configInt / 1000);
} 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;
}
}
@ -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)) {
g_ac.dfa.timers.echorequest = (unsigned char)(configInt / 1000);
} 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;
}
}
@ -448,7 +448,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
if ((configInt > 0) && (configInt < 65536)) {
g_ac.dfa.decrypterrorreport_interval = (unsigned short)configInt;
} 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;
}
}
@ -457,7 +457,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
if (configInt > 0) {
g_ac.dfa.idletimeout.timeout = (unsigned long)configInt;
} 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;
}
}
@ -483,7 +483,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
} else if (!strcmp(configString, "presharedkey")) {
dtlsparam.mode = CAPWAP_DTLS_MODE_PRESHAREDKEY;
} 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;
}
}
@ -576,7 +576,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
/* Set interface binding of AC */
if (config_lookup_string(config, "application.network.binding", &configString) == CONFIG_TRUE) {
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;
}
@ -588,7 +588,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
if ((configInt > 0) && (configInt < 65536)) {
g_ac.mtu = (unsigned short)configInt;
} 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;
}
}
@ -600,7 +600,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
} else if (!strcmp(configString, "udplite")) {
g_ac.dfa.transport.type = CAPWAP_UDPLITE_TRANSPORT;
} 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;
}
}
@ -633,7 +633,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
/* */
server = ac_soapclient_create_server(configString);
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;
}
@ -647,7 +647,7 @@ static int ac_parsing_configuration_1_0(config_t* config) {
/* */
configSSL = config_setting_get_member(configServer, "x509");
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;
}
@ -673,11 +673,11 @@ static int ac_parsing_configuration_1_0(config_t* config) {
if (calist && certificate && privatekey) {
server->sslcontext = capwap_socket_crypto_createcontext(calist, certificate, privatekey);
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;
}
} 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;
}
@ -707,9 +707,9 @@ static int ac_parsing_configuration(config_t* 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 {
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;
@ -738,7 +738,7 @@ static int ac_load_configuration(int argc, char** argv) {
if (strlen(optarg) < sizeof(g_configurationfile)) {
strcpy(g_configurationfile, optarg);
} else {
capwap_logging_error("Invalid -%c argument", optopt);
log_printf(LOG_ERR, "Invalid -%c argument", optopt);
return -1;
}
@ -747,9 +747,9 @@ static int ac_load_configuration(int argc, char** argv) {
case '?': {
if (optopt == 'c') {
capwap_logging_error("Option -%c requires an argument", optopt);
log_printf(LOG_ERR, "Option -%c requires an argument", optopt);
} else {
capwap_logging_error("Unknown option character `\\x%x'", optopt);
log_printf(LOG_ERR, "Unknown option character `\\x%x'", optopt);
}
ac_print_usage();
@ -766,7 +766,7 @@ static int ac_load_configuration(int argc, char** argv) {
result = ac_parsing_configuration(&config);
} else {
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 */
@ -778,7 +778,7 @@ static int ac_load_configuration(int argc, char** argv) {
static int ac_configure(void) {
/* Bind control channel to any address */
if (capwap_bind_sockets(&g_ac.net)) {
capwap_logging_fatal("Cannot bind address");
log_printf(LOG_EMERG, "Cannot bind address");
return AC_ERROR_NETWORK;
}
@ -821,7 +821,7 @@ int main(int argc, char** argv) {
/* Init capwap */
if (geteuid() != 0) {
capwap_logging_fatal("Request root privileges");
log_printf(LOG_EMERG, "Request root privileges");
return CAPWAP_REQUEST_ROOT;
}
@ -830,7 +830,7 @@ int main(int argc, char** argv) {
/* Init crypt */
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;
}
@ -852,7 +852,7 @@ int main(int argc, char** argv) {
/* Console logging is disabled in daemon mode */
capwap_logging_disable_console();
capwap_logging_info("Running AC in daemon mode");
log_printf(LOG_INFO, "Running AC in daemon mode");
}
/* Complete configuration AC */
@ -862,18 +862,18 @@ int main(int argc, char** argv) {
if (!ac_kmod_init()) {
/* Bind data channel */
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 */
result = ac_execute();
} else {
capwap_logging_fatal("Unable to create kernel data channel");
log_printf(LOG_EMERG, "Unable to create kernel data channel");
}
/* Disconnect kernel module */
ac_kmod_free();
} else {
capwap_logging_fatal("Unable to connect to kernel module");
log_printf(LOG_EMERG, "Unable to connect to kernel module");
}
/* Close connection */

View File

@ -14,7 +14,7 @@
#include <pthread.h>
#include <linux/if_ether.h>
#include <json/json.h>
#include <json-c/json.h>
#include <ac_kmod.h>

View File

@ -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;
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 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;
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 NULL;
}
@ -74,111 +77,113 @@ void ac_json_ieee80211_free(struct ac_json_ieee80211_wtpradio* wtpradio) {
if (item->valid) {
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) {
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) {
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) {
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) {
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) {
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++) {
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);
}
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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;
ASSERT(wtpradio != NULL);
ASSERT(IS_80211_MESSAGE_ELEMENTS(type));
ASSERT(IS_80211_MESSAGE_ELEMENTS(id));
ASSERT(data != NULL);
/* */
ops = ac_json_80211_getops_by_capwaptype(type);
if (!ops) {
ops = ac_json_80211_getops_by_capwaptype(id);
if (!ops)
return 0;
}
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(messageelement != NULL);
ASSERT(IS_80211_MESSAGE_ELEMENTS(messageelement->type));
ASSERT(IS_80211_MESSAGE_ELEMENTS(messageelement->id));
if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->type, messageelement->data, 0)) {
switch (messageelement->category) {
case CAPWAP_MESSAGE_ELEMENT_SINGLE:
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->id,
messageelement->data, 0))
return 0;
}
} else if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
struct capwap_array* items = (struct capwap_array*)messageelement->data;
break;
for (i = 0; i < items->count; i++) {
if (!ac_json_ieee80211_addmessageelement(wtpradio, messageelement->type, *(void**)capwap_array_get_item_pointer(items, i), 0)) {
case CAPWAP_MESSAGE_ELEMENT_ARRAY: {
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;
break;
}
}
} else {
default:
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) {
struct ac_json_ieee80211_ops* ops = ac_json_80211_getops_by_jsontype((char*)entry->k); /* Retrieve JSON handler */
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) {
/* Message element complete */
ac_json_ieee80211_addmessageelement(wtpradio, ops->type, data, 1);
/* Free resource */
capwap_get_message_element_ops(ops->type)->free_message_element(data);
capwap_get_message_element_ops(ops->type)->free(data);
}
}
}

View File

@ -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) {
struct capwap_80211_addwlan_element* addwlan = (struct capwap_80211_addwlan_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->addwlan);
ops->free(item->addwlan);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_ADD_WLAN,
.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,
.create_json = ac_json_80211_addwlan_createjson
};

View File

@ -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) {
struct capwap_80211_antenna_element* antenna = (struct capwap_80211_antenna_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->antenna);
ops->free(item->antenna);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_ANTENNA,
.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,
.create_json = ac_json_80211_antenna_createjson
};

View File

@ -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) {
struct capwap_80211_assignbssid_element* assignbssid = (struct capwap_80211_assignbssid_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->assignbssid);
ops->free(item->assignbssid);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_ASSIGN_BSSID,
.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,
.create_json = ac_json_80211_assignbssid_createjson
};

View File

@ -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) {
struct capwap_80211_deletewlan_element* deletewlan = (struct capwap_80211_deletewlan_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->deletewlan);
ops->free(item->deletewlan);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_DELETE_WLAN,
.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,
.create_json = ac_json_80211_deletewlan_createjson
};

View File

@ -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) {
struct capwap_80211_directsequencecontrol_element* directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->directsequencecontrol);
ops->free(item->directsequencecontrol);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL,
.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,
.create_json = ac_json_80211_directsequencecontrol_createjson
};

View File

@ -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* ie = (struct capwap_80211_ie_element*)data;
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) {
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;
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_IE,
.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,
.create_json = ac_json_80211_ie_createjson
};

View File

@ -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) {
struct capwap_80211_macoperation_element* macoperation = (struct capwap_80211_macoperation_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->macoperation);
ops->free(item->macoperation);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_MACOPERATION,
.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,
.create_json = ac_json_80211_macoperation_createjson
};

View File

@ -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) {
struct capwap_80211_miccountermeasures_element* miccountermeasures = (struct capwap_80211_miccountermeasures_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->miccountermeasures);
ops->free(item->miccountermeasures);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES,
.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,
.create_json = ac_json_80211_miccountermeasures_createjson
};

View File

@ -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) {
struct capwap_80211_multidomaincapability_element* multidomaincapability = (struct capwap_80211_multidomaincapability_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->multidomaincapability);
ops->free(item->multidomaincapability);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY,
.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,
.create_json = ac_json_80211_multidomaincapability_createjson
};

View File

@ -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) {
struct capwap_80211_ofdmcontrol_element* ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->ofdmcontrol);
ops->free(item->ofdmcontrol);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_OFDMCONTROL,
.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,
.create_json = ac_json_80211_ofdmcontrol_createjson
};

View File

@ -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) {
struct capwap_80211_rateset_element* rateset = (struct capwap_80211_rateset_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->rateset);
ops->free(item->rateset);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_RATESET,
.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,
.create_json = ac_json_80211_rateset_createjson
};

View File

@ -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) {
struct capwap_80211_rsnaerrorreport_element* rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->rsnaerrorreport);
ops->free(item->rsnaerrorreport);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT,
.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,
.create_json = ac_json_80211_rsnaerrorreport_createjson
};

View File

@ -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) {
struct capwap_80211_statistics_element* statistics = (struct capwap_80211_statistics_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->statistics);
ops->free(item->statistics);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_STATISTICS,
.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,
.create_json = ac_json_80211_statistics_createjson
};

View File

@ -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) {
struct capwap_80211_supportedrates_element* supportedrates = (struct capwap_80211_supportedrates_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->supportedrates);
ops->free(item->supportedrates);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_SUPPORTEDRATES,
.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,
.create_json = ac_json_80211_supportedrates_createjson
};

View File

@ -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) {
struct capwap_80211_txpower_element* txpower = (struct capwap_80211_txpower_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->txpower);
ops->free(item->txpower);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_TXPOWER,
.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,
.create_json = ac_json_80211_txpower_createjson
};

View File

@ -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) {
struct capwap_80211_txpowerlevel_element* txpowerlevel = (struct capwap_80211_txpowerlevel_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->txpowerlevel);
ops->free(item->txpowerlevel);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_TXPOWERLEVEL,
.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,
.create_json = ac_json_80211_txpowerlevel_createjson
};

View File

@ -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) {
struct capwap_80211_updatewlan_element* updatewlan = (struct capwap_80211_updatewlan_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->updatewlan);
ops->free(item->updatewlan);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_UPDATE_WLAN,
.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,
.create_json = ac_json_80211_updatewlan_createjson
};

View File

@ -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) {
struct capwap_80211_wtpqos_element* wtpqos = (struct capwap_80211_wtpqos_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->wtpqos);
ops->free(item->wtpqos);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_WTP_QOS,
.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,
.create_json = ac_json_80211_wtpqos_createjson
};

View File

@ -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) {
struct capwap_80211_wtpradioconf_element* wtpradioconf = (struct capwap_80211_wtpradioconf_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->wtpradioconf);
ops->free(item->wtpradioconf);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_WTP_RADIO_CONF,
.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,
.create_json = ac_json_80211_wtpradioconf_createjson
};

View File

@ -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) {
struct capwap_80211_wtpradiofailalarm_element* wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->wtpradiofailalarm);
ops->free(item->wtpradiofailalarm);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM,
.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,
.create_json = ac_json_80211_wtpradiofailalarm_createjson
};

View File

@ -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) {
struct capwap_80211_wtpradioinformation_element* wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)data;
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 (!overwrite) {
return 0;
}
ops->free_message_element(item->wtpradioinformation);
ops->free(item->wtpradioinformation);
}
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;
}
@ -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 = {
.type = CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION,
.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,
.create_json = ac_json_80211_wtpradioinformation_createjson
};

View File

@ -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*)&notify, sizeof(struct ac_session_notify_event_t));
/* 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);
/* */
@ -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*)&notify, sizeof(struct ac_session_notify_event_t));
/* 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);
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*)&notify, sizeof(struct ac_session_notify_event_t));
/* 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);
/* */
@ -506,7 +506,7 @@ static int ac_backend_soap_join(int forcereset) {
/* Retrieve AC configuration */
if (g_ac_backend.backendsessionid && forcereset) {
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);
g_ac_backend.backendsessionid = NULL;
}
@ -725,7 +725,7 @@ static void ac_backend_run(void) {
/* Connection error, change Backend Server */
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);
/* Lost session id */
@ -738,7 +738,7 @@ static void ac_backend_run(void) {
} else {
/* Join with a Backend Server */
if (!ac_backend_soap_join(forcereset)) {
capwap_logging_debug("Joined with Backend Server");
log_printf(LOG_DEBUG, "Joined with Backend Server");
/* Join Complete */
connected = 1;
@ -753,7 +753,7 @@ static void ac_backend_run(void) {
/* Wait timeout before continue */
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;
@ -792,9 +792,9 @@ static void ac_backend_run(void) {
/* */
static void* ac_backend_thread(void* param) {
capwap_logging_debug("Backend start");
log_printf(LOG_DEBUG, "Backend start");
ac_backend_run();
capwap_logging_debug("Backend stop");
log_printf(LOG_DEBUG, "Backend stop");
/* Thread exit */
pthread_exit(NULL);
@ -843,13 +843,13 @@ int ac_backend_start(void) {
/* */
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;
} 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;
} 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;
}
@ -861,7 +861,7 @@ int ac_backend_start(void) {
/* Create thread */
result = pthread_create(&g_ac_backend.threadid, NULL, ac_backend_thread, NULL);
if (result) {
capwap_logging_debug("Unable create backend thread");
log_printf(LOG_DEBUG, "Unable create backend thread");
return 0;
}

View File

@ -4,7 +4,7 @@
#include "ac_session.h"
#include "ac_json.h"
#include "ac_wlans.h"
#include <json/json.h>
#include <json-c/json.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;
/* 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)) {
json_object_put(jsonparam);
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 */
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
/* 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 */

View File

@ -3,7 +3,7 @@
#include "capwap_array.h"
#include "ac_session.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) {
@ -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;
/* 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)) {
json_object_put(jsonparam);
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 */
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
/* 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 */

View File

@ -4,7 +4,7 @@
#include "ac_session.h"
#include "ac_backend.h"
#include "ac_json.h"
#include <json/json.h>
#include <json-c/json.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;
/* 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)) {
json_object_put(jsonparam);
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;
}
} 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;
}
@ -606,7 +606,7 @@ void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet
char sessionname[33];
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;
}
@ -657,7 +657,7 @@ void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet
}
} else {
/* 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);
}
}

View File

@ -20,7 +20,7 @@ void ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packe
/* Check the success of the Request */
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
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);
}
/* */

View File

@ -58,14 +58,14 @@ static int receive_echo_request(struct ac_session_t* session, struct capwap_pars
{
char sessionname[33];
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
/* Send Configure response to WTP */
if (!capwap_crypt_sendto_fragmentpacket(&session->dtls, session->responsefragmentpacket)) {
/* 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;
@ -88,7 +88,7 @@ static void execute_ieee80211_wlan_configuration_addwlan(struct ac_session_t* se
/* Assign BSSID to session */
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);
/* 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);
}
} 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);
if (station) {
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;
@ -198,7 +199,8 @@ static void execute_ieee80211_station_configuration_response_deletestation(struc
/* */
station = ac_stations_get_station(session, deletestation->radioid, NULL, deletestation->address);
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);
@ -258,7 +260,7 @@ void ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet*
{
char sessionname[33];
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

View File

@ -167,7 +167,7 @@ static void ac_discovery_run(void) {
struct capwap_packet_txmng* txmngpacket;
/* */
capwap_logging_debug("Receive discovery request packet");
log_printf(LOG_DEBUG, "Receive discovery request packet");
/* Creare discovery response */
txmngpacket = ac_create_discovery_response(&packet);
@ -186,7 +186,7 @@ static void ac_discovery_run(void) {
/* Send discovery response to WTP */
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 */
@ -211,9 +211,9 @@ static void ac_discovery_run(void) {
/* */
static void* ac_discovery_thread(void* param) {
capwap_logging_debug("Discovery start");
log_printf(LOG_DEBUG, "Discovery start");
ac_discovery_run();
capwap_logging_debug("Discovery stop");
log_printf(LOG_DEBUG, "Discovery stop");
/* Thread exit */
pthread_exit(NULL);
@ -234,7 +234,7 @@ int ac_discovery_start(void) {
/* Create thread */
result = pthread_create(&g_ac_discovery.threadid, NULL, ac_discovery_thread, NULL);
if (result) {
capwap_logging_debug("Unable create discovery thread");
log_printf(LOG_DEBUG, "Unable create discovery thread");
return 0;
}

View File

@ -203,7 +203,7 @@ static void ac_session_msgqueue_parsing_item(struct ac_session_msgqueue_item_t*
}
default: {
capwap_logging_debug("Unknown message queue item: %lu", item->message);
log_printf(LOG_DEBUG, "Unknown message queue item: %lu", item->message);
break;
}
}
@ -215,11 +215,11 @@ static void ac_wait_terminate_allsessions(void) {
/* Wait that list is empty */
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 */
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;
}
@ -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 */
@ -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);
} 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);
}
@ -828,7 +828,7 @@ int ac_execute(void) {
/* Set file descriptor pool */
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;
}
@ -841,7 +841,7 @@ int ac_execute(void) {
/* Start discovery thread */
if (!ac_discovery_start()) {
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;
}
@ -849,7 +849,7 @@ int ac_execute(void) {
if (!ac_backend_start()) {
ac_execute_free_fdspool(&fds);
ac_discovery_stop();
capwap_logging_error("Unable start backend management");
log_printf(LOG_ERR, "Unable start backend management");
return AC_ERROR_SYSTEM_FAILER;
}
@ -859,7 +859,7 @@ int ac_execute(void) {
buffersize = sizeof(buffer);
index = ac_recvfrom(&fds, buffer, &buffersize, &fromaddr, &toaddr);
if (!g_ac.running) {
capwap_logging_debug("Closing AC");
log_printf(LOG_DEBUG, "Closing AC");
break;
}

View File

@ -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 */
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 */
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;
}
@ -95,14 +97,18 @@ static void ac_ieee80211_mgmt_authentication_packet(struct ac_session_t* session
if (responselength > 0) {
/* Send authentication response */
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;
} 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);
}
} 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);
}
}
@ -117,7 +123,9 @@ static void ac_ieee80211_mgmt_authentication_packet(struct ac_session_t* session
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) {
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;
if (!(station->flags & AC_STATION_FLAGS_AUTHENTICATED)) {
/* 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);
return;
}
@ -191,7 +201,8 @@ static void ac_ieee80211_mgmt_association_request_packet(struct ac_session_t* se
/* Parsing Information Elements */
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);
return;
}
@ -237,17 +248,21 @@ static void ac_ieee80211_mgmt_association_request_packet(struct ac_session_t* se
if (responselength > 0) {
/* Send association response */
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 */
station->flags |= AC_STATION_FLAGS_ASSOCIATE;
ac_stations_authorize_station(session, station);
} 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);
}
} 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);
}
}
@ -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)) {
station = ac_stations_get_station(session, radioid, mgmt->bssid, mgmt->da);
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) {
/* Get Station Info */

View File

@ -2,7 +2,7 @@
#define __AC_JSON_HEADER__
#include "capwap_array.h"
#include <json/json.h>
#include <json-c/json.h>
#define IEEE80211_BINDING_JSON_ROOT "WTPRadio"
@ -61,13 +61,13 @@ struct ac_json_ieee80211_wtpradio {
/* */
struct ac_json_ieee80211_ops {
/* Message Element Type */
uint16_t type;
struct capwap_message_element_id type;
/* Message Element JSON Type */
char* json_type;
/* 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);
/* 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);
/* */
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_parsingjson(struct ac_json_ieee80211_wtpradio* wtpradio, struct json_object* jsonroot);

View File

@ -191,7 +191,7 @@ static int ac_kmod_link(void) {
if (result == -EALREADY) {
result = 0;
} 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]);
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);
/* */
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);
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);
@ -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);
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);
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);
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);
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);
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);
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) {
result = (ifindex ? (int)ifindex : -1);
} 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);
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);
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);
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 */
g_ac.kmodhandle.nlsmartcapwap_id = genl_ctrl_resolve(g_ac.kmodhandle.nl, NLSMARTCAPWAP_GENL_NAME);
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();
return -1;
}

View File

@ -165,12 +165,12 @@ static int ac_session_action_authorizestation_response(struct ac_session_t* sess
session->retransmitcount = 0;
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
} 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_session_teardown(session);
}
} 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_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);
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
} 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_session_teardown(session);
}
@ -279,7 +279,7 @@ static int ac_session_action_addwlan(struct ac_session_t* session, struct ac_not
session->retransmitcount = 0;
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
} 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_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);
if (response) {
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 */
}
@ -353,7 +353,7 @@ static int ac_session_action_station_configuration_ieee8011_delete_station(struc
session->retransmitcount = 0;
capwap_timeout_set(session->timeout, session->idtimercontrol, AC_RETRANSMIT_INTERVAL, ac_dfa_retransmition_timeout, session, NULL);
} 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_session_teardown(session);
}
@ -399,7 +399,7 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses
{
char sessionname[33];
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
/* Send keep-alive response */
@ -601,7 +601,7 @@ static void ac_dfa_execute(struct ac_session_t* session, struct capwap_parsed_pa
}
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);
break;
}
@ -659,7 +659,7 @@ static void ac_session_destroy(struct ac_session_t* session) {
#ifdef DEBUG
capwap_sessionid_printf(&session->sessionid, sessionname);
capwap_logging_debug("Release Session AC %s", sessionname);
log_printf(LOG_DEBUG, "Release Session AC %s", sessionname);
#endif
/* Release last reference */
@ -674,7 +674,7 @@ static void ac_session_destroy(struct ac_session_t* session) {
/* Check if all reference is release */
while (session->count > 0) {
#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
/* */
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)) {
/* Retransmit response */
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 {
capwap_logging_debug("Retrasmitted control packet");
log_printf(LOG_DEBUG, "Retrasmitted control packet");
}
} else {
/* Check message type */
@ -832,24 +832,24 @@ static void ac_session_run(struct ac_session_t* session) {
/* */
ac_dfa_execute(session, &packet);
} 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)) {
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);
}
}
} 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)) {
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);
/* TODO: add the unrecognized message element */
}
}
} else {
capwap_logging_debug("Invalid message type");
log_printf(LOG_DEBUG, "Invalid 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);
}
}
@ -890,7 +890,7 @@ void ac_dfa_change_state(struct ac_session_t* session, int state) {
#ifdef DEBUG
char sessionname[33];
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
session->state = state;
@ -984,9 +984,9 @@ void* ac_session_thread(void* param) {
threadid = session->threadid;
/* */
capwap_logging_debug("Session start");
log_printf(LOG_DEBUG, "Session start");
ac_session_run(session);
capwap_logging_debug("Session end");
log_printf(LOG_DEBUG, "Session end");
/* Notify terminate thread */
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;
if (!session->requestfragmentpacket->count) {
capwap_logging_warning("Invalid retransmition request packet");
log_printf(LOG_WARNING, "Invalid retransmition request packet");
ac_session_teardown(session);
} else {
session->retransmitcount++;
if (session->retransmitcount >= AC_MAX_RETRANSMIT) {
capwap_logging_info("Retransmition request packet timeout");
log_printf(LOG_INFO, "Retransmition request packet timeout");
/* Timeout reset state */
ac_free_reference_last_request(session);
ac_session_teardown(session);
} else {
/* Retransmit Request */
capwap_logging_debug("Retransmition request packet");
log_printf(LOG_DEBUG, "Retransmition request packet");
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 */
@ -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) {
capwap_logging_info("Session timeout, teardown");
log_printf(LOG_INFO, "Session timeout, teardown");
ac_session_teardown((struct ac_session_t*)context);
}

View File

@ -45,7 +45,7 @@ static void ac_stations_destroy_station(struct ac_session_t* session, struct ac_
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 */
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) {
char buffer[CAPWAP_MACADDRESS_EUI48_BUFFER];
int ac_wlans_assign_bssid(struct ac_session_t* session, struct ac_wlan* wlan)
{
ASSERT(session != NULL);
ASSERT(session->wlans != 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_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;
}
@ -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) {
char buffer1[CAPWAP_MACADDRESS_EUI48_BUFFER];
char buffer2[CAPWAP_MACADDRESS_EUI48_BUFFER];
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_wlan* wlan;
struct ac_station* authoritativestation;
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);
/* */
capwap_printf_macaddress(buffer1, bssid, MACADDRESS_EUI48_LENGTH);
capwap_printf_macaddress(buffer2, address, MACADDRESS_EUI48_LENGTH);
capwap_logging_info("Create station to radioid: %d, bssid: %s, station address: %s", (int)radioid, buffer1, buffer2);
log_printf(LOG_INFO, "Create station to radioid: %d, bssid: " MACSTR ", station address: " MACSTR,
(int)radioid, MAC2STR(bssid), MAC2STR(address));
/* */
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;
memcpy(station->address, address, MACADDRESS_EUI48_LENGTH);
capwap_printf_macaddress(station->addrtext, address, MACADDRESS_EUI48_LENGTH);
station->wlanitem = stationitem;
station->session = session;
@ -392,7 +389,8 @@ struct ac_station* ac_stations_create_station(struct ac_session_t* session, uint
}
}
} 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;
@ -479,7 +477,8 @@ void ac_stations_timeout(struct capwap_timeout* timeout, unsigned long index, vo
if (station->idtimeout == index) {
switch (station->timeoutaction) {
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);
break;
}

View File

@ -74,7 +74,6 @@ struct ac_wlans {
/* AC Station */
struct ac_station {
uint8_t address[MACADDRESS_EUI48_LENGTH];
char addrtext[CAPWAP_MACADDRESS_EUI48_BUFFER];
/* */
unsigned long flags;

View File

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

View File

@ -420,6 +420,26 @@ struct ieee80211_ie_erp {
uint8_t params;
} STRUCT_PACKED;
/* 802.11 RSN information element */
#define IEEE80211_IE_RSN_INFORMATION 48
/* cipher suite selectors */
#define IEEE80211_CIPHER_SUITE_USE_GROUP 0x000FAC00
#define IEEE80211_CIPHER_SUITE_WEP40 0x000FAC01
#define IEEE80211_CIPHER_SUITE_TKIP 0x000FAC02
/* reserved: 0x000FAC03 */
#define IEEE80211_CIPHER_SUITE_CCMP 0x000FAC04
#define IEEE80211_CIPHER_SUITE_WEP104 0x000FAC05
#define IEEE80211_CIPHER_SUITE_AES_CMAC 0x000FAC06
#define IEEE80211_CIPHER_SUITE_NO_GROUP_ADDR 0x000FAC07
#define IEEE80211_CIPHER_SUITE_GCMP 0x000FAC08
#define IEEE80211_CIPHER_SUITE_GCMP_256 0x000FAC09
#define IEEE80211_CIPHER_SUITE_CCMP_256 0x000FAC0A
#define IEEE80211_CIPHER_SUITE_BIP_GMAC_128 0x000FAC0B
#define IEEE80211_CIPHER_SUITE_BIP_GMAC_256 0x000FAC0C
#define IEEE80211_CIPHER_SUITE_BIP_CMAC_256 0x000FAC0D
/* 802.11 Extended Supported Rates information element */
#define IEEE80211_IE_EXTENDED_SUPPORTED_RATES 50
#define IEEE80211_IE_EXTENDED_SUPPORTED_MIN_LENGTH 1
@ -500,6 +520,80 @@ struct ieee80211_ie_wmm_information_element {
uint8_t qos_info;
} 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 */
struct ieee80211_ie_items {
struct ieee80211_ie_ssid *ssid;
@ -514,6 +608,8 @@ struct ieee80211_ie_items {
struct ieee80211_ie_power_constraint *power_constraint;
struct ieee80211_ie_ssid_list *ssid_list;
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 */
@ -621,6 +717,16 @@ struct ieee80211_deauthentication_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 */
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);

View File

@ -76,7 +76,7 @@ void capwap_daemon(void);
/* */
#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); \
} while(0)

View File

@ -36,14 +36,14 @@ void* capwap_alloc_debug(size_t size, const char* file, const int line) {
/* Request 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);
}
/* Alloc block with memory block */
block = (struct capwap_memory_block*)malloc(sizeof(struct capwap_memory_block) + size);
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);
}
@ -69,19 +69,19 @@ void capwap_free_debug(void* p, const char* file, const int line) {
struct capwap_memory_block* prevblock;
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);
}
/* 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);
}
block = (struct capwap_memory_block*)((char*)p - sizeof(struct capwap_memory_block));
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);
}
@ -107,7 +107,7 @@ void capwap_free_debug(void* p, const char* file, const int line) {
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 */
@ -119,7 +119,8 @@ void capwap_dump_memory(void) {
findblock = g_memoryblocks;
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
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 */
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);
@ -143,9 +144,9 @@ void capwap_dump_memory(void) {
/* Check if all memory is free */
int capwap_check_memory_leak(int verbose) {
if ((g_memoryblocks != NULL) && (verbose != 0)) {
capwap_logging_debug("*** Detected memory leaks ! ***");
log_printf(LOG_DEBUG, "*** Detected memory leaks ! ***");
capwap_dump_memory();
capwap_logging_debug("*******************************");
log_printf(LOG_DEBUG, "*******************************");
}
return ((g_memoryblocks != NULL) ? 1 : 0);
@ -167,7 +168,7 @@ void capwap_backtrace_callstack(void) {
/* Skipping capwap_backtrace_callstack function print out */
for (i = 1; i < count; i++) {
capwap_logging_debug("\t%s", functions[i]);
log_printf(LOG_DEBUG, "\t%s", functions[i]);
}
free(functions);

View File

@ -3,7 +3,7 @@
#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 */
#define capwap_alloc(x) capwap_alloc_debug(x, __FILE__, __LINE__)
@ -29,7 +29,7 @@ void capwap_backtrace_callstack(void);
/* Standard memory management */
#define capwap_alloc(l) ({ void* __x = malloc(l); if (!__x) capwap_outofmemory(); __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_backtrace_callstack()

View File

@ -33,7 +33,7 @@ static int capwap_bio_method_recv(WOLFSSL* ssl, char* buffer, int length, void*
/* Check DTLS Capwap Preamble */
dtlspreamble = (struct capwap_dtls_header*)dtls->buffer;
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 */
}
@ -75,7 +75,7 @@ static int capwap_bio_method_send(WOLFSSL* ssl, char* buffer, int length, void*
/* Send packet */
err = capwap_sendto(dtls->sock, data, length + sizeof(struct capwap_dtls_header), &dtls->peeraddr);
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;
}
@ -236,7 +236,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
/* Alloc context */
dtlscontext->sslcontext = (void*)wolfSSL_CTX_new(((param->type == CAPWAP_DTLS_SERVER) ? wolfDTLSv1_server_method() : wolfDTLSv1_client_method()));
if (!dtlscontext->sslcontext) {
capwap_logging_debug("Error to initialize dtls context");
log_printf(LOG_DEBUG, "Error to initialize dtls context");
return 0;
}
@ -249,42 +249,42 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
if (dtlscontext->mode == CAPWAP_DTLS_MODE_CERTIFICATE) {
/* Check context */
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);
return 0;
} 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);
return 0;
} 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);
return 0;
}
/* Public certificate */
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);
return 0;
}
/* Private key */
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);
return 0;
}
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);
return 0;
}
/* Certificate Authority */
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);
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
*/
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);
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
*/
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);
return 0;
}
@ -321,7 +321,7 @@ int capwap_crypt_createcontext(struct capwap_dtls_context* dtlscontext, struct c
if (param->presharedkey.hint) {
wolfSSL_CTX_use_psk_identity_hint((WOLFSSL_CTX*)dtlscontext->sslcontext, param->presharedkey.hint);
} else {
capwap_logging_debug("Error to presharedkey hint");
log_printf(LOG_DEBUG, "Error to presharedkey hint");
capwap_crypt_freecontext(dtlscontext);
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.pskkeylength = capwap_crypt_psk_to_bin(param->presharedkey.pskkey, &dtlscontext->presharedkey.pskkey);
if (!dtlscontext->presharedkey.pskkeylength) {
capwap_logging_debug("Error to presharedkey");
log_printf(LOG_DEBUG, "Error to presharedkey");
capwap_crypt_freecontext(dtlscontext);
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);
}
} else {
capwap_logging_debug("Invalid DTLS mode");
log_printf(LOG_DEBUG, "Invalid DTLS mode");
capwap_crypt_freecontext(dtlscontext);
return 0;
}
@ -383,7 +383,7 @@ int capwap_crypt_createsession(struct capwap_dtls* dtls, struct capwap_dtls_cont
/* Create ssl session */
dtls->sslsession = (void*)wolfSSL_new((WOLFSSL_CTX*)dtlscontext->sslcontext);
if (!dtls->sslsession) {
capwap_logging_debug("Error to initialize dtls session");
log_printf(LOG_DEBUG, "Error to initialize dtls session");
return 0;
}
@ -498,7 +498,7 @@ int capwap_crypt_sendto(struct capwap_dtls* dtls, void* buffer, int size) {
if (!dtls->enable) {
err = capwap_sendto(dtls->sock, buffer, size, &dtls->peeraddr);
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;
@ -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);
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;
}
@ -572,7 +572,7 @@ int capwap_decrypt_packet(struct capwap_dtls* dtls, void* encrybuffer, int size,
/* */
if (dtls->action == CAPWAP_DTLS_ACTION_HANDSHAKE) {
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 */
} else {
result = CAPWAP_ERROR_AGAIN; /* Don't parsing DTLS packet */

View File

@ -4,136 +4,134 @@
#include "capwap_array.h"
/* */
int capwap_get_message_element_category(uint16_t type) {
switch (type) {
case CAPWAP_ELEMENT_ACNAMEPRIORITY:
case CAPWAP_ELEMENT_CONTROLIPV4:
case CAPWAP_ELEMENT_CONTROLIPV6:
case CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD:
case CAPWAP_ELEMENT_RADIOADMSTATE:
case CAPWAP_ELEMENT_RADIOOPRSTATE:
case CAPWAP_ELEMENT_RETURNEDMESSAGE:
case CAPWAP_ELEMENT_VENDORPAYLOAD:
case CAPWAP_ELEMENT_80211_ANTENNA:
case CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL:
case CAPWAP_ELEMENT_80211_IE:
case CAPWAP_ELEMENT_80211_MACOPERATION:
case CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY:
case CAPWAP_ELEMENT_80211_OFDMCONTROL:
case CAPWAP_ELEMENT_80211_RATESET:
case CAPWAP_ELEMENT_80211_STATISTICS:
case CAPWAP_ELEMENT_80211_SUPPORTEDRATES:
case CAPWAP_ELEMENT_80211_TXPOWER:
case CAPWAP_ELEMENT_80211_TXPOWERLEVEL:
case CAPWAP_ELEMENT_80211_WTP_QOS:
case CAPWAP_ELEMENT_80211_WTP_RADIO_CONF:
case CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION: {
return CAPWAP_MESSAGE_ELEMENT_ARRAY;
}
}
return CAPWAP_MESSAGE_ELEMENT_SINGLE;
}
/* */
static struct capwap_message_elements_ops* capwap_message_elements[] = {
/* CAPWAP_ELEMENT_ACDESCRIPTION */ &capwap_element_acdescriptor_ops,
/* CAPWAP_ELEMENT_ACIPV4LIST */ &capwap_element_acipv4list_ops,
/* CAPWAP_ELEMENT_ACIPV6LIST */ &capwap_element_acipv6list_ops,
/* CAPWAP_ELEMENT_ACNAME */ &capwap_element_acname_ops,
/* CAPWAP_ELEMENT_ACNAMEPRIORITY */ &capwap_element_acnamepriority_ops,
/* CAPWAP_ELEMENT_ACTIMESTAMP */ &capwap_element_actimestamp_ops,
/* CAPWAP_ELEMENT_ADDMACACL */ &capwap_element_addmacacl_ops,
/* CAPWAP_ELEMENT_ADDSTATION */ &capwap_element_addstation_ops,
/* Reserved */ NULL,
/* CAPWAP_ELEMENT_CONTROLIPV4 */ &capwap_element_controlipv4_ops,
/* CAPWAP_ELEMENT_CONTROLIPV6 */ &capwap_element_controlipv6_ops,
/* CAPWAP_ELEMENT_TIMERS */ &capwap_element_timers_ops,
/* CAPWAP_ELEMENT_DATATRANSFERDATA */ &capwap_element_datatransferdata_ops,
/* CAPWAP_ELEMENT_DATATRANSFERMODE */ &capwap_element_datatransfermode_ops,
/* CAPWAP_ELEMENT_DECRYPTERRORREPORT */ &capwap_element_decrypterrorreport_ops,
/* CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD */ &capwap_element_decrypterrorreportperiod_ops,
/* CAPWAP_ELEMENT_DELETEMACACL */ &capwap_element_deletemacacl_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
#define element_ops(Id, Ops) [(Id) - CAPWAP_MESSAGE_ELEMENTS_START] = &(Ops)
static const struct capwap_message_elements_ops * capwap_message_elements[] = {
element_ops(CAPWAP_ELEMENT_ACDESCRIPTION_TYPE, capwap_element_acdescriptor_ops),
element_ops(CAPWAP_ELEMENT_ACIPV4LIST_TYPE, capwap_element_acipv4list_ops),
element_ops(CAPWAP_ELEMENT_ACIPV6LIST_TYPE, capwap_element_acipv6list_ops),
element_ops(CAPWAP_ELEMENT_ACNAME_TYPE, capwap_element_acname_ops),
element_ops(CAPWAP_ELEMENT_ACNAMEPRIORITY_TYPE, capwap_element_acnamepriority_ops),
element_ops(CAPWAP_ELEMENT_ACTIMESTAMP_TYPE, capwap_element_actimestamp_ops),
element_ops(CAPWAP_ELEMENT_ADDMACACL_TYPE, capwap_element_addmacacl_ops),
element_ops(CAPWAP_ELEMENT_ADDSTATION_TYPE, capwap_element_addstation_ops),
element_ops(CAPWAP_ELEMENT_CONTROLIPV4_TYPE, capwap_element_controlipv4_ops),
element_ops(CAPWAP_ELEMENT_CONTROLIPV6_TYPE, capwap_element_controlipv6_ops),
element_ops(CAPWAP_ELEMENT_TIMERS_TYPE, capwap_element_timers_ops),
element_ops(CAPWAP_ELEMENT_DATATRANSFERDATA_TYPE, capwap_element_datatransferdata_ops),
element_ops(CAPWAP_ELEMENT_DATATRANSFERMODE_TYPE, capwap_element_datatransfermode_ops),
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORT_TYPE, capwap_element_decrypterrorreport_ops),
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD_TYPE, capwap_element_decrypterrorreportperiod_ops),
element_ops(CAPWAP_ELEMENT_DELETEMACACL_TYPE, capwap_element_deletemacacl_ops),
element_ops(CAPWAP_ELEMENT_DELETESTATION_TYPE, capwap_element_deletestation_ops),
element_ops(CAPWAP_ELEMENT_DISCOVERYTYPE_TYPE, capwap_element_discoverytype_ops),
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV4_TYPE, capwap_element_duplicateipv4_ops),
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV6_TYPE, capwap_element_duplicateipv6_ops),
element_ops(CAPWAP_ELEMENT_IDLETIMEOUT_TYPE, capwap_element_idletimeout_ops),
element_ops(CAPWAP_ELEMENT_IMAGEDATA_TYPE, capwap_element_imagedata_ops),
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),
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),
element_ops(CAPWAP_ELEMENT_RESULTCODE_TYPE, capwap_element_resultcode_ops),
element_ops(CAPWAP_ELEMENT_RETURNEDMESSAGE_TYPE, capwap_element_returnedmessage_ops),
element_ops(CAPWAP_ELEMENT_SESSIONID_TYPE, capwap_element_sessionid_ops),
element_ops(CAPWAP_ELEMENT_STATISTICSTIMER_TYPE, capwap_element_statisticstimer_ops),
element_ops(CAPWAP_ELEMENT_VENDORPAYLOAD_TYPE, capwap_element_vendorpayload_ops),
element_ops(CAPWAP_ELEMENT_WTPBOARDDATA_TYPE, capwap_element_wtpboarddata_ops),
element_ops(CAPWAP_ELEMENT_WTPDESCRIPTOR_TYPE, capwap_element_wtpdescriptor_ops),
element_ops(CAPWAP_ELEMENT_WTPFALLBACK_TYPE, capwap_element_wtpfallback_ops),
element_ops(CAPWAP_ELEMENT_WTPFRAMETUNNELMODE_TYPE, capwap_element_wtpframetunnelmode_ops),
element_ops(CAPWAP_ELEMENT_WTPMACTYPE_TYPE, capwap_element_wtpmactype_ops),
element_ops(CAPWAP_ELEMENT_WTPNAME_TYPE, capwap_element_wtpname_ops),
element_ops(CAPWAP_ELEMENT_WTPRADIOSTAT_TYPE, capwap_element_wtpradiostat_ops),
element_ops(CAPWAP_ELEMENT_WTPREBOOTSTAT_TYPE, capwap_element_wtprebootstat_ops),
element_ops(CAPWAP_ELEMENT_WTPSTATICIPADDRESS_TYPE, capwap_element_wtpstaticipaddress_ops),
element_ops(CAPWAP_ELEMENT_LOCALIPV6_TYPE, capwap_element_localipv6_ops),
element_ops(CAPWAP_ELEMENT_TRANSPORT_TYPE, capwap_element_transport_ops),
element_ops(CAPWAP_ELEMENT_MTUDISCOVERY_TYPE, capwap_element_mtudiscovery_ops),
element_ops(CAPWAP_ELEMENT_ECNSUPPORT_TYPE, capwap_element_ecnsupport_ops)
};
#undef element_ops
/* */
static struct capwap_message_elements_ops* capwap_80211_message_elements[] = {
/* CAPWAP_ELEMENT_80211_ADD_WLAN */ &capwap_element_80211_addwlan_ops,
/* CAPWAP_ELEMENT_80211_ANTENNA */ &capwap_element_80211_antenna_ops,
/* CAPWAP_ELEMENT_80211_ASSIGN_BSSID */ &capwap_element_80211_assignbssid_ops,
/* CAPWAP_ELEMENT_80211_DELETE_WLAN */ &capwap_element_80211_deletewlan_ops,
/* CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL */ &capwap_element_80211_directsequencecontrol_ops,
/* CAPWAP_ELEMENT_80211_IE */ &capwap_element_80211_ie_ops,
/* CAPWAP_ELEMENT_80211_MACOPERATION */ &capwap_element_80211_macoperation_ops,
/* CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES */ &capwap_element_80211_miccountermeasures_ops,
/* CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY */ &capwap_element_80211_multidomaincapability_ops,
/* CAPWAP_ELEMENT_80211_OFDMCONTROL */ &capwap_element_80211_ofdmcontrol_ops,
/* CAPWAP_ELEMENT_80211_RATESET */ &capwap_element_80211_rateset_ops,
/* CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT */ &capwap_element_80211_rsnaerrorreport_ops,
/* CAPWAP_ELEMENT_80211_STATION */ &capwap_element_80211_station_ops,
/* CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE */ &capwap_element_80211_stationqos_ops,
/* CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE */ &capwap_element_80211_stationkey_ops,
/* CAPWAP_ELEMENT_80211_STATISTICS */ &capwap_element_80211_statistics_ops,
/* CAPWAP_ELEMENT_80211_SUPPORTEDRATES */ &capwap_element_80211_supportedrates_ops,
/* CAPWAP_ELEMENT_80211_TXPOWER */ &capwap_element_80211_txpower_ops,
/* CAPWAP_ELEMENT_80211_TXPOWERLEVEL */ &capwap_element_80211_txpowerlevel_ops,
/* CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS */ &capwap_element_80211_updatestationqos_ops,
/* CAPWAP_ELEMENT_80211_UPDATE_WLAN */ &capwap_element_80211_updatewlan_ops,
/* CAPWAP_ELEMENT_80211_WTP_QOS */ &capwap_element_80211_wtpqos_ops,
/* CAPWAP_ELEMENT_80211_WTP_RADIO_CONF */ &capwap_element_80211_wtpradioconf_ops,
/* CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM */ &capwap_element_80211_wtpradiofailalarm_ops,
/* CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION */ &capwap_element_80211_wtpradioinformation_ops
#define element_ops(Id, Ops) [(Id) - CAPWAP_80211_MESSAGE_ELEMENTS_START] = &(Ops)
static const struct capwap_message_elements_ops * capwap_80211_message_elements[] = {
element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN_TYPE, capwap_element_80211_addwlan_ops),
element_ops(CAPWAP_ELEMENT_80211_ANTENNA_TYPE, capwap_element_80211_antenna_ops),
element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID_TYPE, capwap_element_80211_assignbssid_ops),
element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN_TYPE, capwap_element_80211_deletewlan_ops),
element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_TYPE, capwap_element_80211_directsequencecontrol_ops),
element_ops(CAPWAP_ELEMENT_80211_IE_TYPE, capwap_element_80211_ie_ops),
element_ops(CAPWAP_ELEMENT_80211_MACOPERATION_TYPE, capwap_element_80211_macoperation_ops),
element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_TYPE, capwap_element_80211_miccountermeasures_ops),
element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_TYPE, capwap_element_80211_multidomaincapability_ops),
element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL_TYPE, capwap_element_80211_ofdmcontrol_ops),
element_ops(CAPWAP_ELEMENT_80211_RATESET_TYPE, capwap_element_80211_rateset_ops),
element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_TYPE, capwap_element_80211_rsnaerrorreport_ops),
element_ops(CAPWAP_ELEMENT_80211_STATION_TYPE, capwap_element_80211_station_ops),
element_ops(CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_TYPE, capwap_element_80211_stationqos_ops),
element_ops(CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_TYPE, capwap_element_80211_stationkey_ops),
element_ops(CAPWAP_ELEMENT_80211_STATISTICS_TYPE, capwap_element_80211_statistics_ops),
element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES_TYPE, capwap_element_80211_supportedrates_ops),
element_ops(CAPWAP_ELEMENT_80211_TXPOWER_TYPE, capwap_element_80211_txpower_ops),
element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL_TYPE, capwap_element_80211_txpowerlevel_ops),
element_ops(CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_TYPE, capwap_element_80211_updatestationqos_ops),
element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN_TYPE, capwap_element_80211_updatewlan_ops),
element_ops(CAPWAP_ELEMENT_80211_WTP_QOS_TYPE, capwap_element_80211_wtpqos_ops),
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_TYPE, capwap_element_80211_wtpradioconf_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) {
if (IS_MESSAGE_ELEMENTS(code)) {
return capwap_message_elements[code - CAPWAP_MESSAGE_ELEMENTS_START];
} else if (IS_80211_MESSAGE_ELEMENTS(code)) {
return capwap_80211_message_elements[code - CAPWAP_80211_MESSAGE_ELEMENTS_START];
#define element_ops(Id, Ops) [(Id) - 1] = &(Ops)
static const struct capwap_message_elements_ops * capwap_vendor_travelping_message_elements[] = {
element_ops(CAPWAP_ELEMENT_VENDOR_TRAVELPING_WTP_TIMESTAMP_TYPE, capwap_element_vendor_travelping_wtp_timestamp_ops),
element_ops(CAPWAP_ELEMENT_80211N_RADIO_CONF_TYPE, capwap_element_80211n_radioconf_ops),
element_ops(CAPWAP_ELEMENT_80211N_STATION_INFO_TYPE, capwap_element_80211n_station_info_ops),
element_ops(CAPWAP_ELEMENT_VENDOR_TRAVELPING_80211_ENCRYPTION_CAPABILITY_TYPE, capwap_element_vendor_travelping_80211_encryption_capability_ops),
element_ops(CAPWAP_ELEMENT_VENDOR_TRAVELPING_80211_UPDATE_KEY_TYPE, capwap_element_vendor_travelping_80211_update_key_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;
#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;
ASSERT(packet != NULL);
@ -141,11 +139,10 @@ struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet*
search = packet->messages->first;
while (search) {
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
if (messageelement->type == type) {
struct capwap_message_element_itemlist* messageelement =
(struct capwap_message_element_itemlist*)search->item;
if (message_element_id_eq(id, messageelement->id))
return search;
}
/* */
search = search->next;
@ -155,12 +152,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_message_element_itemlist* messageelement;
/* Retrieve item list */
itemlist = capwap_get_message_element(packet, type);
itemlist = capwap_get_message_element(packet, id);
if (!itemlist) {
return NULL;
}
@ -193,53 +192,75 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* */
bodylength = rxmngpacket->ctrlmsg.length - CAPWAP_CONTROL_MESSAGE_MIN_LENGTH;
while (bodylength > 0) {
uint16_t type;
struct capwap_message_element_id id = { .vendor = 0 };
uint16_t msglength;
int category;
struct capwap_list_item* itemlist;
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 */
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;
}
/* 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 */
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);
category = capwap_get_message_element_category(type);
if (category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
itemlist = capwap_get_message_element(packet, id);
if (read_ops->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
/* Check for multiple message element */
if (itemlist) {
return INVALID_MESSAGE_ELEMENT;
@ -248,18 +269,14 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* Create new message element */
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
messageelement->type = type;
messageelement->id = id;
messageelement->category = CAPWAP_MESSAGE_ELEMENT_SINGLE;
messageelement->data = read_ops->parsing_message_element((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
if (!messageelement->data) {
capwap_itemlist_free(itemlist);
return INVALID_MESSAGE_ELEMENT;
}
messageelement->data = element;
/* */
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;
if (itemlist) {
@ -271,7 +288,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* */
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
messageelement->type = type;
messageelement->id = id;
messageelement->category = CAPWAP_MESSAGE_ELEMENT_ARRAY;
messageelement->data = (void*)arraymessageelement;
@ -279,14 +296,8 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
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 */
@ -630,7 +641,7 @@ void capwap_free_parsed_packet(struct capwap_parsed_packet* packet) {
int i;
struct capwap_list_item* itemlist;
struct capwap_message_element_itemlist* messageelement;
struct capwap_message_elements_ops* msgops;
const struct capwap_message_elements_ops* msgops;
ASSERT(packet != NULL);
@ -639,15 +650,15 @@ void capwap_free_parsed_packet(struct capwap_parsed_packet* packet) {
while (itemlist) {
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
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) {
msgops->free_message_element(messageelement->data);
msgops->free(messageelement->data);
} else if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) {
struct capwap_array* arraymessageelement = (struct capwap_array*)messageelement->data;
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));
}
/* */

View File

@ -4,6 +4,15 @@
#include "capwap_array.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;
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);
};
struct capwap_message_elements_ops {
struct capwap_message_elements_ops
{
int category;
/* 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 */
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 */
void* (*clone_message_element)(void*);
void (*free_message_element)(void*);
void* (*clone)(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 */
#include "capwap_element_acdescriptor.h" /* 00001 */
#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_wtpradioinformation.h" /* 01048 */
#include "capwap_vendor_travelping.h"
/*********************************************************************************************************************/
#define CAPWAP_MESSAGE_ELEMENT_SINGLE 0
#define CAPWAP_MESSAGE_ELEMENT_ARRAY 1
int capwap_get_message_element_category(uint16_t type);
struct capwap_message_element_itemlist {
uint16_t type;
struct capwap_message_element_itemlist
{
struct capwap_message_element_id id;
int category;
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);
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);
void* capwap_get_message_element_data(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);
void *capwap_get_message_element_data(struct capwap_parsed_packet *packet,
const struct capwap_message_element_id id);
#endif /* __CAPWAP_ELEMENT_HEADER__ */

View File

@ -99,7 +99,7 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
length = func->read_ready(handle);
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;
}
@ -113,11 +113,11 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
if (!IS_VALID_RADIOID(data->radioid)) {
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;
} else if (!IS_VALID_WLANID(data->wlanid)) {
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;
}
@ -141,7 +141,7 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle
length = func->read_ready(handle);
if (!length || (length > CAPWAP_ADD_WLAN_SSID_LENGTH)) {
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;
}
@ -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 = {
.create_message_element = capwap_80211_addwlan_element_create,
.parsing_message_element = capwap_80211_addwlan_element_parsing,
.clone_message_element = capwap_80211_addwlan_element_clone,
.free_message_element = capwap_80211_addwlan_element_free
const struct capwap_message_elements_ops capwap_element_80211_addwlan_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_addwlan_element_create,
.parse = capwap_80211_addwlan_element_parsing,
.clone = capwap_80211_addwlan_element_clone,
.free = capwap_80211_addwlan_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_SSID_LENGTH 32
@ -59,6 +62,6 @@ struct capwap_80211_addwlan_element {
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__ */

View File

@ -75,13 +75,13 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle
length = func->read_ready(handle);
if (length < 5) {
capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Antenna element");
return NULL;
}
length -= 4;
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;
}
@ -94,7 +94,7 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle
func->read_u8(handle, &data->radioid);
if (!IS_VALID_RADIOID(data->radioid)) {
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;
}
@ -104,7 +104,7 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle
/* Check */
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);
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 = {
.create_message_element = capwap_80211_antenna_element_create,
.parsing_message_element = capwap_80211_antenna_element_parsing,
.clone_message_element = capwap_80211_antenna_element_clone,
.free_message_element = capwap_80211_antenna_element_free
const struct capwap_message_elements_ops capwap_element_80211_antenna_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_antenna_element_create,
.parse = capwap_80211_antenna_element_parsing,
.clone = capwap_80211_antenna_element_clone,
.free = capwap_80211_antenna_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_ENABLE 1
@ -23,7 +26,7 @@ struct capwap_80211_antenna_element {
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);
#endif /* __CAPWAP_ELEMENT_80211_ANTENNA_HEADER__ */

View File

@ -36,7 +36,7 @@ static void* capwap_80211_assignbssid_element_parsing(capwap_message_elements_ha
ASSERT(func != NULL);
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;
}
@ -67,9 +67,10 @@ static void capwap_80211_assignbssid_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops = {
.create_message_element = capwap_80211_assignbssid_element_create,
.parsing_message_element = capwap_80211_assignbssid_element_parsing,
.clone_message_element = capwap_80211_assignbssid_element_clone,
.free_message_element = capwap_80211_assignbssid_element_free
const struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_assignbssid_element_create,
.parse = capwap_80211_assignbssid_element_parsing,
.clone = capwap_80211_assignbssid_element_clone,
.free = capwap_80211_assignbssid_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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 {
uint8_t radioid;
@ -9,6 +12,6 @@ struct capwap_80211_assignbssid_element {
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__ */

View File

@ -33,7 +33,7 @@ static void* capwap_80211_deletewlan_element_parsing(capwap_message_elements_han
ASSERT(func != NULL);
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;
}
@ -63,9 +63,10 @@ static void capwap_80211_deletewlan_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops = {
.create_message_element = capwap_80211_deletewlan_element_create,
.parsing_message_element = capwap_80211_deletewlan_element_parsing,
.clone_message_element = capwap_80211_deletewlan_element_clone,
.free_message_element = capwap_80211_deletewlan_element_free
const struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_deletewlan_element_create,
.parse = capwap_80211_deletewlan_element_parsing,
.clone = capwap_80211_deletewlan_element_clone,
.free = capwap_80211_deletewlan_element_free
};

View File

@ -1,13 +1,16 @@
#ifndef __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 {
uint8_t radioid;
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__ */

View File

@ -54,7 +54,7 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e
ASSERT(func != NULL);
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;
}
@ -66,7 +66,7 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e
func->read_u8(handle, &data->radioid);
if (!IS_VALID_RADIOID(data->radioid)) {
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;
}
@ -79,9 +79,10 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e
}
/* */
struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops = {
.create_message_element = capwap_80211_directsequencecontrol_element_create,
.parsing_message_element = capwap_80211_directsequencecontrol_element_parsing,
.clone_message_element = capwap_80211_directsequencecontrol_element_clone,
.free_message_element = capwap_80211_directsequencecontrol_element_free
const struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_directsequencecontrol_element_create,
.parse = capwap_80211_directsequencecontrol_element_parsing,
.clone = capwap_80211_directsequencecontrol_element_clone,
.free = capwap_80211_directsequencecontrol_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_CSONLY 2
@ -17,6 +20,6 @@ struct capwap_80211_directsequencecontrol_element {
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__ */

View File

@ -37,7 +37,7 @@ static void* capwap_80211_ie_element_parsing(capwap_message_elements_handle hand
length = func->read_ready(handle);
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;
}
@ -83,9 +83,10 @@ static void capwap_80211_ie_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_ie_ops = {
.create_message_element = capwap_80211_ie_element_create,
.parsing_message_element = capwap_80211_ie_element_parsing,
.clone_message_element = capwap_80211_ie_element_clone,
.free_message_element = capwap_80211_ie_element_free
const struct capwap_message_elements_ops capwap_element_80211_ie_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_ie_element_create,
.parse = capwap_80211_ie_element_parsing,
.clone = capwap_80211_ie_element_clone,
.free = capwap_80211_ie_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_PROBE_RESPONSE_ASSOCIATED 0x40
@ -14,6 +17,6 @@ struct capwap_80211_ie_element {
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__ */

View File

@ -46,7 +46,7 @@ static void* capwap_80211_macoperation_element_parsing(capwap_message_elements_h
ASSERT(func != NULL);
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;
}
@ -82,9 +82,10 @@ static void capwap_80211_macoperation_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_macoperation_ops = {
.create_message_element = capwap_80211_macoperation_element_create,
.parsing_message_element = capwap_80211_macoperation_element_parsing,
.clone_message_element = capwap_80211_macoperation_element_clone,
.free_message_element = capwap_80211_macoperation_element_free
const struct capwap_message_elements_ops capwap_element_80211_macoperation_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_macoperation_element_create,
.parse = capwap_80211_macoperation_element_parsing,
.clone = capwap_80211_macoperation_element_clone,
.free = capwap_80211_macoperation_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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 {
uint8_t radioid;
@ -13,6 +16,6 @@ struct capwap_80211_macoperation_element {
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__ */

View File

@ -36,7 +36,7 @@ static void* capwap_80211_miccountermeasures_element_parsing(capwap_message_elem
ASSERT(func != NULL);
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;
}
@ -67,9 +67,10 @@ static void capwap_80211_miccountermeasures_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops = {
.create_message_element = capwap_80211_miccountermeasures_element_create,
.parsing_message_element = capwap_80211_miccountermeasures_element_parsing,
.clone_message_element = capwap_80211_miccountermeasures_element_clone,
.free_message_element = capwap_80211_miccountermeasures_element_free
const struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_miccountermeasures_element_create,
.parse = capwap_80211_miccountermeasures_element_parsing,
.clone = capwap_80211_miccountermeasures_element_clone,
.free = capwap_80211_miccountermeasures_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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 {
uint8_t radioid;
@ -9,6 +12,6 @@ struct capwap_80211_miccountermeasures_element {
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__ */

View File

@ -39,7 +39,7 @@ static void* capwap_80211_multidomaincapability_element_parsing(capwap_message_e
ASSERT(func != NULL);
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;
}
@ -72,9 +72,10 @@ static void capwap_80211_multidomaincapability_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops = {
.create_message_element = capwap_80211_multidomaincapability_element_create,
.parsing_message_element = capwap_80211_multidomaincapability_element_parsing,
.clone_message_element = capwap_80211_multidomaincapability_element_clone,
.free_message_element = capwap_80211_multidomaincapability_element_free
const struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_multidomaincapability_element_create,
.parse = capwap_80211_multidomaincapability_element_parsing,
.clone = capwap_80211_multidomaincapability_element_clone,
.free = capwap_80211_multidomaincapability_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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 {
uint8_t radioid;
@ -10,6 +13,6 @@ struct capwap_80211_multidomaincapability_element {
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__ */

View File

@ -39,7 +39,7 @@ static void* capwap_80211_ofdmcontrol_element_parsing(capwap_message_elements_ha
ASSERT(func != NULL);
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;
}
@ -72,9 +72,10 @@ static void capwap_80211_ofdmcontrol_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops = {
.create_message_element = capwap_80211_ofdmcontrol_element_create,
.parsing_message_element = capwap_80211_ofdmcontrol_element_parsing,
.clone_message_element = capwap_80211_ofdmcontrol_element_clone,
.free_message_element = capwap_80211_ofdmcontrol_element_free
const struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_ofdmcontrol_element_create,
.parse = capwap_80211_ofdmcontrol_element_parsing,
.clone = capwap_80211_ofdmcontrol_element_clone,
.free = capwap_80211_ofdmcontrol_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_525_535 0x02
@ -19,6 +22,6 @@ struct capwap_80211_ofdmcontrol_element {
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__ */

View File

@ -35,13 +35,13 @@ static void* capwap_80211_rateset_element_parsing(capwap_message_elements_handle
length = func->read_ready(handle);
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;
}
length -= 1;
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;
}
@ -72,9 +72,10 @@ static void capwap_80211_rateset_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_rateset_ops = {
.create_message_element = capwap_80211_rateset_element_create,
.parsing_message_element = capwap_80211_rateset_element_parsing,
.clone_message_element = capwap_80211_rateset_element_clone,
.free_message_element = capwap_80211_rateset_element_free
const struct capwap_message_elements_ops capwap_element_80211_rateset_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_rateset_element_create,
.parse = capwap_80211_rateset_element_parsing,
.clone = capwap_80211_rateset_element_clone,
.free = capwap_80211_rateset_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_MAXLENGTH 8
@ -12,6 +15,6 @@ struct capwap_80211_rateset_element {
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__ */

View File

@ -61,7 +61,7 @@ static void* capwap_80211_rsnaerrorreport_element_parsing(capwap_message_element
ASSERT(func != NULL);
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;
}
@ -100,9 +100,10 @@ static void capwap_80211_rsnaerrorreport_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops = {
.create_message_element = capwap_80211_rsnaerrorreport_element_create,
.parsing_message_element = capwap_80211_rsnaerrorreport_element_parsing,
.clone_message_element = capwap_80211_rsnaerrorreport_element_clone,
.free_message_element = capwap_80211_rsnaerrorreport_element_free
const struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_rsnaerrorreport_element_create,
.parse = capwap_80211_rsnaerrorreport_element_parsing,
.clone = capwap_80211_rsnaerrorreport_element_clone,
.free = capwap_80211_rsnaerrorreport_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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 {
uint8_t client[MACADDRESS_EUI48_LENGTH];
@ -16,6 +19,6 @@ struct capwap_80211_rsnaerrorreport_element {
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__ */

View File

@ -46,13 +46,13 @@ static void* capwap_80211_station_element_parsing(capwap_message_elements_handle
length = func->read_ready(handle);
if (length < 14) {
capwap_logging_debug("Invalid IEEE 802.11 Station element");
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Station element");
return NULL;
}
length -= 13;
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;
}
@ -88,9 +88,10 @@ static void capwap_80211_station_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_station_ops = {
.create_message_element = capwap_80211_station_element_create,
.parsing_message_element = capwap_80211_station_element_parsing,
.clone_message_element = capwap_80211_station_element_clone,
.free_message_element = capwap_80211_station_element_free
const struct capwap_message_elements_ops capwap_element_80211_station_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_station_element_create,
.parse = capwap_80211_station_element_parsing,
.clone = capwap_80211_station_element_clone,
.free = capwap_80211_station_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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
@ -16,6 +19,6 @@ struct capwap_80211_station_element {
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__ */

View File

@ -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;
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);
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;
}
/* */
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->key = (uint8_t*)capwap_alloc(data->keylength);
memset(data, 0, sizeof(struct capwap_80211_stationkey_element));
/* Retrieve data */
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 = {
.create_message_element = capwap_80211_stationkey_element_create,
.parsing_message_element = capwap_80211_stationkey_element_parsing,
.clone_message_element = capwap_80211_stationkey_element_clone,
.free_message_element = capwap_80211_stationkey_element_free
const struct capwap_message_elements_ops capwap_element_80211_stationkey_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_stationkey_element_create,
.parse = capwap_80211_stationkey_element_parsing,
.clone = capwap_80211_stationkey_element_clone,
.free = capwap_80211_stationkey_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_RSC_LENGTH 6
@ -18,6 +21,6 @@ struct capwap_80211_stationkey_element {
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__ */

View File

@ -36,7 +36,7 @@ static void* capwap_80211_stationqos_element_parsing(capwap_message_elements_han
ASSERT(func != NULL);
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;
}
@ -67,9 +67,10 @@ static void capwap_80211_stationqos_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_stationqos_ops = {
.create_message_element = capwap_80211_stationqos_element_create,
.parsing_message_element = capwap_80211_stationqos_element_parsing,
.clone_message_element = capwap_80211_stationqos_element_clone,
.free_message_element = capwap_80211_stationqos_element_free
const struct capwap_message_elements_ops capwap_element_80211_stationqos_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_stationqos_element_create,
.parse = capwap_80211_stationqos_element_parsing,
.clone = capwap_80211_stationqos_element_clone,
.free = capwap_80211_stationqos_element_free
};

View File

@ -1,13 +1,16 @@
#ifndef __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 {
uint8_t address[MACADDRESS_EUI48_LENGTH];
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__ */

View File

@ -91,7 +91,7 @@ static void* capwap_80211_statistics_element_parsing(capwap_message_elements_han
ASSERT(func != NULL);
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;
}
@ -140,9 +140,10 @@ static void capwap_80211_statistics_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_statistics_ops = {
.create_message_element = capwap_80211_statistics_element_create,
.parsing_message_element = capwap_80211_statistics_element_parsing,
.clone_message_element = capwap_80211_statistics_element_clone,
.free_message_element = capwap_80211_statistics_element_free
const struct capwap_message_elements_ops capwap_element_80211_statistics_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_statistics_element_create,
.parse = capwap_80211_statistics_element_parsing,
.clone = capwap_80211_statistics_element_clone,
.free = capwap_80211_statistics_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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 {
uint8_t radioid;
@ -26,6 +29,6 @@ struct capwap_80211_statistics_element {
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__ */

View File

@ -35,13 +35,13 @@ static void* capwap_80211_supportedrates_element_parsing(capwap_message_elements
length = func->read_ready(handle);
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;
}
length -= 1;
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;
}
@ -72,9 +72,10 @@ static void capwap_80211_supportedrates_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops = {
.create_message_element = capwap_80211_supportedrates_element_create,
.parsing_message_element = capwap_80211_supportedrates_element_parsing,
.clone_message_element = capwap_80211_supportedrates_element_clone,
.free_message_element = capwap_80211_supportedrates_element_free
const struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_supportedrates_element_create,
.parse = capwap_80211_supportedrates_element_parsing,
.clone = capwap_80211_supportedrates_element_clone,
.free = capwap_80211_supportedrates_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_MAXLENGTH 8
@ -12,6 +15,6 @@ struct capwap_80211_supportedrates_element {
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__ */

View File

@ -35,7 +35,7 @@ static void* capwap_80211_txpower_element_parsing(capwap_message_elements_handle
ASSERT(func != NULL);
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;
}
@ -66,9 +66,10 @@ static void capwap_80211_txpower_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_txpower_ops = {
.create_message_element = capwap_80211_txpower_element_create,
.parsing_message_element = capwap_80211_txpower_element_parsing,
.clone_message_element = capwap_80211_txpower_element_clone,
.free_message_element = capwap_80211_txpower_element_free
const struct capwap_message_elements_ops capwap_element_80211_txpower_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_txpower_element_create,
.parse = capwap_80211_txpower_element_parsing,
.clone = capwap_80211_txpower_element_clone,
.free = capwap_80211_txpower_element_free
};

View File

@ -1,13 +1,16 @@
#ifndef __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 {
uint8_t radioid;
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__ */

View File

@ -40,13 +40,13 @@ static void* capwap_80211_txpowerlevel_element_parsing(capwap_message_elements_h
length = func->read_ready(handle);
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;
}
length -= 2;
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;
}
@ -60,7 +60,7 @@ static void* capwap_80211_txpowerlevel_element_parsing(capwap_message_elements_h
/* Check */
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);
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 = {
.create_message_element = capwap_80211_txpowerlevel_element_create,
.parsing_message_element = capwap_80211_txpowerlevel_element_parsing,
.clone_message_element = capwap_80211_txpowerlevel_element_clone,
.free_message_element = capwap_80211_txpowerlevel_element_free
const struct capwap_message_elements_ops capwap_element_80211_txpowerlevel_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_txpowerlevel_element_create,
.parse = capwap_80211_txpowerlevel_element_parsing,
.clone = capwap_80211_txpowerlevel_element_clone,
.free = capwap_80211_txpowerlevel_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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
@ -11,6 +14,6 @@ struct capwap_80211_txpowerlevel_element {
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__ */

View File

@ -47,7 +47,7 @@ static void* capwap_80211_updatestationqos_element_parsing(capwap_message_elemen
ASSERT(func != NULL);
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;
}
@ -83,9 +83,10 @@ static void capwap_80211_updatestationqos_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops = {
.create_message_element = capwap_80211_updatestationqos_element_create,
.parsing_message_element = capwap_80211_updatestationqos_element_parsing,
.clone_message_element = capwap_80211_updatestationqos_element_clone,
.free_message_element = capwap_80211_updatestationqos_element_free
const struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_updatestationqos_element_create,
.parse = capwap_80211_updatestationqos_element_parsing,
.clone = capwap_80211_updatestationqos_element_clone,
.free = capwap_80211_updatestationqos_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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
@ -19,6 +22,6 @@ struct capwap_80211_updatestationqos_element {
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__ */

View File

@ -73,7 +73,7 @@ static void* capwap_80211_updatewlan_element_parsing(capwap_message_elements_han
length = func->read_ready(handle);
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;
}
@ -93,7 +93,7 @@ static void* capwap_80211_updatewlan_element_parsing(capwap_message_elements_han
if (length != data->keylength) {
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;
} else if (data->keylength > 0) {
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 = {
.create_message_element = capwap_80211_updatewlan_element_create,
.parsing_message_element = capwap_80211_updatewlan_element_parsing,
.clone_message_element = capwap_80211_updatewlan_element_clone,
.free_message_element = capwap_80211_updatewlan_element_free
const struct capwap_message_elements_ops capwap_element_80211_updatewlan_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
.create = capwap_80211_updatewlan_element_create,
.parse = capwap_80211_updatewlan_element_parsing,
.clone = capwap_80211_updatewlan_element_clone,
.free = capwap_80211_updatewlan_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_IBSS 0x4000
@ -34,6 +37,6 @@ struct capwap_80211_updatewlan_element {
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__ */

View File

@ -51,7 +51,7 @@ static void* capwap_80211_wtpqos_element_parsing(capwap_message_elements_handle
ASSERT(func != NULL);
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;
}
@ -91,9 +91,10 @@ static void capwap_80211_wtpqos_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops = {
.create_message_element = capwap_80211_wtpqos_element_create,
.parsing_message_element = capwap_80211_wtpqos_element_parsing,
.clone_message_element = capwap_80211_wtpqos_element_clone,
.free_message_element = capwap_80211_wtpqos_element_free
const struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_wtpqos_element_create,
.parse = capwap_80211_wtpqos_element_parsing,
.clone = capwap_80211_wtpqos_element_clone,
.free = capwap_80211_wtpqos_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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_VIDEO 1
@ -29,6 +32,6 @@ struct capwap_80211_wtpqos_element {
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__ */

View File

@ -44,7 +44,7 @@ static void* capwap_80211_wtpradioconf_element_parsing(capwap_message_elements_h
ASSERT(func != NULL);
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;
}
@ -79,9 +79,10 @@ static void capwap_80211_wtpradioconf_element_free(void* data) {
}
/* */
struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops = {
.create_message_element = capwap_80211_wtpradioconf_element_create,
.parsing_message_element = capwap_80211_wtpradioconf_element_parsing,
.clone_message_element = capwap_80211_wtpradioconf_element_clone,
.free_message_element = capwap_80211_wtpradioconf_element_free
const struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops = {
.category = CAPWAP_MESSAGE_ELEMENT_ARRAY,
.create = capwap_80211_wtpradioconf_element_create,
.parse = capwap_80211_wtpradioconf_element_parsing,
.clone = capwap_80211_wtpradioconf_element_clone,
.free = capwap_80211_wtpradioconf_element_free
};

View File

@ -1,7 +1,10 @@
#ifndef __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
@ -18,6 +21,6 @@ struct capwap_80211_wtpradioconf_element {
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__ */

Some files were not shown because too many files have changed in this diff Show More