diff --git a/build/Makefile_common.am b/build/Makefile_common.am index 9b66a1f..7fa1e72 100755 --- a/build/Makefile_common.am +++ b/build/Makefile_common.am @@ -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 \ diff --git a/src/common/capwap_element.c b/src/common/capwap_element.c index b728f55..7aaf6cd 100644 --- a/src/common/capwap_element.c +++ b/src/common/capwap_element.c @@ -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, diff --git a/src/common/capwap_element.h b/src/common/capwap_element.h index 14f109b..928f5ee 100644 --- a/src/common/capwap_element.h +++ b/src/common/capwap_element.h @@ -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 */ diff --git a/src/common/capwap_element_80211_assignbssid.c b/src/common/capwap_element_80211_assignbssid.c new file mode 100644 index 0000000..60cd062 --- /dev/null +++ b/src/common/capwap_element_80211_assignbssid.c @@ -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 +}; diff --git a/src/common/capwap_element_80211_assignbssid.h b/src/common/capwap_element_80211_assignbssid.h new file mode 100644 index 0000000..98bfa20 --- /dev/null +++ b/src/common/capwap_element_80211_assignbssid.h @@ -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__ */ diff --git a/src/common/capwap_element_80211_deletewlan.c b/src/common/capwap_element_80211_deletewlan.c new file mode 100644 index 0000000..4148949 --- /dev/null +++ b/src/common/capwap_element_80211_deletewlan.c @@ -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 +}; diff --git a/src/common/capwap_element_80211_deletewlan.h b/src/common/capwap_element_80211_deletewlan.h new file mode 100644 index 0000000..808850e --- /dev/null +++ b/src/common/capwap_element_80211_deletewlan.h @@ -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__ */ diff --git a/src/common/capwap_element_80211_ie.c b/src/common/capwap_element_80211_ie.c new file mode 100644 index 0000000..7e27f9a --- /dev/null +++ b/src/common/capwap_element_80211_ie.c @@ -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 +}; diff --git a/src/common/capwap_element_80211_ie.h b/src/common/capwap_element_80211_ie.h new file mode 100644 index 0000000..7f73126 --- /dev/null +++ b/src/common/capwap_element_80211_ie.h @@ -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__ */