From b9d2515704ac83cacd88d0a73ecba30323df0b2d Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Mon, 1 Jul 2019 19:03:49 +0200 Subject: [PATCH] Transceiver: replace UDPSocket with libosmocore socket API We have a good socket API in libosmocore, let's drop osmo-trx socket API and use libosmocore's one instead of maintaining the two of them. Change-Id: Ib19856a3e0a7607f63436c4a80b1381a3f318764 --- CommonLibs/Makefile.am | 2 - CommonLibs/Sockets.cpp | 287 ------------------------------- CommonLibs/Sockets.h | 173 ------------------- Transceiver52M/Transceiver.cpp | 64 +++++-- Transceiver52M/Transceiver.h | 7 +- tests/CommonLibs/Makefile.am | 6 - tests/CommonLibs/SocketsTest.cpp | 101 ----------- tests/CommonLibs/SocketsTest.ok | 1 - tests/testsuite.at | 6 - 9 files changed, 53 insertions(+), 594 deletions(-) delete mode 100644 CommonLibs/Sockets.cpp delete mode 100644 CommonLibs/Sockets.h delete mode 100644 tests/CommonLibs/SocketsTest.cpp delete mode 100644 tests/CommonLibs/SocketsTest.ok diff --git a/CommonLibs/Makefile.am b/CommonLibs/Makefile.am index 22572e10..2c449e01 100644 --- a/CommonLibs/Makefile.am +++ b/CommonLibs/Makefile.am @@ -30,7 +30,6 @@ noinst_LTLIBRARIES = libcommon.la libcommon_la_SOURCES = \ BitVector.cpp \ LinkedLists.cpp \ - Sockets.cpp \ Threads.cpp \ Timeval.cpp \ Logger.cpp \ @@ -45,7 +44,6 @@ noinst_HEADERS = \ PRBS.h \ Interthread.h \ LinkedLists.h \ - Sockets.h \ Threads.h \ Timeval.h \ Vector.h \ diff --git a/CommonLibs/Sockets.cpp b/CommonLibs/Sockets.cpp deleted file mode 100644 index ce8e3d59..00000000 --- a/CommonLibs/Sockets.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/* -* Copyright 2008, 2010 Free Software Foundation, Inc. -* -* -* This software is distributed under the terms of the GNU Affero Public License. -* See the COPYING file in the main directory for details. -* -* This use of this software may be subject to additional restrictions. -* See the LEGAL file in the main directory for details. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -*/ - - - -#include -#include -#include -#include -#include - -#include "Threads.h" -#include "Sockets.h" -#include -#include -#include - -#include -#include - - - - - - -bool resolveAddress(struct sockaddr_in *address, const char *hostAndPort) -{ - assert(address); - assert(hostAndPort); - char *copy = strdup(hostAndPort); - char *colon = strchr(copy,':'); - if (!colon) return false; - *colon = '\0'; - char *host = copy; - unsigned port = strtol(colon+1,NULL,10); - bool retVal = resolveAddress(address,host,port); - free(copy); - return retVal; -} - -bool resolveAddress(struct sockaddr_in *address, const char *host, unsigned short port) -{ - assert(address); - assert(host); - // FIXME -- Need to ignore leading/trailing spaces in hostname. - struct hostent *hp; - int h_errno_local; -#ifdef HAVE_GETHOSTBYNAME2_R - struct hostent hostData; - char tmpBuffer[2048]; - - // There are different flavors of gethostbyname_r(), but - // latest Linux use the following form: - if (gethostbyname2_r(host, AF_INET, &hostData, tmpBuffer, sizeof(tmpBuffer), &hp, &h_errno_local)!=0) { - CERR("WARNING -- gethostbyname2_r() failed for " << host << ", " << hstrerror(h_errno_local)); - return false; - } -#else - static Mutex sGethostbynameMutex; - // gethostbyname() is NOT thread-safe, so we should use a mutex here. - // Ideally it should be a global mutex for all non thread-safe socket - // operations and it should protect access to variables such as - // global h_errno. - sGethostbynameMutex.lock(); - hp = gethostbyname(host); - h_errno_local = h_errno; - sGethostbynameMutex.unlock(); -#endif - if (hp==NULL) { - CERR("WARNING -- gethostbyname() failed for " << host << ", " << hstrerror(h_errno_local)); - return false; - } - if (hp->h_addrtype != AF_INET) { - CERR("WARNING -- gethostbyname() resolved " << host << " to something other then AF_INET"); - return false; - } - address->sin_family = hp->h_addrtype; - assert(sizeof(address->sin_addr) == hp->h_length); - memcpy(&(address->sin_addr), hp->h_addr_list[0], hp->h_length); - address->sin_port = htons(port); - return true; -} - - - -DatagramSocket::DatagramSocket() -{ - memset(mDestination, 0, sizeof(mDestination)); -} - - - - - -void DatagramSocket::nonblocking() -{ - fcntl(mSocketFD,F_SETFL,O_NONBLOCK); -} - -void DatagramSocket::blocking() -{ - fcntl(mSocketFD,F_SETFL,0); -} - -void DatagramSocket::close() -{ - ::close(mSocketFD); -} - - -DatagramSocket::~DatagramSocket() -{ - close(); -} - - - - - -int DatagramSocket::write( const char * message, size_t length ) -{ - assert(length<=MAX_UDP_LENGTH); - int retVal = sendto(mSocketFD, message, length, 0, - (struct sockaddr *)mDestination, addressSize()); - if (retVal == -1 ) perror("DatagramSocket::write() failed"); - return retVal; -} - -int DatagramSocket::writeBack( const char * message, size_t length ) -{ - assert(length<=MAX_UDP_LENGTH); - int retVal = sendto(mSocketFD, message, length, 0, - (struct sockaddr *)mSource, addressSize()); - if (retVal == -1 ) perror("DatagramSocket::write() failed"); - return retVal; -} - - - -int DatagramSocket::write( const char * message) -{ - size_t length=strlen(message)+1; - return write(message,length); -} - -int DatagramSocket::writeBack( const char * message) -{ - size_t length=strlen(message)+1; - return writeBack(message,length); -} - - - -int DatagramSocket::send(const struct sockaddr* dest, const char * message, size_t length ) -{ - assert(length<=MAX_UDP_LENGTH); - int retVal = sendto(mSocketFD, message, length, 0, dest, addressSize()); - if (retVal == -1 ) perror("DatagramSocket::send() failed"); - return retVal; -} - -int DatagramSocket::send(const struct sockaddr* dest, const char * message) -{ - size_t length=strlen(message)+1; - return send(dest,message,length); -} - -int DatagramSocket::read(char* buffer, size_t length) -{ - socklen_t addr_len = sizeof(mSource); - int rd_length = recvfrom(mSocketFD, (void *) buffer, length, 0, - (struct sockaddr*) &mSource, &addr_len); - - if ((rd_length==-1) && (errno!=EAGAIN)) { - perror("DatagramSocket::read() failed"); - throw SocketError(); - } - return rd_length; -} - -int DatagramSocket::read(char* buffer, size_t length, unsigned timeout) -{ - fd_set fds; - FD_ZERO(&fds); - FD_SET(mSocketFD,&fds); - struct timeval tv; - tv.tv_sec = timeout/1000; - tv.tv_usec = (timeout%1000)*1000; - int sel = select(mSocketFD+1,&fds,NULL,NULL,&tv); - if (sel<0) { - perror("DatagramSocket::read() select() failed"); - throw SocketError(); - } - if (sel==0) return -1; - if (FD_ISSET(mSocketFD,&fds)) return read(buffer, length); - return -1; -} - - - - - - -UDPSocket::UDPSocket(const char *wSrcIP, unsigned short wSrcPort) - :DatagramSocket() -{ - open(wSrcPort, wSrcIP); -} - - -UDPSocket::UDPSocket(const char *wSrcIP, unsigned short wSrcPort, - const char *wDestIP, unsigned short wDestPort) - :DatagramSocket() -{ - open(wSrcPort, wSrcIP); - destination(wDestPort, wDestIP); -} - - - -void UDPSocket::destination( unsigned short wDestPort, const char * wDestIP ) -{ - resolveAddress((sockaddr_in*)mDestination, wDestIP, wDestPort ); -} - - -void UDPSocket::open(unsigned short localPort, const char *wlocalIP) -{ - // create - mSocketFD = socket(AF_INET,SOCK_DGRAM,0); - if (mSocketFD<0) { - perror("socket() failed"); - throw SocketError(); - } - - // pat added: This lets the socket be reused immediately, which is needed if OpenBTS crashes. - int on = 1; - setsockopt(mSocketFD, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); - - - // bind - struct sockaddr_in address; - size_t length = sizeof(address); - bzero(&address,length); - address.sin_family = AF_INET; - address.sin_addr.s_addr = inet_addr(wlocalIP); - address.sin_port = htons(localPort); - if (bind(mSocketFD,(struct sockaddr*)&address,length)<0) { - perror("bind() failed"); - throw SocketError(); - } -} - - - -unsigned short UDPSocket::port() const -{ - struct sockaddr_in name; - socklen_t nameSize = sizeof(name); - int retVal = getsockname(mSocketFD, (struct sockaddr*)&name, &nameSize); - if (retVal==-1) throw SocketError(); - return ntohs(name.sin_port); -} - -// vim:ts=4:sw=4 diff --git a/CommonLibs/Sockets.h b/CommonLibs/Sockets.h deleted file mode 100644 index 71b8b22f..00000000 --- a/CommonLibs/Sockets.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -* Copyright 2008, 2010 Free Software Foundation, Inc. -* -* This software is distributed under the terms of the GNU Affero Public License. -* See the COPYING file in the main directory for details. -* -* This use of this software may be subject to additional restrictions. -* See the LEGAL file in the main directory for details. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -*/ - - -#ifndef SOCKETS_H -#define SOCKETS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - - - - -#define MAX_UDP_LENGTH 1500 - -/** A function to resolve IP host names. */ -bool resolveAddress(struct sockaddr_in *address, const char *host, unsigned short port); - -/** Resolve an address of the form ":". */ -bool resolveAddress(struct sockaddr_in *address, const char *hostAndPort); - -/** An exception to throw when a critical socket operation fails. */ -class SocketError {}; -#define SOCKET_ERROR {throw SocketError(); } - -/** Abstract class for connectionless sockets. */ -class DatagramSocket { - -protected: - - int mSocketFD; ///< underlying file descriptor - char mDestination[256]; ///< address to which packets are sent - char mSource[256]; ///< return address of most recent received packet - -public: - - /** An almost-does-nothing constructor. */ - DatagramSocket(); - - virtual ~DatagramSocket(); - - /** Return the address structure size for this socket type. */ - virtual size_t addressSize() const = 0; - - /** - Send a binary packet. - @param buffer The data bytes to send to mDestination. - @param length Number of bytes to send, or strlen(buffer) if defaulted to -1. - @return number of bytes written, or -1 on error. - */ - int write( const char * buffer, size_t length); - - /** - Send a C-style string packet. - @param buffer The data bytes to send to mDestination. - @return number of bytes written, or -1 on error. - */ - int write( const char * buffer); - - /** - Send a binary packet. - @param buffer The data bytes to send to mSource. - @param length Number of bytes to send, or strlen(buffer) if defaulted to -1. - @return number of bytes written, or -1 on error. - */ - int writeBack(const char * buffer, size_t length); - - /** - Send a C-style string packet. - @param buffer The data bytes to send to mSource. - @return number of bytes written, or -1 on error. - */ - int writeBack(const char * buffer); - - - /** - Receive a packet. - @param buffer A char[MAX_UDP_LENGTH] procured by the caller. - @return The number of bytes received or -1 on non-blocking pass. - */ - int read(char* buffer, size_t length); - - /** - Receive a packet with a timeout. - @param buffer A char[MAX_UDP_LENGTH] procured by the caller. - @param maximum wait time in milliseconds - @return The number of bytes received or -1 on timeout. - */ - int read(char* buffer, size_t length, unsigned timeout); - - - /** Send a packet to a given destination, other than the default. */ - int send(const struct sockaddr *dest, const char * buffer, size_t length); - - /** Send a C-style string to a given destination, other than the default. */ - int send(const struct sockaddr *dest, const char * buffer); - - /** Make the socket non-blocking. */ - void nonblocking(); - - /** Make the socket blocking (the default). */ - void blocking(); - - /** Close the socket. */ - void close(); - -}; - - - -/** UDP/IP User Datagram Socket */ -class UDPSocket : public DatagramSocket { - -public: - - /** Open a USP socket with an OS-assigned port and no default destination. */ - UDPSocket(const char *localIP, unsigned short localPort); - - /** Given a full specification, open the socket and set the dest address. */ - UDPSocket(const char *localIP, unsigned short localPort, - const char *remoteIP, unsigned short remotePort); - - /** Set the destination port. */ - void destination( unsigned short wDestPort, const char * wDestIP ); - - /** Return the actual port number in use. */ - unsigned short port() const; - - /** Open and bind the UDP socket to a local port. */ - void open(unsigned short localPort=0, const char *wlocalIP="127.0.0.1"); - - /** Give the return address of the most recently received packet. */ - const struct sockaddr_in* source() const { return (const struct sockaddr_in*)mSource; } - - size_t addressSize() const { return sizeof(struct sockaddr_in); } - -}; - -#endif - - - -// vim:ts=4:sw=4 diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index 4fc277bf..58e8719e 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -32,6 +32,7 @@ extern "C" { #include "proto_trxd.h" #include +#include } #ifdef HAVE_CONFIG_H @@ -120,8 +121,7 @@ Transceiver::Transceiver(int wBasePort, RadioInterface *wRadioInterface, double wRssiOffset, int wStackSize) : mBasePort(wBasePort), mLocalAddr(TRXAddress), mRemoteAddr(GSMcoreAddress), - mClockSocket(TRXAddress, wBasePort, GSMcoreAddress, wBasePort + 100), - mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface), + mClockSocket(-1), mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface), rssiOffset(wRssiOffset), stackSize(wStackSize), mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mEdge(false), mOn(false), mForceClockInterface(false), mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0), @@ -142,14 +142,19 @@ Transceiver::~Transceiver() sigProcLibDestroy(); + if (mClockSocket >= 0) + close(mClockSocket); + for (size_t i = 0; i < mChans; i++) { mControlServiceLoopThreads[i]->cancel(); mControlServiceLoopThreads[i]->join(); delete mControlServiceLoopThreads[i]; mTxPriorityQueues[i].clear(); - delete mCtrlSockets[i]; - delete mDataSockets[i]; + if (mCtrlSockets[i] >= 0) + close(mCtrlSockets[i]); + if (mDataSockets[i] >= 0) + close(mDataSockets[i]); } } @@ -180,8 +185,8 @@ bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay, mExtRACH = ext_rach; mEdge = edge; - mDataSockets.resize(mChans); - mCtrlSockets.resize(mChans); + mDataSockets.resize(mChans, -1); + mCtrlSockets.resize(mChans, -1); mControlServiceLoopThreads.resize(mChans); mTxPriorityQueueServiceLoopThreads.resize(mChans); mRxServiceLoopThreads.resize(mChans); @@ -195,14 +200,30 @@ bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay, mStates[0].mRetrans = true; /* Setup sockets */ + mClockSocket = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, + mLocalAddr.c_str(), mBasePort, + mRemoteAddr.c_str(), mBasePort + 100, + OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT); + for (size_t i = 0; i < mChans; i++) { c_srcport = mBasePort + 2 * i + 1; c_dstport = mBasePort + 2 * i + 101; d_srcport = mBasePort + 2 * i + 2; d_dstport = mBasePort + 2 * i + 102; - mCtrlSockets[i] = new UDPSocket(mLocalAddr.c_str(), c_srcport, mRemoteAddr.c_str(), c_dstport); - mDataSockets[i] = new UDPSocket(mLocalAddr.c_str(), d_srcport, mRemoteAddr.c_str(), d_dstport); + mCtrlSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, + mLocalAddr.c_str(), c_srcport, + mRemoteAddr.c_str(), c_dstport, + OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT); + if (mCtrlSockets[i] < 0) + return false; + + mDataSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, + mLocalAddr.c_str(), d_srcport, + mRemoteAddr.c_str(), d_dstport, + OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT); + if (mCtrlSockets[i] < 0) + return false; } /* Randomize the central clock */ @@ -707,9 +728,11 @@ void Transceiver::driveControl(size_t chan) int msgLen; /* Attempt to read from control socket */ - msgLen = mCtrlSockets[chan]->read(buffer, MAX_PACKET_LENGTH); - if (msgLen < 1) + msgLen = read(mCtrlSockets[chan], buffer, MAX_PACKET_LENGTH); + if (msgLen <= 0) { + LOGCHAN(chan, DTRXCTRL, WARNING) << "mCtrlSockets read(" << mCtrlSockets[chan] << ") failed: " << msgLen; return; + } /* Zero-terminate received string */ buffer[msgLen] = '\0'; @@ -854,16 +877,23 @@ void Transceiver::driveControl(size_t chan) } LOGCHAN(chan, DTRXCTRL, INFO) << "response is '" << response << "'"; - mCtrlSockets[chan]->write(response, strlen(response) + 1); + msgLen = write(mCtrlSockets[chan], response, strlen(response) + 1); + if (msgLen <= 0) + LOGCHAN(chan, DTRXCTRL, WARNING) << "mCtrlSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen; } bool Transceiver::driveTxPriorityQueue(size_t chan) { + int msgLen; int burstLen; char buffer[EDGE_BURST_NBITS + 50]; // check data socket - size_t msgLen = mDataSockets[chan]->read(buffer, sizeof(buffer)); + msgLen = read(mDataSockets[chan], buffer, sizeof(buffer)); + if (msgLen <= 0) { + LOGCHAN(chan, DTRXCTRL, WARNING) << "mDataSockets read(" << mCtrlSockets[chan] << ") failed: " << msgLen; + return false; + } if (msgLen == gSlotLen + 1 + 4 + 1) { burstLen = gSlotLen; @@ -937,6 +967,7 @@ void Transceiver::logRxBurst(size_t chan, const struct trx_ul_burst_ind *bi) void Transceiver::driveReceiveFIFO(size_t chan) { + int msgLen; int TOAint; // in 1/256 symbols struct trx_ul_burst_ind bi; @@ -963,7 +994,9 @@ void Transceiver::driveReceiveFIFO(size_t chan) /* +1: Historical reason. There's an uninitizalied byte in there: pkt->soft_bits[bi.nbits] */ pkt->soft_bits[bi.nbits + 1] = '\0'; - mDataSockets[chan]->write(burstString, sizeof(struct trxd_hdr_v0) + bi.nbits + 2); + msgLen = write(mDataSockets[chan], burstString, sizeof(struct trxd_hdr_v0) + bi.nbits + 2); + if (msgLen <= 0) + LOGCHAN(chan, DTRXCTRL, WARNING) << "mDataSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen; } void Transceiver::driveTxFIFO() @@ -1023,13 +1056,16 @@ void Transceiver::driveTxFIFO() void Transceiver::writeClockInterface() { + int msgLen; char command[50]; // FIXME -- This should be adaptive. sprintf(command,"IND CLOCK %llu",(unsigned long long) (mTransmitDeadlineClock.FN()+2)); LOG(INFO) << "ClockInterface: sending " << command; - mClockSocket.write(command, strlen(command) + 1); + msgLen = write(mClockSocket, command, strlen(command) + 1); + if (msgLen <= 0) + LOG(WARNING) << "mClockSocket write(" << mClockSocket << ") failed: " << msgLen; mLastClockUpdateTime = mTransmitDeadlineClock; diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h index 80047b34..e4d04409 100644 --- a/Transceiver52M/Transceiver.h +++ b/Transceiver52M/Transceiver.h @@ -25,7 +25,6 @@ #include "radioInterface.h" #include "Interthread.h" #include "GSMCommon.h" -#include "Sockets.h" #include #include @@ -167,9 +166,9 @@ private: std::string mLocalAddr; std::string mRemoteAddr; - std::vector mDataSockets; ///< socket for writing to/reading from GSM core - std::vector mCtrlSockets; ///< socket for writing/reading control commands from GSM core - UDPSocket mClockSocket; ///< socket for writing clock updates to GSM core + std::vector mDataSockets; ///< socket for writing to/reading from GSM core + std::vector mCtrlSockets; ///< socket for writing/reading control commands from GSM core + int mClockSocket; ///< socket for writing clock updates to GSM core std::vector mTxPriorityQueues; ///< priority queue of transmit bursts received from GSM core std::vector mReceiveFIFO; ///< radioInterface FIFO of receive bursts diff --git a/tests/CommonLibs/Makefile.am b/tests/CommonLibs/Makefile.am index 2a9a0216..26b49e2f 100644 --- a/tests/CommonLibs/Makefile.am +++ b/tests/CommonLibs/Makefile.am @@ -6,7 +6,6 @@ AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) $(LIBOSMOVTY_LIBS) EXTRA_DIST = BitVectorTest.ok \ PRBSTest.ok \ InterthreadTest.ok \ - SocketsTest.ok \ TimevalTest.ok \ VectorTest.ok \ LogTest.ok \ @@ -16,7 +15,6 @@ noinst_PROGRAMS = \ BitVectorTest \ PRBSTest \ InterthreadTest \ - SocketsTest \ TimevalTest \ VectorTest \ LogTest @@ -30,10 +28,6 @@ InterthreadTest_SOURCES = InterthreadTest.cpp InterthreadTest_LDADD = $(COMMON_LA) InterthreadTest_LDFLAGS = -lpthread $(AM_LDFLAGS) -SocketsTest_SOURCES = SocketsTest.cpp -SocketsTest_LDADD = $(COMMON_LA) -SocketsTest_LDFLAGS = -lpthread $(AM_LDFLAGS) - TimevalTest_SOURCES = TimevalTest.cpp TimevalTest_LDADD = $(COMMON_LA) diff --git a/tests/CommonLibs/SocketsTest.cpp b/tests/CommonLibs/SocketsTest.cpp deleted file mode 100644 index e4eef545..00000000 --- a/tests/CommonLibs/SocketsTest.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* -* Copyright 2008 Free Software Foundation, Inc. -* -* -* This software is distributed under the terms of the GNU Affero Public License. -* See the COPYING file in the main directory for details. -* -* This use of this software may be subject to additional restrictions. -* See the LEGAL file in the main directory for details. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -*/ - - - - -#include "Sockets.h" -#include "Threads.h" -#include -#include -#include -#include - -static const int gNumToSend = 10; - -static void sigalarm_handler(int foo) -{ - printf("FAIL: test did not run successfully\n"); - exit(EXIT_FAILURE); -} - -void *testReaderIP(void *param) -{ - UDPSocket *readSocket = (UDPSocket *)param; - readSocket->nonblocking(); - int rc = 0; - while (rcread(buf, MAX_UDP_LENGTH); - if (count>0) { - buf[count] = 0; - CERR("read: " << buf); - rc++; - } else { - sleep(2); - } - } - return NULL; -} - -int main(int argc, char * argv[] ) -{ - int count; - - if (signal(SIGALRM, sigalarm_handler) == SIG_ERR) { - perror("signal"); - exit(EXIT_FAILURE); - } - - /* If the test takes longer than 2*gNumToSend seconds, abort it */ - alarm(2* gNumToSend); - - UDPSocket readSocket("127.0.0.1", 0); - UDPSocket socket1("127.0.0.1", 0, "localhost", readSocket.port()); - - CERR("socket1: " << socket1.port() << ", readSocket: " << readSocket.port()); - - Thread readerThreadIP; - readerThreadIP.start(testReaderIP, &readSocket); - - // give the readers time to open - sleep(1); - - for (int i=0; i expout AT_CHECK([$abs_top_builddir/tests/CommonLibs/PRBSTest], [], [expout], []) AT_CLEANUP -AT_SETUP([SocketsTest]) -AT_KEYWORDS([SocketsTest]) -cat $abs_srcdir/CommonLibs/SocketsTest.ok > expout -AT_CHECK([$abs_top_builddir/tests/CommonLibs/SocketsTest], [], [expout], [ignore]) -AT_CLEANUP - AT_SETUP([TimevalTest]) AT_KEYWORDS([TimevalTest]) cat $abs_srcdir/CommonLibs/TimevalTest.ok > expout