static void* capwap_80211_ie_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_80211_ie_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 4) {
		log_printf(LOG_DEBUG, "Invalid IEEE 802.11 Information Element element");
		return NULL;
	}

	/* */
	length -= 3;

	/* */
	data = (struct capwap_80211_ie_element*)capwap_alloc(sizeof(struct capwap_80211_ie_element));
	memset(data, 0, sizeof(struct capwap_80211_ie_element));

	/* Retrieve data */
	func->read_u8(handle, &data->radioid);
	func->read_u8(handle, &data->wlanid);
	func->read_u8(handle, &data->flags);
	data->ielength = length;
	data->ie = (uint8_t*)capwap_alloc(data->ielength);
	func->read_block(handle, data->ie, data->ielength);

	log_printf(LOG_DEBUG, "802.11 IE flags: %02x (%p)", data->flags, &data->flags);
	return data;
}
static void* capwap_wtpboarddata_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	struct capwap_wtpboarddata_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	if (func->read_ready(handle) < 14) {
		capwap_logging_debug("Invalid WTP Board Data element: underbuffer");
		return NULL;
	}

	/* */
	data = (struct capwap_wtpboarddata_element*)capwap_alloc(sizeof(struct capwap_wtpboarddata_element));
	data->boardsubelement = capwap_array_create(sizeof(struct capwap_wtpboarddata_board_subelement), 0, 1);

	/* Retrieve data */
	func->read_u32(handle, &data->vendor);
	if (!data->vendor) {
		capwap_wtpboarddata_element_free((void*)data);
		capwap_logging_debug("Invalid WTP Board Data element: invalid vendor");
		return NULL;
	}

	/* WTP Board Data Subelement */
	while (func->read_ready(handle) > 0) {
		unsigned short length;
		struct capwap_wtpboarddata_board_subelement* desc = (struct capwap_wtpboarddata_board_subelement*)capwap_array_get_item_pointer(data->boardsubelement, data->boardsubelement->count);

		/* */
		func->read_u16(handle, &desc->type);
		func->read_u16(handle, &desc->length);

		if ((desc->type < CAPWAP_BOARD_SUBELEMENT_TYPE_FIRST) || (desc->type > CAPWAP_BOARD_SUBELEMENT_TYPE_LAST)) {
			capwap_logging_debug("Invalid WTP Board Data element: invalid type");
			capwap_wtpboarddata_element_free(data);
			return NULL;
		}

		/* Check buffer size */
		length = func->read_ready(handle);
		if (!length || (length > CAPWAP_BOARD_SUBELEMENT_MAXDATA) || (length < desc->length)) {
			capwap_logging_debug("Invalid WTP Board Data element: invalid length");
			capwap_wtpboarddata_element_free(data);
			return NULL;
		}

		desc->data = (uint8_t*)capwap_alloc(desc->length);
		func->read_block(handle, desc->data, desc->length);
	}

	return data;
}
Esempio n. 3
0
int ac_execute_update_fdspool(struct ac_fds* fds) {
	int totalcount;
	int kmodcount;
	struct pollfd* fdsbuffer;

	ASSERT(fds != NULL);

	/* Retrieve number of Dynamic File Descriptor Event */
	kmodcount = ac_kmod_getfd(NULL, NULL, 0);
	if (kmodcount < 0) {
		return -1;
	}

	/* Kernel Module Events Callback */
	fds->kmodeventsstartpos = -1;
	if (kmodcount != fds->kmodeventscount) {
		if (fds->kmodevents) {
			capwap_free(fds->kmodevents);
		}

		/* */
		fds->kmodeventscount = kmodcount;
		fds->kmodevents = (struct ac_kmod_event*)((kmodcount > 0) ? capwap_alloc(sizeof(struct ac_kmod_event) * kmodcount) : NULL);
	}

	/* Resize poll */
	totalcount = fds->fdsnetworkcount + fds->msgqueuecount + fds->kmodeventscount;
	if (fds->fdstotalcount != totalcount) {
		fdsbuffer = (struct pollfd*)capwap_alloc(sizeof(struct pollfd) * totalcount);
		if (fds->fdspoll) {
			int count = fds->fdsnetworkcount + fds->msgqueuecount;
			if (count > 0) {
				memcpy(fdsbuffer, fds->fdspoll, sizeof(struct pollfd) * count);
			}

			capwap_free(fds->fdspoll);
		}

		/* */
		fds->fdspoll = fdsbuffer;
		fds->fdstotalcount = totalcount;
	}

	/* Retrieve File Descriptor Kernel Module Event */
	if (fds->kmodeventscount > 0) {
		fds->kmodeventsstartpos = fds->fdsnetworkcount + fds->msgqueuecount;
		ac_kmod_getfd(&fds->fdspoll[fds->kmodeventsstartpos], fds->kmodevents, fds->kmodeventscount);
	}

	return fds->fdstotalcount;
}
static void* capwap_addstation_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_addstation_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 8) {
		capwap_logging_debug("Invalid Add Station element: underbuffer");
		return NULL;
	}

	length -= 2;

	/* */
	data = (struct capwap_addstation_element*)capwap_alloc(sizeof(struct capwap_addstation_element));
	memset(data, 0, sizeof(struct capwap_addstation_element));

	/* Retrieve data */
	func->read_u8(handle, &data->radioid);
	func->read_u8(handle, &data->length);

	if (!IS_VALID_RADIOID(data->radioid)) {
		capwap_addstation_element_free((void*)data);
		capwap_logging_debug("Invalid Add Station element: invalid radio");
		return NULL;
	} else if (!IS_VALID_MACADDRESS_LENGTH(data->length) || (length < data->length)) {
		capwap_addstation_element_free((void*)data);
		capwap_logging_debug("Invalid Add Station element: invalid length");
		return NULL;
	}

	data->address = (uint8_t*)capwap_alloc(data->length);
	func->read_block(handle, data->address, data->length);
	length -= data->length;

	if (length > 0) {
		if (length <= CAPWAP_ADDSTATION_VLAN_MAX_LENGTH) {
			data->vlan = (uint8_t*)capwap_alloc(length + 1);
			func->read_block(handle, data->vlan, length);
			data->vlan[length] = 0;
		} else {
			capwap_addstation_element_free((void*)data);
			capwap_logging_debug("Invalid Add Station element: invalid vlan");
			return NULL;
		}
	}

	return data;
}
static void* ac_json_80211_supportedrates_createmessageelement(struct json_object* jsonparent, uint16_t radioid) {
	int i;
	int length;
	struct capwap_80211_supportedrates_element* supportedrates;

	if (json_object_get_type(jsonparent) != json_type_array) {
		return NULL;
	}

	length = json_object_array_length(jsonparent);
	if ((length < CAPWAP_SUPPORTEDRATES_MINLENGTH) || (length > CAPWAP_SUPPORTEDRATES_MAXLENGTH)) {
		return NULL;
	}

	supportedrates = (struct capwap_80211_supportedrates_element*)capwap_alloc(sizeof(struct capwap_80211_supportedrates_element));
	memset(supportedrates, 0, sizeof(struct capwap_80211_supportedrates_element));
	supportedrates->radioid = radioid;

	for (i = 0; i < length; i++) {
		struct json_object* jsonvalue = json_object_array_get_idx(jsonparent, i);
		if (jsonvalue && (json_object_get_type(jsonvalue) == json_type_int)) {
			supportedrates->supportedratescount++;
			supportedrates->supportedrates[i] = (uint8_t)json_object_get_int(jsonvalue);
		}
	}

	return supportedrates;
}
static void* capwap_80211_macoperation_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
    struct capwap_80211_macoperation_element* data;

    ASSERT(handle != NULL);
    ASSERT(func != NULL);

    if (func->read_ready(handle) != 16) {
        capwap_logging_debug("Invalid IEEE 802.11 MAC Operation element");
        return NULL;
    }

    /* */
    data = (struct capwap_80211_macoperation_element*)capwap_alloc(sizeof(struct capwap_80211_macoperation_element));
    memset(data, 0, sizeof(struct capwap_80211_macoperation_element));

    /* Retrieve data */
    func->read_u8(handle, &data->radioid);
    func->read_u8(handle, NULL);
    func->read_u16(handle, &data->rtsthreshold);
    func->read_u8(handle, &data->shortretry);
    func->read_u8(handle, &data->longretry);
    func->read_u16(handle, &data->fragthreshold);
    func->read_u32(handle, &data->txmsdulifetime);
    func->read_u32(handle, &data->rxmsdulifetime);

    return data;
}
static void* capwap_radioadmstate_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	struct capwap_radioadmstate_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	if (func->read_ready(handle) != 2) {
		log_printf(LOG_DEBUG, "Invalid Radio Administrative State element: underbuffer");
		return NULL;
	}

	/* Retrieve data */
	data = (struct capwap_radioadmstate_element*)capwap_alloc(sizeof(struct capwap_radioadmstate_element));
	func->read_u8(handle, &data->radioid);
	func->read_u8(handle, &data->state);

	if (!IS_VALID_RADIOID(data->radioid)) {
		capwap_radioadmstate_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Radio Administrative State element: invalid radioid");
		return NULL;
	} else if ((data->state != CAPWAP_RADIO_ADMIN_STATE_ENABLED) && (data->state != CAPWAP_RADIO_ADMIN_STATE_DISABLED)) {
		capwap_radioadmstate_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Radio Administrative State element: invalid state");
		return NULL;
	}

	return data;
}
static void* capwap_80211_station_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
    unsigned short length;
    struct capwap_80211_station_element* data;

    ASSERT(handle != NULL);
    ASSERT(func != NULL);

    length = func->read_ready(handle);
    if (length < 14) {
        capwap_logging_debug("Invalid IEEE 802.11 Station element");
        return NULL;
    }

    length -= 13;
    if (length > CAPWAP_STATION_RATES_MAXLENGTH) {
        capwap_logging_debug("Invalid IEEE 802.11 Station element");
        return NULL;
    }

    /* */
    data = (struct capwap_80211_station_element*)capwap_alloc(sizeof(struct capwap_80211_station_element));
    memset(data, 0, sizeof(struct capwap_80211_station_element));

    /* Retrieve data */
    func->read_u8(handle, &data->radioid);
    func->read_u16(handle, &data->associationid);
    func->read_u8(handle, &data->flags);
    func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
    func->read_u16(handle, &data->capabilities);
    func->read_u8(handle, &data->wlanid);
    data->supportedratescount = length;
    func->read_block(handle, data->supportedrates, length);

    return data;
}
Esempio n. 9
0
static int ac_execute_init_fdspool(struct ac_fds* fds, struct capwap_network* net, int fdmsgqueue) {
	ASSERT(fds != NULL);
	ASSERT(net != NULL);
	ASSERT(fdmsgqueue > 0);

	/* */
	memset(fds, 0, sizeof(struct ac_fds));
	fds->fdsnetworkcount = capwap_network_set_pollfd(net, NULL, 0);
	fds->msgqueuecount = 1;
	fds->fdspoll = (struct pollfd*)capwap_alloc(sizeof(struct pollfd) * (fds->fdsnetworkcount + fds->msgqueuecount));

	/* Retrive all socket for polling */
	fds->fdstotalcount = capwap_network_set_pollfd(net, fds->fdspoll, fds->fdsnetworkcount);
	if (fds->fdsnetworkcount != fds->fdstotalcount) {
		capwap_free(fds->fdspoll);
		return -1;
	}

	/* Unix socket message queue */
	fds->msgqueuestartpos = fds->fdsnetworkcount;
	fds->fdspoll[fds->msgqueuestartpos].events = POLLIN | POLLERR | POLLHUP | POLLNVAL;
	fds->fdspoll[fds->msgqueuestartpos].fd = fdmsgqueue;
	fds->fdstotalcount += fds->msgqueuecount;

	return ac_execute_update_fdspool(fds);
}
static void* capwap_80211_updatestationqos_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	int i;
	struct capwap_80211_updatestationqos_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	if (func->read_ready(handle) != 14) {
		capwap_logging_debug("Invalid IEEE 802.11 Update Station QoS element");
		return NULL;
	}

	/* */
	data = (struct capwap_80211_updatestationqos_element*)capwap_alloc(sizeof(struct capwap_80211_updatestationqos_element));
	memset(data, 0, sizeof(struct capwap_80211_updatestationqos_element));

	/* Retrieve data */
	func->read_u8(handle, &data->radioid);
	func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
	for (i = 0; i < CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS; i++) {
		func->read_u8(handle, &data->qos[i].priority8021p);
		data->qos[i].priority8021p &= CAPWAP_UPDATE_STATION_QOS_PRIORIY_MASK;
		func->read_u8(handle, &data->qos[i].dscp);
		data->qos[i].dscp &= CAPWAP_UPDATE_STATION_QOS_DSCP_MASK;
	}

	return data;
}
static void* ac_json_80211_wtpradiofailalarm_createmessageelement(struct json_object* jsonparent, uint16_t radioid) {
	struct json_object* jsonitem;
	struct capwap_80211_wtpradiofailalarm_element* wtpradiofailalarm;

	wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)capwap_alloc(sizeof(struct capwap_80211_wtpradiofailalarm_element));
	memset(wtpradiofailalarm, 0, sizeof(struct capwap_80211_wtpradiofailalarm_element));
	wtpradiofailalarm->radioid = radioid;

	/* */
	jsonitem = compat_json_object_object_get(jsonparent, "Type");
	if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) {
		wtpradiofailalarm->type = (uint8_t)json_object_get_int(jsonitem);
	} else {
		capwap_free(wtpradiofailalarm);
		return NULL;
	}

	/* */
	jsonitem = compat_json_object_object_get(jsonparent, "Status");
	if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) {
		wtpradiofailalarm->status = (uint8_t)json_object_get_int(jsonitem);
	} else {
		capwap_free(wtpradiofailalarm);
		return NULL;
	}

	return wtpradiofailalarm;
}
static void* ac_json_80211_ofdmcontrol_createmessageelement(struct json_object* jsonparent, uint16_t radioid) {
	struct json_object* jsonitem;
	struct capwap_80211_ofdmcontrol_element* ofdmcontrol;

	ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)capwap_alloc(sizeof(struct capwap_80211_ofdmcontrol_element));
	memset(ofdmcontrol, 0, sizeof(struct capwap_80211_ofdmcontrol_element));
	ofdmcontrol->radioid = radioid;

	/* */
	jsonitem = compat_json_object_object_get(jsonparent, "CurrentChan");
	if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) {
		ofdmcontrol->currentchannel = (uint8_t)json_object_get_int(jsonitem);
	} else {
		capwap_free(ofdmcontrol);
		return NULL;
	}

	jsonitem = compat_json_object_object_get(jsonparent, "BandSupport");
	if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) {
		ofdmcontrol->bandsupport = (uint8_t)json_object_get_int(jsonitem) & CAPWAP_OFDMCONTROL_BAND_MASK;
	} else {
		capwap_free(ofdmcontrol);
		return NULL;
	}

	jsonitem = compat_json_object_object_get(jsonparent, "TIThreshold");
	if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) {
		ofdmcontrol->tithreshold = (uint32_t)json_object_get_int(jsonitem);
	} else {
		capwap_free(ofdmcontrol);
		return NULL;
	}

	return ofdmcontrol;
}
Esempio n. 13
0
void capwap_array_resize(struct capwap_array* array, unsigned long count) {
	int newcount;
	void* newbuffer = NULL;

	ASSERT(array != NULL);
	ASSERT(array->itemsize > 0);

	if (array->count == count) {
		return;
	}

	newcount = min(array->count, count);

	if (count > 0) {
		newbuffer = capwap_alloc(array->itemsize * count);

		/* Zeroed new items */
		if (array->zeroed && (count > newcount)) {
			memset(newbuffer + array->itemsize * newcount, 0, array->itemsize * (count - newcount));
		}
	}

	if (array->buffer) {
		if ((newbuffer != NULL) && (newcount > 0)) {
			memcpy(newbuffer, array->buffer, array->itemsize * newcount);
		}

		capwap_free(array->buffer);
	}

	array->buffer = newbuffer;
	array->count = count;
}
Esempio n. 14
0
struct capwap_list_item* capwap_itemlist_create(int size) {
	void* item;

