/usr/include/ns3.17/ns3/csma-channel.h is in libns3-dev 3.17+dfsg-1build1.
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 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 Emmanuelle Laprise
*
* 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: Emmanuelle Laprise<emmanuelle.laprise@bluekazoo.ca>
*/
#ifndef CSMA_CHANNEL_H
#define CSMA_CHANNEL_H
#include "ns3/channel.h"
#include "ns3/ptr.h"
#include "ns3/nstime.h"
#include "ns3/data-rate.h"
namespace ns3 {
class Packet;
class CsmaNetDevice;
/**
* \brief CsmaNetDevice Record
*
* Stores the information related to each net device that is
* connected to the channel.
*/
class CsmaDeviceRec {
public:
Ptr< CsmaNetDevice > devicePtr; /// Pointer to the net device
bool active; /// Is net device enabled to TX/RX
CsmaDeviceRec();
CsmaDeviceRec(Ptr< CsmaNetDevice > device);
CsmaDeviceRec (CsmaDeviceRec const &);
/**
* \return If the net device pointed to by the devicePtr is active
* and ready to RX/TX.
*/
bool IsActive ();
};
/**
* Current state of the channel
*/
enum WireState
{
IDLE, /**< Channel is IDLE, no packet is being transmitted */
TRANSMITTING, /**< Channel is BUSY, a packet is being written by a net device */
PROPAGATING /**< Channel is BUSY, packet is propagating to all attached net devices */
};
/**
* \brief Csma Channel.
*
* This class represents a simple Csma channel that can be used
* when many nodes are connected to one wire. It uses a single busy
* flag to indicate if the channel is currently in use. It does not
* take into account the distances between stations or the speed of
* light to determine collisions.
*/
class CsmaChannel : public Channel
{
public:
static TypeId GetTypeId (void);
/**
* \brief Create a CsmaChannel
*/
CsmaChannel ();
/**
* \brief Destroy a CsmaChannel
*/
virtual ~CsmaChannel ();
/**
* \brief Attach a given netdevice to this channel
*
* \param device Device pointer to the netdevice to attach to the channel
* \return The assigned device number
*/
int32_t Attach (Ptr<CsmaNetDevice> device);
/**
* \brief Detach a given netdevice from this channel
*
* The net device is marked as inactive and it is not allowed to
* receive or transmit packets
*
* \param device Device pointer to the netdevice to detach from the channel
* \return True if the device is found and attached to the channel,
* false if the device is not currently connected to the channel or
* can't be found.
*/
bool Detach (Ptr<CsmaNetDevice> device);
/**
* \brief Detach a given netdevice from this channel
*
* The net device is marked as inactive and it is not allowed to
* receive or transmit packets
*
* \param deviceId The deviceID assigned to the net device when it
* was connected to the channel
* \return True if the device is found and attached to the channel,
* false if the device is not currently connected to the channel or
* can't be found.
*/
bool Detach (uint32_t deviceId);
/**
* \brief Reattach a previously detached net device to the channel
*
* The net device is marked as active. It is now allowed to receive
* or transmit packets. The net device must have been previously
* attached to the channel using the attach function.
*
* \param deviceId The device ID assigned to the net device when it
* was connected to the channel
* \return True if the device is found and is not attached to the
* channel, false if the device is currently connected to the
* channel or can't be found.
*/
bool Reattach (uint32_t deviceId);
/**
* \brief Reattach a previously detached net device to the channel
*
* The net device is marked as active. It is now allowed to receive
* or transmit packets. The net device must have been previously
* attached to the channel using the attach function.
*
* \param device Device pointer to the netdevice to detach from the channel
* \return True if the device is found and is not attached to the
* channel, false if the device is currently connected to the
* channel or can't be found.
*/
bool Reattach (Ptr<CsmaNetDevice> device);
/**
* \brief Start transmitting a packet over the channel
*
* If the srcId belongs to a net device that is connected to the
* channel, packet transmission begins, and the channel becomes busy
* until the packet has completely reached all destinations.
*
* \param p A reference to the packet that will be transmitted over
* the channel
* \param srcId The device Id of the net device that wants to
* transmit on the channel.
* \return True if the channel is not busy and the transmitting net
* device is currently active.
*/
bool TransmitStart (Ptr<Packet> p, uint32_t srcId);
/**
* \brief Indicates that the net device has finished transmitting
* the packet over the channel
*
* The channel will stay busy until the packet has completely
* propagated to all net devices attached to the channel. The
* TransmitEnd function schedules the PropagationCompleteEvent which
* will free the channel for further transmissions. Stores the
* packet p as the m_currentPkt, the packet being currently
* transmitting.
*
* \return Returns true unless the source was detached before it
* completed its transmission.
*/
bool TransmitEnd ();
/**
* \brief Indicates that the channel has finished propagating the
* current packet. The channel is released and becomes free.
*
* Calls the receive function of every active net device that is
* attached to the channel.
*/
void PropagationCompleteEvent ();
/**
* \return Returns the device number assigned to a net device by the
* channel
*
* \param device Device pointer to the netdevice for which the device
* number is needed
*/
int32_t GetDeviceNum (Ptr<CsmaNetDevice> device);
/**
* \return Returns the state of the channel (IDLE -- free,
* TRANSMITTING -- busy, PROPAGATING - busy )
*/
WireState GetState ();
/**
* \brief Indicates if the channel is busy. The channel will only
* accept new packets for transmission if it is not busy.
*
* \return Returns true if the channel is busy and false if it is
* free.
*/
bool IsBusy ();
/**
* \brief Indicates if a net device is currently attached or
* detached from the channel.
*
* \param deviceId The ID that was assigned to the net device when
* it was attached to the channel.
* \return Returns true if the net device is attached to the
* channel, false otherwise.
*/
bool IsActive (uint32_t deviceId);
/**
* \return Returns the number of net devices that are currently
* attached to the channel.
*/
uint32_t GetNumActDevices (void);
/**
* \return Returns the total number of devices including devices
* that have been detached from the channel.
*/
virtual uint32_t GetNDevices (void) const;
/**
* \return Get a NetDevice pointer to a connected network device.
*
* \param i The index of the net device.
* \return Returns the pointer to the net device that is associated
* with deviceId i.
*/
virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
/**
* \return Get a CsmaNetDevice pointer to a connected network device.
*
* \param i The deviceId of the net device for which we want the
* pointer.
* \return Returns the pointer to the net device that is associated
* with deviceId i.
*/
Ptr<CsmaNetDevice> GetCsmaDevice (uint32_t i) const;
/**
* Get the assigned data rate of the channel
*
* \return Returns the DataRate to be used by device transmitters.
* with deviceId i.
*/
DataRate GetDataRate (void);
/**
* Get the assigned speed-of-light delay of the channel
*
* \return Returns the delay used by the channel.
*/
Time GetDelay (void);
private:
// Avoid implicit copy constructor and assignment (python bindings issues)
CsmaChannel (CsmaChannel const &);
CsmaChannel &operator = (CsmaChannel const &);
/**
* The assigned data rate of the channel
*/
DataRate m_bps;
/**
* The assigned speed-of-light delay of the channel
*/
Time m_delay;
/**
* List of the net devices that have been or are currently connected
* to the channel.
*
* Devices are nor removed from this list, they are marked as
* inactive. Otherwise the assigned device IDs will not refer to the
* correct NetDevice. The DeviceIds are used so that it is possible
* to have a number to refer to an entry in the list so that the
* whole list does not have to be searched when making sure that a
* source is attached to a channel when it is transmitting data.
*/
std::vector<CsmaDeviceRec> m_deviceList;
/**
* The Packet that is currently being transmitted on the channel (or last
* packet to have been transmitted on the channel if the channel is
* free.)
*/
Ptr<Packet> m_currentPkt;
/**
* Device Id of the source that is currently transmitting on the
* channel. Or last source to have transmitted a packet on the
* channel, if the channel is currently not busy.
*/
uint32_t m_currentSrc;
/**
* Current state of the channel
*/
WireState m_state;
};
} // namespace ns3
#endif /* CSMA_CHANNEL_H */
|