aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M
diff options
context:
space:
mode:
Diffstat (limited to 'Transceiver52M')
-rw-r--r--Transceiver52M/Transceiver.cpp64
-rw-r--r--Transceiver52M/Transceiver.h7
2 files changed, 53 insertions, 18 deletions
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 4fc277b..58e8719 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -32,6 +32,7 @@ extern "C" {
#include "proto_trxd.h"
#include <osmocom/core/bits.h>
+#include <osmocom/core/socket.h>
}
#ifdef HAVE_CONFIG_H
@@ -120,8 +121,7 @@ Transceiver::Transceiver(int wBasePort,
RadioInterface *wRadioInterface,
double wRssiOffset, int wStackSize)
: mBasePort(wBasePort), mLocalAddr(TRXAddress), mRemoteAddr(GSMcoreAddress),
- mClockSocket(TRXAddress, wBasePort, GSMcoreAddress, wBasePort + 100),
- mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),
+ mClockSocket(-1), mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),
rssiOffset(wRssiOffset), stackSize(wStackSize),
mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mEdge(false), mOn(false), mForceClockInterface(false),
mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0),
@@ -142,14 +142,19 @@ Transceiver::~Transceiver()
sigProcLibDestroy();
+ if (mClockSocket >= 0)
+ close(mClockSocket);
+
for (size_t i = 0; i < mChans; i++) {
mControlServiceLoopThreads[i]->cancel();
mControlServiceLoopThreads[i]->join();
delete mControlServiceLoopThreads[i];
mTxPriorityQueues[i].clear();
- delete mCtrlSockets[i];
- delete mDataSockets[i];
+ if (mCtrlSockets[i] >= 0)
+ close(mCtrlSockets[i]);
+ if (mDataSockets[i] >= 0)
+ close(mDataSockets[i]);
}
}
@@ -180,8 +185,8 @@ bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay,
mExtRACH = ext_rach;
mEdge = edge;
- mDataSockets.resize(mChans);
- mCtrlSockets.resize(mChans);
+ mDataSockets.resize(mChans, -1);
+ mCtrlSockets.resize(mChans, -1);
mControlServiceLoopThreads.resize(mChans);
mTxPriorityQueueServiceLoopThreads.resize(mChans);
mRxServiceLoopThreads.resize(mChans);
@@ -195,14 +200,30 @@ bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay,
mStates[0].mRetrans = true;
/* Setup sockets */
+ mClockSocket = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,
+ mLocalAddr.c_str(), mBasePort,
+ mRemoteAddr.c_str(), mBasePort + 100,
+ OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);
+
for (size_t i = 0; i < mChans; i++) {
c_srcport = mBasePort + 2 * i + 1;
c_dstport = mBasePort + 2 * i + 101;
d_srcport = mBasePort + 2 * i + 2;
d_dstport = mBasePort + 2 * i + 102;
- mCtrlSockets[i] = new UDPSocket(mLocalAddr.c_str(), c_srcport, mRemoteAddr.c_str(), c_dstport);
- mDataSockets[i] = new UDPSocket(mLocalAddr.c_str(), d_srcport, mRemoteAddr.c_str(), d_dstport);
+ mCtrlSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,
+ mLocalAddr.c_str(), c_srcport,
+ mRemoteAddr.c_str(), c_dstport,
+ OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);
+ if (mCtrlSockets[i] < 0)
+ return false;
+
+ mDataSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,
+ mLocalAddr.c_str(), d_srcport,
+ mRemoteAddr.c_str(), d_dstport,
+ OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);
+ if (mCtrlSockets[i] < 0)
+ return false;
}
/* Randomize the central clock */
@@ -707,9 +728,11 @@ void Transceiver::driveControl(size_t chan)
int msgLen;
/* Attempt to read from control socket */
- msgLen = mCtrlSockets[chan]->read(buffer, MAX_PACKET_LENGTH);
- if (msgLen < 1)
+ msgLen = read(mCtrlSockets[chan], buffer, MAX_PACKET_LENGTH);
+ if (msgLen <= 0) {
+ LOGCHAN(chan, DTRXCTRL, WARNING) << "mCtrlSockets read(" << mCtrlSockets[chan] << ") failed: " << msgLen;
return;
+ }
/* Zero-terminate received string */
buffer[msgLen] = '\0';
@@ -854,16 +877,23 @@ void Transceiver::driveControl(size_t chan)
}
LOGCHAN(chan, DTRXCTRL, INFO) << "response is '" << response << "'";
- mCtrlSockets[chan]->write(response, strlen(response) + 1);
+ msgLen = write(mCtrlSockets[chan], response, strlen(response) + 1);
+ if (msgLen <= 0)
+ LOGCHAN(chan, DTRXCTRL, WARNING) << "mCtrlSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen;
}
bool Transceiver::driveTxPriorityQueue(size_t chan)
{
+ int msgLen;
int burstLen;
char buffer[EDGE_BURST_NBITS + 50];
// check data socket
- size_t msgLen = mDataSockets[chan]->read(buffer, sizeof(buffer));
+ msgLen = read(mDataSockets[chan], buffer, sizeof(buffer));
+ if (msgLen <= 0) {
+ LOGCHAN(chan, DTRXCTRL, WARNING) << "mDataSockets read(" << mCtrlSockets[chan] << ") failed: " << msgLen;
+ return false;
+ }
if (msgLen == gSlotLen + 1 + 4 + 1) {
burstLen = gSlotLen;
@@ -937,6 +967,7 @@ void Transceiver::logRxBurst(size_t chan, const struct trx_ul_burst_ind *bi)
void Transceiver::driveReceiveFIFO(size_t chan)
{
+ int msgLen;
int TOAint; // in 1/256 symbols
struct trx_ul_burst_ind bi;
@@ -963,7 +994,9 @@ void Transceiver::driveReceiveFIFO(size_t chan)
/* +1: Historical reason. There's an uninitizalied byte in there: pkt->soft_bits[bi.nbits] */
pkt->soft_bits[bi.nbits + 1] = '\0';
- mDataSockets[chan]->write(burstString, sizeof(struct trxd_hdr_v0) + bi.nbits + 2);
+ msgLen = write(mDataSockets[chan], burstString, sizeof(struct trxd_hdr_v0) + bi.nbits + 2);
+ if (msgLen <= 0)
+ LOGCHAN(chan, DTRXCTRL, WARNING) << "mDataSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen;
}
void Transceiver::driveTxFIFO()
@@ -1023,13 +1056,16 @@ void Transceiver::driveTxFIFO()
void Transceiver::writeClockInterface()
{
+ int msgLen;
char command[50];
// FIXME -- This should be adaptive.
sprintf(command,"IND CLOCK %llu",(unsigned long long) (mTransmitDeadlineClock.FN()+2));
LOG(INFO) << "ClockInterface: sending " << command;
- mClockSocket.write(command, strlen(command) + 1);
+ msgLen = write(mClockSocket, command, strlen(command) + 1);
+ if (msgLen <= 0)
+ LOG(WARNING) << "mClockSocket write(" << mClockSocket << ") failed: " << msgLen;
mLastClockUpdateTime = mTransmitDeadlineClock;
diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h
index 80047b3..e4d0440 100644
--- a/Transceiver52M/Transceiver.h
+++ b/Transceiver52M/Transceiver.h
@@ -25,7 +25,6 @@
#include "radioInterface.h"
#include "Interthread.h"
#include "GSMCommon.h"
-#include "Sockets.h"
#include <sys/types.h>
#include <sys/socket.h>
@@ -167,9 +166,9 @@ private:
std::string mLocalAddr;
std::string mRemoteAddr;
- std::vector<UDPSocket *> mDataSockets; ///< socket for writing to/reading from GSM core
- std::vector<UDPSocket *> mCtrlSockets; ///< socket for writing/reading control commands from GSM core
- UDPSocket mClockSocket; ///< socket for writing clock updates to GSM core
+ std::vector<int> mDataSockets; ///< socket for writing to/reading from GSM core
+ std::vector<int> mCtrlSockets; ///< socket for writing/reading control commands from GSM core
+ int mClockSocket; ///< socket for writing clock updates to GSM core
std::vector<VectorQueue> mTxPriorityQueues; ///< priority queue of transmit bursts received from GSM core
std::vector<VectorFIFO *> mReceiveFIFO; ///< radioInterface FIFO of receive bursts