80 typedef void (*
AntTxCallback)(uint8_t type, uint8_t direction,
bool broadcast);
93 bool broadcast)
override;
138 Ptr<Ipv4Route>
RouteOutput(Ptr<Packet> p,
const Ipv4Header& header, Ptr<NetDevice> oif,
139 Socket::SocketErrno& sockerr)
override;
140 bool RouteInput(Ptr<const Packet> p,
const Ipv4Header& header, Ptr<const NetDevice> idev,
149 Time::Unit unit = Time::S)
const override;
165 return m_logic ? m_logic->linkfailOriginsSuppressed() : 0;
172 uint64_t
DirectedSteers()
const {
return m_logic ? m_logic->directedSteers() : 0; }
178 return m_logic ? m_logic->table().numEntriesRegular() : 0;
181 return m_logic ? m_logic->table().numEntriesVirtual() : 0;
189 if (!m_logic)
return Ipv4Address();
190 const auto& t = m_logic->table();
191 const ::anthocnet::core::NodeAddress d =
ToCore(dest);
195 const double tau = t.getPheromoneRegular(d, nb);
201 return next ?
ToIpv4(next) : Ipv4Address();
223 uint64_t
RepairDiscards()
const {
return m_logic ? m_logic->repairDiscards() : 0; }
241 static ::anthocnet::core::NodeAddress
ToCore(Ipv4Address a) {
242 const uint32_t raw = a.Get();
243 if (raw == 0xFFFFFFFFu)
return 0;
247 return Ipv4Address(
static_cast<uint32_t
>(a));
252 Ptr<Ipv4Route> LoopbackRoute(
const Ipv4Header& header, Ptr<NetDevice> oif)
const;
253 bool IsMyOwnAddress(Ipv4Address src)
const;
254 Ptr<Socket> FindSocketWithInterfaceAddress(Ipv4InterfaceAddress addr)
const;
257 void RecvAnt(Ptr<Socket> socket);
258 void SendAnt(const ::anthocnet::core::AntMessage& msg, Ipv4Address dest);
259 void ExecuteDecisions(
const std::vector<::anthocnet::core::RouteDecision>& decisions,
263 void DeferredRouteOutput(Ptr<const Packet> p,
const Ipv4Header& header,
264 UnicastForwardCallback ucb, ErrorCallback ecb);
271 void HelloTimerExpire();
272 void ProactiveTimerExpire();
279 void ReactiveRetryTimerExpire();
285 void NotifyTxError(WifiMacDropReason reason, Ptr<const AHN_WIFI_MPDU> mpdu);
288 void NotifyAckedMpdu(Ptr<const AHN_WIFI_MPDU> mpdu);
305 Ptr<NetDevice>& dev, uint32_t& iface)
const;
319 struct SocketByBoundDevice {
320 bool operator()(
const Ptr<Socket>& a,
const Ptr<Socket>& b)
const;
322 std::map<Ptr<Socket>, Ipv4InterfaceAddress, SocketByBoundDevice> m_socketAddresses;
323 std::map<Ptr<Socket>, Ipv4InterfaceAddress, SocketByBoundDevice> m_socketSubnetBroadcast;
330 Ipv4Address linkLocal;
337 std::map<Ipv4Address, PeerRoute> m_peerRoutes;
345 std::map<uint32_t, std::set<::anthocnet::core::NodeAddress>> m_ifaceNeighbors;
350 std::unique_ptr<::anthocnet::core::AntRouterLogic> m_logic;
353 RequestQueue m_queue;
356 Timer m_proactiveTimer;
359 double m_timerJitter = 0.05;
360 Ptr<UniformRandomVariable> m_timerRng = CreateObject<UniformRandomVariable>();
365 Time TimerDelay(Time base,
bool first);
366 Timer m_reactiveRetryTimer;
369 Time m_helloInterval;
370 Time m_proactiveInterval;
375 double m_hopCountAlpha;
376 bool m_enableProactive;
377 bool m_enableDiffusion;
378 bool m_enableReactive;
380 bool m_enableLinkFail;
381 bool m_enableDirectedReactive;
382 bool m_shareKinematics;
383 bool m_enableLinkLifetime;
384 double m_linkLifetimeRange;
385 double m_linkLifetimeHorizon;
386 double m_linkLifetimeFloor;
387 bool m_enableQuietMode;
388 double m_quietTolerance;
389 double m_quietBackoffFactor;
390 uint32_t m_quietMaxBackoff;
391 bool m_enableAdaptiveEvaporation;
392 double m_adaptiveEvapRefChurn;
393 double m_adaptiveEvapMin;
394 double m_adaptiveEvapMax;
395 double m_adaptiveEvapTau;
396 Callback<double> m_energyProbe;
397 double m_proactiveBroadcastProb;
398 double m_proactiveVirtualMargin;
399 uint32_t m_maxHelloAdverts;
401 uint32_t m_txFailureThreshold;
405 uint32_t m_p2pHelloEvery = 1;
406 uint64_t m_helloTicks = 0;
407 bool m_enableMacFailureDetector;
408 uint32_t m_maxReinjectPerPacket;
409 double m_repairWaitFactor;
410 double m_repairTimeout;
412 bool m_enableMultipath;
413 double m_antAcceptanceFactor;
414 double m_antAcceptanceFactorNewHop;
415 double m_linkfailNotifyInterval;
417 Time m_reconvHoldCap;
418 Time m_repairHoldCap;
419 Time m_reactiveRetryInterval;
423 double m_macServiceAlpha;
424 double m_macServiceEwmaSec = 0.0;
426 bool m_backlogAtLastAck =
false;
427 bool m_enableMacMetric;
428 std::string m_linkMetric;
429 double m_sinrCriticalDb;
430 double m_sinrPenaltyCost;
433 std::deque<std::pair<uint64_t, double>> m_rxSinrByUid;
434 std::map<::anthocnet::core::NodeAddress, double> m_neighborSinrDb;
438 Ptr<WifiMac> m_wifiMac;
448 struct TxQueueState {
449 Ptr<Queue<Packet>> queue;
450 double ewmaSec = 0.0;
452 bool backlogAtLastDequeue =
false;
454 std::map<uint32_t, TxQueueState> m_txQueues;
455 void NotifyTxDequeue(uint32_t interface, Ptr<const Packet> p);
456 static void TxDequeueTrace(
RoutingProtocol*
self, uint32_t interface, Ptr<const Packet> p);
461 UnicastForwardCallback m_cachedUcb;
462 ErrorCallback m_cachedEcb;
468 std::set<::anthocnet::core::NodeAddress> m_everRouted;
471 uint64_t m_repairDiscardedPackets = 0;
472 uint64_t m_macReinjectedPackets = 0;
475 TracedCallback<uint8_t, uint8_t, bool> m_txAntTrace;
476 TracedCallback<uint8_t, uint8_t> m_rxAntTrace;
477 TracedCallback<uint32_t, uint32_t, bool> m_routeChangedTrace;
479 TracedCallback<const Ipv4Header&, Ptr<const Packet>> m_macReinjectTrace;
485 TracedCallback<const Ipv4Header&, Ptr<const Packet>> m_macReinjectSkipTrace;