X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fip_adapter%2Fcaipserver.c;h=c162a1955ba2c5a1df49d3ece8e807bb08b9ca98;hb=8031c99214e4213a202edef846de68ad5f080fa0;hp=6a9cb97f1ac6ef5a76b9d9119ad0890bf2064e80;hpb=15369e5c03818f3cbc6f4084e729aae089ea94ef;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/ip_adapter/caipserver.c b/resource/csdk/connectivity/src/ip_adapter/caipserver.c index 6a9cb97..c162a19 100644 --- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c @@ -137,7 +137,6 @@ static CAIPErrorHandleCallback g_ipErrorHandler = NULL; static CAIPPacketReceivedCallback g_packetReceivedCallback = NULL; -static void CAHandleNetlink(); static void CAFindReadyMessage(); #if !defined(WSA_WAIT_EVENT_0) static void CASelectReturned(fd_set *readFds, int ret); @@ -646,7 +645,7 @@ void CAIPPullData() OIC_LOG(DEBUG, TAG, "OUT"); } -static int CACreateSocket(int family, uint16_t *port) +static int CACreateSocket(int family, uint16_t *port, bool isMulticast) { int socktype = SOCK_DGRAM; #ifdef SOCK_CLOEXEC @@ -680,7 +679,7 @@ static int CACreateSocket(int family, uint16_t *port) OIC_LOG_V(ERROR, TAG, "IPV6_V6ONLY failed: %s", CAIPS_GET_ERROR); } - if (*port) // only do this for multicast ports + if (isMulticast && *port) // only do this for multicast ports { #if defined(IPV6_RECVPKTINFO) if (-1 == setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof (on))) @@ -697,7 +696,7 @@ static int CACreateSocket(int family, uint16_t *port) } else { - if (*port) // only do this for multicast ports + if (isMulticast && *port) // only do this for multicast ports { int on = 1; if (-1 == setsockopt(fd, IPPROTO_IP, IP_PKTINFO, OPTVAL_T(&on), sizeof (on))) @@ -710,7 +709,7 @@ static int CACreateSocket(int family, uint16_t *port) socklen = sizeof (struct sockaddr_in); } - if (*port) // use the given port + if (isMulticast && *port) // use the given port { int on = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on), sizeof (on))) @@ -759,8 +758,13 @@ static int CACreateSocket(int family, uint16_t *port) #define CHECKFD(FD) \ if (FD > caglobals.ip.maxfd) \ caglobals.ip.maxfd = FD; -#define NEWSOCKET(FAMILY, NAME) \ - caglobals.ip.NAME.fd = CACreateSocket(FAMILY, &caglobals.ip.NAME.port); \ +#define NEWSOCKET(FAMILY, NAME, MULTICAST) \ + caglobals.ip.NAME.fd = CACreateSocket(FAMILY, &caglobals.ip.NAME.port, MULTICAST); \ + if (caglobals.ip.NAME.fd == -1) \ + { \ + caglobals.ip.NAME.port = 0; \ + caglobals.ip.NAME.fd = CACreateSocket(FAMILY, &caglobals.ip.NAME.port, MULTICAST); \ + } \ CHECKFD(caglobals.ip.NAME.fd) static void CAInitializeNetlink() @@ -885,18 +889,18 @@ CAResult_t CAIPStartServer(const ca_thread_pool_t threadPool) if (caglobals.ip.ipv6enabled) { - NEWSOCKET(AF_INET6, u6) - NEWSOCKET(AF_INET6, u6s) - NEWSOCKET(AF_INET6, m6) - NEWSOCKET(AF_INET6, m6s) + NEWSOCKET(AF_INET6, u6, false) + NEWSOCKET(AF_INET6, u6s, false) + NEWSOCKET(AF_INET6, m6, true) + NEWSOCKET(AF_INET6, m6s, true) OIC_LOG_V(INFO, TAG, "IPv6 unicast port: %u", caglobals.ip.u6.port); } if (caglobals.ip.ipv4enabled) { - NEWSOCKET(AF_INET, u4) - NEWSOCKET(AF_INET, u4s) - NEWSOCKET(AF_INET, m4) - NEWSOCKET(AF_INET, m4s) + NEWSOCKET(AF_INET, u4, false) + NEWSOCKET(AF_INET, u4s, false) + NEWSOCKET(AF_INET, m4, true) + NEWSOCKET(AF_INET, m4s, true) OIC_LOG_V(INFO, TAG, "IPv4 unicast port: %u", caglobals.ip.u4.port); }