aboutsummaryrefslogtreecommitdiffstats
path: root/CommonLibs
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-07-01 19:03:49 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-07-02 15:07:25 +0200
commitb9d2515704ac83cacd88d0a73ecba30323df0b2d (patch)
tree847de653ee1378fd4953e52bc302dcfbc2f9c6db /CommonLibs
parent7dc07b9425e2400c314248811f57091cb0ec7c07 (diff)
Transceiver: replace UDPSocket with libosmocore socket API
We have a good socket API in libosmocore, let's drop osmo-trx socket API and use libosmocore's one instead of maintaining the two of them. Change-Id: Ib19856a3e0a7607f63436c4a80b1381a3f318764
Diffstat (limited to 'CommonLibs')
-rw-r--r--CommonLibs/Makefile.am2
-rw-r--r--CommonLibs/Sockets.cpp287
-rw-r--r--CommonLibs/Sockets.h173
3 files changed, 0 insertions, 462 deletions
diff --git a/CommonLibs/Makefile.am b/CommonLibs/Makefile.am
index 22572e1..2c449e0 100644
--- a/CommonLibs/Makefile.am
+++ b/CommonLibs/Makefile.am
@@ -30,7 +30,6 @@ noinst_LTLIBRARIES = libcommon.la
libcommon_la_SOURCES = \
BitVector.cpp \
LinkedLists.cpp \
- Sockets.cpp \
Threads.cpp \
Timeval.cpp \
Logger.cpp \
@@ -45,7 +44,6 @@ noinst_HEADERS = \
PRBS.h \
Interthread.h \
LinkedLists.h \
- Sockets.h \
Threads.h \
Timeval.h \
Vector.h \
diff --git a/CommonLibs/Sockets.cpp b/CommonLibs/Sockets.cpp
deleted file mode 100644
index ce8e3d5..0000000
--- a/CommonLibs/Sockets.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
-* Copyright 2008, 2010 Free Software Foundation, Inc.
-*
-*
-* This software is distributed under the terms of the GNU Affero Public License.
-* See the COPYING file in the main directory for details.
-*
-* This use of this software may be subject to additional restrictions.
-* See the LEGAL file in the main directory for details.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-
-#include <config.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <cstdio>
-#include <sys/select.h>
-
-#include "Threads.h"
-#include "Sockets.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <string.h>
-#include <stdlib.h>
-
-
-
-
-
-
-bool resolveAddress(struct sockaddr_in *address, const char *hostAndPort)
-{
- assert(address);
- assert(hostAndPort);
- char *copy = strdup(hostAndPort);
- char *colon = strchr(copy,':');
- if (!colon) return false;
- *colon = '\0';
- char *host = copy;
- unsigned port = strtol(colon+1,NULL,10);
- bool retVal = resolveAddress(address,host,port);
- free(copy);
- return retVal;
-}
-
-bool resolveAddress(struct sockaddr_in *address, const char *host, unsigned short port)
-{
- assert(address);
- assert(host);
- // FIXME -- Need to ignore leading/trailing spaces in hostname.
- struct hostent *hp;
- int h_errno_local;
-#ifdef HAVE_GETHOSTBYNAME2_R
- struct hostent hostData;
- char tmpBuffer[2048];
-
- // There are different flavors of gethostbyname_r(), but
- // latest Linux use the following form:
- if (gethostbyname2_r(host, AF_INET, &hostData, tmpBuffer, sizeof(tmpBuffer), &hp, &h_errno_local)!=0) {
- CERR("WARNING -- gethostbyname2_r() failed for " << host << ", " << hstrerror(h_errno_local));
- return false;
- }
-#else
- static Mutex sGethostbynameMutex;
- // gethostbyname() is NOT thread-safe, so we should use a mutex here.
- // Ideally it should be a global mutex for all non thread-safe socket
- // operations and it should protect access to variables such as
- // global h_errno.
- sGethostbynameMutex.lock();
- hp = gethostbyname(host);
- h_errno_local = h_errno;
- sGethostbynameMutex.unlock();
-#endif
- if (hp==NULL) {
- CERR("WARNING -- gethostbyname() failed for " << host << ", " << hstrerror(h_errno_local));
- return false;
- }
- if (hp->h_addrtype != AF_INET) {
- CERR("WARNING -- gethostbyname() resolved " << host << " to something other then AF_INET");
- return false;
- }
- address->sin_family = hp->h_addrtype;
- assert(sizeof(address->sin_addr) == hp->h_length);
- memcpy(&(address->sin_addr), hp->h_addr_list[0], hp->h_length);
- address->sin_port = htons(port);
- return true;
-}
-
-
-
-DatagramSocket::DatagramSocket()
-{
- memset(mDestination, 0, sizeof(mDestination));
-}
-
-
-
-
-
-void DatagramSocket::nonblocking()
-{
- fcntl(mSocketFD,F_SETFL,O_NONBLOCK);
-}
-
-void DatagramSocket::blocking()
-{
- fcntl(mSocketFD,F_SETFL,0);
-}
-
-void DatagramSocket::close()
-{
- ::close(mSocketFD);
-}
-
-
-DatagramSocket::~DatagramSocket()
-{
- close();
-}
-
-
-
-
-
-int DatagramSocket::write( const char * message, size_t length )
-{
- assert(length<=MAX_UDP_LENGTH);
- int retVal = sendto(mSocketFD, message, length, 0,
- (struct sockaddr *)mDestination, addressSize());
- if (retVal == -1 ) perror("DatagramSocket::write() failed");
- return retVal;
-}
-
-int DatagramSocket::writeBack( const char * message, size_t length )
-{
- assert(length<=MAX_UDP_LENGTH);
- int retVal = sendto(mSocketFD, message, length, 0,
- (struct sockaddr *)mSource, addressSize());
- if (retVal == -1 ) perror("DatagramSocket::write() failed");
- return retVal;
-}
-
-
-
-int DatagramSocket::write( const char * message)
-{
- size_t length=strlen(message)+1;
- return write(message,length);
-}
-
-int DatagramSocket::writeBack( const char * message)
-{
- size_t length=strlen(message)+1;
- return writeBack(message,length);
-}
-
-
-
-int DatagramSocket::send(const struct sockaddr* dest, const char * message, size_t length )
-{
- assert(length<=MAX_UDP_LENGTH);
- int retVal = sendto(mSocketFD, message, length, 0, dest, addressSize());
- if (retVal == -1 ) perror("DatagramSocket::send() failed");
- return retVal;
-}
-
-int DatagramSocket::send(const struct sockaddr* dest, const char * message)
-{
- size_t length=strlen(message)+1;
- return send(dest,message,length);
-}
-
-int DatagramSocket::read(char* buffer, size_t length)
-{
- socklen_t addr_len = sizeof(mSource);
- int rd_length = recvfrom(mSocketFD, (void *) buffer, length, 0,
- (struct sockaddr*) &mSource, &addr_len);
-
- if ((rd_length==-1) && (errno!=EAGAIN)) {
- perror("DatagramSocket::read() failed");
- throw SocketError();
- }
- return rd_length;
-}
-
-int DatagramSocket::read(char* buffer, size_t length, unsigned timeout)
-{
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(mSocketFD,&fds);
- struct timeval tv;
- tv.tv_sec = timeout/1000;
- tv.tv_usec = (timeout%1000)*1000;
- int sel = select(mSocketFD+1,&fds,NULL,NULL,&tv);
- if (sel<0) {
- perror("DatagramSocket::read() select() failed");
- throw SocketError();
- }
- if (sel==0) return -1;
- if (FD_ISSET(mSocketFD,&fds)) return read(buffer, length);
- return -1;
-}
-
-
-
-
-
-
-UDPSocket::UDPSocket(const char *wSrcIP, unsigned short wSrcPort)
- :DatagramSocket()
-{
- open(wSrcPort, wSrcIP);
-}
-
-
-UDPSocket::UDPSocket(const char *wSrcIP, unsigned short wSrcPort,
- const char *wDestIP, unsigned short wDestPort)
- :DatagramSocket()
-{
- open(wSrcPort, wSrcIP);
- destination(wDestPort, wDestIP);
-}
-
-
-
-void UDPSocket::destination( unsigned short wDestPort, const char * wDestIP )
-{
- resolveAddress((sockaddr_in*)mDestination, wDestIP, wDestPort );
-}
-
-
-void UDPSocket::open(unsigned short localPort, const char *wlocalIP)
-{
- // create
- mSocketFD = socket(AF_INET,SOCK_DGRAM,0);
- if (mSocketFD<0) {
- perror("socket() failed");
- throw SocketError();
- }
-
- // pat added: This lets the socket be reused immediately, which is needed if OpenBTS crashes.
- int on = 1;
- setsockopt(mSocketFD, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
-
-
- // bind
- struct sockaddr_in address;
- size_t length = sizeof(address);
- bzero(&address,length);
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = inet_addr(wlocalIP);
- address.sin_port = htons(localPort);
- if (bind(mSocketFD,(struct sockaddr*)&address,length)<0) {
- perror("bind() failed");
- throw SocketError();
- }
-}
-
-
-
-unsigned short UDPSocket::port() const
-{
- struct sockaddr_in name;
- socklen_t nameSize = sizeof(name);
- int retVal = getsockname(mSocketFD, (struct sockaddr*)&name, &nameSize);
- if (retVal==-1) throw SocketError();
- return ntohs(name.sin_port);
-}
-
-// vim:ts=4:sw=4
diff --git a/CommonLibs/Sockets.h b/CommonLibs/Sockets.h
deleted file mode 100644
index 71b8b22..0000000
--- a/CommonLibs/Sockets.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-* Copyright 2008, 2010 Free Software Foundation, Inc.
-*
-* This software is distributed under the terms of the GNU Affero Public License.
-* See the COPYING file in the main directory for details.
-*
-* This use of this software may be subject to additional restrictions.
-* See the LEGAL file in the main directory for details.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#ifndef SOCKETS_H
-#define SOCKETS_H
-
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <errno.h>
-#include <list>
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-
-
-
-
-
-#define MAX_UDP_LENGTH 1500
-
-/** A function to resolve IP host names. */
-bool resolveAddress(struct sockaddr_in *address, const char *host, unsigned short port);
-
-/** Resolve an address of the form "<host>:<port>". */
-bool resolveAddress(struct sockaddr_in *address, const char *hostAndPort);
-
-/** An exception to throw when a critical socket operation fails. */
-class SocketError {};
-#define SOCKET_ERROR {throw SocketError(); }
-
-/** Abstract class for connectionless sockets. */
-class DatagramSocket {
-
-protected:
-
- int mSocketFD; ///< underlying file descriptor
- char mDestination[256]; ///< address to which packets are sent
- char mSource[256]; ///< return address of most recent received packet
-
-public:
-
- /** An almost-does-nothing constructor. */
- DatagramSocket();
-
- virtual ~DatagramSocket();
-
- /** Return the address structure size for this socket type. */
- virtual size_t addressSize() const = 0;
-
- /**
- Send a binary packet.
- @param buffer The data bytes to send to mDestination.
- @param length Number of bytes to send, or strlen(buffer) if defaulted to -1.
- @return number of bytes written, or -1 on error.
- */
- int write( const char * buffer, size_t length);
-
- /**
- Send a C-style string packet.
- @param buffer The data bytes to send to mDestination.
- @return number of bytes written, or -1 on error.
- */
- int write( const char * buffer);
-
- /**
- Send a binary packet.
- @param buffer The data bytes to send to mSource.
- @param length Number of bytes to send, or strlen(buffer) if defaulted to -1.
- @return number of bytes written, or -1 on error.
- */
- int writeBack(const char * buffer, size_t length);
-
- /**
- Send a C-style string packet.
- @param buffer The data bytes to send to mSource.
- @return number of bytes written, or -1 on error.
- */
- int writeBack(const char * buffer);
-
-
- /**
- Receive a packet.
- @param buffer A char[MAX_UDP_LENGTH] procured by the caller.
- @return The number of bytes received or -1 on non-blocking pass.
- */
- int read(char* buffer, size_t length);
-
- /**
- Receive a packet with a timeout.
- @param buffer A char[MAX_UDP_LENGTH] procured by the caller.
- @param maximum wait time in milliseconds
- @return The number of bytes received or -1 on timeout.
- */
- int read(char* buffer, size_t length, unsigned timeout);
-
-
- /** Send a packet to a given destination, other than the default. */
- int send(const struct sockaddr *dest, const char * buffer, size_t length);
-
- /** Send a C-style string to a given destination, other than the default. */
- int send(const struct sockaddr *dest, const char * buffer);
-
- /** Make the socket non-blocking. */
- void nonblocking();
-
- /** Make the socket blocking (the default). */
- void blocking();
-
- /** Close the socket. */
- void close();
-
-};
-
-
-
-/** UDP/IP User Datagram Socket */
-class UDPSocket : public DatagramSocket {
-
-public:
-
- /** Open a USP socket with an OS-assigned port and no default destination. */
- UDPSocket(const char *localIP, unsigned short localPort);
-
- /** Given a full specification, open the socket and set the dest address. */
- UDPSocket(const char *localIP, unsigned short localPort,
- const char *remoteIP, unsigned short remotePort);
-
- /** Set the destination port. */
- void destination( unsigned short wDestPort, const char * wDestIP );
-
- /** Return the actual port number in use. */
- unsigned short port() const;
-
- /** Open and bind the UDP socket to a local port. */
- void open(unsigned short localPort=0, const char *wlocalIP="127.0.0.1");
-
- /** Give the return address of the most recently received packet. */
- const struct sockaddr_in* source() const { return (const struct sockaddr_in*)mSource; }
-
- size_t addressSize() const { return sizeof(struct sockaddr_in); }
-
-};
-
-#endif
-
-
-
-// vim:ts=4:sw=4