	ASSERT(size > 0);

	item = capwap_alloc(size);
	return capwap_itemlist_create_with_item(item, size);
}
Esempio n. 15
0
struct capwap_list* capwap_list_create(void) {
	struct capwap_list* list;

	list = (struct capwap_list*)capwap_alloc(sizeof(struct capwap_list));
	memset(list, 0, sizeof(struct capwap_list));

	return list;
}
Esempio n. 16
0
struct capwap_hash* capwap_hash_create(unsigned long hashsize) {
	unsigned long size;
	struct capwap_hash* hash;

	ASSERT(hashsize > 0);

	/* */
	hash = (struct capwap_hash*)capwap_alloc(sizeof(struct capwap_hash));
	hash->hashsize = hashsize;
	hash->count = 0;

	size = sizeof(struct capwap_hash_item*) * hashsize;
	hash->items = (struct capwap_hash_item**)capwap_alloc(size);
	memset(hash->items, 0, size);

	return hash;
}
Esempio n. 17
0
static void* capwap_imagedata_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_imagedata_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 1) {
		log_printf(LOG_DEBUG, "Invalid Image Data element: underbuffer");
		return NULL;
	}

	length -= 1;

	/* */
	data = (struct capwap_imagedata_element*)capwap_alloc(sizeof(struct capwap_imagedata_element));
	memset(data, 0, sizeof(struct capwap_imagedata_element));

	/* Retrieve data */
	func->read_u8(handle, &data->type);
	if ((data->type != CAPWAP_IMAGEDATA_TYPE_DATA_IS_INCLUDED) && (data->type != CAPWAP_IMAGEDATA_TYPE_DATA_EOF) && (data->type != CAPWAP_IMAGEDATA_TYPE_ERROR)) {
		capwap_imagedata_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Image Data element: underbuffer: invalid type");
		return NULL;
	} else if ((data->type == CAPWAP_IMAGEDATA_TYPE_ERROR) && (length > 0)) {
		capwap_imagedata_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Image Data element: underbuffer: invalid error type");
		return NULL;
	} else if (length > CAPWAP_IMAGEDATA_DATA_MAX_LENGTH) {
		capwap_imagedata_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Image Data element: underbuffer: invalid length");
		return NULL;
	}

	data->length = length;
	if (!length) {
		data->data = NULL;
	} else {
		data->data = (uint8_t*)capwap_alloc(length);
		func->read_block(handle, data->data, length);
	}

	return data;
}
static void* capwap_addmacacl_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_addmacacl_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 8) {
		log_printf(LOG_DEBUG, "Invalid Add MAC ACL Entry element: underbuffer");
		return NULL;
	}

	length -= 2;

	/* */
	data = (struct capwap_addmacacl_element*)capwap_alloc(sizeof(struct capwap_addmacacl_element));
	memset(data, 0, sizeof(struct capwap_addmacacl_element));

	/* Retrieve data */
	func->read_u8(handle, &data->entry);
	func->read_u8(handle, &data->length);

	if (!data->entry) {
		capwap_addmacacl_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Add MAC ACL Entry element: invalid entry");
		return NULL;
	} else if (!IS_VALID_MACADDRESS_LENGTH(data->length)) {
		capwap_addmacacl_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Add MAC ACL Entry element: invalid length");
		return NULL;
	}

	if (length != (data->entry * data->length)) {
		capwap_addmacacl_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Add MAC ACL Entry element: invalid total length");
		return NULL;
	}

	data->address = (uint8_t*)capwap_alloc(length);
	func->read_block(handle, data->address, length);

	return data;
}
Esempio n. 19
0
static void* capwap_datatransferdata_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_datatransferdata_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 5) {
		log_printf(LOG_DEBUG, "Invalid Data Transfer Data element: underbuffer");
		return NULL;
	}

	length -= 4;

	/* */
	data = (struct capwap_datatransferdata_element*)capwap_alloc(sizeof(struct capwap_datatransferdata_element));
	memset(data, 0, sizeof(struct capwap_datatransferdata_element));

	/* Retrieve data */
	func->read_u8(handle, &data->type);
	func->read_u8(handle, &data->mode);
	func->read_u16(handle, &data->length);

	if ((data->type != CAPWAP_DATATRANSFERDATA_TYPE_DATA_IS_INCLUDED) && (data->type != CAPWAP_DATATRANSFERDATA_TYPE_DATA_EOF) && (data->type != CAPWAP_DATATRANSFERDATA_TYPE_ERROR)) {
		capwap_datatransferdata_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Data Transfer Data element: invalid type");
		return NULL;
	} else if ((data->mode != CAPWAP_DATATRANSFERDATA_MODE_CRASH_DUMP) && (data->mode != CAPWAP_DATATRANSFERDATA_MODE_MEMORY_DUMP)) {
		capwap_datatransferdata_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Data Transfer Data element: invalid mode");
		return NULL;
	} else if (length != data->length) {
		capwap_datatransferdata_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Data Transfer Data element: invalid length");
		return NULL;
	}

	data->data = (uint8_t*)capwap_alloc(length);
	func->read_block(handle, data->data, length);

	return data;
}
static void* capwap_location_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_location_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if ((length < 1) || (length > CAPWAP_LOCATION_MAXLENGTH)) {
		capwap_logging_debug("Invalid Location Data element: underbuffer");
		return NULL;
	}

	/* Retrieve data */
	data = (struct capwap_location_element*)capwap_alloc(sizeof(struct capwap_location_element));
	data->value = (uint8_t*)capwap_alloc(length + 1);
	func->read_block(handle, data->value, length);
	data->value[length] = 0;

	return data;
}
Esempio n. 21
0
struct capwap_list_item* capwap_itemlist_create_with_item(void* item, int size) {
	struct capwap_list_item* itemlist;

