From 7fd2d4357a6e9c5884e0943cc9dd8a8d6aafdec2 Mon Sep 17 00:00:00 2001 From: vemax78 Date: Wed, 26 Mar 2014 21:35:52 +0100 Subject: [PATCH] Preparations to parse IEEE802.11 management packets --- build/ac/Makefile.am | 4 +++- src/ac/ac.c | 20 ++++++++++++++++++++ src/ac/ac.h | 9 +++++++++ src/ac/ac_ieee80211_data.c | 10 ++++++++++ src/ac/ac_session.h | 3 +++ src/ac/ac_session_data.c | 16 +++++++++++++++- 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/ac/ac_ieee80211_data.c diff --git a/build/ac/Makefile.am b/build/ac/Makefile.am index 7eca53a..cd54ab5 100755 --- a/build/ac/Makefile.am +++ b/build/ac/Makefile.am @@ -36,7 +36,8 @@ endif INCLUDES = \ -I$(top_srcdir)/build \ -I$(top_srcdir)/src/common \ - -I$(top_srcdir)/src/ac + -I$(top_srcdir)/src/ac \ + -I$(top_srcdir)/src/binding/ieee80211 include $(top_srcdir)/build/Makefile_common.am @@ -51,6 +52,7 @@ ac_SOURCES = \ $(top_srcdir)/src/ac/ac_execute.c \ $(top_srcdir)/src/ac/ac_session.c \ $(top_srcdir)/src/ac/ac_session_data.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 \ diff --git a/src/ac/ac.c b/src/ac/ac.c index 88b12f0..26130d5 100644 --- a/src/ac/ac.c +++ b/src/ac/ac.c @@ -17,6 +17,20 @@ struct ac_t g_ac; /* Local param */ static char g_configurationfile[260] = AC_DEFAULT_CONFIGURATION_FILE; +/* */ +static unsigned long ac_stations_item_gethash(const void* key, unsigned long keysize, unsigned long hashsize) { + uint8_t* macaddress = (uint8_t*)key; + + ASSERT(keysize == ETH_ALEN); + + return ((((unsigned long)macaddress[4] << 8) | (unsigned long)macaddress[5]) ^ ((unsigned long)macaddress[3] << 4)); +} + +/* */ +static void ac_stations_item_free(const void* key, unsigned long keysize, void* data) { + /* TODO */ +} + /* Alloc AC */ static int ac_init(void) { g_ac.standalone = 1; @@ -64,6 +78,9 @@ static int ac_init(void) { g_ac.sessionsthread = capwap_list_create(); capwap_rwlock_init(&g_ac.sessionslock); + /* Stations */ + g_ac.stations = capwap_hash_create(AC_STATIONS_HASH_SIZE, AC_STATIONS_KEY_SIZE, ac_stations_item_gethash, NULL, ac_stations_item_free); + /* Backend */ g_ac.availablebackends = capwap_array_create(sizeof(struct ac_http_soap_server*), 0, 0); @@ -102,6 +119,9 @@ static void ac_destroy(void) { capwap_rwlock_destroy(&g_ac.sessionslock); ac_msgqueue_free(); + /* Stations */ + capwap_hash_free(g_ac.stations); + /* Backend */ if (g_ac.backendacid) { capwap_free(g_ac.backendacid); diff --git a/src/ac/ac.h b/src/ac/ac.h index 95d21c3..6e09560 100644 --- a/src/ac/ac.h +++ b/src/ac/ac.h @@ -9,9 +9,11 @@ #include "capwap_lock.h" #include "capwap_rwlock.h" #include "capwap_list.h" +#include "capwap_hash.h" #include "capwap_element.h" #include +#include /* AC Configuration */ #define AC_DEFAULT_CONFIGURATION_FILE "/etc/capwap/ac.conf" @@ -53,6 +55,10 @@ #define AC_IDLE_TIMEOUT_INTERVAL 300000 #define AC_WTP_FALLBACK_MODE CAPWAP_WTP_FALLBACK_ENABLED +/* */ +#define AC_STATIONS_HASH_SIZE 65536 +#define AC_STATIONS_KEY_SIZE ETH_ALEN + /* */ struct ac_state { struct capwap_ecnsupport_element ecn; @@ -91,6 +97,9 @@ struct ac_t { struct capwap_list* sessionsthread; capwap_rwlock_t sessionslock; + /* Stations */ + struct capwap_hash* stations; + /* Dtls */ int enabledtls; struct capwap_dtls_context dtlscontext; diff --git a/src/ac/ac_ieee80211_data.c b/src/ac/ac_ieee80211_data.c new file mode 100644 index 0000000..397a32d --- /dev/null +++ b/src/ac/ac_ieee80211_data.c @@ -0,0 +1,10 @@ +#include "ac.h" +#include "ac_session.h" +#include "ieee80211.h" + +/* */ +void ac_ieee80211_data(struct ac_session_data_t* sessiondata, uint8_t* buffer, int length) { + ASSERT(sessiondata != NULL); + ASSERT(buffer != NULL); + ASSERT(length > 0); +} diff --git a/src/ac/ac_session.h b/src/ac/ac_session.h index c1e55e1..18e595c 100644 --- a/src/ac/ac_session.h +++ b/src/ac/ac_session.h @@ -142,6 +142,9 @@ void ac_session_data_close(struct ac_session_data_t* sessiondata); void ac_session_data_send_action(struct ac_session_data_t* sessiondata, long action, long param, void* data, long length); void ac_session_data_release_reference(struct ac_session_data_t* sessiondata); +/* IEEE802.11 Data Packet */ +void ac_ieee80211_data(struct ac_session_data_t* sessiondata, uint8_t* buffer, int length); + /* */ int ac_has_sessionid(struct capwap_sessionid_element* sessionid); int ac_has_wtpid(const char* wtpid); diff --git a/src/ac/ac_session_data.c b/src/ac/ac_session_data.c index ff03ce9..672c8b8 100644 --- a/src/ac/ac_session_data.c +++ b/src/ac/ac_session_data.c @@ -1,11 +1,14 @@ #include "ac.h" #include "capwap_dfa.h" #include "ac_session.h" +#include "ieee80211.h" #include #define AC_ERROR_TIMEOUT -1000 #define AC_ERROR_ACTION_SESSION -1001 +#define AC_BODY_PACKET_MAX_SIZE 8192 + /* */ static int ac_session_data_action_execute(struct ac_session_data_t* sessiondata, struct ac_session_action* action) { int result = AC_ERROR_ACTION_SESSION; @@ -302,6 +305,9 @@ static void ac_session_data_run(struct ac_session_data_t* sessiondata) { int length; struct capwap_connection connection; char buffer[CAPWAP_MAX_PACKET_SIZE]; + unsigned short binding; + int bodypacketlength; + uint8_t bodypacket[AC_BODY_PACKET_MAX_SIZE]; ASSERT(sessiondata != NULL); @@ -357,7 +363,15 @@ static void ac_session_data_run(struct ac_session_data_t* sessiondata) { /* Update timeout */ capwap_timeout_set(sessiondata->timeout, sessiondata->idtimerkeepalivedead, AC_MAX_DATA_KEEPALIVE_INTERVAL, NULL, NULL, NULL); } else { - /* TODO */ + bodypacketlength = capwap_packet_getdata(sessiondata->rxmngpacket, bodypacket, AC_BODY_PACKET_MAX_SIZE); + + /* Parsing body packet */ + if (bodypacketlength > 0) { + binding = GET_WBID_HEADER(sessiondata->rxmngpacket->header); + if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) { + ac_ieee80211_data(sessiondata, bodypacket, bodypacketlength); + } + } } } else { capwap_logging_debug("Failed validation parsed data packet");