Commit 8dfee684 authored by Steven Murray's avatar Steven Murray
Browse files

Split the Transceiver class into the following two classes:

  GatewayTxRx: Sends and receives messages of the gateway<->aggregator protocol.
  RtcpTxRx   : Sends and receives messages of the RTCOPY prototcol.
parent f4f13330
......@@ -37,6 +37,7 @@ namespace aggregator {
const size_t HDRBUFSIZ = 3 * sizeof(uint32_t);
const size_t HOSTNAMEBUFLEN = 256;
const int LISTENBACKLOG = 2;
const int MAXINITMIGFILES = 2;
const size_t MSGBUFSIZ = 1024;
const int RTCPDNETRWTIMEOUT = 5;
const int RTCPDCALLBACKTIMEOUT = 5;
......
/******************************************************************************
* castor/tape/aggregator/GatewayTxRx.cpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*
* @author Nicola.Bessone@cern.ch Steven.Murray@cern.ch
*****************************************************************************/
#include "castor/Constants.hpp"
#include "castor/exception/Internal.hpp"
#include "castor/io/ClientSocket.hpp"
#include "castor/tape/aggregator/AggregatorDlfMessageConstants.hpp"
#include "castor/tape/aggregator/GatewayTxRx.hpp"
#include "castor/tape/aggregator/Utils.hpp"
#include "castor/tape/tapegateway/ErrorReport.hpp"
#include "castor/tape/tapegateway/FileToMigrate.hpp"
#include "castor/tape/tapegateway/FileToMigrateRequest.hpp"
#include "castor/tape/tapegateway/NoMoreFiles.hpp"
//-----------------------------------------------------------------------------
// getFileToMigrateFromGateway
//-----------------------------------------------------------------------------
bool castor::tape::aggregator::GatewayTxRx::getFileToMigrateFromGateway(
const std::string gatewayHost, const unsigned short gatewayPort,
const uint32_t transactionId, char (&filePath)[CA_MAXPATHLEN+1],
char (&recordFormat)[CA_MAXRECFMLEN+1], char (&nsHost)[CA_MAXHOSTNAMELEN],
uint64_t &fileId, uint32_t &tapeFileSeq) throw(castor::exception::Exception) {
// Prepare the request
tapegateway::FileToMigrateRequest request;
request.setTransactionId(transactionId);
// Connect to the tape gateway
castor::io::ClientSocket gatewaySocket(gatewayPort, gatewayHost);
gatewaySocket.connect();
// Send the request
gatewaySocket.sendObject(request);
// Receive the reply object wrapping it in an auto pointer so that it is
// automatically deallocated when it goes out of scope
std::auto_ptr<castor::IObject> reply(gatewaySocket.readObject());
// Close the connection to the tape gateway
gatewaySocket.close();
if(reply.get() == NULL) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Failed to get reply object from the tape gateway"
": ClientSocket::readObject() returned null";
throw ex;
}
// Temporary variable used to check for a transaction ID mistatch
uint64_t transactionIdFromGateway = 0;
switch(reply->type()) {
case OBJ_FileToMigrate:
// Copy the reply information
try {
tapegateway::FileToMigrate &file =
dynamic_cast<tapegateway::FileToMigrate&>(*reply);
transactionIdFromGateway = file.transactionId();
Utils::copyString(filePath, file.path());
Utils::copyString(recordFormat, file.recordFormat());
Utils::copyString(nsHost, file.nshost());
fileId = file.fileid();
tapeFileSeq = file.fseq();
} catch(std::bad_cast &bc) {
castor::exception::Internal ex;
ex.getMessage() << __PRETTY_FUNCTION__
<< "Failed to down cast reply object to tapegateway::FileToMigrate";
throw ex;
}
// If there is a transaction ID mismatch
if(transactionIdFromGateway != transactionId) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Transaction ID mismatch"
": Expected = " << transactionId
<< ": Actual = " << transactionIdFromGateway;
throw ex;
}
// There is a file to migrate
return true;
case OBJ_NoMoreFiles:
// Copy the reply information
try {
tapegateway::NoMoreFiles &noMoreFiles =
dynamic_cast<tapegateway::NoMoreFiles&>(*reply);
transactionIdFromGateway = noMoreFiles.transactionId();
} catch(std::bad_cast &bc) {
castor::exception::Internal ex;
ex.getMessage() << __PRETTY_FUNCTION__
<< "Failed to down cast reply object to tapegateway::NoMoreFiles";
throw ex;
}
// If there is a transaction ID mismatch
if(transactionIdFromGateway != transactionId) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Transaction ID mismatch"
": Expected = " << transactionId
<< ": Actual = " << transactionIdFromGateway;
throw ex;
}
// There are no more files to migrate
return false;
case OBJ_ErrorReport:
{
int errorCode;
std::string errorMessage;
// Copy the reply information
try {
tapegateway::ErrorReport &errorReport =
dynamic_cast<tapegateway::ErrorReport&>(*reply);
transactionIdFromGateway = errorReport.transactionId();
errorCode = errorReport.errorCode();
errorMessage = errorReport.errorMessage();
} catch(std::bad_cast &bc) {
castor::exception::Internal ex;
ex.getMessage() << __PRETTY_FUNCTION__
<< "Failed to down cast reply object to tapegateway::NoMoreFiles";
throw ex;
}
// If there is a transaction ID mismatch
if(transactionIdFromGateway != transactionId) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Transaction ID mismatch"
": Expected = " << transactionId
<< ": Actual = " << transactionIdFromGateway;
throw ex;
}
// Translate the reception of the error report into a C++ exception
castor::exception::Exception ex(errorCode);
ex.getMessage() << errorMessage;
throw ex;
}
break;
default:
{
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Unknown reply type "
": Reply type = " << reply->type();
throw ex;
}
}
}
/******************************************************************************
* castor/tape/aggregator/GatewayTxRx.hpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*
* @author Nicola.Bessone@cern.ch Steven.Murray@cern.ch
*****************************************************************************/
#ifndef CASTOR_TAPE_AGGREGATOR_GATEWAYTXRX_HPP
#define CASTOR_TAPE_AGGREGATOR_GATEWAYTXRX_HPP 1
#include "castor/exception/Exception.hpp"
#include "h/Castor_limits.h"
#include <stdint.h>
namespace castor {
namespace tape {
namespace aggregator {
/**
* Provides functions for sending and receiving the messages of the tape
* gateway <-> aggregator protocol.
*/
class GatewayTxRx {
public:
/**
* Gets a file to migrate from the tape tape gateway by sending and receiving
* the necessary messages.
*
* @param gatewayHost The tape gateway host name.
* @param gatewayPort The tape gateway port number.
* @param transactionId The transaction ID to be sent to the tape gateway.
* the tape gateway which should match the value sent.
* @param filePath Out parameter: The path of the disk file.
* @param recordFormat Out parameter: The record format.
* @param nsHost Out parameter: The name server host.
* @param fileId Out parmeter: The CASTOR file ID.
* @param tapeFileSeq Out parameter: The tape file sequence number.
* @return True if there is file to migrate.
*/
static bool getFileToMigrateFromGateway(const std::string gatewayHost,
const unsigned short gatewayPort, const uint32_t transactionId,
char (&filePath)[CA_MAXPATHLEN+1], char (&recordFormat)[CA_MAXRECFMLEN+1],
char (&nsHost)[CA_MAXHOSTNAMELEN], uint64_t &fileId, uint32_t &tapeFileSeq)
throw(castor::exception::Exception);
private:
/**
* Private constructor to inhibit instances of this class from being
* instantiated.
*/
GatewayTxRx() {}
}; // class GatewayTxRx
} // namespace aggregator
} // namespace tape
} // namespace castor
#endif // CASTOR_TAPE_AGGREGATOR_GATEWAYTXRX_HPP
......@@ -70,12 +70,13 @@ AGGREGATORBIN_SRCS = \
AggregatorDlfMessageStrings.cpp \
AggregatorDaemon.cpp \
AggregatorMain.cpp \
GatewayTxRx.cpp \
Marshaller.cpp \
Net.cpp \
RcpJobSubmitter.cpp \
RtcpTxRx.cpp \
SmartFd.cpp \
TapeDiskRqstHandler.cpp \
Transceiver.cpp \
Utils.cpp \
VdqmRequestHandlerThread.cpp \
$(TAPEGATEWAY_MESSAGES_SRCS) \
......
/******************************************************************************
* castor/tape/aggregator/Transceiver.cpp
* castor/tape/aggregator/RtcpTxRx.cpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
......@@ -22,14 +22,19 @@
* @author Nicola.Bessone@cern.ch Steven.Murray@cern.ch
*****************************************************************************/
#include "castor/Constants.hpp"
#include "castor/exception/Internal.hpp"
#include "castor/tape/aggregator/AggregatorDlfMessageConstants.hpp"
#include "castor/tape/aggregator/Constants.hpp"
#include "castor/tape/aggregator/Marshaller.hpp"
#include "castor/tape/aggregator/Net.hpp"
#include "castor/tape/aggregator/Transceiver.hpp"
#include "castor/tape/aggregator/RtcpTxRx.hpp"
#include "castor/tape/aggregator/RcpJobSubmitter.hpp"
#include "castor/tape/aggregator/Utils.hpp"
#include "castor/tape/tapegateway/ErrorReport.hpp"
#include "castor/tape/tapegateway/FileToMigrate.hpp"
#include "castor/tape/tapegateway/FileToMigrateRequest.hpp"
#include "castor/tape/tapegateway/NoMoreFiles.hpp"
#include "h/common.h"
#include "h/rtcp.h"
#include "h/rtcp_constants.h"
......@@ -42,7 +47,7 @@
//-----------------------------------------------------------------------------
// getRequestInfoFromRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::getRequestInfoFromRtcpd(
void castor::tape::aggregator::RtcpTxRx::getRequestInfoFromRtcpd(
const int socketFd, const int netReadWriteTimeout,
RtcpTapeRqstErrMsgBody &reply) throw(castor::exception::Exception) {
......@@ -134,7 +139,7 @@ void castor::tape::aggregator::Transceiver::getRequestInfoFromRtcpd(
//-----------------------------------------------------------------------------
// giveVolumeInfoToRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::giveVolumeInfoToRtcpd(
void castor::tape::aggregator::RtcpTxRx::giveVolumeInfoToRtcpd(
const int socketFd, const int netReadWriteTimeout,
RtcpTapeRqstErrMsgBody &request, RtcpTapeRqstErrMsgBody &reply)
throw(castor::exception::Exception) {
......@@ -196,7 +201,7 @@ void castor::tape::aggregator::Transceiver::giveVolumeInfoToRtcpd(
//-----------------------------------------------------------------------------
// giveFileInfoToRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::giveFileInfoToRtcpd(
void castor::tape::aggregator::RtcpTxRx::giveFileInfoToRtcpd(
const int socketFd, const int netReadWriteTimeout,
RtcpFileRqstErrMsgBody &request, RtcpFileRqstErrMsgBody &reply)
throw(castor::exception::Exception) {
......@@ -258,7 +263,7 @@ void castor::tape::aggregator::Transceiver::giveFileInfoToRtcpd(
//-----------------------------------------------------------------------------
// receiveRtcpAcknowledge
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRtcpAcknowledge(
void castor::tape::aggregator::RtcpTxRx::receiveRtcpAcknowledge(
const int socketFd, const int netReadWriteTimeout,
RtcpAcknowledgeMsg &message) throw(castor::exception::Exception) {
......@@ -298,7 +303,7 @@ void castor::tape::aggregator::Transceiver::receiveRtcpAcknowledge(
//-----------------------------------------------------------------------------
// sendRtcpAcknowledge
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::sendRtcpAcknowledge(
void castor::tape::aggregator::RtcpTxRx::sendRtcpAcknowledge(
const int socketFd, const int netReadWriteTimeout,
const RtcpAcknowledgeMsg &message) throw(castor::exception::Exception) {
......@@ -334,7 +339,7 @@ void castor::tape::aggregator::Transceiver::sendRtcpAcknowledge(
//-----------------------------------------------------------------------------
// pingRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::pingRtcpd(
void castor::tape::aggregator::RtcpTxRx::pingRtcpd(
const int socketFd, const int netReadWriteTimeout)
throw(castor::exception::Exception) {
......@@ -376,7 +381,7 @@ void castor::tape::aggregator::Transceiver::pingRtcpd(
//-----------------------------------------------------------------------------
// signalNoMoreRequestsToRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::signalNoMoreRequestsToRtcpd(
void castor::tape::aggregator::RtcpTxRx::signalNoMoreRequestsToRtcpd(
const int socketFd, const int netReadWriteTimeout)
throw(castor::exception::Exception) {
......@@ -436,7 +441,7 @@ void castor::tape::aggregator::Transceiver::signalNoMoreRequestsToRtcpd(
//-----------------------------------------------------------------------------
// receiveRcpJobRqst
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRcpJobRqst(
void castor::tape::aggregator::RtcpTxRx::receiveRcpJobRqst(
const int socketFd, const int netReadWriteTimeout,
RcpJobRqstMsgBody &request) throw(castor::exception::Exception) {
......@@ -538,7 +543,7 @@ void castor::tape::aggregator::Transceiver::receiveRcpJobRqst(
//-----------------------------------------------------------------------------
// giveRequestForMoreWorkToRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::giveRequestForMoreWorkToRtcpd(
void castor::tape::aggregator::RtcpTxRx::giveRequestForMoreWorkToRtcpd(
const int socketFd, const int netReadWriteTimeout, const uint32_t volReqId)
throw(castor::exception::Exception) {
......@@ -579,7 +584,7 @@ void castor::tape::aggregator::Transceiver::giveRequestForMoreWorkToRtcpd(
//-----------------------------------------------------------------------------
// giveFileListToRtcpd
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::giveFileListToRtcpd(
void castor::tape::aggregator::RtcpTxRx::giveFileListToRtcpd(
const int socketFd, const int netReadWriteTimeout, const uint32_t volReqId,
const char *const filePath, const char *const tapePath, const uint32_t umask,
const bool requestMoreWork) throw(castor::exception::Exception) {
......@@ -656,7 +661,7 @@ void castor::tape::aggregator::Transceiver::giveFileListToRtcpd(
//-----------------------------------------------------------------------------
// receiveRtcpMsgHeader
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRtcpMsgHeader(
void castor::tape::aggregator::RtcpTxRx::receiveRtcpMsgHeader(
const int socketFd, const int netReadWriteTimeout,
MessageHeader &header) throw(castor::exception::Exception) {
......@@ -694,7 +699,7 @@ void castor::tape::aggregator::Transceiver::receiveRtcpMsgHeader(
//-----------------------------------------------------------------------------
// receiveRtcpFileRqstErrBody
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRtcpFileRqstErrBody(
void castor::tape::aggregator::RtcpTxRx::receiveRtcpFileRqstErrBody(
const int socketFd, const int netReadWriteTimeout,
const MessageHeader &header, RtcpFileRqstErrMsgBody &body)
throw(castor::exception::Exception) {
......@@ -750,7 +755,7 @@ void castor::tape::aggregator::Transceiver::receiveRtcpFileRqstErrBody(
//-----------------------------------------------------------------------------
// receiveRtcpFileRqstBody
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRtcpFileRqstBody(
void castor::tape::aggregator::RtcpTxRx::receiveRtcpFileRqstBody(
const int socketFd, const int netReadWriteTimeout,
const MessageHeader &header, RtcpFileRqstMsgBody &body)
throw(castor::exception::Exception) {
......@@ -806,7 +811,7 @@ void castor::tape::aggregator::Transceiver::receiveRtcpFileRqstBody(
//-----------------------------------------------------------------------------
// receiveRtcpTapeRqstErrBody
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRtcpTapeRqstErrBody(
void castor::tape::aggregator::RtcpTxRx::receiveRtcpTapeRqstErrBody(
const int socketFd, const int netReadWriteTimeout,
const MessageHeader &header, RtcpTapeRqstErrMsgBody &body)
throw(castor::exception::Exception) {
......@@ -862,7 +867,7 @@ void castor::tape::aggregator::Transceiver::receiveRtcpTapeRqstErrBody(
//-----------------------------------------------------------------------------
// receiveRtcpTapeRqstBody
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::receiveRtcpTapeRqstBody(
void castor::tape::aggregator::RtcpTxRx::receiveRtcpTapeRqstBody(
const int socketFd, const int netReadWriteTimeout,
const MessageHeader &header, RtcpTapeRqstMsgBody &body)
throw(castor::exception::Exception) {
......@@ -918,7 +923,7 @@ void castor::tape::aggregator::Transceiver::receiveRtcpTapeRqstBody(
//-----------------------------------------------------------------------------
// checkMagic
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::checkMagic(const uint32_t expected,
void castor::tape::aggregator::RtcpTxRx::checkMagic(const uint32_t expected,
const uint32_t actual, const char *function)
throw(castor::exception::Exception) {
......@@ -940,7 +945,7 @@ void castor::tape::aggregator::Transceiver::checkMagic(const uint32_t expected,
//-----------------------------------------------------------------------------
// checkRtcopyReqType
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::checkRtcopyReqType(
void castor::tape::aggregator::RtcpTxRx::checkRtcopyReqType(
const uint32_t expected, const uint32_t actual, const char *function)
throw(castor::exception::Exception) {
......@@ -957,125 +962,3 @@ void castor::tape::aggregator::Transceiver::checkRtcopyReqType(
throw ex;
}
}
//-----------------------------------------------------------------------------
// getVolumeInfoFromGateway
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::getVolumeInfoFromGateway(
const std::string gatewayhost, const unsigned short gatewayPort,
const uint32_t volReqId, const char *const unit, char (&vid)[CA_MAXVIDLEN+1],
uint32_t &mode, char (&label)[CA_MAXLBLTYPLEN+1],
char (&density)[CA_MAXDENLEN+1], int &errorCode, std::string &errorMsg)
throw(castor::exception::Exception) {
/*
tapegateway::StartTransferRequest request;
request.setVdqmVolReqId(volReqId);
request.setUnit(unit);
// Connect to the tape gateway
castor::io::ClientSocket socket(gatewayPort, gatewayhost);
// Send the request for the volume information
socket.sendObject(request);
// Receive the volume information
std::auto_ptr<castor::IObject> obj(socket.readObject());
if(obj.get() == NULL) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Failed to get StartTransferResponse from tape gateway"
": ClientSocket::readObject() returned null";
throw ex;
}
std::auto_ptr<tapegateway::StartTransferResponse> response(
dynamic_cast<tapegateway::StartTransferResponse*>(obj.release()));
if(response.get() == NULL) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Failed to get StartTransferResponse from tape gateway"
": Failed to dynamic cast StartTransferResponse";
throw ex;
}
Utils::copyString(vid, response->vid().c_str());
mode = response->mode();
Utils::copyString(vid, response->label().c_str());
Utils::copyString(density, response->density().c_str());
errorCode = response->errorCode();
errorMsg = response->errorMessage();
*/
}
//-----------------------------------------------------------------------------
// getFileToMigrateFromGateway
//-----------------------------------------------------------------------------
void castor::tape::aggregator::Transceiver::getFileToMigrateFromGateway(
const std::string gatewayHost, const unsigned short gatewayPort,
const uint32_t volReqId, char (&filePath)[CA_MAXPATHLEN+1],
char (&tapeRecordFormat)[CA_MAXRECFMLEN+1],
char (&tapeFileId)[CA_MAXFIDLEN+1], int &errorCode, std::string &errorMsg)
throw(castor::exception::Exception) {
/*
tapegateway::FileToMigrateRequest request;
request.setTransactionId(volReqId);
castor::io::ClientSocket socket(gatewayPort, gatewayhost);
castor::IObject *obj = socket.readObject();
if(obj == NULL) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Failed to get FileToMigrateResponse from tape gateway"
": ClientSocket::readObject() returned null";
throw ex;
}
std::auto_ptr<tapegateway::FileToMigrateResponse> response(
dynamic_cast<tapegateway::FileToMigrateResponse*>(obj));
if(response.get() == NULL) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Failed to get FileToMigrateResponse from tape gateway"
": Failed to dynamic cast FileToMigrateResponse";
throw ex;
}
if(response.transactonId() != volReqId) {
castor::exception::Exception ex(EINVAL);
ex.getMessage() << __PRETTY_FUNCTION__
<< ": Failed to get FileToMigrateResponse from tape gateway"
": Transaction ID does not match volume request ID"
": Transaction ID = " << response.transactonId()
<< ": Volume Request ID = " << volReqId;
throw ex;
}
vid = response->vid();
mode = response->mode();
label = response->label();
density = response->density();
errorCode = response->errorCode();
errorMsg = response->errorMessage();
*/
}
/******************************************************************************
* castor/tape/aggregator/Transceiver.hpp
* castor/tape/aggregator/RtcpTxRx.hpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
......@@ -22,8 +22,8 @@
* @author Nicola.Bessone@cern.ch Steven.Murray@cern.ch
*****************************************************************************/
#ifndef CASTOR_TAPE_AGGREGATOR_TRANSCEIVER_HPP
#define CASTOR_TAPE_AGGREGATOR_TRANSCEIVER_HPP 1
#ifndef CASTOR_TAPE_AGGREGATOR_RTCPTXRX_HPP