bool platform_initialize() { uint32_t lastIp; nabto_stamp_t timeout; // Configure TCP/IP stack stuff AppConfig.Flags.bIsDHCPEnabled = true; AppConfig.Flags.bInConfigMode = true; AppConfig.MyIPAddr.Val = MY_DEFAULT_IP_ADDR_BYTE1 | MY_DEFAULT_IP_ADDR_BYTE2 << 8ul | MY_DEFAULT_IP_ADDR_BYTE3 << 16ul | MY_DEFAULT_IP_ADDR_BYTE4 << 24ul; AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val; AppConfig.MyMask.Val = MY_DEFAULT_MASK_BYTE1 | MY_DEFAULT_MASK_BYTE2 << 8ul | MY_DEFAULT_MASK_BYTE3 << 16ul | MY_DEFAULT_MASK_BYTE4 << 24ul; AppConfig.DefaultMask.Val = AppConfig.MyMask.Val; AppConfig.MyGateway.Val = MY_DEFAULT_GATE_BYTE1 | MY_DEFAULT_GATE_BYTE2 << 8ul | MY_DEFAULT_GATE_BYTE3 << 16ul | MY_DEFAULT_GATE_BYTE4 << 24ul; AppConfig.PrimaryDNSServer.Val = MY_DEFAULT_PRIMARY_DNS_BYTE1 | MY_DEFAULT_PRIMARY_DNS_BYTE2 << 8ul | MY_DEFAULT_PRIMARY_DNS_BYTE3 << 16ul | MY_DEFAULT_PRIMARY_DNS_BYTE4 << 24ul; AppConfig.SecondaryDNSServer.Val = MY_DEFAULT_SECONDARY_DNS_BYTE1 | MY_DEFAULT_SECONDARY_DNS_BYTE2 << 8ul | MY_DEFAULT_SECONDARY_DNS_BYTE3 << 16ul | MY_DEFAULT_SECONDARY_DNS_BYTE4 << 24ul; TickInit(); StackInit(); unabto_microchip_arp_reset(); // Wait for dhcp. lastIp = AppConfig.MyIPAddr.Val; #if ENABLE_DHCP_BUG_WORKAROUND == 1 nabtoSetFutureStamp(&timeout, 5000); #endif NABTO_LOG_DEBUG(("Acquiring IP from DHCP server...")); while (lastIp == AppConfig.MyIPAddr.Val) { StackTask(); #if ENABLE_DHCP_BUG_WORKAROUND == 1 if (nabtoIsStampPassed(&timeout)) { Reset(); } #endif } READ_U32(lastIp, &AppConfig.MyIPAddr.Val); NABTO_LOG_DEBUG(("Got IP from DHCP server: "PRIip, MAKE_IP_PRINTABLE(lastIp))); return true; }
ssize_t microchip_udp_read(UDP_SOCKET socket, uint8_t* buf, size_t len, uint32_t* addr, uint16_t* port) { ssize_t rlen; #if NABTO_LOG_CHECK(NABTO_LOG_SEVERITY_TRACE) UDP_SOCKET_INFO* debug; uint32_t sourceIp; #endif if (UDPIsGetReady(socket)) { #if NABTO_LOG_CHECK(NABTO_LOG_SEVERITY_TRACE) debug = &UDPSocketInfo[socket]; READ_U32(sourceIp, &debug->remote.remoteNode.IPAddr.Val); #endif unabto_microchip_arp_add_resolved(&(UDPSocketInfo[socket].remote.remoteNode)); // *addr = ntohl(UDPSocketInfo[socket].remote.remoteNode.IPAddr.Val); WRITE_U32(addr, UDPSocketInfo[socket].remote.remoteNode.IPAddr.Val); *port = UDPSocketInfo[socket].remotePort; rlen = (ssize_t) UDPGetArray(buf, len); NABTO_LOG_TRACE(("UDP read length: %i, %" PRIu16 " <- " PRIip ":%" PRIu16, rlen, debug->localPort, MAKE_IP_PRINTABLE(sourceIp), debug->remotePort)); NABTO_LOG_BUFFER(NABTO_LOG_SEVERITY_TRACE, ("UDP in datagram"), buf, rlen); return rlen; } return 0; }
nabto_dns_status_t nabto_dns_is_resolved(const char* id, uint32_t* v4addr) { *v4addr = resolved_v4addr; NABTO_LOG_TRACE(("dns resolved: %03d.%03d.%03d.%03d", MAKE_IP_PRINTABLE(*v4addr))); return resolve_dns_status; }
ssize_t microchip_udp_write(UDP_SOCKET socket, const uint8_t* buf, size_t len, uint32_t addr, uint16_t port) { NODE_INFO remoteInfo; ssize_t size; uint32_t addrNetworkOrder; #if NABTO_LOG_CHECK(NABTO_LOG_SEVERITY_TRACE) UDP_SOCKET_INFO* debug; uint32_t sourceIp; #endif if (addr == 0 || port == 0) { return 0; } WRITE_U32(&addrNetworkOrder, addr); if (unabto_microchip_arp_resolve(addrNetworkOrder, &remoteInfo.MACAddr)) { remoteInfo.IPAddr.Val = addrNetworkOrder; memcpy((void*) &UDPSocketInfo[socket].remote.remoteNode, (void*) &remoteInfo, sizeof (NODE_INFO)); } else { if (UDPSocketInfo[socket].remote.remoteNode.IPAddr.Val != addrNetworkOrder) { return 0; } // the arp resolve is not finished but the socket already knows // a mac address, lets just use it. } if (UDPIsPutReady(socket) >= len) { #if NABTO_LOG_CHECK(NABTO_LOG_SEVERITY_TRACE) debug = &UDPSocketInfo[socket]; READ_U32(sourceIp, &debug->remote.remoteNode.IPAddr.Val); #endif UDPSocketInfo[socket].remotePort = port; size = (ssize_t) UDPPutArray((BYTE*) buf, len); UDPFlush(); NABTO_LOG_TRACE(("UDP write length: %i, %" PRIu16 " -> " PRIip ":%" PRIu16, size, debug->localPort, MAKE_IP_PRINTABLE(sourceIp), debug->remotePort)); NABTO_LOG_BUFFER(NABTO_LOG_SEVERITY_TRACE, ("UDP out datagram"), buf, len); return size; } else { NABTO_LOG_TRACE(("Socket was not put ready %i", socket)); } return 0; }