Skip to content

Commit 582e7e4

Browse files
ESDK-3843: Added error on attempt set SO_REUSEPORT option under unsupported old Linux.
1 parent db8794a commit 582e7e4

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

Cpp-C/Eta/Impl/Transport/ripcutils.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,10 +581,14 @@ int ipcSockOpts(RsslSocket fd, ripcSocketOption *option)
581581
#if defined(Linux)
582582
case RIPC_SOPT_REUSEPORT:
583583
{
584+
#if defined(SO_REUSEPORT)
584585
int reuseFlag = (option->options.turn_on ? 1 : 0);
585586
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuseFlag,
586587
(int)sizeof(reuseFlag)) < 0)
587588
ret = -1;
589+
#else
590+
ret = -1;
591+
#endif
588592
break;
589593
}
590594
#endif
@@ -1102,10 +1106,17 @@ RsslInt32 ipcSrvrBind(rsslServerImpl *srvr, RsslError *error)
11021106
sockopts.options.turn_on = 1;
11031107
if (ipcSockOpts(sock_fd, &sockopts) < 0)
11041108
{
1109+
#if defined(SO_REUSEPORT)
11051110
_rsslSetError(error, NULL, RSSL_RET_FAILURE, errno);
11061111
snprintf(error->text, MAX_RSSL_ERROR_TEXT,
11071112
"<%s:%d> Error: 1002 Could not to set SO_REUSEPORT on socket. System errno: (%d)\n",
11081113
__FILE__, __LINE__, errno);
1114+
#else
1115+
_rsslSetError(error, NULL, RSSL_RET_FAILURE, 0);
1116+
snprintf(error->text, MAX_RSSL_ERROR_TEXT,
1117+
"<%s:%d> Error: 1002 Could not to set SO_REUSEPORT on socket. Linux PC does not support SO_REUSEPORT. GCC version: %d.%d.%d\n",
1118+
__FILE__, __LINE__, __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
1119+
#endif
11091120

11101121
sock_close(sock_fd);
11111122
return -1;

Cpp-C/Eta/TestTools/UnitTests/rsslTransportUnitTest/rsslTransportUnitTest.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2883,6 +2883,7 @@ class BindSharedServerSocketOpt : public ::testing::Test {
28832883
};
28842884

28852885
/* Testing setup of the socket options for server call Bind */
2886+
#if defined(_WIN32) || defined(SO_REUSEPORT)
28862887
TEST_F(BindSharedServerSocketOpt, ServerSharedSocketShouldBeOffWhenDefaultInitValues)
28872888
{
28882889
// Tests default init-values
@@ -2956,6 +2957,65 @@ TEST_F(BindSharedServerSocketOpt, ServerSharedSocketShouldBeOnWhenSetTrue)
29562957
#endif
29572958
}
29582959

2960+
#else // Linux && !defined(SO_REUSEPORT) // LUP - Linux Unsopported SO_REUSEPORT
2961+
2962+
TEST_F(BindSharedServerSocketOpt, ServerSharedSocketShouldBeOffWhenDefaultInitValuesLUP)
2963+
{
2964+
// Tests default init-values
2965+
RsslBindOptions bindOpts = RSSL_INIT_BIND_OPTS;
2966+
2967+
runRsslBind(bindOpts);
2968+
2969+
// Tests the socket options: the server socket does not permit sharing
2970+
testSocketOpt(SO_REUSEADDR, true, "SO_REUSEADDR");
2971+
}
2972+
2973+
TEST_F(BindSharedServerSocketOpt, ServerSharedSocketShouldBeOffWhenClearBindOptsLUP)
2974+
{
2975+
// Tests rsslClearBindOpts
2976+
RsslBindOptions bindOpts;
2977+
rsslClearBindOpts(&bindOpts);
2978+
2979+
runRsslBind(bindOpts);
2980+
2981+
// Tests the socket options: the server socket does not permit sharing
2982+
testSocketOpt(SO_REUSEADDR, true, "SO_REUSEADDR");
2983+
}
2984+
2985+
TEST_F(BindSharedServerSocketOpt, ServerSharedSocketShouldBeOffWhenSetFalseLUP)
2986+
{
2987+
// Tests serverSharedSocket off
2988+
RsslBindOptions bindOpts;
2989+
rsslClearBindOpts(&bindOpts);
2990+
bindOpts.serverSharedSocket = RSSL_FALSE;
2991+
2992+
runRsslBind(bindOpts);
2993+
2994+
// Tests the socket options: the server socket does not permit sharing
2995+
testSocketOpt(SO_REUSEADDR, true, "SO_REUSEADDR");
2996+
}
2997+
2998+
TEST_F(BindSharedServerSocketOpt, ServerSharedSocketShouldBeErrorOnRsslBindLUP)
2999+
{
3000+
// Tests serverSharedSocket on
3001+
RsslBindOptions bindOpts;
3002+
RsslError err;
3003+
rsslClearBindOpts(&bindOpts);
3004+
bindOpts.serverSharedSocket = RSSL_TRUE;
3005+
3006+
bindOpts.serviceName = (char*)"15000";
3007+
bindOpts.protocolType = TEST_PROTOCOL_TYPE; /* These tests are just sending a pre-set string across the wire, so protocol type should not be RWF */
3008+
3009+
// Tests rsslBind returns NULL because SO_REUSEPORT option is unsupported
3010+
pServer = rsslBind(&bindOpts, &err);
3011+
3012+
ASSERT_EQ(pServer, (RsslServer*)NULL) << "rsslBind should return NULL when required set unsupported option SO_REUSEPORT";
3013+
ASSERT_EQ(err.rsslErrorId, RSSL_RET_FAILURE) << "Error ccode should set to General Failure";
3014+
ASSERT_EQ(err.sysError, 0) << "SysError should be equal to 0";
3015+
}
3016+
3017+
#endif
3018+
29593019

29603020
int main(int argc, char* argv[])
29613021
{

0 commit comments

Comments
 (0)