A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
dsr-routing.h
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2011 Yufei Cheng
4
*
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License version 2 as
7
* published by the Free Software Foundation;
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*
18
* Author: Yufei Cheng <yfcheng@ittc.ku.edu>
19
*
20
* James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
21
* ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets
22
* Information and Telecommunication Technology Center (ITTC)
23
* and Department of Electrical Engineering and Computer Science
24
* The University of Kansas Lawrence, KS USA.
25
*
26
* Work supported in part by NSF FIND (Future Internet Design) Program
27
* under grant CNS-0626918 (Postmodern Internet Architecture),
28
* NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
29
* US Department of Defense (DoD), and ITTC at The University of Kansas.
30
*/
31
32
#ifndef DSR_ROUTING_H
33
#define DSR_ROUTING_H
34
35
#include <map>
36
#include <list>
37
#include <vector>
38
#include <stdint.h>
39
#include <cassert>
40
#include <sys/types.h>
41
42
#include "ns3/callback.h"
43
#include "ns3/object.h"
44
#include "ns3/node.h"
45
#include "ns3/ptr.h"
46
#include "ns3/buffer.h"
47
#include "ns3/packet.h"
48
#include "ns3/ipv4.h"
49
#include "ns3/ip-l4-protocol.h"
50
#include "ns3/ipv4-l3-protocol.h"
51
#include "ns3/icmpv4-l4-protocol.h"
52
#include "ns3/ipv4-interface.h"
53
#include "ns3/ipv4-header.h"
54
#include "ns3/ipv4-address.h"
55
#include "ns3/traced-callback.h"
56
#include "ns3/random-variable-stream.h"
57
#include "ns3/ipv4-route.h"
58
#include "ns3/timer.h"
59
#include "ns3/net-device.h"
60
#include "ns3/output-stream-wrapper.h"
61
#include "ns3/wifi-mac.h"
62
#include "ns3/socket.h"
63
#include "ns3/event-garbage-collector.h"
64
#include "ns3/test.h"
65
66
#include "
dsr-network-queue.h
"
67
#include "
dsr-rcache.h
"
68
#include "
dsr-rreq-table.h
"
69
#include "
dsr-maintain-buff.h
"
70
#include "
dsr-passive-buff.h
"
71
#include "
dsr-option-header.h
"
72
#include "
dsr-fs-header.h
"
73
#include "
dsr-rsendbuff.h
"
74
#include "
dsr-errorbuff.h
"
75
#include "
dsr-gratuitous-reply-table.h
"
76
77
namespace
ns3 {
78
79
class
Packet;
80
class
Node;
81
class
Ipv4;
82
class
Ipv4Address;
83
class
Ipv4Header;
84
class
Ipv4Interface;
85
class
Ipv4L3Protocol;
86
class
Time;
87
88
namespace
dsr {
89
90
class
DsrOptions;
95
class
DsrRouting
:
public
IpL4Protocol
96
{
97
public
:
102
static
TypeId
GetTypeId
();
106
static
const
uint8_t
PROT_NUMBER
;
110
DsrRouting
();
114
virtual
~DsrRouting
();
119
Ptr<Node>
GetNode
()
const
;
124
void
SetNode
(
Ptr<Node>
node);
129
void
SetRouteCache
(
Ptr<dsr::RouteCache>
r);
134
Ptr<dsr::RouteCache>
GetRouteCache
()
const
;
139
void
SetRequestTable
(
Ptr<dsr::RreqTable>
r);
144
Ptr<dsr::RreqTable>
GetRequestTable
()
const
;
149
void
SetPassiveBuffer
(
Ptr<dsr::PassiveBuffer>
r);
154
Ptr<dsr::PassiveBuffer>
GetPassiveBuffer
()
const
;
155
157
//\{
158
bool
IsLinkCache
();
159
void
UseExtends
(
RouteCacheEntry::IP_VECTOR
rt);
160
bool
LookupRoute
(
Ipv4Address
id
,
RouteCacheEntry
& rt);
161
bool
AddRoute_Link
(
RouteCacheEntry::IP_VECTOR
nodelist,
Ipv4Address
source);
162
bool
AddRoute
(
RouteCacheEntry
& rt);
163
void
DeleteAllRoutesIncludeLink
(
Ipv4Address
errorSrc,
Ipv4Address
unreachNode,
Ipv4Address
node);
164
bool
UpdateRouteEntry
(
Ipv4Address
dst);
165
bool
FindSourceEntry
(
Ipv4Address
src,
Ipv4Address
dst, uint16_t
id
);
166
//\}
167
172
void
ConnectCallbacks
();
177
Ptr<NetDevice>
GetNetDeviceFromContext
(std::string context);
182
std::vector<std::string>
GetElementsFromContext
(std::string context);
187
uint16_t
GetIDfromIP
(
Ipv4Address
address
);
192
Ipv4Address
GetIPfromID
(uint16_t
id
);
197
Ipv4Address
GetIPfromMAC
(
Mac48Address
address
);
202
Ptr<Node>
GetNodeWithAddress
(
Ipv4Address
ipv4Address);
206
void
PrintVector
(std::vector<Ipv4Address>& vec);
211
Ipv4Address
SearchNextHop
(
Ipv4Address
ipv4Address, std::vector<Ipv4Address>& vec);
216
int
GetProtocolNumber
(
void
)
const
;
220
void
SendBuffTimerExpire
();
224
void
CheckSendBuffer
();
228
void
PacketNewRoute
(
Ptr<Packet>
packet,
229
Ipv4Address
source,
230
Ipv4Address
destination,
231
uint8_t protocol);
237
Ptr<Ipv4Route>
SetRoute
(
Ipv4Address
nextHop,
Ipv4Address
srcAddress);
242
uint32_t
GetPriority
(
DsrMessageType
messageType);
246
void
SendUnreachError
(
Ipv4Address
errorHop,
Ipv4Address
destination,
Ipv4Address
originalDst, uint8_t salvage, uint8_t protocol);
250
void
ForwardErrPacket
(
DsrOptionRerrUnreachHeader
&rerr,
251
DsrOptionSRHeader
&sourceRoute,
252
Ipv4Address
nextHop,
253
uint8_t protocol,
254
Ptr<Ipv4Route>
route);
258
void
Send
(
Ptr<Packet>
packet,
Ipv4Address
source,
259
Ipv4Address
destination, uint8_t protocol,
Ptr<Ipv4Route>
route);
263
uint16_t
AddAckReqHeader
(
Ptr<Packet>
&packet,
Ipv4Address
nextHop);
267
void
SendPacket
(
Ptr<Packet>
packet,
Ipv4Address
source,
Ipv4Address
nextHop, uint8_t protocol);
271
void
Scheduler
(uint32_t priority);
275
void
PriorityScheduler
(uint32_t priority,
bool
continueWithFirst);
279
void
IncreaseRetransTimer
();
283
bool
SendRealDown
(
DsrNetworkQueueEntry
& newEntry);
288
void
SendPacketFromBuffer
(
DsrOptionSRHeader
const
&sourceRoute,
289
Ipv4Address
nextHop,
290
uint8_t protocol);
294
bool
PassiveEntryCheck
(
Ptr<Packet>
packet,
Ipv4Address
source,
Ipv4Address
destination, uint8_t
segsLeft
,
295
uint16_t fragmentOffset, uint16_t identification,
bool
saveEntry);
299
bool
CancelPassiveTimer
(
Ptr<Packet>
packet,
Ipv4Address
source,
Ipv4Address
destination, uint8_t
segsLeft
);
303
void
CallCancelPacketTimer
(uint16_t ackId,
Ipv4Header
const
& ipv4Header,
Ipv4Address
realSrc,
Ipv4Address
realDst);
307
void
CancelNetworkPacketTimer
(
MaintainBuffEntry
& mb);
311
void
CancelPassivePacketTimer
(
MaintainBuffEntry
& mb);
315
void
CancelLinkPacketTimer
(
MaintainBuffEntry
& mb);
319
void
CancelPacketTimerNextHop
(
Ipv4Address
nextHop, uint8_t protocol);
323
void
SalvagePacket
(
Ptr<const Packet>
packet,
Ipv4Address
source,
Ipv4Address
dst, uint8_t protocol);
329
void
ScheduleLinkPacketRetry
(
MaintainBuffEntry
& mb,
330
uint8_t protocol);
336
void
SchedulePassivePacketRetry
(
MaintainBuffEntry
& mb,
337
uint8_t protocol);
344
void
ScheduleNetworkPacketRetry
(
MaintainBuffEntry
& mb,
345
bool
isFirst,
346
uint8_t protocol);
350
void
LinkScheduleTimerExpire
(
MaintainBuffEntry
& mb,
351
uint8_t protocol);
355
void
NetworkScheduleTimerExpire
(
MaintainBuffEntry
& mb,
356
uint8_t protocol);
360
void
PassiveScheduleTimerExpire
(
MaintainBuffEntry
& mb,
361
uint8_t protocol);
365
void
ForwardPacket
(
Ptr<const Packet>
packet,
366
DsrOptionSRHeader
&sourceRoute,
367
Ipv4Header
const
& ipv4Header,
368
Ipv4Address
source,
369
Ipv4Address
destination,
370
Ipv4Address
targetAddress,
371
uint8_t protocol,
372
Ptr<Ipv4Route>
route);
376
void
SendInitialRequest
(
Ipv4Address
source,
377
Ipv4Address
destination,
378
uint8_t protocol);
384
void
SendErrorRequest
(
DsrOptionRerrUnreachHeader
&rerr, uint8_t protocol);
390
void
SendRequest
(
Ptr<Packet>
packet,
391
Ipv4Address
source);
398
void
ScheduleInterRequest
(
Ptr<Packet>
packet);
404
void
SendGratuitousReply
(
Ipv4Address
replyTo,
405
Ipv4Address
replyFrom,
406
std::vector<Ipv4Address> &nodeList,
407
uint8_t protocol);
411
void
SendReply
(
Ptr<Packet>
packet,
412
Ipv4Address
source,
413
Ipv4Address
nextHop,
414
Ptr<Ipv4Route>
route);
419
void
ScheduleInitialReply
(
Ptr<Packet>
packet,
420
Ipv4Address
source,
421
Ipv4Address
nextHop,
422
Ptr<Ipv4Route>
route);
426
void
ScheduleCachedReply
(
Ptr<Packet>
packet,
427
Ipv4Address
source,
428
Ipv4Address
destination,
429
Ptr<Ipv4Route>
route,
430
double
hops);
434
void
SendAck
(uint16_t ackId,
435
Ipv4Address
destination,
436
Ipv4Address
realSrc,
437
Ipv4Address
realDst,
438
uint8_t protocol,
439
Ptr<Ipv4Route>
route);
448
virtual
enum
IpL4Protocol::RxStatus
Receive
(
Ptr<Packet>
p,
449
Ipv4Header
const
&header,
450
Ptr<Ipv4Interface>
incomingInterface);
451
460
virtual
enum
IpL4Protocol::RxStatus
Receive
(
Ptr<Packet>
p,
461
Ipv6Header
const
&header,
462
Ptr<Ipv6Interface>
incomingInterface);
463
464
void
SetDownTarget
(
IpL4Protocol::DownTargetCallback
callback);
465
void
SetDownTarget6
(
IpL4Protocol::DownTargetCallback6
callback);
466
IpL4Protocol::DownTargetCallback
GetDownTarget
(
void
)
const
;
467
IpL4Protocol::DownTargetCallback6
GetDownTarget6
(
void
)
const
;
479
uint8_t
Process
(
Ptr<Packet>
& packet,
Ipv4Header
const
& ipv4Header,
Ipv4Address
dst, uint8_t *nextHeader, uint8_t protocol,
bool
& isDropped);
484
void
Insert
(
Ptr<dsr::DsrOptions>
option);
490
Ptr<dsr::DsrOptions>
GetOption
(
int
optionNumber);
496
void
CancelRreqTimer
(
Ipv4Address
dst,
bool
isRemove);
501
void
ScheduleRreqRetry
(
Ptr<Packet>
packet, std::vector<Ipv4Address>
address
,
bool
nonProp, uint32_t requestId, uint8_t protocol);
502
// / Handle route discovery timer
503
void
RouteRequestTimerExpire
(
Ptr<Packet>
packet, std::vector<Ipv4Address>
address
, uint32_t requestId, uint8_t protocol);
504
513
int64_t
AssignStreams
(int64_t stream);
514
515
protected
:
516
/*
517
* * This function will notify other components connected to the node that a new stack member is now connected
518
* * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them together.
519
* */
520
virtual
void
NotifyNewAggregate
();
524
virtual
void
DoDispose
(
void
);
528
TracedCallback<Ptr<const Packet>
>
m_dropTrace
;
529
TracedCallback <const DsrOptionSRHeader &>
m_txPacketTrace
;
530
531
private
:
532
533
void
Start
();
538
void
NotifyDataReceipt
(std::string context,
Ptr<const Packet>
p);
542
void
SendRerrWhenBreaksLinkToNextHop
(
Ipv4Address
nextHop, uint8_t protocol);
552
bool
PromiscReceive
(
Ptr<NetDevice>
device,
Ptr<const Packet>
packet, uint16_t protocol,
const
Address
&from,
553
const
Address
&to,
NetDevice::PacketType
packetType);
557
typedef
std::list<Ptr<DsrOptions> >
DsrOptionList_t
;
561
DsrOptionList_t
m_options
;
562
563
Ptr<Ipv4L3Protocol>
m_ipv4
;
564
565
Ptr<Ipv4Route>
m_ipv4Route
;
566
567
Ptr<Ipv4>
m_ip
;
568
569
Ptr<Node>
m_node
;
570
571
Ipv4Address
m_mainAddress
;
572
573
uint8_t
segsLeft
;
574
575
IpL4Protocol::DownTargetCallback
m_downTarget
;
576
577
uint32_t
m_maxNetworkSize
;
578
579
Time
m_maxNetworkDelay
;
580
581
uint32_t
m_discoveryHopLimit
;
582
583
uint8_t
m_maxSalvageCount
;
584
585
Time
m_requestPeriod
;
586
587
Time
m_nonpropRequestTimeout
;
588
589
uint32_t
m_sendRetries
;
590
591
uint32_t
m_passiveRetries
;
592
593
uint32_t
m_linkRetries
;
594
595
uint32_t
m_rreqRetries
;
596
597
uint32_t
m_maxMaintRexmt
;
598
599
Time
m_nodeTraversalTime
;
600
601
uint32_t
m_maxSendBuffLen
;
602
603
Time
m_sendBufferTimeout
;
604
605
SendBuffer
m_sendBuffer
;
606
607
ErrorBuffer
m_errorBuffer
;
608
609
uint32_t
m_maxMaintainLen
;
610
611
Time
m_maxMaintainTime
;
612
613
uint32_t
m_maxCacheLen
;
614
615
Time
m_maxCacheTime
;
616
617
Time
m_maxRreqTime
;
618
619
uint32_t
m_maxEntriesEachDst
;
620
621
MaintainBuffer
m_maintainBuffer
;
622
623
uint32_t
m_requestId
;
624
625
uint16_t
m_ackId
;
626
627
uint32_t
m_requestTableSize
;
628
629
uint32_t
m_requestTableIds
;
630
631
uint32_t
m_maxRreqId
;
632
633
Time
m_blacklistTimeout
;
634
635
Ipv4Address
m_broadcast
;
636
637
uint32_t
m_broadcastJitter
;
638
639
Time
m_passiveAckTimeout
;
640
641
uint32_t
m_tryPassiveAcks
;
642
643
Time
m_linkAckTimeout
;
644
645
uint32_t
m_tryLinkAcks
;
646
647
Timer
m_sendBuffTimer
;
648
649
Time
m_sendBuffInterval
;
650
651
Time
m_gratReplyHoldoff
;
652
653
Time
m_maxRequestPeriod
;
654
655
uint32_t
m_graReplyTableSize
;
656
657
std::string
m_cacheType
;
658
659
std::string
m_routeSortType
;
660
661
uint32_t
m_stabilityDecrFactor
;
662
663
uint32_t
m_stabilityIncrFactor
;
664
665
Time
m_initStability
;
666
667
Time
m_minLifeTime
;
668
669
Time
m_useExtends
;
670
671
bool
m_subRoute
;
672
673
Time
m_retransIncr
;
674
675
std::vector<Ipv4Address>
m_finalRoute
;
676
677
std::map<Ipv4Address, Timer>
m_addressReqTimer
;
678
679
std::map<Ipv4Address, Timer>
m_nonPropReqTimer
;
680
681
std::map<NetworkKey, Timer>
m_addressForwardTimer
;
682
683
std::map<NetworkKey, uint32_t>
m_addressForwardCnt
;
684
685
std::map<PassiveKey, uint32_t>
m_passiveCnt
;
686
687
std::map<PassiveKey, Timer>
m_passiveAckTimer
;
688
689
std::map<LinkKey, uint32_t>
m_linkCnt
;
690
691
std::map<LinkKey, Timer>
m_linkAckTimer
;
692
693
Ptr<dsr::RouteCache>
m_routeCache
;
694
695
Ptr<dsr::RreqTable>
m_rreqTable
;
696
697
Ptr<dsr::PassiveBuffer>
m_passiveBuffer
;
698
699
uint32_t
m_numPriorityQueues
;
700
701
bool
m_linkAck
;
702
703
std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >
m_priorityQueue
;
704
705
GraReply
m_graReply
;
706
707
std::vector<Ipv4Address>
m_clearList
;
708
709
std::vector<Ipv4Address>
m_addresses
;
710
711
std::map <std::string, uint32_t>
m_macToNodeIdMap
;
712
713
Ptr<UniformRandomVariable>
m_uniformRandomVariable
;
714
};
715
}
/* namespace dsr */
716
}
/* namespace ns3 */
717
718
#endif
/* DSR_ROUTING_H */
src
dsr
model
dsr-routing.h
Generated on Fri Aug 30 2013 01:42:49 for ns-3 by
1.8.1.2