Пример #1
0
/**
 * @brief Post processing of the vendor data response.
 *
 * @param PairingRef       Pairing reference
 * @param VendorId         Vendor ID.
 * @param nsduLength       Length of the payload.
 * @param nsdu             Actual payload
 * @param RxLinkQuality    Link quality of received packet.
 * @param RxFlags          Rx Flags.
 */
static void vendor_data_ind(uint8_t PairingRef, uint16_t VendorId,
		uint8_t nsduLength, uint8_t *nsdu, uint8_t RxLinkQuality,
		uint8_t RxFlags)
{
	uint16_t v_id = PGM_READ_WORD(&VendorIdentifier);
	if (v_id == VendorId) {
		if (node_status == POWER_SAVE) {
			printf("Leaving power save mode.\r\n");
			nlme_rx_enable_request(RX_DURATION_INFINITY,
					(FUNC_PTR)nlme_rx_enable_confirm
					);
			node_status = IDLE;
		}

		printf("Vendor data received from pairing ref %d - ",
				PairingRef);
		switch (nsdu[0]) {
		case BATTERY_STATUS_RESP:
		{
			uint16_t volt = (uint16_t)nsdu[1] |
					((uint16_t)nsdu[2] << 8);

			printf("battery status ");
			printf("%d.", volt / 1000);
			printf("%d V\r\n", volt % 1000);
		}
		break;

		case ALIVE_RESP:
			printf("Remote controller is alive\r\n");
			break;

		case FW_VERSION_RESP:
			printf("Firmware version response: %d.%d.%d\r\n",
					nsdu[1], nsdu[2], nsdu[3]);
			break;

		case RX_ON_RESP:
			printf("RX on response\r\n");
			break;

		default:
			printf("unknown command: 0x");
			for (uint8_t i = 0; i < nsduLength; i++) {
				printf("%.02X ", nsdu[i]);
			}
			printf("\r\n");
			break;
		}
	}

	/* Keep compiler happy */
	PairingRef = PairingRef;
	nsduLength = nsduLength;
	RxLinkQuality = RxLinkQuality;
	RxFlags = RxFlags;
}
Пример #2
0
/**
 * @brief Handles the rc command indications at terminal target.
 *
 * @param PairingRef       Pairing reference
 * @param nsduLength       Length of the payload.
 * @param nsdu             Actual payload
 * @param RxLinkQuality    Link quality of received packet.
 * @param RxFlags          Rx Flags.
 */
static void zrc_cmd_indication(uint8_t PairingRef, uint8_t nsduLength,
		uint8_t *nsdu,
		uint8_t RxLinkQuality, uint8_t RxFlags)
{
	zrc_cmd_frm_t *zrc_frm;

	if (node_status == POWER_SAVE) {
		printf("Leaving power save mode.\r\n");
		nlme_rx_enable_request(RX_DURATION_INFINITY,
				(FUNC_PTR)nlme_rx_enable_confirm
				);
		node_status = IDLE;
	}

	/* Switch LED on indicating data reception */
	LED_On(LED_DATA);
	sw_timer_start(led_timer, 250000, SW_TIMEOUT_RELATIVE,
			(FUNC_PTR)led_handling, NULL);

	/* Check with frame control field which kind of data is indicated */
	zrc_frm = (zrc_cmd_frm_t *)nsdu;
	switch (zrc_frm->fcf) {
	case USER_CONTROL_PRESSED:
	{
		printf("Rx: ");
		printf("%s", zrc_print_rc_cmd_text(zrc_frm->rc_cmd));
		printf(" Press (0x%.2X), ", zrc_frm->rc_cmd);
		printf("from %d, LQI = 0x%.2X\r\n", PairingRef, RxLinkQuality);
	}
	break;

	case USER_CONTROL_REPEATED:
		printf("Rx: ");
		zrc_print_rc_cmd_text(zrc_frm->rc_cmd);
		printf(" Repeat (0x%.2X), ", zrc_frm->rc_cmd);
		printf("from %d, LQI = 0x%.2X\r\n", PairingRef, RxLinkQuality);
		break;

	case USER_CONTROL_RELEASED:
		printf("Rx: ");
		zrc_print_rc_cmd_text(zrc_frm->rc_cmd);
		printf(" Release (0x%.2X), ", zrc_frm->rc_cmd);
		printf("from %d, LQI = 0x%.2X\r\n", PairingRef, RxLinkQuality);
		break;

	default:
		break;
	}

	/* Keep compiler happy */
	nsduLength = nsduLength;
	RxFlags = RxFlags;
}
Пример #3
0
static
#endif
void nlme_reset_confirm(nwk_enum_t Status)
{
    if (Status != NWK_SUCCESS)
    {
		if(node_status == COLD_START)
		{
			while (1)
			{
			  indicate_fault_behavior();
			}
		}
		else
		{
		  indicate_fault_behavior();
		  /* Reset the network and start again */
		  /* Warm start */
			node_status = WARM_START;
			nlme_reset_request(false
#ifdef RF4CE_CALLBACK_PARAM
                          ,(FUNC_PTR)nlme_reset_confirm
#endif
                           );
		}
    }

    if (node_status == COLD_START)
    {
		/* cold start procedure starts here */
        pairing_ref = 0xFF;
        nlme_start_request(
#ifdef RF4CE_CALLBACK_PARAM
                           (FUNC_PTR)nlme_start_confirm
#endif

                           );
    }
    else    /* warm start procedure starts here */
    {
        pairing_ref = 0;
        /* Set power save mode: sleep */
        nlme_rx_enable_request(0/*nwkcMinActivePeriod*/
#ifdef RF4CE_CALLBACK_PARAM
                           ,(FUNC_PTR)app_nlme_rx_enable_confirm
#endif

                           );
    }
}
Пример #4
0
/**
 * @brief Notify the application of the status of its request to reset the NWK
 *        layer.
 *
 * @param Status              nwk status
 */
