<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>