Beispiel #1
0
bool wpan_mcps_data_req(uint8_t SrcAddrMode,
		wpan_addr_spec_t *DstAddrSpec,
		uint8_t msduLength,
		uint8_t *msdu,
		uint8_t msduHandle,
		uint8_t TxOptions)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MCPS_DATA_REQUEST;
	*tx_buff_ptr++ = SrcAddrMode;
	*tx_buff_ptr++ = DstAddrSpec->AddrMode;
	*tx_buff_ptr++ = (uint8_t)DstAddrSpec->PANId;
	*tx_buff_ptr++ = (uint8_t)(DstAddrSpec->PANId >> 8);

	memcpy(tx_buff_ptr, &(DstAddrSpec->Addr).long_address,
			sizeof(uint64_t));
	tx_buff_ptr += sizeof(uint64_t);

	*tx_buff_ptr++ = msduHandle;
	*tx_buff_ptr++ = TxOptions;
	*tx_buff_ptr++ = msduLength;
	*tx_buff_ptr++ = msduLength;

	memcpy(tx_buff_ptr, msdu, msduLength);
	tx_buff_ptr += msduLength;

	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #2
0
bool wpan_mlme_associate_req(uint8_t LogicalChannel,
		uint8_t ChannelPage,
		wpan_addr_spec_t *CoordAddrSpec,
		uint8_t CapabilityInformation)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_ASSOCIATE_REQUEST;
	*tx_buff_ptr++ = LogicalChannel;
	*tx_buff_ptr++ = ChannelPage;
	*tx_buff_ptr++ = CoordAddrSpec->AddrMode;
	*tx_buff_ptr++ = (uint8_t)CoordAddrSpec->PANId;
	*tx_buff_ptr++ = (uint8_t)(CoordAddrSpec->PANId >> 8);

	memcpy(tx_buff_ptr, &(CoordAddrSpec->Addr).long_address,
			sizeof(uint64_t));
	tx_buff_ptr += sizeof(uint64_t);

	*tx_buff_ptr++ = CapabilityInformation;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #3
0
/**
 * @brief Function to handle the state machine serial data exchange.
 */
bool nwk_task(void)
{
	/* Rx processing */
	if (data_length == 0) {
		/* No data to process, read the stream IO */
		rx_index = 0;
		data_length = sio2ncp_rx(data, SIO_RX2NCP_BUF_SIZE);
	} else { /* Data has been received, process the data */
		 /* Process each single byte */
		process_incoming_data();
		data_length--;
		rx_index++;
	}

	/* Tx processing */
	if (buf_count != 0) {
		if (sio2ncp_tx(sio_tx_buf[head],
				(sio_tx_buf[head][1] + 3)) != 0) {
			head++;
			head %= SIO_BUF_COUNT;
			buf_count--;
		} else {
			/* @ToDo what happens if none or only a part of the
			 * bytes could be transmitted? */
		}
	}

	return true;
}
bool wpan_mlme_start_req(uint16_t PANId,
		uint8_t LogicalChannel,
		uint8_t ChannelPage,
		uint8_t BeaconOrder,
		uint8_t SuperframeOrder,
		bool PANCoordinator,
		bool BatteryLifeExtension,
		bool CoordRealignment)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_START_REQUEST;
	*tx_buff_ptr++ = (uint8_t)PANId;
	*tx_buff_ptr++ = (uint8_t)(PANId >> 8);
	*tx_buff_ptr++ = LogicalChannel;
	*tx_buff_ptr++ = ChannelPage;
	*tx_buff_ptr++ = BeaconOrder;
	*tx_buff_ptr++ = SuperframeOrder;
	*tx_buff_ptr++ = PANCoordinator;
	*tx_buff_ptr++ = BatteryLifeExtension;
	*tx_buff_ptr++ = CoordRealignment;

	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