static void nlme_reset_confirm(nwk_enum_t Status)
{
	printf("Node reset completed - %s (0x%.2X)\r\n",
			get_status_text((nwk_enum_t)Status), Status);
	number_of_paired_dev = 0;

	if ((node_status == RESETTING) || (Status != NWK_SUCCESS)) {
		printf("> Press Enter to return to main menu: \r\n");
		node_status = IDLE;
		number_of_paired_dev = 0;
		return;
	} else if (node_status == WARM_STARTING) {
		nlme_rx_enable_request(RX_DURATION_INFINITY,
				(FUNC_PTR)nlme_rx_enable_confirm
				);
	} else if (node_status == ALL_IN_ONE_START) {
		printf("\tStart RF4CE network layer - \r\n");
		nlme_start_request(
				(FUNC_PTR)nlme_start_confirm
				);
	}
}
Пример #5
0
void vendor_data_ind(uint8_t PairingRef, uint16_t VendorId,
                     uint8_t nsduLength, uint8_t *nsdu, uint8_t RxLinkQuality,
                     uint8_t RxFlags)
{
    /* Check if vendor id matches.
     * Handle here only vendor data from same vendor */
    uint16_t v_id = PGM_READ_WORD(&VendorIdentifier);
    uint8_t nsduHandle = 1;
    if ((VendorId == v_id) && (RxFlags & RX_FLAG_WITH_SEC)) {
        switch (nsdu[0]) { /* vendor-specific command id */
        case BATTERY_STATUS_REQ:
        {
            uint16_t voltage = get_batmon_voltage();
            nsdu[0] = BATTERY_STATUS_RESP;
            nsdu[1] = (uint8_t)voltage; /* LSB */
            nsdu[2] = (uint8_t)(voltage >> 8); /* MSB */
            nsduLength = 3;
        }
        break;

        case ALIVE_REQ: /* Alive request */
            vendor_app_alive_req();
            /* Send alive response */
            nsdu[0] = ALIVE_RESP;
            nsduLength = 1;
            break;

        case FW_VERSION_REQ:
        {
            /* Send alive response */
            nsdu[0] = FW_VERSION_RESP;
            nsdu[1] = FW_VERSION_MAJOR; /* major version number */
            nsdu[2] = FW_VERSION_MINOR; /* minor version number */
            nsdu[3] = FW_VERSION_REV; /* revision version number */
            nsduLength = 4;
        }
        break;

        case RX_ON_REQ:
        {
            uint32_t duration = 0;

            memcpy(&duration, &nsdu[1], 3);
            if (!nlme_rx_enable_request(duration,
                                        (FUNC_PTR)nlme_rx_enable_confirm
                                       )) {
                /*
                 * RX enable could not been added to the queue.
                 * Therefore do not send response message.
                 */
                return;
            }

            /* Send response */
            nsdu[0] = RX_ON_RESP;
            nsduLength = 1;
        }
        break;

        default:
        {
            /* Send response */
            nsdu[0] = FW_DATA_RESP;
            nsdu[1] = VD_NOT_SUPPORTED_ATTRIBUTE;
            nsduLength = 2;
        }
        break;
        }

        /* Transmit response message */

        nlde_data_request(PairingRef, PROFILE_ID_ZRC, VendorId,
                          nsduLength, nsdu,
                          TXO_UNICAST | TXO_DST_ADDR_NET | TXO_ACK_REQ | TXO_SEC_REQ | TXO_MULTI_CH | TXO_CH_NOT_SPEC | TXO_VEND_SPEC,
                          nsduHandle,
                          (FUNC_PTR)vendor_data_confirm
                         );
        /* Keep compiler happy */
        RxLinkQuality = RxLinkQuality;
        RxFlags = RxFlags;
    }
}
Пример #6
0
void vendor_data_ind(uint8_t PairingRef, profile_id_t ProfileId, uint16_t VendorId,
                          uint8_t nsduLength, uint8_t *nsdu, uint8_t RxLinkQuality,
                          uint8_t RxFlags)
{
    /* Check if vendor id matches.
       Handle here only vendor data from same vendor */
    uint16_t v_id = PGM_READ_WORD(&VendorIdentifier);
    if ((VendorId == v_id) && (RxFlags & RX_FLAG_WITH_SEC))
    {
	switch (nsdu[0])    // vendor-specific command id
        {
          
#ifdef _DEBUG_INTERFACE_
        case 0x1B:  
          {
              int i;
              for (i = 0; i < nsduLength;) 
              {
                  RxHandler(nsdu[i++]); 
              }
             
               RX_index = 4;	// Next GetChar() will get the command id
          
              /* Call QDebug_Process */
              QDebug_ProcessCommands();
              return;
          }
          break;
          
#endif
          
#ifdef TFA_BAT_MON
            case BATTERY_STATUS_REQ:
                {
                    uint16_t voltage = tfa_get_batmon_voltage();
                    nsdu[0] = BATTERY_STATUS_RESP;
                    nsdu[1] = (uint8_t)voltage;    // LSB
                    nsdu[2] = (uint8_t)(voltage >> 8);    // MSB
                    nsduLength = 3;
                }
                break;
#endif
            case ALIVE_REQ:  /* Alive request */
                vendor_app_alive_req();
                /* Send alive response */
                nsdu[0] = ALIVE_RESP;
                nsduLength = 1;
                break;

            case FW_VERSION_REQ:
                {
                    /* Send alive response */
                    nsdu[0] = FW_VERSION_RESP;
                    nsdu[1] = FW_VERSION_MAJOR;    // major version number
                    nsdu[2] = FW_VERSION_MINOR;    // minor version number
                    nsdu[3] = FW_VERSION_REV;    // revision version number
                    nsduLength = 4;
                }
                break;

            case RX_ON_REQ:
                {
                    uint32_t duration = 0;

                    memcpy(&duration, &nsdu[1], 3);
                    if (!nlme_rx_enable_request(duration))
                    {
                        /*
                         * RX enable could not been added to the queue.
                         * Therefore do not send response message.
                         */
                        return;
                    }
                    /* Send response */
                    nsdu[0] = RX_ON_RESP;
                    nsduLength = 1;
                }
                break;

#ifdef FLASH_SUPPORT
            case FW_DATA_REQ:
                {
                    fw_data_frame_t *fw_frame;
                    vendor_status_t status = VD_SUCCESS;

                    fw_frame = (fw_data_frame_t *)nsdu;

                    /* Verify data chunk size */
                    uint8_t fw_data_size = nsduLength - 5;  // 5 = header len
                    if (fw_data_size > 64)
                    {
                        status = VD_UNSUPPORTED_SIZE;
                    }
                    else
                    {
                        /* Fill temporary page buffer */
                        uint16_t start_addr = (fw_frame->frame_cnt - 1) % 4;
                        flash_fill_page_buffer(start_addr * (SPM_PAGESIZE / 4), fw_data_size, &fw_frame->fw_data[0]);
                        /* Write flash page */
                        if ((fw_frame->frame_cnt % 4) == 0)
                        {
                            uint32_t page_start_addr;
                            page_start_addr = IMAGE_START_ADDR + ((uint32_t)SPM_PAGESIZE * ((fw_frame->frame_cnt / 4) - 1));
                            flash_program_page(page_start_addr);
                        }
                        else if (fw_frame->frame_cnt == fw_frame->total_num_frames)
                        {
                            uint32_t page_start_addr;
                            page_start_addr = IMAGE_START_ADDR + ((uint32_t)SPM_PAGESIZE * (fw_frame->frame_cnt / 4));
                            flash_program_page(page_start_addr);
                        }
                    }
                    /* Send response */
                    nsdu[0] = FW_DATA_RESP;
                    nsdu[1] = status;
                    nsduLength = 2;
                }
                break;
#endif  /* #ifdef FLASH_SUPPORT */

#ifdef FLASH_SUPPORT
            case FW_SWAP_REQ:
                flash_swap(IMAGE_START_ADDR, IMAGE_SIZE);
                /* Do not send response message */
                return;
#endif  /* #ifdef FLASH_SUPPORT */

            default:
                {
                    /* Send response */
                    nsdu[0] = FW_DATA_RESP;
                    nsdu[1] = VD_NOT_SUPPORTED_ATTRIBUTE;
                    nsduLength = 2;
                }
                break;
        }

        /* Transmit response message */
        nlde_data_request(PairingRef, PROFILE_ID_VENDOR_DATA, VendorId,
                        nsduLength, nsdu,
                        TXO_UNICAST | TXO_DST_ADDR_NET | TXO_ACK_REQ | TXO_SEC_REQ | TXO_MULTI_CH | TXO_CH_NOT_SPEC | TXO_VEND_SPEC);

        /* Keep compiler happy */
        UNUSED(ProfileId);
        UNUSED(RxLinkQuality);
        UNUSED(RxFlags);
    }
}
Пример #7
0
/**
 * @brief Handle keyboard input
 *
 * @param input_char       character typed from input device.
 */
