Files
eden-sim/contrib/tsn/model/tsn-net-device.h

200 lines
5.5 KiB
C++

#ifndef TSN_NET_DEVICE_H
#define TSN_NET_DEVICE_H
#include "ns3/ethernet-net-device.h"
#include "ns3/packet.h"
#include "ns3/queue.h"
#include "ns3/tsn-node.h"
#include "ns3/tsn-transmission-selection-algo.h"
#include "ns3/tas.h"
// Add a doxygen group for this module.
// If you have more than one file, this should be in only one of them.
/**
* \defgroup tsn Description of the tsn
*/
namespace ns3
{
class Tas;
class TsnNode;
class TsnNetDevice : public EthernetNetDevice
{
public:
/**
* \brief Get the TypeId
*
* \return The TypeId for this class
*/
static TypeId GetTypeId();
/**
* \brief Create a TsnNetDevice
*/
TsnNetDevice();
/**
* Destroy a TsnNetDevice
*
* This is the destructor for the TsnNetDevice.
*/
~TsnNetDevice();
/**
* Attach a queue to the TsnNetDevice.
*
* The TsnNetDevice "owns" a queue that implements a queueing
* method such as DropTailQueue
*
* \param queue Ptr to the new queue.
*/
void SetQueue(Ptr<Queue<Packet>> queue);
/**
* Attach a queue and a Transmission Selection Algo to the TsnNetDevice.
*
* \param queue Ptr to the new queue.
* \param tsa Ptr to the new Transmission Selection Algo.
*/
void SetQueue(Ptr<Queue<Packet>> q, Ptr<TsnTransmissionSelectionAlgo> tsa);
/**
* Update existing queue with a queue and a Transmission Selection Algo.
*
* \param queue_id of the queue to update
* \param queue Ptr to the new queue.
* \param tsa Ptr to the new Transmission Selection Algo.
*/
void UpdateQueue(uint32_t queue_id, Ptr<Queue<Packet>> q, Ptr<TsnTransmissionSelectionAlgo> tsa);
bool SendFrom(Ptr<Packet> packet,
const Address& source,
const Address& dest,
uint16_t ethertype) override;
/**
* This function is use to put GPTP frame in a specific FIFO without using QTAG
*/
bool SendFrom(Ptr<Packet> packet,
const Address& source,
const Address& dest,
uint16_t ethertype,
uint8_t pcp);
/**
* This function is use to put GPTP frame in a specific FIFO without using QTAG
*/
bool SendWithSpecificFIFO(Ptr<Packet> packet, const Address& dest, uint16_t ethertype, uint8_t pcp);
/**
* Receive a packet from a connected TsnNetDevice.
*
* The TsnNetDevice receives packets from its connected channel
* and forwards them up the protocol stack. This is the public method
* used by the channel to indicate that the last bit of a packet has
* arrived at the device.
*
* \param p Ptr to the received packet.
*/
void Receive(Ptr<Packet> p) override;
typedef Callback<bool, Ptr<TsnNetDevice>, Ptr<const Packet>, uint16_t, const Address&, Time> ReceiveCallbackWithTimestamp;
void SetReceiveCallbackWithTimestamp(ReceiveCallbackWithTimestamp cb);
typedef Callback<bool, Ptr<const Packet>, Time> TransmitCallbackWithTimestamp;
void SetTransmitCallbackWithTimestamp(TransmitCallbackWithTimestamp cb);
void SetNode(Ptr<TsnNode> node);
void AddGclEntry(Time duration, uint8_t states);
void StartTas();
void StartTas(Time startTime);
Ptr<Tas> GetTas();
void CheckForReadyPacket() override;
Ptr<TsnNode> GetNode();
protected :
/**
* Start Sending a Packet Down the Wire.
*
* The TransmitStart method is the method that is used internally in the
* EthernetNetDevice to begin the process of sending a packet out on
* the channel. The corresponding method is called on the channel to let
* it know that the physical device this class represents has virtually
* started sending signals. An event is scheduled for the time at which
* the bits have been completely transmitted.
*
* \see EthernetChannel::TransmitStart ()
* \see TransmitComplete()
* \param p a reference to the packet to send
* \param queue_id queue id of the packet to send
* \returns true if success, false on failure
*/
bool TransmitStart(Ptr<Packet> p, int queue_id);
/**
* Stop Sending a Packet Down the Wire and Begin the Interframe Gap.
*
* The TransmitComplete method is used internally to finish the process
* of sending a packet out on the channel.
*/
void TransmitComplete(int queue_id);
/**
*
*
*/
int TransmitSelection() override;
/**
* The trace source fired when packets are drop by FRER recovery function
*/
TracedCallback<Ptr<const Packet>> m_frerDropTrace;
/**
* The trace source fired when packets are drop by the MaxSDUSizeFilter (PSFP)
*/
TracedCallback<Ptr<const Packet>> m_maxSDUSizeFilterDropTrace;
/**
* The trace source fired when packets are drop by the Flow Meter (PSFP)
*/
TracedCallback<Ptr<const Packet>> m_REDFrameDropTrace;
ReceiveCallbackWithTimestamp m_rxCallbackWithTimestamp;
TransmitCallbackWithTimestamp m_txCallbackWithTimestamp;
//FRER
/**
* The TransmissionSelectionAlgos which this TsnNetDevice uses
*/
std::vector<Ptr<TsnTransmissionSelectionAlgo>> m_transmissionSelectionAlgos;
Ptr<TsnNode> m_node; //!< TSN Node owning this NetDevice
bool m_txHardwareLatencyExperienced = false;
private:
/**
* Find the nextEligible Queue for transimission
*
* \returns Int id to the queue.
*/
Ptr<Tas> m_tas;
EventId m_NextGatesUpdate;
};
}
#endif /* TSN_NET_DEVICE_H */