From 627ecd5a9ede17bb51eee257f892d294d2a709d6 Mon Sep 17 00:00:00 2001 From: Andreas Schultz Date: Wed, 17 Aug 2016 14:09:31 +0200 Subject: [PATCH] rework MAC type handling so that split, local and both MAC's are possible --- src/common/capwap_element_wtpmactype.c | 62 ++++++++++++++++---------- src/common/capwap_element_wtpmactype.h | 16 ++++--- src/wtp/wtp.c | 53 +++++++++++++++++++--- 3 files changed, 97 insertions(+), 34 deletions(-) diff --git a/src/common/capwap_element_wtpmactype.c b/src/common/capwap_element_wtpmactype.c index da5e687..622839f 100644 --- a/src/common/capwap_element_wtpmactype.c +++ b/src/common/capwap_element_wtpmactype.c @@ -1,48 +1,59 @@ #include "capwap.h" #include "capwap_element.h" -/******************************************************************** - - 0 - 0 1 2 3 4 5 6 7 -+-+-+-+-+-+-+-+-+ -| MAC Type | -+-+-+-+-+-+-+-+-+ - -Type: 44 for WTP MAC Type - -Length: 1 - -********************************************************************/ +/* + * + * 0 + * 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+ + * | MAC Type | + * +-+-+-+-+-+-+-+-+ + * + * Type: 44 for WTP MAC Type + * + * Length: 1 + * + */ /* */ -static void capwap_wtpmactype_element_create(void* data, capwap_message_elements_handle handle, struct capwap_write_message_elements_ops* func) { - struct capwap_wtpmactype_element* element = (struct capwap_wtpmactype_element*)data; +static void +capwap_wtpmactype_element_create(void *data, capwap_message_elements_handle handle, + struct capwap_write_message_elements_ops *func) +{ + struct capwap_wtpmactype_element *element = + (struct capwap_wtpmactype_element*)data; ASSERT(data != NULL); - ASSERT((element->type == CAPWAP_LOCALMAC) || (element->type == CAPWAP_SPLITMAC) || (element->type == CAPWAP_LOCALANDSPLITMAC)); + ASSERT((element->type == CAPWAP_LOCALMAC) || + (element->type == CAPWAP_SPLITMAC) || + (element->type == CAPWAP_LOCALANDSPLITMAC)); /* */ func->write_u8(handle, element->type); } /* */ -static void* capwap_wtpmactype_element_clone(void* data) { +static void *capwap_wtpmactype_element_clone(void *data) +{ ASSERT(data != NULL); return capwap_clone(data, sizeof(struct capwap_wtpmactype_element)); } /* */ -static void capwap_wtpmactype_element_free(void* data) { +static void capwap_wtpmactype_element_free(void *data) +{ ASSERT(data != NULL); - + capwap_free(data); } /* */ -static void* capwap_wtpmactype_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) { - struct capwap_wtpmactype_element* data; +static void * +capwap_wtpmactype_element_parsing(capwap_message_elements_handle handle, + struct capwap_read_message_elements_ops *func) +{ + struct capwap_wtpmactype_element *data; ASSERT(handle != NULL); ASSERT(func != NULL); @@ -53,9 +64,14 @@ static void* capwap_wtpmactype_element_parsing(capwap_message_elements_handle ha } /* Retrieve data */ - data = (struct capwap_wtpmactype_element*)capwap_alloc(sizeof(struct capwap_wtpmactype_element)); + data = (struct capwap_wtpmactype_element *) + capwap_alloc(sizeof(struct capwap_wtpmactype_element)); + func->read_u8(handle, &data->type); - if ((data->type != CAPWAP_LOCALMAC) && (data->type != CAPWAP_SPLITMAC) && (data->type != CAPWAP_LOCALANDSPLITMAC)) { + if ((data->type != CAPWAP_LOCALMAC) && + (data->type != CAPWAP_SPLITMAC) && + (data->type != CAPWAP_LOCALANDSPLITMAC)) + { capwap_wtpmactype_element_free((void*)data); log_printf(LOG_DEBUG, "Invalid WTP MAC Type element: invalid type"); return NULL; diff --git a/src/common/capwap_element_wtpmactype.h b/src/common/capwap_element_wtpmactype.h index 446ac63..bdf5cef 100644 --- a/src/common/capwap_element_wtpmactype.h +++ b/src/common/capwap_element_wtpmactype.h @@ -1,14 +1,18 @@ #ifndef __CAPWAP_ELEMENT_WTPMACTYPE_HEADER__ #define __CAPWAP_ELEMENT_WTPMACTYPE_HEADER__ -#define CAPWAP_ELEMENT_WTPMACTYPE_VENDOR 0 -#define CAPWAP_ELEMENT_WTPMACTYPE_TYPE 44 -#define CAPWAP_ELEMENT_WTPMACTYPE (struct capwap_message_element_id){ .vendor = CAPWAP_ELEMENT_WTPMACTYPE_VENDOR, .type = CAPWAP_ELEMENT_WTPMACTYPE_TYPE } +#define CAPWAP_ELEMENT_WTPMACTYPE_VENDOR 0 +#define CAPWAP_ELEMENT_WTPMACTYPE_TYPE 44 +#define CAPWAP_ELEMENT_WTPMACTYPE \ + (struct capwap_message_element_id) { \ + .vendor = CAPWAP_ELEMENT_WTPMACTYPE_VENDOR, \ + .type = CAPWAP_ELEMENT_WTPMACTYPE_TYPE \ + } -#define CAPWAP_LOCALMAC 0 -#define CAPWAP_SPLITMAC 1 -#define CAPWAP_LOCALANDSPLITMAC 2 +#define CAPWAP_LOCALMAC 0 +#define CAPWAP_SPLITMAC 1 +#define CAPWAP_LOCALANDSPLITMAC 2 struct capwap_wtpmactype_element { uint8_t type; diff --git a/src/wtp/wtp.c b/src/wtp/wtp.c index ec117aa..0717a38 100644 --- a/src/wtp/wtp.c +++ b/src/wtp/wtp.c @@ -804,6 +804,20 @@ static int wtp_parsing_cfg_descriptor_info(config_t *config) return 1; } +static int wtp_parsing_mac_type(const char *str, int *type) +{ + if (!strcmp(str, "localmac")) { + *type |= 0x01; + } else if (!strcmp(str, "splitmac")) { + *type |= 0x02; + } else { + log_printf(LOG_ERR, "Invalid configuration file, unknown application.mactype value"); + return 0; + } + + return 1; +} + /* Parsing configuration */ static int wtp_parsing_configuration_1_0(config_t* config) { int i; @@ -946,13 +960,42 @@ static int wtp_parsing_configuration_1_0(config_t* config) { } /* Set mactype of WTP */ - if (config_lookup_string(config, "application.mactype", &configString) == CONFIG_TRUE) { - if (!strcmp(configString, "localmac")) { + configSetting = config_lookup(config, "application.mactype"); + if (configSetting != NULL) { + int type = 0; + + switch (config_setting_type(configSetting)) { + case CONFIG_TYPE_ARRAY: { + int count = config_setting_length(configSetting); + + for (i = 0; i < count; i++) + if (!wtp_parsing_mac_type(config_setting_get_string_elem(configSetting, i), &type)) + return 0; + break; + } + + case CONFIG_TYPE_STRING: + if (!wtp_parsing_mac_type(config_setting_get_string(configSetting), &type)) + return 0; + break; + + default: + log_printf(LOG_ERR, "Invalid configuration file, invalid application.mactype type"); + return 0; + } + + switch (type) { + case 0x01: g_wtp.mactype.type = CAPWAP_LOCALMAC; - } else if (!strcmp(configString, "splitmac")) { + break; + case 0x02: g_wtp.mactype.type = CAPWAP_SPLITMAC; - } else { - log_printf(LOG_ERR, "Invalid configuration file, unknown application.mactype value"); + break; + case 0x03: + g_wtp.mactype.type = CAPWAP_LOCALANDSPLITMAC; + break; + default: + log_printf(LOG_ERR, "Invalid configuration file, invalid application.mactype value"); return 0; } }