Update README and add contrib dir
This commit is contained in:
220
contrib/ethernet/model/switch-net-device.h
Normal file
220
contrib/ethernet/model/switch-net-device.h
Normal file
@@ -0,0 +1,220 @@
|
||||
#ifndef SWITCH_NET_DEVICE_H
|
||||
#define SWITCH_NET_DEVICE_H
|
||||
|
||||
#include "switch-channel.h"
|
||||
|
||||
#include "ns3/net-device.h"
|
||||
#include "ns3/mac48-address.h"
|
||||
#include "ns3/net-device.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/simulator.h"
|
||||
|
||||
#include <map>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* \file
|
||||
* \ingroup ethernet
|
||||
* ns3::SwitchNetDevice declaration.
|
||||
*/
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
|
||||
class Node;
|
||||
|
||||
/**
|
||||
* \brief a virtual net device that bridges multiple LAN segments
|
||||
*
|
||||
* The SwitchNetDevice object is a "virtual" netdevice that aggregates
|
||||
* multiple "real" netdevices and implements the data plane forwarding
|
||||
* part of IEEE 802.1D. By adding a SwitchNetDevice to a Node, it
|
||||
* will act as a "switch" to multiple LAN segments.
|
||||
*
|
||||
* \attention The switch netdevice don't implement a "Learning bridge" algorithm
|
||||
* or Spanning Tree Protocol as described in 802.1D
|
||||
*
|
||||
* \attention Switching is designed to work only with Ethernet NetDevices
|
||||
* modelling IEEE 802-style technologies, such as EthernetNetDevice
|
||||
*/
|
||||
|
||||
/**
|
||||
* \ingroup ethernet
|
||||
* \brief a virtual net device that bridges multiple LAN segments
|
||||
*/
|
||||
class SwitchNetDevice : public NetDevice
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Get the type ID.
|
||||
* \return the object TypeId
|
||||
*/
|
||||
static TypeId GetTypeId();
|
||||
SwitchNetDevice();
|
||||
~SwitchNetDevice() override;
|
||||
|
||||
// Delete copy constructor and assignment operator to avoid misuse
|
||||
SwitchNetDevice(const SwitchNetDevice&) = delete;
|
||||
SwitchNetDevice& operator=(const SwitchNetDevice&) = delete;
|
||||
|
||||
/**
|
||||
* \brief Add a 'port' to a switch device
|
||||
* \param switchPort the NetDevice to add
|
||||
*
|
||||
* This method adds a new switch port to a SwitchNetDevice, so that
|
||||
* the new switch port NetDevice becomes part of the switch and L2
|
||||
* frames start being forwarded to/from this NetDevice.
|
||||
*
|
||||
* \attention The netdevice that is being added as switch port must
|
||||
* _not_ have an IP address. In order to add IP connectivity to a
|
||||
* bridging node you must enable IP on the SwitchNetDevice itself,
|
||||
* never on its port netdevices.
|
||||
*/
|
||||
void AddSwitchPort(Ptr<NetDevice> switchPort);
|
||||
|
||||
/**
|
||||
* \brief Gets the number of switched 'ports', i.e., the NetDevices currently switched.
|
||||
*
|
||||
* \return the number of switched ports.
|
||||
*/
|
||||
uint32_t GetNSwitchPorts() const;
|
||||
|
||||
/**
|
||||
* \brief Gets the n-th switched port.
|
||||
* \param n the port index
|
||||
* \return the n-th switched NetDevice
|
||||
*/
|
||||
Ptr<NetDevice> GetSwitchPort(uint32_t n) const;
|
||||
|
||||
// inherited from NetDevice base class.
|
||||
void SetIfIndex(const uint32_t index) override;
|
||||
uint32_t GetIfIndex() const override;
|
||||
Ptr<Channel> GetChannel() const override;
|
||||
void SetAddress(Address address) override;
|
||||
Address GetAddress() const override;
|
||||
bool SetMtu(const uint16_t mtu) override;
|
||||
uint16_t GetMtu() const override;
|
||||
bool IsLinkUp() const override;
|
||||
void AddLinkChangeCallback(Callback<void> callback) override;
|
||||
bool IsBroadcast() const override;
|
||||
Address GetBroadcast() const override;
|
||||
bool IsMulticast() const override;
|
||||
Address GetMulticast(Ipv4Address multicastGroup) const override;
|
||||
bool IsPointToPoint() const override;
|
||||
bool IsBridge() const override;
|
||||
bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
|
||||
bool SendFrom(Ptr<Packet> packet,
|
||||
const Address& source,
|
||||
const Address& dest,
|
||||
uint16_t protocolNumber) override;
|
||||
Ptr<Node> GetNode() const override;
|
||||
void SetNode(Ptr<Node> node) override;
|
||||
bool NeedsArp() const override;
|
||||
void SetReceiveCallback(NetDevice::ReceiveCallback cb) override;
|
||||
void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb) override;
|
||||
bool SupportsSendFrom() const override;
|
||||
Address GetMulticast(Ipv6Address addr) const override;
|
||||
|
||||
/**
|
||||
* \brief Add a entry to the forwarding table
|
||||
* \param dest destination mac
|
||||
* \param vid Vlan ID
|
||||
* \param outPorts vector of output port
|
||||
*/
|
||||
void AddForwardingTableEntry(Mac48Address dest,
|
||||
uint16_t vid,
|
||||
std::vector<Ptr<NetDevice>> outPorts);
|
||||
protected:
|
||||
void DoDispose() override;
|
||||
|
||||
/**
|
||||
* \brief Receives a packet from one switched port.
|
||||
* \param device the originating port
|
||||
* \param packet the received packet
|
||||
* \param protocol the packet protocol (e.g., Ethertype)
|
||||
* \param source the packet source
|
||||
* \param destination the packet destination
|
||||
* \param packetType the packet type (e.g., host, broadcast, etc.)
|
||||
*/
|
||||
void ReceiveFromDevice(Ptr<NetDevice> device,
|
||||
Ptr<const Packet> packet,
|
||||
uint16_t protocol,
|
||||
const Address& source,
|
||||
const Address& destination,
|
||||
PacketType packetType);
|
||||
|
||||
/**
|
||||
* \brief Forwards a packet
|
||||
* \param incomingPort the packet incoming port
|
||||
* \param packet the packet
|
||||
* \param protocol the packet protocol (e.g., Ethertype)
|
||||
* \param src the packet source
|
||||
* \param dst the packet destination
|
||||
*/
|
||||
void Forward(Ptr<NetDevice> incomingPort,
|
||||
Ptr<const Packet> packet,
|
||||
uint16_t protocol,
|
||||
Mac48Address src,
|
||||
Mac48Address dst);
|
||||
|
||||
/**
|
||||
* \brief Forwards a broadcast or a multicast packet
|
||||
* \param incomingPort the packet incoming port
|
||||
* \param packet the packet
|
||||
* \param protocol the packet protocol (e.g., Ethertype)
|
||||
* \param src the packet source
|
||||
* \param dst the packet destination
|
||||
*/
|
||||
void ForwardBroadcast(Ptr<NetDevice> incomingPort,
|
||||
Ptr<const Packet> packet,
|
||||
uint16_t protocol,
|
||||
Mac48Address src,
|
||||
Mac48Address dst);
|
||||
|
||||
/**
|
||||
* \brief Get the output ports from the forwarding table
|
||||
* \param dest destination mac
|
||||
* \param vid Vlan ID
|
||||
* \return output ports
|
||||
*/
|
||||
std::vector<Ptr<NetDevice>> GetOutputPortsFromForwardingTable(Mac48Address dest,
|
||||
uint16_t vid);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
NetDevice::ReceiveCallback m_rxCallback; //!< receive callback
|
||||
NetDevice::PromiscReceiveCallback m_promiscRxCallback; //!< promiscuous receive callback
|
||||
|
||||
Mac48Address m_address; //!< MAC address of the NetDevice
|
||||
|
||||
/**
|
||||
* \ingroup ethernet
|
||||
* Structure holding the association between ports and vid for a mac destination address
|
||||
*/
|
||||
struct PortsToVidAssociation
|
||||
{
|
||||
Mac48Address dest;
|
||||
uint16_t vid;
|
||||
std::vector<Ptr<NetDevice>> associatedPorts;
|
||||
};
|
||||
|
||||
std::vector<PortsToVidAssociation> m_forwardingTable; //!< Container for forwarding table
|
||||
Ptr<Node> m_node; //!< node owning this NetDevice
|
||||
Ptr<SwitchChannel> m_channel; //!< virtual bridged channel
|
||||
std::vector<Ptr<NetDevice>> m_ports; //!< switched ports
|
||||
uint32_t m_ifIndex; //!< Interface index
|
||||
uint16_t m_mtu; //!< MTU of the switched NetDevice
|
||||
|
||||
Time m_minForwardingLatency;
|
||||
Time m_maxForwardingLatency;
|
||||
|
||||
uint16_t m_maxPortNumber;
|
||||
uint16_t m_maxFdbEntryNumber;
|
||||
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* SWITCH_NET_DEVICE_H */
|
||||
Reference in New Issue
Block a user