22 #include "ns3/queue.h"
23 #include "ns3/simulator.h"
24 #include "ns3/ethernet-header.h"
25 #include "ns3/ethernet-trailer.h"
26 #include "ns3/llc-snap-header.h"
27 #include "ns3/error-model.h"
29 #include "ns3/boolean.h"
30 #include "ns3/uinteger.h"
31 #include "ns3/pointer.h"
32 #include "ns3/trace-source-accessor.h"
48 .AddConstructor<CsmaNetDevice> ()
49 .AddAttribute (
"Address",
50 "The MAC address of this device.",
53 MakeMac48AddressChecker ())
54 .AddAttribute (
"Mtu",
"The MAC-level Maximum Transmission Unit",
58 MakeUintegerChecker<uint16_t> ())
59 .AddAttribute (
"EncapsulationMode",
60 "The link-layer encapsulation type to use.",
65 .AddAttribute (
"SendEnable",
66 "Enable or disable the transmitter section of the device.",
69 MakeBooleanChecker ())
70 .AddAttribute (
"ReceiveEnable",
71 "Enable or disable the receiver section of the device.",
74 MakeBooleanChecker ())
75 .AddAttribute (
"ReceiveErrorModel",
76 "The receiver error model used to simulate packet loss",
79 MakePointerChecker<ErrorModel> ())
85 .AddAttribute (
"TxQueue",
86 "A queue to use as the transmit queue in the device.",
89 MakePointerChecker<Queue> ())
95 .AddTraceSource (
"MacTx",
96 "Trace source indicating a packet has arrived for transmission by this device",
98 .AddTraceSource (
"MacTxDrop",
99 "Trace source indicating a packet has been dropped by the device before transmission",
101 .AddTraceSource (
"MacPromiscRx",
102 "A packet has been received by this device, has been passed up from the physical layer "
103 "and is being forwarded up the local protocol stack. This is a promiscuous trace,",
105 .AddTraceSource (
"MacRx",
106 "A packet has been received by this device, has been passed up from the physical layer "
107 "and is being forwarded up the local protocol stack. This is a non-promiscuous trace,",
111 .AddTraceSource (
"MacRxDrop",
112 "Trace source indicating a packet was received, but dropped before being forwarded up the stack",
115 .AddTraceSource (
"MacTxBackoff",
116 "Trace source indicating a packet has been delayed by the CSMA backoff process",
122 .AddTraceSource (
"PhyTxBegin",
123 "Trace source indicating a packet has begun transmitting over the channel",
125 .AddTraceSource (
"PhyTxEnd",
126 "Trace source indicating a packet has been completely transmitted over the channel",
128 .AddTraceSource (
"PhyTxDrop",
129 "Trace source indicating a packet has been dropped by the device during transmission",
133 .AddTraceSource (
"PhyRxBegin",
134 "Trace source indicating a packet has begun being received by the device",
137 .AddTraceSource (
"PhyRxEnd",
138 "Trace source indicating a packet has been completely received by the device",
140 .AddTraceSource (
"PhyRxDrop",
141 "Trace source indicating a packet has been dropped by the device during reception",
146 .AddTraceSource (
"Sniffer",
147 "Trace source simulating a non-promiscuous packet sniffer attached to the device",
149 .AddTraceSource (
"PromiscSniffer",
150 "Trace source simulating a promiscuous packet sniffer attached to the device",
269 NS_LOG_FUNCTION (slotTime << minSlots << maxSlots << ceiling << maxRetries);
292 uint16_t lengthType = 0;
296 NS_LOG_LOGIC (
"Encapsulating packet as DIX (type interpretation)");
301 lengthType = protocolNumber;
312 memset (buffer, 0, 46);
319 NS_LOG_LOGIC (
"Encapsulating packet as LLC (length interpretation)");
341 memset (buffer, 0, 46);
347 "CsmaNetDevice::AddHeader(): 802.3 Length/Type field with LLC/SNAP: "
348 "length interpretation must not exceed device frame size minus overhead");
353 NS_FATAL_ERROR (
"CsmaNetDevice::AddHeader(): Unknown packet encapsulation mode");
357 NS_LOG_LOGIC (
"header.SetLengthType (" << lengthType <<
")");
371 CsmaNetDevice::ProcessHeader (
Ptr<Packet> p, uint16_t & param)
390 param = header.GetLengthType ();
396 param = llc.GetType ();
401 NS_FATAL_ERROR (
"CsmaNetDevice::ProcessHeader(): Unknown packet encapsulation mode");
479 NS_LOG_WARN (
"Channel TransmitStart returns an error");
663 if (senderDevice ==
this)
703 bool crcGood = trailer.
CheckFcs (packet);
933 AddHeader (packet, source, destination, protocolNumber);
941 if (
m_queue->Enqueue (packet) ==
false)
954 if (
m_queue->IsEmpty () ==
false)
uint32_t m_ifIndex
The interface index (really net evice index) that has been assigned to this network device...
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
TracedCallback< Ptr< const Packet > > m_phyRxBeginTrace
The trace source fired when a packet begins the reception process from the medium.
keep track of time values and allow control of global simulation resolution
Ptr< Queue > m_queue
The Queue which this CsmaNetDevice uses as a packet source.
void ResetBackoffTime(void)
Indicates to the backoff object that the last packet was successfully transmitted and that the number...
TracedCallback< Ptr< const Packet > > m_phyTxBeginTrace
The trace source fired when a packet begins the transmission process on the medium.
#define NS_LOG_FUNCTION(parameters)
TxMachineState m_txMachineState
The state of the Net Device transmit state machine.
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
void SetReceiveEnable(bool enable)
Enable or disable the receive side of the network device.
Packet addressed to someone else.
void SetEncapsulationMode(CsmaNetDevice::EncapsulationMode mode)
Set the encapsulation mode of this device.
CsmaNetDevice::EncapsulationMode GetEncapsulationMode(void)
Get the encapsulation mode of this device.
void TransmitReadyEvent(void)
Cause the Transmitter to Become Ready to Send Another Packet.
void AddHeader(Ptr< Packet > p, Mac48Address source, Mac48Address dest, uint16_t protocolNumber)
Adds the necessary headers and trailers to a packet of data in order to respect the packet type...
TracedCallback< Ptr< const Packet > > m_macPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
uint32_t m_maxSlots
Maximum number of backoff slots (when multiplied by m_slotTime, determines maximum backoff time) ...
CsmaNetDevice()
Construct a CsmaNetDevice.
TracedCallback< Ptr< const Packet > > m_phyTxEndTrace
The trace source fired when a packet ends the transmission process on the medium. ...
void CalcFcs(Ptr< const Packet > p)
Updates the Fcs Field to the correct FCS.
void Receive(Ptr< Packet > p, Ptr< CsmaNetDevice > sender)
Receive a packet from a connected CsmaChannel.
static bool ChecksumEnabled(void)
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
TracedCallback< Ptr< const Packet > > m_phyRxEndTrace
The trace source fired when a packet ends the reception process from the medium.
uint64_t GetUid(void) const
A packet is allocated a new uid when it is created empty or with zero-filled payload.
Ptr< Packet > m_currentPkt
Next packet that will be transmitted (if transmitter is not currently transmitting) or packet that is...
bool IsNull(void) const
Check for null implementation.
#define NS_ASSERT(condition)
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the CsmaNetDevice.
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
The transmitter is busy transmitting a packet.
Channel is IDLE, no packet is being transmitted.
void TransmitAbort(void)
Aborts the transmission of the current packet.
uint32_t m_maxRetries
Maximum number of transmission retries before the packet is dropped.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
Start sending a packet down the channel, with MAC spoofing.
uint32_t GetSize(void) const
bool IsBroadcast(void) const
TracedCallback< Ptr< const Packet > > m_macRxDropTrace
The trace source fired for packets successfully received by the device but dropped before being forwa...
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
virtual Address GetBroadcast(void) const
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
virtual void SetIfIndex(const uint32_t index)
EncapsulationMode
Enumeration of the types of packets supported in the class.
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual ~CsmaNetDevice()
Destroy a CsmaNetDevice.
virtual bool NeedsArp(void) const
Does this device need to use the address resolution protocol?
TracedCallback< Ptr< const Packet > > m_promiscSnifferTrace
A trace source that emulates a promiscuous mode protocol sniffer connected to the device...
a polymophic address class
bool MaxRetriesReached(void)
Channel is BUSY, a packet is being written by a net device.
double GetSeconds(void) const
TracedCallback m_linkChangeCallbacks
List of callbacks to fire if the link changes state (up or down).
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
The transmitter is waiting for the channel to be free.
double CalculateTxTime(uint32_t bytes) const
Calculate transmission time.
TracedCallback< Ptr< const Packet > > m_macTxBackoffTrace
The trace source fired when the mac layer is forced to begin the backoff process for a packet...
DataRate m_bps
The data rate that the Net Device uses to simulate packet transmission timing.
virtual bool IsLinkUp(void) const
void SetQueue(Ptr< Queue > queue)
Attach a queue to the CsmaNetDevice.
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
hold variables of type 'enum'
bool CheckFcs(Ptr< const Packet > p) const
Calculate an FCS on the provided packet and check this value against the FCS found when the trailer w...
static TypeId GetTypeId(void)
static Mac48Address GetMulticast(Ipv4Address address)
void TransmitCompleteEvent(void)
Stop Sending a Packet Down the Wire and Begin the Interframe Gap.
Hold an unsigned integer type.
bool IsReceiveEnabled(void)
Is the receive side of the network device enabled?
NS_LOG_COMPONENT_DEFINE("CsmaNetDevice")
uint32_t m_deviceId
Device ID returned by the attached functions.
virtual Ptr< Node > GetNode(void) const
Get the node to which this device is attached.
bool m_sendEnable
Enable net device to send packets.
Ptr< Queue > GetQueue(void) const
Get a copy of the attached Queue.
void NotifyLinkUp(void)
Notify any interested parties that the link has come up.
void SetInterframeGap(Time t)
Set the interframe gap used to separate packets.
virtual Address GetAddress(void) const
#define NS_LOG_LOGIC(msg)
virtual uint32_t GetIfIndex(void) const
static Mac48Address ConvertFrom(const Address &address)
virtual uint16_t GetMtu(void) const
virtual void SetPromiscReceiveCallback(PromiscReceiveCallback cb)
Ptr< Packet > Copy(void) const
TracedCallback< Ptr< const Packet > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet as it tries to transmit it.
Packet trailer for Ethernet.
void EnableFcs(bool enable)
Enable or disable FCS checking and calculations.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
bool m_receiveEnable
Enable net device to receive packets.
Ptr< ErrorModel > m_receiveErrorModel
Error model for receive packet events.
void AddTrailer(const Trailer &trailer)
Add trailer to this packet.
Ptr< CsmaChannel > m_channel
The CsmaChannel to which this CsmaNetDevice has been attached.
void RemoveAtEnd(uint32_t size)
Remove size bytes from the end of the current packet It is safe to remove more bytes than are present...
static const uint16_t DEFAULT_MTU
uint32_t RemoveTrailer(Trailer &trailer)
Remove a deserialized trailer from the internal buffer.
Time m_tInterframeGap
The interframe gap that the Net Device uses insert time between packet transmission.
virtual Ptr< Channel > GetChannel(void) const
virtual bool IsBridge(void) const
Is this a bridge?
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
virtual bool SetMtu(const uint16_t mtu)
virtual bool SupportsSendFrom(void) const
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
#define NS_ASSERT_MSG(condition, message)
Encapsulation mode not set.
bool m_linkUp
Flag indicating whether or not the link is up.
Mac48Address m_address
The MAC address which has been assigned to this device.
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
EncapsulationMode m_encapMode
The type of packet that should be created by the AddHeader function and that should be processed by t...
NetDevice::ReceiveCallback m_rxCallback
The callback used to notify higher layers that a packet has been received.
uint32_t m_mtu
The Maximum Transmission Unit.
void SetBackoffParams(Time slotTime, uint32_t minSlots, uint32_t maxSlots, uint32_t maxRetries, uint32_t ceiling)
Set the backoff parameters used to determine the wait to retry transmitting a packet when the channel...
void ConnectWithoutContext(const CallbackBase &callback)
Backoff m_backoff
Holds the backoff parameters and is used to calculate the next backoff time to use when the channel i...
TracedCallback< Ptr< const Packet > > m_macTxDropTrace
The trace source fired when packets coming into the "top" of the device at the L3/L2 transition are d...
Network layer to device interface.
The transmitter is ready to begin transmission of a packet.
hold objects of type ns3::Mac48Address
void SetSendEnable(bool enable)
Enable or disable the send side of the network device.
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
Set the callback to be used to notify higher layers when a packet has been received.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
uint32_t m_minSlots
Minimum number of backoff slots (when multiplied by m_slotTime, determines minimum backoff time) ...
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode...
virtual void SetAddress(Address address)
Set the address of this interface.
bool IsSendEnabled(void)
Is the send side of the network device enabled?
void TransmitStart()
Start Sending a Packet Down the Wire.
Ptr< Node > m_node
The Node to which this device is attached.
PacketType
Packet types are used as they are in Linux.
virtual void AddLinkChangeCallback(Callback< void > callback)
bool Attach(Ptr< CsmaChannel > ch)
Attach the device to a channel.
virtual void SetNode(Ptr< Node > node)
Set the node to which this device is being attached.
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
Start sending a packet down the channel.
Packet addressed to multicast group.
virtual bool IsMulticast(void) const
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
virtual void DoDispose(void)
Perform any object release functionality required to break reference cycles in reference counted obje...
a unique identifier for an interface.
virtual bool IsBroadcast(void) const
Time m_slotTime
Length of one slot.
TypeId SetParent(TypeId tid)
void AddHeader(const Header &header)
Add header to this packet.
DIX II / Ethernet II packet.
virtual bool IsPointToPoint(void) const
Is this a point to point link?
The transmitter is in the interframe gap time.
TracedCallback< Ptr< const Packet > > m_macTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition...
void IncrNumRetries(void)
Increments the number of retries by 1.
uint32_t m_ceiling
Caps the exponential function when the number of retries reaches m_ceiling.