static void handle_input(uint8_t input_char)
{
	/* We allow user input if we are either in IDLE state ot POWER_SAVE
	 * state
	 * In case of POWER_SAVE state, we allow only reset & disabling
	 * POWER_SAVE req*/
	if (((node_status != IDLE) && (node_status != POWER_SAVE)) ||
			((node_status == POWER_SAVE) &&
			(!((input_char == 'Y') || (input_char == 'R') ||
			(input_char == 'A') || (input_char == 'W') ||
			(input_char == 0x0D))))) {
		printf(
				"Node is in power save mode.Press (R) to Reset/Press (Y) to Disable power save mode.\r\n");
		return;
	}

	switch (input_char) {
	case 'Y':
		if (node_status == POWER_SAVE) {
			printf(
					"Leaving standby (power save mode). Press Enter to return to main menu.\r\n ");
			nlme_rx_enable_request(RX_DURATION_INFINITY,
					(FUNC_PTR)nlme_rx_enable_confirm
					);
			node_status = IDLE;
		} else {
			printf(
					"Entering standby (power save mode). Press Enter to return to main menu.\r\n ");
			nlme_rx_enable_request(nwkcMinActivePeriod,
					(FUNC_PTR)nlme_rx_enable_confirm
					);
			node_status = POWER_SAVE;
		}

		break;

	case 'R':
		printf("Reset node - \r\n");
		node_status = RESETTING;
		ch_ag_enabled = false;
		nlme_reset_request(true,
				(FUNC_PTR)nlme_reset_confirm
				);
		break;

	case 'S':
		printf("Start node - \r\n");
		node_status = STARTING;
		nlme_start_request(
				(FUNC_PTR)nlme_start_confirm
				);
		break;

	case 'P':
		printf("Push button pairing -\r\n");
		node_status = PUSH_BUTTON_PAIRING;
		sw_timer_start(led_timer,
				500000,
				SW_TIMEOUT_RELATIVE,
				(FUNC_PTR)led_handling,
				NULL);
		LED_On(LED_NWK_SETUP);
		{
			dev_type_t RecDevTypeList[DEVICE_TYPE_LIST_SIZE];
			profile_id_t RecProfileIdList[PROFILE_ID_LIST_SIZE];

			RecDevTypeList[0] = (dev_type_t)SUPPORTED_DEV_TYPE_0;
			RecProfileIdList[0] = SUPPORTED_PROFILE_ID_0;

			pbp_rec_pair_request(APP_CAPABILITIES, RecDevTypeList,
					RecProfileIdList,
					(FUNC_PTR)pbp_rec_pair_confirm
					);
		}
		break;

	case 'A':
		printf("All-in-one start; wait until done.\r\n");
		node_status = ALL_IN_ONE_START;
		printf("\tReset node - ");
		ch_ag_enabled = false;
		nlme_reset_request(true,
				(FUNC_PTR)nlme_reset_confirm
				);
		break;

	case 'W':
		previous_node_status = node_status;
		printf("Warm start - \r\n");
		node_status = WARM_STARTING;
		nlme_reset_request(false,
				(FUNC_PTR)nlme_reset_confirm
				);
		break;

	case 'T':
		previous_node_status = node_status;
		node_status = PRINTING_PAIRING_TABLE;
		print_pairing_table(true, NULL, 0);
		break;

	case 'U':
		node_status = UNPAIRING;
		print_unpair_submenu();
		break;

	case 'C':
		if (ch_ag_enabled) {
			ch_ag_enabled = false;
			nwk_ch_agility_request(AG_STOP,
					(FUNC_PTR)nwk_ch_agility_confirm
					);
			printf(" - Channel agility is stopped ...\r\n");
		} else {
			ch_ag_enabled = true;
			node_status = CH_AGILITY_EXECUTION;
			printf(" - Channel agility is started ...\r\n");
			nwk_ch_agility_request(AG_PERIODIC,
					(FUNC_PTR)nwk_ch_agility_confirm
					);
		}

		break;

	case 'O':
		/* Start getting the NIBs value */
		node_status = GETTING_CH_AG_NIBS;
		nlme_get_request(nwkPrivateChAgEdThreshold, 0,
				(FUNC_PTR)nlme_get_confirm
				);
		break;

	case 'B':
		print_ch_change_submenu();
		break;

	case 'D':
		print_vendor_data_submenu(BATTERY_STATUS_REQ);
		break;

	case 'V':
		print_vendor_data_submenu(FW_VERSION_REQ);
		break;

	case 'Z':
		print_vendor_data_submenu(ALIVE_REQ);
		break;

	default:
		print_main_menu();
		break;
	}
}
Пример #8
0
static inline void handle_incoming_msg(void)
{
	bool ret_val;

	switch (sio_rx_buf[1]) { /* message type */
	case NLDE_DATA_REQUEST:

		/* Attention: The TxOption field is moved before the nsduLength
		 * field! */
		ret_val = nlde_data_request(sio_rx_buf[2],
				(profile_id_t)sio_rx_buf[3],
				((uint16_t)sio_rx_buf[4] |
				((uint16_t)sio_rx_buf[5] << 8)),                                       /*
		                                                                                        *
		                                                                                        *
		                                                                                        *VendorId
		                                                                                        **/
				sio_rx_buf[7],             /* nsduLength */
				&sio_rx_buf[8],
				sio_rx_buf[6],            /* TxOptions */
				1,
				(FUNC_PTR)nlde_data_confirm
				);
		break;

#if (defined RF4CE_TARGET) || (defined RF4CE_PLATFORM)
	case NLME_AUTO_DISCOVERY_REQUEST:
	{
		dev_type_t RecDevTypeList[DEVICE_TYPE_LIST_SIZE];
		profile_id_t RecProfileIdList[PROFILE_ID_LIST_SIZE];
		uint32_t AutoDiscDuration;

		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			RecDevTypeList[i] = (dev_type_t)sio_rx_buf[3 + i];
		}
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			RecProfileIdList[i] = (profile_id_t)sio_rx_buf[6 + i];
		}
		MEMCPY_ENDIAN(&AutoDiscDuration, &sio_rx_buf[13],
				sizeof(uint32_t));

		ret_val = nlme_auto_discovery_request(sio_rx_buf[2], /*
			                                              *
			                                              *
			                                              *RecAppCapabilities
			                                              **/
				RecDevTypeList,                      /*
			                                              *
			                                              *(dev_type_t
			                                              *
			                                              ***)&sio_rx_buf[3],
			                                              **/
				RecProfileIdList,                      /*
			                                                *
			                                                *(profile_id_t
			                                                *
			                                                ***)&sio_rx_buf[3
			                                                * + 3],
			                                                **/
				AutoDiscDuration,                     /*
			                                               *
			                                               **(uint32_t
			                                               *
			                                               ***)&sio_rx_buf[3
			                                               * + 3 +
			                                               * 7]); */
				(FUNC_PTR)nlme_auto_discovery_confirm
				);
	}
	break;