	itemlist = (struct capwap_list_item*)capwap_alloc(sizeof(struct capwap_list_item));
	memset(itemlist, 0, sizeof(struct capwap_list_item));

	itemlist->item = item;
	itemlist->itemsize = size;
	itemlist->autodelete = 1;

	return itemlist;
}
static void* capwap_duplicateipv6_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	unsigned short length;
	struct capwap_duplicateipv6_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 24) {
		log_printf(LOG_DEBUG, "Invalid Duplicate IPv6 Address element: underbuffer");
		return NULL;
	}

	length -= 18;

	/* */
	data = (struct capwap_duplicateipv6_element*)capwap_alloc(sizeof(struct capwap_duplicateipv6_element));
	memset(data, 0, sizeof(struct capwap_duplicateipv6_element));

	/* Retrieve data */
	func->read_block(handle, (uint8_t*)&data->address, sizeof(struct in6_addr));
	func->read_u8(handle, &data->status);
	func->read_u8(handle, &data->length);

	if ((data->status != CAPWAP_DUPLICATEIPv6_CLEARED) && (data->status != CAPWAP_DUPLICATEIPv6_DETECTED)) {
		capwap_duplicateipv6_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Duplicate IPv6 Address element: invalid status");
		return NULL;
	} else if (!IS_VALID_MACADDRESS_LENGTH(data->length) || (length != data->length)) {
		capwap_duplicateipv6_element_free((void*)data);
		log_printf(LOG_DEBUG, "Invalid Duplicate IPv6 Address element: invalid length");
		return NULL;
	}

	data->macaddress = (uint8_t*)capwap_alloc(data->length);
	func->read_block(handle, data->macaddress, data->length);

	return data;
}
static void* capwap_80211_antenna_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	int i;
	uint8_t count;
	unsigned short length;
	struct capwap_80211_antenna_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	length = func->read_ready(handle);
	if (length < 5) {
		capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
		return NULL;
	}

	length -= 4;
	if (length > CAPWAP_ANTENNASELECTIONS_MAXLENGTH) {
		capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
		return NULL;
	}

	/* */
	data = (struct capwap_80211_antenna_element*)capwap_alloc(sizeof(struct capwap_80211_antenna_element));
	memset(data, 0, sizeof(struct capwap_80211_antenna_element));
	data->selections = capwap_array_create(sizeof(uint8_t), 0, 1);

	/* Retrieve data */
	func->read_u8(handle, &data->radioid);
	if (!IS_VALID_RADIOID(data->radioid)) {
		capwap_80211_antenna_element_free((void*)data);
		capwap_logging_debug("Invalid IEEE 802.11 Antenna element element: invalid radio");
		return NULL;
	}

	func->read_u8(handle, &data->diversity);
	func->read_u8(handle, &data->combiner);
	func->read_u8(handle, &count);

	/* Check */
	if (count != length) {
		capwap_logging_debug("Invalid IEEE 802.11 Antenna element");
		capwap_free(data);
		return NULL;
	}

	for (i = 0; i < count; i++) {
		func->read_u8(handle, (uint8_t*)capwap_array_get_item_pointer(data->selections, i));
	}

	return data;
}
Esempio n. 24
0
static struct capwap_hash_item* capwap_hash_create_item(struct capwap_hash* hash, void* data) {
	struct capwap_hash_item* item;

