diff --git a/src/common/capwap_element.c b/src/common/capwap_element.c index bab4160..190fa5d 100644 --- a/src/common/capwap_element.c +++ b/src/common/capwap_element.c @@ -676,12 +676,12 @@ void capwap_free_parsed_packet(struct capwap_parsed_packet* packet) { msgops = capwap_get_message_element_ops(messageelement->type); if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) { - msgops->free_parsed_message_element(messageelement->data); + msgops->free_message_element(messageelement->data); } else if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY) { struct capwap_array* arraymessageelement = (struct capwap_array*)messageelement->data; for (i = 0; i < arraymessageelement->count; i++) { - msgops->free_parsed_message_element(*(void**)capwap_array_get_item_pointer(arraymessageelement, i)); + msgops->free_message_element(*(void**)capwap_array_get_item_pointer(arraymessageelement, i)); } /* */ diff --git a/src/common/capwap_element.h b/src/common/capwap_element.h index 979a575..020fa3b 100644 --- a/src/common/capwap_element.h +++ b/src/common/capwap_element.h @@ -28,7 +28,10 @@ struct capwap_message_elements_ops { /* Parsing message element */ void* (*parsing_message_element)(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func); - void (*free_parsed_message_element)(void*); + + /* Memory management */ + void* (*clone_message_element)(void*); + void (*free_message_element)(void*); }; struct capwap_message_elements_ops* capwap_get_message_element_ops(unsigned short code); diff --git a/src/common/capwap_element_80211_addwlan.c b/src/common/capwap_element_80211_addwlan.c index fced4aa..1cc35fb 100644 --- a/src/common/capwap_element_80211_addwlan.c +++ b/src/common/capwap_element_80211_addwlan.c @@ -56,6 +56,22 @@ static void capwap_80211_addwlan_element_create(void* data, capwap_message_eleme func->write_block(handle, element->ssid, length); } +/* */ +static void* capwap_80211_addwlan_element_clone(void* data) { + struct capwap_80211_addwlan_element* cloneelement; + struct capwap_80211_addwlan_element* element = (struct capwap_80211_addwlan_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_80211_addwlan_element)); + if (cloneelement->keylength > 0) { + cloneelement->key = capwap_clone(element->key, cloneelement->keylength); + } + cloneelement->ssid = (uint8_t*)capwap_duplicate_string((char*)element->ssid); + + return cloneelement; +} + /* */ static void capwap_80211_addwlan_element_free(void* data) { struct capwap_80211_addwlan_element* element = (struct capwap_80211_addwlan_element*)data; @@ -140,5 +156,6 @@ static void* capwap_80211_addwlan_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_80211_addwlan_ops = { .create_message_element = capwap_80211_addwlan_element_create, .parsing_message_element = capwap_80211_addwlan_element_parsing, - .free_parsed_message_element = capwap_80211_addwlan_element_free + .clone_message_element = capwap_80211_addwlan_element_clone, + .free_message_element = capwap_80211_addwlan_element_free }; diff --git a/src/common/capwap_element_80211_antenna.c b/src/common/capwap_element_80211_antenna.c index 52c0f99..91e54ef 100644 --- a/src/common/capwap_element_80211_antenna.c +++ b/src/common/capwap_element_80211_antenna.c @@ -35,6 +35,23 @@ static void capwap_80211_antenna_element_create(void* data, capwap_message_eleme } } +/* */ +static void* capwap_80211_antenna_element_clone(void* data) { + int i; + struct capwap_80211_antenna_element* cloneelement; + struct capwap_80211_antenna_element* element = (struct capwap_80211_antenna_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_80211_antenna_element)); + cloneelement->selections = capwap_array_create(sizeof(uint8_t), 0, 1); + for (i = 0; i < element->selections->count; i++) { + memcpy(capwap_array_get_item_pointer(cloneelement->selections, i), capwap_array_get_item_pointer(element->selections, i), sizeof(uint8_t)); + } + + return cloneelement; +} + /* */ static void capwap_80211_antenna_element_free(void* data) { struct capwap_80211_antenna_element* element = (struct capwap_80211_antenna_element*)data; @@ -103,5 +120,6 @@ static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_80211_antenna_ops = { .create_message_element = capwap_80211_antenna_element_create, .parsing_message_element = capwap_80211_antenna_element_parsing, - .free_parsed_message_element = capwap_80211_antenna_element_free + .clone_message_element = capwap_80211_antenna_element_clone, + .free_message_element = capwap_80211_antenna_element_free }; diff --git a/src/common/capwap_element_80211_assignbssid.c b/src/common/capwap_element_80211_assignbssid.c index cefc0e7..d89256c 100644 --- a/src/common/capwap_element_80211_assignbssid.c +++ b/src/common/capwap_element_80211_assignbssid.c @@ -52,6 +52,13 @@ static void* capwap_80211_assignbssid_element_parsing(capwap_message_elements_ha return data; } +/* */ +static void* capwap_80211_assignbssid_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_assignbssid_element)); +} + /* */ static void capwap_80211_assignbssid_element_free(void* data) { ASSERT(data != NULL); @@ -63,5 +70,6 @@ static void capwap_80211_assignbssid_element_free(void* 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 + .clone_message_element = capwap_80211_assignbssid_element_clone, + .free_message_element = capwap_80211_assignbssid_element_free }; diff --git a/src/common/capwap_element_80211_deletewlan.c b/src/common/capwap_element_80211_deletewlan.c index 34164ce..773c6a4 100644 --- a/src/common/capwap_element_80211_deletewlan.c +++ b/src/common/capwap_element_80211_deletewlan.c @@ -48,6 +48,13 @@ static void* capwap_80211_deletewlan_element_parsing(capwap_message_elements_han return data; } +/* */ +static void* capwap_80211_deletewlan_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_deletewlan_element)); +} + /* */ static void capwap_80211_deletewlan_element_free(void* data) { ASSERT(data != NULL); @@ -59,5 +66,6 @@ static void capwap_80211_deletewlan_element_free(void* 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 + .clone_message_element = capwap_80211_deletewlan_element_clone, + .free_message_element = capwap_80211_deletewlan_element_free }; diff --git a/src/common/capwap_element_80211_directsequencecontrol.c b/src/common/capwap_element_80211_directsequencecontrol.c index a8d9d8f..7914941 100644 --- a/src/common/capwap_element_80211_directsequencecontrol.c +++ b/src/common/capwap_element_80211_directsequencecontrol.c @@ -32,6 +32,13 @@ static void capwap_80211_directsequencecontrol_element_create(void* data, capwap func->write_u32(handle, element->enerydetectthreshold); } +/* */ +static void* capwap_80211_directsequencecontrol_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_directsequencecontrol_element)); +} + /* */ static void capwap_80211_directsequencecontrol_element_free(void* data) { ASSERT(data != NULL); @@ -75,5 +82,6 @@ static void* capwap_80211_directsequencecontrol_element_parsing(capwap_message_e struct capwap_message_elements_ops capwap_element_80211_directsequencecontrol_ops = { .create_message_element = capwap_80211_directsequencecontrol_element_create, .parsing_message_element = capwap_80211_directsequencecontrol_element_parsing, - .free_parsed_message_element = capwap_80211_directsequencecontrol_element_free + .clone_message_element = capwap_80211_directsequencecontrol_element_clone, + .free_message_element = capwap_80211_directsequencecontrol_element_free }; diff --git a/src/common/capwap_element_80211_ie.c b/src/common/capwap_element_80211_ie.c index 8833eab..b2f9a10 100644 --- a/src/common/capwap_element_80211_ie.c +++ b/src/common/capwap_element_80211_ie.c @@ -59,6 +59,18 @@ static void* capwap_80211_ie_element_parsing(capwap_message_elements_handle hand return data; } +/* */ +static void* capwap_80211_ie_element_clone(void* data) { + struct capwap_80211_ie_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_80211_ie_element)); + cloneelement->ie = capwap_clone(((struct capwap_80211_ie_element*)data)->ie, cloneelement->ielength); + + return cloneelement; +} + /* */ static void capwap_80211_ie_element_free(void* data) { struct capwap_80211_ie_element* element = (struct capwap_80211_ie_element*)data; @@ -73,5 +85,6 @@ static void capwap_80211_ie_element_free(void* data) { 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 + .clone_message_element = capwap_80211_ie_element_clone, + .free_message_element = capwap_80211_ie_element_free }; diff --git a/src/common/capwap_element_80211_macoperation.c b/src/common/capwap_element_80211_macoperation.c index 10b19f9..b7e9b1e 100644 --- a/src/common/capwap_element_80211_macoperation.c +++ b/src/common/capwap_element_80211_macoperation.c @@ -67,6 +67,13 @@ static void* capwap_80211_macoperation_element_parsing(capwap_message_elements_h return data; } +/* */ +static void* capwap_80211_macoperation_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_macoperation_element)); +} + /* */ static void capwap_80211_macoperation_element_free(void* data) { ASSERT(data != NULL); @@ -78,5 +85,6 @@ static void capwap_80211_macoperation_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_macoperation_ops = { .create_message_element = capwap_80211_macoperation_element_create, .parsing_message_element = capwap_80211_macoperation_element_parsing, - .free_parsed_message_element = capwap_80211_macoperation_element_free + .clone_message_element = capwap_80211_macoperation_element_clone, + .free_message_element = capwap_80211_macoperation_element_free }; diff --git a/src/common/capwap_element_80211_miccountermeasures.c b/src/common/capwap_element_80211_miccountermeasures.c index 699e3e7..f2b7fc9 100644 --- a/src/common/capwap_element_80211_miccountermeasures.c +++ b/src/common/capwap_element_80211_miccountermeasures.c @@ -52,6 +52,13 @@ static void* capwap_80211_miccountermeasures_element_parsing(capwap_message_elem return data; } +/* */ +static void* capwap_80211_miccountermeasures_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_miccountermeasures_element)); +} + /* */ static void capwap_80211_miccountermeasures_element_free(void* data) { ASSERT(data != NULL); @@ -63,5 +70,6 @@ static void capwap_80211_miccountermeasures_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops = { .create_message_element = capwap_80211_miccountermeasures_element_create, .parsing_message_element = capwap_80211_miccountermeasures_element_parsing, - .free_parsed_message_element = capwap_80211_miccountermeasures_element_free + .clone_message_element = capwap_80211_miccountermeasures_element_clone, + .free_message_element = capwap_80211_miccountermeasures_element_free }; diff --git a/src/common/capwap_element_80211_multidomaincapability.c b/src/common/capwap_element_80211_multidomaincapability.c index c722b58..55dc3e8 100644 --- a/src/common/capwap_element_80211_multidomaincapability.c +++ b/src/common/capwap_element_80211_multidomaincapability.c @@ -57,6 +57,13 @@ static void* capwap_80211_multidomaincapability_element_parsing(capwap_message_e return data; } +/* */ +static void* capwap_80211_multidomaincapability_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_multidomaincapability_element)); +} + /* */ static void capwap_80211_multidomaincapability_element_free(void* data) { ASSERT(data != NULL); @@ -68,5 +75,6 @@ static void capwap_80211_multidomaincapability_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_multidomaincapability_ops = { .create_message_element = capwap_80211_multidomaincapability_element_create, .parsing_message_element = capwap_80211_multidomaincapability_element_parsing, - .free_parsed_message_element = capwap_80211_multidomaincapability_element_free + .clone_message_element = capwap_80211_multidomaincapability_element_clone, + .free_message_element = capwap_80211_multidomaincapability_element_free }; diff --git a/src/common/capwap_element_80211_ofdmcontrol.c b/src/common/capwap_element_80211_ofdmcontrol.c index a8f7965..b42f897 100644 --- a/src/common/capwap_element_80211_ofdmcontrol.c +++ b/src/common/capwap_element_80211_ofdmcontrol.c @@ -57,6 +57,13 @@ static void* capwap_80211_ofdmcontrol_element_parsing(capwap_message_elements_ha return data; } +/* */ +static void* capwap_80211_ofdmcontrol_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_ofdmcontrol_element)); +} + /* */ static void capwap_80211_ofdmcontrol_element_free(void* data) { ASSERT(data != NULL); @@ -68,5 +75,6 @@ static void capwap_80211_ofdmcontrol_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_ofdmcontrol_ops = { .create_message_element = capwap_80211_ofdmcontrol_element_create, .parsing_message_element = capwap_80211_ofdmcontrol_element_parsing, - .free_parsed_message_element = capwap_80211_ofdmcontrol_element_free + .clone_message_element = capwap_80211_ofdmcontrol_element_clone, + .free_message_element = capwap_80211_ofdmcontrol_element_free }; diff --git a/src/common/capwap_element_80211_rateset.c b/src/common/capwap_element_80211_rateset.c index 9c6776c..af4ee0e 100644 --- a/src/common/capwap_element_80211_rateset.c +++ b/src/common/capwap_element_80211_rateset.c @@ -57,6 +57,13 @@ static void* capwap_80211_rateset_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_80211_rateset_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_rateset_element)); +} + /* */ static void capwap_80211_rateset_element_free(void* data) { ASSERT(data != NULL); @@ -68,5 +75,6 @@ static void capwap_80211_rateset_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_rateset_ops = { .create_message_element = capwap_80211_rateset_element_create, .parsing_message_element = capwap_80211_rateset_element_parsing, - .free_parsed_message_element = capwap_80211_rateset_element_free + .clone_message_element = capwap_80211_rateset_element_clone, + .free_message_element = capwap_80211_rateset_element_free }; diff --git a/src/common/capwap_element_80211_rsnaerrorreport.c b/src/common/capwap_element_80211_rsnaerrorreport.c index d31de9d..649e59e 100644 --- a/src/common/capwap_element_80211_rsnaerrorreport.c +++ b/src/common/capwap_element_80211_rsnaerrorreport.c @@ -85,6 +85,13 @@ static void* capwap_80211_rsnaerrorreport_element_parsing(capwap_message_element return data; } +/* */ +static void* capwap_80211_rsnaerrorreport_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_rsnaerrorreport_element)); +} + /* */ static void capwap_80211_rsnaerrorreport_element_free(void* data) { ASSERT(data != NULL); @@ -96,5 +103,6 @@ static void capwap_80211_rsnaerrorreport_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_rsnaerrorreport_ops = { .create_message_element = capwap_80211_rsnaerrorreport_element_create, .parsing_message_element = capwap_80211_rsnaerrorreport_element_parsing, - .free_parsed_message_element = capwap_80211_rsnaerrorreport_element_free + .clone_message_element = capwap_80211_rsnaerrorreport_element_clone, + .free_message_element = capwap_80211_rsnaerrorreport_element_free }; diff --git a/src/common/capwap_element_80211_station.c b/src/common/capwap_element_80211_station.c index 29482a2..3f2fab4 100644 --- a/src/common/capwap_element_80211_station.c +++ b/src/common/capwap_element_80211_station.c @@ -73,6 +73,13 @@ static void* capwap_80211_station_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_80211_station_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_station_element)); +} + /* */ static void capwap_80211_station_element_free(void* data) { ASSERT(data != NULL); @@ -84,5 +91,6 @@ static void capwap_80211_station_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_station_ops = { .create_message_element = capwap_80211_station_element_create, .parsing_message_element = capwap_80211_station_element_parsing, - .free_parsed_message_element = capwap_80211_station_element_free + .clone_message_element = capwap_80211_station_element_clone, + .free_message_element = capwap_80211_station_element_free }; diff --git a/src/common/capwap_element_80211_stationkey.c b/src/common/capwap_element_80211_stationkey.c index f92844e..d8b7766 100644 --- a/src/common/capwap_element_80211_stationkey.c +++ b/src/common/capwap_element_80211_stationkey.c @@ -68,6 +68,20 @@ static void* capwap_80211_stationkey_element_parsing(capwap_message_elements_han return data; } +/* */ +static void* capwap_80211_stationkey_element_clone(void* data) { + struct capwap_80211_stationkey_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_80211_stationkey_element)); + if (cloneelement->keylength > 0) { + cloneelement->key = capwap_clone(((struct capwap_80211_stationkey_element*)data)->key, cloneelement->keylength); + } + + return cloneelement; +} + /* */ static void capwap_80211_stationkey_element_free(void* data) { struct capwap_80211_stationkey_element* element = (struct capwap_80211_stationkey_element*)data; @@ -85,5 +99,6 @@ static void capwap_80211_stationkey_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_stationkey_ops = { .create_message_element = capwap_80211_stationkey_element_create, .parsing_message_element = capwap_80211_stationkey_element_parsing, - .free_parsed_message_element = capwap_80211_stationkey_element_free + .clone_message_element = capwap_80211_stationkey_element_clone, + .free_message_element = capwap_80211_stationkey_element_free }; diff --git a/src/common/capwap_element_80211_stationqos.c b/src/common/capwap_element_80211_stationqos.c index c43b5be..a0624fa 100644 --- a/src/common/capwap_element_80211_stationqos.c +++ b/src/common/capwap_element_80211_stationqos.c @@ -52,6 +52,13 @@ static void* capwap_80211_stationqos_element_parsing(capwap_message_elements_han return data; } +/* */ +static void* capwap_80211_stationqos_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_stationqos_element)); +} + /* */ static void capwap_80211_stationqos_element_free(void* data) { ASSERT(data != NULL); @@ -63,5 +70,6 @@ static void capwap_80211_stationqos_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_stationqos_ops = { .create_message_element = capwap_80211_stationqos_element_create, .parsing_message_element = capwap_80211_stationqos_element_parsing, - .free_parsed_message_element = capwap_80211_stationqos_element_free + .clone_message_element = capwap_80211_stationqos_element_clone, + .free_message_element = capwap_80211_stationqos_element_free }; diff --git a/src/common/capwap_element_80211_statistics.c b/src/common/capwap_element_80211_statistics.c index a84b770..0080740 100644 --- a/src/common/capwap_element_80211_statistics.c +++ b/src/common/capwap_element_80211_statistics.c @@ -125,6 +125,13 @@ static void* capwap_80211_statistics_element_parsing(capwap_message_elements_han return data; } +/* */ +static void* capwap_80211_statistics_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_statistics_element)); +} + /* */ static void capwap_80211_statistics_element_free(void* data) { ASSERT(data != NULL); @@ -136,5 +143,6 @@ static void capwap_80211_statistics_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_statistics_ops = { .create_message_element = capwap_80211_statistics_element_create, .parsing_message_element = capwap_80211_statistics_element_parsing, - .free_parsed_message_element = capwap_80211_statistics_element_free + .clone_message_element = capwap_80211_statistics_element_clone, + .free_message_element = capwap_80211_statistics_element_free }; diff --git a/src/common/capwap_element_80211_supportedrates.c b/src/common/capwap_element_80211_supportedrates.c index 05f43f4..fe6a7ad 100644 --- a/src/common/capwap_element_80211_supportedrates.c +++ b/src/common/capwap_element_80211_supportedrates.c @@ -57,6 +57,13 @@ static void* capwap_80211_supportedrates_element_parsing(capwap_message_elements return data; } +/* */ +static void* capwap_80211_supportedrates_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_supportedrates_element)); +} + /* */ static void capwap_80211_supportedrates_element_free(void* data) { ASSERT(data != NULL); @@ -68,5 +75,6 @@ static void capwap_80211_supportedrates_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_supportedrates_ops = { .create_message_element = capwap_80211_supportedrates_element_create, .parsing_message_element = capwap_80211_supportedrates_element_parsing, - .free_parsed_message_element = capwap_80211_supportedrates_element_free + .clone_message_element = capwap_80211_supportedrates_element_clone, + .free_message_element = capwap_80211_supportedrates_element_free }; diff --git a/src/common/capwap_element_80211_txpower.c b/src/common/capwap_element_80211_txpower.c index 3282270..eba2edb 100644 --- a/src/common/capwap_element_80211_txpower.c +++ b/src/common/capwap_element_80211_txpower.c @@ -51,6 +51,13 @@ static void* capwap_80211_txpower_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_80211_txpower_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_txpower_element)); +} + /* */ static void capwap_80211_txpower_element_free(void* data) { ASSERT(data != NULL); @@ -62,5 +69,6 @@ static void capwap_80211_txpower_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_txpower_ops = { .create_message_element = capwap_80211_txpower_element_create, .parsing_message_element = capwap_80211_txpower_element_parsing, - .free_parsed_message_element = capwap_80211_txpower_element_free + .clone_message_element = capwap_80211_txpower_element_clone, + .free_message_element = capwap_80211_txpower_element_free }; diff --git a/src/common/capwap_element_80211_txpowerlevel.c b/src/common/capwap_element_80211_txpowerlevel.c index 3ade171..e648c42 100644 --- a/src/common/capwap_element_80211_txpowerlevel.c +++ b/src/common/capwap_element_80211_txpowerlevel.c @@ -72,6 +72,13 @@ static void* capwap_80211_txpowerlevel_element_parsing(capwap_message_elements_h return data; } +/* */ +static void* capwap_80211_txpowerlevel_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_txpowerlevel_element)); +} + /* */ static void capwap_80211_txpowerlevel_element_free(void* data) { ASSERT(data != NULL); @@ -83,5 +90,6 @@ static void capwap_80211_txpowerlevel_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_txpowerlevel_ops = { .create_message_element = capwap_80211_txpowerlevel_element_create, .parsing_message_element = capwap_80211_txpowerlevel_element_parsing, - .free_parsed_message_element = capwap_80211_txpowerlevel_element_free + .clone_message_element = capwap_80211_txpowerlevel_element_clone, + .free_message_element = capwap_80211_txpowerlevel_element_free }; diff --git a/src/common/capwap_element_80211_updatestationqos.c b/src/common/capwap_element_80211_updatestationqos.c index b4eb0c1..25804fc 100644 --- a/src/common/capwap_element_80211_updatestationqos.c +++ b/src/common/capwap_element_80211_updatestationqos.c @@ -68,6 +68,13 @@ static void* capwap_80211_updatestationqos_element_parsing(capwap_message_elemen return data; } +/* */ +static void* capwap_80211_updatestationqos_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_updatestationqos_element)); +} + /* */ static void capwap_80211_updatestationqos_element_free(void* data) { ASSERT(data != NULL); @@ -79,5 +86,6 @@ static void capwap_80211_updatestationqos_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_updatestationqos_ops = { .create_message_element = capwap_80211_updatestationqos_element_create, .parsing_message_element = capwap_80211_updatestationqos_element_parsing, - .free_parsed_message_element = capwap_80211_updatestationqos_element_free + .clone_message_element = capwap_80211_updatestationqos_element_clone, + .free_message_element = capwap_80211_updatestationqos_element_free }; diff --git a/src/common/capwap_element_80211_updatewlan.c b/src/common/capwap_element_80211_updatewlan.c index 4432079..425ac00 100644 --- a/src/common/capwap_element_80211_updatewlan.c +++ b/src/common/capwap_element_80211_updatewlan.c @@ -36,6 +36,20 @@ static void capwap_80211_updatewlan_element_create(void* data, capwap_message_el } } +/* */ +static void* capwap_80211_updatewlan_element_clone(void* data) { + struct capwap_80211_updatewlan_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_80211_updatewlan_element)); + if (cloneelement->keylength > 0) { + cloneelement->key = capwap_clone(((struct capwap_80211_updatewlan_element*)data)->key, cloneelement->keylength); + } + + return cloneelement; +} + /* */ static void capwap_80211_updatewlan_element_free(void* data) { struct capwap_80211_updatewlan_element* element = (struct capwap_80211_updatewlan_element*)data; @@ -93,5 +107,6 @@ static void* capwap_80211_updatewlan_element_parsing(capwap_message_elements_han struct capwap_message_elements_ops capwap_element_80211_updatewlan_ops = { .create_message_element = capwap_80211_updatewlan_element_create, .parsing_message_element = capwap_80211_updatewlan_element_parsing, - .free_parsed_message_element = capwap_80211_updatewlan_element_free + .clone_message_element = capwap_80211_updatewlan_element_clone, + .free_message_element = capwap_80211_updatewlan_element_free }; diff --git a/src/common/capwap_element_80211_wtpqos.c b/src/common/capwap_element_80211_wtpqos.c index 9abdac6..53a8bde 100644 --- a/src/common/capwap_element_80211_wtpqos.c +++ b/src/common/capwap_element_80211_wtpqos.c @@ -76,6 +76,13 @@ static void* capwap_80211_wtpqos_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_80211_wtpqos_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_wtpqos_element)); +} + /* */ static void capwap_80211_wtpqos_element_free(void* data) { ASSERT(data != NULL); @@ -87,5 +94,6 @@ static void capwap_80211_wtpqos_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_wtpqos_ops = { .create_message_element = capwap_80211_wtpqos_element_create, .parsing_message_element = capwap_80211_wtpqos_element_parsing, - .free_parsed_message_element = capwap_80211_wtpqos_element_free + .clone_message_element = capwap_80211_wtpqos_element_clone, + .free_message_element = capwap_80211_wtpqos_element_free }; diff --git a/src/common/capwap_element_80211_wtpradioconf.c b/src/common/capwap_element_80211_wtpradioconf.c index 69f2298..c8765b4 100644 --- a/src/common/capwap_element_80211_wtpradioconf.c +++ b/src/common/capwap_element_80211_wtpradioconf.c @@ -64,6 +64,13 @@ static void* capwap_80211_wtpradioconf_element_parsing(capwap_message_elements_h return data; } +/* */ +static void* capwap_80211_wtpradioconf_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_wtpradioconf_element)); +} + /* */ static void capwap_80211_wtpradioconf_element_free(void* data) { ASSERT(data != NULL); @@ -75,5 +82,6 @@ static void capwap_80211_wtpradioconf_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_wtpradioconf_ops = { .create_message_element = capwap_80211_wtpradioconf_element_create, .parsing_message_element = capwap_80211_wtpradioconf_element_parsing, - .free_parsed_message_element = capwap_80211_wtpradioconf_element_free + .clone_message_element = capwap_80211_wtpradioconf_element_clone, + .free_message_element = capwap_80211_wtpradioconf_element_free }; diff --git a/src/common/capwap_element_80211_wtpradiofailalarm.c b/src/common/capwap_element_80211_wtpradiofailalarm.c index 1f3d064..639a185 100644 --- a/src/common/capwap_element_80211_wtpradiofailalarm.c +++ b/src/common/capwap_element_80211_wtpradiofailalarm.c @@ -52,6 +52,13 @@ static void* capwap_80211_wtpradiofailalarm_element_parsing(capwap_message_eleme return data; } +/* */ +static void* capwap_80211_wtpradiofailalarm_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_wtpradiofailalarm_element)); +} + /* */ static void capwap_80211_wtpradiofailalarm_element_free(void* data) { ASSERT(data != NULL); @@ -63,5 +70,6 @@ static void capwap_80211_wtpradiofailalarm_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_wtpradiofailalarm_ops = { .create_message_element = capwap_80211_wtpradiofailalarm_element_create, .parsing_message_element = capwap_80211_wtpradiofailalarm_element_parsing, - .free_parsed_message_element = capwap_80211_wtpradiofailalarm_element_free + .clone_message_element = capwap_80211_wtpradiofailalarm_element_clone, + .free_message_element = capwap_80211_wtpradiofailalarm_element_free }; diff --git a/src/common/capwap_element_80211_wtpradioinformation.c b/src/common/capwap_element_80211_wtpradioinformation.c index 4e9ce66..d7528fe 100644 --- a/src/common/capwap_element_80211_wtpradioinformation.c +++ b/src/common/capwap_element_80211_wtpradioinformation.c @@ -51,6 +51,13 @@ static void* capwap_80211_wtpradioinformation_element_parsing(capwap_message_ele return data; } +/* */ +static void* capwap_80211_wtpradioinformation_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_80211_wtpradioinformation_element)); +} + /* */ static void capwap_80211_wtpradioinformation_element_free(void* data) { ASSERT(data != NULL); @@ -62,5 +69,6 @@ static void capwap_80211_wtpradioinformation_element_free(void* data) { struct capwap_message_elements_ops capwap_element_80211_wtpradioinformation_ops = { .create_message_element = capwap_80211_wtpradioinformation_element_create, .parsing_message_element = capwap_80211_wtpradioinformation_element_parsing, - .free_parsed_message_element = capwap_80211_wtpradioinformation_element_free + .clone_message_element = capwap_80211_wtpradioinformation_element_clone, + .free_message_element = capwap_80211_wtpradioinformation_element_free }; diff --git a/src/common/capwap_element_acdescriptor.c b/src/common/capwap_element_acdescriptor.c index 7c78aab..8cb4df2 100644 --- a/src/common/capwap_element_acdescriptor.c +++ b/src/common/capwap_element_acdescriptor.c @@ -66,6 +66,29 @@ static void capwap_acdescriptor_element_create(void* data, capwap_message_elemen } } +/* */ +static void* capwap_acdescriptor_element_clone(void* data) { + int i; + struct capwap_acdescriptor_element* cloneelement; + struct capwap_acdescriptor_element* element = (struct capwap_acdescriptor_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_acdescriptor_element)); + cloneelement->descsubelement = capwap_array_create(sizeof(struct capwap_acdescriptor_desc_subelement), 0, 1); + for (i = 0; i < element->descsubelement->count; i++) { + struct capwap_acdescriptor_desc_subelement* desc = (struct capwap_acdescriptor_desc_subelement*)capwap_array_get_item_pointer(element->descsubelement, i); + struct capwap_acdescriptor_desc_subelement* clonedesc = (struct capwap_acdescriptor_desc_subelement*)capwap_array_get_item_pointer(cloneelement->descsubelement, i); + + memcpy(clonedesc, desc, sizeof(struct capwap_acdescriptor_desc_subelement)); + if (desc->length) { + clonedesc->data = capwap_clone(desc->data, desc->length); + } + } + + return cloneelement; +} + /* */ static void capwap_acdescriptor_element_free(void* data) { int i; @@ -178,5 +201,6 @@ static void* capwap_acdescriptor_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_acdescriptor_ops = { .create_message_element = capwap_acdescriptor_element_create, .parsing_message_element = capwap_acdescriptor_element_parsing, - .free_parsed_message_element = capwap_acdescriptor_element_free + .clone_message_element = capwap_acdescriptor_element_clone, + .free_message_element = capwap_acdescriptor_element_free }; diff --git a/src/common/capwap_element_acipv4list.c b/src/common/capwap_element_acipv4list.c index 3613b55..373f68b 100644 --- a/src/common/capwap_element_acipv4list.c +++ b/src/common/capwap_element_acipv4list.c @@ -54,6 +54,23 @@ static void* capwap_acipv4list_element_parsing(capwap_message_elements_handle ha return data; } +/* */ +static void* capwap_acipv4list_element_clone(void* data) { + int i; + struct capwap_acipv4list_element* cloneelement; + struct capwap_acipv4list_element* element = (struct capwap_acipv4list_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_acipv4list_element)); + cloneelement->addresses = capwap_array_create(sizeof(struct in_addr), 0, 0); + for (i = 0; i < element->addresses->count; i++) { + memcpy(capwap_array_get_item_pointer(cloneelement->addresses, i), capwap_array_get_item_pointer(element->addresses, i), sizeof(struct in_addr)); + } + + return cloneelement; +} + /* */ static void capwap_acipv4list_element_free(void* data) { struct capwap_acipv4list_element* element = (struct capwap_acipv4list_element*)data; @@ -68,5 +85,6 @@ static void capwap_acipv4list_element_free(void* data) { struct capwap_message_elements_ops capwap_element_acipv4list_ops = { .create_message_element = capwap_acipv4list_element_create, .parsing_message_element = capwap_acipv4list_element_parsing, - .free_parsed_message_element = capwap_acipv4list_element_free + .clone_message_element = capwap_acipv4list_element_clone, + .free_message_element = capwap_acipv4list_element_free }; diff --git a/src/common/capwap_element_acipv6list.c b/src/common/capwap_element_acipv6list.c index 7e8f558..01229ac 100644 --- a/src/common/capwap_element_acipv6list.c +++ b/src/common/capwap_element_acipv6list.c @@ -60,6 +60,23 @@ static void* capwap_acipv6list_element_parsing(capwap_message_elements_handle ha return data; } +/* */ +static void* capwap_acipv6list_element_clone(void* data) { + int i; + struct capwap_acipv6list_element* cloneelement; + struct capwap_acipv6list_element* element = (struct capwap_acipv6list_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_acipv6list_element)); + cloneelement->addresses = capwap_array_create(sizeof(struct in6_addr), 0, 0); + for (i = 0; i < element->addresses->count; i++) { + memcpy(capwap_array_get_item_pointer(cloneelement->addresses, i), capwap_array_get_item_pointer(element->addresses, i), sizeof(struct in6_addr)); + } + + return cloneelement; +} + /* */ static void capwap_acipv6list_element_free(void* data) { struct capwap_acipv6list_element* element = (struct capwap_acipv6list_element*)data; @@ -74,5 +91,6 @@ static void capwap_acipv6list_element_free(void* data) { struct capwap_message_elements_ops capwap_element_acipv6list_ops = { .create_message_element = capwap_acipv6list_element_create, .parsing_message_element = capwap_acipv6list_element_parsing, - .free_parsed_message_element = capwap_acipv6list_element_free + .clone_message_element = capwap_acipv6list_element_clone, + .free_message_element = capwap_acipv6list_element_free }; diff --git a/src/common/capwap_element_acname.c b/src/common/capwap_element_acname.c index e1350d0..10ffe71 100644 --- a/src/common/capwap_element_acname.c +++ b/src/common/capwap_element_acname.c @@ -48,6 +48,20 @@ static void* capwap_acname_element_parsing(capwap_message_elements_handle handle return data; } +/* */ +static void* capwap_acname_element_clone(void* data) { + struct capwap_acname_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_acname_element)); + if (cloneelement->name) { + cloneelement->name = (uint8_t*)capwap_duplicate_string((char*)((struct capwap_acname_element*)data)->name); + } + + return cloneelement; +} + /* */ static void capwap_acname_element_free(void* data) { struct capwap_acname_element* element = (struct capwap_acname_element*)data; @@ -65,5 +79,6 @@ static void capwap_acname_element_free(void* data) { struct capwap_message_elements_ops capwap_element_acname_ops = { .create_message_element = capwap_acname_element_create, .parsing_message_element = capwap_acname_element_parsing, - .free_parsed_message_element = capwap_acname_element_free + .clone_message_element = capwap_acname_element_clone, + .free_message_element = capwap_acname_element_free }; diff --git a/src/common/capwap_element_acnamepriority.c b/src/common/capwap_element_acnamepriority.c index eec5929..25561d0 100644 --- a/src/common/capwap_element_acnamepriority.c +++ b/src/common/capwap_element_acnamepriority.c @@ -49,6 +49,20 @@ static void* capwap_acnamepriority_element_parsing(capwap_message_elements_handl return data; } +/* */ +static void* capwap_acnamepriority_element_clone(void* data) { + struct capwap_acnamepriority_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_acnamepriority_element)); + if (cloneelement->name) { + cloneelement->name = (uint8_t*)capwap_duplicate_string((char*)((struct capwap_acnamepriority_element*)data)->name); + } + + return cloneelement; +} + /* */ static void capwap_acnamepriority_element_free(void* data) { struct capwap_acnamepriority_element* element = (struct capwap_acnamepriority_element*)data; @@ -66,5 +80,6 @@ static void capwap_acnamepriority_element_free(void* data) { struct capwap_message_elements_ops capwap_element_acnamepriority_ops = { .create_message_element = capwap_acnamepriority_element_create, .parsing_message_element = capwap_acnamepriority_element_parsing, - .free_parsed_message_element = capwap_acnamepriority_element_free + .clone_message_element = capwap_acnamepriority_element_clone, + .free_message_element = capwap_acnamepriority_element_free }; diff --git a/src/common/capwap_element_actimestamp.c b/src/common/capwap_element_actimestamp.c index 6f9a884..1176f15 100644 --- a/src/common/capwap_element_actimestamp.c +++ b/src/common/capwap_element_actimestamp.c @@ -44,6 +44,13 @@ static void* capwap_actimestamp_element_parsing(capwap_message_elements_handle h return data; } +/* */ +static void* capwap_actimestamp_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_actimestamp_element)); +} + /* */ static void capwap_actimestamp_element_free(void* data) { ASSERT(data != NULL); @@ -55,5 +62,6 @@ static void capwap_actimestamp_element_free(void* data) { struct capwap_message_elements_ops capwap_element_actimestamp_ops = { .create_message_element = capwap_actimestamp_element_create, .parsing_message_element = capwap_actimestamp_element_parsing, - .free_parsed_message_element = capwap_actimestamp_element_free + .clone_message_element = capwap_actimestamp_element_clone, + .free_message_element = capwap_actimestamp_element_free }; diff --git a/src/common/capwap_element_addmacacl.c b/src/common/capwap_element_addmacacl.c index 5165444..8cbc328 100644 --- a/src/common/capwap_element_addmacacl.c +++ b/src/common/capwap_element_addmacacl.c @@ -28,6 +28,20 @@ static void capwap_addmacacl_element_create(void* data, capwap_message_elements_ func->write_block(handle, element->address, element->entry * element->length); } +/* */ +static void* capwap_addmacacl_element_clone(void* data) { + struct capwap_addmacacl_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_addmacacl_element)); + if (cloneelement->entry > 0) { + cloneelement->address = capwap_clone(((struct capwap_addmacacl_element*)data)->address, cloneelement->entry * cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_addmacacl_element_free(void* data) { struct capwap_addmacacl_element* element = (struct capwap_addmacacl_element*)data; @@ -91,5 +105,6 @@ static void* capwap_addmacacl_element_parsing(capwap_message_elements_handle han struct capwap_message_elements_ops capwap_element_addmacacl_ops = { .create_message_element = capwap_addmacacl_element_create, .parsing_message_element = capwap_addmacacl_element_parsing, - .free_parsed_message_element = capwap_addmacacl_element_free + .clone_message_element = capwap_addmacacl_element_clone, + .free_message_element = capwap_addmacacl_element_free }; diff --git a/src/common/capwap_element_addstation.c b/src/common/capwap_element_addstation.c index e2e5534..c77dfc7 100644 --- a/src/common/capwap_element_addstation.c +++ b/src/common/capwap_element_addstation.c @@ -37,6 +37,24 @@ static void capwap_addstation_element_create(void* data, capwap_message_elements } } +/* */ +static void* capwap_addstation_element_clone(void* data) { + struct capwap_addstation_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_addstation_element)); + if (cloneelement->length > 0) { + cloneelement->address = capwap_clone(((struct capwap_addstation_element*)data)->address, cloneelement->length); + } + + if (cloneelement->vlan) { + cloneelement->vlan = (uint8_t*)capwap_duplicate_string((char*)((struct capwap_addstation_element*)data)->vlan); + } + + return cloneelement; +} + /* */ static void capwap_addstation_element_free(void* data) { struct capwap_addstation_element* element = (struct capwap_addstation_element*)data; @@ -111,5 +129,6 @@ static void* capwap_addstation_element_parsing(capwap_message_elements_handle ha struct capwap_message_elements_ops capwap_element_addstation_ops = { .create_message_element = capwap_addstation_element_create, .parsing_message_element = capwap_addstation_element_parsing, - .free_parsed_message_element = capwap_addstation_element_free + .clone_message_element = capwap_addstation_element_clone, + .free_message_element = capwap_addstation_element_free }; diff --git a/src/common/capwap_element_controlipv4.c b/src/common/capwap_element_controlipv4.c index 52ca53c..715f4c7 100644 --- a/src/common/capwap_element_controlipv4.c +++ b/src/common/capwap_element_controlipv4.c @@ -48,6 +48,13 @@ static void* capwap_controlipv4_element_parsing(capwap_message_elements_handle h return data; } +/* */ +static void* capwap_controlipv4_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_controlipv4_element)); +} + /* */ static void capwap_controlipv4_element_free(void* data) { ASSERT(data != NULL); @@ -59,5 +66,6 @@ static void capwap_controlipv4_element_free(void* data) { struct capwap_message_elements_ops capwap_element_controlipv4_ops = { .create_message_element = capwap_controlipv4_element_create, .parsing_message_element = capwap_controlipv4_element_parsing, - .free_parsed_message_element = capwap_controlipv4_element_free + .clone_message_element = capwap_controlipv4_element_clone, + .free_message_element = capwap_controlipv4_element_free }; diff --git a/src/common/capwap_element_controlipv6.c b/src/common/capwap_element_controlipv6.c index db9fe7e..64fd2db 100644 --- a/src/common/capwap_element_controlipv6.c +++ b/src/common/capwap_element_controlipv6.c @@ -54,6 +54,13 @@ static void* capwap_controlipv6_element_parsing(capwap_message_elements_handle h return data; } +/* */ +static void* capwap_controlipv6_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_controlipv6_element)); +} + /* */ static void capwap_controlipv6_element_free(void* data) { ASSERT(data != NULL); @@ -65,5 +72,6 @@ static void capwap_controlipv6_element_free(void* data) { struct capwap_message_elements_ops capwap_element_controlipv6_ops = { .create_message_element = capwap_controlipv6_element_create, .parsing_message_element = capwap_controlipv6_element_parsing, - .free_parsed_message_element = capwap_controlipv6_element_free + .clone_message_element = capwap_controlipv6_element_clone, + .free_message_element = capwap_controlipv6_element_free }; diff --git a/src/common/capwap_element_datatransferdata.c b/src/common/capwap_element_datatransferdata.c index 8b43b26..50a345a 100644 --- a/src/common/capwap_element_datatransferdata.c +++ b/src/common/capwap_element_datatransferdata.c @@ -32,6 +32,20 @@ static void capwap_datatransferdata_element_create(void* data, capwap_message_el func->write_block(handle, element->data, element->length); } +/* */ +static void* capwap_datatransferdata_element_clone(void* data) { + struct capwap_datatransferdata_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_datatransferdata_element)); + if (cloneelement->length > 0) { + cloneelement->data = capwap_clone(((struct capwap_datatransferdata_element*)data)->data, cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_datatransferdata_element_free(void* data) { struct capwap_datatransferdata_element* element = (struct capwap_datatransferdata_element*)data; @@ -94,5 +108,6 @@ static void* capwap_datatransferdata_element_parsing(capwap_message_elements_han struct capwap_message_elements_ops capwap_element_datatransferdata_ops = { .create_message_element = capwap_datatransferdata_element_create, .parsing_message_element = capwap_datatransferdata_element_parsing, - .free_parsed_message_element = capwap_datatransferdata_element_free + .clone_message_element = capwap_datatransferdata_element_clone, + .free_message_element = capwap_datatransferdata_element_free }; diff --git a/src/common/capwap_element_datatransfermode.c b/src/common/capwap_element_datatransfermode.c index 32d1456..439ea2d 100644 --- a/src/common/capwap_element_datatransfermode.c +++ b/src/common/capwap_element_datatransfermode.c @@ -26,6 +26,13 @@ static void capwap_datatransfermode_element_create(void* data, capwap_message_el func->write_u8(handle, element->mode); } +/* */ +static void* capwap_datatransfermode_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_datatransfermode_element)); +} + /* */ static void capwap_datatransfermode_element_free(void* data) { ASSERT(data != NULL); @@ -61,5 +68,6 @@ static void* capwap_datatransfermode_element_parsing(capwap_message_elements_han struct capwap_message_elements_ops capwap_element_datatransfermode_ops = { .create_message_element = capwap_datatransfermode_element_create, .parsing_message_element = capwap_datatransfermode_element_parsing, - .free_parsed_message_element = capwap_datatransfermode_element_free + .clone_message_element = capwap_datatransfermode_element_clone, + .free_message_element = capwap_datatransfermode_element_free }; diff --git a/src/common/capwap_element_decrypterrorreport.c b/src/common/capwap_element_decrypterrorreport.c index 2dd2482..d84b6eb 100644 --- a/src/common/capwap_element_decrypterrorreport.c +++ b/src/common/capwap_element_decrypterrorreport.c @@ -30,6 +30,20 @@ static void capwap_decrypterrorreport_element_create(void* data, capwap_message_ func->write_block(handle, element->address, element->entry * element->length); } +/* */ +static void* capwap_decrypterrorreport_element_clone(void* data) { + struct capwap_decrypterrorreport_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_decrypterrorreport_element)); + if (cloneelement->entry > 0) { + cloneelement->address = capwap_clone(((struct capwap_decrypterrorreport_element*)data)->address, cloneelement->entry * cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_decrypterrorreport_element_free(void* data) { struct capwap_decrypterrorreport_element* element = (struct capwap_decrypterrorreport_element*)data; @@ -98,5 +112,6 @@ static void* capwap_decrypterrorreport_element_parsing(capwap_message_elements_h struct capwap_message_elements_ops capwap_element_decrypterrorreport_ops = { .create_message_element = capwap_decrypterrorreport_element_create, .parsing_message_element = capwap_decrypterrorreport_element_parsing, - .free_parsed_message_element = capwap_decrypterrorreport_element_free + .clone_message_element = capwap_decrypterrorreport_element_clone, + .free_message_element = capwap_decrypterrorreport_element_free }; diff --git a/src/common/capwap_element_decrypterrorreportperiod.c b/src/common/capwap_element_decrypterrorreportperiod.c index d93875e..f7fff7e 100644 --- a/src/common/capwap_element_decrypterrorreportperiod.c +++ b/src/common/capwap_element_decrypterrorreportperiod.c @@ -27,6 +27,13 @@ static void capwap_decrypterrorreportperiod_element_create(void* data, capwap_me func->write_u16(handle, element->interval); } +/* */ +static void* capwap_decrypterrorreportperiod_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_decrypterrorreportperiod_element)); +} + /* */ static void capwap_decrypterrorreportperiod_element_free(void* data) { ASSERT(data != NULL); @@ -64,5 +71,6 @@ static void* capwap_decrypterrorreportperiod_element_parsing(capwap_message_elem struct capwap_message_elements_ops capwap_element_decrypterrorreportperiod_ops = { .create_message_element = capwap_decrypterrorreportperiod_element_create, .parsing_message_element = capwap_decrypterrorreportperiod_element_parsing, - .free_parsed_message_element = capwap_decrypterrorreportperiod_element_free + .clone_message_element = capwap_decrypterrorreportperiod_element_clone, + .free_message_element = capwap_decrypterrorreportperiod_element_free }; diff --git a/src/common/capwap_element_deletemacacl.c b/src/common/capwap_element_deletemacacl.c index 0c118f7..1c1a76a 100644 --- a/src/common/capwap_element_deletemacacl.c +++ b/src/common/capwap_element_deletemacacl.c @@ -28,6 +28,20 @@ static void capwap_deletemacacl_element_create(void* data, capwap_message_elemen func->write_block(handle, element->address, element->entry * element->length); } +/* */ +static void* capwap_deletemacacl_element_clone(void* data) { + struct capwap_deletemacacl_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_deletemacacl_element)); + if (cloneelement->entry > 0) { + cloneelement->address = capwap_clone(((struct capwap_deletemacacl_element*)data)->address, cloneelement->entry * cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_deletemacacl_element_free(void* data) { struct capwap_deletemacacl_element* element = (struct capwap_deletemacacl_element*)data; @@ -91,5 +105,6 @@ static void* capwap_deletemacacl_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_deletemacacl_ops = { .create_message_element = capwap_deletemacacl_element_create, .parsing_message_element = capwap_deletemacacl_element_parsing, - .free_parsed_message_element = capwap_deletemacacl_element_free + .clone_message_element = capwap_deletemacacl_element_clone, + .free_message_element = capwap_deletemacacl_element_free }; diff --git a/src/common/capwap_element_deletestation.c b/src/common/capwap_element_deletestation.c index a62661f..518fbe6 100644 --- a/src/common/capwap_element_deletestation.c +++ b/src/common/capwap_element_deletestation.c @@ -28,6 +28,20 @@ static void capwap_deletestation_element_create(void* data, capwap_message_eleme func->write_block(handle, element->address, element->length); } +/* */ +static void* capwap_deletestation_element_clone(void* data) { + struct capwap_deletestation_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_deletestation_element)); + if (cloneelement->length > 0) { + cloneelement->address = capwap_clone(((struct capwap_deletestation_element*)data)->address, cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_deletestation_element_free(void* data) { struct capwap_deletestation_element* element = (struct capwap_deletestation_element*)data; @@ -85,5 +99,6 @@ static void* capwap_deletestation_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_deletestation_ops = { .create_message_element = capwap_deletestation_element_create, .parsing_message_element = capwap_deletestation_element_parsing, - .free_parsed_message_element = capwap_deletestation_element_free + .clone_message_element = capwap_deletestation_element_clone, + .free_message_element = capwap_deletestation_element_free }; diff --git a/src/common/capwap_element_discoverytype.c b/src/common/capwap_element_discoverytype.c index 461b462..2e947f4 100644 --- a/src/common/capwap_element_discoverytype.c +++ b/src/common/capwap_element_discoverytype.c @@ -28,6 +28,13 @@ static void capwap_discoverytype_element_create(void* data, capwap_message_eleme func->write_u8(handle, element->type); } +/* */ +static void* capwap_discoverytype_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_discoverytype_element)); +} + /* */ static void capwap_discoverytype_element_free(void* data) { ASSERT(data != NULL); @@ -65,5 +72,6 @@ static void* capwap_discoverytype_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_discoverytype_ops = { .create_message_element = capwap_discoverytype_element_create, .parsing_message_element = capwap_discoverytype_element_parsing, - .free_parsed_message_element = capwap_discoverytype_element_free + .clone_message_element = capwap_discoverytype_element_clone, + .free_message_element = capwap_discoverytype_element_free }; diff --git a/src/common/capwap_element_duplicateipv4.c b/src/common/capwap_element_duplicateipv4.c index 9cb07c1..2561acd 100644 --- a/src/common/capwap_element_duplicateipv4.c +++ b/src/common/capwap_element_duplicateipv4.c @@ -31,6 +31,20 @@ static void capwap_duplicateipv4_element_create(void* data, capwap_message_eleme func->write_block(handle, element->macaddress, element->length); } +/* */ +static void* capwap_duplicateipv4_element_clone(void* data) { + struct capwap_duplicateipv4_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_duplicateipv4_element)); + if (cloneelement->length > 0) { + cloneelement->macaddress = capwap_clone(((struct capwap_duplicateipv4_element*)data)->macaddress, cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_duplicateipv4_element_free(void* data) { struct capwap_duplicateipv4_element* element = (struct capwap_duplicateipv4_element*)data; @@ -89,5 +103,6 @@ static void* capwap_duplicateipv4_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_duplicateipv4_ops = { .create_message_element = capwap_duplicateipv4_element_create, .parsing_message_element = capwap_duplicateipv4_element_parsing, - .free_parsed_message_element = capwap_duplicateipv4_element_free + .clone_message_element = capwap_duplicateipv4_element_clone, + .free_message_element = capwap_duplicateipv4_element_free }; diff --git a/src/common/capwap_element_duplicateipv6.c b/src/common/capwap_element_duplicateipv6.c index ac2b06d..8a80ff8 100644 --- a/src/common/capwap_element_duplicateipv6.c +++ b/src/common/capwap_element_duplicateipv6.c @@ -37,6 +37,20 @@ static void capwap_duplicateipv6_element_create(void* data, capwap_message_eleme func->write_block(handle, element->macaddress, element->length); } +/* */ +static void* capwap_duplicateipv6_element_clone(void* data) { + struct capwap_duplicateipv6_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_duplicateipv6_element)); + if (cloneelement->length > 0) { + cloneelement->macaddress = capwap_clone(((struct capwap_duplicateipv6_element*)data)->macaddress, cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_duplicateipv6_element_free(void* data) { struct capwap_duplicateipv6_element* element = (struct capwap_duplicateipv6_element*)data; @@ -95,5 +109,6 @@ static void* capwap_duplicateipv6_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_duplicateipv6_ops = { .create_message_element = capwap_duplicateipv6_element_create, .parsing_message_element = capwap_duplicateipv6_element_parsing, - .free_parsed_message_element = capwap_duplicateipv6_element_free + .clone_message_element = capwap_duplicateipv6_element_clone, + .free_message_element = capwap_duplicateipv6_element_free }; diff --git a/src/common/capwap_element_ecnsupport.c b/src/common/capwap_element_ecnsupport.c index 2c90090..9a390af 100644 --- a/src/common/capwap_element_ecnsupport.c +++ b/src/common/capwap_element_ecnsupport.c @@ -26,6 +26,13 @@ static void capwap_ecnsupport_element_create(void* data, capwap_message_elements func->write_u8(handle, element->flag); } +/* */ +static void* capwap_ecnsupport_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_ecnsupport_element)); +} + /* */ static void capwap_ecnsupport_element_free(void* data) { ASSERT(data != NULL); @@ -62,5 +69,6 @@ static void* capwap_ecnsupport_element_parsing(capwap_message_elements_handle ha struct capwap_message_elements_ops capwap_element_ecnsupport_ops = { .create_message_element = capwap_ecnsupport_element_create, .parsing_message_element = capwap_ecnsupport_element_parsing, - .free_parsed_message_element = capwap_ecnsupport_element_free + .clone_message_element = capwap_ecnsupport_element_clone, + .free_message_element = capwap_ecnsupport_element_free }; diff --git a/src/common/capwap_element_idletimeout.c b/src/common/capwap_element_idletimeout.c index ed9f005..7000723 100644 --- a/src/common/capwap_element_idletimeout.c +++ b/src/common/capwap_element_idletimeout.c @@ -43,6 +43,13 @@ static void* capwap_idletimeout_element_parsing(capwap_message_elements_handle h return data; } +/* */ +static void* capwap_idletimeout_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_idletimeout_element)); +} + /* */ static void capwap_idletimeout_element_free(void* data) { ASSERT(data != NULL); @@ -54,5 +61,6 @@ static void capwap_idletimeout_element_free(void* data) { struct capwap_message_elements_ops capwap_element_idletimeout_ops = { .create_message_element = capwap_idletimeout_element_create, .parsing_message_element = capwap_idletimeout_element_parsing, - .free_parsed_message_element = capwap_idletimeout_element_free + .clone_message_element = capwap_idletimeout_element_clone, + .free_message_element = capwap_idletimeout_element_free }; diff --git a/src/common/capwap_element_imagedata.c b/src/common/capwap_element_imagedata.c index d4b6b69..471ef5a 100644 --- a/src/common/capwap_element_imagedata.c +++ b/src/common/capwap_element_imagedata.c @@ -29,6 +29,20 @@ static void capwap_imagedata_element_create(void* data, capwap_message_elements_ } } +/* */ +static void* capwap_imagedata_element_clone(void* data) { + struct capwap_imagedata_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_imagedata_element)); + if (cloneelement->length > 0) { + cloneelement->data = capwap_clone(((struct capwap_imagedata_element*)data)->data, cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_imagedata_element_free(void* data) { struct capwap_imagedata_element* element = (struct capwap_imagedata_element*)data; @@ -93,5 +107,6 @@ static void* capwap_imagedata_element_parsing(capwap_message_elements_handle han struct capwap_message_elements_ops capwap_element_imagedata_ops = { .create_message_element = capwap_imagedata_element_create, .parsing_message_element = capwap_imagedata_element_parsing, - .free_parsed_message_element = capwap_imagedata_element_free + .clone_message_element = capwap_imagedata_element_clone, + .free_message_element = capwap_imagedata_element_free }; diff --git a/src/common/capwap_element_imageidentifier.c b/src/common/capwap_element_imageidentifier.c index 18d08de..99e7bb2 100644 --- a/src/common/capwap_element_imageidentifier.c +++ b/src/common/capwap_element_imageidentifier.c @@ -31,6 +31,18 @@ static void capwap_imageidentifier_element_create(void* data, capwap_message_ele func->write_block(handle, element->name, length); } +/* */ +static void* capwap_imageidentifier_element_clone(void* data) { + struct capwap_imageidentifier_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_imageidentifier_element)); + cloneelement->name = (uint8_t*)capwap_duplicate_string((char*)((struct capwap_imageidentifier_element*)data)->name); + + return cloneelement; +} + /* */ static void capwap_imageidentifier_element_free(void* data) { struct capwap_imageidentifier_element* element = (struct capwap_imageidentifier_element*)data; @@ -78,5 +90,6 @@ static void* capwap_imageidentifier_element_parsing(capwap_message_elements_hand struct capwap_message_elements_ops capwap_element_imageidentifier_ops = { .create_message_element = capwap_imageidentifier_element_create, .parsing_message_element = capwap_imageidentifier_element_parsing, - .free_parsed_message_element = capwap_imageidentifier_element_free + .clone_message_element = capwap_imageidentifier_element_clone, + .free_message_element = capwap_imageidentifier_element_free }; diff --git a/src/common/capwap_element_imageinfo.c b/src/common/capwap_element_imageinfo.c index 67e36c6..0ef1b87 100644 --- a/src/common/capwap_element_imageinfo.c +++ b/src/common/capwap_element_imageinfo.c @@ -33,6 +33,13 @@ static void capwap_imageinfo_element_create(void* data, capwap_message_elements_ func->write_block(handle, element->hash, CAPWAP_IMAGEINFO_HASH_LENGTH); } +/* */ +static void* capwap_imageinfo_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_imageinfo_element)); +} + /* */ static void capwap_imageinfo_element_free(void* data) { ASSERT(data != NULL); @@ -64,5 +71,6 @@ static void* capwap_imageinfo_element_parsing(capwap_message_elements_handle han struct capwap_message_elements_ops capwap_element_imageinfo_ops = { .create_message_element = capwap_imageinfo_element_create, .parsing_message_element = capwap_imageinfo_element_parsing, - .free_parsed_message_element = capwap_imageinfo_element_free + .clone_message_element = capwap_imageinfo_element_clone, + .free_message_element = capwap_imageinfo_element_free }; diff --git a/src/common/capwap_element_initdownload.c b/src/common/capwap_element_initdownload.c index a7a1741..8c1fc75 100644 --- a/src/common/capwap_element_initdownload.c +++ b/src/common/capwap_element_initdownload.c @@ -32,6 +32,13 @@ static void* capwap_initdownload_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_initdownload_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_initdownload_element)); +} + /* */ static void capwap_initdownload_element_free(void* data) { ASSERT(data != NULL); @@ -43,5 +50,6 @@ static void capwap_initdownload_element_free(void* data) { struct capwap_message_elements_ops capwap_element_initdownload_ops = { .create_message_element = capwap_initdownload_element_create, .parsing_message_element = capwap_initdownload_element_parsing, - .free_parsed_message_element = capwap_initdownload_element_free + .clone_message_element = capwap_initdownload_element_clone, + .free_message_element = capwap_initdownload_element_free }; diff --git a/src/common/capwap_element_localipv4.c b/src/common/capwap_element_localipv4.c index cabc5a1..667b7a2 100644 --- a/src/common/capwap_element_localipv4.c +++ b/src/common/capwap_element_localipv4.c @@ -44,6 +44,13 @@ static void* capwap_localipv4_element_parsing(capwap_message_elements_handle han return data; } +/* */ +static void* capwap_localipv4_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_localipv4_element)); +} + /* */ static void capwap_localipv4_element_free(void* data) { ASSERT(data != NULL); @@ -55,5 +62,6 @@ static void capwap_localipv4_element_free(void* data) { struct capwap_message_elements_ops capwap_element_localipv4_ops = { .create_message_element = capwap_localipv4_element_create, .parsing_message_element = capwap_localipv4_element_parsing, - .free_parsed_message_element = capwap_localipv4_element_free + .clone_message_element = capwap_localipv4_element_clone, + .free_message_element = capwap_localipv4_element_free }; diff --git a/src/common/capwap_element_localipv6.c b/src/common/capwap_element_localipv6.c index 4713876..f17f833 100644 --- a/src/common/capwap_element_localipv6.c +++ b/src/common/capwap_element_localipv6.c @@ -49,6 +49,13 @@ static void* capwap_localipv6_element_parsing(capwap_message_elements_handle han return data; } +/* */ +static void* capwap_localipv6_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_localipv6_element)); +} + /* */ static void capwap_localipv6_element_free(void* data) { ASSERT(data != NULL); @@ -60,5 +67,6 @@ static void capwap_localipv6_element_free(void* data) { struct capwap_message_elements_ops capwap_element_localipv6_ops = { .create_message_element = capwap_localipv6_element_create, .parsing_message_element = capwap_localipv6_element_parsing, - .free_parsed_message_element = capwap_localipv6_element_free + .clone_message_element = capwap_localipv6_element_clone, + .free_message_element = capwap_localipv6_element_free }; diff --git a/src/common/capwap_element_location.c b/src/common/capwap_element_location.c index 9e2ed3e..5a4b693 100644 --- a/src/common/capwap_element_location.c +++ b/src/common/capwap_element_location.c @@ -28,6 +28,18 @@ static void capwap_location_element_create(void* data, capwap_message_elements_h func->write_block(handle, element->value, length); } +/* */ +static void* capwap_location_element_clone(void* data) { + struct capwap_location_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_location_element)); + cloneelement->value = (uint8_t*)capwap_duplicate_string((char*)((struct capwap_location_element*)data)->value); + + return cloneelement; +} + /* */ static void capwap_location_element_free(void* data) { struct capwap_location_element* element = (struct capwap_location_element*)data; @@ -68,5 +80,6 @@ static void* capwap_location_element_parsing(capwap_message_elements_handle hand struct capwap_message_elements_ops capwap_element_location_ops = { .create_message_element = capwap_location_element_create, .parsing_message_element = capwap_location_element_parsing, - .free_parsed_message_element = capwap_location_element_free + .clone_message_element = capwap_location_element_clone, + .free_message_element = capwap_location_element_free }; diff --git a/src/common/capwap_element_maximumlength.c b/src/common/capwap_element_maximumlength.c index 08d43d9..aea037f 100644 --- a/src/common/capwap_element_maximumlength.c +++ b/src/common/capwap_element_maximumlength.c @@ -44,6 +44,13 @@ static void* capwap_maximumlength_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_maximumlength_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_maximumlength_element)); +} + /* */ static void capwap_maximumlength_element_free(void* data) { ASSERT(data != NULL); @@ -55,5 +62,6 @@ static void capwap_maximumlength_element_free(void* data) { struct capwap_message_elements_ops capwap_element_maximumlength_ops = { .create_message_element = capwap_maximumlength_element_create, .parsing_message_element = capwap_maximumlength_element_parsing, - .free_parsed_message_element = capwap_maximumlength_element_free + .clone_message_element = capwap_maximumlength_element_clone, + .free_message_element = capwap_maximumlength_element_free }; diff --git a/src/common/capwap_element_mtudiscovery.c b/src/common/capwap_element_mtudiscovery.c index ddc1075..2f120bd 100644 --- a/src/common/capwap_element_mtudiscovery.c +++ b/src/common/capwap_element_mtudiscovery.c @@ -52,6 +52,13 @@ static void* capwap_mtudiscovery_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_mtudiscovery_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_mtudiscovery_element)); +} + /* */ static void capwap_mtudiscovery_element_free(void* data) { ASSERT(data != NULL); @@ -63,5 +70,6 @@ static void capwap_mtudiscovery_element_free(void* data) { struct capwap_message_elements_ops capwap_element_mtudiscovery_ops = { .create_message_element = capwap_mtudiscovery_element_create, .parsing_message_element = capwap_mtudiscovery_element_parsing, - .free_parsed_message_element = capwap_mtudiscovery_element_free + .clone_message_element = capwap_mtudiscovery_element_clone, + .free_message_element = capwap_mtudiscovery_element_free }; diff --git a/src/common/capwap_element_radioadmstate.c b/src/common/capwap_element_radioadmstate.c index 1ebc73d..b950198 100644 --- a/src/common/capwap_element_radioadmstate.c +++ b/src/common/capwap_element_radioadmstate.c @@ -28,6 +28,13 @@ static void capwap_radioadmstate_element_create(void* data, capwap_message_eleme func->write_u8(handle, element->state); } +/* */ +static void* capwap_radioadmstate_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_radioadmstate_element)); +} + /* */ static void capwap_radioadmstate_element_free(void* data) { ASSERT(data != NULL); @@ -69,5 +76,6 @@ static void* capwap_radioadmstate_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_radioadmstate_ops = { .create_message_element = capwap_radioadmstate_element_create, .parsing_message_element = capwap_radioadmstate_element_parsing, - .free_parsed_message_element = capwap_radioadmstate_element_free + .clone_message_element = capwap_radioadmstate_element_clone, + .free_message_element = capwap_radioadmstate_element_free }; diff --git a/src/common/capwap_element_radiooprstate.c b/src/common/capwap_element_radiooprstate.c index e220cb2..54c4758 100644 --- a/src/common/capwap_element_radiooprstate.c +++ b/src/common/capwap_element_radiooprstate.c @@ -31,6 +31,13 @@ static void capwap_radiooprstate_element_create(void* data, capwap_message_eleme func->write_u8(handle, element->cause); } +/* */ +static void* capwap_radiooprstate_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_radiooprstate_element)); +} + /* */ static void capwap_radiooprstate_element_free(void* data) { ASSERT(data != NULL); @@ -80,5 +87,6 @@ static void* capwap_radiooprstate_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_radiooprstate_ops = { .create_message_element = capwap_radiooprstate_element_create, .parsing_message_element = capwap_radiooprstate_element_parsing, - .free_parsed_message_element = capwap_radiooprstate_element_free + .clone_message_element = capwap_radiooprstate_element_clone, + .free_message_element = capwap_radiooprstate_element_free }; diff --git a/src/common/capwap_element_resultcode.c b/src/common/capwap_element_resultcode.c index 080fd23..add2d6b 100644 --- a/src/common/capwap_element_resultcode.c +++ b/src/common/capwap_element_resultcode.c @@ -26,6 +26,13 @@ static void capwap_resultcode_element_create(void* data, capwap_message_elements func->write_u32(handle, element->code); } +/* */ +static void* capwap_resultcode_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_resultcode_element)); +} + /* */ static void capwap_resultcode_element_free(void* data) { ASSERT(data != NULL); @@ -61,5 +68,6 @@ static void* capwap_resultcode_element_parsing(capwap_message_elements_handle ha struct capwap_message_elements_ops capwap_element_resultcode_ops = { .create_message_element = capwap_resultcode_element_create, .parsing_message_element = capwap_resultcode_element_parsing, - .free_parsed_message_element = capwap_resultcode_element_free + .clone_message_element = capwap_resultcode_element_clone, + .free_message_element = capwap_resultcode_element_free }; diff --git a/src/common/capwap_element_returnedmessage.c b/src/common/capwap_element_returnedmessage.c index e4a89d4..be9230e 100644 --- a/src/common/capwap_element_returnedmessage.c +++ b/src/common/capwap_element_returnedmessage.c @@ -29,6 +29,20 @@ static void capwap_returnedmessage_element_create(void* data, capwap_message_ele func->write_block(handle, element->message, element->length); } +/* */ +static void* capwap_returnedmessage_element_clone(void* data) { + struct capwap_returnedmessage_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_returnedmessage_element)); + if (cloneelement->length > 0) { + cloneelement->message = capwap_clone(((struct capwap_returnedmessage_element*)data)->message, cloneelement->length); + } + + return cloneelement; +} + /* */ static void capwap_returnedmessage_element_free(void* data) { struct capwap_returnedmessage_element* element = (struct capwap_returnedmessage_element*)data; @@ -93,5 +107,6 @@ static void* capwap_returnedmessage_element_parsing(capwap_message_elements_hand struct capwap_message_elements_ops capwap_element_returnedmessage_ops = { .create_message_element = capwap_returnedmessage_element_create, .parsing_message_element = capwap_returnedmessage_element_parsing, - .free_parsed_message_element = capwap_returnedmessage_element_free + .clone_message_element = capwap_returnedmessage_element_clone, + .free_message_element = capwap_returnedmessage_element_free }; diff --git a/src/common/capwap_element_sessionid.c b/src/common/capwap_element_sessionid.c index 8dc773c..342205b 100644 --- a/src/common/capwap_element_sessionid.c +++ b/src/common/capwap_element_sessionid.c @@ -76,6 +76,13 @@ static void* capwap_sessionid_element_parsing(capwap_message_elements_handle han return data; } +/* */ +static void* capwap_sessionid_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_sessionid_element)); +} + /* */ static void capwap_sessionid_element_free(void* data) { ASSERT(data != NULL); @@ -87,5 +94,6 @@ static void capwap_sessionid_element_free(void* data) { struct capwap_message_elements_ops capwap_element_sessionid_ops = { .create_message_element = capwap_sessionid_element_create, .parsing_message_element = capwap_sessionid_element_parsing, - .free_parsed_message_element = capwap_sessionid_element_free + .clone_message_element = capwap_sessionid_element_clone, + .free_message_element = capwap_sessionid_element_free }; diff --git a/src/common/capwap_element_statisticstimer.c b/src/common/capwap_element_statisticstimer.c index f204da8..26e7f7c 100644 --- a/src/common/capwap_element_statisticstimer.c +++ b/src/common/capwap_element_statisticstimer.c @@ -44,6 +44,13 @@ static void* capwap_statisticstimer_element_parsing(capwap_message_elements_hand return data; } +/* */ +static void* capwap_statisticstimer_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_statisticstimer_element)); +} + /* */ static void capwap_statisticstimer_element_free(void* data) { ASSERT(data != NULL); @@ -55,5 +62,6 @@ static void capwap_statisticstimer_element_free(void* data) { struct capwap_message_elements_ops capwap_element_statisticstimer_ops = { .create_message_element = capwap_statisticstimer_element_create, .parsing_message_element = capwap_statisticstimer_element_parsing, - .free_parsed_message_element = capwap_statisticstimer_element_free + .clone_message_element = capwap_statisticstimer_element_clone, + .free_message_element = capwap_statisticstimer_element_free }; diff --git a/src/common/capwap_element_timers.c b/src/common/capwap_element_timers.c index b63ccfc..1f4cf72 100644 --- a/src/common/capwap_element_timers.c +++ b/src/common/capwap_element_timers.c @@ -46,6 +46,13 @@ static void* capwap_timers_element_parsing(capwap_message_elements_handle handle return data; } +/* */ +static void* capwap_timers_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_timers_element)); +} + /* */ static void capwap_timers_element_free(void* data) { ASSERT(data != NULL); @@ -57,5 +64,6 @@ static void capwap_timers_element_free(void* data) { struct capwap_message_elements_ops capwap_element_timers_ops = { .create_message_element = capwap_timers_element_create, .parsing_message_element = capwap_timers_element_parsing, - .free_parsed_message_element = capwap_timers_element_free + .clone_message_element = capwap_timers_element_clone, + .free_message_element = capwap_timers_element_free }; diff --git a/src/common/capwap_element_transport.c b/src/common/capwap_element_transport.c index 415443d..822d9d0 100644 --- a/src/common/capwap_element_transport.c +++ b/src/common/capwap_element_transport.c @@ -26,6 +26,13 @@ static void capwap_transport_element_create(void* data, capwap_message_elements_ func->write_u8(handle, element->type); } +/* */ +static void* capwap_transport_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_transport_element)); +} + /* */ static void capwap_transport_element_free(void* data) { ASSERT(data != NULL); @@ -61,5 +68,6 @@ static void* capwap_transport_element_parsing(capwap_message_elements_handle han struct capwap_message_elements_ops capwap_element_transport_ops = { .create_message_element = capwap_transport_element_create, .parsing_message_element = capwap_transport_element_parsing, - .free_parsed_message_element = capwap_transport_element_free + .clone_message_element = capwap_transport_element_clone, + .free_message_element = capwap_transport_element_free }; diff --git a/src/common/capwap_element_vendorpayload.c b/src/common/capwap_element_vendorpayload.c index a4f920a..161fb19 100644 --- a/src/common/capwap_element_vendorpayload.c +++ b/src/common/capwap_element_vendorpayload.c @@ -29,6 +29,20 @@ static void capwap_vendorpayload_element_create(void* data, capwap_message_eleme func->write_block(handle, element->data, element->datalength); } +/* */ +static void* capwap_vendorpayload_element_clone(void* data) { + struct capwap_vendorpayload_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_vendorpayload_element)); + if (cloneelement->datalength > 0) { + cloneelement->data = capwap_clone(((struct capwap_vendorpayload_element*)data)->data, cloneelement->datalength); + } + + return cloneelement; +} + /* */ static void capwap_vendorpayload_element_free(void* data) { struct capwap_vendorpayload_element* element = (struct capwap_vendorpayload_element*)data; @@ -77,5 +91,6 @@ static void* capwap_vendorpayload_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_vendorpayload_ops = { .create_message_element = capwap_vendorpayload_element_create, .parsing_message_element = capwap_vendorpayload_element_parsing, - .free_parsed_message_element = capwap_vendorpayload_element_free + .clone_message_element = capwap_vendorpayload_element_clone, + .free_message_element = capwap_vendorpayload_element_free }; diff --git a/src/common/capwap_element_wtpboarddata.c b/src/common/capwap_element_wtpboarddata.c index 708e6f7..0508737 100644 --- a/src/common/capwap_element_wtpboarddata.c +++ b/src/common/capwap_element_wtpboarddata.c @@ -51,6 +51,29 @@ static void capwap_wtpboarddata_element_create(void* data, capwap_message_elemen } } +/* */ +static void* capwap_wtpboarddata_element_clone(void* data) { + int i; + struct capwap_wtpboarddata_element* cloneelement; + struct capwap_wtpboarddata_element* element = (struct capwap_wtpboarddata_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_wtpboarddata_element)); + cloneelement->boardsubelement = capwap_array_create(sizeof(struct capwap_wtpboarddata_board_subelement), 0, 1); + for (i = 0; i < element->boardsubelement->count; i++) { + struct capwap_wtpboarddata_board_subelement* desc = (struct capwap_wtpboarddata_board_subelement*)capwap_array_get_item_pointer(element->boardsubelement, i); + struct capwap_wtpboarddata_board_subelement* clonedesc = (struct capwap_wtpboarddata_board_subelement*)capwap_array_get_item_pointer(cloneelement->boardsubelement, i); + + memcpy(clonedesc, desc, sizeof(struct capwap_wtpboarddata_board_subelement)); + if (desc->length) { + clonedesc->data = capwap_clone(desc->data, desc->length); + } + } + + return cloneelement; +} + /* */ static void capwap_wtpboarddata_element_free(void* data) { int i; @@ -130,7 +153,8 @@ static void* capwap_wtpboarddata_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_wtpboarddata_ops = { .create_message_element = capwap_wtpboarddata_element_create, .parsing_message_element = capwap_wtpboarddata_element_parsing, - .free_parsed_message_element = capwap_wtpboarddata_element_free + .clone_message_element = capwap_wtpboarddata_element_clone, + .free_message_element = capwap_wtpboarddata_element_free }; /* */ diff --git a/src/common/capwap_element_wtpdescriptor.c b/src/common/capwap_element_wtpdescriptor.c index c6ffd7b..45fc14f 100644 --- a/src/common/capwap_element_wtpdescriptor.c +++ b/src/common/capwap_element_wtpdescriptor.c @@ -76,6 +76,35 @@ static void capwap_wtpdescriptor_element_create(void* data, capwap_message_eleme } } +/* */ +static void* capwap_wtpdescriptor_element_clone(void* data) { + int i; + struct capwap_wtpdescriptor_element* cloneelement; + struct capwap_wtpdescriptor_element* element = (struct capwap_wtpdescriptor_element*)data; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_wtpdescriptor_element)); + + cloneelement->encryptsubelement = capwap_array_create(sizeof(struct capwap_wtpdescriptor_encrypt_subelement), 0, 0); + for (i = 0; i < element->encryptsubelement->count; i++) { + memcpy(capwap_array_get_item_pointer(cloneelement->encryptsubelement, i), capwap_array_get_item_pointer(element->encryptsubelement, i), sizeof(struct capwap_wtpdescriptor_encrypt_subelement)); + } + + cloneelement->descsubelement = capwap_array_create(sizeof(struct capwap_wtpdescriptor_desc_subelement), 0, 1); + for (i = 0; i < element->descsubelement->count; i++) { + struct capwap_wtpdescriptor_desc_subelement* desc = (struct capwap_wtpdescriptor_desc_subelement*)capwap_array_get_item_pointer(element->descsubelement, i); + struct capwap_wtpdescriptor_desc_subelement* clonedesc = (struct capwap_wtpdescriptor_desc_subelement*)capwap_array_get_item_pointer(cloneelement->descsubelement, i); + + memcpy(clonedesc, desc, sizeof(struct capwap_wtpdescriptor_desc_subelement)); + if (desc->data) { + clonedesc->data = (uint8_t*)capwap_duplicate_string((char*)desc->data); + } + } + + return cloneelement; +} + /* */ static void capwap_wtpdescriptor_element_free(void* data) { int i; @@ -202,5 +231,6 @@ static void* capwap_wtpdescriptor_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_wtpdescriptor_ops = { .create_message_element = capwap_wtpdescriptor_element_create, .parsing_message_element = capwap_wtpdescriptor_element_parsing, - .free_parsed_message_element = capwap_wtpdescriptor_element_free + .clone_message_element = capwap_wtpdescriptor_element_clone, + .free_message_element = capwap_wtpdescriptor_element_free }; diff --git a/src/common/capwap_element_wtpfallback.c b/src/common/capwap_element_wtpfallback.c index d50e3a5..3c0472d 100644 --- a/src/common/capwap_element_wtpfallback.c +++ b/src/common/capwap_element_wtpfallback.c @@ -26,6 +26,13 @@ static void capwap_wtpfallback_element_create(void* data, capwap_message_element func->write_u8(handle, element->mode); } +/* */ +static void* capwap_wtpfallback_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_wtpfallback_element)); +} + /* */ static void capwap_wtpfallback_element_free(void* data) { ASSERT(data != NULL); @@ -61,5 +68,6 @@ static void* capwap_wtpfallback_element_parsing(capwap_message_elements_handle h struct capwap_message_elements_ops capwap_element_wtpfallback_ops = { .create_message_element = capwap_wtpfallback_element_create, .parsing_message_element = capwap_wtpfallback_element_parsing, - .free_parsed_message_element = capwap_wtpfallback_element_free + .clone_message_element = capwap_wtpfallback_element_clone, + .free_message_element = capwap_wtpfallback_element_free }; diff --git a/src/common/capwap_element_wtpframetunnelmode.c b/src/common/capwap_element_wtpframetunnelmode.c index de9c08b..b7be7d0 100644 --- a/src/common/capwap_element_wtpframetunnelmode.c +++ b/src/common/capwap_element_wtpframetunnelmode.c @@ -26,6 +26,13 @@ static void capwap_wtpframetunnelmode_element_create(void* data, capwap_message_ func->write_u8(handle, element->mode); } +/* */ +static void* capwap_wtpframetunnelmode_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_wtpframetunnelmode_element)); +} + /* */ static void capwap_wtpframetunnelmode_element_free(void* data) { ASSERT(data != NULL); @@ -61,5 +68,6 @@ static void* capwap_wtpframetunnelmode_element_parsing(capwap_message_elements_h struct capwap_message_elements_ops capwap_element_wtpframetunnelmode_ops = { .create_message_element = capwap_wtpframetunnelmode_element_create, .parsing_message_element = capwap_wtpframetunnelmode_element_parsing, - .free_parsed_message_element = capwap_wtpframetunnelmode_element_free + .clone_message_element = capwap_wtpframetunnelmode_element_clone, + .free_message_element = capwap_wtpframetunnelmode_element_free }; diff --git a/src/common/capwap_element_wtpmactype.c b/src/common/capwap_element_wtpmactype.c index 5c55edb..4117073 100644 --- a/src/common/capwap_element_wtpmactype.c +++ b/src/common/capwap_element_wtpmactype.c @@ -26,6 +26,13 @@ static void capwap_wtpmactype_element_create(void* data, capwap_message_elements func->write_u8(handle, element->type); } +/* */ +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) { ASSERT(data != NULL); @@ -61,5 +68,6 @@ static void* capwap_wtpmactype_element_parsing(capwap_message_elements_handle ha struct capwap_message_elements_ops capwap_element_wtpmactype_ops = { .create_message_element = capwap_wtpmactype_element_create, .parsing_message_element = capwap_wtpmactype_element_parsing, - .free_parsed_message_element = capwap_wtpmactype_element_free + .clone_message_element = capwap_wtpmactype_element_clone, + .free_message_element = capwap_wtpmactype_element_free }; diff --git a/src/common/capwap_element_wtpname.c b/src/common/capwap_element_wtpname.c index 0e439f8..c5cbcb3 100644 --- a/src/common/capwap_element_wtpname.c +++ b/src/common/capwap_element_wtpname.c @@ -51,6 +51,20 @@ static void* capwap_wtpname_element_parsing(capwap_message_elements_handle handl return data; } +/* */ +static void* capwap_wtpname_element_clone(void* data) { + struct capwap_wtpname_element* cloneelement; + + ASSERT(data != NULL); + + cloneelement = capwap_clone(data, sizeof(struct capwap_wtpname_element)); + if (cloneelement->name) { + cloneelement->name = (uint8_t*)capwap_duplicate_string((char*)((struct capwap_wtpname_element*)data)->name); + } + + return cloneelement; +} + /* */ static void capwap_wtpname_element_free(void* data) { struct capwap_wtpname_element* element = (struct capwap_wtpname_element*)data; @@ -68,5 +82,6 @@ static void capwap_wtpname_element_free(void* data) { struct capwap_message_elements_ops capwap_element_wtpname_ops = { .create_message_element = capwap_wtpname_element_create, .parsing_message_element = capwap_wtpname_element_parsing, - .free_parsed_message_element = capwap_wtpname_element_free + .clone_message_element = capwap_wtpname_element_clone, + .free_message_element = capwap_wtpname_element_free }; diff --git a/src/common/capwap_element_wtpradiostat.c b/src/common/capwap_element_wtpradiostat.c index 0ee89be..4fb3c4c 100644 --- a/src/common/capwap_element_wtpradiostat.c +++ b/src/common/capwap_element_wtpradiostat.c @@ -44,6 +44,13 @@ static void capwap_wtpradiostat_element_create(void* data, capwap_message_elemen func->write_u16(handle, element->currentnoisefloor); } +/* */ +static void* capwap_wtpradiostat_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_wtpradiostat_element)); +} + /* */ static void capwap_wtpradiostat_element_free(void* data) { ASSERT(data != NULL); @@ -90,5 +97,6 @@ static void* capwap_wtpradiostat_element_parsing(capwap_message_elements_handle struct capwap_message_elements_ops capwap_element_wtpradiostat_ops = { .create_message_element = capwap_wtpradiostat_element_create, .parsing_message_element = capwap_wtpradiostat_element_parsing, - .free_parsed_message_element = capwap_wtpradiostat_element_free + .clone_message_element = capwap_wtpradiostat_element_clone, + .free_message_element = capwap_wtpradiostat_element_free }; diff --git a/src/common/capwap_element_wtprebootstat.c b/src/common/capwap_element_wtprebootstat.c index 5ba0d36..4feede6 100644 --- a/src/common/capwap_element_wtprebootstat.c +++ b/src/common/capwap_element_wtprebootstat.c @@ -64,6 +64,13 @@ static void* capwap_wtprebootstat_element_parsing(capwap_message_elements_handle return data; } +/* */ +static void* capwap_wtprebootstat_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_wtprebootstat_element)); +} + /* */ static void capwap_wtprebootstat_element_free(void* data) { ASSERT(data != NULL); @@ -75,5 +82,6 @@ static void capwap_wtprebootstat_element_free(void* data) { struct capwap_message_elements_ops capwap_element_wtprebootstat_ops = { .create_message_element = capwap_wtprebootstat_element_create, .parsing_message_element = capwap_wtprebootstat_element_parsing, - .free_parsed_message_element = capwap_wtprebootstat_element_free + .clone_message_element = capwap_wtprebootstat_element_clone, + .free_message_element = capwap_wtprebootstat_element_free }; diff --git a/src/common/capwap_element_wtpstaticipaddress.c b/src/common/capwap_element_wtpstaticipaddress.c index 52c1d9d..0648923 100644 --- a/src/common/capwap_element_wtpstaticipaddress.c +++ b/src/common/capwap_element_wtpstaticipaddress.c @@ -56,6 +56,13 @@ static void* capwap_wtpstaticipaddress_element_parsing(capwap_message_elements_h return data; } +/* */ +static void* capwap_wtpstaticipaddress_element_clone(void* data) { + ASSERT(data != NULL); + + return capwap_clone(data, sizeof(struct capwap_wtpstaticipaddress_element)); +} + /* */ static void capwap_wtpstaticipaddress_element_free(void* data) { ASSERT(data != NULL); @@ -67,5 +74,6 @@ static void capwap_wtpstaticipaddress_element_free(void* data) { struct capwap_message_elements_ops capwap_element_wtpstaticipaddress_ops = { .create_message_element = capwap_wtpstaticipaddress_element_create, .parsing_message_element = capwap_wtpstaticipaddress_element_parsing, - .free_parsed_message_element = capwap_wtpstaticipaddress_element_free + .clone_message_element = capwap_wtpstaticipaddress_element_clone, + .free_message_element = capwap_wtpstaticipaddress_element_free };