A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
sixlowpan-net-device.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 Universita' di Firenze, Italy
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
18 * Michele Muccio <michelemuccio@virgilio.it>
19 */
20
21#ifndef SIXLOWPAN_NET_DEVICE_H
22#define SIXLOWPAN_NET_DEVICE_H
23
24#include "ns3/net-device.h"
25#include "ns3/nstime.h"
26#include "ns3/random-variable-stream.h"
27#include "ns3/simulator.h"
28#include "ns3/traced-callback.h"
29
30#include <map>
31#include <stdint.h>
32#include <string>
33#include <tuple>
34
35namespace ns3
36{
37
38class Node;
39class UniformRandomVariable;
40class EventId;
41
73{
74 public:
79 {
86 };
87
92 static TypeId GetTypeId();
93
98
99 // Delete copy constructor and assignment operator to avoid misuse
102
103 // inherited from NetDevice base class
104 void SetIfIndex(const uint32_t index) override;
105 uint32_t GetIfIndex() const override;
106 Ptr<Channel> GetChannel() const override;
107 void SetAddress(Address address) override;
108 Address GetAddress() const override;
109 bool SetMtu(const uint16_t mtu) override;
110
118 uint16_t GetMtu() const override;
119 bool IsLinkUp() const override;
120 void AddLinkChangeCallback(Callback<void> callback) override;
121 bool IsBroadcast() const override;
122 Address GetBroadcast() const override;
123 bool IsMulticast() const override;
124 Address GetMulticast(Ipv4Address multicastGroup) const override;
125 bool IsPointToPoint() const override;
126 bool IsBridge() const override;
127 bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
128 bool SendFrom(Ptr<Packet> packet,
129 const Address& source,
130 const Address& dest,
131 uint16_t protocolNumber) override;
132 Ptr<Node> GetNode() const override;
133 void SetNode(Ptr<Node> node) override;
134 bool NeedsArp() const override;
137 bool SupportsSendFrom() const override;
138 Address GetMulticast(Ipv6Address addr) const override;
139
146
154 void SetNetDevice(Ptr<NetDevice> device);
155
164 int64_t AssignStreams(int64_t stream);
165
176 typedef void (*RxTxTracedCallback)(Ptr<const Packet> packet,
177 Ptr<SixLowPanNetDevice> sixNetDevice,
178 uint32_t ifindex);
179
191 typedef void (*DropTracedCallback)(DropReason reason,
192 Ptr<const Packet> packet,
193 Ptr<SixLowPanNetDevice> sixNetDevice,
194 uint32_t ifindex);
195
208 void AddContext(uint8_t contextId,
209 Ipv6Prefix contextPrefix,
210 bool compressionAllowed,
211 Time validLifetime);
212
225 bool GetContext(uint8_t contextId,
226 Ipv6Prefix& contextPrefix,
227 bool& compressionAllowed,
228 Time& validLifetime);
229
238 void RenewContext(uint8_t contextId, Time validLifetime);
239
247 void InvalidateContext(uint8_t contextId);
248
254 void RemoveContext(uint8_t contextId);
255
256 protected:
257 void DoDispose() override;
258
259 private:
270 Ptr<const Packet> packet,
271 uint16_t protocol,
272 const Address& source,
273 const Address& destination,
274 PacketType packetType);
275
290 bool DoSend(Ptr<Packet> packet,
291 const Address& source,
292 const Address& dest,
293 uint16_t protocolNumber,
294 bool doSendFrom);
295
300
306
319
332
346
354 uint32_t CompressLowPanHc1(Ptr<Packet> packet, const Address& src, const Address& dst);
355
362 void DecompressLowPanHc1(Ptr<Packet> packet, const Address& src, const Address& dst);
363
371 uint32_t CompressLowPanIphc(Ptr<Packet> packet, const Address& src, const Address& dst);
372
378 bool CanCompressLowPanNhc(uint8_t headerType);
379
387 bool DecompressLowPanIphc(Ptr<Packet> packet, const Address& src, const Address& dst);
388
398 uint8_t headerType,
399 const Address& src,
400 const Address& dst);
401
412 std::pair<uint8_t, bool> DecompressLowPanNhc(Ptr<Packet> packet,
413 const Address& src,
414 const Address& dst,
415 Ipv6Address srcAddress,
416 Ipv6Address dstAddress);
417
424 uint32_t CompressLowPanUdpNhc(Ptr<Packet> packet, bool omitChecksum);
425
433
437 typedef std::pair<std::pair<Address, Address>, std::pair<uint16_t, uint16_t>> FragmentKey_t;
438
440 typedef std::list<std::tuple<Time, FragmentKey_t, uint32_t>> FragmentsTimeoutsList_t;
442 typedef std::list<std::tuple<Time, FragmentKey_t, uint32_t>>::iterator FragmentsTimeoutsListI_t;
443
451
455 void HandleTimeout();
456
458
460
464 class Fragments : public SimpleRefCount<Fragments>
465 {
466 public:
470 Fragments();
471
475 ~Fragments();
476
482 void AddFragment(Ptr<Packet> fragment, uint16_t fragmentOffset);
483
489 void AddFirstFragment(Ptr<Packet> fragment);
490
495 bool IsEntire() const;
496
501 Ptr<Packet> GetPacket() const;
502
508
513 std::list<Ptr<Packet>> GetFragments() const;
514
520
526
527 private:
532
536 std::list<std::pair<Ptr<Packet>, uint16_t>> m_fragments;
537
542
547 };
548
561 void DoFragmentation(Ptr<Packet> packet,
562 uint32_t origPacketSize,
563 uint32_t origHdrSize,
564 uint32_t extraHdrSize,
565 std::list<Ptr<Packet>>& listFragments);
566
575 bool ProcessFragment(Ptr<Packet>& packet, const Address& src, const Address& dst, bool isFirst);
576
583
588
595
599 typedef std::map<FragmentKey_t, Ptr<Fragments>> MapFragments_t;
603 typedef std::map<FragmentKey_t, Ptr<Fragments>>::iterator MapFragmentsI_t;
604
607
613
615
617 uint8_t m_bc0Serial;
622 std::map<Address /* OriginatorAddress */, std::list<uint8_t /* SequenceNumber */>>
624
628
635
636 uint16_t m_etherType;
638
640
642
647 {
652 };
653
654 std::map<uint8_t, ContextEntry>
656
664 bool FindUnicastCompressionContext(Ipv6Address address, uint8_t& contextId);
665
673 bool FindMulticastCompressionContext(Ipv6Address address, uint8_t& contextId);
674
686};
687
688} // namespace ns3
689
690#endif /* SIXLOWPAN_NET_DEVICE_H */
a polymophic address class
Definition: address.h:100
Callback template class.
Definition: callback.h:438
An identifier for simulation events.
Definition: event-id.h:55
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
Describes an IPv6 address.
Definition: ipv6-address.h:49
Describes an IPv6 prefix.
Definition: ipv6-address.h:455
Network layer to device interface.
Definition: net-device.h:98
PacketType
Packet types are used as they are in Linux.
Definition: net-device.h:300
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
A template-based reference counting class.
void SetTimeoutIter(FragmentsTimeoutsListI_t iter)
Set the Timeout iterator.
bool IsEntire() const
If all fragments have been added.
FragmentsTimeoutsListI_t m_timeoutIter
Timeout iterator to "event" handler.
std::list< Ptr< Packet > > GetFragments() const
Get a list of the current stored fragments.
void SetPacketSize(uint32_t packetSize)
Set the packet-to-be-defragmented size.
void AddFragment(Ptr< Packet > fragment, uint16_t fragmentOffset)
Add a fragment to the pool.
uint32_t m_packetSize
The size of the reconstructed packet (bytes).
FragmentsTimeoutsListI_t GetTimeoutIter()
Get the Timeout iterator.
Ptr< Packet > GetPacket() const
Get the entire packet.
std::list< std::pair< Ptr< Packet >, uint16_t > > m_fragments
The current fragments.
Ptr< Packet > m_firstFragment
The very first fragment.
void AddFirstFragment(Ptr< Packet > fragment)
Add the first packet fragment.
Shim performing 6LoWPAN compression, decompression and fragmentation.
std::map< FragmentKey_t, Ptr< Fragments > > MapFragments_t
Container for fragment key -> fragments.
bool IsLinkUp() const override
std::map< FragmentKey_t, Ptr< Fragments > >::iterator MapFragmentsI_t
Container Iterator for fragment key -> fragments.
bool SetMtu(const uint16_t mtu) override
void DecompressLowPanUdpNhc(Ptr< Packet > packet, Ipv6Address saddr, Ipv6Address daddr)
Decompress the headers according to NHC compression.
bool DoSend(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber, bool doSendFrom)
Ipv6Address CleanPrefix(Ipv6Address address, Ipv6Prefix prefix)
Clean an address from its prefix.
void(* DropTracedCallback)(DropReason reason, Ptr< const Packet > packet, Ptr< SixLowPanNetDevice > sixNetDevice, uint32_t ifindex)
TracedCallback signature for packet drop events.
uint8_t m_bc0Serial
Serial number used in BC0 header.
bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber) override
void SetNode(Ptr< Node > node) override
bool NeedsArp() const override
EventId m_timeoutEvent
Event for the next scheduled timeout.
FragmentsTimeoutsListI_t SetTimeout(FragmentKey_t key, uint32_t iif)
Set a new timeout "event" for a fragmented packet.
Ptr< UniformRandomVariable > m_rng
Rng for the fragments tag.
uint16_t m_meshCacheLength
length of the cache for each source.
bool IsPointToPoint() const override
Return true if the net device is on a point-to-point link.
bool m_useIphc
Use IPHC or HC1.
void RenewContext(uint8_t contextId, Time validLifetime)
Renew a context used in IPHC stateful compression.
bool DecompressLowPanIphc(Ptr< Packet > packet, const Address &src, const Address &dst)
Decompress the headers according to IPHC compression.
uint32_t CompressLowPanHc1(Ptr< Packet > packet, const Address &src, const Address &dst)
Compress the headers according to HC1 compression.
bool IsBridge() const override
Return true if the net device is acting as a bridge.
void DoFragmentation(Ptr< Packet > packet, uint32_t origPacketSize, uint32_t origHdrSize, uint32_t extraHdrSize, std::list< Ptr< Packet > > &listFragments)
Performs a packet fragmentation.
Ptr< Node > m_node
Smart pointer to the Node.
bool CanCompressLowPanNhc(uint8_t headerType)
Checks if the next header can be compressed using NHC.
Ptr< Channel > GetChannel() const override
uint16_t GetMtu() const override
Returns the link-layer MTU for this interface.
std::list< std::tuple< Time, FragmentKey_t, uint32_t > >::iterator FragmentsTimeoutsListI_t
Container Iterator for fragment timeouts.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
bool m_forceEtherType
Force the EtherType number.
Address GetAddress() const override
void DropOldestFragmentSet()
Drops the oldest fragment set.
void SetReceiveCallback(NetDevice::ReceiveCallback cb) override
uint32_t m_compressionThreshold
Minimum L2 payload size.
Ptr< NetDevice > GetNetDevice() const
Returns a smart pointer to the underlying NetDevice.
void HandleTimeout()
Handles a fragmented packet timeout.
void ReceiveFromDevice(Ptr< NetDevice > device, Ptr< const Packet > packet, uint16_t protocol, const Address &source, const Address &destination, PacketType packetType)
Receives all the packets from a NetDevice for further processing.
uint32_t CompressLowPanNhc(Ptr< Packet > packet, uint8_t headerType, const Address &src, const Address &dst)
Compress the headers according to NHC compression.
TracedCallback< Ptr< const Packet >, Ptr< SixLowPanNetDevice >, uint32_t > m_txTrace
Callback to trace TX (transmission) packets.
std::pair< std::pair< Address, Address >, std::pair< uint16_t, uint16_t > > FragmentKey_t
Fragment identifier type: src/dst address src/dst port.
DropReason
Enumeration of the dropping reasons in SixLoWPAN.
@ DROP_DISALLOWED_COMPRESSION
HC1 while in IPHC mode or vice-versa.
@ DROP_UNKNOWN_EXTENSION
Unsupported compression kind.
@ DROP_FRAGMENT_BUFFER_FULL
Fragment buffer size exceeded.
@ DROP_SATETFUL_DECOMPRESSION_PROBLEM
Decompression failed due to missing or expired context.
@ DROP_FRAGMENT_TIMEOUT
Fragment timeout exceeded.
void AddContext(uint8_t contextId, Ipv6Prefix contextPrefix, bool compressionAllowed, Time validLifetime)
Add, remove, or update a context used in IPHC stateful compression.
Ptr< NetDevice > m_netDevice
Smart pointer to the underlying NetDevice.
void SetNetDevice(Ptr< NetDevice > device)
Setup SixLowPan to be a proxy for the specified NetDevice.
std::map< uint8_t, ContextEntry > m_contextTable
Table of the contexts used in compression/decompression.
TracedCallback< Ptr< const Packet >, Ptr< SixLowPanNetDevice >, uint32_t > m_rxTrace
Callback to trace RX (reception) packets.
bool GetContext(uint8_t contextId, Ipv6Prefix &contextPrefix, bool &compressionAllowed, Time &validLifetime)
Get a context used in IPHC stateful compression.
uint32_t GetIfIndex() const override
SixLowPanNetDevice(const SixLowPanNetDevice &)=delete
std::list< std::tuple< Time, FragmentKey_t, uint32_t > > FragmentsTimeoutsList_t
Container for fragment timeouts.
bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber) override
bool IsBroadcast() const override
Address Get16MacFrom48Mac(Address addr)
Get a Mac16 from its Mac48 pseudo-MAC.
TracedCallback< DropReason, Ptr< const Packet >, Ptr< SixLowPanNetDevice >, uint32_t > m_dropTrace
Callback to trace drop packets.
void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb) override
bool FindUnicastCompressionContext(Ipv6Address address, uint8_t &contextId)
Finds if the given unicast address matches a context for compression.
Ptr< RandomVariableStream > m_meshUnderJitter
Random variable for the mesh-under packet retransmission.
uint32_t CompressLowPanUdpNhc(Ptr< Packet > packet, bool omitChecksum)
Compress the headers according to NHC compression.
void RemoveContext(uint8_t contextId)
Remove a context used in IPHC stateful compression.
bool m_omitUdpChecksum
Omit UDP checksum in NC1 encoding.
Ptr< Node > GetNode() const override
void AddLinkChangeCallback(Callback< void > callback) override
uint32_t m_ifIndex
Interface index.
Address GetBroadcast() const override
void SetIfIndex(const uint32_t index) override
uint32_t CompressLowPanIphc(Ptr< Packet > packet, const Address &src, const Address &dst)
Compress the headers according to IPHC compression.
void(* RxTxTracedCallback)(Ptr< const Packet > packet, Ptr< SixLowPanNetDevice > sixNetDevice, uint32_t ifindex)
TracedCallback signature for packet send/receive events.
SixLowPanNetDevice & operator=(const SixLowPanNetDevice &)=delete
void DoDispose() override
Destructor implementation.
bool IsMulticast() const override
Address GetMulticast(Ipv4Address multicastGroup) const override
Make and return a MAC multicast address using the provided multicast group.
Time m_fragmentExpirationTimeout
Time limit for fragment rebuilding.
uint16_t m_fragmentReassemblyListSize
How many packets can be rebuilt at the same time.
uint8_t m_meshUnderHopsLeft
Start value for mesh-under hops left.
void SetAddress(Address address) override
Set the address of this interface.
void DecompressLowPanHc1(Ptr< Packet > packet, const Address &src, const Address &dst)
Decompress the headers according to HC1 compression.
FragmentsTimeoutsList_t m_timeoutEventList
Timeout "events" container.
std::pair< uint8_t, bool > DecompressLowPanNhc(Ptr< Packet > packet, const Address &src, const Address &dst, Ipv6Address srcAddress, Ipv6Address dstAddress)
Decompress the headers according to NHC compression.
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode.
void HandleFragmentsTimeout(FragmentKey_t key, uint32_t iif)
Process the timeout for packet fragments.
void InvalidateContext(uint8_t contextId)
Invalidate a context used in IPHC stateful compression.
static TypeId GetTypeId()
Get the type ID.
bool SupportsSendFrom() const override
NetDevice::ReceiveCallback m_rxCallback
The callback used to notify higher layers that a packet has been received.
bool ProcessFragment(Ptr< Packet > &packet, const Address &src, const Address &dst, bool isFirst)
Process a packet fragment.
MapFragments_t m_fragments
Fragments hold to be rebuilt.
bool FindMulticastCompressionContext(Ipv6Address address, uint8_t &contextId)
Finds if the given multicast address matches a context for compression.
bool m_meshUnder
Use a mesh-under routing.
std::map< Address, std::list< uint8_t > > m_seenPkts
Seen packets, memorized by OriginatorAddress, SequenceNumber.
SixLowPanNetDevice()
Constructor for the SixLowPanNetDevice.
uint16_t m_etherType
EtherType number (used only if m_forceEtherType is true).
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
Forward calls to a chain of Callback.
a unique identifier for an interface.
Definition: type-id.h:59
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Structure holding the information for a context (used in compression and decompression)
Ipv6Prefix contextPrefix
context prefix to be used in compression/decompression
bool compressionAllowed
compression and decompression allowed (true), decompression only (false)
Time validLifetime
validity period
static const uint32_t packetSize
Packet size generated at the AP.