Exemplo n.º 1
0
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]));
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}