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