// send smth to address 'addr', port 'port' void networkingForwardData(MacInfo_t *macInfo, uint8_t *data, uint16_t len) { // PRINTF("commForwardData, len=%u\n", len); switch (routePacket(macInfo)) { case RD_DROP: // PRINTF("RD_DROP\n"); if (IS_LOCAL(macInfo)){ INC_NETSTAT(NETSTAT_PACKETS_DROPPED_TX, EMPTY_ADDR); } else{ INC_NETSTAT(NETSTAT_PACKETS_DROPPED_RX, EMPTY_ADDR); } break; case RD_LOCAL: // PRINTF("RD_LOCAL\n"); socketInputData(macInfo, data, len); break; case RD_UNICAST: // PRINTF("RD_UNICAST\n"); // force header rebuild macInfo->macHeaderLen = 0; #if PLATFORM_SADMOTE if (!IS_LOCAL(macInfo) && isDuplicate(macInfo, data, len)) { PRINTF("not forwarding, duplicate...\n"); break; } #endif if (IS_LOCAL(macInfo)) { INC_NETSTAT(NETSTAT_PACKETS_SENT, macInfo->originalDst.shortAddr); } macSendEx(macInfo, data, len); break; case RD_BROADCAST: // PRINTF("RD_BROADCAST\n"); if (!IS_LOCAL(macInfo)) { socketInputData(macInfo, data, len); } // and forward to all intToAddr(macInfo->originalDst, OSW_ADDR_BROADCAST); // force header rebuild macInfo->macHeaderLen = 0; INC_NETSTAT(NETSTAT_PACKETS_SENT, EMPTY_ADDR); macSendEx(macInfo, data, len); break; } }
int8_t macSend(MosAddr *dst, const uint8_t *data, uint16_t length) { static MacInfo_t mi; memset(&mi, 0, sizeof(mi)); fillLocalAddress(&mi.originalSrc); if (dst) { memcpy(&mi.originalDst, dst, sizeof(MosAddr)); } else { mi.originalDst.shortAddr = MOS_ADDR_BROADCAST; } return macSendEx(&mi, data, length); }