bool wpan_mlme_set_req(uint8_t PIBAttribute,
		void *PIBAttributeValue)
{
	uint8_t pib_len;
	if (macBeaconPayload == PIBAttribute) {
		pib_len = *((uint8_t *)PIBAttributeValue - 1);
	} else {
		pib_len = mac_get_pib_attribute_size(PIBAttribute);
	}

	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_SET_REQUEST;
	*tx_buff_ptr++ = PIBAttribute;

	*tx_buff_ptr++ = pib_len;
	memcpy(tx_buff_ptr, (uint8_t *)PIBAttributeValue, pib_len);
	tx_buff_ptr += pib_len;

	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #6
0
bool wpan_mlme_disassociate_req(wpan_addr_spec_t *DeviceAddrSpec,
		uint8_t DisassociateReason,
		bool TxIndirect)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_DISASSOCIATE_REQUEST;
	*tx_buff_ptr++ = DeviceAddrSpec->AddrMode;
	*tx_buff_ptr++ = (uint8_t)DeviceAddrSpec->PANId;
	*tx_buff_ptr++ = (uint8_t)(DeviceAddrSpec->PANId >> 8);

	memcpy(tx_buff_ptr, &((DeviceAddrSpec->Addr).long_address),
			sizeof(uint64_t));
	tx_buff_ptr += sizeof(uint64_t);

	*tx_buff_ptr++ = DisassociateReason;
	*tx_buff_ptr++ = TxIndirect;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #7
0
bool wpan_mcps_purge_req(const uint8_t msduHandle)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MCPS_PURGE_REQUEST;
	*tx_buff_ptr++ = msduHandle;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #8
0
void serial_bridge_handler()
{
	length_received_host = sio2host_rx(temp, SIO_RX_BUF_SIZE);
	if (length_received_host != 0) {
		sio2ncp_tx(temp, length_received_host);
		length_received_host = 0;
	}

	length_received_ncp = sio2ncp_rx(temp, SIO_RX_BUF_SIZE);
	if (length_received_ncp != 0) {
		sio2host_tx(temp, length_received_ncp);
		length_received_ncp = 0;
	}
}
Beispiel #9
0
bool wpan_mlme_reset_req(bool SetDefaultPib)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_RESET_REQUEST;
	*tx_buff_ptr++ = SetDefaultPib;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #10
0
bool wpan_mlme_get_req(uint8_t PIBAttribute)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_GET_REQUEST;
	*tx_buff_ptr++ = PIBAttribute;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #11
0
bool wpan_mlme_gts_req(uint16_t DevShortAddr, gts_char_t GtsChar)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_GTS_REQUEST;
	*tx_buff_ptr++ = (uint8_t)DevShortAddr;
	*tx_buff_ptr++ = (uint8_t)DevShortAddr >> 8;
	*tx_buff_ptr++ = *((uint8_t*)&GtsChar);
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #12
0
bool wpan_mlme_sync_req(uint8_t LogicalChannel,
		uint8_t ChannelPage,
		bool TrackBeacon)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_SYNC_REQUEST;
	*tx_buff_ptr++ = LogicalChannel;
	*tx_buff_ptr++ = ChannelPage;
	*tx_buff_ptr++ = TrackBeacon;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #13
0
bool wpan_mlme_poll_req(wpan_addr_spec_t *CoordAddrSpec)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_POLL_REQUEST;
	*tx_buff_ptr++ = CoordAddrSpec->AddrMode;
	*tx_buff_ptr++ = (uint8_t)CoordAddrSpec->PANId;
	*tx_buff_ptr++ = (uint8_t)(CoordAddrSpec->PANId >> 8);

	memcpy(tx_buff_ptr, &(CoordAddrSpec->Addr).long_address,
			sizeof(uint64_t));
	tx_buff_ptr += sizeof(uint64_t);

	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #14
0
bool wpan_mlme_orphan_resp(uint64_t OrphanAddress,
		uint16_t ShortAddress,
		bool AssociatedMember)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_ORPHAN_RESPONSE;

	memcpy(tx_buff_ptr, &OrphanAddress, sizeof(uint64_t));
	tx_buff_ptr += sizeof(uint64_t);

	*tx_buff_ptr++ = (uint8_t)ShortAddress;
	*tx_buff_ptr++ = (uint8_t)(ShortAddress >> 8);
	*tx_buff_ptr++ = AssociatedMember;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #15
0
bool wpan_mlme_associate_resp(uint64_t DeviceAddress,
		uint16_t AssocShortAddress,
		uint8_t status)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_ASSOCIATE_RESPONSE;

	memcpy(tx_buff_ptr, &DeviceAddress, sizeof(uint64_t));
	tx_buff_ptr += sizeof(uint64_t);

	*tx_buff_ptr++ = (uint8_t)AssocShortAddress;
	*tx_buff_ptr++ = (uint8_t)(AssocShortAddress >> 8);
	*tx_buff_ptr++ = status;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #16
0
bool wpan_mlme_scan_req(uint8_t ScanType,
		uint32_t ScanChannels,
		uint8_t ScanDuration,
		uint8_t ChannelPage)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_SCAN_REQUEST;
	*tx_buff_ptr++ = ScanType;

	memcpy(tx_buff_ptr, &ScanChannels, sizeof(uint32_t));
	tx_buff_ptr += sizeof(uint32_t);

	*tx_buff_ptr++ = ScanDuration;
	*tx_buff_ptr++ = ChannelPage;
	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}
Beispiel #17
0
bool wpan_mlme_rx_enable_req(bool DeferPermit,
		uint32_t RxOnTime,
		uint32_t RxOnDuration)
{
	length = 0;
	tx_buff_ptr = &tx_buffer[CMD_POS];

	*tx_buff_ptr++ = MLME_RX_ENABLE_REQUEST;
	*tx_buff_ptr++ = DeferPermit;

	memcpy(tx_buff_ptr, &RxOnTime, sizeof(uint32_t));
	tx_buff_ptr += sizeof(uint32_t);

	memcpy(tx_buff_ptr, &RxOnDuration, sizeof(uint32_t));
	tx_buff_ptr += sizeof(uint32_t);

	*tx_buff_ptr++ = EOT;

	length = tx_buff_ptr - (uint8_t *)&tx_buffer[0];
	tx_buffer[LEN_POS] = length - 3;
	sio2ncp_tx(tx_buffer, length);
	return true;
}