From 78abb258847accb3d893863e486a16657533fbf0 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 28 Aug 2017 22:36:25 -0500 Subject: [PATCH 1/7] Add osiSockOptMcastLoop_t and osiSockTest --- src/ca/client/udpiiu.cpp | 2 +- src/ioc/rsrv/caservertask.c | 2 +- src/libCom/osi/os/Darwin/osdSock.h | 1 + src/libCom/osi/os/Linux/osdSock.h | 1 + src/libCom/osi/os/RTEMS/osdSock.h | 1 + src/libCom/osi/os/WIN32/osdSock.h | 1 + src/libCom/osi/os/cygwin32/osdSock.h | 1 + src/libCom/osi/os/freebsd/osdSock.h | 1 + src/libCom/osi/os/iOS/osdSock.h | 1 + src/libCom/osi/os/solaris/osdSock.h | 1 + src/libCom/osi/os/vxWorks/osdSock.h | 1 + src/libCom/test/Makefile | 6 ++- src/libCom/test/epicsRunLibComTests.c | 2 + src/libCom/test/osiSockTest.c | 59 +++++++++++++++++++++++++++ 14 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/libCom/test/osiSockTest.c diff --git a/src/ca/client/udpiiu.cpp b/src/ca/client/udpiiu.cpp index beae07560..ccb2556e8 100644 --- a/src/ca/client/udpiiu.cpp +++ b/src/ca/client/udpiiu.cpp @@ -165,7 +165,7 @@ udpiiu::udpiiu ( #ifdef IP_ADD_MEMBERSHIP { - int flag = 1; + osiSockOptMcastLoop_t flag = 1; if ( setsockopt ( this->sock, IPPROTO_IP, IP_MULTICAST_LOOP, (char *) &flag, sizeof ( flag ) ) == -1 ) { char sockErrBuf[64]; diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 50bc650c2..fda442168 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -308,7 +308,7 @@ void rsrv_build_addr_lists(void) } #ifdef IP_ADD_MEMBERSHIP { - int flag = 1; + osiSockOptMcastLoop_t flag = 1; if (setsockopt(beaconSocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&flag, sizeof(flag))<0) { char sockErrBuf[64]; diff --git a/src/libCom/osi/os/Darwin/osdSock.h b/src/libCom/osi/os/Darwin/osdSock.h index 1d4556eee..e7c344062 100644 --- a/src/libCom/osi/os/Darwin/osdSock.h +++ b/src/libCom/osi/os/Darwin/osdSock.h @@ -31,6 +31,7 @@ typedef int SOCKET; #define socket_ioctl(A,B,C) ioctl(A,B,C) typedef int osiSockIoctl_t; typedef socklen_t osiSocklen_t; +typedef int osiSockOptMcastLoop_t; #define FD_IN_FDSET(FD) ((FD)=0) #ifndef SHUT_RD #define SHUT_RD 0 diff --git a/src/libCom/osi/os/freebsd/osdSock.h b/src/libCom/osi/os/freebsd/osdSock.h index fe28d4cd5..b402ec120 100644 --- a/src/libCom/osi/os/freebsd/osdSock.h +++ b/src/libCom/osi/os/freebsd/osdSock.h @@ -36,6 +36,7 @@ typedef int SOCKET; #define socket_ioctl(A,B,C) ioctl(A,B,C) typedef int osiSockIoctl_t; typedef socklen_t osiSocklen_t; +typedef int osiSockOptMcastLoop_t; #define FD_IN_FDSET(FD) ((FD)=0) diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index ee4d11071..1ce7a6431 100755 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -210,6 +210,11 @@ ipAddrToAsciiTest_SRCS += ipAddrToAsciiTest.cpp testHarness_SRCS += ipAddrToAsciiTest.cpp TESTS += ipAddrToAsciiTest +TESTPROD_HOST += osiSockTest +osiSockTest_SRCS += osiSockTest.c +testHarness_SRCS += osiSockTest.c +TESTS += osiSockTest + # The testHarness runs all the test programs in a known working order. testHarness_SRCS += epicsRunLibComTests.c @@ -254,4 +259,3 @@ cvtFastPerform_SRCS += cvtFastPerform.cpp testHarness_SRCS += cvtFastPerform.cpp include $(TOP)/configure/RULES - diff --git a/src/libCom/test/epicsRunLibComTests.c b/src/libCom/test/epicsRunLibComTests.c index c4a76e777..29c5eda3f 100644 --- a/src/libCom/test/epicsRunLibComTests.c +++ b/src/libCom/test/epicsRunLibComTests.c @@ -51,6 +51,7 @@ int epicsInlineTest(void); int ipAddrToAsciiTest(void); int macDefExpandTest(void); int macLibTest(void); +int osiSockTest(void); int ringBytesTest(void); int ringPointerTest(void); int taskwdTest(void); @@ -104,6 +105,7 @@ void epicsRunLibComTests(void) runTest(ipAddrToAsciiTest); runTest(macDefExpandTest); runTest(macLibTest); + runTest(osiSockTest); runTest(ringBytesTest); runTest(ringPointerTest); runTest(taskwdTest); diff --git a/src/libCom/test/osiSockTest.c b/src/libCom/test/osiSockTest.c new file mode 100644 index 000000000..d9bbd29f7 --- /dev/null +++ b/src/libCom/test/osiSockTest.c @@ -0,0 +1,59 @@ +/*************************************************************************\ +* Copyright (c) 2017 UChicago Argonne LLC, as Operator of Argonne +* National Laboratory. +* EPICS BASE is distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ + +#include +#include + +#include "osiSock.h" +#include "epicsUnitTest.h" +#include "testMain.h" + +void udpSockTest(void) +{ + SOCKET s; + int status, one = 1, get = 0; + osiSocklen_t len; + osiSockOptMcastLoop_t flag = 1; + + s = epicsSocketCreate(AF_INET, SOCK_DGRAM, 0); + testOk(s != INVALID_SOCKET, "epicsSocketCreate INET, DGRAM, 0"); + + status = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)); + testOk(status >= 0, "setsockopt BROADCAST, 1"); + + len = sizeof(get); + status = getsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&get, &len); + testOk(status >= 0 && len == sizeof(get) && get == 1, + "getsockopt BROADCAST == 1"); + + status = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, + (char *)&flag, sizeof(flag)); + testOk(status >= 0, "setsockopt MULTICAST_LOOP, 1"); + + flag = 0; + len = sizeof(flag); + status = getsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&flag, &len); + testOk(status >= 0 && len == sizeof(flag) && flag == 1, + "getsockopt MULTICAST_LOOP == 1"); + + epicsSocketDestroy(s); +} + + +MAIN(osiSockTest) +{ + int status; + testPlan(6); + + status = osiSockAttach(); + testOk(status, "osiSockAttach"); + + udpSockTest(); + + osiSockRelease(); + return testDone(); +} From e0757204ccef0ecb6daf536fb6686a39e1801972 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 30 Aug 2017 13:58:17 -0500 Subject: [PATCH 2/7] More tests, check both true and false values for options. --- src/libCom/test/osiSockTest.c | 55 ++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/libCom/test/osiSockTest.c b/src/libCom/test/osiSockTest.c index d9bbd29f7..16a184afd 100644 --- a/src/libCom/test/osiSockTest.c +++ b/src/libCom/test/osiSockTest.c @@ -12,33 +12,48 @@ #include "epicsUnitTest.h" #include "testMain.h" +/* This could easily be generalized to test more options */ +void udpBroadcast(SOCKET s, int put) +{ + int status; + int flag = put; + osiSocklen_t len = sizeof(flag); + + status = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&flag, len); + testOk(status >= 0, "setsockopt BROADCAST := %d", put); + + status = getsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&flag, &len); + testOk(status >= 0 && len == sizeof(flag) && flag == put, + "getsockopt BROADCAST => %d", flag); +} + +void multiCastLoop(SOCKET s, int put) +{ + int status; + osiSockOptMcastLoop_t flag = put; + osiSocklen_t len = sizeof(flag); + + status = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, + (char *)&flag, len); + testOk(status >= 0, "setsockopt MULTICAST_LOOP := %d", put); + + status = getsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&flag, &len); + testOk(status >= 0 && len == sizeof(flag) && flag == put, + "getsockopt MULTICAST_LOOP => %d", (int) flag); +} + void udpSockTest(void) { SOCKET s; - int status, one = 1, get = 0; - osiSocklen_t len; - osiSockOptMcastLoop_t flag = 1; s = epicsSocketCreate(AF_INET, SOCK_DGRAM, 0); testOk(s != INVALID_SOCKET, "epicsSocketCreate INET, DGRAM, 0"); - status = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)); - testOk(status >= 0, "setsockopt BROADCAST, 1"); + udpBroadcast(s, 1); + udpBroadcast(s, 0); - len = sizeof(get); - status = getsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&get, &len); - testOk(status >= 0 && len == sizeof(get) && get == 1, - "getsockopt BROADCAST == 1"); - - status = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, - (char *)&flag, sizeof(flag)); - testOk(status >= 0, "setsockopt MULTICAST_LOOP, 1"); - - flag = 0; - len = sizeof(flag); - status = getsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&flag, &len); - testOk(status >= 0 && len == sizeof(flag) && flag == 1, - "getsockopt MULTICAST_LOOP == 1"); + multiCastLoop(s, 1); + multiCastLoop(s, 0); epicsSocketDestroy(s); } @@ -47,7 +62,7 @@ void udpSockTest(void) MAIN(osiSockTest) { int status; - testPlan(6); + testPlan(10); status = osiSockAttach(); testOk(status, "osiSockAttach"); From 9e75b8b32d1fbc18201b5252ab4598dbcb3f42a5 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 13 Oct 2017 10:42:19 +0200 Subject: [PATCH 3/7] libcom/test: osiSockTest fix for RTEMS Instead of 0/1 RTEMS gives 0/32 (32==SO_BROADCAST). So switch the test to zero/non-zero. --- src/libCom/test/osiSockTest.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libCom/test/osiSockTest.c b/src/libCom/test/osiSockTest.c index 16a184afd..39eb0ba2b 100644 --- a/src/libCom/test/osiSockTest.c +++ b/src/libCom/test/osiSockTest.c @@ -23,7 +23,7 @@ void udpBroadcast(SOCKET s, int put) testOk(status >= 0, "setsockopt BROADCAST := %d", put); status = getsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&flag, &len); - testOk(status >= 0 && len == sizeof(flag) && flag == put, + testOk(status >= 0 && len == sizeof(flag) && !flag == !put, "getsockopt BROADCAST => %d", flag); } @@ -38,7 +38,7 @@ void multiCastLoop(SOCKET s, int put) testOk(status >= 0, "setsockopt MULTICAST_LOOP := %d", put); status = getsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&flag, &len); - testOk(status >= 0 && len == sizeof(flag) && flag == put, + testOk(status >= 0 && len == sizeof(flag) && !flag == !put, "getsockopt MULTICAST_LOOP => %d", (int) flag); } From 58460d25b97eb316a376656f602b12c8a7c76aa3 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 13 Oct 2017 10:57:21 +0200 Subject: [PATCH 4/7] Release Notes --- documentation/RELEASE_NOTES.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 3be476cd9..33f12c441 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -16,6 +16,11 @@ +

Add osiSockOptMcastLoop_t and osiSockTest

+ +

Added a new OS-independent typedef for multicast socket options, and a test +file to check their correct operation.

+

Support for CONFIG_SITE.local in Base

This feature is mostly meant for use by developers; configuration From cec4f4e24bbd29606d99e4cca4802f00adc5a7e3 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 20 Oct 2017 14:12:49 -0500 Subject: [PATCH 5/7] Unify rsrv socket errors, add missing error string --- src/ioc/rsrv/camsgtask.c | 2 +- src/ioc/rsrv/caserverio.c | 6 +++--- src/ioc/rsrv/caservertask.c | 15 ++++++++------- src/ioc/rsrv/cast_server.c | 2 +- src/ioc/rsrv/online_notify.c | 4 ++-- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/ioc/rsrv/camsgtask.c b/src/ioc/rsrv/camsgtask.c index e2a0d3e18..04a7e780e 100644 --- a/src/ioc/rsrv/camsgtask.c +++ b/src/ioc/rsrv/camsgtask.c @@ -59,7 +59,7 @@ void camsgtask ( void *pParm ) epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf("CAS: ioctl error - %s\n", + errlogPrintf("CAS: FIONREAD error: %s\n", sockErrBuf); cas_send_bs_msg(client, TRUE); } diff --git a/src/ioc/rsrv/caserverio.c b/src/ioc/rsrv/caserverio.c index 7250ae6db..20a1c1c5b 100644 --- a/src/ioc/rsrv/caserverio.c +++ b/src/ioc/rsrv/caserverio.c @@ -114,7 +114,7 @@ void cas_send_bs_msg ( struct client *pclient, int lock_needed ) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ( "CAS: TCP send to %s failed - %s\n", + errlogPrintf ( "CAS: TCP send to %s failed: %s\n", buf, sockErrBuf); } pclient->disconnect = TRUE; @@ -140,7 +140,7 @@ void cas_send_bs_msg ( struct client *pclient, int lock_needed ) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ("CAS: Socket shutdown error - %s\n", + errlogPrintf ("CAS: Socket shutdown error: %s\n", sockErrBuf ); } } @@ -218,7 +218,7 @@ void cas_send_dg_msg ( struct client * pclient ) epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); ipAddrToDottedIP ( &pclient->addr, buf, sizeof(buf) ); - errlogPrintf( "CAS: UDP send to %s failed - %s\n", + errlogPrintf( "CAS: UDP send to %s failed: %s\n", buf, sockErrBuf); } diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index fda442168..80310a422 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -71,7 +71,7 @@ static void req_server (void *pParm) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ( "CAS: Listen error %s\n", + errlogPrintf ( "CAS: Listen error: %s\n", sockErrBuf ); epicsSocketDestroy (IOC_sock); epicsThreadSuspendSelf (); @@ -93,7 +93,7 @@ static void req_server (void *pParm) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf("CAS: Client accept error was \"%s\"\n", + errlogPrintf("CAS: Client accept error: %s\n", sockErrBuf ); epicsThreadSleep(15.0); continue; @@ -138,7 +138,7 @@ int tryBind(SOCKET sock, const osiSockAddr* addr, const char *name) { epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ( "CAS: %s bind error: \"%s\"\n", + errlogPrintf ( "CAS: %s bind error: %s\n", name, sockErrBuf ); epicsThreadSuspendSelf (); } @@ -203,7 +203,7 @@ SOCKET* rsrv_grab_tcp(unsigned short *port) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ( "CAS: getsockname error was \"%s\"\n", + errlogPrintf ( "CAS: getsockname error: %s\n", sockErrBuf ); epicsThreadSuspendSelf (); ok = 0; @@ -242,7 +242,7 @@ SOCKET* rsrv_grab_tcp(unsigned short *port) epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); ipAddrToDottedIP(&scratch.ia, name, sizeof(name)); - cantProceed( "CAS: Socket bind %s error was %s\n", + cantProceed( "CAS: Socket bind %s error: %s\n", name, sockErrBuf ); } ok = 0; @@ -314,7 +314,8 @@ void rsrv_build_addr_lists(void) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf("rsrv: failed to set mcast loopback\n"); + errlogPrintf("CAS: failed to set mcast loopback: %s\n", + sockErrBuf); } } #endif @@ -639,7 +640,7 @@ int rsrv_init (void) epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); ipAddrToDottedIP (&temp, name, sizeof(name)); - fprintf(stderr, "CAS: Socket mcast join %s to %s failed with \"%s\"\n", + errlogPrintf("CAS: Socket mcast join %s to %s failed: %s\n", ifaceName, name, sockErrBuf ); } } diff --git a/src/ioc/rsrv/cast_server.c b/src/ioc/rsrv/cast_server.c index b6bed8484..74add9fb4 100644 --- a/src/ioc/rsrv/cast_server.c +++ b/src/ioc/rsrv/cast_server.c @@ -176,7 +176,7 @@ void cast_server(void *pParm) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); - epicsPrintf ("CAS: UDP recv error (errno=%s)\n", + epicsPrintf ("CAS: UDP recv error: %s\n", sockErrBuf); epicsThreadSleep(1.0); } diff --git a/src/ioc/rsrv/online_notify.c b/src/ioc/rsrv/online_notify.c index d1d557943..b2547c464 100644 --- a/src/ioc/rsrv/online_notify.c +++ b/src/ioc/rsrv/online_notify.c @@ -87,8 +87,8 @@ void rsrv_online_notify_task(void *pParm) char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); ipAddrToDottedIP (&pAddr->addr.ia, buf, sizeof(buf)); - errlogPrintf ( "%s: CA beacon (send to \"%s\") error was \"%s\"\n", - __FILE__, buf, sockErrBuf); + errlogPrintf ( "CAS: CA beacon send to %s error: %s\n", + buf, sockErrBuf); } else { assert (status == sizeof(msg)); From 31c7d91884e3479bc482a7687dd671482601fce7 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 26 Oct 2017 16:28:24 -0500 Subject: [PATCH 6/7] libCom/test/Makefile: Clean up SYS_LIBS var's Add PROD_SYS_LIBS_solaris global setting Remove settings for individual tests --- src/libCom/test/Makefile | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index 1ce7a6431..89eb87f6f 100755 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -12,6 +12,7 @@ include $(TOP)/configure/CONFIG PROD_LIBS += Com PROD_SYS_LIBS_WIN32 += ws2_32 advapi32 user32 +PROD_SYS_LIBS_solaris += socket nsl TESTPROD_HOST += epicsUnitTestTest epicsUnitTestTest_SRCS += epicsUnitTestTest.c @@ -48,8 +49,6 @@ TESTS += epicsMathTest TESTPROD_HOST += epicsMMIOTest epicsMMIOTest_SRCS += epicsMMIOTest.c -epicsMMIOTest_SYS_LIBS_solaris = socket -epicsMMIOTest_SYS_LIBS_WIN32 = ws2_32 user32 testHarness_SRCS += epicsMMIOTest.c TESTS += epicsMMIOTest @@ -65,8 +64,6 @@ TESTS += epicsEnvTest TESTPROD_HOST += epicsErrlogTest epicsErrlogTest_SRCS += epicsErrlogTest.c -epicsErrlogTest_SYS_LIBS_solaris = socket -epicsErrlogTest_SYS_LIBS_WIN32 = ws2_32 user32 testHarness_SRCS += epicsErrlogTest.c TESTS += epicsErrlogTest @@ -82,8 +79,6 @@ TESTS += epicsStdlibTest TESTPROD_HOST += epicsSockResolveTest epicsSockResolveTest_SRCS += epicsSockResolveTest.c -epicsSockResolveTest_SYS_LIBS_solaris = socket -epicsSockResolveTest_SYS_LIBS_WIN32 = ws2_32 user32 testHarness_SRCS += epicsSockResolveTest.c TESTS += epicsSockResolveTest @@ -190,9 +185,6 @@ TESTS += taskwdTest TESTPROD_HOST += blockingSockTest blockingSockTest_SRCS += blockingSockTest.cpp testHarness_SRCS += blockingSockTest.cpp -# needed when its an object library build -blockingSockTest_SYS_LIBS_WIN32 = ws2_32 advapi32 user32 -blockingSockTest_SYS_LIBS_solaris = socket TESTS += blockingSockTest TESTPROD_HOST += epicsMessageQueueTest From e38252eecc5b1feac7206b87911b407b542e6a70 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 26 Oct 2017 16:29:03 -0500 Subject: [PATCH 7/7] Fix osiSockOptMcastLoop_t for solaris --- src/libCom/osi/os/solaris/osdSock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libCom/osi/os/solaris/osdSock.h b/src/libCom/osi/os/solaris/osdSock.h index 872a08df5..96ea2a983 100644 --- a/src/libCom/osi/os/solaris/osdSock.h +++ b/src/libCom/osi/os/solaris/osdSock.h @@ -42,7 +42,7 @@ typedef int osiSockIoctl_t; #else typedef int osiSocklen_t; #endif -typedef int osiSockOptMcastLoop_t; +typedef char osiSockOptMcastLoop_t; #define DOES_NOT_ACCEPT_ZERO_LENGTH_UDP