Compare commits
52 Commits
Author | SHA1 | Date | |
---|---|---|---|
cee735bf62 | |||
a4fed97eba | |||
efd9eedd51 | |||
f869a22beb | |||
4068f7d308 | |||
6dcf8fa350 | |||
6681f5800a | |||
cb6e5ce35b | |||
543fc7298b | |||
ec332d3e41 | |||
cd7e97dfce | |||
5ae709f1bc | |||
653a785003 | |||
9138408fa6 | |||
6ce434bc9b | |||
85b3088c55 | |||
8d594903f5 | |||
ec1fea6930 | |||
f571f4b2f7 | |||
fc2149e345 | |||
a631f89729 | |||
63b4dbe91d | |||
a500f104e1 | |||
3869271509 | |||
f4a2bae666 | |||
7bb46f9927 | |||
a6d5b88a1b | |||
0101ea6e56 | |||
8cc6559f08 | |||
de0ffd5153 | |||
627ecd5a9e | |||
0df59ddaad | |||
9b7e282d52 | |||
ff290d80b5 | |||
c57eaca805 | |||
76cd5d7484 | |||
a488af66cf | |||
ac135e16c4 | |||
6f7c26d0af | |||
fdf256553c | |||
ecf7a24eac | |||
57bcb0e183 | |||
9fbf441896 | |||
01919fffd9 | |||
02e8d534b5 | |||
3626927722 | |||
2ac3944e7a | |||
a131e17a6e | |||
0e19b53e28 | |||
9ded0bb87b | |||
b0aaaa4436 | |||
6024cc15cf |
@ -1,4 +1,4 @@
|
||||
This is a GPLv2 only fork of SmartCAWAP. The original project
|
||||
This is a GPLv2 only fork of SmartCAPWAP. The original project
|
||||
can be found here: https://bitbucket.org/vemax78/smartcapwap
|
||||
|
||||
All changes and contribution to this fork are GPL licensed only.
|
||||
|
31
Makefile.am
31
Makefile.am
@ -1,6 +1,7 @@
|
||||
# SmartCAPWAP -- An Open Source CAPWAP WTP / AC
|
||||
# FreeWTP -- An Open Source CAPWAP WTP
|
||||
#
|
||||
# Copyright (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
# Copyright SmartCAPWAP (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
# Copyright FreeWTP (C) 2016 Travelping GmbH <info@travelping.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@ -23,20 +24,24 @@ ACLOCAL_AMFLAGS = -I m4
|
||||
MAINTAINERCLEANFILES = $(srcdir)/config.log \
|
||||
$(srcdir)/config.status \
|
||||
$(srcdir)/Makefile.in \
|
||||
$(srcdir)/config.h.in \
|
||||
$(srcdir)/config.h.in~ \
|
||||
$(srcdir)/lib/Makefile.in \
|
||||
$(srcdir)/src/Makefile.in \
|
||||
$(srcdir)/lib/config.h.in \
|
||||
$(srcdir)/lib/config.h.in~ \
|
||||
$(srcdir)/configure \
|
||||
$(srcdir)/build/install-sh \
|
||||
$(srcdir)/ltmain.sh \
|
||||
$(srcdir)/build/missing \
|
||||
$(srcdir)/config/install-sh \
|
||||
$(srcdir)/config/ltmain.sh \
|
||||
$(srcdir)/config/compile \
|
||||
$(srcdir)/config/missing \
|
||||
$(srcdir)/config/ar-lib \
|
||||
$(srcdir)/config/depcomp \
|
||||
$(srcdir)/config/config.guess \
|
||||
$(srcdir)/config/config.sub \
|
||||
$(srcdir)/m4/libtool.m4 \
|
||||
$(srcdir)/m4/lt~obsolete.m4 \
|
||||
$(srcdir)/m4/ltoptions.m4 \
|
||||
$(srcdir)/m4/ltsugar.m4 \
|
||||
$(srcdir)/m4/ltversion.m4 \
|
||||
$(srcdir)/depcomp \
|
||||
$(srcdir)/aclocal.m4 \
|
||||
$(srcdir)/build/config.guess \
|
||||
$(srcdir)/build/config.sub
|
||||
$(srcdir)/m4/lt~obsolete.m4 \
|
||||
$(srcdir)/aclocal.m4
|
||||
|
||||
SUBDIRS = build
|
||||
SUBDIRS = lib src
|
||||
|
36
NEWS.md
36
NEWS.md
@ -1,7 +1,37 @@
|
||||
SmartCAPWAP
|
||||
===========
|
||||
FreeWTP
|
||||
=======
|
||||
|
||||
CAPWAP WTP and AC implementation
|
||||
Open Source CAPWAP WTP implementation
|
||||
|
||||
Version 1.4.0 - 22 Aug 2016
|
||||
---------------------------
|
||||
|
||||
* renamed to FreeWTP
|
||||
* RFC-7494 support
|
||||
* fix DTLS handshake failure handling
|
||||
|
||||
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
|
||||
---------------------------
|
||||
|
36
README.md
36
README.md
@ -1,12 +1,12 @@
|
||||
# README
|
||||
|
||||
[RFC-5415](https://tools.ietf.org/html/rfc5415) and [RFC-5416](https://tools.ietf.org/html/rfc5416) compliant CAPWAP WTP (and AC) implementation.
|
||||
[RFC-5415](https://tools.ietf.org/html/rfc5415) and [RFC-5416](https://tools.ietf.org/html/rfc5416) compliant CAPWAP WTP implementation.
|
||||
|
||||
This fork is currently focusing on the WTP side only.
|
||||
This project started as a fork of SmartCAPWAP, but has since dropped the AC part on focuses on WTP functionality only (hence the new name).
|
||||
|
||||
## STATUS
|
||||
|
||||
NOTE: The WTP has been ported to libev, the AC has not been adjusted and is therefor broken for the moment.
|
||||
NOTE: The WTP implementation has been ported to libev
|
||||
|
||||
### WTP tested and working features:
|
||||
|
||||
@ -17,6 +17,7 @@ NOTE: The WTP has been ported to libev, the AC has not been adjusted and is ther
|
||||
* 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. The following devices
|
||||
have been tested:
|
||||
@ -26,7 +27,8 @@ have been tested:
|
||||
|
||||
### Planned WTP features:
|
||||
|
||||
* encryption (WPA2)
|
||||
* WPA2 Enterprise
|
||||
* 802.11r - BSS fast transition
|
||||
* Hybrid-MAC ([RFC-7494](https://tools.ietf.org/html/rfc7494))
|
||||
|
||||
## INSTALLATION
|
||||
@ -60,9 +62,33 @@ WolfSSL:
|
||||
make
|
||||
make install
|
||||
|
||||
SmartCAPWAP:
|
||||
FreeWTP:
|
||||
|
||||
autoreconf -f -i
|
||||
./configure --disable-ac
|
||||
make
|
||||
make install
|
||||
|
||||
### Debugging / Tracing
|
||||
|
||||
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
|
||||
|
@ -1,30 +0,0 @@
|
||||
# SmartCAPWAP -- An Open Source CAPWAP WTP / AC
|
||||
#
|
||||
# Copyright (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program (see the file COPYING included with this
|
||||
# distribution); if not, write to the Free Software Foundation, Inc.,
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
|
||||
|
||||
SUBDIRS =
|
||||
|
||||
if BUILD_AC
|
||||
SUBDIRS += ac
|
||||
endif
|
||||
|
||||
if BUILD_WTP
|
||||
SUBDIRS += wtp
|
||||
endif
|
@ -1,110 +0,0 @@
|
||||
# SmartCAPWAP -- An Open Source CAPWAP WTP / AC
|
||||
#
|
||||
# Copyright (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program (see the file COPYING included with this
|
||||
# distribution); if not, write to the Free Software Foundation, Inc.,
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
capwap_SOURCES = $(top_srcdir)/src/common/capwap.c \
|
||||
$(top_srcdir)/src/common/capwap_timeout.c \
|
||||
$(top_srcdir)/src/common/capwap_network.c \
|
||||
$(top_srcdir)/src/common/capwap_protocol.c \
|
||||
$(top_srcdir)/src/common/capwap_logging.c \
|
||||
$(top_srcdir)/src/common/capwap_list.c \
|
||||
$(top_srcdir)/src/common/capwap_array.c \
|
||||
$(top_srcdir)/src/common/capwap_hash.c \
|
||||
$(top_srcdir)/src/common/capwap_dtls.c \
|
||||
$(top_srcdir)/src/common/capwap_dfa.c \
|
||||
$(top_srcdir)/src/common/capwap_element.c \
|
||||
$(top_srcdir)/src/common/capwap_element_acdescriptor.c \
|
||||
$(top_srcdir)/src/common/capwap_element_actimestamp.c \
|
||||
$(top_srcdir)/src/common/capwap_element_addmacacl.c \
|
||||
$(top_srcdir)/src/common/capwap_element_deletemacacl.c \
|
||||
$(top_srcdir)/src/common/capwap_element_addstation.c \
|
||||
$(top_srcdir)/src/common/capwap_element_deletestation.c \
|
||||
$(top_srcdir)/src/common/capwap_element_discoverytype.c \
|
||||
$(top_srcdir)/src/common/capwap_element_duplicateipv4.c \
|
||||
$(top_srcdir)/src/common/capwap_element_duplicateipv6.c \
|
||||
$(top_srcdir)/src/common/capwap_element_datatransferdata.c \
|
||||
$(top_srcdir)/src/common/capwap_element_datatransfermode.c \
|
||||
$(top_srcdir)/src/common/capwap_element_decrypterrorreport.c \
|
||||
$(top_srcdir)/src/common/capwap_element_imagedata.c \
|
||||
$(top_srcdir)/src/common/capwap_element_imageinfo.c \
|
||||
$(top_srcdir)/src/common/capwap_element_initdownload.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpboarddata.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpdescriptor.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpframetunnelmode.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpmactype.c \
|
||||
$(top_srcdir)/src/common/capwap_element_acname.c \
|
||||
$(top_srcdir)/src/common/capwap_element_controlipv4.c \
|
||||
$(top_srcdir)/src/common/capwap_element_controlipv6.c \
|
||||
$(top_srcdir)/src/common/capwap_element_location.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpname.c \
|
||||
$(top_srcdir)/src/common/capwap_element_sessionid.c \
|
||||
$(top_srcdir)/src/common/capwap_element_ecnsupport.c \
|
||||
$(top_srcdir)/src/common/capwap_element_localipv4.c \
|
||||
$(top_srcdir)/src/common/capwap_element_localipv6.c \
|
||||
$(top_srcdir)/src/common/capwap_element_transport.c \
|
||||
$(top_srcdir)/src/common/capwap_element_mtudiscovery.c \
|
||||
$(top_srcdir)/src/common/capwap_element_vendorpayload.c \
|
||||
$(top_srcdir)/src/common/capwap_element_maximumlength.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtprebootstat.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpradiostat.c \
|
||||
$(top_srcdir)/src/common/capwap_element_resultcode.c \
|
||||
$(top_srcdir)/src/common/capwap_element_returnedmessage.c \
|
||||
$(top_srcdir)/src/common/capwap_element_acipv4list.c \
|
||||
$(top_srcdir)/src/common/capwap_element_acipv6list.c \
|
||||
$(top_srcdir)/src/common/capwap_element_imageidentifier.c \
|
||||
$(top_srcdir)/src/common/capwap_element_radioadmstate.c \
|
||||
$(top_srcdir)/src/common/capwap_element_statisticstimer.c \
|
||||
$(top_srcdir)/src/common/capwap_element_acnamepriority.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpstaticipaddress.c \
|
||||
$(top_srcdir)/src/common/capwap_element_timers.c \
|
||||
$(top_srcdir)/src/common/capwap_element_decrypterrorreportperiod.c \
|
||||
$(top_srcdir)/src/common/capwap_element_idletimeout.c \
|
||||
$(top_srcdir)/src/common/capwap_element_wtpfallback.c \
|
||||
$(top_srcdir)/src/common/capwap_element_radiooprstate.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_addwlan.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_antenna.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_assignbssid.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_deletewlan.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_directsequencecontrol.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_ie.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_macoperation.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_miccountermeasures.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_multidomaincapability.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_ofdmcontrol.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_rateset.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_rsnaerrorreport.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_station.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_stationqos.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_stationkey.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_statistics.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_supportedrates.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_txpower.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_txpowerlevel.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_updatestationqos.c \
|
||||
$(top_srcdir)/src/common/capwap_element_80211_updatewlan.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_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
|
||||
endif
|
@ -1,90 +0,0 @@
|
||||
# SmartCAPWAP -- An Open Source CAPWAP WTP / AC
|
||||
#
|
||||
# Copyright (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program (see the file COPYING included with this
|
||||
# distribution); if not, write to the Free Software Foundation, Inc.,
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
|
||||
|
||||
bin_PROGRAMS = ac
|
||||
|
||||
AM_CFLAGS = -DCAPWAP_MULTITHREADING_ENABLE \
|
||||
-D_REENTRANT \
|
||||
-D_GNU_SOURCE \
|
||||
${LIBNL_CFLAGS} \
|
||||
$(LIBXML2_CFLAGS) \
|
||||
$(WOLFSSL_CFLAGS)
|
||||
|
||||
AM_CFLAGS += -I$(top_srcdir)/build \
|
||||
-I$(top_srcdir)/src/common \
|
||||
-I$(top_srcdir)/src/ac \
|
||||
-I$(top_srcdir)/src/ac/kmod \
|
||||
-I$(top_srcdir)/src/common/binding/ieee80211
|
||||
|
||||
include $(top_srcdir)/build/Makefile_common.am
|
||||
|
||||
ac_SOURCES = $(capwap_SOURCES) \
|
||||
$(top_srcdir)/src/common/capwap_event.c \
|
||||
$(top_srcdir)/src/common/capwap_lock.c \
|
||||
$(top_srcdir)/src/common/capwap_rwlock.c \
|
||||
$(top_srcdir)/src/common/capwap_socket.c \
|
||||
$(top_srcdir)/src/ac/ac.c \
|
||||
$(top_srcdir)/src/ac/ac_backend.c \
|
||||
$(top_srcdir)/src/ac/ac_execute.c \
|
||||
$(top_srcdir)/src/ac/ac_session.c \
|
||||
$(top_srcdir)/src/ac/ac_wlans.c \
|
||||
$(top_srcdir)/src/ac/ac_kmod.c \
|
||||
$(top_srcdir)/src/ac/ac_ieee80211_data.c \
|
||||
$(top_srcdir)/src/ac/ac_discovery.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_addwlan.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_antenna.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_assignbssid.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_deletewlan.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_directsequencecontrol.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_ie.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_macoperation.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_miccountermeasures.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_multidomaincapability.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_ofdmcontrol.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_rateset.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_rsnaerrorreport.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_statistics.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_supportedrates.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_txpower.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_txpowerlevel.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_updatewlan.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_wtpqos.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_wtpradioconf.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_wtpradiofailalarm.c \
|
||||
$(top_srcdir)/src/ac/ac_80211_json_wtpradioinformation.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_join.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_configure.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_imagedata.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_datacheck.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_dtls.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_run.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_reset.c \
|
||||
$(top_srcdir)/src/ac/ac_dfa_teardown.c \
|
||||
$(top_srcdir)/src/ac/ac_soap.c \
|
||||
$(top_srcdir)/src/common/binding/ieee80211/ieee80211.c
|
||||
|
||||
ac_LDADD = $(CONFIG_LIBS) \
|
||||
$(PTHREAD_LIBS) \
|
||||
$(LIBXML2_LIBS) \
|
||||
$(LIBJSON_LIBS) \
|
||||
$(WOLFSSL_LIBS) \
|
||||
$(LIBNL_LIBS)
|
@ -1,71 +0,0 @@
|
||||
# SmartCAPWAP -- An Open Source CAPWAP WTP / AC
|
||||
#
|
||||
# Copyright (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program (see the file COPYING included with this
|
||||
# distribution); if not, write to the Free Software Foundation, Inc.,
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
|
||||
|
||||
bin_PROGRAMS = wtp
|
||||
|
||||
AM_CFLAGS = -D_REENTRANT \
|
||||
-D_GNU_SOURCE \
|
||||
-fno-strict-aliasing \
|
||||
${LIBNL_CFLAGS}
|
||||
|
||||
if DTLS_ENABLED
|
||||
AM_CFLAGS += $(WOLFSSL_CFLAGS)
|
||||
endif
|
||||
|
||||
AM_CFLAGS += -I$(top_srcdir)/build \
|
||||
-I$(top_srcdir)/src/common \
|
||||
-I$(top_srcdir)/src/wtp \
|
||||
-I$(top_srcdir)/src/wtp/kmod \
|
||||
-I$(top_srcdir)/src/common/binding/ieee80211 \
|
||||
-I$(top_srcdir)/src/wtp/binding/ieee80211
|
||||
|
||||
include $(top_srcdir)/build/Makefile_common.am
|
||||
|
||||
wtp_SOURCES = $(capwap_SOURCES) \
|
||||
$(top_srcdir)/src/wtp/wtp.c \
|
||||
$(top_srcdir)/src/wtp/wtp_kmod.c \
|
||||
$(top_srcdir)/src/wtp/wtp_element_helper.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_idle.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_discovery.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_sulking.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_dtls.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_join.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_configure.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_datacheck.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_run.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_reset.c \
|
||||
$(top_srcdir)/src/wtp/wtp_dfa_imagedata.c \
|
||||
$(top_srcdir)/src/wtp/wtp_radio.c \
|
||||
$(top_srcdir)/src/common/binding/ieee80211/ieee80211.c \
|
||||
$(top_srcdir)/src/wtp/binding/ieee80211/netlink_link.c \
|
||||
$(top_srcdir)/src/wtp/binding/ieee80211/wifi_drivers.c
|
||||
|
||||
wtp_LDADD = $(CONFIG_LIBS) \
|
||||
$(LIBNL_LIBS)
|
||||
|
||||
if DTLS_ENABLED
|
||||
wtp_LDADD += $(WOLFSSL_LIBS)
|
||||
endif
|
||||
|
||||
if BUILD_WTP_WIFI_DRIVERS_NL80211
|
||||
wtp_SOURCES += $(top_srcdir)/src/wtp/binding/ieee80211/wifi_nl80211.c
|
||||
endif
|
65
configure.ac
65
configure.ac
@ -1,6 +1,7 @@
|
||||
# SmartCAPWAP -- An Open Source CAPWAP WTP / AC
|
||||
# FreeWTP -- An Open Source CAPWAP AC
|
||||
#
|
||||
# Copyright (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
# Copyright (C) 2016 Travelping GmbH <info@travelping.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@ -19,20 +20,26 @@
|
||||
|
||||
AC_PREREQ(2.63)
|
||||
|
||||
AC_INIT([SmartCAPWAP], [1.2], [https://github.com/travelping/smartcapwap], [smartcapwap])
|
||||
AC_CONFIG_AUX_DIR([build])
|
||||
AC_INIT([freewtp], [1.3.0], [https://github.com/travelping/freewtp], [freewtp])
|
||||
AC_CONFIG_AUX_DIR([config])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AM_INIT_AUTOMAKE([1.11 -Wall])
|
||||
AM_INIT_AUTOMAKE([1.11 -Wall foreign subdir-objects silent-rules])
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
AM_SILENT_RULES([yes])
|
||||
|
||||
# cross-compile macros
|
||||
AC_CANONICAL_BUILD
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
#
|
||||
AC_COPYRIGHT("SmartCapwap by Massimo Vellucci <vemax78@gmail.com>")
|
||||
AC_COPYRIGHT("FreeWTP by Travelping <info@travelping.com>")
|
||||
AC_REVISION($Revision: 1.0 $)
|
||||
|
||||
#
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
#
|
||||
AC_PROG_INSTALL
|
||||
AC_LANG(C)
|
||||
@ -60,16 +67,6 @@ AC_ARG_ENABLE(
|
||||
[enable_logging="yes"]
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE([ac],
|
||||
[AS_HELP_STRING([--enable-ac], [enable ac support])])
|
||||
|
||||
AC_ARG_ENABLE(
|
||||
[wtp],
|
||||
[AS_HELP_STRING([--disable-wtp], [disable wtp support])],
|
||||
,
|
||||
[enable_wtp="yes"]
|
||||
)
|
||||
|
||||
AC_ARG_WITH(
|
||||
[mem-check],
|
||||
[AS_HELP_STRING([--with-mem-check=TYPE], [build with debug memory checking, TYPE=no|internal|valgrind])],
|
||||
@ -91,12 +88,15 @@ AC_ARG_ENABLE(
|
||||
)
|
||||
|
||||
# specify output header file
|
||||
AM_CONFIG_HEADER(build/config.h)
|
||||
AM_CONFIG_HEADER(lib/config.h)
|
||||
|
||||
#
|
||||
old_CFLAGS="${CFLAGS}"
|
||||
AC_PROG_CC([gcc])
|
||||
CFLAGS="${old_CFLAGS}"
|
||||
AC_PROG_CC_C99
|
||||
AC_PROG_CPP
|
||||
AM_PROG_CC_C_O
|
||||
AM_PROG_AR
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
#
|
||||
AM_CONDITIONAL([DEBUG_BUILD], [test "$enable_debug" = yes])
|
||||
@ -171,32 +171,11 @@ LDFLAGS="$saved_LDFLAGS"
|
||||
|
||||
AC_DEFINE_UNQUOTED([LIBCONFIG_LOOKUP_INT_ARG], [$LIBCONFIG_LOOKUP_INT_ARG], [config_lookup_int() argument type])
|
||||
|
||||
# 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"])
|
||||
|
||||
# Check JSON library
|
||||
if test "${enable_ac}" = "yes"; then
|
||||
test "x${have_wolfssl_ssl}" != "xyes" && AC_MSG_ERROR(You need the wolfssl library)
|
||||
|
||||
PKG_CHECK_MODULES(
|
||||
[LIBJSON],
|
||||
[json-c >= 0.11],
|
||||
[],
|
||||
[AC_MSG_ERROR(You need the libjson)]
|
||||
)
|
||||
|
||||
# Check XML2 library
|
||||
PKG_CHECK_MODULES(
|
||||
[LIBXML2],
|
||||
[libxml-2.0 >= 2.6]
|
||||
)
|
||||
fi
|
||||
|
||||
# Check Netlink library
|
||||
PKG_CHECK_MODULES(
|
||||
[LIBNL3],
|
||||
@ -256,10 +235,6 @@ case "${with_mem_check}" in
|
||||
;;
|
||||
esac
|
||||
|
||||
#
|
||||
AM_CONDITIONAL([BUILD_AC], [test "${enable_ac}" = "yes"])
|
||||
AM_CONDITIONAL([BUILD_WTP], [test "${enable_wtp}" = "yes"])
|
||||
|
||||
#
|
||||
test "${enable_logging}" = "yes" && AC_DEFINE([ENABLE_LOGGING], [1], [Enable logging])
|
||||
|
||||
@ -271,14 +246,12 @@ AM_CONDITIONAL([DTLS_ENABLED], [test "${enable_dtls}" = "yes"])
|
||||
AC_SUBST([SSL_CFLAGS])
|
||||
AC_SUBST([SSL_LIBS])
|
||||
AC_SUBST([CONFIG_LIBS])
|
||||
AC_SUBST([PTHREAD_LIBS])
|
||||
|
||||
#
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
build/Makefile
|
||||
build/ac/Makefile
|
||||
build/wtp/Makefile
|
||||
lib/Makefile
|
||||
src/Makefile
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
|
35
docker-build/Dockerfile
Normal file
35
docker-build/Dockerfile
Normal file
@ -0,0 +1,35 @@
|
||||
FROM ubuntu:16.04
|
||||
# we would love to use alpine as the build-image
|
||||
# but unfortunately lede-build still fails with
|
||||
# it when build some host-utils.
|
||||
|
||||
ARG LEDE_REVISION=e9c517772cee8af63b4ef173a28152645a4e1b05
|
||||
ARG FREEWTP_REVISION=a4fed97ebafbfb07ded50e102be4a46fc9ac7cf3
|
||||
|
||||
RUN apt-get -y update && apt-get -y install \
|
||||
build-essential \
|
||||
python unzip gawk wget openssl git-core subversion \
|
||||
libssl-dev ncurses-dev
|
||||
|
||||
RUN mkdir /build
|
||||
WORKDIR /build
|
||||
|
||||
RUN cd /build ; \
|
||||
git clone https://git.lede-project.org/source.git lede ; \
|
||||
cd lede ; git checkout -b docker_build $LEDE_REVISION
|
||||
|
||||
RUN cd /build ; \
|
||||
git clone https://github.com/travelping/freewtp ; \
|
||||
cd freewtp ; git checkout -b docker_build $FREEWTP_REVISION
|
||||
|
||||
RUN cp /build/lede/feeds.conf.default /build/lede/feeds.conf ; echo "src-link freewtp /build/freewtp/openwrt" >> /build/lede/feeds.conf
|
||||
RUN cd /build/lede ; ./scripts/feeds update -a && ./scripts/feeds install -a && ./scripts/feeds list -r freewtp
|
||||
|
||||
RUN cp -v /build/freewtp/openwrt/mac80211_patches/922-mac80211_packet_tunnel-linux-4.8.patch /build/lede/package/kernel/mac80211/patches/
|
||||
RUN cd /build/lede ; patch -p1 -i /build/freewtp/openwrt/mac80211_patches/package-config-option.patch
|
||||
|
||||
ADD ./dot-lede-config /build/lede/.config
|
||||
|
||||
RUN cd /build/lede ; make defconfig
|
||||
RUN cd /build/lede ; make -j10 BUILD_LOG=1 FORCE_UNSAFE_CONFIGURE=1 ; rm -rf staging_dir build_dir
|
||||
|
46
docker-build/dot-lede-config
Normal file
46
docker-build/dot-lede-config
Normal file
@ -0,0 +1,46 @@
|
||||
CONFIG_IB=y
|
||||
CONFIG_SDK=y
|
||||
CONFIG_TARGET_ramips=y
|
||||
CONFIG_TARGET_ramips_mt7621=y
|
||||
CONFIG_TARGET_ramips_mt7621_DEVICE_zbt-wg2626=y
|
||||
CONFIG_PACKAGE_comgt=y
|
||||
CONFIG_PACKAGE_comgt-directip=y
|
||||
CONFIG_PACKAGE_comgt-ncm=y
|
||||
CONFIG_PACKAGE_freewtp=y
|
||||
CONFIG_PACKAGE_kmod-usb-acm=y
|
||||
CONFIG_PACKAGE_kmod-usb-net=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-cdc-eem=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-cdc-ether=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-cdc-mbim=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-cdc-ncm=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-hso=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-qmi-wwan=y
|
||||
CONFIG_PACKAGE_kmod-usb-net-sierrawireless=y
|
||||
CONFIG_PACKAGE_kmod-usb-serial=y
|
||||
CONFIG_PACKAGE_kmod-usb-serial-ipw=y
|
||||
CONFIG_PACKAGE_kmod-usb-serial-option=y
|
||||
CONFIG_PACKAGE_kmod-usb-serial-qualcomm=y
|
||||
CONFIG_PACKAGE_kmod-usb-serial-sierrawireless=y
|
||||
CONFIG_PACKAGE_kmod-usb-serial-wwan=y
|
||||
CONFIG_PACKAGE_kmod-usb-wdm=y
|
||||
CONFIG_PACKAGE_libustream-cyassl=y
|
||||
CONFIG_PACKAGE_luci-app-freewtp=y
|
||||
CONFIG_PACKAGE_luci-app-firewall=y
|
||||
CONFIG_PACKAGE_luci-mod-admin-full=y
|
||||
CONFIG_PACKAGE_luci-proto-3g=y
|
||||
CONFIG_PACKAGE_luci-proto-ppp=y
|
||||
CONFIG_PACKAGE_luci-theme-bootstrap=y
|
||||
CONFIG_PACKAGE_libiwinfo-lua=y
|
||||
CONFIG_PACKAGE_px5g-standalone=y
|
||||
CONFIG_PACKAGE_smstools3=y
|
||||
CONFIG_PACKAGE_uhttpd=y
|
||||
CONFIG_PACKAGE_uhttpd-mod-lua=y
|
||||
CONFIG_PACKAGE_uhttpd-mod-tls=y
|
||||
CONFIG_PACKAGE_uhttpd-mod-tls_cyassl=y
|
||||
CONFIG_PACKAGE_umbim=y
|
||||
CONFIG_PACKAGE_uqmi=y
|
||||
CONFIG_PACKAGE_usb-modeswitch=y
|
||||
CONFIG_PACKAGE_usbreset=y
|
||||
CONFIG_PACKAGE_usbutils=y
|
||||
CONFIG_PACKAGE_wwan=y
|
10
docker-build/update.sh
Executable file
10
docker-build/update.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
lede=$(git ls-remote https://git.lede-project.org/source.git | grep 'refs/heads/master$' | cut -f1)
|
||||
freewtp=$(git ls-remote https://github.com/travelping/freewtp | grep 'refs/heads/master$' | cut -f1)
|
||||
|
||||
echo "found upstream ref to lede master: $lede"
|
||||
echo "found upstream ref to freewtp master: $freewtp"
|
||||
|
||||
|
||||
sed -i "s/^ARG LEDE_REVISION=.*$/ARG LEDE_REVISION=$lede/" Dockerfile
|
||||
sed -i "s/^ARG FREEWTP_REVISION=.*$/ARG FREEWTP_REVISION=$freewtp/" Dockerfile
|
@ -12,9 +12,9 @@ application: {
|
||||
binding = "802.11";
|
||||
|
||||
tunnelmode: {
|
||||
nativeframe = false;
|
||||
ethframe = false;
|
||||
localbridging = true;
|
||||
nativeframe = true;
|
||||
ethframe = true;
|
||||
localbridging = false;
|
||||
};
|
||||
|
||||
mactype = "localmac";
|
@ -1,7 +1,9 @@
|
||||
obj-m += smartcapwap.o
|
||||
obj-m += wtp.o
|
||||
|
||||
smartcapwap-y := \
|
||||
wtp-y := \
|
||||
main.o \
|
||||
netlinkapp.o \
|
||||
capwap.o \
|
||||
capwap_private.o
|
||||
|
||||
CFLAGS_capwap.o = -I$(src)
|
486
kmod/capwap-trace.h
Normal file
486
kmod/capwap-trace.h
Normal file
@ -0,0 +1,486 @@
|
||||
#if !defined(__CAPWAP_DRIVER_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __CAPWAP_DRIVER_TRACE_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <net/mac80211.h>
|
||||
#include "capwap.h"
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM capwap
|
||||
|
||||
#define SESSION_ENTRY __array(char, sessionid, 16)
|
||||
#define SESSION_ASSIGN ((session) ? memcpy(__entry->sessionid, &session->sessionid, 16) : memset(__entry->sessionid, 0, 16))
|
||||
#define SESSION_PR_FMT " session:%16phN"
|
||||
#define SESSION_PR_ARG __entry->sessionid
|
||||
|
||||
#define SESSIONID_ENTRY __array(char, sessionid, 16)
|
||||
#define SESSIONID_ASSIGN ((sessionid) ? memcpy(__entry->sessionid, sessionid, 16) : memset(__entry->sessionid, 0, 16))
|
||||
#define SESSIONID_PR_FMT " session:%16phN"
|
||||
#define SESSIONID_PR_ARG __entry->sessionid
|
||||
|
||||
#define SKB_ENTRY __field(struct sk_buff *, skb)
|
||||
#define SKB_ASSIGN __entry->skb = skb
|
||||
#define SKB_PR_FMT " skb:%p"
|
||||
#define SKB_PR_ARG __entry->skb
|
||||
|
||||
#define FRAGMENT_ENTRY __field(struct sc_capwap_fragment *, fragment)
|
||||
#define FRAGMENT_ASSIGN __entry->fragment = fragment
|
||||
#define FRAGMENT_PR_FMT " frag:%p"
|
||||
#define FRAGMENT_PR_ARG __entry->fragment
|
||||
|
||||
#define BSSID_ENTRY __array(char, bssid, ETH_ALEN)
|
||||
#define BSSID_ASSIGN (bssid ? memcpy(__entry->bssid, bssid, ETH_ALEN) : memset(__entry->bssid, 0, ETH_ALEN))
|
||||
#define BSSID_PR_FMT " BSS:%pM"
|
||||
#define BSSID_PR_ARG __entry->bssid
|
||||
|
||||
/* capwap.c */
|
||||
|
||||
TRACE_EVENT(sc_capwap_fragment_free,
|
||||
TP_PROTO(struct sc_capwap_fragment *fragment),
|
||||
|
||||
TP_ARGS(fragment),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
FRAGMENT_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
FRAGMENT_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(FRAGMENT_PR_FMT, FRAGMENT_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_freesession,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_defrag_evictor,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_defrag_evictor_fragment_expired,
|
||||
TP_PROTO(struct sc_capwap_session *session,
|
||||
struct sc_capwap_fragment *fragment,
|
||||
ktime_t now),
|
||||
|
||||
TP_ARGS(session,
|
||||
fragment,
|
||||
now),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
FRAGMENT_ENTRY
|
||||
__field(u64, now)
|
||||
__field(u64, tstamp)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
FRAGMENT_ASSIGN;
|
||||
__entry->now = now.tv64;
|
||||
__entry->tstamp = fragment->tstamp.tv64;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT FRAGMENT_PR_FMT " (%llu %llu)",
|
||||
SESSION_PR_ARG, FRAGMENT_PR_ARG,
|
||||
__entry->now,
|
||||
__entry->tstamp
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_reasm,
|
||||
TP_PROTO(struct sc_capwap_fragment *fragment),
|
||||
|
||||
TP_ARGS(fragment),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
FRAGMENT_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
FRAGMENT_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(FRAGMENT_PR_FMT, FRAGMENT_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_defrag,
|
||||
TP_PROTO(struct sc_capwap_session *session,
|
||||
uint16_t id,
|
||||
uint16_t offset,
|
||||
uint16_t length),
|
||||
|
||||
TP_ARGS(session, id, offset, length),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
__field(u16, id)
|
||||
__field(u16, offset)
|
||||
__field(u16, length)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
__entry->id = id;
|
||||
__entry->offset = offset;
|
||||
__entry->length = length;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
SESSION_PR_FMT " fragment id:%hu offset:%hu length:%hu",
|
||||
SESSION_PR_ARG, __entry->id, __entry->offset, __entry->length
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// TRACEKMOD("** *Fragment info: id %hu offset %hu length %hu\n", frag_id, cb->frag_offset, cb->frag_length);
|
||||
|
||||
TRACE_EVENT(sc_capwap_8023_to_80211,
|
||||
TP_PROTO(struct sk_buff *skb, const uint8_t *bssid),
|
||||
|
||||
TP_ARGS(skb, bssid),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SKB_ENTRY
|
||||
BSSID_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SKB_ASSIGN;
|
||||
BSSID_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
SKB_PR_FMT BSSID_PR_FMT,
|
||||
SKB_PR_ARG, BSSID_PR_ARG
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_80211_to_8023,
|
||||
TP_PROTO(struct sk_buff *skb),
|
||||
|
||||
TP_ARGS(skb),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SKB_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SKB_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SKB_PR_FMT, SKB_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_create,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_close,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_newfragmentid,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_createkeepalive,
|
||||
TP_PROTO(struct sc_capwap_sessionid_element *sessionid),
|
||||
|
||||
TP_ARGS(sessionid),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSIONID_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSIONID_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSIONID_PR_FMT, SESSIONID_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_parsingpacket,
|
||||
TP_PROTO(struct sc_capwap_session *session,
|
||||
struct sk_buff *skb),
|
||||
|
||||
TP_ARGS(session, skb),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
SKB_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
SKB_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
SESSION_PR_FMT SKB_PR_FMT,
|
||||
SESSION_PR_ARG, SKB_PR_ARG
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_forwarddata,
|
||||
TP_PROTO(struct sc_capwap_session *session,
|
||||
uint8_t radioid,
|
||||
uint8_t binding,
|
||||
struct sk_buff *skb,
|
||||
uint32_t flags,
|
||||
struct sc_capwap_radio_addr *radioaddr,
|
||||
int radioaddrlength,
|
||||
struct sc_capwap_wireless_information *winfo),
|
||||
|
||||
TP_ARGS(session, radioid, binding, skb, flags, radioaddr, radioaddrlength, winfo),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
__field(u8, radioid)
|
||||
__field(u8, binding)
|
||||
SKB_ENTRY
|
||||
__field(u32, flags)
|
||||
__field(int, radioaddrlength)
|
||||
__array(char, radioaddr, 8)
|
||||
__field(u8, rssi)
|
||||
__field(u8, snr)
|
||||
__field(u16, rate)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
__entry->radioid = radioid;
|
||||
__entry->binding = binding;
|
||||
SKB_ASSIGN;
|
||||
__entry->binding = flags;
|
||||
__entry->radioaddrlength = radioaddrlength;
|
||||
((radioaddrlength != 0 && radioaddr) ? memcpy(__entry->radioaddr, radioaddr, min(radioaddrlength, 8)) : memset(__entry->radioaddr, 0, 8));
|
||||
|
||||
__entry->rssi = (winfo) ? ((struct sc_capwap_ieee80211_frame_info *)(winfo))->rssi : 0;
|
||||
__entry->snr = (winfo) ? ((struct sc_capwap_ieee80211_frame_info *)(winfo))->snr : 0;
|
||||
__entry->rate = (winfo) ? ((struct sc_capwap_ieee80211_frame_info *)(winfo))->rate : 0;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
SESSION_PR_FMT " radio:%d binding:%d" SKB_PR_FMT
|
||||
"radioaddr:%*phC rssid:%d snr:%d rate:%d",
|
||||
SESSION_PR_ARG, __entry->radioid, __entry->binding, SKB_PR_ARG,
|
||||
min(__entry->radioaddrlength, 8), __entry->radioaddr,
|
||||
__entry->rssi, __entry->snr, __entry->rate
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_setradiomacaddress,
|
||||
TP_PROTO(uint8_t *bssid),
|
||||
|
||||
TP_ARGS(bssid),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
BSSID_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
BSSID_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(BSSID_PR_FMT, BSSID_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_setwinfo_frameinfo,
|
||||
TP_PROTO(uint8_t rssi,
|
||||
uint8_t snr,
|
||||
uint16_t rate),
|
||||
|
||||
TP_ARGS(rssi, snr, rate),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u8, rssi)
|
||||
__field(u8, snr)
|
||||
__field(u16, rate)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->rssi = rssi;
|
||||
__entry->snr = snr;
|
||||
__entry->rate = rate;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
" rssid:%d snr:%d rate:%d",
|
||||
__entry->rssi, __entry->snr, __entry->rate
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_setwinfo_destwlans,
|
||||
TP_PROTO(uint16_t wlanidbitmap),
|
||||
|
||||
TP_ARGS(wlanidbitmap),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u16, wlanidbitmap)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->wlanidbitmap = wlanidbitmap;
|
||||
),
|
||||
|
||||
TP_printk(" id:%04x", __entry->wlanidbitmap)
|
||||
);
|
||||
|
||||
/* capwap_private.c */
|
||||
|
||||
TRACE_EVENT(sc_capwap_resetsession,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_sendkeepalive,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_send,
|
||||
TP_PROTO(struct sc_capwap_session *session),
|
||||
|
||||
TP_ARGS(session),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(SESSION_PR_FMT, SESSION_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_send_80211,
|
||||
TP_PROTO(struct sk_buff *skb, struct net_device *dev),
|
||||
|
||||
TP_ARGS(skb, dev),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SKB_ENTRY
|
||||
__array(char, dev_name, 32)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SKB_ASSIGN;
|
||||
strlcpy(__entry->dev_name, dev->name, 32);
|
||||
),
|
||||
|
||||
TP_printk(" %s" SKB_PR_FMT, __entry->dev_name, SKB_PR_ARG)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sc_capwap_parsingdatapacket,
|
||||
TP_PROTO(struct sc_capwap_session *session,
|
||||
struct sk_buff *skb),
|
||||
|
||||
TP_ARGS(session, skb),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SESSION_ENTRY
|
||||
SKB_ENTRY
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SESSION_ASSIGN;
|
||||
SKB_ASSIGN;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
SESSION_PR_FMT SKB_PR_FMT,
|
||||
SESSION_PR_ARG, SKB_PR_ARG
|
||||
)
|
||||
);
|
||||
|
||||
#endif /* !__CAPWAP_DRIVER_TRACE_H || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE capwap-trace
|
||||
#include <trace/define_trace.h>
|
@ -10,6 +10,9 @@
|
||||
#include "nlsmartcapwap.h"
|
||||
#include "netlinkapp.h"
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "capwap-trace.h"
|
||||
|
||||
/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
|
||||
static const unsigned char sc_rfc1042_header[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
|
||||
|
||||
@ -19,7 +22,7 @@ static const unsigned char sc_bridge_tunnel_header[] = { 0xaa, 0xaa, 0x03, 0x00,
|
||||
/* */
|
||||
static void sc_capwap_fragment_free(struct sc_capwap_fragment* fragment)
|
||||
{
|
||||
TRACEKMOD("### sc_capwap_fragment_free\n");
|
||||
trace_sc_capwap_fragment_free(fragment);
|
||||
|
||||
/* */
|
||||
list_del(&fragment->lru_list);
|
||||
@ -42,7 +45,7 @@ static void sc_capwap_freesession(struct sc_capwap_session* session)
|
||||
struct sc_capwap_fragment* fragment;
|
||||
struct sc_station *sta;
|
||||
|
||||
TRACEKMOD("### sc_capwap_freesession\n");
|
||||
trace_sc_capwap_freesession(session);
|
||||
|
||||
/* Free socket buffers */
|
||||
list_for_each_entry_safe(fragment, temp, &session->fragments.lru_list, lru_list) {
|
||||
@ -63,7 +66,7 @@ static void sc_capwap_defrag_evictor(struct sc_capwap_session* session, ktime_t
|
||||
struct sc_capwap_fragment* fragment;
|
||||
struct list_head* list = &session->fragments.lru_list;
|
||||
|
||||
TRACEKMOD("### sc_capwap_defrag_evictor\n");
|
||||
trace_sc_capwap_defrag_evictor(session);
|
||||
|
||||
/* Light check without lock */
|
||||
if (!list_empty(list)) {
|
||||
@ -74,7 +77,7 @@ static void sc_capwap_defrag_evictor(struct sc_capwap_session* session, ktime_t
|
||||
fragment = list_first_entry(list, struct sc_capwap_fragment, lru_list);
|
||||
delta = ktime_sub(now, fragment->tstamp);
|
||||
if ((delta.tv64 < -NSEC_PER_SEC) || (delta.tv64 > NSEC_PER_SEC)) {
|
||||
TRACEKMOD("*** Expired fragment %hu (%llu %llu)\n", fragment->fragmentid, now.tv64, fragment->tstamp.tv64);
|
||||
trace_sc_capwap_defrag_evictor_fragment_expired(session, fragment, now);
|
||||
sc_capwap_fragment_free(fragment);
|
||||
}
|
||||
}
|
||||
@ -91,7 +94,7 @@ static struct sk_buff* sc_capwap_reasm(struct sc_capwap_fragment* fragment) {
|
||||
struct sk_buff* skbfrag;
|
||||
struct sc_capwap_header* header;
|
||||
|
||||
TRACEKMOD("### sc_capwap_reasm\n");
|
||||
trace_sc_capwap_reasm(fragment);
|
||||
|
||||
/* */
|
||||
skbfrag = fragment->fragments;
|
||||
@ -140,8 +143,6 @@ static struct sk_buff* sc_capwap_defrag(struct sc_capwap_session* session, struc
|
||||
struct sk_buff* skb_defrag = NULL;
|
||||
struct sc_capwap_header* header = (struct sc_capwap_header*)skb->data;
|
||||
|
||||
TRACEKMOD("### sc_capwap_defrag\n");
|
||||
|
||||
/* */
|
||||
headersize = GET_HLEN_HEADER(header) * 4;
|
||||
if (skb->len < headersize) {
|
||||
@ -157,9 +158,10 @@ static struct sk_buff* sc_capwap_defrag(struct sc_capwap_session* session, struc
|
||||
cb->frag_offset = be16_to_cpu(header->frag_off);
|
||||
cb->frag_length = skb->len - headersize;
|
||||
|
||||
trace_sc_capwap_defrag(session, frag_id, cb->frag_offset, cb->frag_length);
|
||||
|
||||
/* */
|
||||
spin_lock(&session->fragments.lock);
|
||||
TRACEKMOD("*** Fragment info: id %hu offset %hu length %hu\n", frag_id, cb->frag_offset, cb->frag_length);
|
||||
|
||||
/* Get fragment */
|
||||
fragment = &session->fragments.queues[frag_id % CAPWAP_FRAGMENT_QUEUE];
|
||||
@ -266,8 +268,6 @@ error:
|
||||
static unsigned int sc_capwap_80211_hdrlen(__le16 fc) {
|
||||
unsigned int hdrlen = 24;
|
||||
|
||||
TRACEKMOD("### sc_capwap_80211_hdrlen\n");
|
||||
|
||||
if (ieee80211_is_data(fc)) {
|
||||
if (ieee80211_has_a4(fc)) {
|
||||
hdrlen = 30;
|
||||
@ -301,7 +301,7 @@ int sc_capwap_8023_to_80211(struct sk_buff* skb, const uint8_t* bssid) {
|
||||
struct ethhdr* eh = (struct ethhdr*)skb->data;
|
||||
uint16_t ethertype = ntohs(eh->h_proto);
|
||||
|
||||
TRACEKMOD("### sc_capwap_8023_to_80211\n");
|
||||
trace_sc_capwap_8023_to_80211(skb, bssid);
|
||||
|
||||
/* IEEE 802.11 header */
|
||||
hdrlen = 24;
|
||||
@ -367,7 +367,7 @@ int sc_capwap_80211_to_8023(struct sk_buff* skb) {
|
||||
uint8_t dst[ETH_ALEN];
|
||||
uint8_t src[ETH_ALEN] __aligned(2);
|
||||
|
||||
TRACEKMOD("### sc_capwap_80211_to_8023\n");
|
||||
trace_sc_capwap_80211_to_8023(skb);
|
||||
|
||||
/* */
|
||||
hdrlen = sc_capwap_80211_hdrlen(hdr->frame_control);
|
||||
@ -411,7 +411,7 @@ int sc_capwap_create(struct sc_capwap_session *session)
|
||||
.encap_rcv = sc_capwap_recvpacket
|
||||
};
|
||||
|
||||
TRACEKMOD("### sc_capwap_bind\n");
|
||||
trace_sc_capwap_create(session);
|
||||
|
||||
if (session->socket)
|
||||
return -EBUSY;
|
||||
@ -441,7 +441,7 @@ error:
|
||||
|
||||
void sc_capwap_close(struct sc_capwap_session *session)
|
||||
{
|
||||
TRACEKMOD("### sc_capwap_close\n");
|
||||
trace_sc_capwap_close(session);
|
||||
|
||||
if (session->socket)
|
||||
udp_tunnel_sock_release(session->socket);
|
||||
@ -453,7 +453,7 @@ void sc_capwap_close(struct sc_capwap_session *session)
|
||||
/* */
|
||||
static uint16_t sc_capwap_newfragmentid(struct sc_capwap_session* session)
|
||||
{
|
||||
TRACEKMOD("### sc_capwap_newfragmentid\n");
|
||||
trace_sc_capwap_newfragmentid(session);
|
||||
|
||||
return atomic_inc_return(&session->fragmentid) & 0xFFFF;
|
||||
}
|
||||
@ -465,7 +465,7 @@ int sc_capwap_createkeepalive(struct sc_capwap_sessionid_element* sessionid, uin
|
||||
struct sc_capwap_data_message* dataheader;
|
||||
struct sc_capwap_message_element* msgelement;
|
||||
|
||||
TRACEKMOD("### sc_capwap_createkeepalive\n");
|
||||
trace_sc_capwap_createkeepalive(sessionid);
|
||||
|
||||
/* */
|
||||
if (size < CAPWAP_KEEP_ALIVE_MAX_SIZE) {
|
||||
@ -515,7 +515,7 @@ int sc_capwap_parsingpacket(struct sc_capwap_session* session,
|
||||
struct sc_capwap_message_element* message;
|
||||
struct sc_capwap_header* header = (struct sc_capwap_header*)skb->data;
|
||||
|
||||
TRACEKMOD("### sc_capwap_parsingpacket\n");
|
||||
trace_sc_capwap_parsingpacket(session, skb);
|
||||
|
||||
/* Linearize socket buffer */
|
||||
if (skb_linearize(skb)) {
|
||||
@ -637,7 +637,16 @@ int sc_capwap_parsingpacket(struct sc_capwap_session* session,
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_capwap_forwarddata(struct sc_capwap_session* session, uint8_t radioid, uint8_t binding, struct sk_buff* skb, uint32_t flags, struct sc_capwap_radio_addr* radioaddr, int radioaddrlength, struct sc_capwap_wireless_information* winfo, int winfolength) {
|
||||
int sc_capwap_forwarddata(struct sc_capwap_session* session,
|
||||
uint8_t radioid,
|
||||
uint8_t binding,
|
||||
struct sk_buff* skb,
|
||||
uint32_t flags,
|
||||
struct sc_capwap_radio_addr* radioaddr,
|
||||
int radioaddrlength,
|
||||
struct sc_capwap_wireless_information* winfo,
|
||||
int winfolength)
|
||||
{
|
||||
int err;
|
||||
int size;
|
||||
int length;
|
||||
@ -650,7 +659,7 @@ int sc_capwap_forwarddata(struct sc_capwap_session* session, uint8_t radioid, ui
|
||||
struct sk_buff* clone = NULL;
|
||||
int packetlength = skb->len;
|
||||
|
||||
TRACEKMOD("### sc_capwap_forwarddata\n");
|
||||
trace_sc_capwap_forwarddata(session, radioid, binding, skb, flags, radioaddr, radioaddrlength, winfo);
|
||||
|
||||
/* Check headroom */
|
||||
headroom = skb_headroom(skb);
|
||||
@ -745,25 +754,12 @@ int sc_capwap_forwarddata(struct sc_capwap_session* session, uint8_t radioid, ui
|
||||
return (!packetlength ? 0 : -EIO);
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_sessionid_printf(const struct sc_capwap_sessionid_element* sessionid, char* string) {
|
||||
int i;
|
||||
char* pos = string;
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
snprintf(pos, 3, "%02x", sessionid->id[i]);
|
||||
pos += 2;
|
||||
}
|
||||
|
||||
*pos = 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
struct sc_capwap_radio_addr* sc_capwap_setradiomacaddress(uint8_t* buffer, int size, uint8_t* bssid) {
|
||||
struct sc_capwap_radio_addr* radioaddr;
|
||||
struct sc_capwap_macaddress_eui48* addr;
|
||||
|
||||
TRACEKMOD("### sc_capwap_setwirelessinformation\n");
|
||||
trace_sc_capwap_setradiomacaddress(bssid);
|
||||
|
||||
memset(buffer, 0, size);
|
||||
|
||||
@ -781,7 +777,7 @@ struct sc_capwap_wireless_information* sc_capwap_setwinfo_frameinfo(uint8_t* buf
|
||||
struct sc_capwap_wireless_information* winfo;
|
||||
struct sc_capwap_ieee80211_frame_info* frameinfo;
|
||||
|
||||
TRACEKMOD("### sc_capwap_setwinfo_frameinfo\n");
|
||||
trace_sc_capwap_setwinfo_frameinfo(rssi, snr, rate);
|
||||
|
||||
memset(buffer, 0, size);
|
||||
|
||||
@ -801,7 +797,7 @@ struct sc_capwap_wireless_information* sc_capwap_setwinfo_destwlans(uint8_t* buf
|
||||
struct sc_capwap_wireless_information* winfo;
|
||||
struct sc_capwap_destination_wlans* destwlans;
|
||||
|
||||
TRACEKMOD("### sc_capwap_setwinfo_destwlans\n");
|
||||
trace_sc_capwap_setwinfo_destwlans(wlanidbitmap);
|
||||
|
||||
memset(buffer, 0, size);
|
||||
|
@ -50,12 +50,15 @@ union capwap_addr {
|
||||
struct sockaddr_storage ss;
|
||||
};
|
||||
|
||||
#define STA_FLAG_AKM_ONLY 0x0001
|
||||
|
||||
struct sc_station {
|
||||
struct hlist_node station_list;
|
||||
|
||||
uint8_t radioid;
|
||||
uint8_t mac[ETH_ALEN];
|
||||
uint8_t wlanid;
|
||||
uint32_t flags;
|
||||
|
||||
struct rcu_head rcu_head;
|
||||
};
|
||||
@ -136,8 +139,6 @@ void sc_capwap_close(struct sc_capwap_session *session);
|
||||
int sc_capwap_8023_to_80211(struct sk_buff* skb, const uint8_t* bssid);
|
||||
int sc_capwap_80211_to_8023(struct sk_buff* skb);
|
||||
|
||||
void sc_capwap_sessionid_printf(const struct sc_capwap_sessionid_element* sessionid, char* string);
|
||||
|
||||
int sc_capwap_createkeepalive(struct sc_capwap_sessionid_element* sessionid, uint8_t* buffer, int size);
|
||||
int sc_capwap_parsingpacket(struct sc_capwap_session* session, struct sk_buff* skb);
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "capwap.h"
|
||||
#include "nlsmartcapwap.h"
|
||||
#include "netlinkapp.h"
|
||||
#include "capwap-trace.h"
|
||||
|
||||
/* */
|
||||
int sc_capwap_init(struct sc_capwap_session *session, struct net *net)
|
||||
@ -42,7 +43,7 @@ int sc_capwap_init(struct sc_capwap_session *session, struct net *net)
|
||||
/* */
|
||||
void sc_capwap_resetsession(struct sc_capwap_session *session)
|
||||
{
|
||||
TRACEKMOD("### sc_capwap_resetsession\n");
|
||||
trace_sc_capwap_resetsession(session);
|
||||
|
||||
sc_capwap_close(session);
|
||||
sc_capwap_init(session, session->net);
|
||||
@ -55,7 +56,7 @@ int sc_capwap_sendkeepalive(struct sc_capwap_session *session)
|
||||
int length;
|
||||
uint8_t buffer[CAPWAP_KEEP_ALIVE_MAX_SIZE];
|
||||
|
||||
TRACEKMOD("### sc_capwap_sendkeepalive\n");
|
||||
trace_sc_capwap_sendkeepalive(session);
|
||||
|
||||
/* Build keepalive */
|
||||
length = sc_capwap_createkeepalive(&session->sessionid, buffer, CAPWAP_KEEP_ALIVE_MAX_SIZE);
|
||||
@ -80,7 +81,7 @@ int sc_capwap_send(struct sc_capwap_session *session, uint8_t* buffer, int lengt
|
||||
.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL,
|
||||
};
|
||||
|
||||
TRACEKMOD("### sc_capwap_send\n");
|
||||
trace_sc_capwap_send(session);
|
||||
|
||||
return kernel_sendmsg(session->socket, &msg, &vec, 1, vec.iov_len);
|
||||
}
|
||||
@ -169,11 +170,8 @@ static void sc_send_8023(struct sk_buff *skb, struct net_device *dev)
|
||||
static void sc_send_80211(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_hdr *hdr;
|
||||
int hdrlen;
|
||||
|
||||
printk(KERN_DEBUG "capwap inject: %s: hdr: %p\n",
|
||||
dev->name, skb->data);
|
||||
trace_sc_send_80211(skb, dev);
|
||||
|
||||
/* detach skb from CAPWAP */
|
||||
skb_orphan(skb);
|
||||
@ -185,17 +183,15 @@ static void sc_send_80211(struct sk_buff *skb, struct net_device *dev)
|
||||
/* drop conntrack reference */
|
||||
nf_reset(skb);
|
||||
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
skb->dev = dev;
|
||||
|
||||
skb_set_mac_header(skb, hdrlen);
|
||||
skb_set_network_header(skb, hdrlen);
|
||||
skb_set_transport_header(skb, hdrlen);
|
||||
|
||||
skb->protocol = htons(ETH_P_CONTROL);
|
||||
info->flags |= IEEE80211_TX_CTL_INJECTED;
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
info->flags = IEEE80211_TX_CTL_INJECTED;
|
||||
|
||||
/* Force the device to verify it. */
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
@ -217,7 +213,7 @@ void sc_capwap_parsingdatapacket(struct sc_capwap_session* session, struct sk_bu
|
||||
struct sc_capwap_destination_wlans* destwlan = NULL;
|
||||
int winfosize = 0;
|
||||
|
||||
TRACEKMOD("### sc_capwap_parsingdatapacket\n");
|
||||
trace_sc_capwap_parsingdatapacket(session, skb);
|
||||
|
||||
/* Retrieve optional attribute */
|
||||
pos = skb->data + sizeof(struct sc_capwap_header);
|
@ -85,32 +85,58 @@ static int sc_netlink_handler(uint32_t ifindex, struct sk_buff* skb,
|
||||
int err;
|
||||
uint8_t radioaddrbuffer[CAPWAP_RADIO_EUI48_LENGTH_PADDED];
|
||||
uint8_t winfobuffer[CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED];
|
||||
uint16_t hdrlen, ethertype;
|
||||
uint8_t *payload;
|
||||
struct sc_capwap_radio_addr* radioaddr = NULL;
|
||||
struct sc_capwap_wireless_information* winfo = NULL;
|
||||
uint32_t flags = nldev->flags;
|
||||
|
||||
/* Drop packet */
|
||||
ret = -1;
|
||||
|
||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
if (!pskb_may_pull(skb, hdrlen + 8))
|
||||
goto error;
|
||||
|
||||
payload = skb->data + hdrlen;
|
||||
ethertype = (payload[6] << 8) | payload[7];
|
||||
|
||||
TRACEKMOD("### sc_netlink_handler, ethertype %04x\n", ethertype);
|
||||
|
||||
switch (ethertype) {
|
||||
case ETH_P_PAE:
|
||||
/* forward EAPOL as raw 802.11 frame, clear 802.3 tunnel flag */
|
||||
flags &= ~NLSMARTCAPWAP_FLAGS_TUNNEL_8023;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* IEEE 802.11 into IEEE 802.3 */
|
||||
if (nldev->flags & NLSMARTCAPWAP_FLAGS_TUNNEL_8023) {
|
||||
if (ieee80211_data_to_8023(skb, nldev->dev->dev_addr, NL80211_IFTYPE_AP)) {
|
||||
if (ieee80211_data_to_8023(skb, nldev->dev->dev_addr, NL80211_IFTYPE_AP))
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Create Radio Mac Address */
|
||||
radioaddr = sc_capwap_setradiomacaddress(radioaddrbuffer, CAPWAP_RADIO_EUI48_LENGTH_PADDED, nldev->dev->dev_addr);
|
||||
radioaddr =
|
||||
sc_capwap_setradiomacaddress(radioaddrbuffer,
|
||||
CAPWAP_RADIO_EUI48_LENGTH_PADDED,
|
||||
nldev->dev->dev_addr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Create Wireless Information */
|
||||
if (sig_dbm || rate) {
|
||||
winfo = sc_capwap_setwinfo_frameinfo(winfobuffer, CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED, (uint8_t)sig_dbm, 0, ((uint16_t)rate) * 5);
|
||||
}
|
||||
if (sig_dbm || rate)
|
||||
winfo = sc_capwap_setwinfo_frameinfo(winfobuffer,
|
||||
CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED,
|
||||
(uint8_t)sig_dbm, 0, ((uint16_t)rate) * 5);
|
||||
|
||||
/* */
|
||||
CAPWAP_SKB_CB(skb)->flags = SKB_CAPWAP_FLAG_FROM_IEEE80211;
|
||||
|
||||
/* Forward to AC */
|
||||
err = sc_capwap_forwarddata(&sn->sc_acsession, nldev->radioid, nldev->binding, skb, nldev->flags, radioaddr, (radioaddr ? CAPWAP_RADIO_EUI48_LENGTH_PADDED : 0), winfo, (winfo ? CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED : 0));
|
||||
err = sc_capwap_forwarddata(&sn->sc_acsession, nldev->radioid, nldev->binding, skb, flags,
|
||||
radioaddr, (radioaddr ? CAPWAP_RADIO_EUI48_LENGTH_PADDED : 0),
|
||||
winfo, (winfo ? CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED : 0));
|
||||
}
|
||||
|
||||
error:
|
||||
@ -642,7 +668,8 @@ static int sc_netlink_add_station(struct sk_buff* skb, struct genl_info* info)
|
||||
|
||||
if (!info->attrs[NLSMARTCAPWAP_ATTR_RADIOID] ||
|
||||
!info->attrs[NLSMARTCAPWAP_ATTR_MAC] ||
|
||||
!info->attrs[NLSMARTCAPWAP_ATTR_WLANID])
|
||||
!info->attrs[NLSMARTCAPWAP_ATTR_WLANID] ||
|
||||
!info->attrs[NLSMARTCAPWAP_ATTR_FLAGS])
|
||||
return -EINVAL;
|
||||
|
||||
radioid = nla_get_u8(info->attrs[NLSMARTCAPWAP_ATTR_RADIOID]);
|
||||
@ -650,12 +677,18 @@ static int sc_netlink_add_station(struct sk_buff* skb, struct genl_info* info)
|
||||
hash = jhash(mac, ETH_ALEN, radioid) % STA_HASH_SIZE;
|
||||
sta_head = &session->station_list[hash];
|
||||
|
||||
if (sc_find_station(sta_head, radioid, mac) != NULL)
|
||||
sta = sc_find_station(sta_head, radioid, mac);
|
||||
if (sta) {
|
||||
if (!(info->nlhdr->nlmsg_flags & NLM_F_REPLACE))
|
||||
return -EEXIST;
|
||||
|
||||
if (info->nlhdr->nlmsg_flags & NLM_F_REPLACE)
|
||||
if (sta->wlanid != nla_get_u8(info->attrs[NLSMARTCAPWAP_ATTR_WLANID]))
|
||||
return -ENXIO;
|
||||
|
||||
sta->flags = nla_get_u32(info->attrs[NLSMARTCAPWAP_ATTR_FLAGS]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sta = kmalloc(sizeof(struct sc_station), GFP_KERNEL);
|
||||
if (sta == NULL)
|
||||
return -ENOMEM;
|
||||
@ -663,6 +696,7 @@ static int sc_netlink_add_station(struct sk_buff* skb, struct genl_info* info)
|
||||
sta->radioid = radioid;
|
||||
memcpy(&sta->mac, mac, ETH_ALEN);
|
||||
sta->wlanid = nla_get_u8(info->attrs[NLSMARTCAPWAP_ATTR_WLANID]);
|
||||
sta->flags = nla_get_u32(info->attrs[NLSMARTCAPWAP_ATTR_FLAGS]);
|
||||
|
||||
hlist_add_head_rcu(&sta->station_list, sta_head);
|
||||
|
222
lib/Makefile.am
Executable file
222
lib/Makefile.am
Executable file
@ -0,0 +1,222 @@
|
||||
# FreeWTP -- An Open Source CAPWAP WTP
|
||||
#
|
||||
# Copyright SmartCAPWAP (C) 2012-2013 Massimo Vellucci <vemax78@gmail.com>
|
||||
# Copyright FreeCAPWAP (C) 2016 Travelping GmbH <info@travelping.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program (see the file COPYING included with this
|
||||
# distribution); if not, write to the Free Software Foundation, Inc.,
|
||||
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
AM_CFLAGS = -std=gnu99 -D_GNU_SOURCE
|
||||
|
||||
if DTLS_ENABLED
|
||||
AM_CFLAGS += $(WOLFSSL_CFLAGS)
|
||||
endif
|
||||
|
||||
noinst_LTLIBRARIES = libcapwap.la
|
||||
|
||||
libcapwap_la_LIBADD = $(WOLFSSL_LDFLAGS)
|
||||
libcapwap_la_SOURCES = \
|
||||
capwap.c \
|
||||
network.c \
|
||||
protocol.c \
|
||||
logging.c \
|
||||
list.c \
|
||||
array.c \
|
||||
hash.c \
|
||||
dtls.c \
|
||||
dfa.c \
|
||||
binding/ieee80211/ieee80211.c \
|
||||
element.c \
|
||||
element_acdescriptor.c \
|
||||
element_acipv4list.c \
|
||||
element_acipv6list.c \
|
||||
element_acname.c \
|
||||
element_acnamepriority.c \
|
||||
element_actimestamp.c \
|
||||
element_addmacacl.c \
|
||||
element_addstation.c \
|
||||
element_controlipv4.c \
|
||||
element_controlipv6.c \
|
||||
element_datatransferdata.c \
|
||||
element_datatransfermode.c \
|
||||
element_decrypterrorreport.c \
|
||||
element_decrypterrorreportperiod.c \
|
||||
element_deletemacacl.c \
|
||||
element_deletestation.c \
|
||||
element_discoverytype.c \
|
||||
element_duplicateipv4.c \
|
||||
element_duplicateipv6.c \
|
||||
element_ecnsupport.c \
|
||||
element_idletimeout.c \
|
||||
element_imagedata.c \
|
||||
element_imageidentifier.c \
|
||||
element_imageinfo.c \
|
||||
element_initdownload.c \
|
||||
element_localipv4.c \
|
||||
element_localipv6.c \
|
||||
element_location.c \
|
||||
element_maximumlength.c \
|
||||
element_mtudiscovery.c \
|
||||
element_radioadmstate.c \
|
||||
element_radiooprstate.c \
|
||||
element_resultcode.c \
|
||||
element_returnedmessage.c \
|
||||
element_sessionid.c \
|
||||
element_statisticstimer.c \
|
||||
element_timers.c \
|
||||
element_transport.c \
|
||||
element_vendorpayload.c \
|
||||
element_wtpboarddata.c \
|
||||
element_wtpdescriptor.c \
|
||||
element_wtpfallback.c \
|
||||
element_wtpframetunnelmode.c \
|
||||
element_wtpmactype.c \
|
||||
element_wtpname.c \
|
||||
element_wtpradiostat.c \
|
||||
element_wtprebootstat.c \
|
||||
element_wtpstaticipaddress.c \
|
||||
element_80211_addwlan.c \
|
||||
element_80211_antenna.c \
|
||||
element_80211_assignbssid.c \
|
||||
element_80211_deletewlan.c \
|
||||
element_80211_directsequencecontrol.c \
|
||||
element_80211_ie.c \
|
||||
element_80211_mac_profile.c \
|
||||
element_80211_macoperation.c \
|
||||
element_80211_miccountermeasures.c \
|
||||
element_80211_multidomaincapability.c \
|
||||
element_80211_ofdmcontrol.c \
|
||||
element_80211_rateset.c \
|
||||
element_80211_rsnaerrorreport.c \
|
||||
element_80211_station.c \
|
||||
element_80211_stationkey.c \
|
||||
element_80211_stationqos.c \
|
||||
element_80211_statistics.c \
|
||||
element_80211_supported_mac_profiles.c \
|
||||
element_80211_supportedrates.c \
|
||||
element_80211_txpower.c \
|
||||
element_80211_txpowerlevel.c \
|
||||
element_80211_updatestationqos.c \
|
||||
element_80211_updatewlan.c \
|
||||
element_80211_wtpqos.c \
|
||||
element_80211_wtpradioconf.c \
|
||||
element_80211_wtpradiofailalarm.c \
|
||||
element_80211_wtpradioinformation.c \
|
||||
element_80211n_radioconf.c \
|
||||
element_80211n_station_information.c \
|
||||
element_vendor_travelping_wtp_timestamp.c \
|
||||
element_vendor_travelping_80211_encryption_capability.c \
|
||||
element_vendor_travelping_80211_update_key.c
|
||||
|
||||
noinst_HEADERS = \
|
||||
error.h \
|
||||
rfc.h \
|
||||
capwap.h \
|
||||
network.h \
|
||||
protocol.h \
|
||||
logging.h \
|
||||
list.h \
|
||||
array.h \
|
||||
hash.h \
|
||||
dtls.h \
|
||||
capwap_dfa.h \
|
||||
binding/ieee80211/ieee80211.c \
|
||||
element.h \
|
||||
element_acdescriptor.h \
|
||||
element_acipv4list.h \
|
||||
element_acipv6list.h \
|
||||
element_acname.h \
|
||||
element_acnamepriority.h \
|
||||
element_actimestamp.h \
|
||||
element_addmacacl.h \
|
||||
element_addstation.h \
|
||||
element_controlipv4.h \
|
||||
element_controlipv6.h \
|
||||
element_datatransferdata.h \
|
||||
element_datatransfermode.h \
|
||||
element_decrypterrorreport.h \
|
||||
element_decrypterrorreportperiod.h \
|
||||
element_deletemacacl.h \
|
||||
element_deletestation.h \
|
||||
element_discoverytype.h \
|
||||
element_duplicateipv4.h \
|
||||
element_duplicateipv6.h \
|
||||
element_ecnsupport.h \
|
||||
element_idletimeout.h \
|
||||
element_imagedata.h \
|
||||
element_imageidentifier.h \
|
||||
element_imageinfo.h \
|
||||
element_initdownload.h \
|
||||
element_localipv4.h \
|
||||
element_localipv6.h \
|
||||
element_location.h \
|
||||
element_maximumlength.h \
|
||||
element_mtudiscovery.h \
|
||||
element_radioadmstate.h \
|
||||
element_radiooprstate.h \
|
||||
element_resultcode.h \
|
||||
element_returnedmessage.h \
|
||||
element_sessionid.h \
|
||||
element_statisticstimer.h \
|
||||
element_timers.h \
|
||||
element_transport.h \
|
||||
element_vendorpayload.h \
|
||||
element_wtpboarddata.h \
|
||||
element_wtpdescriptor.h \
|
||||
element_wtpfallback.h \
|
||||
element_wtpframetunnelmode.h \
|
||||
element_wtpmactype.h \
|
||||
element_wtpname.h \
|
||||
element_wtpradiostat.h \
|
||||
element_wtprebootstat.h \
|
||||
element_wtpstaticipaddress.h \
|
||||
element_80211_addwlan.h \
|
||||
element_80211_antenna.h \
|
||||
element_80211_assignbssid.h \
|
||||
element_80211_deletewlan.h \
|
||||
element_80211_directsequencecontrol.h \
|
||||
element_80211_ie.h \
|
||||
element_80211_macoperation.h \
|
||||
element_80211_mac_profile.h \
|
||||
element_80211_miccountermeasures.h \
|
||||
element_80211_multidomaincapability.h \
|
||||
element_80211_ofdmcontrol.h \
|
||||
element_80211_rateset.h \
|
||||
element_80211_rsnaerrorreport.h \
|
||||
element_80211_station.h \
|
||||
element_80211_stationkey.h \
|
||||
element_80211_stationqos.h \
|
||||
element_80211_statistics.h \
|
||||
element_80211_supported_mac_profiles.h \
|
||||
element_80211_supportedrates.h \
|
||||
element_80211_txpower.h \
|
||||
element_80211_txpowerlevel.h \
|
||||
element_80211_updatestationqos.h \
|
||||
element_80211_updatewlan.h \
|
||||
element_80211_wtpqos.h \
|
||||
element_80211_wtpradioconf.h \
|
||||
element_80211_wtpradiofailalarm.h \
|
||||
element_80211_wtpradioinformation.h \
|
||||
element_80211n_radioconf.h \
|
||||
element_80211n_station_information.h \
|
||||
element_vendor_travelping_wtp_timestamp.h \
|
||||
element_vendor_travelping_80211_encryption_capability.h \
|
||||
element_vendor_travelping_80211_update_key.h \
|
||||
vendor_travelping.h
|
||||
|
||||
if DEBUG_BUILD
|
||||
libcapwap_la_SOURCES += debug.c
|
||||
noinst_HEADERS += debug.h
|
||||
endif
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_array.h"
|
||||
#include "array.h"
|
||||
|
||||
/* */
|
||||
struct capwap_array* capwap_array_create(unsigned short itemsize, unsigned long initcount, int zeroed) {
|
@ -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
|
@ -58,11 +58,10 @@
|
||||
#endif
|
||||
|
||||
/* standard include */
|
||||
#include "capwap_rfc.h"
|
||||
#include "capwap_logging.h"
|
||||
#include "capwap_debug.h"
|
||||
#include "capwap_error.h"
|
||||
#include "capwap_timeout.h"
|
||||
#include "rfc.h"
|
||||
#include "logging.h"
|
||||
#include "debug.h"
|
||||
#include "error.h"
|
||||
|
||||
/* Helper exit */
|
||||
void capwap_exit(int errorcode);
|
@ -10,8 +10,8 @@
|
||||
#include <execinfo.h>
|
||||
#endif
|
||||
|
||||
#include "capwap_logging.h"
|
||||
#include "capwap_error.h"
|
||||
#include "logging.h"
|
||||
#include "error.h"
|
||||
|
||||
#define BACKTRACE_BUFFER 256
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_dtls.h"
|
||||
#include "capwap_protocol.h"
|
||||
#include "dtls.h"
|
||||
#include "protocol.h"
|
||||
#include <wolfssl/options.h>
|
||||
#include <wolfssl/ssl.h>
|
||||
#include <wolfssl/wolfcrypt/sha.h>
|
||||
@ -420,6 +420,8 @@ static int capwap_crypt_handshake(struct capwap_dtls* dtls) {
|
||||
|
||||
/* */
|
||||
if (result != SSL_SUCCESS) {
|
||||
char buffer[WOLFSSL_MAX_ERROR_SZ];
|
||||
|
||||
result = wolfSSL_get_error((WOLFSSL*)dtls->sslsession, 0);
|
||||
if ((result == SSL_ERROR_WANT_READ) || (result == SSL_ERROR_WANT_WRITE)) {
|
||||
/* Incomplete handshake */
|
||||
@ -427,6 +429,9 @@ static int capwap_crypt_handshake(struct capwap_dtls* dtls) {
|
||||
return CAPWAP_HANDSHAKE_CONTINUE;
|
||||
}
|
||||
|
||||
log_printf(LOG_DEBUG, "Error in DTLS handshake: %s",
|
||||
wolfSSL_ERR_error_string(result, buffer));
|
||||
|
||||
/* Handshake error */
|
||||
dtls->action = CAPWAP_DTLS_ACTION_ERROR;
|
||||
return CAPWAP_HANDSHAKE_ERROR;
|
||||
@ -572,7 +577,6 @@ 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) {
|
||||
log_printf(LOG_DEBUG, "Error in DTLS handshake");
|
||||
result = CAPWAP_ERROR_CLOSE; /* Error handshake */
|
||||
} else {
|
||||
result = CAPWAP_ERROR_AGAIN; /* Don't parsing DTLS packet */
|
@ -1,8 +1,8 @@
|
||||
#ifndef __CAPWAP_DTLS_HEADER__
|
||||
#define __CAPWAP_DTLS_HEADER__
|
||||
|
||||
#include "capwap_list.h"
|
||||
#include "capwap_network.h"
|
||||
#include "list.h"
|
||||
#include "network.h"
|
||||
|
||||
#define CAPWAP_DTLS_CLIENT 0
|
||||
#define CAPWAP_DTLS_SERVER 1
|
@ -1,7 +1,7 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "capwap_protocol.h"
|
||||
#include "capwap_array.h"
|
||||
#include "element.h"
|
||||
#include "protocol.h"
|
||||
#include "array.h"
|
||||
|
||||
/* */
|
||||
#define element_ops(Id, Ops) [(Id) - CAPWAP_MESSAGE_ELEMENTS_START] = &(Ops)
|
||||
@ -66,6 +66,7 @@ static const struct capwap_message_elements_ops * capwap_80211_message_elements[
|
||||
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_MAC_PROFILE_TYPE, capwap_element_80211_mac_profile_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),
|
||||
@ -76,6 +77,7 @@ static const struct capwap_message_elements_ops * capwap_80211_message_elements[
|
||||
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_SUPPORTED_MAC_PROFILES_TYPE, capwap_element_80211_supported_mac_profiles_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),
|
||||
@ -93,7 +95,9 @@ static const struct capwap_message_elements_ops * capwap_80211_message_elements[
|
||||
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_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
|
||||
|
||||
@ -139,7 +143,7 @@ struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet*
|
||||
while (search) {
|
||||
struct capwap_message_element_itemlist* messageelement =
|
||||
(struct capwap_message_element_itemlist*)search->item;
|
||||
if ((id.vendor == messageelement->id.vendor) && (id.type == messageelement->id.type))
|
||||
if (message_element_id_eq(id, messageelement->id))
|
||||
return search;
|
||||
|
||||
/* */
|
169
lib/element.h
Normal file
169
lib/element.h
Normal file
@ -0,0 +1,169 @@
|
||||
#ifndef __CAPWAP_ELEMENT_HEADER__
|
||||
#define __CAPWAP_ELEMENT_HEADER__
|
||||
|
||||
#include "array.h"
|
||||
#include "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 {
|
||||
int (*write_u8)(capwap_message_elements_handle handle, uint8_t data);
|
||||
int (*write_u16)(capwap_message_elements_handle handle, uint16_t data);
|
||||
int (*write_u32)(capwap_message_elements_handle handle, uint32_t data);
|
||||
int (*write_block)(capwap_message_elements_handle handle, const uint8_t* data, unsigned short length);
|
||||
};
|
||||
|
||||
struct capwap_read_message_elements_ops {
|
||||
unsigned short (*read_ready)(capwap_message_elements_handle handle);
|
||||
int (*read_u8)(capwap_message_elements_handle handle, uint8_t* data);
|
||||
int (*read_u16)(capwap_message_elements_handle handle, uint16_t* data);
|
||||
int (*read_u32)(capwap_message_elements_handle handle, uint32_t* data);
|
||||
int (*read_block)(capwap_message_elements_handle handle, uint8_t* data, unsigned short length);
|
||||
};
|
||||
|
||||
struct capwap_message_elements_ops
|
||||
{
|
||||
int category;
|
||||
|
||||
/* Build message element */
|
||||
void (*create)(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func);
|
||||
|
||||
/* Parsing message element */
|
||||
void* (*parse)(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func);
|
||||
|
||||
/* Memory management */
|
||||
void* (*clone)(void*);
|
||||
void (*free)(void*);
|
||||
};
|
||||
|
||||
const struct capwap_message_elements_ops *capwap_get_message_element_ops(const struct capwap_message_element_id id);
|
||||
|
||||
/*********************************************************************************************************************/
|
||||
|
||||
/* Standard message elements */
|
||||
#include "element_acdescriptor.h" /* 00001 */
|
||||
#include "element_acipv4list.h" /* 00002 */
|
||||
#include "element_acipv6list.h" /* 00003 */
|
||||
#include "element_acname.h" /* 00004 */
|
||||
#include "element_acnamepriority.h" /* 00005 */
|
||||
#include "element_actimestamp.h" /* 00006 */
|
||||
#include "element_addmacacl.h" /* 00007 */
|
||||
#include "element_addstation.h" /* 00008 */
|
||||
/* Reserved */ /* 00009 */
|
||||
#include "element_controlipv4.h" /* 00010 */
|
||||
#include "element_controlipv6.h" /* 00011 */
|
||||
#include "element_timers.h" /* 00012 */
|
||||
#include "element_datatransferdata.h" /* 00013 */
|
||||
#include "element_datatransfermode.h" /* 00014 */
|
||||
#include "element_decrypterrorreport.h" /* 00015 */
|
||||
#include "element_decrypterrorreportperiod.h" /* 00016 */
|
||||
#include "element_deletemacacl.h" /* 00017 */
|
||||
#include "element_deletestation.h" /* 00018 */
|
||||
/* Reserved */ /* 00019 */
|
||||
#include "element_discoverytype.h" /* 00020 */
|
||||
#include "element_duplicateipv4.h" /* 00021 */
|
||||
#include "element_duplicateipv6.h" /* 00022 */
|
||||
#include "element_idletimeout.h" /* 00023 */
|
||||
#include "element_imagedata.h" /* 00024 */
|
||||
#include "element_imageidentifier.h" /* 00025 */
|
||||
#include "element_imageinfo.h" /* 00026 */
|
||||
#include "element_initdownload.h" /* 00027 */
|
||||
#include "element_location.h" /* 00028 */
|
||||
#include "element_maximumlength.h" /* 00029 */
|
||||
#include "element_localipv4.h" /* 00030 */
|
||||
#include "element_radioadmstate.h" /* 00031 */
|
||||
#include "element_radiooprstate.h" /* 00032 */
|
||||
#include "element_resultcode.h" /* 00033 */
|
||||
#include "element_returnedmessage.h" /* 00034 */
|
||||
#include "element_sessionid.h" /* 00035 */
|
||||
#include "element_statisticstimer.h" /* 00036 */
|
||||
#include "element_vendorpayload.h" /* 00037 */
|
||||
#include "element_wtpboarddata.h" /* 00038 */
|
||||
#include "element_wtpdescriptor.h" /* 00039 */
|
||||
#include "element_wtpfallback.h" /* 00040 */
|
||||
#include "element_wtpframetunnelmode.h" /* 00041 */
|
||||
/* Reserved */ /* 00042 */
|
||||
/* Reserved */ /* 00043 */
|
||||
#include "element_wtpmactype.h" /* 00044 */
|
||||
#include "element_wtpname.h" /* 00045 */
|
||||
/* Reserved */ /* 00046 */
|
||||
#include "element_wtpradiostat.h" /* 00047 */
|
||||
#include "element_wtprebootstat.h" /* 00048 */
|
||||
#include "element_wtpstaticipaddress.h" /* 00049 */
|
||||
#include "element_localipv6.h" /* 00050 */
|
||||
#include "element_transport.h" /* 00051 */
|
||||
#include "element_mtudiscovery.h" /* 00052 */
|
||||
#include "element_ecnsupport.h" /* 00053 */
|
||||
|
||||
/* IEEE 802.11 message elements */
|
||||
#include "element_80211_addwlan.h" /* 01024 */
|
||||
#include "element_80211_antenna.h" /* 01025 */
|
||||
#include "element_80211_assignbssid.h" /* 01026 */
|
||||
#include "element_80211_deletewlan.h" /* 01027 */
|
||||
#include "element_80211_directsequencecontrol.h" /* 01028 */
|
||||
#include "element_80211_ie.h" /* 01029 */
|
||||
#include "element_80211_macoperation.h" /* 01030 */
|
||||
#include "element_80211_miccountermeasures.h" /* 01031 */
|
||||
#include "element_80211_multidomaincapability.h" /* 01032 */
|
||||
#include "element_80211_ofdmcontrol.h" /* 01033 */
|
||||
#include "element_80211_rateset.h" /* 01034 */
|
||||
#include "element_80211_rsnaerrorreport.h" /* 01035 */
|
||||
#include "element_80211_station.h" /* 01036 */
|
||||
#include "element_80211_stationqos.h" /* 01037 */
|
||||
#include "element_80211_stationkey.h" /* 01038 */
|
||||
#include "element_80211_statistics.h" /* 01039 */
|
||||
#include "element_80211_supportedrates.h" /* 01040 */
|
||||
#include "element_80211_txpower.h" /* 01041 */
|
||||
#include "element_80211_txpowerlevel.h" /* 01042 */
|
||||
#include "element_80211_updatestationqos.h" /* 01043 */
|
||||
#include "element_80211_updatewlan.h" /* 01044 */
|
||||
#include "element_80211_wtpqos.h" /* 01045 */
|
||||
#include "element_80211_wtpradioconf.h" /* 01046 */
|
||||
#include "element_80211_wtpradiofailalarm.h" /* 01047 */
|
||||
#include "element_80211_wtpradioinformation.h" /* 01048 */
|
||||
#include "element_80211_supported_mac_profiles.h" /* 01060 */
|
||||
#include "element_80211_mac_profile.h" /* 01061 */
|
||||
|
||||
#include "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
|
||||
{
|
||||
struct capwap_message_element_id id;
|
||||
int category;
|
||||
void* data;
|
||||
};
|
||||
|
||||
struct capwap_parsed_packet {
|
||||
struct capwap_packet_rxmng* rxmngpacket;
|
||||
struct capwap_list* messages;
|
||||
};
|
||||
|
||||
/* */
|
||||
#define PARSING_COMPLETE 0
|
||||
#define UNRECOGNIZED_MESSAGE_ELEMENT 1
|
||||
#define INVALID_MESSAGE_ELEMENT 2
|
||||
|
||||
int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap_parsed_packet* packet);
|
||||
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,
|
||||
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__ */
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
89
lib/element_80211_mac_profile.c
Normal file
89
lib/element_80211_mac_profile.c
Normal file
@ -0,0 +1,89 @@
|
||||
#include "capwap.h"
|
||||
#include "element.h"
|
||||
|
||||
/*
|
||||
* The IEEE 802.11 MAC Profile message element allows the AC to select a
|
||||
* profile. This message element may be provided along with the IEEE
|
||||
* 802.11 ADD WLAN message element while configuring a WLAN on the WTP.
|
||||
*
|
||||
* 0 1 2 3 4 5 6 7
|
||||
* +=+-+-+-+-+-+-+-+
|
||||
* | Profile |
|
||||
* +-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* o Type: 1061 for IEEE 802.11 MAC Profile
|
||||
*
|
||||
* o Profile: The profile is identified by a value as given below
|
||||
*
|
||||
* * 0: This refers to the IEEE 802.11 Split MAC Profile with WTP
|
||||
* encryption
|
||||
*
|
||||
* * 1: This refers to the IEEE 802.11 Split MAC Profile with AC
|
||||
* encryption
|
||||
*/
|
||||
|
||||
/* */
|
||||
static void
|
||||
capwap_80211_mac_profile_element_create(void *data, capwap_message_elements_handle handle,
|
||||
struct capwap_write_message_elements_ops *func)
|
||||
{
|
||||
struct capwap_80211_mac_profile_element *element =
|
||||
(struct capwap_80211_mac_profile_element*)data;
|
||||
|
||||
ASSERT(data != NULL);
|
||||
|
||||
func->write_u8(handle, element->mac_profile);
|
||||
}
|
||||
|
||||
/* */
|
||||
static void *
|
||||
capwap_80211_mac_profile_element_parsing(capwap_message_elements_handle handle,
|
||||
struct capwap_read_message_elements_ops *func)
|
||||
{
|
||||
unsigned short length;
|
||||
struct capwap_80211_mac_profile_element *data;
|
||||
|
||||
ASSERT(handle != NULL);
|
||||
ASSERT(func != NULL);
|
||||
|
||||
length = func->read_ready(handle);
|
||||
if (length != 1) {
|
||||
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Supported MAC Profiles element");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* */
|
||||
data = (struct capwap_80211_mac_profile_element *)
|
||||
capwap_alloc(sizeof(struct capwap_80211_mac_profile_element));
|
||||
memset(data, 0, sizeof(struct capwap_80211_mac_profile_element));
|
||||
|
||||
/* Retrieve data */
|
||||
func->read_u8(handle, &data->mac_profile);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* */
|
||||
static void *capwap_80211_mac_profile_element_clone(void *data)
|
||||
{
|
||||
ASSERT(data != NULL);
|
||||
|
||||
return capwap_clone(data, sizeof(struct capwap_80211_mac_profile_element));
|
||||
}
|
||||
|
||||
/* */
|
||||
static void capwap_80211_mac_profile_element_free(void *data)
|
||||
{
|
||||
ASSERT(data != NULL);
|
||||
|
||||
capwap_free(data);
|
||||
}
|
||||
|
||||
/* */
|
||||
const struct capwap_message_elements_ops capwap_element_80211_mac_profile_ops = {
|
||||
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||
.create = capwap_80211_mac_profile_element_create,
|
||||
.parse = capwap_80211_mac_profile_element_parsing,
|
||||
.clone = capwap_80211_mac_profile_element_clone,
|
||||
.free = capwap_80211_mac_profile_element_free
|
||||
};
|
18
lib/element_80211_mac_profile.h
Normal file
18
lib/element_80211_mac_profile.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef __CAPWAP_ELEMENT_80211_MAC_PROFILE_HEADER__
|
||||
#define __CAPWAP_ELEMENT_80211_MAC_PROFILE_HEADER__
|
||||
|
||||
#define CAPWAP_ELEMENT_80211_MAC_PROFILE_VENDOR 0
|
||||
#define CAPWAP_ELEMENT_80211_MAC_PROFILE_TYPE 1061
|
||||
#define CAPWAP_ELEMENT_80211_MAC_PROFILE \
|
||||
(struct capwap_message_element_id) { \
|
||||
.vendor = CAPWAP_ELEMENT_80211_MAC_PROFILE_VENDOR, \
|
||||
.type = CAPWAP_ELEMENT_80211_MAC_PROFILE_TYPE \
|
||||
}
|
||||
|
||||
struct capwap_80211_mac_profile_element {
|
||||
uint8_t mac_profile;
|
||||
};
|
||||
|
||||
extern const struct capwap_message_elements_ops capwap_element_80211_mac_profile_ops;
|
||||
|
||||
#endif /* __CAPWAP_ELEMENT_80211_MAC_PROFILE_HEADER__ */
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -53,10 +55,11 @@ static void* capwap_80211_stationkey_element_parsing(capwap_message_elements_han
|
||||
}
|
||||
|
||||
/* */
|
||||
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);
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
102
lib/element_80211_supported_mac_profiles.c
Normal file
102
lib/element_80211_supported_mac_profiles.c
Normal file
@ -0,0 +1,102 @@
|
||||
#include "capwap.h"
|
||||
#include "element.h"
|
||||
|
||||
/*
|
||||
* The IEEE 802.11 Supported MAC Profile message element allows the WTP
|
||||
* to communicate the profiles it supports. The Discovery Request
|
||||
* message, Primary Discovery Request message, and Join Request message
|
||||
* may include one such message element.
|
||||
*
|
||||
* 0 1 2 3
|
||||
* 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0
|
||||
* +=+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|
||||
* | Num_Profiles | Profile_1 | Profile_[2..N]..
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|
||||
*
|
||||
* o Type: 1060 for IEEE 802.11 Supported MAC Profiles
|
||||
*
|
||||
* o Num_Profiles >=1: This refers to the number of profiles present in
|
||||
* this message element. There must be at least one profile.
|
||||
*
|
||||
* o Profile: Each profile is identified by a value specified in
|
||||
* Section 3.2.
|
||||
*/
|
||||
|
||||
/* */
|
||||
static void
|
||||
capwap_80211_supported_mac_profiles_element_create(void *data, capwap_message_elements_handle handle,
|
||||
struct capwap_write_message_elements_ops *func)
|
||||
{
|
||||
struct capwap_80211_supported_mac_profiles_element *element =
|
||||
(struct capwap_80211_supported_mac_profiles_element*)data;
|
||||
|
||||
ASSERT(data != NULL);
|
||||
|
||||
func->write_u8(handle, element->supported_mac_profilescount);
|
||||
func->write_block(handle, element->supported_mac_profiles, element->supported_mac_profilescount);
|
||||
}
|
||||
|
||||
/* */
|
||||
static void *
|
||||
capwap_80211_supported_mac_profiles_element_parsing(capwap_message_elements_handle handle,
|
||||
struct capwap_read_message_elements_ops *func)
|
||||
{
|
||||
unsigned short length;
|
||||
struct capwap_80211_supported_mac_profiles_element *data;
|
||||
|
||||
ASSERT(handle != NULL);
|
||||
ASSERT(func != NULL);
|
||||
|
||||
length = func->read_ready(handle);
|
||||
if (length < 1 || length > 255) {
|
||||
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Supported MAC Profiles element");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
length -= 1;
|
||||
|
||||
/* */
|
||||
data = (struct capwap_80211_supported_mac_profiles_element *)
|
||||
capwap_alloc(sizeof(struct capwap_80211_supported_mac_profiles_element) + length);
|
||||
memset(data, 0, sizeof(struct capwap_80211_supported_mac_profiles_element) + length);
|
||||
|
||||
/* Retrieve data */
|
||||
func->read_u8(handle, &data->supported_mac_profilescount);
|
||||
if (data->supported_mac_profilescount != length) {
|
||||
log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Supported MAC Profiles element");
|
||||
capwap_free(data);
|
||||
return NULL;
|
||||
}
|
||||
func->read_block(handle, data->supported_mac_profiles, length);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* */
|
||||
static void *capwap_80211_supported_mac_profiles_element_clone(void *data)
|
||||
{
|
||||
struct capwap_80211_supported_mac_profiles_element *element =
|
||||
(struct capwap_80211_supported_mac_profiles_element*)data;
|
||||
|
||||
ASSERT(data != NULL);
|
||||
|
||||
return capwap_clone(data, sizeof(struct capwap_80211_supported_mac_profiles_element)
|
||||
+ element->supported_mac_profilescount);
|
||||
}
|
||||
|
||||
/* */
|
||||
static void capwap_80211_supported_mac_profiles_element_free(void *data)
|
||||
{
|
||||
ASSERT(data != NULL);
|
||||
|
||||
capwap_free(data);
|
||||
}
|
||||
|
||||
/* */
|
||||
const struct capwap_message_elements_ops capwap_element_80211_supported_mac_profiles_ops = {
|
||||
.category = CAPWAP_MESSAGE_ELEMENT_SINGLE,
|
||||
.create = capwap_80211_supported_mac_profiles_element_create,
|
||||
.parse = capwap_80211_supported_mac_profiles_element_parsing,
|
||||
.clone = capwap_80211_supported_mac_profiles_element_clone,
|
||||
.free = capwap_80211_supported_mac_profiles_element_free
|
||||
};
|
20
lib/element_80211_supported_mac_profiles.h
Normal file
20
lib/element_80211_supported_mac_profiles.h
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef __CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_HEADER__
|
||||
#define __CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_HEADER__
|
||||
|
||||
#define CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_VENDOR 0
|
||||
#define CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_TYPE 1060
|
||||
#define CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES \
|
||||
(struct capwap_message_element_id) { \
|
||||
.vendor = CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_VENDOR, \
|
||||
.type = CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_TYPE \
|
||||
}
|
||||
|
||||
|
||||
struct capwap_80211_supported_mac_profiles_element {
|
||||
uint8_t supported_mac_profilescount;
|
||||
uint8_t supported_mac_profiles[];
|
||||
};
|
||||
|
||||
extern const struct capwap_message_elements_ops capwap_element_80211_supported_mac_profiles_ops;
|
||||
|
||||
#endif /* __CAPWAP_ELEMENT_80211_SUPPORTED_MAC_PROFILES_HEADER__ */
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_element.h"
|
||||
#include "element.h"
|
||||
|
||||
/********************************************************************
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user