diff --git a/src/common/packet.cc b/src/common/packet.cc index b2f67c479..82f167d35 100644 --- a/src/common/packet.cc +++ b/src/common/packet.cc @@ -308,6 +308,7 @@ Packet::PrintTags (std::ostream &os) const Tag *tag = dynamic_cast (constructor ()); NS_ASSERT (tag != 0); os << " "; + item.GetTag (*tag); tag->Print (os); if (i.HasNext ()) { diff --git a/src/internet-node/ipv4-l3-protocol.cc b/src/internet-node/ipv4-l3-protocol.cc index 653068c8c..affe814bb 100644 --- a/src/internet-node/ipv4-l3-protocol.cc +++ b/src/internet-node/ipv4-l3-protocol.cc @@ -30,6 +30,7 @@ #include "ns3/trace-source-accessor.h" #include "ns3/object-vector.h" #include "ns3/ipv4-header.h" +#include "ns3/boolean.h" #include "arp-l3-protocol.h" #include "ipv4-l3-protocol.h" @@ -57,6 +58,11 @@ Ipv4L3Protocol::GetTypeId (void) UintegerValue (64), MakeUintegerAccessor (&Ipv4L3Protocol::m_defaultTtl), MakeUintegerChecker ()) + .AddAttribute ("CalcChecksum", "If true, we calculate the checksum of outgoing packets" + " and verify the checksum of incoming packets.", + BooleanValue (false), + MakeBooleanAccessor (&Ipv4L3Protocol::m_calcChecksum), + MakeBooleanChecker ()) .AddTraceSource ("Tx", "Send ipv4 packet to outgoing interface.", MakeTraceSourceAccessor (&Ipv4L3Protocol::m_txTrace)) .AddTraceSource ("Rx", "Receive ipv4 packet from incoming interface.", @@ -464,10 +470,15 @@ Ipv4L3Protocol::Receive( Ptr device, Ptr packet, uint16_t pro index++; } Ipv4Header ipHeader; + if (m_calcChecksum) + { + ipHeader.EnableChecksum (); + } packet->RemoveHeader (ipHeader); if (!ipHeader.IsChecksumOk ()) { + m_dropTrace (packet); return; } @@ -490,6 +501,11 @@ Ipv4L3Protocol::Send (Ptr packet, Ipv4Header ipHeader; + if (m_calcChecksum) + { + ipHeader.EnableChecksum (); + } + ipHeader.SetSource (source); ipHeader.SetDestination (destination); ipHeader.SetProtocol (protocol); diff --git a/src/internet-node/ipv4-l3-protocol.h b/src/internet-node/ipv4-l3-protocol.h index 7b65269d7..40f0be5bd 100644 --- a/src/internet-node/ipv4-l3-protocol.h +++ b/src/internet-node/ipv4-l3-protocol.h @@ -191,6 +191,7 @@ private: Ipv4InterfaceList m_interfaces; uint32_t m_nInterfaces; uint8_t m_defaultTtl; + bool m_calcChecksum; uint16_t m_identification; Ptr m_node; TracedCallback, uint32_t> m_txTrace; diff --git a/src/node/ipv4-header.cc b/src/node/ipv4-header.cc index 3c7fb355f..758358f98 100644 --- a/src/node/ipv4-header.cc +++ b/src/node/ipv4-header.cc @@ -29,10 +29,9 @@ namespace ns3 { NS_OBJECT_ENSURE_REGISTERED (Ipv4Header); -bool Ipv4Header::m_calcChecksum = false; - Ipv4Header::Ipv4Header () - : m_payloadSize (0), + : m_calcChecksum (false), + m_payloadSize (0), m_identification (0), m_tos (0), m_ttl (0), @@ -43,7 +42,7 @@ Ipv4Header::Ipv4Header () {} void -Ipv4Header::EnableChecksums (void) +Ipv4Header::EnableChecksum (void) { m_calcChecksum = true; } @@ -178,6 +177,22 @@ Ipv4Header::IsChecksumOk (void) const return m_goodChecksum; } +uint16_t +Ipv4Header::ChecksumCalculate(Buffer::Iterator &i, uint16_t size) +{ + /* see RFC 1071 to understand this code. */ + uint32_t sum = 0; + + for (int j = 0; j < size/2; j++) + sum += i.ReadU16 (); + + if (size & 1) + sum += i.ReadU8 (); + + while (sum >> 16) + sum = (sum & 0xffff) + (sum >> 16); + return ~sum; +} TypeId Ipv4Header::GetTypeId (void) @@ -266,16 +281,12 @@ Ipv4Header::Serialize (Buffer::Iterator start) const if (m_calcChecksum) { -#if 0 - // XXX we need to add Buffer::Iterator::PeekData method - uint8_t *data = start.PeekData (); - uint16_t checksum = UtilsChecksumCalculate (0, data, GetSize ()); - checksum = UtilsChecksumComplete (checksum); + i = start; + uint16_t checksum = ChecksumCalculate(i, 20); NS_LOG_LOGIC ("checksum=" < () .AddConstructor () - .AddAttribute ("HelloInterval", "XXX", - TimeValue (OLSR_HELLO_INTERVAL), + .AddAttribute ("HelloInterval", "HELLO messages emission interval.", + TimeValue (Seconds (2)), MakeTimeAccessor (&AgentImpl::m_helloInterval), MakeTimeChecker ()) - .AddAttribute ("TcInterval", "XXX", - TimeValue (OLSR_TC_INTERVAL), + .AddAttribute ("TcInterval", "TC messages emission interval.", + TimeValue (Seconds (5)), MakeTimeAccessor (&AgentImpl::m_tcInterval), MakeTimeChecker ()) - .AddAttribute ("MidInterval", "XXX", - TimeValue (OLSR_MID_INTERVAL), + .AddAttribute ("MidInterval", "MID messages emission interval. Normally it is equal to TcInterval.", + TimeValue (Seconds (5)), MakeTimeAccessor (&AgentImpl::m_midInterval), MakeTimeChecker ()) - .AddAttribute ("Willingness", "XXX", - UintegerValue (OLSR_WILL_DEFAULT), - MakeUintegerAccessor (&AgentImpl::m_willingness), - MakeUintegerChecker ()) + .AddAttribute ("Willingness", "Willingness of a node to carry and forward traffic for other nodes.", + EnumValue (OLSR_WILL_DEFAULT), + MakeEnumAccessor (&AgentImpl::m_willingness), + MakeEnumChecker (OLSR_WILL_NEVER, "never", + OLSR_WILL_LOW, "low", + OLSR_WILL_DEFAULT, "default", + OLSR_WILL_HIGH, "high", + OLSR_WILL_ALWAYS, "always")) .AddTraceSource ("Rx", "Receive OLSR packet.", MakeTraceSourceAccessor (&AgentImpl::m_rxPacketTrace)) .AddTraceSource ("Tx", "Send OLSR packet.", diff --git a/src/routing/olsr/waf b/src/routing/olsr/waf new file mode 100755 index 000000000..4283ec141 --- /dev/null +++ b/src/routing/olsr/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../../waf "$@"