#endif
	case NLME_DISCOVERY_REQUEST:

	{
#if (UC3)
		uint16_t PANId
			= ((uint16_t)sio_rx_buf[2] <<
				8) | (uint16_t)sio_rx_buf[3];
		uint16_t NwkAddr
			= ((uint16_t)sio_rx_buf[4] <<
				8) | (uint16_t)sio_rx_buf[5];
#else
		uint16_t PANId = (uint16_t)sio_rx_buf[2] |
				((uint16_t)sio_rx_buf[3] << 8);
		uint16_t NwkAddr = (uint16_t)sio_rx_buf[4] |
				((uint16_t)sio_rx_buf[5] << 8);
#endif
		dev_type_t dev_type_list[DEVICE_TYPE_LIST_SIZE];
		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			dev_type_list[i] = (dev_type_t)sio_rx_buf[7 + i];
		}
		profile_id_t org_profile_id_list[PROFILE_ID_LIST_SIZE];
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			org_profile_id_list[i]
				= (profile_id_t)sio_rx_buf[10 +
					i];
		}
		profile_id_t disc_profile_id_list[PROFILE_ID_LIST_SIZE];
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			disc_profile_id_list[i]
				= (profile_id_t)sio_rx_buf[19 +
					i];
		}
		uint32_t disc_duration;
		MEMCPY_ENDIAN(&disc_duration, &sio_rx_buf[26],
				sizeof(uint32_t));

		ret_val = nlme_discovery_request(PANId, NwkAddr,
				sio_rx_buf[6],                    /* uint8_t
			                                           *
			                                           *
			                                           *OrgAppCapabilities,
			                                           **/
				dev_type_list,                   /* uint8_t
			                                          *
			                                          *
			                                          *OrgDevTypeList[DEVICE_TYPE_LIST_SIZE],
			                                          **/
				org_profile_id_list,                   /*
			                                                *
			                                                *uint8_t
			                                                *
			                                                *
			                                                *OrgProfileIdList[DEVICE_TYPE_LIST_SIZE],
			                                                **/
				(dev_type_t)sio_rx_buf[7 + 3 /*num_dev_types*/ +
				7 /*num_profiles*/],                                                                    /*
			                                                                                                 *
			                                                                                                 *uint8_t
			                                                                                                 *
			                                                                                                 *
			                                                                                                 *SearchDevType,
			                                                                                                 **/
				sio_rx_buf[8 + 3 + 7],                     /*
			                                                    *
			                                                    *uint8_t
			                                                    *
			                                                    *
			                                                    *DiscProfileIdListSize,
			                                                    **/
				disc_profile_id_list,                    /*
			                                                  *
			                                                  *uint8_t
			                                                  *
			                                                  *
			                                                  *DiscProfileIdList[PROFILE_ID_LIST_SIZE],
			                                                  **/
				disc_duration,                       /* uint32_t
			                                              *
			                                              *
			                                              *DiscDuration);
			                                              **/
				(FUNC_PTR)nlme_discovery_confirm
				);
	}

	break;

