/usr/include/ns3.26/ns3/bridge-net-device.h is in libns3-dev 3.26+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Gustavo Carneiro <gjc@inescporto.pt>
*/
#ifndef BRIDGE_NET_DEVICE_H
#define BRIDGE_NET_DEVICE_H
#include "ns3/net-device.h"
#include "ns3/mac48-address.h"
#include "ns3/nstime.h"
#include "ns3/bridge-channel.h"
#include <stdint.h>
#include <string>
#include <map>
namespace ns3 {
class Node;
/**
* \defgroup bridge Bridge Network Device
*
* \brief a virtual net device that bridges multiple LAN segments
*
* The BridgeNetDevice object is a "virtual" netdevice that aggregates
* multiple "real" netdevices and implements the data plane forwarding
* part of IEEE 802.1D. By adding a BridgeNetDevice to a Node, it
* will act as a "bridge", or "switch", to multiple LAN segments.
*
* By default the bridge netdevice implements a "learning bridge"
* algorithm (see 802.1D), where incoming unicast frames from one port
* may occasionally be forwarded throughout all other ports, but
* usually they are forwarded only to a single correct output port.
*
* \attention The Spanning Tree Protocol part of 802.1D is not
* implemented. Therefore, you have to be careful not to create
* bridging loops, or else the network will collapse.
*
* \attention Bridging is designed to work only with NetDevices
* modelling IEEE 802-style technologies, such as CsmaNetDevice and
* WifiNetDevice.
*
* \attention If including a WifiNetDevice in a bridge, the wifi
* device must be in Access Point mode. Adhoc mode is not supported
* with bridging.
*/
/**
* \ingroup bridge
* \brief a virtual net device that bridges multiple LAN segments
*/
class BridgeNetDevice : public NetDevice
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
BridgeNetDevice ();
virtual ~BridgeNetDevice ();
/**
* \brief Add a 'port' to a bridge device
* \param bridgePort the NetDevice to add
*
* This method adds a new bridge port to a BridgeNetDevice, so that
* the new bridge port NetDevice becomes part of the bridge and L2
* frames start being forwarded to/from this NetDevice.
*
* \param bridgePort NetDevice
* \attention The netdevice that is being added as bridge port must
* _not_ have an IP address. In order to add IP connectivity to a
* bridging node you must enable IP on the BridgeNetDevice itself,
* never on its port netdevices.
*/
void AddBridgePort (Ptr<NetDevice> bridgePort);
/**
* \brief Gets the number of bridged 'ports', i.e., the NetDevices currently bridged.
*
* \return the number of bridged ports.
*/
uint32_t GetNBridgePorts (void) const;
/**
* \brief Gets the n-th bridged port.
* \param n the port index
* \return the n-th bridged NetDevice
*/
Ptr<NetDevice> GetBridgePort (uint32_t n) const;
// inherited from NetDevice base class.
virtual void SetIfIndex (const uint32_t index);
virtual uint32_t GetIfIndex (void) const;
virtual Ptr<Channel> GetChannel (void) const;
virtual void SetAddress (Address address);
virtual Address GetAddress (void) const;
virtual bool SetMtu (const uint16_t mtu);
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
virtual void AddLinkChangeCallback (Callback<void> callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
virtual Address GetMulticast (Ipv4Address multicastGroup) const;
virtual bool IsPointToPoint (void) const;
virtual bool IsBridge (void) const;
virtual bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
virtual Ptr<Node> GetNode (void) const;
virtual void SetNode (Ptr<Node> node);
virtual bool NeedsArp (void) const;
virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb);
virtual void SetPromiscReceiveCallback (NetDevice::PromiscReceiveCallback cb);
virtual bool SupportsSendFrom () const;
virtual Address GetMulticast (Ipv6Address addr) const;
protected:
virtual void DoDispose (void);
/**
* \brief Receives a packet from one bridged 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,
Address const &source, Address const &destination, PacketType packetType);
/**
* \brief Forwards a unicast 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 ForwardUnicast (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 Learns the port a MAC address is sending from
* \param source source address
* \param port the port the source is sending from
*/
void Learn (Mac48Address source, Ptr<NetDevice> port);
/**
* \brief Gets the port associated to a source address
* \param source the source address
* \returns the port the source is associated to, or NULL if no association is known.
*/
Ptr<NetDevice> GetLearnedState (Mac48Address source);
private:
/**
* \brief Copy constructor
*
* Defined and unimplemented to avoid misuse
*/
BridgeNetDevice (const BridgeNetDevice &);
/**
* \brief Copy constructor
*
* Defined and unimplemented to avoid misuse
* \returns
*/
BridgeNetDevice &operator = (const BridgeNetDevice &);
NetDevice::ReceiveCallback m_rxCallback; //!< receive callback
NetDevice::PromiscReceiveCallback m_promiscRxCallback; //!< promiscuous receive callback
Mac48Address m_address; //!< MAC address of the NetDevice
Time m_expirationTime; //!< time it takes for learned MAC state to expire
/**
* \ingroup bridge
* Structure holding the status of an address
*/
struct LearnedState
{
Ptr<NetDevice> associatedPort; //!< port associated with the address
Time expirationTime; //!< time it takes for learned MAC state to expire
};
std::map<Mac48Address, LearnedState> m_learnState; //!< Container for known address statuses
Ptr<Node> m_node; //!< node owning this NetDevice
Ptr<BridgeChannel> m_channel; //!< virtual bridged channel
std::vector< Ptr<NetDevice> > m_ports; //!< bridged ports
uint32_t m_ifIndex; //!< Interface index
uint16_t m_mtu; //!< MTU of the bridged NetDevice
bool m_enableLearning; //!< true if the bridge will learn the node status
};
} // namespace ns3
#endif /* BRIDGE_NET_DEVICE_H */
|