From 564a98a7ec2e0adbb6401328aa960f99254a9ed4 Mon Sep 17 00:00:00 2001 From: Jared Dulmage Date: Wed, 9 Oct 2019 12:36:52 -0600 Subject: [PATCH] tap-bridge: (merges !114) Add verbose attribute to call tap creator with -v * add Verbose attribute to TapBridge to call tap creator with the -v option * adds "this" to NS_FUNCTION_LOG calls in TapBridge * add branch on tap creator call to check if call exited with a signal --- src/tap-bridge/model/tap-bridge.cc | 112 ++++++++++++++++++----------- src/tap-bridge/model/tap-bridge.h | 7 ++ 2 files changed, 77 insertions(+), 42 deletions(-) diff --git a/src/tap-bridge/model/tap-bridge.cc b/src/tap-bridge/model/tap-bridge.cc index a0ade6fcc..3acd63f2b 100644 --- a/src/tap-bridge/model/tap-bridge.cc +++ b/src/tap-bridge/model/tap-bridge.cc @@ -52,7 +52,7 @@ NS_LOG_COMPONENT_DEFINE ("TapBridge"); FdReader::Data TapBridgeFdReader::DoRead (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); uint32_t bufferSize = 65536; uint8_t *buf = (uint8_t *)std::malloc (bufferSize); @@ -132,6 +132,11 @@ TapBridge::GetTypeId (void) MakeEnumChecker (CONFIGURE_LOCAL, "ConfigureLocal", USE_LOCAL, "UseLocal", USE_BRIDGE, "UseBridge")) + .AddAttribute ("Verbose", + "Enable verbose output from tap-creator child process", + BooleanValue (false), + MakeBooleanAccessor (&TapBridge::m_verbose), + MakeBooleanChecker ()) ; return tid; } @@ -145,14 +150,14 @@ TapBridge::TapBridge () m_fdReader (0), m_ns3AddressRewritten (false) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); m_packetBuffer = new uint8_t[65536]; Start (m_tStart); } TapBridge::~TapBridge() { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); StopTapDevice (); @@ -165,14 +170,14 @@ TapBridge::~TapBridge() void TapBridge::DoDispose () { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); NetDevice::DoDispose (); } void TapBridge::Start (Time tStart) { - NS_LOG_FUNCTION (tStart); + NS_LOG_FUNCTION (this << tStart); // // Cancel any pending start event and schedule a new one at some relative time in the future. @@ -184,7 +189,7 @@ TapBridge::Start (Time tStart) void TapBridge::Stop (Time tStop) { - NS_LOG_FUNCTION (tStop); + NS_LOG_FUNCTION (this << tStop); // // Cancel any pending stop event and schedule a new one at some relative time in the future. // @@ -195,7 +200,7 @@ TapBridge::Stop (Time tStop) void TapBridge::StartTapDevice (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); NS_ABORT_MSG_IF (m_sock != -1, "TapBridge::StartTapDevice(): Tap is already started"); @@ -237,7 +242,7 @@ TapBridge::StartTapDevice (void) void TapBridge::StopTapDevice (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); if (m_fdReader != 0) { @@ -255,7 +260,7 @@ TapBridge::StopTapDevice (void) void TapBridge::CreateTap (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); // // The TapBridge has three distinct operating modes. At this point, the @@ -488,13 +493,31 @@ TapBridge::CreateTap (void) ossMode << "3"; } + std::ostringstream ossVerbose; + if (m_verbose) + { + ossVerbose << "-v"; + } + std::ostringstream ossPath; ossPath << "-p" << path; + + NS_LOG_DEBUG ("Executing: " << TAP_CREATOR << + " " << ossDeviceName.str () << + " " << ossGateway.str () << + " " << ossIp.str () << + " " << ossMac.str () << + " " << ossNetmask.str () << + " " << ossMode.str () << + " " << ossPath.str () << + " " << ossVerbose.str () + ); + // // Execute the socket creation process image. // status = ::execlp (TAP_CREATOR, - TAP_CREATOR, // argv[0] (filename) + TAP_CREATOR, // argv[0] (filename) ossDeviceName.str ().c_str (), // argv[1] (-d) ossGateway.str ().c_str (), // argv[2] (-g) ossIp.str ().c_str (), // argv[3] (-i) @@ -502,6 +525,7 @@ TapBridge::CreateTap (void) ossNetmask.str ().c_str (), // argv[5] (-n) ossMode.str ().c_str (), // argv[6] (-o) ossPath.str ().c_str (), // argv[7] (-p) + ossVerbose.str ().c_str (), // argv[8] (-v) (char *)NULL); // @@ -534,6 +558,10 @@ TapBridge::CreateTap (void) NS_ABORT_MSG_IF (exitStatus != 0, "TapBridge::CreateTap(): socket creator exited normally with status " << exitStatus); } + else if (WIFSIGNALED (st)) + { + NS_FATAL_ERROR ("TapBridge::CreateTap(): socket creator exited with signal " << WTERMSIG (st)); + } else { NS_FATAL_ERROR ("TapBridge::CreateTap(): socket creator exited abnormally"); @@ -667,7 +695,7 @@ TapBridge::CreateTap (void) void TapBridge::ReadCallback (uint8_t *buf, ssize_t len) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this << buf << len); NS_ASSERT_MSG (buf != 0, "invalid buf argument"); NS_ASSERT_MSG (len > 0, "invalid len argument"); @@ -692,7 +720,7 @@ TapBridge::ReadCallback (uint8_t *buf, ssize_t len) void TapBridge::ForwardToBridgedDevice (uint8_t *buf, ssize_t len) { - NS_LOG_FUNCTION (buf << len); + NS_LOG_FUNCTION (this << buf << len); // // There are three operating modes for the TapBridge @@ -819,7 +847,7 @@ TapBridge::ForwardToBridgedDevice (uint8_t *buf, ssize_t len) Ptr TapBridge::Filter (Ptr p, Address *src, Address *dst, uint16_t *type) { - NS_LOG_FUNCTION (p); + NS_LOG_FUNCTION (this << p); uint32_t pktSize; // @@ -881,14 +909,14 @@ TapBridge::Filter (Ptr p, Address *src, Address *dst, uint16_t *type) Ptr TapBridge::GetBridgedNetDevice (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_bridgedDevice; } void TapBridge::SetBridgedNetDevice (Ptr bridgedDevice) { - NS_LOG_FUNCTION (bridgedDevice); + NS_LOG_FUNCTION (this << bridgedDevice); NS_ASSERT_MSG (m_node != 0, "TapBridge::SetBridgedDevice: Bridge not installed in a node"); NS_ASSERT_MSG (bridgedDevice != this, "TapBridge::SetBridgedDevice: Cannot bridge to self"); @@ -921,7 +949,7 @@ TapBridge::SetBridgedNetDevice (Ptr bridgedDevice) bool TapBridge::DiscardFromBridgedDevice (Ptr device, Ptr packet, uint16_t protocol, const Address &src) { - NS_LOG_FUNCTION (device << packet << protocol << src); + NS_LOG_FUNCTION (this << device << packet << protocol << src); NS_LOG_LOGIC ("Discarding packet stolen from bridged device " << device); return true; } @@ -935,7 +963,7 @@ TapBridge::ReceiveFromBridgedDevice ( const Address &dst, PacketType packetType) { - NS_LOG_FUNCTION (device << packet << protocol << src << dst << packetType); + NS_LOG_FUNCTION (this << device << packet << protocol << src << dst << packetType); NS_ASSERT_MSG (device == m_bridgedDevice, "TapBridge::SetBridgedDevice: Received packet from unexpected device"); NS_LOG_DEBUG ("Packet UID is " << packet->GetUid ()); @@ -1001,56 +1029,56 @@ TapBridge::ReceiveFromBridgedDevice ( void TapBridge::SetIfIndex (const uint32_t index) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this << index); m_ifIndex = index; } uint32_t TapBridge::GetIfIndex (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_ifIndex; } Ptr TapBridge::GetChannel (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return 0; } void TapBridge::SetAddress (Address address) { - NS_LOG_FUNCTION (address); + NS_LOG_FUNCTION (this << address); m_address = Mac48Address::ConvertFrom (address); } Address TapBridge::GetAddress (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_address; } void TapBridge::SetMode (enum Mode mode) { - NS_LOG_FUNCTION (mode); + NS_LOG_FUNCTION (this << mode); m_mode = mode; } TapBridge::Mode TapBridge::GetMode (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_mode; } bool TapBridge::SetMtu (const uint16_t mtu) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this << mtu); m_mtu = mtu; return true; } @@ -1058,14 +1086,14 @@ TapBridge::SetMtu (const uint16_t mtu) uint16_t TapBridge::GetMtu (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_mtu; } void TapBridge::NotifyLinkUp (void) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); if (!m_linkUp) { m_linkUp = true; @@ -1076,35 +1104,35 @@ TapBridge::NotifyLinkUp (void) bool TapBridge::IsLinkUp (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_linkUp; } void TapBridge::AddLinkChangeCallback (Callback callback) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); m_linkChangeCallbacks.ConnectWithoutContext (callback); } bool TapBridge::IsBroadcast (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return true; } Address TapBridge::GetBroadcast (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return Mac48Address ("ff:ff:ff:ff:ff:ff"); } bool TapBridge::IsMulticast (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return true; } @@ -1119,14 +1147,14 @@ TapBridge::GetMulticast (Ipv4Address multicastGroup) const bool TapBridge::IsPointToPoint (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return false; } bool TapBridge::IsBridge (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); // // Returning false from IsBridge in a device called TapBridge may seem odd // at first glance, but this test is for a device that bridges ns-3 devices @@ -1139,7 +1167,7 @@ TapBridge::IsBridge (void) const bool TapBridge::Send (Ptr packet, const Address& dst, uint16_t protocol) { - NS_LOG_FUNCTION (packet << dst << protocol); + NS_LOG_FUNCTION (this << packet << dst << protocol); NS_FATAL_ERROR ("TapBridge::Send: You may not call Send on a TapBridge directly"); return false; } @@ -1147,7 +1175,7 @@ TapBridge::Send (Ptr packet, const Address& dst, uint16_t protocol) bool TapBridge::SendFrom (Ptr packet, const Address& src, const Address& dst, uint16_t protocol) { - NS_LOG_FUNCTION (packet << src << dst << protocol); + NS_LOG_FUNCTION (this << packet << src << dst << protocol); NS_FATAL_ERROR ("TapBridge::Send: You may not call SendFrom on a TapBridge directly"); return false; } @@ -1155,42 +1183,42 @@ TapBridge::SendFrom (Ptr packet, const Address& src, const Address& dst, Ptr TapBridge::GetNode (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return m_node; } void TapBridge::SetNode (Ptr node) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); m_node = node; } bool TapBridge::NeedsArp (void) const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return true; } void TapBridge::SetReceiveCallback (NetDevice::ReceiveCallback cb) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); m_rxCallback = cb; } void TapBridge::SetPromiscReceiveCallback (NetDevice::PromiscReceiveCallback cb) { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); m_promiscRxCallback = cb; } bool TapBridge::SupportsSendFrom () const { - NS_LOG_FUNCTION_NOARGS (); + NS_LOG_FUNCTION (this); return true; } diff --git a/src/tap-bridge/model/tap-bridge.h b/src/tap-bridge/model/tap-bridge.h index 3de27f9d9..87895a3de 100644 --- a/src/tap-bridge/model/tap-bridge.h +++ b/src/tap-bridge/model/tap-bridge.h @@ -450,6 +450,13 @@ private: */ bool m_linkUp; + /** + * Flag indicating whether or not the link is up. In this case, + * whether or not ns-3 is connected to the underlying TAP device + * with a file descriptor. + */ + bool m_verbose; + /** * Callbacks to fire if the link changes state (up or down). */