/usr/include/ns3/arp-cache.h is in libns3-dev 3.13+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 226 227 228 229 230 231 232 233 234 235 236 237 238 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2006 INRIA
*
* 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: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#ifndef ARP_CACHE_H
#define ARP_CACHE_H
#include <stdint.h>
#include <list>
#include "ns3/simulator.h"
#include "ns3/callback.h"
#include "ns3/packet.h"
#include "ns3/nstime.h"
#include "ns3/net-device.h"
#include "ns3/ipv4-address.h"
#include "ns3/address.h"
#include "ns3/ptr.h"
#include "ns3/object.h"
#include "ns3/traced-callback.h"
#include "ns3/sgi-hashmap.h"
namespace ns3 {
class NetDevice;
class Ipv4Interface;
/**
* \ingroup arp
* \brief An ARP cache
*
* A cached lookup table for translating layer 3 addresses to layer 2.
* This implementation does lookups from IPv4 to a MAC address
*/
class ArpCache : public Object
{
private:
ArpCache (ArpCache const &);
ArpCache& operator= (ArpCache const &);
public:
static TypeId GetTypeId (void);
class Entry;
ArpCache ();
~ArpCache ();
/**
* \param device The hardware NetDevice associated with this ARP chache
* \param interface the Ipv4Interface associated with this ARP chache
*/
void SetDevice (Ptr<NetDevice> device, Ptr<Ipv4Interface> interface);
/**
* \return The NetDevice that this ARP cache is associated with
*/
Ptr<NetDevice> GetDevice (void) const;
/**
* \return the Ipv4Interface that this ARP cache is associated with
*/
Ptr<Ipv4Interface> GetInterface (void) const;
void SetAliveTimeout (Time aliveTimeout);
void SetDeadTimeout (Time deadTimeout);
void SetWaitReplyTimeout (Time waitReplyTimeout);
Time GetAliveTimeout (void) const;
Time GetDeadTimeout (void) const;
Time GetWaitReplyTimeout (void) const;
/**
* This callback is set when the ArpCache is set up and allows
* the cache to generate an Arp request when the WaitReply
* time expires and a retransmission must be sent
*
* \param arpRequestCallback Callback for transmitting an Arp request.
*/
void SetArpRequestCallback (Callback<void, Ptr<const ArpCache>,
Ipv4Address> arpRequestCallback);
/**
* This method will schedule a timeout at WaitReplyTimeout interval
* in the future, unless a timer is already running for the cache,
* in which case this method does nothing.
*/
void StartWaitReplyTimer (void);
/**
* \brief Do lookup in the ARP cache against an IP address
* \param destination The destination IPv4 address to lookup the MAC address
* of
* \return An ArpCache::Entry with info about layer 2
*/
ArpCache::Entry *Lookup (Ipv4Address destination);
/**
* \brief Add an Ipv4Address to this ARP cache
*/
ArpCache::Entry *Add (Ipv4Address to);
/**
* \brief Clear the ArpCache of all entries
*/
void Flush (void);
/**
* \brief A record that that holds information about an ArpCache entry
*/
class Entry {
public:
/**
* \brief Constructor
* \param arp The ArpCache this entry belongs to
*/
Entry (ArpCache *arp);
/**
* \brief Changes the state of this entry to dead
*/
void MarkDead (void);
/**
* \param macAddress
*/
void MarkAlive (Address macAddress);
/**
* \param waiting
*/
void MarkWaitReply (Ptr<Packet> waiting);
/**
* \param waiting
* \return
*/
bool UpdateWaitReply (Ptr<Packet> waiting);
/**
* \return True if the state of this entry is dead; false otherwise.
*/
bool IsDead (void);
/**
* \return True if the state of this entry is alive; false otherwise.
*/
bool IsAlive (void);
/**
* \return True if the state of this entry is wait_reply; false otherwise.
*/
bool IsWaitReply (void);
/**
* \return The MacAddress of this entry
*/
Address GetMacAddress (void) const;
/**
* \return The Ipv4Address for this entry
*/
Ipv4Address GetIpv4Address (void) const;
/**
* \param destination The Ipv4Address for this entry
*/
void SetIpv4Address (Ipv4Address destination);
/**
* \return True if this entry has timed out; false otherwise.
*
* This function returns true if the time elapsed strictly exceeds
* the timeout value (i.e., is not less than or equal to the timeout).
*/
bool IsExpired (void) const;
/**
* \returns 0 is no packet is pending, the next packet to send if
* packets are pending.
*/
Ptr<Packet> DequeuePending (void);
/**
* \returns number of retries that have been sent for an ArpRequest
* in WaitReply state.
*/
uint32_t GetRetries (void) const;
/**
* \brief Increment the counter of number of retries for an entry
*/
void IncrementRetries (void);
/**
* \brief Zero the counter of number of retries for an entry
*/
void ClearRetries (void);
private:
enum ArpCacheEntryState_e {
ALIVE,
WAIT_REPLY,
DEAD
};
void UpdateSeen (void);
Time GetTimeout (void) const;
ArpCache *m_arp;
ArpCacheEntryState_e m_state;
Time m_lastSeen;
Address m_macAddress;
Ipv4Address m_ipv4Address;
std::list<Ptr<Packet> > m_pending;
uint32_t m_retries;
};
private:
typedef sgi::hash_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash> Cache;
typedef sgi::hash_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash>::iterator CacheI;
virtual void DoDispose (void);
Ptr<NetDevice> m_device;
Ptr<Ipv4Interface> m_interface;
Time m_aliveTimeout;
Time m_deadTimeout;
Time m_waitReplyTimeout;
EventId m_waitReplyTimer;
Callback<void, Ptr<const ArpCache>, Ipv4Address> m_arpRequestCallback;
uint32_t m_maxRetries;
/**
* This function is an event handler for the event that the
* ArpCache wants to check whether it must retry any Arp requests.
* If there are no Arp requests pending, this event is not scheduled.
*/
void HandleWaitReplyTimeout (void);
uint32_t m_pendingQueueSize;
Cache m_arpCache;
TracedCallback<Ptr<const Packet> > m_dropTrace;
};
} // namespace ns3
#endif /* ARP_CACHE_H */
|