bool CAAdapterIsSameSubnet(const char *ipAddress1, const char *ipAddress2, const char *netMask) { VERIFY_NON_NULL_RET(ipAddress1, CA_ADAPTER_UTILS_TAG, "First address", false); VERIFY_NON_NULL_RET(ipAddress2, CA_ADAPTER_UTILS_TAG, "Second address", false); VERIFY_NON_NULL_RET(netMask, CA_ADAPTER_UTILS_TAG, "netMask", false); uint8_t ipList1[IPV4_ADDR_ONE_OCTECT_LEN] = {0}; uint8_t ipList2[IPV4_ADDR_ONE_OCTECT_LEN] = {0}; uint8_t maskList[IPV4_ADDR_ONE_OCTECT_LEN] = {0}; CAResult_t ret = CA_STATUS_OK; /* Local Loopback Address */ if (0 == strncmp(ipAddress1, "127.", 4) || 0 == strncmp(ipAddress2, "127.", 4)) { return true; } uint16_t parsedPort = 0; ret = CAParseIPv4AddressInternal(ipAddress1, ipList1, sizeof(ipList1), &parsedPort); if (ret != CA_STATUS_OK) { OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "First ip address parse fail %d", ret); return false; } ret = CAParseIPv4AddressInternal(ipAddress2, ipList2, sizeof(ipList2), &parsedPort); if (ret != CA_STATUS_OK) { OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Second ip address parse fail %d", ret); return false; } ret = CAParseIPv4AddressInternal(netMask, maskList, sizeof(maskList), &parsedPort); if (ret != CA_STATUS_OK) { OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Net mask parse fail %d", ret); return false; } return ((ipList1[0] & maskList[0]) == (ipList2[0] & maskList[0])) && ((ipList1[1] & maskList[1]) == (ipList2[1] & maskList[1])) && ((ipList1[2] & maskList[2]) == (ipList2[2] & maskList[2])) && ((ipList1[3] & maskList[3]) == (ipList2[3] & maskList[3])); }
void CAIPSendData(CAEndpoint_t *endpoint, const void *data, uint32_t dataLength, bool isMulticast) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL_VOID(data, TAG, "data"); VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint"); OIC_LOG_V(DEBUG, TAG, "remoteip: %s", endpoint->addr); OIC_LOG_V(DEBUG, TAG, "port: %d", endpoint->port); uint8_t ip[4] = {0}; uint16_t parsedPort = 0; CAResult_t res = CAParseIPv4AddressInternal(endpoint->addr, ip, sizeof(ip), &parsedPort); if (res != CA_STATUS_OK) { OIC_LOG_V(ERROR, TAG, "Remote adrs parse fail %d", res); return; } IPAddress remoteIp(ip); Udp.beginPacket(remoteIp, endpoint->port); uint32_t bytesWritten = 0; while (bytesWritten < dataLength) { // get remaining bytes size_t writeCount = dataLength - bytesWritten; // write upto max ARDUINO_WIFI_BUFFERSIZE bytes writeCount = Udp.write((uint8_t *)data + bytesWritten, (writeCount > ARDUINO_IP_BUFFERSIZE ? ARDUINO_IP_BUFFERSIZE:writeCount)); if(writeCount == 0) { // write failed OIC_LOG_V(ERROR, TAG, "Failed after %u", bytesWritten); break; } bytesWritten += writeCount; } if (Udp.endPacket() == 0) { OIC_LOG(ERROR, TAG, "Failed to send"); return; } OIC_LOG(DEBUG, TAG, "OUT"); return; }
CAResult_t CAArduinoInitMulticastUdpSocket(const char *mcastAddress, uint16_t mport, uint16_t lport, int *socketID) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL(mcastAddress, TAG, "address"); VERIFY_NON_NULL(socketID, TAG, "socket"); uint8_t mcastMacAddr[] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0x00}; uint8_t ipAddr[4] = { 0 }; uint16_t parsedPort = 0; if (CAParseIPv4AddressInternal(mcastAddress, ipAddr, sizeof(ipAddr), &parsedPort) != CA_STATUS_OK) { OIC_LOG(ERROR, TAG, "parse fail"); return CA_STATUS_FAILED; } *socketID = 0; CAResult_t ret = CAArduinoGetAvailableSocket(socketID); if (ret != CA_STATUS_OK) { OIC_LOG(ERROR, TAG, "sock fail"); return ret; } //Calculate Multicast MAC address mcastMacAddr[3] = ipAddr[1] & 0x7F; mcastMacAddr[4] = ipAddr[2]; mcastMacAddr[5] = ipAddr[3]; w5500.writeSnDIPR(*socketID, (uint8_t *)ipAddr); w5500.writeSnDHAR(*socketID, mcastMacAddr); w5500.writeSnDPORT(*socketID, mport); //Create a datagram socket on which to recv/send. if (!socket(*socketID, SnMR::UDP, lport, SnMR::MULTI)) { OIC_LOG(ERROR, TAG, "sock fail"); return CA_SOCKET_OPERATION_FAILED; } OIC_LOG_V(DEBUG, TAG, "socketId:%d", *socketID); OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; }