/****************************************************************************** * Copyright (c) 2000-2022 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html * * Contributors: * Jozsef Gyurusi - initial implementation and initial documentation * Csaba Bela Koppany * Gabor Szalai * Peter Kremer * Tamas Buti * Zoltan Jasz ******************************************************************************/ // // File: UDPasp_PT.cc // Description: UDP test port source // Rev: R8B // Prodnr: CNL 113 346 // #include "UDPasp_PT.hh" #include #include #include #include #define DEFAULT_LOCAL_PORT (50000) #define DEFAULT_NUM_CONN (10) namespace UDPasp__PortType { UDPasp__PT_PROVIDER::UDPasp__PT_PROVIDER(const char *par_port_name) : PORT(par_port_name) , debugging(false) , target_fd(-1) { localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); 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; target_fd = -1; } UDPasp__PT_PROVIDER::~UDPasp__PT_PROVIDER() { Free(conn_list); } int UDPasp__PT_PROVIDER::setUpSocket(bool do_bind) { log("entering UDPasp__PT::setUpSocket()"); int fd; /* socket creation */ if((fd = socket(AF_INET,SOCK_DGRAM,0))<0) { TTCN_error("Cannot open socket"); } if(broadcast){ int on=1; if( setsockopt( fd, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on) ) < 0 ) { 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..."); 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() { log("entering UDPasp__PT::closeDownSocket()"); close(target_fd); target_fd = -1; log("entering UDPasp__PT::closeDownSocket()"); } void UDPasp__PT_PROVIDER::log(const char *fmt, ...) { if (debugging) { TTCN_Logger::begin_event(TTCN_DEBUG); TTCN_Logger::log_event("UDP test port (%s): ", get_name()); va_list args; va_start(args, fmt); TTCN_Logger::log_event_va_list(fmt, args); va_end(args); TTCN_Logger::end_event(); } } void UDPasp__PT_PROVIDER::logHex(const char *prompt, const OCTETSTRING& msg) { if (debugging) { //if debug TTCN_Logger::begin_event(TTCN_DEBUG); TTCN_Logger::log_event_str(prompt); TTCN_Logger::log_event("Size: %d,\nMsg: ",msg.lengthof()); for(int i=0; ih_addr_list[0]); } } log("Host name: %s, Host address: %u", (const char*)hostName, ipAddress); log("UDPasp__PT::getHostId exited"); return htonl ( ipAddress ); } void UDPasp__PT_PROVIDER::set_parameter(const char *parameter_name, const char *parameter_value) { log("entering UDPasp__PT::set_parameter(%s, %s)", parameter_name, parameter_value); if (!strcmp(parameter_name, "debugging")) { if (!strcmp(parameter_value,"YES") || !strcmp(parameter_value,"yes")) debugging = true; }else if(!strcmp(parameter_name,"localIPAddr")){ localAddr.sin_addr.s_addr = htonl(getHostId(parameter_value)); }else if(!strcmp(parameter_name,"broadcast")){ if (!strcasecmp(parameter_value,"enabled")) broadcast = true; else if (!strcasecmp(parameter_value,"disabled")) broadcast = false; else { 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")) { if (!strcasecmp(parameter_value,"advanced")) port_mode = true; }else TTCN_warning("UDPasp__PT::set_parameter(): Unsupported Test Port parameter: %s", parameter_name); log("leaving UDPasp__PT::set_parameter(%s, %s)", parameter_name, parameter_value); } void UDPasp__PT_PROVIDER::Event_Handler(const fd_set *read_fds, const fd_set */*write_fds*/, const fd_set */*error_fds*/, double /*time_since_last_call*/) { log("entering UDPasp__PT::Event_Handler()"); unsigned char msg[65535]; // Allocate memory for possible messages int msgLength; struct sockaddr_in remoteAddr; socklen_t addr_length = sizeof(remoteAddr); if(port_mode){ int conn_found=0; for(int a=0;a