	ASSERT(hash != NULL);
	ASSERT(data != NULL);

	/* */
	item = (struct capwap_hash_item*)capwap_alloc(sizeof(struct capwap_hash_item));
	memset(item, 0, sizeof(struct capwap_hash_item));

	item->data = data;

	return item;
}
Esempio n. 25
0
struct capwap_array* capwap_array_create(unsigned short itemsize, unsigned long initcount, int zeroed) {
	struct capwap_array* array;

	ASSERT(itemsize > 0);

	array = (struct capwap_array*)capwap_alloc(sizeof(struct capwap_array));
	memset(array, 0, sizeof(struct capwap_array));

	array->itemsize = itemsize;
	array->zeroed = zeroed;
	if (initcount > 0) {
		capwap_array_resize(array, initcount);
	}

	return array;
}
Esempio n. 26
0
static void* capwap_localipv4_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	struct capwap_localipv4_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	if (func->read_ready(handle) != 4) {
		log_printf(LOG_DEBUG, "Invalid Local IPv4 Address element: underbuffer");
		return NULL;
	}

	/* Retrieve data */
	data = (struct capwap_localipv4_element*)capwap_alloc(sizeof(struct capwap_localipv4_element));
	func->read_block(handle, (uint8_t*)&data->address, sizeof(struct in_addr));

	return data;
}
Esempio n. 27
0
char* ac_get_printable_wtpid(struct capwap_wtpboarddata_element* wtpboarddata) {
	char* wtpid = NULL;
	struct capwap_wtpboarddata_board_subelement* wtpboarddatamacaddress;

	ASSERT(wtpboarddata != NULL);

	/* TODO: build printable wtpid depending on the model device */

	/* Get macaddress */
	wtpboarddatamacaddress = capwap_wtpboarddata_get_subelement(wtpboarddata, CAPWAP_BOARD_SUBELEMENT_MACADDRESS);
	if (wtpboarddatamacaddress != NULL) {
		wtpid = capwap_alloc(((wtpboarddatamacaddress->length == MACADDRESS_EUI48_LENGTH) ? CAPWAP_MACADDRESS_EUI48_BUFFER : CAPWAP_MACADDRESS_EUI64_BUFFER));
		capwap_printf_macaddress(wtpid, (unsigned char*)wtpboarddatamacaddress->data, wtpboarddatamacaddress->length);
	}

	return wtpid;
}
static void* capwap_idletimeout_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	struct capwap_idletimeout_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	if (func->read_ready(handle) != 4) {
		log_printf(LOG_DEBUG, "Invalid Idle Timeout element: underbuffer");
		return NULL;
	}

	/* Retrieve data */
	data = (struct capwap_idletimeout_element*)capwap_alloc(sizeof(struct capwap_idletimeout_element));
	func->read_u32(handle, &data->timeout);

	return data;
}
static void* capwap_maximumlength_element_parsing(capwap_message_elements_handle handle, struct capwap_read_message_elements_ops* func) {
	struct capwap_maximumlength_element* data;

	ASSERT(handle != NULL);
	ASSERT(func != NULL);

	if (func->read_ready(handle) != 2) {
		capwap_logging_debug("Invalid Maxium Message Length element: underbuffer");
		return NULL;
	}

	/* Retrieve data */
	data = (struct capwap_maximumlength_element*)capwap_alloc(sizeof(struct capwap_maximumlength_element));
	func->read_u16(handle, &data->length);

	return data;
}
Esempio n. 30
0
struct capwap_timeout* capwap_timeout_init(void) {
	struct capwap_timeout* timeout;

	/* */
	timeout = (struct capwap_timeout*)capwap_alloc(sizeof(struct capwap_timeout));
	memset(timeout, 0, sizeof(struct capwap_timeout));

	/* */
	timeout->itemsreference = capwap_hash_create(CAPWAP_TIMEOUT_HASH_COUNT);
	timeout->itemsreference->item_gethash = capwap_timeout_hash_item_gethash;
	timeout->itemsreference->item_getkey = capwap_timeout_hash_item_getkey;
	timeout->itemsreference->item_cmp = capwap_timeout_hash_item_cmp;

	timeout->itemstimeout = capwap_list_create();

	return timeout;
}