/*************************************************************************//**
*****************************************************************************/
void nwkRouteDiscoveryRequest(NwkFrame_t *frame)
{
  NwkFrameHeader_t *header = &frame->header;
  NwkRouteDiscoveryTableEntry_t *entry;
  
  entry = nwkRouteDiscoveryFindEntry(nwkIb.addr, header->nwkDstAddr, header->nwkFcf.multicast);

  if (entry)
  {
    frame->state = NWK_RD_STATE_WAIT_FOR_ROUTE;
    return;
  }

  entry = nwkRouteDiscoveryNewEntry();

  if (entry)
  {
    entry->srcAddr = nwkIb.addr;
    entry->dstAddr = header->nwkDstAddr;
    entry->multicast = header->nwkFcf.multicast;
    entry->senderAddr = NWK_BROADCAST_ADDR;

    if (nwkRouteDiscoverySendRequest(entry, NWK_ROUTE_DISCOVERY_BEST_LINK_QUALITY))
    {
      frame->state = NWK_RD_STATE_WAIT_FOR_ROUTE;
      return;
    }
  }

  nwkTxConfirm(frame, NWK_NO_ROUTE_STATUS);
}
Beispiel #2
0
/*************************************************************************//**
*****************************************************************************/
static void nwkTxAckWaitTimerHandler(SYS_Timer_t *timer)
{
	NwkFrame_t *frame = NULL;
	bool restart = false;

	while (NULL != (frame = nwkFrameNext(frame))) {
		if (NWK_TX_STATE_WAIT_ACK == frame->state) {
			restart = true;

			if (0 == --frame->tx.timeout) {
				nwkTxConfirm(frame, NWK_NO_ACK_STATUS);
			}
		}
	}

	if (restart) {
		SYS_TimerStart(timer);
	}
}
/*************************************************************************//**
*****************************************************************************/
static void nwkRouteDiscoveryDone(NwkRouteDiscoveryTableEntry_t *entry, bool status)
{
  NwkFrame_t *frame = NULL;

  while (NULL != (frame = nwkFrameNext(frame)))
  {
    if (NWK_RD_STATE_WAIT_FOR_ROUTE != frame->state)
      continue;

    if (entry->dstAddr != frame->header.nwkDstAddr ||
        entry->multicast != frame->header.nwkFcf.multicast)
      continue;

    if (status)
      nwkTxFrame(frame);
    else
      nwkTxConfirm(frame, NWK_NO_ROUTE_STATUS);
  }
}