Add also 80211 message element

This commit is contained in:
vemax78 2013-05-28 23:06:57 +02:00
parent 3d60af6a84
commit b99a52ee9d
9 changed files with 276 additions and 3 deletions

View File

@ -63,7 +63,10 @@ capwap_SOURCES = \
$(top_srcdir)/src/common/capwap_element_wtpfallback.c \
$(top_srcdir)/src/common/capwap_element_radiooprstate.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_multidomaincapability.c \
$(top_srcdir)/src/common/capwap_element_80211_ofdmcontrol.c \

View File

@ -94,10 +94,10 @@ static struct capwap_message_elements_ops* capwap_message_elements[CAPWAP_MESSAG
static struct capwap_message_elements_ops* capwap_80211_message_elements[CAPWAP_MESSAGE_ELEMENTS_COUNT] = {
/* */ NULL,
/* CAPWAP_ELEMENT_80211_ANTENNA */ &capwap_element_80211_antenna_ops,
/* */ NULL,
/* */ NULL,
/* CAPWAP_ELEMENT_80211_ASSIGN_BSSID */ &capwap_element_80211_assignbssid_ops,
/* CAPWAP_ELEMENT_80211_DELETE_WLAN */ &capwap_element_80211_deletewlan_ops,
/* CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL */ &capwap_element_80211_directsequencecontrol_ops,
/* */ NULL,
/* CAPWAP_ELEMENT_80211_IE */ &capwap_element_80211_ie_ops,
/* CAPWAP_ELEMENT_80211_MACOPERATION */ &capwap_element_80211_macoperation_ops,
/* */ NULL,
/* CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY */ &capwap_element_80211_multidomaincapability_ops,

View File

@ -103,7 +103,10 @@ struct capwap_message_elements_ops* capwap_get_message_element_ops(unsigned shor
/* IEEE 802.11 message elements */
#include "capwap_element_80211_antenna.h" /* 01025 */
#include "capwap_element_80211_assignbssid.h" /* 01026 */
#include "capwap_element_80211_deletewlan.h" /* 01027 */
#include "capwap_element_80211_directsequencecontrol.h" /* 01028 */
#include "capwap_element_80211_ie.h" /* 01029 */
#include "capwap_element_80211_macoperation.h" /* 01030 */
#include "capwap_element_80211_multidomaincapability.h" /* 01032 */
#include "capwap_element_80211_ofdmcontrol.h" /* 01033 */

View File

@ -0,0 +1,70 @@
#include "capwap.h"
#include "capwap_element.h"
/********************************************************************
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Radio ID | WLAN ID | BSSID
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| BSSID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type: 1026 for IEEE 802.11 Assigned WTP BSSID
Length: 8
********************************************************************/
/* */
static void capwap_80211_assignbssid_element_create(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func) {
struct capwap_80211_assignbssid_element* element = (struct capwap_80211_assignbssid_element*)data;
ASSERT(data != NULL);
func->write_u8(handle, element->radioid);
func->write_u8(handle, element->wlanid);
func->write_block(handle, element->bssid, CAPWAP_ASSIGN_BSSID_LENGTH);
}
/* */
static void* capwap_80211_assignbssid_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
struct capwap_80211_assignbssid_element* data;
ASSERT(handle != NULL);
ASSERT(func != NULL);
if (func->read_ready(handle) != 8) {
capwap_logging_debug("Invalid IEEE 802.11 Assigned WTP BSSID element");
return NULL;
}
/* */
data = (struct capwap_80211_assignbssid_element*)capwap_alloc(sizeof(struct capwap_80211_assignbssid_element));
if (!data) {
capwap_outofmemory();
}
/* Retrieve data */
memset(data, 0, sizeof(struct capwap_80211_assignbssid_element));
func->read_u8(handle, &data->radioid);
func->read_u8(handle, &data->wlanid);
func->read_block(handle, data->bssid, CAPWAP_ASSIGN_BSSID_LENGTH);
return data;
}
/* */
static void capwap_80211_assignbssid_element_free(void* data) {
ASSERT(data != NULL);
capwap_free(data);
}
/* */
struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops = {
.create_message_element = capwap_80211_assignbssid_element_create,
.parsing_message_element = capwap_80211_assignbssid_element_parsing,
.free_parsed_message_element = capwap_80211_assignbssid_element_free
};

View File

@ -0,0 +1,16 @@
#ifndef __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__
#define __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__
#define CAPWAP_ELEMENT_80211_ASSIGN_BSSID 1026
#define CAPWAP_ASSIGN_BSSID_LENGTH 6
struct capwap_80211_assignbssid_element {
uint8_t radioid;
uint8_t wlanid;
uint8_t bssid[CAPWAP_ASSIGN_BSSID_LENGTH];
};
extern struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops;
#endif /* __CAPWAP_ELEMENT_80211_ASSIGN_BSSID_HEADER__ */

View File

@ -0,0 +1,66 @@
#include "capwap.h"
#include "capwap_element.h"
/********************************************************************
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Radio ID | WLAN ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type: 1027 for IEEE 802.11 Delete WLAN
Length: 2
********************************************************************/
/* */
static void capwap_80211_deletewlan_element_create(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func) {
struct capwap_80211_deletewlan_element* element = (struct capwap_80211_deletewlan_element*)data;
ASSERT(data != NULL);
func->write_u8(handle, element->radioid);
func->write_u8(handle, element->wlanid);
}
/* */
static void* capwap_80211_deletewlan_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
struct capwap_80211_deletewlan_element* data;
ASSERT(handle != NULL);
ASSERT(func != NULL);
if (func->read_ready(handle) != 2) {
capwap_logging_debug("Invalid IEEE 802.11 Delete WLAN element");
return NULL;
}
/* */
data = (struct capwap_80211_deletewlan_element*)capwap_alloc(sizeof(struct capwap_80211_deletewlan_element));
if (!data) {
capwap_outofmemory();
}
/* Retrieve data */
memset(data, 0, sizeof(struct capwap_80211_deletewlan_element));
func->read_u8(handle, &data->radioid);
func->read_u8(handle, &data->wlanid);
return data;
}
/* */
static void capwap_80211_deletewlan_element_free(void* data) {
ASSERT(data != NULL);
capwap_free(data);
}
/* */
struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops = {
.create_message_element = capwap_80211_deletewlan_element_create,
.parsing_message_element = capwap_80211_deletewlan_element_parsing,
.free_parsed_message_element = capwap_80211_deletewlan_element_free
};

View File

@ -0,0 +1,13 @@
#ifndef __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__
#define __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__
#define CAPWAP_ELEMENT_80211_DELETE_WLAN 1027
struct capwap_80211_deletewlan_element {
uint8_t radioid;
uint8_t wlanid;
};
extern struct capwap_message_elements_ops capwap_element_80211_deletewlan_ops;
#endif /* __CAPWAP_ELEMENT_80211_DELETE_WLAN_HEADER__ */

View File

@ -0,0 +1,83 @@
#include "capwap.h"
#include "capwap_element.h"
/********************************************************************
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Radio ID | WLAN ID |B|P| Reserved |Info Element...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type: 1029 for IEEE 802.11 Information Element
Length: >= 4
********************************************************************/
/* */
static void capwap_80211_ie_element_create(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func) {
struct capwap_80211_ie_element* element = (struct capwap_80211_ie_element*)data;
ASSERT(data != NULL);
func->write_u8(handle, element->radioid);
func->write_u8(handle, element->wlanid);
func->write_u8(handle, element->flags);
func->write_block(handle, element->ie, element->ielength);
}
/* */
static void* capwap_80211_ie_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
unsigned short length;
struct capwap_80211_ie_element* data;
ASSERT(handle != NULL);
ASSERT(func != NULL);
length = func->read_ready(handle);
if (length < 4) {
capwap_logging_debug("Invalid IEEE 802.11 Information Element element");
return NULL;
}
/* */
length -= 3;
/* */
data = (struct capwap_80211_ie_element*)capwap_alloc(sizeof(struct capwap_80211_ie_element));
if (!data) {
capwap_outofmemory();
}
/* Retrieve data */
memset(data, 0, sizeof(struct capwap_80211_ie_element));
func->read_u8(handle, &data->radioid);
func->read_u8(handle, &data->wlanid);
func->read_u8(handle, &data->flags);
data->ielength = length;
data->ie = (uint8_t*)capwap_alloc(data->ielength);
if (!data->ie) {
capwap_outofmemory();
}
func->read_block(handle, data->ie, data->ielength);
return data;
}
/* */
static void capwap_80211_ie_element_free(void* data) {
struct capwap_80211_ie_element* element = (struct capwap_80211_ie_element*)data;
ASSERT(data != NULL);
capwap_free(element->ie);
capwap_free(element);
}
/* */
struct capwap_message_elements_ops capwap_element_80211_ie_ops = {
.create_message_element = capwap_80211_ie_element_create,
.parsing_message_element = capwap_80211_ie_element_parsing,
.free_parsed_message_element = capwap_80211_ie_element_free
};

View File

@ -0,0 +1,19 @@
#ifndef __CAPWAP_ELEMENT_80211_IE_HEADER__
#define __CAPWAP_ELEMENT_80211_IE_HEADER__
#define CAPWAP_ELEMENT_80211_IE 1029
#define CAPWAP_IE_BEACONS_ASSOCIATED 0x80
#define CAPWAP_IE_PROBE_RESPONSE_ASSOCIATED 0x40
struct capwap_80211_ie_element {
uint8_t radioid;
uint8_t wlanid;
uint8_t flags;
uint16_t ielength;
uint8_t* ie;
};
extern struct capwap_message_elements_ops capwap_element_80211_ie_ops;
#endif /* __CAPWAP_ELEMENT_80211_IE_HEADER__ */