#if (defined RF4CE_TARGET) || (defined RF4CE_PLATFORM)
	case NLME_DISCOVERY_RESPONSE:
	{
		nwk_enum_t Status = (nwk_enum_t)sio_rx_buf[2];
		uint64_t DstIEEEAddr;
		memcpy(&DstIEEEAddr, &sio_rx_buf[3], 8);
		dev_type_t dev_type_list[DEVICE_TYPE_LIST_SIZE];
		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			dev_type_list[i] = (dev_type_t)sio_rx_buf[12 + i];
		}
		profile_id_t profile_id_list[PROFILE_ID_LIST_SIZE];
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			profile_id_list[i] = (profile_id_t)sio_rx_buf[15 + i];
		}
		ret_val = nlme_discovery_response(Status,    /* nwk_enum_t
			                                      * Status, */
				DstIEEEAddr,                    /* uint64_t
			                                         * DstIEEEAddr,
			                                         **/
				sio_rx_buf[11],                         /*
			                                                 *
			                                                 *uint8_t
			                                                 *
			                                                 *
			                                                 *RecAppCapabilities,
			                                                 **/
				dev_type_list,                    /* uint8_t
			                                           *
			                                           *
			                                           *RecDevTypeList[DEVICE_TYPE_LIST_SIZE],
			                                           **/
				profile_id_list,                    /* uint8_t
			                                             *
			                                             *
			                                             *RecProfileIdList[PROFILE_ID_LIST_SIZE],
			                                             **/
				sio_rx_buf[12 + 3 + 7]);                         /*
			                                                          *
			                                                          *uint8_t
			                                                          *
			                                                          *
			                                                          *DiscReqLQI);
			                                                          **/
	}

	break;
