23 #include "ns3/channel.h"
24 #include "ns3/packet.h"
26 #include "ns3/boolean.h"
27 #include "ns3/abort.h"
28 #include "ns3/simulator.h"
29 #include "ns3/uinteger.h"
30 #include "ns3/icmpv6-header.h"
31 #include "ns3/ipv6-header.h"
32 #include "ns3/mac16-address.h"
33 #include "ns3/mac48-address.h"
34 #include "ns3/mac64-address.h"
35 #include "ns3/unused.h"
36 #include "ns3/ipv6-l3-protocol.h"
37 #include "ns3/ipv6-extension-header.h"
38 #include "ns3/udp-header.h"
39 #include "ns3/udp-l4-protocol.h"
53 .SetGroupName (
"SixLowPan")
55 .AddAttribute (
"Rfc6282",
"Use RFC6282 (IPHC) if true, RFC4944 (HC1) otherwise.",
59 .AddAttribute (
"OmitUdpChecksum",
60 "Omit the UDP checksum in IPHC compression.",
64 .AddAttribute (
"FragmentReassemblyListSize",
"The maximum size of the reassembly buffer (in packets). Zero meaning infinite.",
67 MakeUintegerChecker<uint16_t> ())
68 .AddAttribute (
"FragmentExpirationTimeout",
69 "When this timeout expires, the fragments will be cleared from the buffer.",
73 .AddAttribute (
"CompressionThreshold",
74 "The minimum MAC layer payload size.",
77 MakeUintegerChecker<uint32_t> ())
78 .AddAttribute (
"ForceEtherType",
79 "Force a specific EtherType in L2 frames.",
83 .AddAttribute (
"EtherType",
84 "The specific EtherType to be used in L2 frames.",
87 MakeUintegerChecker<uint16_t> ())
88 .AddTraceSource (
"Tx",
89 "Send - packet (including 6LoWPAN header), "
90 "SixLoWPanNetDevice Ptr, interface index.",
92 "ns3::SixLowPanNetDevice::RxTxTracedCallback")
93 .AddTraceSource (
"Rx",
94 "Receive - packet (including 6LoWPAN header), "
95 "SixLoWPanNetDevice Ptr, interface index.",
97 "ns3::SixLowPanNetDevice::RxTxTracedCallback")
98 .AddTraceSource (
"Drop",
99 "Drop - DropReason, packet (including 6LoWPAN header), "
100 "SixLoWPanNetDevice Ptr, interface index.",
102 "ns3::SixLowPanNetDevice::DropTracedCallback")
114 m_rng = CreateObject<UniformRandomVariable> ();
128 NS_LOG_DEBUG (
"RegisterProtocolHandler for " << device->GetInstanceTypeId ().GetName ());
130 uint16_t protocolType = 0;
137 protocolType, device,
false);
156 iter->second.Cancel ();
176 NS_LOG_FUNCTION (
this << incomingPort << packet << protocol << src << dst);
179 uint8_t dispatchRawVal = 0;
185 copyPkt->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
187 bool isPktDecompressed =
false;
188 bool fragmented =
false;
192 NS_LOG_DEBUG (
"Dispatches: " <<
int(dispatchRawVal) <<
" - " <<
int(dispatchVal) );
206 if ( !isPktDecompressed )
212 copyPkt->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
217 switch ( dispatchVal )
220 NS_LOG_DEBUG (
"Unsupported 6LoWPAN encoding: MESH, dropping.");
224 NS_LOG_DEBUG (
"Unsupported 6LoWPAN encoding: BC0, dropping.");
232 isPktDecompressed =
true;
237 isPktDecompressed =
true;
241 isPktDecompressed =
true;
244 NS_LOG_DEBUG (
"Unsupported 6LoWPAN encoding: dropping.");
249 if ( !isPktDecompressed )
255 NS_LOG_DEBUG (
"Packet decompressed received: " << *copyPkt );
338 return m_netDevice->AddLinkChangeCallback (callback);
399 uint16_t protocolNumber)
405 ret =
DoSend (packet, src, dest, protocolNumber,
false);
412 uint16_t protocolNumber)
417 ret =
DoSend (packet, src, dest, protocolNumber,
true);
424 uint16_t protocolNumber,
427 NS_LOG_FUNCTION (
this << *packet << src << dest << protocolNumber << doSendFrom);
431 uint32_t origHdrSize = 0;
432 uint32_t origPacketSize = packet->
GetSize ();
455 NS_LOG_LOGIC (
"Compressed packet too short, using uncompressed one");
465 std::list<Ptr<Packet> > fragmentList;
467 std::list<Ptr<Packet> >::iterator it;
469 for ( it = fragmentList.begin (); it != fragmentList.end (); it++ )
471 NS_LOG_DEBUG (
"SixLowPanNetDevice::Send (Fragment) " << **it );
475 success &=
m_netDevice->SendFrom (*it, src, dest, protocolNumber);
479 success &=
m_netDevice->Send (*it, dest, protocolNumber);
490 ret =
m_netDevice->SendFrom (packet, src, dest, protocolNumber);
495 ret =
m_netDevice->Send (packet, dest, protocolNumber);
562 NS_LOG_LOGIC (
"Checking source compression: " << mySrcAddr <<
" - " << srcAddr );
565 bool isSrcSrc = (memcmp (bufOne + 8, bufTwo + 8, 8) == 0);
592 NS_LOG_LOGIC (
"Checking destination compression: " << myDstAddr <<
" - " << dstAddr );
595 bool isDstDst = (memcmp (bufOne + 8, bufTwo + 8, 8) == 0);
655 NS_LOG_DEBUG (
"removed " << ret <<
" bytes - pkt is " << *packet);
662 const uint8_t* interface;
663 const uint8_t* prefix;
668 interface = encoding.GetSrcInterface ();
669 for (
int j = 0; j < 8; j++)
671 address[j + 8] = interface[j];
672 address[j] = prefix[j];
678 for (
int j = 0; j < 8; j++)
681 address[j] = prefix[j];
686 interface = encoding.GetSrcInterface ();
689 for (
int j = 0; j < 8; j++)
691 address[j + 8] = interface[j];
702 const uint8_t* interface;
703 const uint8_t* prefix;
708 interface = encoding.GetDstInterface ();
709 for (
int j = 0; j < 8; j++)
711 address[j + 8] = interface[j];
712 address[j] = prefix[j];
718 for (
int j = 0; j < 8; j++)
721 address[j] = prefix[j];
726 interface = encoding.GetDstInterface ();
729 for (
int j = 0; j < 8; j++)
731 address[j + 8] = interface[j];
756 "6LoWPAN: error in decompressing HC1 encoding, unsupported L4 compressed header present.");
810 iphcHeader.
SetNh (
true);
815 iphcHeader.
SetNh (
true);
824 iphcHeader.
SetNh (
true);
829 iphcHeader.
SetNh (
false);
836 iphcHeader.
SetNh (
false);
863 iphcHeader.
SetCid (
false);
867 iphcHeader.
SetSac (
false);
869 uint8_t addressBuf[16];
870 uint8_t unicastAddrCheckerBuf[16];
875 checker.
GetBytes (unicastAddrCheckerBuf);
882 NS_LOG_LOGIC (
"Checking source compression: " << mySrcAddr <<
" - " << srcAddr );
884 if ( mySrcAddr == srcAddr )
888 else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
904 iphcHeader.
SetM (
true);
908 iphcHeader.
SetM (
false);
913 iphcHeader.
SetDac (
false);
923 NS_LOG_LOGIC (
"Checking destination compression: " << myDstAddr <<
" - " << dstAddr );
925 if ( !iphcHeader.
GetM () )
928 if ( myDstAddr == dstAddr )
932 else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
948 uint8_t multicastAddrCheckerBuf[16];
950 multicastCheckAddress.
GetBytes (multicastAddrCheckerBuf);
953 if ( memcmp (addressBuf, multicastAddrCheckerBuf, 15) == 0 )
959 else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
960 && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 11) == 0) )
966 else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
967 && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 9) == 0) )
982 NS_LOG_DEBUG (
"Packet after IPHC compression: " << *packet);
1020 NS_LOG_DEBUG (
"removed " << ret <<
" bytes - pkt is " << *packet);
1027 if ( encoding.
GetSac () )
1050 if ( encoding.
GetDac () )
1077 uint8_t traf = 0x00;
1078 switch (encoding.
GetTf ())
1081 traf |= encoding.
GetEcn ();
1082 traf = ( traf << 6 ) | encoding.
GetDscp ();
1087 traf |= encoding.
GetEcn ();
1093 traf |= encoding.
GetEcn ();
1094 traf = ( traf << 6 ) | encoding.
GetDscp ();
1104 if ( encoding.
GetNh () )
1107 uint8_t dispatchRawVal = 0;
1110 packet->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
1151 NS_LOG_DEBUG (
"LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
1152 "that have more than 255 octets following the Length field after compression. "
1153 "Packet uncompressed.");
1166 nhcHeader.
SetNh (
true);
1171 nhcHeader.
SetNh (
true);
1180 nhcHeader.
SetNh (
true);
1185 nhcHeader.
SetNh (
false);
1192 nhcHeader.
SetNh (
false);
1209 NS_LOG_DEBUG (
"LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
1210 "that have more than 255 octets following the Length field after compression. "
1211 "Packet uncompressed.");
1224 nhcHeader.
SetNh (
true);
1229 nhcHeader.
SetNh (
true);
1238 nhcHeader.
SetNh (
true);
1243 nhcHeader.
SetNh (
false);
1250 nhcHeader.
SetNh (
false);
1267 NS_LOG_DEBUG (
"LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
1268 "that have more than 255 octets following the Length field after compression. "
1269 "Packet uncompressed.");
1281 nhcHeader.
SetNh (
true);
1286 nhcHeader.
SetNh (
true);
1295 nhcHeader.
SetNh (
true);
1300 nhcHeader.
SetNh (
false);
1307 nhcHeader.
SetNh (
false);
1324 NS_LOG_DEBUG (
"LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
1325 "that have more than 255 octets following the Length field after compression. "
1326 "Packet uncompressed.");
1338 nhcHeader.
SetNh (
true);
1343 nhcHeader.
SetNh (
true);
1352 nhcHeader.
SetNh (
true);
1357 nhcHeader.
SetNh (
false);
1364 nhcHeader.
SetNh (
false);
1378 NS_ABORT_MSG (
"IPv6 Mobility Header is not supported in ns-3 yet");
1391 NS_LOG_DEBUG (
"Packet after NHC compression: " << *packet);
1403 NS_LOG_DEBUG (
"removed " << ret <<
" bytes - pkt is " << *packet);
1412 uint8_t blobData[260];
1413 blobSize = encoding.
CopyBlob (blobData + 2, 260-2);
1414 uint8_t paddingSize = 0;
1416 uint8_t actualEncodedHeaderType = encoding.
GetEid ();
1417 uint8_t actualHeaderType;
1420 switch (actualEncodedHeaderType)
1424 if ( encoding.
GetNh () )
1427 uint8_t dispatchRawVal = 0;
1430 packet->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
1449 if ((blobSize + 2) % 8 > 0)
1451 paddingSize = 8 - (blobSize + 2) % 8;
1453 if (paddingSize == 1)
1455 blobData[blobSize + 2] = 0;
1457 else if (paddingSize > 1)
1459 blobData[blobSize + 2] = 1;
1460 blobData[blobSize + 2 + 1] = paddingSize - 2;
1461 for (uint8_t i = 0; i < paddingSize - 2; i++)
1463 blobData[blobSize + 2 + 2 + i] = 0;
1466 blobData [1] = ((blobSize + 2 + paddingSize) >> 3) - 1;
1467 blob.
AddAtStart (blobSize + 2 + paddingSize);
1468 blob.
Begin ().
Write (blobData, blobSize + 2 + paddingSize);
1476 if ( encoding.
GetNh () )
1479 uint8_t dispatchRawVal = 0;
1482 packet->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
1499 blobData [1] = ((blobSize + 2) >> 3) - 1;
1501 blob.
Begin ().
Write (blobData, blobSize + 2);
1508 if ( encoding.
GetNh () )
1511 uint8_t dispatchRawVal = 0;
1514 packet->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
1534 blob.
Begin ().
Write (blobData, blobSize + 2);
1542 if ( encoding.
GetNh () )
1545 uint8_t dispatchRawVal = 0;
1548 packet->
CopyData (&dispatchRawVal,
sizeof(dispatchRawVal));
1567 if ((blobSize + 2) % 8 > 0)
1569 paddingSize = 8 - (blobSize + 2) % 8;
1571 if (paddingSize == 1)
1573 blobData[blobSize + 2] = 0;
1575 else if (paddingSize > 1)
1577 blobData[blobSize + 2] = 1;
1578 blobData[blobSize + 2 + 1] = paddingSize - 2;
1579 for (uint8_t i = 0; i < paddingSize - 2; i++)
1581 blobData[blobSize + 2 + 2 + i] = 0;
1584 blobData [1] = ((blobSize + 2 + paddingSize) >> 3) - 1;
1585 blob.
AddAtStart (blobSize + 2 + paddingSize);
1586 blob.
Begin ().
Write (blobData, blobSize + 2 + paddingSize);
1593 NS_ABORT_MSG (
"IPv6 Mobility Header is not supported in ns-3 yet");
1600 NS_ABORT_MSG (
"Trying to decode unknown Extension Header");
1605 return actualHeaderType;
1622 udpNhcHeader.
SetC (
false);
1628 udpNhcHeader.
SetC (
true);
1658 NS_LOG_DEBUG (
"Packet after UDP_NHC compression: " << *packet);
1672 NS_LOG_DEBUG (
"removed " << ret <<
" bytes - pkt is " << *packet);
1686 temp |= (temp << 8) | encoding.
GetDstPort ();
1691 temp |= (temp << 8) | encoding.
GetSrcPort ();
1697 temp |= (temp << 4) | encoding.
GetSrcPort ();
1700 temp |= (temp << 4) | encoding.
GetDstPort ();
1708 if ( encoding.
GetC () )
1734 uint32_t origPacketSize,
1735 uint32_t origHdrSize,
1742 uint16_t offsetData = 0;
1743 uint16_t offset = 0;
1746 uint32_t compressedHeaderSize = packetSize - (origPacketSize - origHdrSize);
1749 NS_LOG_LOGIC (
"random tag " << tag <<
" - test " << packetSize );
1757 "6LoWPAN: can not fragment, 6LoWPAN headers are bigger than MTU");
1761 size += compressedHeaderSize;
1766 offset += size + origHdrSize - compressedHeaderSize;
1770 listFragments.push_back (fragment1);
1772 bool moreFrag =
true;
1783 if ( (offsetData + size) > packetSize )
1785 size = packetSize - offsetData;
1789 NS_LOG_LOGIC (
"Fragment creation - " << offset <<
", " << offset );
1797 listFragments.push_back (fragment);
1812 key.first = std::pair<Address, Address> (src, dst);
1815 uint16_t offset = 0;
1829 uint8_t dispatchRawValFrag1 = 0;
1834 p->CopyData (&dispatchRawValFrag1,
sizeof(dispatchRawValFrag1));
1836 NS_LOG_DEBUG (
"Dispatches: " <<
int(dispatchRawValFrag1) <<
" - " <<
int(dispatchValFrag1) );
1839 switch ( dispatchValFrag1 )
1844 p->RemoveHeader(uncompressedHdr);
1862 p->RemoveHeader (fragNHeader);
1870 MapFragments_t::iterator it =
m_fragments.find (key);
1876 MapFragmentsTimers_t::iterator iter;
1880 if ( iter->second.GetTs () < iterFound->second.GetTs () )
1887 std::list< Ptr<Packet> > storedFragments =
m_fragments[oldestKey]->GetFraments ();
1889 fragIter != storedFragments.end (); fragIter++)
1900 fragments = Create<Fragments> ();
1902 m_fragments.insert (std::make_pair (key, fragments));
1910 fragments = it->second;
1960 std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
1961 bool duplicate =
false;
1965 if (it->second > fragmentOffset)
1969 if (it->second == fragmentOffset)
1972 NS_ASSERT_MSG (fragment->
GetSize () == it->first->GetSize (),
"Duplicate fragment size differs. Aborting.");
1978 m_fragments.insert (it, std::make_pair (fragment, fragmentOffset));
1986 m_firstFragment = fragment;
1994 uint16_t lastEndOffset = 0;
2001 NS_LOG_LOGIC (
"Checking overlaps " << lastEndOffset <<
" - " << it->second );
2003 if (lastEndOffset < it->
second)
2009 uint16_t fragmentEnd = it->first->GetSize () + it->second;
2010 lastEndOffset =
std::max ( lastEndOffset, fragmentEnd );
2014 if ( ret && (lastEndOffset == m_packetSize))
2025 std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it =
m_fragments.begin ();
2028 uint16_t lastEndOffset = 0;
2032 lastEndOffset = it->first->GetSize ();
2036 if ( lastEndOffset > it->second )
2038 NS_ABORT_MSG (
"Overlapping fragments found, forbidden condition");
2045 lastEndOffset += it->first->GetSize ();
2059 std::list< Ptr<Packet> > fragments;
2060 std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator iter;
2063 fragments.push_back (iter->first);
2072 MapFragments_t::iterator it =
m_fragments.find (key);
2073 std::list< Ptr<Packet> > storedFragments = it->second->GetFraments ();
2075 fragIter != storedFragments.end (); fragIter++)
2105 if (ipv6Addr.
IsAny ())
2131 if (ipv6Addr.
IsAny ())
bool IsAny() const
If the IPv6 address is the "Any" address.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void SetCid(bool cidField)
Set the CID (Context Identifier Extension) compression.
uint8_t GetNextHeader(void) const
Get the Next Header field.
void DecompressLowPanUdpNhc(Ptr< Packet > packet, Ipv6Address saddr, Ipv6Address daddr)
Decompress the headers according to NHC compression.
static bool IsMatchingType(const Address &address)
Ports_e GetPorts(void) const
Get the compressed Src and Dst Ports.
void AddAtStart(uint32_t start)
void SetTcflCompression(bool tcflCompression)
Set the Traffic Class and Flow Labels as compressed.
Smart pointer class similar to boost::intrusive_ptr.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
uint8_t GetNextHeader() const
Get the Next Header value.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
AttributeValue implementation for Boolean.
void SetHopLimit(uint8_t hopLimit)
Set the Hop Limit field.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
void SetDstCompression(LowPanHc1Addr_e dstCompression)
Set Destination Compression type.
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
6LoWPAN IPv6 uncompressed header - see RFC 4944.
void RemoveAtStart(uint32_t start)
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
void SetNextHeader(uint8_t nextHeader)
Set the Next Header field values.
virtual void SetIfIndex(const uint32_t index)
static Mac16Address ConvertFrom(const Address &address)
void SetPacketSize(uint32_t packetSize)
Set the packet-to-be-defragmented size.
void AddFirstFragment(Ptr< Packet > fragment)
Add the first packet fragment.
TracedCallback< Ptr< const Packet >, Ptr< SixLowPanNetDevice >, uint32_t > m_txTrace
Callback to trace TX (transmission) packets.
static bool IsMatchingType(const Address &address)
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
static Dispatch_e GetDispatchType(uint8_t dispatch)
Get the Dispatch type.
static bool ChecksumEnabled(void)
LOWPAN_IPHC base Encoding - see RFC 6282.
automatically resized byte buffer
Fragment buffer size exceeded.
bool IsLinkLocal() const
If the IPv6 address is a link-local address (fe80::/64).
uint64_t GetUid(void) const
Returns the packet's Uid.
virtual bool IsMulticast(void) const
bool IsNull(void) const
Check for null implementation.
void SetPorts(Ports_e port)
Set the compressed Src and Dst Ports.
void SetSrcCompression(LowPanHc1Addr_e srcCompression)
Set Source Compression type.
PacketType
Packet types are used as they are in Linux.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
uint16_t GetDatagramSize(void) const
Get the datagram size.
static TypeId GetTypeId(void)
Get the type ID.
static Ipv6Address MakeAutoconfiguredAddress(Mac16Address addr, Ipv6Address prefix)
Make the autoconfigured IPv6 address with Mac16Address.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint16_t GetDatagramSize(void) const
Get the datagram size.
virtual Ptr< Channel > GetChannel(void) const
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
#define NS_UNUSED(x)
Mark a local variable as unused.
LOWPAN_NHC Extension Header Encoding - see RFC 6282.
std::pair< std::pair< Address, Address >, std::pair< uint16_t, uint16_t > > FragmentKey
Fragment identifier type: src/dst address src/dst port.
uint16_t m_fragmentReassemblyListSize
How many packets can be rebuilt at the same time.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
virtual void DoDispose(void)
Destructor implementation.
void SetDatagramOffset(uint8_t datagramOffset)
Set the datagram offset.
void SetSam(HeaderCompression_e samField)
Set the SAM (Source Address Mode) compression.
6LoWPAN FRAGN header - see RFC 4944.
TrafficClassFlowLabel_e GetTf(void) const
Get the TF (Traffic Class, Flow Label) compression.
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
void SetDatagramSize(uint16_t datagramSize)
Set the datagram size.
virtual bool SetMtu(const uint16_t mtu)
void SetNetDevice(Ptr< NetDevice > device)
Setup SixLowPan to be a proxy for the specified NetDevice.
bool IsTcflCompression() const
Check if the Traffic Class and Flow Labels are compressed.
bool GetM(void) const
Get the M (Multicast) compression.
void SetTrafficClass(uint8_t trafficClass)
Set the Traffic Class value.
a polymophic address class
uint16_t GetDstPort() const
Get the Destination Port.
bool GetNh(void) const
Get the Next Header field value.
std::map< FragmentKey, EventId >::iterator MapFragmentsTimersI_t
Container Iterator for fragment key -> expiration event.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
uint8_t GetDscp(void) const
Get the DSCP.
void SetHlim(Hlim_e hlimField)
Set the HLIM (Hop Limit) compression.
virtual uint32_t GetIfIndex(void) const
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
uint32_t CompressLowPanNhc(Ptr< Packet > packet, uint8_t headerType, Address const &src, Address const &dst)
Compress the headers according to NHC compression.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
bool m_useIphc
Use IPHC or HC1.
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
Ptr< Node > m_node
Smart pointer to the Node.
uint16_t GetDatagramTag(void) const
Get the datagram tag.
Ipv6Address GetSrcAddress() const
Get the Source Address.
uint16_t GetSrcPort() const
Get the Source Port.
void SetBlob(const uint8_t *blob, uint32_t size)
Set the option header data blob.
uint32_t CompressLowPanUdpNhc(Ptr< Packet > packet, bool omitChecksum)
Compress the headers according to NHC compression.
uint32_t CompressLowPanIphc(Ptr< Packet > packet, Address const &src, Address const &dst)
Compress the headers according to IPHC compression.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
void SetHc2HeaderPresent(bool hc2HeaderPresent)
Set the next header a HC2 compressed header.
Fragment timeout exceeded.
AttributeValue implementation for Time.
void SetDscp(uint8_t dscp)
Set the DSCP (6bits).
uint8_t GetTrafficClass() const
Get the Traffic Class value.
Hold an unsigned integer type.
void SetDstInterface(const uint8_t *dstInterface)
Set the destination interface.
uint32_t m_packetSize
The size of the reconstructed packet (bytes).
void SetSac(bool sacField)
Set the SAC (Source Address Compression) compression.
bool IsHc2HeaderPresent() const
Check if there is a HC2 compressed header.
Ptr< NetDevice > GetNetDevice() const
Returns a smart pointer to the underlying NetDevice.
uint8_t const * PeekData(void) const
void SetNh(bool nhField)
Set the NH (Next Header) compression.
Ipv6Address GetDstAddress() const
Get the Destination Address.
void SetChecksum(uint16_t checksum)
Set the Checksum field values.
uint16_t GetDatagramTag(void) const
Get the datagram tag.
uint8_t GetHopLimit(void) const
Get the Hop Limit field.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
LowPanHc1Addr_e GetDstCompression() const
Get Destination Compression type.
uint8_t GetEcn(void) const
Get the ECN.
void GetBytes(uint8_t buf[16]) const
Get the bytes corresponding to the address.
void SetDstPort(uint16_t port)
Set the Destination Port.
virtual bool IsLinkUp(void) const
void SetDatagramSize(uint16_t datagramSize)
Set the datagram size.
uint8_t GetHopLimit(void) const
Get the "Hop limit" field (TTL).
bool GetNh(void) const
Get the NH (Next Header) compression.
HeaderCompression_e GetDam(void) const
Get the DAM (Destination Address Mode) compression.
TracedCallback< DropReason, Ptr< const Packet >, Ptr< SixLowPanNetDevice >, uint32_t > m_dropTrace
Callback to trace drop packets.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Buffer::Iterator Begin(void) const
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
void SetSrcPort(uint16_t port)
Set the Source Port.
HeaderCompression_e GetSam(void) const
Get the SAM (Source Address Mode) compression.
static Mac48Address ConvertFrom(const Address &address)
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
Time m_fragmentExpirationTimeout
Time limit for fragment rebuilding.
virtual bool NeedsArp(void) const
virtual bool IsBroadcast(void) const
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
bool m_forceEtherType
Force the EtherType number.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
std::map< FragmentKey, Ptr< Fragments > >::iterator MapFragmentsI_t
Container Iterator for fragment key -> fragments.
virtual void SetNode(Ptr< Node > node)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SetNextHeader(uint8_t nextHeader)
Set the Next Header field.
std::list< Ptr< Packet > > GetFraments() const
Get a list of the current stored fragments.
uint32_t m_compressionThreshold
Minimum L2 payload size.
Shim performing 6LoWPAN compression, decompression and fragmentation.
uint32_t GetFlowLabel() const
Get the Flow Label value.
Ipv6Address MakeLinkLocalAddressFromMac(Address const &addr)
Make a link-local address from a MAC address.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
bool IsEntire() const
If all fragments have been added.
bool GetC(void) const
Get the C (Checksum).
virtual Ptr< Node > GetNode(void) const
MapFragmentsTimers_t m_fragmentsTimers
Timers related to fragment rebuilding.
virtual Address GetBroadcast(void) const
bool GetSac(void) const
Get the SAC (Source Address Compression) compression.
virtual void AddLinkChangeCallback(Callback< void > callback)
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
NetDevice::ReceiveCallback m_rxCallback
The callback used to notify higher layers that a packet has been received.
Unsupported compression kind.
void SetSrcAddress(Ipv6Address srcAddress)
Set the Source Address.
bool GetDac(void) const
Get the DAC (Destination Address Compression) compression.
const uint8_t * GetDstPrefix() const
Get the destination prefix.
void DoFragmentation(Ptr< Packet > packet, uint32_t origPacketSize, uint32_t origHdrSize, std::list< Ptr< Packet > > &listFragments)
Performs a packet fragmentation.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
static Time Now(void)
Return the current simulation virtual time.
uint32_t GetSize(void) const
uint8_t GetNextHeader(void) const
Get the Next Header field value.
6LoWPAN HC1 header - see RFC 4944.
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
Dispatch_e
Dispatch values, as defined in RFC 4944 and RFC 6282
void SetHopLimit(uint8_t limit)
Set the "Hop limit" field (TTL).
Ptr< Packet > GetPacket() const
Get the entire packet.
void SetDac(bool dacField)
Set the DAC (Destination Address Compression) compression.
void RegisterProtocolHandler(ProtocolHandler handler, uint16_t protocolType, Ptr< NetDevice > device, bool promiscuous=false)
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
void SetSrcInterface(const uint8_t *srcInterface)
Set the source interface.
uint16_t m_etherType
EtherType number (used only if m_forceEtherType is true).
void SetDstPrefix(const uint8_t *dstPrefix)
Set the destination prefix.
static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Mac16Address mac)
Make the autoconfigured link-local IPv6 address with Mac16Address.
Describes an IPv6 address.
void DecompressLowPanIphc(Ptr< Packet > packet, Address const &src, Address const &dst)
Decompress the headers according to IPHC compression.
Ipv4 addresses are stored in host order in this class.
SixLowPanNetDevice()
Constructor for the SixLowPanNetDevice.
Ipv6Address MakeGlobalAddressFromMac(Address const &addr, Ipv6Address prefix)
Make a global address from a MAC address.
void SetFlowLabel(uint32_t flowLabel)
Set the Flow Label (20bits).
Eid_e GetEid(void) const
Get the Extension Header Type.
uint32_t GetId(void) const
void ReceiveFromDevice(Ptr< NetDevice > device, Ptr< const Packet > packet, uint16_t protocol, Address const &source, Address const &destination, PacketType packetType)
Receives all the packets from a NetDevice for further processing.
static Mac64Address ConvertFrom(const Address &address)
Network layer to device interface.
virtual bool SupportsSendFrom() const
const uint8_t * GetSrcPrefix() const
Get the source prefix.
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
virtual Address GetAddress(void) const
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
uint32_t GetFlowLabel(void) const
Get the Flow Label.
static NhcDispatch_e GetNhcDispatchType(uint8_t dispatch)
Get the NhcDispatch type.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
void SetEid(Eid_e extensionHeaderType)
Set the Extension Header Type.
bool CanCompressLowPanNhc(uint8_t headerType)
Checks if the next header can be compressed using NHC.
void Write(uint8_t const *buffer, uint32_t size)
bool m_omitUdpChecksum
Omit UDP checksum in NC1 encoding.
bool DoSend(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber, bool doSendFrom)
TracedCallback< Ptr< const Packet >, Ptr< SixLowPanNetDevice >, uint32_t > m_rxTrace
Callback to trace RX (reception) packets.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
virtual uint16_t GetMtu(void) const
Returns the link-layer MTU for this interface.
void SetNh(bool nhField)
Set the NH field values.
void SetTf(TrafficClassFlowLabel_e tfField)
Set the TF (Traffic Class, Flow Label) compression.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
uint32_t CopyBlob(uint8_t *blob, uint32_t size) const
Get the option header data blob.
static const uint32_t packetSize
void SetDstAddress(Ipv6Address dstAddress)
Set the Destination Address.
Ptr< NetDevice > m_netDevice
Smart pointer to the underlying NetDevice.
void HandleFragmentsTimeout(FragmentKey key, uint32_t iif)
Process the timeout for packet fragments.
void AddFragment(Ptr< Packet > fragment, uint16_t fragmentOffset)
Add a fragment to the pool.
bool ProcessFragment(Ptr< Packet > &packet, Address const &src, Address const &dst, bool isFirst)
Process a packet fragment.
void SetM(bool mField)
Set the M (Multicast) compression.
NhcDispatch_e
Dispatch values for Next Header compression.
void SetSrcPrefix(const uint8_t *srcPrefix)
Set the source prefix.
static bool IsMatchingType(const Address &address)
void SetDatagramTag(uint16_t datagramTag)
Set the datagram tag.
void SetEcn(uint8_t ecn)
Set the ECN (2bits).
6LoWPAN FRAG1 header - see RFC 4944.
uint32_t CompressLowPanHc1(Ptr< Packet > packet, Address const &src, Address const &dst)
Compress the headers according to HC1 compression.
uint8_t GetDatagramOffset(void) const
Get the datagram offset.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
LowPanHc1Addr_e GetSrcCompression() const
Get Source Compression type.
a unique identifier for an interface.
static const uint8_t PROT_NUMBER
protocol number (0x11)
TypeId SetParent(TypeId tid)
Set the parent TypeId.
uint32_t m_ifIndex
Interface index.
UDP LOWPAN_NHC Extension Header Encoding - see RFC 6282.
void SetC(bool cField)
Set the C (Checksum).
uint8_t DecompressLowPanNhc(Ptr< Packet > packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress)
Decompress the headers according to NHC compression.
static const uint16_t PROT_NUMBER
The protocol number for IPv6 (0x86DD).
virtual void SetAddress(Address address)
Set the address of this interface.
void DecompressLowPanHc1(Ptr< Packet > packet, Address const &src, Address const &dst)
Decompress the headers according to HC1 compression.
void SetNextHeader(uint8_t nextHeader)
Set the Next Header value.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
void AddHeader(const Header &header)
Add header to this packet.
void SetDam(HeaderCompression_e damField)
Set the DAM (Destination Address Mode) compression.
MapFragments_t m_fragments
Fragments hold to be rebuilt.
Ptr< UniformRandomVariable > m_rng
Rng for the fragments tag.
void SetFlowLabel(uint32_t flowLabel)
Set the Flow Label value.
virtual void DoDispose(void)
Destructor implementation.
void SetDatagramTag(uint16_t datagramTag)
Set the datagram tag.
uint16_t GetChecksum(void) const
Get the Checksum field value.