void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
{
    OIC_LOG(DEBUG, TAG, "CANativeAddDeviceobjToList");

    if (!deviceSocket)
    {
        OIC_LOG(ERROR, TAG, "Device is null");
        return;
    }

    if (!g_deviceObjectList)
    {
        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
        return;
    }

    jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
    if (!jni_remoteAddress)
    {
        OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
        return;
    }

    const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);

    if (!CAEDRNativeIsDeviceSocketInList(env, remoteAddress))
    {
        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
        u_arraylist_add(g_deviceObjectList, gDeviceSocker);
        OIC_LOG(DEBUG, TAG, "Set Socket Object to Array");
    }
    (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
    (*env)->DeleteLocalRef(env, jni_remoteAddress);
}
Example #2
0
CAResult_t CAIPGetInterfaceInfo(u_arraylist_t **netInterfaceList)
{
    OIC_LOG(DEBUG, IP_MONITOR_TAG, "IN");

    VERIFY_NON_NULL(netInterfaceList, IP_MONITOR_TAG, "u_array_list is null");
    VERIFY_NON_NULL(g_networkMonitorContext, IP_MONITOR_TAG, "g_networkMonitorContext is null");
    VERIFY_NON_NULL(g_networkMonitorContextMutex, IP_MONITOR_TAG,
                    "g_networkMonitorContextMutex is null");

    // Get the interface and ipaddress information from cache
    ca_mutex_lock(g_networkMonitorContextMutex);
    if (!g_networkMonitorContext->netInterfaceList
        || !(u_arraylist_length(g_networkMonitorContext->netInterfaceList)))
    {
        OIC_LOG(ERROR, IP_MONITOR_TAG, "Network not enabled");
        ca_mutex_unlock(g_networkMonitorContextMutex);
        return CA_ADAPTER_NOT_ENABLED;
    }

    uint32_t list_length = u_arraylist_length(g_networkMonitorContext->netInterfaceList);
    OIC_LOG_V(DEBUG, IP_MONITOR_TAG, "CAIPGetInterfaceInfo list length [%d]",
            list_length);
    for (uint32_t list_index = 0; list_index < list_length; list_index++)
    {
        CANetInfo_t *info = (CANetInfo_t *) u_arraylist_get(
                g_networkMonitorContext->netInterfaceList, list_index);
        if (!info)
        {
            continue;
        }
        OIC_LOG_V(DEBUG, IP_MONITOR_TAG, "CAIPGetInterfaceInfo ip [%s]",
                  info->ipAddress);
        CANetInfo_t *newNetinfo = (CANetInfo_t *) OICMalloc(sizeof(CANetInfo_t));
        if (!newNetinfo)
        {
            OIC_LOG(ERROR, IP_MONITOR_TAG, "Malloc failed!");
            ca_mutex_unlock(g_networkMonitorContextMutex);
            return CA_MEMORY_ALLOC_FAILED;
        }

        *newNetinfo = *info;

        CAResult_t result = u_arraylist_add(*netInterfaceList, (void *) newNetinfo);
        if (CA_STATUS_OK != result)
        {
            OIC_LOG(ERROR, IP_MONITOR_TAG, "u_arraylist_add failed!");
            ca_mutex_unlock(g_networkMonitorContextMutex);
            return CA_STATUS_FAILED;
        }
    }

    ca_mutex_unlock(g_networkMonitorContextMutex);

    OIC_LOG(DEBUG, IP_MONITOR_TAG, "OUT");
    return CA_STATUS_OK;
}
Example #3
0
KeepAliveEntry_t *AddKeepAliveEntry(const CAEndpoint_t *endpoint, OCMode mode,
                                    int64_t *intervalInfo)
{
    if (!endpoint)
    {
        OIC_LOG(ERROR, TAG, "endpoint is NULL");
        return NULL;
    }

    if (!g_keepAliveConnectionTable)
    {
        OIC_LOG(ERROR, TAG, "KeepAlive Table was not Created.");
        return NULL;
    }

    KeepAliveEntry_t *entry = (KeepAliveEntry_t *) OICCalloc(1, sizeof(KeepAliveEntry_t));
    if (NULL == entry)
    {
        OIC_LOG(ERROR, TAG, "Failed to Calloc KeepAlive Entry");
        return NULL;
    }

    entry->mode = mode;
    entry->timeStamp = OICGetCurrentTime(TIME_IN_US);
    entry->remoteAddr.adapter = endpoint->adapter;
    entry->remoteAddr.flags = endpoint->flags;
    entry->remoteAddr.ifindex = endpoint->ifindex;
    entry->remoteAddr.port = endpoint->port;
    strncpy(entry->remoteAddr.addr, endpoint->addr, sizeof(entry->remoteAddr.addr));

    entry->intervalSize = DEFAULT_INTERVAL_COUNT;
    entry->intervalInfo = intervalInfo;
    if (!entry->intervalInfo)
    {
        entry->intervalInfo = (int64_t*) OICMalloc(entry->intervalSize * sizeof(int64_t));
        for (size_t i = 0; i < entry->intervalSize; i++)
        {
            entry->intervalInfo[i] = KEEPALIVE_MIN_INTERVAL << i;
        }
    }
    entry->interval = entry->intervalInfo[0];

    bool result = u_arraylist_add(g_keepAliveConnectionTable, (void *)entry);
    if (!result)
    {
        OIC_LOG(ERROR, TAG, "Adding node to head failed");
        OICFree(entry->intervalInfo);
        OICFree(entry);
        return NULL;
    }

    return entry;
}
static CAResult_t CAAddNetworkMonitorList(CAInterface_t *ifitem)
{
    VERIFY_NON_NULL(g_netInterfaceList, TAG, "g_netInterfaceList is NULL");
    VERIFY_NON_NULL(ifitem, TAG, "ifitem is NULL");

    ca_mutex_lock(g_networkMonitorContextMutex);
    bool result = u_arraylist_add(g_netInterfaceList, (void *) ifitem);
    if (!result)
    {
        OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
        ca_mutex_unlock(g_networkMonitorContextMutex);
        return CA_STATUS_FAILED;
    }
    ca_mutex_unlock(g_networkMonitorContextMutex);
    return CA_STATUS_OK;
}
Example #5
0
static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
                            const char *name, int family, uint32_t addr, int flags)
{
    CAInterface_t *ifitem = CANewInterfaceItem(index, name, family, addr, flags);
    if (!ifitem)
    {
        return CA_STATUS_FAILED;
    }
    bool result = u_arraylist_add(iflist, ifitem);
    if (!result)
    {
        OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
        OICFree(ifitem);
        return CA_STATUS_FAILED;
    }

    return CA_STATUS_OK;
}
CAResult_t ca_thread_pool_add_task(ca_thread_pool_t thread_pool, ca_thread_func method,
                                    void *data)
{
    OIC_LOG(DEBUG, TAG, "IN");

    if(NULL == thread_pool || NULL == method)
    {
        OIC_LOG(ERROR, TAG, "thread_pool or method was NULL");
        return CA_STATUS_INVALID_PARAM;
    }

    ca_thread_pool_callback_info_t* info = OICMalloc(sizeof(ca_thread_pool_callback_info_t));
    if(!info)
    {
        OIC_LOG(ERROR, TAG, "Failed to allocate for memory wrapper");
        return CA_MEMORY_ALLOC_FAILED;
    }

    info->func = method;
    info->data = data;

    pthread_t threadHandle;

    int result = pthread_create(&threadHandle, NULL, ca_thread_pool_pthreads_delegate, info);

    if(result != 0)
    {
        OIC_LOG_V(ERROR, TAG, "Thread start failed with error %d", result);
        return CA_STATUS_FAILED;
    }

    ca_mutex_lock(thread_pool->details->list_lock);
    CAResult_t addResult = u_arraylist_add(thread_pool->details->threads_list, (void*)threadHandle);
    ca_mutex_unlock(thread_pool->details->list_lock);

    if(addResult != CA_STATUS_OK)
    {
        OIC_LOG_V(ERROR, TAG, "Arraylist Add failed, may not be properly joined: %d", addResult);
        return addResult;
    }

    OIC_LOG(DEBUG, TAG, "OUT");
    return CA_STATUS_OK;
}
Example #7
0
static CAResult_t CAAddIdToPeerInfoList(const char *peerAddr, uint32_t port,
        const unsigned char *id, uint16_t id_length)
{
    if(NULL == peerAddr
       || NULL == id
       || 0 == port
       || 0 == id_length
       || CA_MAX_ENDPOINT_IDENTITY_LEN < id_length)
    {
        OIC_LOG(ERROR, NET_DTLS_TAG, "CAAddIdToPeerInfoList invalid parameters");
        return CA_STATUS_INVALID_PARAM;
    }

    CASecureEndpoint_t *peer = (CASecureEndpoint_t *)OICCalloc(1, sizeof (CASecureEndpoint_t));
    if (NULL == peer)
    {
        OIC_LOG(ERROR, NET_DTLS_TAG, "peerInfo malloc failed!");
        return CA_MEMORY_ALLOC_FAILED;
    }

    OICStrcpy(peer->endpoint.addr, sizeof(peer->endpoint.addr), peerAddr);
    peer->endpoint.port = port;

    memcpy(peer->identity.id, id, id_length);
    peer->identity.id_length = id_length;

    if (NULL != GetPeerInfo(&peer->endpoint))
    {
        OIC_LOG(ERROR, NET_DTLS_TAG, "CAAddIdToPeerInfoList peer already exist");
        OICFree(peer);
        return CA_STATUS_FAILED;
    }

    bool result = u_arraylist_add(g_caDtlsContext->peerInfoList, (void *)peer);
    if (!result)
    {
        OIC_LOG(ERROR, NET_DTLS_TAG, "u_arraylist_add failed!");
        OICFree(peer);
        return CA_STATUS_FAILED;
    }

    return CA_STATUS_OK;
}
Example #8
0
static CAResult_t CADtlsCacheMsg(stCACacheMessage_t *msg)
{
    OIC_LOG(DEBUG, NET_DTLS_TAG, "IN");

    if (NULL == g_caDtlsContext)
    {
        OIC_LOG(ERROR, NET_DTLS_TAG, "Dtls Context is NULL");
        return CA_STATUS_FAILED;
    }

    bool result = u_arraylist_add(g_caDtlsContext->cacheList, (void *)msg);
    if (!result)
    {
        OIC_LOG(ERROR, NET_DTLS_TAG, "u_arraylist_add failed!");
    }

    OIC_LOG(DEBUG, NET_DTLS_TAG, "OUT");
    return result;
}
Example #9
0
void CAEDRNativeAddDeviceStateToList(state_t *state)
{
    if(!state)
    {
        OIC_LOG(ERROR, TAG, "[EDR][Native] device is null");
        return;
    }

    if(!g_deviceStateList)
    {
        OIC_LOG(ERROR, TAG, "[EDR][Native] gdevice_list is null");
        return;
    }

    if(CAEDRNativeIsDeviceInList(state->address)) {
        CAEDRNativeRemoveDevice(state->address); // delete previous state for update new state
    }
    u_arraylist_add(g_deviceStateList, state);          // update new state
    OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", state->state);
}
Example #10
0
u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
{
    bool result = true;

    u_arraylist_t *iflist = u_arraylist_create();
    if (!iflist)
    {
        OIC_LOG(ERROR, TAG, "Failed to create iflist");
        return NULL;
    }

    CAInterface_t *ifitem = (CAInterface_t *)OICCalloc(1, sizeof(CAInterface_t));
    if (!ifitem)
    {
        OIC_LOG(ERROR, TAG, "Malloc failed");
        goto exit;
    }

    // Since Arduino currently only supports one interface, the next 4 lines are sufficient.
    OICStrcpy(ifitem->name, INTERFACE_NAME_MAX, "WIFI");
    ifitem->index = 1;
    ifitem->family = AF_INET;
    ifitem->flags = 0;
    CAArduinoGetInterfaceAddress(ifitem->addr, sizeof(ifitem->addr));

    result = u_arraylist_add(iflist, ifitem);
    if (!result)
    {
        OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
        goto exit;
    }

    OIC_LOG_V(DEBUG, TAG, "Added interface: %s (%d)", ifitem->name, ifitem->family);

    return iflist;

exit:
    u_arraylist_destroy(iflist);
    return NULL;
}
void CAManagerAddACData(JNIEnv *env, jstring jaddress)
{
    OIC_LOG(DEBUG, TAG, "IN-CAManagerAddACData");

    VERIFY_NON_NULL_VOID(env, TAG, "env");
    VERIFY_NON_NULL_VOID(jaddress, TAG, "jaddress");

    ca_mutex_lock(g_deviceACDataListMutex);

    if(!CAManagerIsMatchedACData(env, jaddress))
    {
        OIC_LOG(DEBUG, TAG, "ACdata will be added");
        // add CAManagerACData
        jobject gaddress = (*env)->NewGlobalRef(env, jaddress);

        CAManagerACData_t *data = CAManagerCreateACData(gaddress);
        u_arraylist_add(g_deviceACDataList, data);
    }
    ca_mutex_unlock(g_deviceACDataListMutex);

    OIC_LOG(DEBUG, TAG, "OUT-CAManagerAddACData");
}
Example #12
0
void CAEDRNativeAddDeviceStateToList(CAConnectedDeviceInfo_t *deviceInfo)
{
    if (!deviceInfo)
    {
        OIC_LOG(ERROR, TAG, "device is null");
        return;
    }

    if (!g_deviceStateList)
    {
        OIC_LOG(ERROR, TAG, "gdevice_list is null");
        return;
    }

    if (CAEDRNativeIsDeviceInList((const char*) deviceInfo->address))
    {
        // delete previous state for update new state
        CAEDRNativeRemoveDevice((const char*) deviceInfo->address);
    }
    u_arraylist_add(g_deviceStateList, deviceInfo); // update new state
    OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", deviceInfo->state);
}
Example #13
0
static void CAAcceptConnection()
{
    struct sockaddr_storage clientaddr;
    socklen_t clientlen = sizeof (struct sockaddr_in);

    int sockfd = accept(g_acceptServerFD, (struct sockaddr *)&clientaddr,
                        &clientlen);
    if (-1 != sockfd)
    {
        CATCPSessionInfo_t *svritem =
                (CATCPSessionInfo_t *) OICCalloc(1, sizeof (*svritem));
        if (!svritem)
        {
            OIC_LOG(ERROR, TAG, "Out of memory");
            close(sockfd);
            return;
        }

        svritem->fd = sockfd;
        CAConvertAddrToName((struct sockaddr_storage *)&clientaddr, clientlen,
                            (char *) &svritem->sep.endpoint.addr, &svritem->sep.endpoint.port);

        ca_mutex_lock(g_mutexObjectList);
        bool result = u_arraylist_add(caglobals.tcp.svrlist, svritem);
        if (!result)
        {
            OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
            close(sockfd);
            OICFree(svritem);
            ca_mutex_unlock(g_mutexObjectList);
            return;
        }
        ca_mutex_unlock(g_mutexObjectList);

        CHECKFD(sockfd);
    }
}
Example #14
0
CAResult_t CAIPGetInterfaceInfo(u_arraylist_t **netInterfaceList)
{
    CANetInfo_t *netInfo = (CANetInfo_t *)OICCalloc(1, sizeof(CANetInfo_t));
    if (!netInfo)
    {
        OIC_LOG(ERROR, TAG, "Malloc failed");
        return CA_STATUS_FAILED;
    }

    CAArduinoGetInterfaceAddress(netInfo->ipAddress, CA_IPADDR_SIZE);

    CAIPGetSubnetMask(netInfo->subnetMask, CA_IPADDR_SIZE);

    // set interface name
    strncpy(netInfo->interfaceName, "ETH", strlen(netInfo->interfaceName));

    CAResult_t result = u_arraylist_add(*netInterfaceList, (void *)netInfo);
    if (CA_STATUS_OK != result)
    {
        OIC_LOG(ERROR, TAG, "u_arraylist_add failed");
        return result;
    }
    return CA_STATUS_OK;
}
Example #15
0
void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
{
    OIC_LOG(DEBUG, TAG, "[EDR][Native] CANativeAddDeviceobjToList");

    if(!deviceSocket)
    {
        OIC_LOG(ERROR, TAG, "[EDR][Native] Device is null");
        return;
    }

    if(!g_deviceObjectList)
    {
        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
        return;
    }

    jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
    if(!jni_remoteAddress)
    {
        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_remoteAddress is null");
        return;
    }

    u_mutex_lock(g_mutexSocketListManager);

    const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);

    if(!CAEDRNativeIsDeviceSocketInList(env, remoteAddress))
    {
        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
        u_arraylist_add(g_deviceObjectList, gDeviceSocker);
        OIC_LOG(DEBUG, TAG, "Set Socket Object to Array");
    }

    u_mutex_unlock(g_mutexSocketListManager);
}
u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
{
    if (desiredIndex < 0)
    {
        OIC_LOG_V(ERROR, TAG, "invalid index : %d", desiredIndex);
        return NULL;
    }

    u_arraylist_t *iflist = u_arraylist_create();
    if (!iflist)
    {
        OIC_LOG_V(ERROR, TAG, "Failed to create iflist: %s", strerror(errno));
        return NULL;
    }

    struct ifaddrs *ifp = NULL;
    if (-1 == getifaddrs(&ifp))
    {
        OIC_LOG_V(ERROR, TAG, "Failed to get ifaddrs: %s", strerror(errno));
        u_arraylist_destroy(iflist);
        return NULL;
    }
    OIC_LOG(DEBUG, TAG, "Got ifaddrs");

    struct ifaddrs *ifa = NULL;
    for (ifa = ifp; ifa; ifa = ifa->ifa_next)
    {
        if (!ifa->ifa_addr)
        {
            continue;
        }
        int family = ifa->ifa_addr->sa_family;
        if ((ifa->ifa_flags & IFF_LOOPBACK) || (AF_INET != family && AF_INET6 != family))
        {
            continue;
        }

        int ifindex = if_nametoindex(ifa->ifa_name);
        if (desiredIndex && (ifindex != desiredIndex))
        {
            continue;
        }

        int length = u_arraylist_length(iflist);
        int already = false;
        for (int i = length-1; i >= 0; i--)
        {
            CAInterface_t *ifitem = (CAInterface_t *)u_arraylist_get(iflist, i);

            if (ifitem
                && (int)ifitem->index == ifindex
                && ifitem->family == (uint16_t)family)
            {
                already = true;
                break;
            }
        }
        if (already)
        {
            continue;
        }

        CAInterface_t *ifitem = (CAInterface_t *)OICCalloc(1, sizeof(CAInterface_t));
        if (!ifitem)
        {
            OIC_LOG(ERROR, TAG, "Malloc failed");
            goto exit;
        }

        OICStrcpy(ifitem->name, INTERFACE_NAME_MAX, ifa->ifa_name);
        ifitem->index = ifindex;
        ifitem->family = family;
        ifitem->ipv4addr = ((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr.s_addr;
        ifitem->flags = ifa->ifa_flags;

        bool result = u_arraylist_add(iflist, ifitem);
        if (!result)
        {
            OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
            goto exit;
        }

        OIC_LOG_V(DEBUG, TAG, "Added interface: %s (%d)", ifitem->name, family);
    }

    freeifaddrs(ifp);
    return iflist;

exit:
    freeifaddrs(ifp);
    u_arraylist_destroy(iflist);
    return NULL;
}
Example #17
0
CAResult_t CAAddNetworkType(CATransportAdapter_t transportType)
{
    OIC_LOG(DEBUG, TAG, "IN");
    if (NULL == g_selectedNetworkList)
    {
        OIC_LOG(DEBUG, TAG, "Create network list");

        g_selectedNetworkList = u_arraylist_create();

        if (NULL == g_selectedNetworkList)
        {
            return CA_MEMORY_ALLOC_FAILED;
        }
    }
    CAResult_t res = CA_STATUS_OK;
    switch (transportType)
    {
        case CA_ADAPTER_IP:
#ifndef IP_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(IP) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* IP_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(IP)");
            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_IP))
            {
                goto exit;
            }
            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_IP);
            break;

        case CA_ADAPTER_RFCOMM_BTEDR:
#ifndef EDR_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* EDR_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_RFCOMM))
            {
                goto exit;
            }
            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_RFCOMM);
            break;

        case CA_ADAPTER_GATT_BTLE:
#ifndef LE_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* LE_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(LE)");
            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_GATT))
            {
                goto exit;
            }
            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_GATT);
            break;
        default:
            break;
    }

    if (CA_STATUS_OK != res)
    {
        OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
        return res;
    }
    // start selected interface adapter
    res = CAStartAdapter(transportType);
    OIC_LOG(DEBUG, TAG, "OUT");
    return res;

exit:
    OIC_LOG(DEBUG, TAG, "This adapter is already enabled");
    return CA_STATUS_OK;
}
Example #18
0
static bool CACheckIsInterfaceInfoChanged(const CANetInfo_t *info)
{
    VERIFY_NON_NULL_RET(info, IP_MONITOR_TAG, "info is null", false);

    ca_mutex_lock(g_networkMonitorContextMutex);

    uint32_t list_length = u_arraylist_length(g_networkMonitorContext->netInterfaceList);
    for (uint32_t list_index = 0; list_index < list_length; list_index++)
    {
        CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(
                               g_networkMonitorContext->netInterfaceList, list_index);
        if (!netInfo)
        {
            continue;
        }
        if (strncmp(netInfo->interfaceName, info->interfaceName, strlen(info->interfaceName)) == 0)
        {
            if (strncmp(netInfo->ipAddress, info->ipAddress, strlen(info->ipAddress)) == 0)
            {
                ca_mutex_unlock(g_networkMonitorContextMutex);
                return false;
            }
            else
            {
                OIC_LOG(DEBUG, IP_MONITOR_TAG, "Network interface info changed");
                if (u_arraylist_remove(g_networkMonitorContext->netInterfaceList, list_index))
                {
                    if (g_networkMonitorContext->networkChangeCb)
                    {
                        g_networkMonitorContext->networkChangeCb(netInfo->ipAddress,
                                                                 CA_INTERFACE_DOWN);
                    }
                    OICFree(netInfo);
                }
                else
                {
                    OIC_LOG(ERROR, IP_MONITOR_TAG, "u_arraylist_remove failed");
                }
                break;
            }
        }
    }

    CANetInfo_t *newNetInfo = (CANetInfo_t *) OICMalloc(sizeof(CANetInfo_t));
    if (!newNetInfo)
    {
        OIC_LOG(ERROR, IP_MONITOR_TAG, "newNetInfo malloc failed");
        ca_mutex_unlock(g_networkMonitorContextMutex);
        return false;
    }
    *newNetInfo = *info;

    OIC_LOG(DEBUG, IP_MONITOR_TAG, "New Interface found");

    CAResult_t result = u_arraylist_add(g_networkMonitorContext->netInterfaceList,
                                        (void *) newNetInfo);
    if (CA_STATUS_OK != result)
    {
        OIC_LOG(ERROR, IP_MONITOR_TAG, "u_arraylist_add failed!");
        OICFree(newNetInfo);
        ca_mutex_unlock(g_networkMonitorContextMutex);
        return false;
    }
    ca_mutex_unlock(g_networkMonitorContextMutex);

    /*Callback will be unset only at the time of termination. By that time, all the threads will be
      stopped gracefully. This callback is properly protected*/
    if (g_networkMonitorContext->networkChangeCb)
    {
        g_networkMonitorContext->networkChangeCb(newNetInfo->ipAddress, CA_INTERFACE_UP);
    }

    return true;
}
Example #19
0
static CAResult_t CAIPUpdateInterfaceInformation(u_arraylist_t **netInterfaceList)
{
    OIC_LOG(DEBUG, IP_MONITOR_TAG, "IN");

    VERIFY_NON_NULL(netInterfaceList, IP_MONITOR_TAG, "netInterfaceList is null");

    /* Get a socket handle. */
    int sck = -1;
#ifdef SOCK_CLOEXEC
    sck = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP);