#endif
#if (defined RF4CE_TARGET) || (defined RF4CE_PLATFORM)
	case NLME_PAIR_RESPONSE:
	{
		nwk_enum_t Status = (nwk_enum_t)sio_rx_buf[2];
#if (UC3)
		uint16_t DstPANId
			= ((uint16_t)sio_rx_buf[3] <<
				8) | (uint16_t)sio_rx_buf[4];
#else
		uint16_t DstPANId = (uint16_t)sio_rx_buf[3] |
				((uint16_t)sio_rx_buf[4] << 8);
#endif
		uint64_t DstIEEEAddr;
		memcpy(&DstIEEEAddr, &sio_rx_buf[5], 8);
		dev_type_t dev_type_list[DEVICE_TYPE_LIST_SIZE];
		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			dev_type_list[i] = (dev_type_t)sio_rx_buf[14 + i];
		}
		profile_id_t profile_id_list[PROFILE_ID_LIST_SIZE];
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			profile_id_list[i] = (profile_id_t)sio_rx_buf[17 + i];
		}
		ret_val = nlme_pair_response(Status, /* nwk_enum_t Status, */
				DstPANId,                /* uint16_t DstPANId,
			                                 **/
				DstIEEEAddr,                /* uint64_t
			                                     * DstIEEEAddr, */
				sio_rx_buf[13],                         /*
			                                                 *
			                                                 *uint8_t
			                                                 *
			                                                 *
			                                                 *RecAppCapabilities,
			                                                 **/
				dev_type_list,                /* uint8_t
			                                       *
			                                       *
			                                       *RecDevTypeList[DEVICE_TYPE_LIST_SIZE],
			                                       **/
				profile_id_list,                /* uint8_t
			                                         *
			                                         *
			                                         *RecProfileIdList[PROFILE_ID_LIST_SIZE],
			                                         **/
				sio_rx_buf[14 + 3 + 7]);                 /*
			                                                  *
			                                                  *uint8_t
			                                                  *
			                                                  *
			                                                  *ProvPairingRef);
			                                                  **/
	}
	break;
