A Discrete-Event Network Simulator
API
 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 
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 
35  ;
36 
37 TypeId
39 {
40  static TypeId tid = TypeId ("ns3::dot11s::PeerLink")
41  .SetParent<Object> ()
42  .AddConstructor<PeerLink> ()
43  .AddAttribute ( "RetryTimeout",
44  "Retry timeout",
45  TimeValue (TimeValue (MicroSeconds (40 * 1024))),
46  MakeTimeAccessor (
49  )
50  .AddAttribute ( "HoldingTimeout",
51  "Holding timeout",
52  TimeValue (TimeValue (MicroSeconds (40 * 1024))),
53  MakeTimeAccessor (
56  )
57  .AddAttribute ( "ConfirmTimeout",
58  "Confirm timeout",
59  TimeValue (TimeValue (MicroSeconds (40 * 1024))),
60  MakeTimeAccessor (
63  )
64  .AddAttribute ( "MaxRetries",
65  "Maximum number of retries",
66  UintegerValue (4),
67  MakeUintegerAccessor (
69  MakeUintegerChecker<uint16_t> ()
70  )
71  .AddAttribute ( "MaxBeaconLoss",
72  "Maximum number of lost beacons before link will be closed",
73  UintegerValue (2),
74  MakeUintegerAccessor (
76  MakeUintegerChecker<uint16_t> (1)
77  )
78  .AddAttribute ( "MaxPacketFailure",
79  "Maximum number of failed packets before link will be closed",
80  UintegerValue (2),
81  MakeUintegerAccessor (
83  MakeUintegerChecker<uint16_t> (1)
84  )
85  ;
86  return tid;
87 }
88 
89 
90 //-----------------------------------------------------------------------------
91 // PeerLink public interface
92 //-----------------------------------------------------------------------------
94  m_peerAddress (Mac48Address::GetBroadcast ()),
95  m_peerMeshPointAddress (Mac48Address::GetBroadcast ()),
96  m_localLinkId (0),
97  m_peerLinkId (0),
98  m_assocId (0),
99  m_peerAssocId (0),
100  m_lastBeacon (Seconds (0)),
101  m_beaconInterval (Seconds (0)),
102  m_packetFail (0),
103  m_state (IDLE),
104  m_retryCounter (0),
105  m_maxPacketFail (3)
106 {
107 }
109 {
110 }
111 void
113 {
114  m_retryTimer.Cancel ();
119 }
120 void
122 {
123  m_peerAddress = macaddr;
124 }
125 void
127 {
128  m_peerMeshPointAddress = macaddr;
129 }
130 void
131 PeerLink::SetInterface (uint32_t interface)
132 {
133  m_interface = interface;
134 }
135 void
137 {
138  m_localLinkId = id;
139 }
140 void
141 PeerLink::SetLocalAid (uint16_t aid)
142 {
143  m_assocId = aid;
144 }
145 void
146 PeerLink::SetBeaconInformation (Time lastBeacon, Time beaconInterval)
147 {
148  m_lastBeacon = lastBeacon;
149  m_beaconInterval = beaconInterval;
151  Time delay = Seconds (beaconInterval.GetSeconds () * m_maxBeaconLoss);
152  NS_ASSERT (delay.GetMicroSeconds () != 0);
154 }
155 void
157 {
159 }
160 void
162 {
163  StateMachine (CNCL);
164 }
165 void
167 {
168  m_packetFail = 0;
169 }
170 void
172 {
173  m_packetFail++;
175  {
176  StateMachine (CNCL);
177  m_packetFail = 0;
178  }
179 }
180 
181 void
183 {
184  m_beaconTiming = beaconTiming;
185 }
188 {
189  return m_peerAddress;
190 }
191 uint16_t
193 {
194  return m_assocId;
195 }
196 uint16_t
198 {
199  return m_peerAssocId;
200 }
201 
202 Time
204 {
205  return m_lastBeacon;
206 }
207 Time
209 {
210  return m_beaconInterval;
211 }
214 {
215  return m_beaconTiming;
216 }
217 void
219 {
220  StateMachine (CNCL, reason);
221 }
222 void
224 {
226 }
227 void
229 {
231 }
232 void
233 PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason)
234 {
235  if (peerLinkId != 0 && m_localLinkId != peerLinkId)
236  {
237  return;
238  }
239  if (m_peerLinkId == 0)
240  {
241  m_peerLinkId = localLinkId;
242  }
243  else
244  {
245  if (m_peerLinkId != localLinkId)
246  {
247  return;
248  }
249  }
250  StateMachine (CLS_ACPT, reason);
251 }
252 void
253 PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp)
254 {
255  m_peerLinkId = localLinkId;
256  m_configuration = conf;
258  {
259  NS_ASSERT (m_peerMeshPointAddress == peerMp);
260  }
261  else
262  {
263  m_peerMeshPointAddress = peerMp;
264  }
266 }
267 void
268 PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason)
269 {
270  if (m_peerLinkId == 0)
271  {
272  m_peerLinkId = localLinkId;
273  }
274  m_configuration = conf;
276  {
277  NS_ASSERT (m_peerMeshPointAddress == peerMp);
278  }
279  else
280  {
281  m_peerMeshPointAddress = peerMp;
282  }
283  StateMachine (OPN_RJCT, reason);
284 }
285 void
286 PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf,
287  Mac48Address peerMp)
288 {
289  if (m_localLinkId != peerLinkId)
290  {
291  return;
292  }
293  if (m_peerLinkId == 0)
294  {
295  m_peerLinkId = localLinkId;
296  }
297  else
298  {
299  if (m_peerLinkId != localLinkId)
300  {
301  return;
302  }
303  }
304  m_configuration = conf;
305  m_peerAssocId = peerAid;
307  {
308  NS_ASSERT (m_peerMeshPointAddress == peerMp);
309  }
310  else
311  {
312  m_peerMeshPointAddress = peerMp;
313  }
315 }
316 void
317 PeerLink::ConfirmReject (uint16_t localLinkId, uint16_t peerLinkId, IeConfiguration conf,
318  Mac48Address peerMp, PmpReasonCode reason)
319 {
320  if (m_localLinkId != peerLinkId)
321  {
322  return;
323  }
324  if (m_peerLinkId == 0)
325  {
326  m_peerLinkId = localLinkId;
327  }
328  else
329  {
330  if (m_peerLinkId != localLinkId)
331  {
332  return;
333  }
334  }
335  m_configuration = conf;
337  {
338  NS_ASSERT (m_peerMeshPointAddress == peerMp);
339  }
340  m_peerMeshPointAddress = peerMp;
341  StateMachine (CNF_RJCT, reason);
342 }
343 bool
345 {
346  return (m_state == ESTAB);
347 }
348 bool
350 {
351  return (m_state == IDLE);
352 }
353 void
355 {
356  m_macPlugin = plugin;
357 }
358 //-----------------------------------------------------------------------------
359 // Private
360 //-----------------------------------------------------------------------------
361 void
363 {
364  switch (m_state)
365  {
366  case IDLE:
367  switch (event)
368  {
369  case CNCL:
370  case CLS_ACPT:
371  m_state = IDLE;
373  break;
374  case REQ_RJCT:
375  SendPeerLinkClose (reasoncode);
376  break;
377  case ACTOPN:
378  m_state = OPN_SNT;
380  SendPeerLinkOpen ();
381  SetRetryTimer ();
382  break;
383  case OPN_ACPT:
384  m_state = OPN_RCVD;
387  SendPeerLinkOpen ();
388  SetRetryTimer ();
389  break;
390  default:
391  //11B.5.3.4 of 802.11s Draft D3.0
392  //All other events shall be ignored in this state
393  break;
394  }
395  break;
396  case OPN_SNT:
397  switch (event)
398  {
399  case TOR1:
400  SendPeerLinkOpen ();
401  m_retryCounter++;
402  SetRetryTimer ();
403  break;
404  case CNF_ACPT:
405  m_state = CNF_RCVD;
407  ClearRetryTimer ();
408  SetConfirmTimer ();
409  break;
410  case OPN_ACPT:
411  m_state = OPN_RCVD;
414  break;
415  case CLS_ACPT:
416  m_state = HOLDING;
418  ClearRetryTimer ();
420  SetHoldingTimer ();
421  break;
422  case OPN_RJCT:
423  case CNF_RJCT:
424  m_state = HOLDING;
426  ClearRetryTimer ();
427  SendPeerLinkClose (reasoncode);
428  SetHoldingTimer ();
429  break;
430  case TOR2:
431  m_state = HOLDING;
433  ClearRetryTimer ();
435  SetHoldingTimer ();
436  break;
437  case CNCL:
438  m_state = HOLDING;
440  ClearRetryTimer ();
442  SetHoldingTimer ();
443  break;
444  default:
445  //11B.5.3.5 of 802.11s Draft D3.0
446  //All other events shall be ignored in this state
447  break;
448  }
449  break;
450  case CNF_RCVD:
451  switch (event)
452  {
453  case CNF_ACPT:
454  break;
455  case OPN_ACPT:
456  m_state = ESTAB;
461  break;
462  case CLS_ACPT:
463  m_state = HOLDING;
467  SetHoldingTimer ();
468  break;
469  case CNF_RJCT:
470  case OPN_RJCT:
471  m_state = HOLDING;
474  SendPeerLinkClose (reasoncode);
475  SetHoldingTimer ();
476  break;
477  case CNCL:
478  m_state = HOLDING;
482  SetHoldingTimer ();
483  break;
484  case TOC:
485  m_state = HOLDING;
488  SetHoldingTimer ();
489  break;
490  default:
491  //11B.5.3.6 of 802.11s Draft D3.0
492  //All other events shall be ignored in this state
493  break;
494  }
495  break;
496  case OPN_RCVD:
497  switch (event)
498  {
499  case TOR1:
500  SendPeerLinkOpen ();
501  m_retryCounter++;
502  SetRetryTimer ();
503  break;
504  case CNF_ACPT:
505  m_state = ESTAB;
507  ClearRetryTimer ();
509  break;
510  case CLS_ACPT:
511  m_state = HOLDING;
513  ClearRetryTimer ();
515  SetHoldingTimer ();
516  break;
517  case OPN_RJCT:
518  case CNF_RJCT:
519  m_state = HOLDING;
521  ClearRetryTimer ();
522  SendPeerLinkClose (reasoncode);
523  SetHoldingTimer ();
524  break;
525  case TOR2:
526  m_state = HOLDING;
528  ClearRetryTimer ();
530  SetHoldingTimer ();
531  break;
532  case CNCL:
533  m_state = HOLDING;
535  ClearRetryTimer ();
537  SetHoldingTimer ();
538  break;
539  default:
540  //11B.5.3.7 of 802.11s Draft D3.0
541  //All other events shall be ignored in this state
542  break;
543  }
544  break;
545  case ESTAB:
546  switch (event)
547  {
548  case OPN_ACPT:
550  break;
551  case CLS_ACPT:
552  m_state = HOLDING;
555  SetHoldingTimer ();
556  break;
557  case OPN_RJCT:
558  case CNF_RJCT:
559  m_state = HOLDING;
561  ClearRetryTimer ();
562  SendPeerLinkClose (reasoncode);
563  SetHoldingTimer ();
564  break;
565  case CNCL:
566  m_state = HOLDING;
569  SetHoldingTimer ();
570  break;
571  default:
572  //11B.5.3.8 of 802.11s Draft D3.0
573  //All other events shall be ignored in this state
574  break;
575  }
576  break;
577  case HOLDING:
578  switch (event)
579  {
580  case CLS_ACPT:
582  // fall through:
583  case TOH:
584  m_state = IDLE;
586  break;
587  case OPN_ACPT:
588  case CNF_ACPT:
589  m_state = HOLDING;
591  // reason not spec in D2.0
593  break;
594  case OPN_RJCT:
595  case CNF_RJCT:
596  m_state = HOLDING;
598  SendPeerLinkClose (reasoncode);
599  break;
600  default:
601  //11B.5.3.9 of 802.11s Draft D3.0
602  //All other events shall be ignored in this state
603  break;
604  }
605  break;
606  }
607 }
608 void
610 {
611  m_retryTimer.Cancel ();
612 }
613 void
615 {
617 }
618 void
620 {
622 }
623 void
625 {
626  IePeerManagement peerElement;
627  peerElement.SetPeerClose (m_localLinkId, m_peerLinkId, reasoncode);
630 }
631 void
633 {
634  IePeerManagement peerElement;
635  peerElement.SetPeerOpen (m_localLinkId);
636  NS_ASSERT (m_macPlugin != 0);
639 }
640 void
642 {
643  IePeerManagement peerElement;
647 }
648 void
650 {
653 }
654 void
656 {
657  StateMachine (TOH);
658 }
659 void
661 {
664 }
665 void
667 {
669  {
670  StateMachine (TOR1);
671  }
672  else
673  {
674  StateMachine (TOR2);
675  }
676 }
677 void
679 {
682 }
683 void
685 {
686  StateMachine (TOC);
687 }
688 void
689 PeerLink::Report (std::ostream & os) const
690 {
691  if (m_state != ESTAB)
692  {
693  return;
694  }
695  os << "<PeerLink" << std::endl <<
696  "localAddress=\"" << m_macPlugin->GetAddress () << "\"" << std::endl <<
697  "peerInterfaceAddress=\"" << m_peerAddress << "\"" << std::endl <<
698  "peerMeshPointAddress=\"" << m_peerMeshPointAddress << "\"" << std::endl <<
699  "metric=\"" << m_macPlugin->GetLinkMetric (m_peerAddress) << "\"" << std::endl <<
700  "lastBeacon=\"" << m_lastBeacon.GetSeconds () << "\"" << std::endl <<
701  "localLinkId=\"" << m_localLinkId << "\"" << std::endl <<
702  "peerLinkId=\"" << m_peerLinkId << "\"" << std::endl <<
703  "assocId=\"" << m_assocId << "\"" << std::endl <<
704  "/>" << std::endl;
705 }
706 } // namespace dot11s
707 } // namespace ns3
708 
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
#define NS_ASSERT(condition)
Definition: assert.h:64
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
Channel is IDLE, no packet is being transmitted.
Definition: csma-channel.h:62
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Definition: simulator.h:824
double GetSeconds(void) const
Definition: nstime.h:274
See 7.3.2.85 of draft 2.07.
int64_t GetMicroSeconds(void) const
Definition: nstime.h:291
hold objects of type ns3::Time
Definition: nstime.h:961
Hold an unsigned integer type.
Definition: uinteger.h:46
void SetPeerClose(uint16_t localLinkID, uint16_t peerLinkId, PmpReasonCode reasonCode)
See 7.3.2.89 of 802.11s draft 2.07.
static Mac48Address GetBroadcast(void)
uint32_t GetLinkMetric(Mac48Address peerAddress)
void SendPeerLinkManagementFrame(Mac48Address peerAddress, Mac48Address peerMpAddress, uint16_t aid, IePeerManagement peerElement, IeConfiguration meshConfig)
an EUI-48 address
Definition: mac48-address.h:41
Mac48Address GetAddress() const
debug only, used to print established links
void SetPeerConfirm(uint16_t localLinkID, uint16_t peerLinkId)
PmpReasonCode
Codes used by 802.11s Peer Management Protocol.
Describes Mesh Configuration Element see 7.3.2.86 of 802.11s draft 3.0.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::cancel method.
Definition: event-id.cc:47
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:452
void SetPeerOpen(uint16_t localLinkId)
a base class which provides memory management and object aggregation
Definition: object.h:63
a unique identifier for an interface.
Definition: type-id.h:49
TypeId SetParent(TypeId tid)
Definition: type-id.cc:611