55 if(thread_.joinable())
64 localAddress_ = localAddress;
65 remoteAddress_ = remoteAddress;
69 udp_.
open(localAddress_,
true);
73 std::stringstream sstream;
79 <<
": Unable to open receive socket to transport: '" 84 <<
"Possible reason(s):" 88 <<
" is not this host." 95 thread_ = std::thread{&BoundaryMessageManager::processNetworkMessage,
this};
102 if(thread_.joinable())
115 const void * pPacketData,
116 size_t packetDataLength,
128 size_t packetDataLength,
136 memset(&dataMessage,0,
sizeof(dataMessage));
147 memset(&header,0,
sizeof(header));
151 sizeof(dataMessage) +
161 vectorIO.push_back({&header,
sizeof(header)});
162 vectorIO.push_back({&dataMessage,
sizeof(dataMessage)});
164 vectorIO.insert(vectorIO.end(),
168 vectorIO.insert(vectorIO.end(),
169 controlVectorIO.begin(),
170 controlVectorIO.end());
172 if((len = udp_.
send(&vectorIO[0],
173 static_cast<int>(vectorIO.size()),
174 remoteAddress_)) == -1)
177 ERROR_LEVEL,
"NEM %03d BoundaryMessageManager error " 178 "on message send (expected:%zu actual:%zd)",
184 std::for_each(msgs.begin(),msgs.end(),[](
const ControlMessage * p){
delete p;});
194 memset(&header,0,
sizeof(header));
209 vectorIO.push_back({&header,
sizeof(header)});
210 vectorIO.push_back({&controlMessage,
sizeof(controlMessage)});
215 vectorIO.insert(vectorIO.end(),
216 controlMessageVectorIO.begin(),
217 controlMessageVectorIO.end());
219 if((len = udp_.
send(&vectorIO[0],
220 static_cast<int>(vectorIO.size()),
221 remoteAddress_)) == -1)
225 "error on control message send (expected:%hu actual:%zu)",
231 std::for_each(msgs.begin(),msgs.end(),[](
const ControlMessage * p){
delete p;});
234 void EMANE::BoundaryMessageManager::processNetworkMessage()
236 unsigned char buf[65536];
242 "NEM %03d BoundaryMessageManager::processNetworkMessage",
249 memset(&buf,0,
sizeof(buf));
251 if((len = udp_.
recv(buf,
sizeof(buf),0)) > 0)
255 "NEM %03d BoundaryMessageManager Pkt Rcvd len: %zd",
264 if(static_cast<size_t>(len) == pHeader->
u16Length_)
321 "NEM %03d BoundaryMessageManager::processNetworkMessage " 322 "processUpstreamPacket exception caught",
330 "NEM %03d BoundaryMessageManager::processNetworkMessage " 331 "processUpstreamPacket size too small for control message data",
342 "NEM %03d BoundaryMessageManager::processNetworkMessage " 343 "processUpstreamPacket size too small for data message",
351 "NEM %03d BoundaryMessageManager::processNetworkMessage " 352 "processUpstreamPacket size too small for packet data message",
387 "NEM %03d BoundaryMessageManager::processNetworkMessage " 388 "processDownstreamControl exception caught",
396 "NEM %03d BoundaryMessageManager control message size mismatch",
406 "NEM %03d BoundaryMessageManager Received unknown message type: %d",
416 "NEM %03d BoundaryMessageManager Message mismatch expected %hd got %zd",
426 "NEM %03d BoundaryMessageManager Message Header mismatch expected %zu got %zd",
438 "NEM %03d BoundaryMessageManager Message Header read error",
std::uint16_t u16CtrlLen_
NetAdapterHeader * NetAdapterHeaderToHost(NetAdapterHeader *pMsg)
A Packet class that allows upstream processing to strip layer headers as the packet travels up the st...
data shared between network adapter and nem.
virtual void doProcessControlMessage(const ControlMessages &msgs)=0
void open(const INETAddr &address, bool bReuseAddress=false)
#define LOGGER_VERBOSE_LOGGING(logger, level, fmt, args...)
NetAdapterControlMessage * NetAdapterControlMessageToHost(NetAdapterControlMessage *ctrl)
std::list< const ControlMessage * > ControlMessages
void sendPacketMessage(const PacketInfo &packetInfo, const void *pPacketData, size_t packetLength, const ControlMessages &msgs)
information shared between network adapter and nem.
virtual void doProcessPacketMessage(const PacketInfo &, const void *pPacketData, size_t packetLength, const ControlMessages &msgs)=0
NEMId getDestination() const
constexpr NEMId NEM_BROADCAST_MAC_ADDRESS
ssize_t send(const iovec *iov, int iovcnt, const INETAddr &remoteAddress, int flags=0) const
std::vector< iovec > VectorIO
NetAdapterDataMessage * NetAdapterDataMessageToNet(NetAdapterDataMessage *pkt)
converts netadapter data message from host to network byte order.
BoundaryMessageManager(NEMId id)
void sendControlMessage(const ControlMessages &msgs)
Store source, destination, creation time and priority information for a packet.
static ControlMessages create(const void *pData, size_t length)
std::uint16_t u16CtrlLen_
std::uint16_t u16DataLen_
std::string str(bool bWithPort=true) const
int cancel(std::thread &thread)
void open(const INETAddr &localAddress, const INETAddr &remoteAddress)
ControlMessage interface is the base for all control messages.
Priority getPriority() const
Exception thrown by the during BoundaryMessageManagerException to indicate connection failure...
ssize_t recv(void *buf, size_t len, int flags=0)
NetAdapterControlMessage * NetAdapterControlMessageToNet(NetAdapterControlMessage *ctrl)
const std::uint16_t NETADAPTER_DATA_MSG
virtual ~BoundaryMessageManager()
#define LOGGER_STANDARD_LOGGING(logger, level, fmt, args...)
const std::uint16_t NETADAPTER_CTRL_MSG
NetAdapterHeader * NetAdapterHeaderToNet(NetAdapterHeader *pMsg)
static LogService * instance()
NetAdapterDataMessage * NetAdapterDataMessageToHost(NetAdapterDataMessage *pkt)
converts netadapter data message from network to host byte order.
const std::uint16_t NETADAPTER_BROADCAST_ADDRESS
definition of the broadcast address used between network adapter and nem.
const Utils::VectorIO & getVectorIO() const