#endif

	case NLME_RESET_REQUEST:
		ret_val = nlme_reset_request(sio_rx_buf[2],
				(FUNC_PTR)nlme_reset_confirm
				);
		break;

	case NLME_PAIR_REQUEST:
	{
#if (UC3)
		uint16_t DstPANId
			= ((uint16_t)sio_rx_buf[3] <<
				8) | (uint16_t)sio_rx_buf[4];
#else
		uint16_t DstPANId = (uint16_t)sio_rx_buf[3]  |
				((uint16_t)sio_rx_buf[4] << 8);
#endif
		uint64_t DstIEEEAddr;
		memcpy(&DstIEEEAddr, &sio_rx_buf[5], 8);
		dev_type_t dev_type_list[DEVICE_TYPE_LIST_SIZE];
		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			dev_type_list[i] = (dev_type_t)sio_rx_buf[14 + i];
		}
		profile_id_t profile_id_list[PROFILE_ID_LIST_SIZE];
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			profile_id_list[i] = (profile_id_t)sio_rx_buf[17 + i];
		}
		ret_val = nlme_pair_request(sio_rx_buf[2],  /* uint8_t
			                                     * LogicalChannel,
			                                     **/
				DstPANId,                /* uint16_t DstPANId,
			                                 **/
				DstIEEEAddr,                /* uint64_t
			                                     * DstIEEEAddr, */
				sio_rx_buf[13],             /* uint8_t
			                                     *
			                                     *
			                                     *OrgAppCapabilities,
			                                     **/
				dev_type_list,                /* uint8_t
			                                       *
			                                       *
			                                       *OrgDevTypeList[DEVICE_TYPE_LIST_SIZE],
			                                       **/
				profile_id_list,                /* uint8_t
			                                         *
			                                         *
			                                         *OrgProfileIdList[PROFILE_ID_LIST_SIZE],
			                                         **/
				sio_rx_buf[14 + 3 + 7],            /* uint8_t
			                                            *
			                                            *
			                                            *KeyExTransferCount);
			                                            **/
				(FUNC_PTR)nlme_pair_confirm
				);
	}

	break;

#if (NWK_GET == 1)
	case NLME_GET_REQUEST:
		ret_val = nlme_get_request((nib_attribute_t)sio_rx_buf[2],
				sio_rx_buf[3],
				(FUNC_PTR)nlme_get_confirm
				);
		break;
#endif

	case NLME_RX_ENABLE_REQUEST:
	{
		uint32_t rx_on_duration;
		MEMCPY_ENDIAN(&rx_on_duration, &sio_rx_buf[2],
				sizeof(uint32_t));
		ret_val = nlme_rx_enable_request(rx_on_duration,
				(FUNC_PTR)nlme_rx_enable_confirm
				);
	}
	break;

#if (NWK_SET == 1)
	case NLME_SET_REQUEST:
		ret_val = nlme_set_request((nib_attribute_t)sio_rx_buf[2],
				sio_rx_buf[3], &sio_rx_buf[5],
				(FUNC_PTR)nlme_set_confirm
				);
		break;
#endif
	case NLME_START_REQUEST:
		ret_val = nlme_start_request(
				(FUNC_PTR)nlme_start_confirm
				);
		break;

#if (NWK_UNPAIR_REQ_CONF == 1)
	case NLME_UNPAIR_REQUEST:
		ret_val = nlme_unpair_request(sio_rx_buf[2],
				(FUNC_PTR)nlme_unpair_confirm
				);
		break;
#endif
#if (NWK_UNPAIR_IND_RESP == 1)
	case NLME_UNPAIR_RESPONSE:
		ret_val = nlme_unpair_response(sio_rx_buf[2]);
		break;
#endif
#if ((NWK_UPDATE_KEY == 1) && (defined RF4CE_SECURITY)) || \
		(defined RF4CE_PLATFORM)
	case NLME_UPDATE_KEY_REQUEST:
		ret_val = nlme_update_key_request(sio_rx_buf[2], &sio_rx_buf[3],
				(FUNC_PTR)nlme_update_key_confirm
				);
		break;
#endif
#if (defined CHANNEL_AGILITY) || (defined RF4CE_PLATFORM)
	case NWK_CH_AGILITY_REQUEST:
		ret_val
			= nwk_ch_agility_request(
				(nwk_agility_mode_t)sio_rx_buf[2],
				(FUNC_PTR)nwk_ch_agility_confirm
				);
		break;
#endif

