221 lines
7.7 KiB
C++
221 lines
7.7 KiB
C++
#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 */
|