From 5881eaece8745271bfc107ea5b8c956e6f84cf99 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Thu, 17 Feb 2022 19:15:43 +0600 Subject: [PATCH 1/3] UDPasp__PT_PROVIDER: remove redundant '\n' in TTCN_error() messages --- src/UDPasp_PT.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/UDPasp_PT.cc b/src/UDPasp_PT.cc index 0faa02c..30da393 100644 --- a/src/UDPasp_PT.cc +++ b/src/UDPasp_PT.cc @@ -60,7 +60,7 @@ void UDPasp__PT_PROVIDER::setUpSocket() /* socket creation */ if((target_fd = socket(AF_INET,SOCK_DGRAM,0))<0) { - TTCN_error("Cannot open socket \n"); + TTCN_error("Cannot open socket"); } if(broadcast){ @@ -73,7 +73,7 @@ void UDPasp__PT_PROVIDER::setUpSocket() log("Binding port..."); if(bind(target_fd, (struct sockaddr *) &localAddr, sizeof(localAddr))<0) { - TTCN_error("Cannot bind port\n"); + TTCN_error("Cannot bind port"); } log("leaving UDPasp__PT::setUpSocket()"); @@ -328,7 +328,7 @@ void UDPasp__PT_PROVIDER::outgoing_send(const UDPasp__Types::ASP__UDP__message& targetAddr.sin_addr.s_addr = htonl(getHostId((const char*)send_par.remote__addr()())); targetAddr.sin_port = htons(send_par.remote__port()()); if((sock = socket(AF_INET,SOCK_DGRAM,0))<0) { - TTCN_error("Cannot open socket \n"); + TTCN_error("Cannot open socket"); } if(broadcast){ int on=1; @@ -372,7 +372,7 @@ void UDPasp__PT_PROVIDER::outgoing_send(const UDPasp__Types::ASP__UDP__open& sen } if((sock = socket(AF_INET,SOCK_DGRAM,0))<0) { - TTCN_error("Cannot open socket \n"); + TTCN_error("Cannot open socket"); } if(broadcast){ int on=1; @@ -398,12 +398,12 @@ void UDPasp__PT_PROVIDER::outgoing_send(const UDPasp__Types::ASP__UDP__open& sen } if(bind(sock, (struct sockaddr *) &localAddr, sizeof(localAddr))<0) { - TTCN_error("Cannot bind port\n"); + TTCN_error("Cannot bind port"); } namelen=sizeof(localAddr); if(getsockname(sock, (struct sockaddr *) &localAddr, &namelen)<0) { - TTCN_error("getsockname failed\n"); + TTCN_error("getsockname failed"); } conn_list[cn].fd=sock; -- GitLab From 2329e8cb843e60dcd9af49955ee0d04868852a05 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Thu, 17 Feb 2022 20:37:51 +0600 Subject: [PATCH 2/3] UDPasp__PT_PROVIDER: unify setUpSocket(), reduce code duplication --- src/UDPasp_PT.cc | 44 +++++++++++++------------------------------- src/UDPasp_PT.hh | 2 +- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/src/UDPasp_PT.cc b/src/UDPasp_PT.cc index 30da393..6414189 100644 --- a/src/UDPasp_PT.cc +++ b/src/UDPasp_PT.cc @@ -54,29 +54,33 @@ UDPasp__PT_PROVIDER::~UDPasp__PT_PROVIDER() Free(conn_list); } -void UDPasp__PT_PROVIDER::setUpSocket() +int UDPasp__PT_PROVIDER::setUpSocket(bool do_bind) { log("entering UDPasp__PT::setUpSocket()"); + int fd; /* socket creation */ - if((target_fd = socket(AF_INET,SOCK_DGRAM,0))<0) { + if((fd = socket(AF_INET,SOCK_DGRAM,0))<0) { TTCN_error("Cannot open socket"); } if(broadcast){ int on=1; - if( setsockopt( target_fd, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on) ) < 0 ) + if( setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on) ) < 0 ) { TTCN_error("Setsockopt error: SO_BROADCAST"); } } - log("Binding port..."); - if(bind(target_fd, (struct sockaddr *) &localAddr, sizeof(localAddr))<0) { - TTCN_error("Cannot bind port"); + if(do_bind) { + log("Binding port..."); + if(bind(fd, (struct sockaddr *) &localAddr, sizeof(localAddr))<0) { + TTCN_error("Cannot bind port"); + } } log("leaving UDPasp__PT::setUpSocket()"); + return fd; } void UDPasp__PT_PROVIDER::closeDownSocket() @@ -242,7 +246,7 @@ void UDPasp__PT_PROVIDER::user_map(const char */*system_port*/) FD_ZERO(&conn_map); } else{ - setUpSocket(); + target_fd = setUpSocket(true); /* do bind() */ fd_set readfds; FD_ZERO(&readfds); FD_SET(target_fd, &readfds); @@ -327,16 +331,7 @@ void UDPasp__PT_PROVIDER::outgoing_send(const UDPasp__Types::ASP__UDP__message& else{ targetAddr.sin_addr.s_addr = htonl(getHostId((const char*)send_par.remote__addr()())); targetAddr.sin_port = htons(send_par.remote__port()()); - if((sock = socket(AF_INET,SOCK_DGRAM,0))<0) { - TTCN_error("Cannot open socket"); - } - if(broadcast){ - int on=1; - if( setsockopt( sock, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on) ) < 0 ) - { - TTCN_error("UDP test port: Setsockopt error: SO_BROADCAST"); - } - } + sock = setUpSocket(false); /* do not bind() */ } int nrOfBytesSent = sendto(sock, (const char*)(const unsigned char*)send_par.data(), @@ -371,17 +366,6 @@ void UDPasp__PT_PROVIDER::outgoing_send(const UDPasp__Types::ASP__UDP__open& sen conn_list_length*=2; } - if((sock = socket(AF_INET,SOCK_DGRAM,0))<0) { - TTCN_error("Cannot open socket"); - } - if(broadcast){ - int on=1; - if( setsockopt( sock, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on) ) < 0 ) - { - TTCN_error("UDP test port: Setsockopt error: SO_BROADCAST"); - } - } - if(send_par.local__addr().ispresent()){ localAddr.sin_addr.s_addr= htonl(getHostId((const char*)send_par.local__addr()())); @@ -397,9 +381,7 @@ void UDPasp__PT_PROVIDER::outgoing_send(const UDPasp__Types::ASP__UDP__open& sen localAddr.sin_port=0; } - if(bind(sock, (struct sockaddr *) &localAddr, sizeof(localAddr))<0) { - TTCN_error("Cannot bind port"); - } + sock = setUpSocket(true); /* do bind() */ namelen=sizeof(localAddr); if(getsockname(sock, (struct sockaddr *) &localAddr, &namelen)<0) { diff --git a/src/UDPasp_PT.hh b/src/UDPasp_PT.hh index 9bff092..9fdd762 100644 --- a/src/UDPasp_PT.hh +++ b/src/UDPasp_PT.hh @@ -71,7 +71,7 @@ protected: void log(const char *fmt, ...); void logHex(const char *prompt, const OCTETSTRING& msg); - void setUpSocket(); + int setUpSocket(bool do_bind); void closeDownSocket(); unsigned long getHostId(const char* destHostName); -- GitLab From 06039fdcc323b3c04bba38d466df272943e2d4e9 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Wed, 8 Jan 2020 10:08:12 +0100 Subject: [PATCH 3/3] UDPasp__PT_PROVIDER: add reuseAddr param (SO_REUSEADDR) Signed-off-by: Vadim Yanitskiy Co-Authored-By: Oliver Smith --- src/UDPasp_PT.cc | 18 ++++++++++++++++++ src/UDPasp_PT.hh | 1 + 2 files changed, 19 insertions(+) diff --git a/src/UDPasp_PT.cc b/src/UDPasp_PT.cc index 6414189..5ed0c95 100644 --- a/src/UDPasp_PT.cc +++ b/src/UDPasp_PT.cc @@ -43,6 +43,7 @@ UDPasp__PT_PROVIDER::UDPasp__PT_PROVIDER(const char *par_port_name) localAddr.sin_port = htons(DEFAULT_LOCAL_PORT); port_mode = false; broadcast = false; + reuseaddr = false; conn_list = NULL; num_of_conn = 0; conn_list_length = 0; @@ -71,6 +72,13 @@ int UDPasp__PT_PROVIDER::setUpSocket(bool do_bind) TTCN_error("Setsockopt error: SO_BROADCAST"); } } + if (reuseaddr){ + int on=1; + if( setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on) ) < 0 ) + { + TTCN_error("Setsockopt error: SO_REUSEADDR"); + } + } if(do_bind) { log("Binding port..."); @@ -162,6 +170,16 @@ void UDPasp__PT_PROVIDER::set_parameter(const char *parameter_name, broadcast = false; TTCN_warning("UDPasp__PT::set_parameter(): Unsupported Test Port parameter value: %s", parameter_value); } + }else if(!strcmp(parameter_name,"reuseAddr")){ + if (!strcasecmp(parameter_value,"enabled")) + reuseaddr = true; + else if (!strcasecmp(parameter_value,"disabled")) + reuseaddr = false; + else { + reuseaddr = false; + TTCN_warning("UDP_asp__PT::set_parameter() Unsupported Test Port parameter value: %s", + parameter_value); + } }else if(!strcmp(parameter_name,"localPort")){ localAddr.sin_port = htons(atoi(parameter_value)); }else if (!strcmp(parameter_name, "mode")) { diff --git a/src/UDPasp_PT.hh b/src/UDPasp_PT.hh index 9fdd762..c4f413a 100644 --- a/src/UDPasp_PT.hh +++ b/src/UDPasp_PT.hh @@ -80,6 +80,7 @@ private: bool port_mode; // false: basic mode. Works like R1A02 // true: advanced mode. The new features are activated bool broadcast; + bool reuseaddr; struct conn_data{ int fd; -- GitLab