#ifdef PBP_ORG
	case PBP_ORG_PAIR_REQUEST:
	{
		dev_type_t OrgDevTypeList[DEVICE_TYPE_LIST_SIZE];
		profile_id_t OrgProfileIdList[PROFILE_ID_LIST_SIZE];
		profile_id_t DiscProfileIdList[PROFILE_ID_LIST_SIZE];

		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			OrgDevTypeList[i] = (dev_type_t)sio_rx_buf[3 + i];
		}
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			OrgProfileIdList[i] = (profile_id_t)sio_rx_buf[6 + i];
		}
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			DiscProfileIdList[i]
				= (profile_id_t)sio_rx_buf[13 + 2 +
					i];
		}

		ret_val = pbp_org_pair_request(sio_rx_buf[2], /*
			                                       *
			                                       *
			                                       *OrgAppCapabilities
			                                       **/
				OrgDevTypeList,                    /*
			                                            *
			                                            *OrgDevTypeList
			                                            **/
				OrgProfileIdList,                  /*
			                                            *
			                                            *OrgProfileIdList
			                                            **/
				(dev_type_t)sio_rx_buf[13],                    /*
			                                                        *
			                                                        *
			                                                        *SearchDevType
			                                                        **/
				sio_rx_buf[14],                    /*
			                                            *
			                                            *DiscProfileIdListSize
			                                            **/
				DiscProfileIdList,              /*
			                                         *
			                                         *DiscProfileIdList,
			                                         **/
				(FUNC_PTR)pbp_org_pair_confirm
				);
	}
	break;
#endif

#ifdef PBP_REC
	case PBP_REC_PAIR_REQUEST:
	{
		dev_type_t RecDevTypeList[DEVICE_TYPE_LIST_SIZE];
		profile_id_t RecProfileIdList[PROFILE_ID_LIST_SIZE];

		for (uint8_t i = 0; i < DEVICE_TYPE_LIST_SIZE; i++) {
			RecDevTypeList[i] = (dev_type_t)sio_rx_buf[3 + i];
		}
		for (uint8_t i = 0; i < PROFILE_ID_LIST_SIZE; i++) {
			RecProfileIdList[i] = (profile_id_t)sio_rx_buf[6 + i];
		}
		ret_val = pbp_rec_pair_request(sio_rx_buf[2], /*
			                                       *
			                                       *
			                                       *RecAppCapabilities
			                                       **/
				RecDevTypeList,               /* (dev_type_t
			                                       *
			                                       ***)&sio_rx_buf[3],
			                                       **/
				RecProfileIdList,              /* (profile_id_t
			                                        *
			                                        ***)&sio_rx_buf[3
			                                        * + 3], */
				(FUNC_PTR)pbp_rec_pair_confirm
				);
	}
	break;
#endif

#ifdef ZRC_PROFILE
#if ((!defined RF4CE_TARGET) || (defined RF4CE_PLATFORM))
	case ZRC_CMD_REQUEST:
		ret_val = zrc_cmd_request(sio_rx_buf[2], /* pair_ref */
				(uint16_t)sio_rx_buf[3] |
				((uint16_t)sio_rx_buf[4] << 8),                                 /*uint16_t
		                                                                                 *
		                                                                                 *
		                                                                                 *VendorId,*/
				(zrc_cmd_code_t)sio_rx_buf[5],        /*
		                                                       *
		                                                       *
		                                                       *zrc_cmd_code_t
		                                                       *
		                                                       *
		                                                       *cerc_cmd_code,
		                                                       **/
				sio_rx_buf[7],       /* uint8_t cmd_length,*/
				&sio_rx_buf[8],       /*uint8_t *cmd_payload, */
				sio_rx_buf[6],      /* uint8_t tx_options */
				(FUNC_PTR)zrc_cmd_confirm
				);
		break;
#endif
#endif  /* #ifdef ZRC_PROFILE */

#ifdef ZRC_CMD_DISCOVERY
	case ZRC_CMD_DISCOVERY_REQUEST:
		ret_val = zrc_cmd_disc_request(sio_rx_buf[2], /* PairingRef */
				(FUNC_PTR)zrc_cmd_disc_confirm
				);
		break;
#endif

#ifdef ZRC_CMD_DISCOVERY
	case ZRC_CMD_DISCOVERY_RESPONSE:
		ret_val = zrc_cmd_disc_response(sio_rx_buf[2], &sio_rx_buf[3]);
		break;
#endif

#ifdef VENDOR_DATA
	case VENDOR_DATA_REQUEST:
		ret_val = nlde_data_request(sio_rx_buf[2], /*uint8_t
		                                            * PairingRef,*/
				PROFILE_ID_ZRC,
				(uint16_t)sio_rx_buf[4] |
				((uint16_t)sio_rx_buf[5] << 8),                                   /*uint16_t
		                                                                                   *
		                                                                                   *
		                                                                                   *VendorId,*/
				sio_rx_buf[7],         /*uint8_t nsduLength,*/
				&sio_rx_buf[8],         /*uint8_t *nsdu,*/
				sio_rx_buf[6],        /*uint8_t TxOptions*/
				1,
				(FUNC_PTR)vendor_data_confirm
				);
		break;
#endif
	default:
	{
	}
		Assert("???" == 0);
		break;
	}

	if (ret_val == false) {
		Assert("Buffer is not available (Test harness)" == 0);
	}
}