uint8_t RNWK_OnPacketRx(RPHY_PacketDesc *packet) { RNWK_ShortAddrType addr; RMAC_MsgType type; uint8_t res; addr = RNWK_BUF_GET_DST_ADDR(packet->data); if (addr==RNWK_ADDR_BROADCAST || addr==RNWK_GetThisNodeAddr()) { /* it is for me :-) */ type = RMAC_GetType(packet->data, packet->dataSize); /* get the type of the message */ if (type==RMAC_MSG_TYPE_ACK && RMAC_IsExpectedACK(packet->data, packet->dataSize)) { /* it is an ACK, and the sequence number matches. Mark it with a flag and return, as no need for further processing */ packet->flags |= RPHY_PACKET_FLAGS_ACK; return ERR_OK; /* no need to process the packet further */ } else if (type==RMAC_MSG_TYPE_DATA) { /* data packet received */ if (RNWK_AppOnRxCallback!=NULL) { /* do we have a callback? */ res = RNWK_AppOnRxCallback(packet); /* call upper layer */ if (res==ERR_OK) { /* all fine, now send acknowledge back */ addr = RNWK_BUF_GET_SRC_ADDR(packet->data); /* who should receive the ack? */ RNWK_BUF_SET_DST_ADDR(packet->data, addr); /* destination address is from where we got the data */ return RMAC_SendACK(packet); /* send ack message back */ } } } else { return ERR_FAULT; /* wrong message type? */ } } return ERR_FAILED; }
uint8_t RNWK_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RNWK_ShortAddrType dstAddr, RPHY_FlagsType flags) { RNWK_ShortAddrType srcAddr; srcAddr = RNWK_GetThisNodeAddr(); RNWK_BUF_SET_SRC_ADDR(buf, srcAddr); RNWK_BUF_SET_DST_ADDR(buf, dstAddr); return RMAC_PutPayload(buf, bufSize, payloadSize+RNWK_HEADER_SIZE, flags); }
uint8_t RNWK_SendACK(RPHY_PacketDesc *rxPacket, RNWK_ShortAddrType saddr) { RNWK_ShortAddrType addr; uint8_t buf[RMAC_BUFFER_SIZE]; RPHY_PacketDesc ackPacket; ackPacket.flags = RPHY_PACKET_FLAGS_NONE; ackPacket.phyData = buf; ackPacket.phySize = sizeof(buf); /* send an ack message back: this is is of type ack with src and dst address */ addr = RNWK_BUF_GET_SRC_ADDR(rxPacket->phyData); /* who should receive the ack? */ RNWK_BUF_SET_SRC_ADDR(ackPacket.phyData, saddr); /* set source address */ RNWK_BUF_SET_DST_ADDR(ackPacket.phyData, addr); /* destination address is from where we got the data */ return RMAC_SendACK(rxPacket, &ackPacket); }