Merge with ns-3-dev and fix doxygen.
This commit is contained in:
@@ -406,6 +406,7 @@ Ipv4L3Protocol::Receive( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t pr
|
||||
|
||||
for (SocketList::iterator i = m_sockets.begin (); i != m_sockets.end (); ++i)
|
||||
{
|
||||
NS_LOG_LOGIC ("Forwarding to raw socket");
|
||||
Ptr<Ipv4RawSocketImpl> socket = *i;
|
||||
socket->ForwardUp (packet, ipHeader, device);
|
||||
}
|
||||
@@ -469,7 +470,6 @@ Ipv4L3Protocol::Send (Ptr<Packet> packet,
|
||||
if (destination.IsBroadcast ())
|
||||
{
|
||||
NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 1: limited broadcast");
|
||||
ttl = 1;
|
||||
ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
|
||||
uint32_t ifaceIndex = 0;
|
||||
for (Ipv4InterfaceList::iterator ifaceIter = m_interfaces.begin ();
|
||||
@@ -502,7 +502,6 @@ Ipv4L3Protocol::Send (Ptr<Packet> packet,
|
||||
destination.CombineMask (ifAddr.GetMask ()) == ifAddr.GetLocal ().CombineMask (ifAddr.GetMask ()) )
|
||||
{
|
||||
NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 2: subnet directed bcast to " << ifAddr.GetLocal ());
|
||||
ttl = 1;
|
||||
ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
|
||||
Ptr<Packet> packetCopy = packet->Copy ();
|
||||
m_sendOutgoingTrace (ipHeader, packetCopy, ifaceIndex);
|
||||
|
||||
@@ -80,6 +80,9 @@ class Ipv6ExtensionDemux : public Object
|
||||
void Remove (Ptr<Ipv6Extension> extension);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* \brief Dispose object.
|
||||
*/
|
||||
virtual void DoDispose ();
|
||||
|
||||
private:
|
||||
|
||||
@@ -153,10 +153,10 @@ void OptionField::Serialize (Buffer::Iterator start) const
|
||||
uint32_t OptionField::Deserialize (Buffer::Iterator start, uint32_t length)
|
||||
{
|
||||
uint8_t buf[length];
|
||||
start.Read (buf,length);
|
||||
start.Read (buf, length);
|
||||
m_optionData = Buffer ();
|
||||
m_optionData.AddAtEnd (length);
|
||||
m_optionData.Begin ().Write (buf,length);
|
||||
m_optionData.Begin ().Write (buf, length);
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
@@ -129,6 +129,7 @@ class Ipv6ExtensionHeader : public Header
|
||||
};
|
||||
|
||||
/**
|
||||
* \class OptionField
|
||||
* \brief Option field for an IPv6ExtensionHeader
|
||||
* Enables adding options to an IPv6ExtensionHeader
|
||||
*
|
||||
@@ -137,11 +138,18 @@ class Ipv6ExtensionHeader : public Header
|
||||
* return value. Call OptionField::Serialize and OptionField::Deserialize at the
|
||||
* end of your corresponding IPv6ExtensionHeader methods.
|
||||
*/
|
||||
|
||||
class OptionField
|
||||
{
|
||||
public:
|
||||
OptionField (uint32_t opitonsOffset);
|
||||
/**
|
||||
* \brief Constructor.
|
||||
* \param optionsOffset option offset
|
||||
*/
|
||||
OptionField (uint32_t optionsOffset);
|
||||
|
||||
/**
|
||||
* \brief Destructor.
|
||||
*/
|
||||
~OptionField ();
|
||||
|
||||
/**
|
||||
@@ -159,6 +167,7 @@ class OptionField
|
||||
/**
|
||||
* \brief Deserialize the packet.
|
||||
* \param start Buffer iterator
|
||||
* \param length length
|
||||
* \return size of the packet
|
||||
*/
|
||||
uint32_t Deserialize (Buffer::Iterator start, uint32_t length);
|
||||
@@ -176,13 +185,28 @@ class OptionField
|
||||
*/
|
||||
uint32_t GetOptionsOffset ();
|
||||
|
||||
/**
|
||||
* \brief Get the buffer.
|
||||
* \return buffer
|
||||
*/
|
||||
Buffer GetOptionBuffer ();
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* \brief Calculate padding.
|
||||
* \param alignment alignment
|
||||
*/
|
||||
uint32_t CalculatePad (Ipv6OptionHeader::Alignment alignment) const;
|
||||
|
||||
/**
|
||||
* \brief Data payload.
|
||||
*/
|
||||
Buffer m_optionData;
|
||||
|
||||
/**
|
||||
* \brief Offset.
|
||||
*/
|
||||
uint32_t m_optionsOffset;
|
||||
};
|
||||
|
||||
|
||||
@@ -522,9 +522,8 @@ void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
|
||||
unfragmentablePart.clear ();
|
||||
}
|
||||
|
||||
Ipv6ExtensionFragment::Fragments::Fragments ()
|
||||
: m_moreFragment (0),
|
||||
m_refCount (1)
|
||||
Ipv6ExtensionFragment::Fragments::Fragments ()
|
||||
: m_moreFragment (0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -532,21 +531,6 @@ Ipv6ExtensionFragment::Fragments::~Fragments ()
|
||||
{
|
||||
}
|
||||
|
||||
void Ipv6ExtensionFragment::Fragments::Ref () const
|
||||
{
|
||||
m_refCount++;
|
||||
}
|
||||
|
||||
void Ipv6ExtensionFragment::Fragments::Unref () const
|
||||
{
|
||||
m_refCount--;
|
||||
|
||||
if (m_refCount == 0)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
void Ipv6ExtensionFragment::Fragments::AddFragment (Ptr<Packet> fragment, uint16_t fragmentOffset, bool moreFragment)
|
||||
{
|
||||
std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
|
||||
@@ -756,8 +740,6 @@ void Ipv6ExtensionRoutingDemux::Remove (Ptr<Ipv6ExtensionRouting> extensionRouti
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionLooseRouting);
|
||||
|
||||
const uint8_t Ipv6ExtensionLooseRouting::TYPE_ROUTING = 0;
|
||||
|
||||
TypeId Ipv6ExtensionLooseRouting::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::Ipv6ExtensionLooseRouting")
|
||||
|
||||
@@ -125,6 +125,9 @@ private:
|
||||
class Ipv6ExtensionHopByHop : public Ipv6Extension
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Hop-by-hop extension number.
|
||||
*/
|
||||
static const uint8_t EXT_NUMBER = 0;
|
||||
|
||||
/**
|
||||
@@ -170,6 +173,9 @@ public:
|
||||
class Ipv6ExtensionDestination : public Ipv6Extension
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Destination extension number.
|
||||
*/
|
||||
static const uint8_t EXT_NUMBER = 60;
|
||||
|
||||
/**
|
||||
@@ -215,6 +221,9 @@ public:
|
||||
class Ipv6ExtensionFragment : public Ipv6Extension
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Fragmentation extension number.
|
||||
*/
|
||||
static const uint8_t EXT_NUMBER = 44;
|
||||
|
||||
/**
|
||||
@@ -271,7 +280,7 @@ private:
|
||||
* \class Fragments
|
||||
* \brief A Set of Fragment
|
||||
*/
|
||||
class Fragments
|
||||
class Fragments : public SimpleRefCount<Fragments>
|
||||
{
|
||||
public:
|
||||
/**
|
||||
@@ -284,9 +293,6 @@ private:
|
||||
*/
|
||||
~Fragments ();
|
||||
|
||||
void Ref () const;
|
||||
void Unref () const;
|
||||
|
||||
/**
|
||||
* \brief Add a fragment.
|
||||
* \param fragment the fragment
|
||||
@@ -352,6 +358,9 @@ private:
|
||||
class Ipv6ExtensionRouting : public Ipv6Extension
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Routing extension number.
|
||||
*/
|
||||
static const uint8_t EXT_NUMBER = 43;
|
||||
|
||||
/**
|
||||
@@ -472,7 +481,10 @@ private:
|
||||
class Ipv6ExtensionLooseRouting : public Ipv6ExtensionRouting
|
||||
{
|
||||
public:
|
||||
static const uint8_t TYPE_ROUTING;
|
||||
/**
|
||||
* \brief Routing type.
|
||||
*/
|
||||
static const uint8_t TYPE_ROUTING = 0;
|
||||
|
||||
/**
|
||||
* \brief Get the type identificator.
|
||||
@@ -519,6 +531,9 @@ public:
|
||||
class Ipv6ExtensionESP : public Ipv6Extension
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief ESP extension number.
|
||||
*/
|
||||
static const uint8_t EXT_NUMBER = 50;
|
||||
|
||||
/**
|
||||
@@ -565,6 +580,9 @@ public:
|
||||
class Ipv6ExtensionAH : public Ipv6Extension
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief AH extension number.
|
||||
*/
|
||||
static const uint8_t EXT_NUMBER = 51;
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,16 +37,16 @@ class Ipv6OptionHeader : public Header
|
||||
public:
|
||||
|
||||
/**
|
||||
* \struct Alignment
|
||||
* \brief represents the alignment requirements of an option header
|
||||
*
|
||||
* Represented as factor*n+offset (eg. 8n+2) See RFC 2460.
|
||||
* No alignemt is represented as 1n+0.
|
||||
*
|
||||
*/
|
||||
struct Alignment
|
||||
{
|
||||
uint8_t factor;
|
||||
uint8_t offset;
|
||||
uint8_t factor; /**< Factor */
|
||||
uint8_t offset; /**< Offset */
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -94,6 +94,9 @@ private:
|
||||
class Ipv6OptionPad1 : public Ipv6Option
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Pad1 option number.
|
||||
*/
|
||||
static const uint8_t OPT_NUMBER = 0;
|
||||
|
||||
/**
|
||||
@@ -138,6 +141,9 @@ public:
|
||||
class Ipv6OptionPadn : public Ipv6Option
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief PadN option number.
|
||||
*/
|
||||
static const uint8_t OPT_NUMBER = 60;
|
||||
|
||||
/**
|
||||
@@ -182,6 +188,9 @@ public:
|
||||
class Ipv6OptionJumbogram : public Ipv6Option
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Jumbogram option number.
|
||||
*/
|
||||
static const uint8_t OPT_NUMBER = 44;
|
||||
|
||||
/**
|
||||
@@ -231,6 +240,9 @@ private:
|
||||
class Ipv6OptionRouterAlert : public Ipv6Option
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Router alert option number.
|
||||
*/
|
||||
static const uint8_t OPT_NUMBER = 43;
|
||||
|
||||
/**
|
||||
|
||||
@@ -77,6 +77,8 @@ class UdpSocketImplTest: public TestCase
|
||||
{
|
||||
Ptr<Packet> m_receivedPacket;
|
||||
Ptr<Packet> m_receivedPacket2;
|
||||
void DoSendData (Ptr<Socket> socket, std::string to);
|
||||
void SendData (Ptr<Socket> socket, std::string to);
|
||||
|
||||
public:
|
||||
virtual bool DoRun (void);
|
||||
@@ -120,6 +122,24 @@ void UdpSocketImplTest::ReceivePkt2 (Ptr<Socket> socket)
|
||||
NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
|
||||
}
|
||||
|
||||
void
|
||||
UdpSocketImplTest::DoSendData (Ptr<Socket> socket, std::string to)
|
||||
{
|
||||
Address realTo = InetSocketAddress (Ipv4Address(to.c_str()), 1234);
|
||||
NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
|
||||
123, "XXX");
|
||||
}
|
||||
|
||||
void
|
||||
UdpSocketImplTest::SendData (Ptr<Socket> socket, std::string to)
|
||||
{
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
|
||||
&UdpSocketImplTest::DoSendData, this, socket, to);
|
||||
Simulator::Run ();
|
||||
}
|
||||
|
||||
bool
|
||||
UdpSocketImplTest::DoRun (void)
|
||||
{
|
||||
@@ -203,11 +223,7 @@ UdpSocketImplTest::DoRun (void)
|
||||
// ------ Now the tests ------------
|
||||
|
||||
// Unicast test
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
NS_TEST_EXPECT_MSG_EQ (txSocket->SendTo ( Create<Packet> (123), 0,
|
||||
InetSocketAddress (Ipv4Address("10.0.0.1"), 1234)), 123, "trivial");
|
||||
Simulator::Run ();
|
||||
SendData (txSocket, "10.0.0.1");
|
||||
NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 123, "trivial");
|
||||
NS_TEST_EXPECT_MSG_EQ (m_receivedPacket2->GetSize (), 0, "second interface should receive it");
|
||||
|
||||
@@ -216,11 +232,7 @@ UdpSocketImplTest::DoRun (void)
|
||||
|
||||
// Simple broadcast test
|
||||
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
NS_TEST_EXPECT_MSG_EQ (txSocket->SendTo ( Create<Packet> (123), 0,
|
||||
InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123, "trivial");
|
||||
Simulator::Run ();
|
||||
SendData (txSocket, "255.255.255.255");
|
||||
NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 123, "trivial");
|
||||
NS_TEST_EXPECT_MSG_EQ (m_receivedPacket2->GetSize (), 0, "second socket should not receive it (it is bound specifically to the second interface's address");
|
||||
|
||||
@@ -237,11 +249,7 @@ UdpSocketImplTest::DoRun (void)
|
||||
rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this));
|
||||
NS_TEST_EXPECT_MSG_EQ (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0, "trivial");
|
||||
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
NS_TEST_EXPECT_MSG_EQ (txSocket->SendTo (Create<Packet> (123), 0,
|
||||
InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123, "trivial");
|
||||
Simulator::Run ();
|
||||
SendData (txSocket, "255.255.255.255");
|
||||
NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 123, "trivial");
|
||||
NS_TEST_EXPECT_MSG_EQ (m_receivedPacket2->GetSize (), 123, "trivial");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user