#endif

    if ( -1 == sck)
    {
        sck=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    }

    if (sck < 0)
    {
        OIC_LOG(ERROR, IP_MONITOR_TAG, "Error in socket creation");
        return CA_STATUS_FAILED;
    }

    char buf[MAX_INTERFACE_INFO_LENGTH] = { 0 };
    struct ifconf ifc;

    /* Query available interfaces. */
    ifc.ifc_len = MAX_INTERFACE_INFO_LENGTH;
    ifc.ifc_buf = buf;

    if (ioctl(sck, SIOCGIFCONF, &ifc) < 0)
    {
        close(sck);
        OIC_LOG(ERROR, IP_MONITOR_TAG, "Failed to get interface info");
        return CA_STATUS_FAILED;
    }

    /* Iterate through the list of interfaces. */
    struct ifreq* ifr = ifc.ifc_req;
    int32_t interfaces = ifc.ifc_len / sizeof(struct ifreq);

    OIC_LOG_V(DEBUG, IP_MONITOR_TAG, "CAIPUpdateInterfaceInformation : %d", interfaces);

    if(0 == interfaces)
    {
        OIC_LOG(ERROR, IP_MONITOR_TAG, "no interfaces");
        return CA_STATUS_FAILED;
    }

    for (int32_t i = 0; i < interfaces; i++)
    {
        struct ifreq temp_ifr = { 0 };
        struct ifreq* item = &ifr[i];

        char interfaceAddress[CA_IPADDR_SIZE] = { 0 };
        char interfaceSubnetMask[CA_IPADDR_SIZE] = { 0 };
        socklen_t len = sizeof(struct sockaddr_in);

        OICStrcpy(temp_ifr.ifr_name, sizeof(temp_ifr.ifr_name), item->ifr_name);

        if (ioctl(sck, SIOCGIFFLAGS, &temp_ifr))
        {
            OIC_LOG(ERROR, IP_MONITOR_TAG,
                    "CAIPUpdateInterfaceInformation, SIOCGIFFLAGS Failed");
            close(sck);
            return CA_STATUS_FAILED;
        }

        if ((temp_ifr.ifr_flags & IFF_LOOPBACK)
            || !(temp_ifr.ifr_flags & IFF_UP) || !(temp_ifr.ifr_flags & IFF_RUNNING))
        {
            OIC_LOG_V(ERROR, IP_MONITOR_TAG,
                      "interface is not up or not running or loopback = %x", temp_ifr.ifr_flags);
            continue;
        }

        if (AF_INET != ((struct sockaddr_in*) &item->ifr_addr)->sin_family)
        {
            continue;
        }

        //get the interface ip address
        if (0 != getnameinfo(&item->ifr_addr, len, interfaceAddress, sizeof(interfaceAddress),
                             NULL, 0, NI_NUMERICHOST))
        {
            OIC_LOG_V(ERROR, IP_MONITOR_TAG, "Failed to get IPAddress, Error code: %s",
                    strerror(errno));
            close(sck);
            return CA_STATUS_FAILED;
        }

        if (ioctl((int) sck, SIOCGIFNETMASK, item) < 0)
        {
            OIC_LOG(ERROR, IP_MONITOR_TAG,
                    "CAIPUpdateInterfaceInformation, SIOCGIFNETMASK Failed");
            close(sck);
            return CA_STATUS_FAILED;
        }

        // get the interface subnet mask
        if (0 != getnameinfo(&item->ifr_netmask, len, interfaceSubnetMask,
                             sizeof(interfaceSubnetMask), NULL, 0, NI_NUMERICHOST))
        {
            OIC_LOG_V(ERROR, IP_MONITOR_TAG, "Failed to get subnet mask, Error code: %s",
                    strerror(errno));
            close(sck);
            return CA_STATUS_FAILED;
        }

        CANetInfo_t *netInfo = (CANetInfo_t *) OICCalloc(1, sizeof(CANetInfo_t));
        if (!netInfo)
        {
            OIC_LOG(ERROR, IP_MONITOR_TAG, "Malloc failed");
            close(sck);
            return CA_MEMORY_ALLOC_FAILED;
        }

        // set interface name
        OICStrcpy(netInfo->interfaceName, sizeof(netInfo->interfaceName), item->ifr_name);

        // set local ip address
        OICStrcpy(netInfo->ipAddress, sizeof(netInfo->ipAddress), interfaceAddress);

        // set subnet mask
        OICStrcpy(netInfo->subnetMask, sizeof(netInfo->subnetMask), interfaceSubnetMask);

        CAResult_t result = u_arraylist_add(*netInterfaceList, (void *) netInfo);
        if (CA_STATUS_OK != result)
        {
            OIC_LOG(ERROR, IP_MONITOR_TAG, "u_arraylist_add failed!Thread exiting.");
            close(sck);
            return CA_STATUS_FAILED;
        }

        OIC_LOG_V(DEBUG, IP_MONITOR_TAG, "ipAddress : %s, interfaceName : %s, subnetmask : %s",
                netInfo->ipAddress, netInfo->interfaceName, netInfo->subnetMask);
    }

    close(sck);
    OIC_LOG(DEBUG, IP_MONITOR_TAG, "OUT");
    return CA_STATUS_OK;
}
Example #20
0
static void CAReceiveHandler(void *data)
{
    OIC_LOG(DEBUG, IP_SERVER_TAG, "IN");

    fd_set readFds;
    int maxSd = 0;
    struct timeval timeout;
    char recvBuffer[COAP_MAX_PDU_SIZE] = { 0 };

    while (true != g_packetHandlerStopFlag)
    {
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        FD_ZERO(&readFds);

        ca_mutex_lock(g_mutexServerInfoList);
        uint32_t listIndex = 0;
        uint32_t listLength = u_arraylist_length(g_serverInfoList);

        u_arraylist_t *tempServerInfoList = u_arraylist_create();
        if (!tempServerInfoList)
        {
            OIC_LOG(ERROR, IP_SERVER_TAG, "u_arraylist_create failed");
            ca_mutex_unlock(g_mutexServerInfoList);
            return;
        }

        for (listIndex = 0; listIndex < listLength; listIndex++)
        {
            CAServerInfo_t *info = (CAServerInfo_t *) u_arraylist_get(g_serverInfoList, listIndex);
            if (!info)
            {
                listIndex++;
                continue;
            }

            int sd = info->socketFd;
            //if valid socket descriptor then add to read list
            if (sd > 0)
            {
                FD_SET(sd, &readFds);
            }

            //highest file descriptor number, need it for the select function
            if (sd > maxSd)
            {
                maxSd = sd;
            }

            CAServerInfo_t *newInfo = (CAServerInfo_t *) OICMalloc(sizeof(CAServerInfo_t));
            if (!newInfo)
            {
                OIC_LOG(ERROR, IP_SERVER_TAG, "Malloc failed");
                CAClearServerInfoList(tempServerInfoList);
                ca_mutex_unlock(g_mutexServerInfoList);
                return;
            }

            *newInfo = *info;

            CAResult_t result = u_arraylist_add(tempServerInfoList, (void *) newInfo);
            if (CA_STATUS_OK != result)
            {
                OIC_LOG(ERROR, IP_SERVER_TAG, "u_arraylist_add failed!Thread exit");
                CAClearServerInfoList(tempServerInfoList);
                ca_mutex_unlock(g_mutexServerInfoList);
                return;
            }
        }

        ca_mutex_unlock(g_mutexServerInfoList);

        int ret = select(maxSd + 1, &readFds, NULL, NULL, &timeout);
        if (g_packetHandlerStopFlag)
        {
            OIC_LOG_V(DEBUG, IP_SERVER_TAG,
                      "Packet receiver handler Stop request received. Thread exited");
            CAClearServerInfoList(tempServerInfoList);
            break;
        }
        if (ret < 0)
        {
            OIC_LOG_V(FATAL, IP_SERVER_TAG, "select returned error %s", strerror(errno));
            CAClearServerInfoList(tempServerInfoList);
            continue;
        }

        listLength = u_arraylist_length(tempServerInfoList);
        for (listIndex = 0; listIndex < listLength; listIndex++)
        {
            CAServerInfo_t *info = (CAServerInfo_t *) u_arraylist_get(tempServerInfoList,
                                                                      listIndex);
            if (!info)
            {
                continue;
            }

            int sd = info->socketFd;
            if (FD_ISSET(sd , &readFds))
            {
                OIC_LOG_V(ERROR, IP_SERVER_TAG,
                          "data Received server information ip %s, port %d socket %d",
                          info->endpoint.addr, info->endpoint.port, sd);
                memset(recvBuffer, 0, sizeof(recvBuffer));

                struct sockaddr_in srcSockAddress = { 0 };
                socklen_t srcAddressLen = sizeof(srcSockAddress);

                //Reading from socket
                ssize_t recvLen = recvfrom(sd, recvBuffer, sizeof(recvBuffer), 0,
                                           (struct sockaddr *) &srcSockAddress, &srcAddressLen);
                if (-1 == recvLen)
                {
                    OIC_LOG_V(ERROR, IP_SERVER_TAG, "Recvfrom failed %s", strerror(errno));
                    continue;
                }
                else if (0 == recvLen)
                {
                    OIC_LOG_V(ERROR, IP_SERVER_TAG, "Server socket shutdown sock fd[%d]", sd);
                    ca_mutex_lock(g_mutexAdapterServerContext);
                    // Notify upper layer this exception
                    if (g_adapterIPServerContext->exceptionCallback)
                    {
                        // need to make proper exception callback.
                        //g_adapterIPServerContext->exceptionCallback(ctx->type);
                    }
                    ca_mutex_unlock(g_mutexAdapterServerContext);
                }

                char srcIPAddress[CA_IPADDR_SIZE] = { 0 };
                if (!inet_ntop(AF_INET, &srcSockAddress.sin_addr.s_addr, srcIPAddress,
                               sizeof(srcIPAddress)))
                {

                    OIC_LOG(ERROR, IP_SERVER_TAG, "inet_ntop is failed!");
                    continue;
                }

                uint16_t srcPort = ntohs(srcSockAddress.sin_port);

                OIC_LOG_V(DEBUG, IP_SERVER_TAG, "Received packet from %s:%d len %d",
                          srcIPAddress, srcPort, recvLen);

                char *netMask = NULL;
                if (CA_STATUS_OK != CAIPGetInterfaceSubnetMask(info->ifAddr, &netMask))
                {
                    OIC_LOG(ERROR, IP_SERVER_TAG, "Failed to get IP subnet");
                    continue;
                }

                if (!CAAdapterIsSameSubnet(info->ifAddr, srcIPAddress, netMask))
                {
                    OIC_LOG(DEBUG, IP_SERVER_TAG,
                            "Packet received from different subnet, Ignore!");
                    OICFree(netMask);
                    continue;
                }
                OICFree(netMask);

                CAEndpoint_t ep;
                strncpy(ep.addr, srcIPAddress, MAX_ADDR_STR_SIZE_CA);
                ep.port = srcPort;
                ep.flags = (CATransportFlags_t)CA_IPV4 | CA_IPV6;
                ep.adapter = CA_ADAPTER_IP;

                if (info->endpoint.flags & CA_SECURE)
                {
#ifdef __WITH_DTLS__
                    ep.flags |= CA_SECURE;
                    (void)CAAdapterNetDtlsDecrypt(&ep, (uint8_t *)recvBuffer, recvLen);
                    OIC_LOG_V(DEBUG, IP_SERVER_TAG,
                              "CAAdapterNetDtlsDecrypt returns [%d]", ret);
#endif
                }
                else //both multicast and unicast
                {
                    ca_mutex_lock(g_mutexAdapterServerContext);

                    if (g_adapterIPServerContext->packetReceivedCallback)
                    {
                        g_adapterIPServerContext->packetReceivedCallback(&ep,
                                                          recvBuffer, recvLen);
                    }

                    ca_mutex_unlock(g_mutexAdapterServerContext);
                }
            }
        }
        CAClearServerInfoList(tempServerInfoList);
    }
    OIC_LOG(DEBUG, IP_SERVER_TAG, "OUT");
}
CAResult_t CAAddNetworkType(CAConnectivityType_t connectivityType)
{
    OIC_LOG(DEBUG, TAG, "IN");
    if (g_selectedNetworkList == NULL)
    {
        g_selectedNetworkList = u_arraylist_create();

        if (NULL == g_selectedNetworkList)
        {
            return CA_MEMORY_ALLOC_FAILED;
        }
    }
    CAResult_t res = CA_STATUS_OK;
    switch (connectivityType)
    {
        case CA_ETHERNET:
        {

#ifndef ETHERNET_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(ETHERNET) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* ETHERNET_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(ETHERNET)");
            if (!u_arraylist_contains(g_selectedNetworkList, &NETWORK_ETHERNET))
            {
                res = u_arraylist_add(g_selectedNetworkList, &NETWORK_ETHERNET);
                if (CA_STATUS_OK != res)
                {
                    OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
                    return res;
                }
            }
        }
        break;

        case CA_WIFI:
        {

#ifndef WIFI_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(WIFI) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* WIFI_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(WIFI)");
            if (!u_arraylist_contains(g_selectedNetworkList, &NETWORK_WIFI))
            {
                res = u_arraylist_add(g_selectedNetworkList, &NETWORK_WIFI);
                if (CA_STATUS_OK != res)
                {
                    OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
                    return res;
                }
            }
        }
        break;

        case CA_EDR:
        {

#ifndef EDR_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* EDR_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
            if (!u_arraylist_contains(g_selectedNetworkList, &NETWORK_EDR))
            {
                res = u_arraylist_add(g_selectedNetworkList, &NETWORK_EDR);
                if (CA_STATUS_OK != res)
                {
                    OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
                    return res;
                }
            }
        }
        break;

        case CA_LE:
        {

#ifndef LE_ADAPTER
            OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
            return CA_NOT_SUPPORTED;
#endif /* LE_ADAPTER */

            OIC_LOG(DEBUG, TAG, "Add network type(LE)");
            if (!u_arraylist_contains(g_selectedNetworkList, &NETWORK_LE))
            {
                res = u_arraylist_add(g_selectedNetworkList, &NETWORK_LE);
                if (CA_STATUS_OK != res)
                {
                    OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
                    return res;
                }
            }
        }
        break;

    }

    // start selected interface adapter
    res = CAStartAdapter((CAConnectivityType_t)connectivityType);
    OIC_LOG(DEBUG, TAG, "OUT");
    return res;
}