void CAIPSendData(CAEndpoint_t *endpoint, const void *data, uint32_t datalen, bool isMulticast) { VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL"); VERIFY_NON_NULL_VOID(data, TAG, "data is NULL"); bool isSecure = (endpoint->flags & CA_SECURE) != 0; if (isMulticast) { endpoint->port = isSecure ? CA_SECURE_COAP : CA_COAP; u_arraylist_t *iflist = CAIPGetInterfaceInformation(0); if (!iflist) { OIC_LOG_V(ERROR, TAG, "get interface info failed: %s", strerror(errno)); return; } if ((endpoint->flags & CA_IPV6) && caglobals.ip.ipv6enabled) { sendMulticastData6(iflist, endpoint, data, datalen); } if ((endpoint->flags & CA_IPV4) && caglobals.ip.ipv4enabled) { sendMulticastData4(iflist, endpoint, data, datalen); } u_arraylist_destroy(iflist); } else { if (!endpoint->port) // unicast discovery { endpoint->port = isSecure ? CA_SECURE_COAP : CA_COAP; } int fd; if (caglobals.ip.ipv6enabled && (endpoint->flags & CA_IPV6)) { fd = isSecure ? caglobals.ip.u6s.fd : caglobals.ip.u6.fd; #ifndef __WITH_DTLS__ fd = caglobals.ip.u6.fd; #endif sendData(fd, endpoint, data, datalen, "unicast", "ipv6"); } if (caglobals.ip.ipv4enabled && (endpoint->flags & CA_IPV4)) { fd = isSecure ? caglobals.ip.u4s.fd : caglobals.ip.u4.fd; #ifndef __WITH_DTLS__ fd = caglobals.ip.u4.fd; #endif sendData(fd, endpoint, data, datalen, "unicast", "ipv4"); } } }
static void sendMulticastData4(const u_arraylist_t *iflist, CAEndpoint_t *endpoint, const void *data, uint32_t datalen) { VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL"); struct ip_mreqn mreq = { .imr_multiaddr = IPv4MulticastAddress, .imr_ifindex = 0 }; OICStrcpy(endpoint->addr, sizeof(endpoint->addr), IPv4_MULTICAST); int fd = caglobals.ip.u4.fd; uint32_t len = u_arraylist_length(iflist); for (uint32_t i = 0; i < len; i++) { CAInterface_t *ifitem = (CAInterface_t *)u_arraylist_get(iflist, i); if (!ifitem) { continue; } if ((ifitem->flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) { continue; } if (ifitem->family != AF_INET) { continue; } struct in_addr inaddr; inaddr.s_addr = ifitem->ipv4addr; mreq.imr_address = inaddr; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &mreq, sizeof (mreq))) { OIC_LOG_V(ERROR, TAG, "send IP_MULTICAST_IF failed: %s (using defualt)", strerror(errno)); } sendData(fd, endpoint, data, datalen, "multicast", "ipv4"); } } void CAIPSendData(CAEndpoint_t *endpoint, const void *data, uint32_t datalen, bool isMulticast) { VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL"); VERIFY_NON_NULL_VOID(data, TAG, "data is NULL"); bool isSecure = (endpoint->flags & CA_SECURE) != 0; if (isMulticast) { endpoint->port = isSecure ? CA_SECURE_COAP : CA_COAP; u_arraylist_t *iflist = CAIPGetInterfaceInformation(0); if (!iflist) { OIC_LOG_V(ERROR, TAG, "get interface info failed: %s", strerror(errno)); return; } if ((endpoint->flags & CA_IPV6) && caglobals.ip.ipv6enabled) { sendMulticastData6(iflist, endpoint, data, datalen); } if ((endpoint->flags & CA_IPV4) && caglobals.ip.ipv4enabled) { sendMulticastData4(iflist, endpoint, data, datalen); } u_arraylist_destroy(iflist); } else { if (!endpoint->port) // unicast discovery { endpoint->port = isSecure ? CA_SECURE_COAP : CA_COAP; } int fd; if (caglobals.ip.ipv6enabled && (endpoint->flags & CA_IPV6)) { fd = isSecure ? caglobals.ip.u6s.fd : caglobals.ip.u6.fd; #ifndef __WITH_DTLS__ fd = caglobals.ip.u6.fd; #endif sendData(fd, endpoint, data, datalen, "unicast", "ipv6"); } if (caglobals.ip.ipv4enabled && (endpoint->flags & CA_IPV4)) { fd = isSecure ? caglobals.ip.u4s.fd : caglobals.ip.u4.fd; #ifndef __WITH_DTLS__ fd = caglobals.ip.u4.fd; #endif sendData(fd, endpoint, data, datalen, "unicast", "ipv4"); } } }