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
peer-link.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2009 IITP RAS
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
* Authors: Kirill Andreev <andreev@iitp.ru>
19
* Aleksey Kovalenko <kovalenko@iitp.ru>
20
* Pavel Boyko <boyko@iitp.ru>
21
*/
22
23
#include "
peer-management-protocol-mac.h
"
24
#include "ns3/peer-link.h"
25
#include "ns3/log.h"
26
#include "ns3/simulator.h"
27
#include "ns3/traced-value.h"
28
29
NS_LOG_COMPONENT_DEFINE
(
"Dot11sPeerManagementProtocol"
);
30
31
namespace
ns3 {
32
namespace
dot11s {
33
34
NS_OBJECT_ENSURE_REGISTERED
( PeerLink);
35
36
TypeId
37
PeerLink::GetTypeId
()
38
{
39
static
TypeId
tid =
TypeId
(
"ns3::dot11s::PeerLink"
)
40
.
SetParent
<
Object
> ()
41
.AddConstructor<PeerLink> ()
42
.AddAttribute (
"RetryTimeout"
,
43
"Retry timeout"
,
44
TimeValue
(
TimeValue
(
MicroSeconds
(40 * 1024))),
45
MakeTimeAccessor (
46
&
PeerLink::m_dot11MeshRetryTimeout
),
47
MakeTimeChecker ()
48
)
49
.AddAttribute (
"HoldingTimeout"
,
50
"Holding timeout"
,
51
TimeValue
(
TimeValue
(
MicroSeconds
(40 * 1024))),
52
MakeTimeAccessor (
53
&
PeerLink::m_dot11MeshHoldingTimeout
),
54
MakeTimeChecker ()
55
)
56
.AddAttribute (
"ConfirmTimeout"
,
57
"Confirm timeout"
,
58
TimeValue
(
TimeValue
(
MicroSeconds
(40 * 1024))),
59
MakeTimeAccessor (
60
&
PeerLink::m_dot11MeshConfirmTimeout
),
61
MakeTimeChecker ()
62
)
63
.AddAttribute (
"MaxRetries"
,
64
"Maximum number of retries"
,
65
UintegerValue
(4),
66
MakeUintegerAccessor (
67
&
PeerLink::m_dot11MeshMaxRetries
),
68
MakeUintegerChecker<uint16_t> ()
69
)
70
.AddAttribute (
"MaxBeaconLoss"
,
71
"Maximum number of lost beacons before link will be closed"
,
72
UintegerValue
(2),
73
MakeUintegerAccessor (
74
&
PeerLink::m_maxBeaconLoss
),
75
MakeUintegerChecker<uint16_t> (1)
76
)
77
.AddAttribute (
"MaxPacketFailure"
,
78
"Maximum number of failed packets before link will be closed"
,
79
UintegerValue
(2),
80
MakeUintegerAccessor (
81
&
PeerLink::m_maxPacketFail
),
82
MakeUintegerChecker<uint16_t> (1)
83
)
84
;
85
return
tid;
86
}
87
88
89
//-----------------------------------------------------------------------------
90
// PeerLink public interface
91
//-----------------------------------------------------------------------------
92
PeerLink::PeerLink
() :
93
m_peerAddress (
Mac48Address
::GetBroadcast ()),
94
m_peerMeshPointAddress (
Mac48Address
::GetBroadcast ()),
95
m_localLinkId (0),
96
m_peerLinkId (0),
97
m_assocId (0),
98
m_peerAssocId (0),
99
m_lastBeacon (
Seconds
(0)),
100
m_beaconInterval (
Seconds
(0)),
101
m_packetFail (0),
102
m_state (
IDLE
),
103
m_retryCounter (0),
104
m_maxPacketFail (3)
105
{
106
}
107
PeerLink::~PeerLink
()
108
{
109
}
110
void
111
PeerLink::DoDispose
()
112
{
113
m_retryTimer
.
Cancel
();
114
m_holdingTimer
.
Cancel
();
115
m_confirmTimer
.
Cancel
();
116
m_beaconLossTimer
.
Cancel
();
117
m_beaconTiming
.
ClearTimingElement
();
118
}
119
void
120
PeerLink::SetPeerAddress
(
Mac48Address
macaddr)
121
{
122
m_peerAddress
= macaddr;
123
}
124
void
125
PeerLink::SetPeerMeshPointAddress
(
Mac48Address
macaddr)
126
{
127
m_peerMeshPointAddress
= macaddr;
128
}
129
void
130
PeerLink::SetInterface
(uint32_t interface)
131
{
132
m_interface
= interface;
133
}
134
void
135
PeerLink::SetLocalLinkId
(uint16_t
id
)
136
{
137
m_localLinkId
= id;
138
}
139
void
140
PeerLink::SetLocalAid
(uint16_t aid)
141
{
142
m_assocId
= aid;
143
}
144
void
145
PeerLink::SetBeaconInformation
(
Time
lastBeacon,
Time
beaconInterval)
146
{
147
m_lastBeacon
= lastBeacon;
148
m_beaconInterval
= beaconInterval;
149
m_beaconLossTimer
.
Cancel
();
150
Time
delay =
Seconds
(beaconInterval.
GetSeconds
() *
m_maxBeaconLoss
);
151
NS_ASSERT
(delay.
GetMicroSeconds
() != 0);
152
m_beaconLossTimer
=
Simulator::Schedule
(delay, &
PeerLink::BeaconLoss
,
this
);
153
}
154
void
155
PeerLink::MLMESetSignalStatusCallback
(
PeerLink::SignalStatusCallback
cb)
156
{
157
m_linkStatusCallback
= cb;
158
}
159
void
160
PeerLink::BeaconLoss
()
161
{
162
StateMachine
(
CNCL
);
163
}
164
void
165
PeerLink::TransmissionSuccess
()
166
{
167
m_packetFail
= 0;
168
}
169
void
170
PeerLink::TransmissionFailure
()
171
{
172
m_packetFail
++;
173
if
(
m_packetFail
==
m_maxPacketFail
)
174
{
175
StateMachine
(
CNCL
);
176
m_packetFail
= 0;
177
}
178
}
179
180
void
181
PeerLink::SetBeaconTimingElement
(
IeBeaconTiming
beaconTiming)
182
{
183
m_beaconTiming
= beaconTiming;
184
}
185
Mac48Address
186
PeerLink::GetPeerAddress
()
const
187
{
188
return
m_peerAddress
;
189
}
190
uint16_t
191
PeerLink::GetLocalAid
()
const
192
{
193
return
m_assocId
;
194
}
195
uint16_t
196
PeerLink::GetPeerAid
()
const
197
{
198
return
m_peerAssocId
;
199
}
200
201
Time
202
PeerLink::GetLastBeacon
()
const
203
{
204
return
m_lastBeacon
;
205
}
206
Time
207
PeerLink::GetBeaconInterval
()
const
208
{
209
return
m_beaconInterval
;
210
}
211
IeBeaconTiming
212
PeerLink::GetBeaconTimingElement
()
const
213
{
214
return
m_beaconTiming
;
215
}
216
void
217
PeerLink::MLMECancelPeerLink
(
PmpReasonCode
reason)
218
{
219
StateMachine
(
CNCL
, reason);
220
}
221
void
222
PeerLink::MLMEActivePeerLinkOpen
()
223
{
224
StateMachine
(
ACTOPN
);
225
}
226
void
227
PeerLink::MLMEPeeringRequestReject
()
228
{
229
StateMachine
(
REQ_RJCT
,
REASON11S_PEERING_CANCELLED
);
230
}
231
void
232
PeerLink::Close
(uint16_t localLinkId, uint16_t peerLinkId,
PmpReasonCode
reason)
233
{
234
if
(peerLinkId != 0 &&
m_localLinkId
!= peerLinkId)
235
{
236
return
;
237
}
238
if
(
m_peerLinkId
== 0)
239
{
240
m_peerLinkId
= localLinkId;
241
}
242
else
243
{
244
if
(
m_peerLinkId
!= localLinkId)
245
{
246
return
;
247
}
248
}
249
StateMachine
(
CLS_ACPT
, reason);
250
}
251
void
252
PeerLink::OpenAccept
(uint16_t localLinkId,
IeConfiguration
conf,
Mac48Address
peerMp)
253
{
254
m_peerLinkId
= localLinkId;
255
m_configuration
= conf;
256
if
(
m_peerMeshPointAddress
!=
Mac48Address::GetBroadcast
())
257
{
258
NS_ASSERT
(
m_peerMeshPointAddress
== peerMp);
259
}
260
else
261
{
262
m_peerMeshPointAddress
= peerMp;
263
}
264
StateMachine
(
OPN_ACPT
);
265
}
266
void
267
PeerLink::OpenReject
(uint16_t localLinkId,
IeConfiguration
conf,
Mac48Address
peerMp,
PmpReasonCode
reason)
268
{
269
if
(
m_peerLinkId
== 0)
270
{
271
m_peerLinkId
= localLinkId;
272
}
273
m_configuration
= conf;
274
if
(
m_peerMeshPointAddress
!=
Mac48Address::GetBroadcast
())
275
{
276
NS_ASSERT
(
m_peerMeshPointAddress
== peerMp);
277
}
278
else
279
{
280
m_peerMeshPointAddress
= peerMp;
281
}
282
StateMachine
(
OPN_RJCT
, reason);
283
}
284
void
285
PeerLink::ConfirmAccept
(uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid,
IeConfiguration
conf,
286
Mac48Address
peerMp)
287
{
288
if
(
m_localLinkId
!= peerLinkId)
289
{
290
return
;
291
}
292
if
(
m_peerLinkId
== 0)
293
{
294
m_peerLinkId
= localLinkId;
295
}
296
else
297
{
298
if
(
m_peerLinkId
!= localLinkId)
299
{
300
return
;
301
}
302
}
303
m_configuration
= conf;
304
m_peerAssocId
= peerAid;
305
if
(
m_peerMeshPointAddress
!=
Mac48Address::GetBroadcast
())
306
{
307
NS_ASSERT
(
m_peerMeshPointAddress
== peerMp);
308
}
309
else
310
{
311
m_peerMeshPointAddress
= peerMp;
312
}
313
StateMachine
(
CNF_ACPT
);
314
}
315
void
316
PeerLink::ConfirmReject
(uint16_t localLinkId, uint16_t peerLinkId,
IeConfiguration
conf,
317
Mac48Address
peerMp,
PmpReasonCode
reason)
318
{
319
if
(
m_localLinkId
!= peerLinkId)
320
{
321
return
;
322
}
323
if
(
m_peerLinkId
== 0)
324
{
325
m_peerLinkId
= localLinkId;
326
}
327
else
328
{
329
if
(
m_peerLinkId
!= localLinkId)
330
{
331
return
;
332
}
333
}
334
m_configuration
= conf;
335
if
(
m_peerMeshPointAddress
!=
Mac48Address::GetBroadcast
())
336
{
337
NS_ASSERT
(
m_peerMeshPointAddress
== peerMp);
338
}
339
m_peerMeshPointAddress
= peerMp;
340
StateMachine
(
CNF_RJCT
, reason);
341
}
342
bool
343
PeerLink::LinkIsEstab
()
const
344
{
345
return
(
m_state
==
ESTAB
);
346
}
347
bool
348
PeerLink::LinkIsIdle
()
const
349
{
350
return
(
m_state
==
IDLE
);
351
}
352
void
353
PeerLink::SetMacPlugin
(
Ptr<PeerManagementProtocolMac>
plugin)
354
{
355
m_macPlugin
= plugin;
356
}
357
//-----------------------------------------------------------------------------
358
// Private
359
//-----------------------------------------------------------------------------
360
void
361
PeerLink::StateMachine
(
PeerEvent
event,
PmpReasonCode
reasoncode)
362
{
363
switch
(
m_state
)
364
{
365
case
IDLE
:
366
switch
(event)
367
{
368
case
CNCL
:
369
case
CLS_ACPT
:
370
m_state
=
IDLE
;
371
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
IDLE
,
IDLE
);
372
break
;
373
case
REQ_RJCT
:
374
SendPeerLinkClose
(reasoncode);
375
break
;
376
case
ACTOPN
:
377
m_state
=
OPN_SNT
;
378
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
IDLE
,
OPN_SNT
);
379
SendPeerLinkOpen
();
380
SetRetryTimer
();
381
break
;
382
case
OPN_ACPT
:
383
m_state
=
OPN_RCVD
;
384
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
IDLE
,
OPN_RCVD
);
385
SendPeerLinkConfirm
();
386
SendPeerLinkOpen
();
387
SetRetryTimer
();
388
break
;
389
default
:
390
//11B.5.3.4 of 802.11s Draft D3.0
391
//All other events shall be ignored in this state
392
break
;
393
}
394
break
;
395
case
OPN_SNT
:
396
switch
(event)
397
{
398
case
TOR1
:
399
SendPeerLinkOpen
();
400
m_retryCounter
++;
401
SetRetryTimer
();
402
break
;
403
case
CNF_ACPT
:
404
m_state
=
CNF_RCVD
;
405
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_SNT
,
CNF_RCVD
);
406
ClearRetryTimer
();
407
SetConfirmTimer
();
408
break
;
409
case
OPN_ACPT
:
410
m_state
=
OPN_RCVD
;
411
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_SNT
,
OPN_RCVD
);
412
SendPeerLinkConfirm
();
413
break
;
414
case
CLS_ACPT
:
415
m_state
=
HOLDING
;
416
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_SNT
,
HOLDING
);
417
ClearRetryTimer
();
418
SendPeerLinkClose
(
REASON11S_MESH_CLOSE_RCVD
);
419
SetHoldingTimer
();
420
break
;
421
case
OPN_RJCT
:
422
case
CNF_RJCT
:
423
m_state
=
HOLDING
;
424
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_SNT
,
HOLDING
);
425
ClearRetryTimer
();
426
SendPeerLinkClose
(reasoncode);
427
SetHoldingTimer
();
428
break
;
429
case
TOR2
:
430
m_state
=
HOLDING
;
431
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_SNT
,
HOLDING
);
432
ClearRetryTimer
();
433
SendPeerLinkClose
(
REASON11S_MESH_MAX_RETRIES
);
434
SetHoldingTimer
();
435
break
;
436
case
CNCL
:
437
m_state
=
HOLDING
;
438
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_SNT
,
HOLDING
);
439
ClearRetryTimer
();
440
SendPeerLinkClose
(
REASON11S_PEERING_CANCELLED
);
441
SetHoldingTimer
();
442
break
;
443
default
:
444
//11B.5.3.5 of 802.11s Draft D3.0
445
//All other events shall be ignored in this state
446
break
;
447
}
448
break
;
449
case
CNF_RCVD
:
450
switch
(event)
451
{
452
case
CNF_ACPT
:
453
break
;
454
case
OPN_ACPT
:
455
m_state
=
ESTAB
;
456
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
CNF_RCVD
,
ESTAB
);
457
ClearConfirmTimer
();
458
SendPeerLinkConfirm
();
459
NS_ASSERT
(
m_peerMeshPointAddress
!=
Mac48Address::GetBroadcast
());
460
break
;
461
case
CLS_ACPT
:
462
m_state
=
HOLDING
;
463
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
CNF_RCVD
,
HOLDING
);
464
ClearConfirmTimer
();
465
SendPeerLinkClose
(
REASON11S_MESH_CLOSE_RCVD
);
466
SetHoldingTimer
();
467
break
;
468
case
CNF_RJCT
:
469
case
OPN_RJCT
:
470
m_state
=
HOLDING
;
471
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
CNF_RCVD
,
HOLDING
);
472
ClearConfirmTimer
();
473
SendPeerLinkClose
(reasoncode);
474
SetHoldingTimer
();
475
break
;
476
case
CNCL
:
477
m_state
=
HOLDING
;
478
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
CNF_RCVD
,
HOLDING
);
479
ClearConfirmTimer
();
480
SendPeerLinkClose
(
REASON11S_PEERING_CANCELLED
);
481
SetHoldingTimer
();
482
break
;
483
case
TOC
:
484
m_state
=
HOLDING
;
485
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
CNF_RCVD
,
HOLDING
);
486
SendPeerLinkClose
(
REASON11S_MESH_CONFIRM_TIMEOUT
);
487
SetHoldingTimer
();
488
break
;
489
default
:
490
//11B.5.3.6 of 802.11s Draft D3.0
491
//All other events shall be ignored in this state
492
break
;
493
}
494
break
;
495
case
OPN_RCVD
:
496
switch
(event)
497
{
498
case
TOR1
:
499
SendPeerLinkOpen
();
500
m_retryCounter
++;
501
SetRetryTimer
();
502
break
;
503
case
CNF_ACPT
:
504
m_state
=
ESTAB
;
505
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_RCVD
,
ESTAB
);
506
ClearRetryTimer
();
507
NS_ASSERT
(
m_peerMeshPointAddress
!=
Mac48Address::GetBroadcast
());
508
break
;
509
case
CLS_ACPT
:
510
m_state
=
HOLDING
;
511
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_RCVD
,
HOLDING
);
512
ClearRetryTimer
();
513
SendPeerLinkClose
(
REASON11S_MESH_CLOSE_RCVD
);
514
SetHoldingTimer
();
515
break
;
516
case
OPN_RJCT
:
517
case
CNF_RJCT
:
518
m_state
=
HOLDING
;
519
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_RCVD
,
HOLDING
);
520
ClearRetryTimer
();
521
SendPeerLinkClose
(reasoncode);
522
SetHoldingTimer
();
523
break
;
524
case
TOR2
:
525
m_state
=
HOLDING
;
526
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_RCVD
,
HOLDING
);
527
ClearRetryTimer
();
528
SendPeerLinkClose
(
REASON11S_MESH_MAX_RETRIES
);
529
SetHoldingTimer
();
530
break
;
531
case
CNCL
:
532
m_state
=
HOLDING
;
533
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
OPN_RCVD
,
HOLDING
);
534
ClearRetryTimer
();
535
SendPeerLinkClose
(
REASON11S_PEERING_CANCELLED
);
536
SetHoldingTimer
();
537
break
;
538
default
:
539
//11B.5.3.7 of 802.11s Draft D3.0
540
//All other events shall be ignored in this state
541
break
;
542
}
543
break
;
544
case
ESTAB
:
545
switch
(event)
546
{
547
case
OPN_ACPT
:
548
SendPeerLinkConfirm
();
549
break
;
550
case
CLS_ACPT
:
551
m_state
=
HOLDING
;
552
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
ESTAB
,
HOLDING
);
553
SendPeerLinkClose
(
REASON11S_MESH_CLOSE_RCVD
);
554
SetHoldingTimer
();
555
break
;
556
case
OPN_RJCT
:
557
case
CNF_RJCT
:
558
m_state
=
HOLDING
;
559
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
ESTAB
,
HOLDING
);
560
ClearRetryTimer
();
561
SendPeerLinkClose
(reasoncode);
562
SetHoldingTimer
();
563
break
;
564
case
CNCL
:
565
m_state
=
HOLDING
;
566
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
ESTAB
,
HOLDING
);
567
SendPeerLinkClose
(
REASON11S_PEERING_CANCELLED
);
568
SetHoldingTimer
();
569
break
;
570
default
:
571
//11B.5.3.8 of 802.11s Draft D3.0
572
//All other events shall be ignored in this state
573
break
;
574
}
575
break
;
576
case
HOLDING
:
577
switch
(event)
578
{
579
case
CLS_ACPT
:
580
ClearHoldingTimer
();
581
case
TOH
:
582
m_state
=
IDLE
;
583
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
HOLDING
,
IDLE
);
584
break
;
585
case
OPN_ACPT
:
586
case
CNF_ACPT
:
587
m_state
=
HOLDING
;
588
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
HOLDING
,
HOLDING
);
589
// reason not spec in D2.0
590
SendPeerLinkClose
(
REASON11S_PEERING_CANCELLED
);
591
break
;
592
case
OPN_RJCT
:
593
case
CNF_RJCT
:
594
m_state
=
HOLDING
;
595
m_linkStatusCallback
(
m_interface
,
m_peerAddress
,
m_peerMeshPointAddress
,
HOLDING
,
HOLDING
);
596
SendPeerLinkClose
(reasoncode);
597
break
;
598
default
:
599
//11B.5.3.9 of 802.11s Draft D3.0
600
//All other events shall be ignored in this state
601
break
;
602
}
603
break
;
604
}
605
}
606
void
607
PeerLink::ClearRetryTimer
()
608
{
609
m_retryTimer
.
Cancel
();
610
}
611
void
612
PeerLink::ClearConfirmTimer
()
613
{
614
m_confirmTimer
.
Cancel
();
615
}
616
void
617
PeerLink::ClearHoldingTimer
()
618
{
619
m_holdingTimer
.
Cancel
();
620
}
621
void
622
PeerLink::SendPeerLinkClose
(
PmpReasonCode
reasoncode)
623
{
624
IePeerManagement
peerElement;
625
peerElement.
SetPeerClose
(
m_localLinkId
,
m_peerLinkId
, reasoncode);
626
m_macPlugin
->
SendPeerLinkManagementFrame
(
m_peerAddress
,
m_peerMeshPointAddress
,
m_assocId
, peerElement,
627
m_configuration
);
628
}
629
void
630
PeerLink::SendPeerLinkOpen
()
631
{
632
IePeerManagement
peerElement;
633
peerElement.
SetPeerOpen
(
m_localLinkId
);
634
NS_ASSERT
(
m_macPlugin
!= 0);
635
m_macPlugin
->
SendPeerLinkManagementFrame
(
m_peerAddress
,
m_peerMeshPointAddress
,
m_assocId
, peerElement,
636
m_configuration
);
637
}
638
void
639
PeerLink::SendPeerLinkConfirm
()
640
{
641
IePeerManagement
peerElement;
642
peerElement.
SetPeerConfirm
(
m_localLinkId
,
m_peerLinkId
);
643
m_macPlugin
->
SendPeerLinkManagementFrame
(
m_peerAddress
,
m_peerMeshPointAddress
,
m_assocId
, peerElement,
644
m_configuration
);
645
}
646
void
647
PeerLink::SetHoldingTimer
()
648
{
649
NS_ASSERT
(
m_dot11MeshHoldingTimeout
.
GetMicroSeconds
() != 0);
650
m_holdingTimer
=
Simulator::Schedule
(
m_dot11MeshHoldingTimeout
, &
PeerLink::HoldingTimeout
,
this
);
651
}
652
void
653
PeerLink::HoldingTimeout
()
654
{
655
StateMachine
(
TOH
);
656
}
657
void
658
PeerLink::SetRetryTimer
()
659
{
660
NS_ASSERT
(
m_dot11MeshRetryTimeout
.
GetMicroSeconds
() != 0);
661
m_retryTimer
=
Simulator::Schedule
(
m_dot11MeshRetryTimeout
, &
PeerLink::RetryTimeout
,
this
);
662
}
663
void
664
PeerLink::RetryTimeout
()
665
{
666
if
(
m_retryCounter
<
m_dot11MeshMaxRetries
)
667
{
668
StateMachine
(
TOR1
);
669
}
670
else
671
{
672
StateMachine
(
TOR2
);
673
}
674
}
675
void
676
PeerLink::SetConfirmTimer
()
677
{
678
NS_ASSERT
(
m_dot11MeshConfirmTimeout
.
GetMicroSeconds
() != 0);
679
m_confirmTimer
=
Simulator::Schedule
(
m_dot11MeshConfirmTimeout
, &
PeerLink::ConfirmTimeout
,
this
);
680
}
681
void
682
PeerLink::ConfirmTimeout
()
683
{
684
StateMachine
(
TOC
);
685
}
686
void
687
PeerLink::Report
(std::ostream & os)
const
688
{
689
if
(
m_state
!=
ESTAB
)
690
{
691
return
;
692
}
693
os <<
"<PeerLink"
<< std::endl <<
694
"localAddress=\""
<<
m_macPlugin
->
GetAddress
() <<
"\""
<< std::endl <<
695
"peerInterfaceAddress=\""
<<
m_peerAddress
<<
"\""
<< std::endl <<
696
"peerMeshPointAddress=\""
<<
m_peerMeshPointAddress
<<
"\""
<< std::endl <<
697
"metric=\""
<<
m_macPlugin
->
GetLinkMetric
(
m_peerAddress
) <<
"\""
<< std::endl <<
698
"lastBeacon=\""
<<
m_lastBeacon
.
GetSeconds
() <<
"\""
<< std::endl <<
699
"localLinkId=\""
<<
m_localLinkId
<<
"\""
<< std::endl <<
700
"peerLinkId=\""
<<
m_peerLinkId
<<
"\""
<< std::endl <<
701
"assocId=\""
<<
m_assocId
<<
"\""
<< std::endl <<
702
"/>"
<< std::endl;
703
}
704
}
// namespace dot11s
705
}
// namespace ns3
706
src
mesh
model
dot11s
peer-link.cc
Generated on Tue Oct 9 2012 16:45:42 for ns-3 by
1.8.1.2