17 * |
17 * |
18 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
18 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
19 */ |
19 */ |
20 |
20 |
21 #include "ns3/assert.h" |
21 #include "ns3/assert.h" |
22 |
|
23 #include "ns3/packet.h" |
22 #include "ns3/packet.h" |
|
23 #include "ns3/log.h" |
24 |
24 |
25 #include "dca-txop.h" |
25 #include "dca-txop.h" |
26 #include "dcf.h" |
26 #include "dcf.h" |
27 #include "mac-parameters.h" |
27 #include "mac-parameters.h" |
28 #include "mac-low.h" |
28 #include "mac-low.h" |
29 #include "wifi-mac-queue.h" |
29 #include "wifi-mac-queue.h" |
30 #include "mac-tx-middle.h" |
30 #include "mac-tx-middle.h" |
31 #include "wifi-phy.h" |
31 #include "wifi-phy.h" |
32 |
32 |
33 |
33 NS_LOG_COMPONENT_DEFINE ("DcaTxop"); |
34 |
34 |
35 #define noDCA_TXOP_TRACE 1 |
|
36 |
|
37 #ifdef DCA_TXOP_TRACE |
|
38 #include "ns3/simulator.h" |
|
39 #include <iostream> |
|
40 # define TRACE(x) \ |
|
41 std::cout <<"DCA TXOP now="<<Simulator::NowUs ()<<"us "<<x<<std::endl; |
|
42 #else /* DCA_TXOP_TRACE */ |
|
43 # define TRACE(x) |
|
44 #endif /* DCA_TXOP_TRACE */ |
|
45 |
35 |
46 namespace ns3 { |
36 namespace ns3 { |
47 |
37 |
48 class DcaTxop::NavListener : public ns3::MacLowNavListener { |
38 class DcaTxop::NavListener : public ns3::MacLowNavListener { |
49 public: |
39 public: |
402 m_currentHdr.SetFragmentNumber (0); |
392 m_currentHdr.SetFragmentNumber (0); |
403 m_currentHdr.SetNoMoreFragments (); |
393 m_currentHdr.SetNoMoreFragments (); |
404 m_ssrc = 0; |
394 m_ssrc = 0; |
405 m_slrc = 0; |
395 m_slrc = 0; |
406 m_fragmentNumber = 0; |
396 m_fragmentNumber = 0; |
407 TRACE ("dequeued size="<<m_currentPacket.GetSize ()<< |
397 NS_LOG_DEBUG ("dequeued size="<<m_currentPacket.GetSize ()<< |
408 ", to="<<m_currentHdr.GetAddr1 ()<< |
398 ", to="<<m_currentHdr.GetAddr1 ()<< |
409 ", seq="<<m_currentHdr.GetSequenceControl ()); |
399 ", seq="<<m_currentHdr.GetSequenceControl ()); |
410 } |
400 } |
411 MacLowTransmissionParameters params; |
401 MacLowTransmissionParameters params; |
412 params.DisableOverrideDurationId (); |
402 params.DisableOverrideDurationId (); |
433 params.DisableRts (); |
423 params.DisableRts (); |
434 WifiMacHeader hdr; |
424 WifiMacHeader hdr; |
435 Packet fragment = GetFragmentPacket (&hdr); |
425 Packet fragment = GetFragmentPacket (&hdr); |
436 if (IsLastFragment ()) |
426 if (IsLastFragment ()) |
437 { |
427 { |
438 TRACE ("fragmenting last fragment size="<<fragment->GetSize ()); |
428 NS_LOG_DEBUG ("fragmenting last fragment size="<<fragment.GetSize ()); |
439 params.DisableNextData (); |
429 params.DisableNextData (); |
440 } |
430 } |
441 else |
431 else |
442 { |
432 { |
443 TRACE ("fragmenting size="<<fragment->GetSize ()); |
433 NS_LOG_DEBUG ("fragmenting size="<<fragment.GetSize ()); |
444 params.EnableNextData (GetNextFragmentSize ()); |
434 params.EnableNextData (GetNextFragmentSize ()); |
445 } |
435 } |
446 Low ()->StartTransmission (fragment, &hdr, params, |
436 Low ()->StartTransmission (fragment, &hdr, params, |
447 m_transmissionListener); |
437 m_transmissionListener); |
448 } |
438 } |
449 else |
439 else |
450 { |
440 { |
451 if (NeedRts ()) |
441 if (NeedRts ()) |
452 { |
442 { |
453 params.EnableRts (); |
443 params.EnableRts (); |
454 TRACE ("tx unicast rts"); |
444 NS_LOG_DEBUG ("tx unicast rts"); |
455 } |
445 } |
456 else |
446 else |
457 { |
447 { |
458 params.DisableRts (); |
448 params.DisableRts (); |
459 TRACE ("tx unicast"); |
449 NS_LOG_DEBUG ("tx unicast"); |
460 } |
450 } |
461 params.DisableNextData (); |
451 params.DisableNextData (); |
462 // We need to make a copy in case we need to |
452 // We need to make a copy in case we need to |
463 // retransmit the packet: the MacLow modifies the input |
453 // retransmit the packet: the MacLow modifies the input |
464 // Packet so, we would retransmit a modified packet |
454 // Packet so, we would retransmit a modified packet |
474 |
464 |
475 |
465 |
476 void |
466 void |
477 DcaTxop::GotCts (double snr, WifiMode txMode) |
467 DcaTxop::GotCts (double snr, WifiMode txMode) |
478 { |
468 { |
479 TRACE ("got cts"); |
469 NS_LOG_DEBUG ("got cts"); |
480 m_ssrc = 0; |
470 m_ssrc = 0; |
481 } |
471 } |
482 void |
472 void |
483 DcaTxop::MissedCts (void) |
473 DcaTxop::MissedCts (void) |
484 { |
474 { |
485 TRACE ("missed cts"); |
475 NS_LOG_DEBUG ("missed cts"); |
486 m_ssrc++; |
476 m_ssrc++; |
487 m_ctstimeoutTrace (m_ssrc); |
477 m_ctstimeoutTrace (m_ssrc); |
488 if (m_ssrc > Parameters ()->GetMaxSsrc ()) |
478 if (m_ssrc > Parameters ()->GetMaxSsrc ()) |
489 { |
479 { |
490 // to reset the dcf. |
480 // to reset the dcf. |
518 m_dcf->ResetCw (); |
508 m_dcf->ResetCw (); |
519 m_dcf->StartBackoff (); |
509 m_dcf->StartBackoff (); |
520 } |
510 } |
521 else |
511 else |
522 { |
512 { |
523 TRACE ("got ack. tx not done, size="<<m_currentPacket.GetSize ()); |
513 NS_LOG_DEBUG ("got ack. tx not done, size="<<m_currentPacket.GetSize ()); |
524 } |
514 } |
525 } |
515 } |
526 void |
516 void |
527 DcaTxop::MissedAck (void) |
517 DcaTxop::MissedAck (void) |
528 { |
518 { |
529 TRACE ("missed ack"); |
519 NS_LOG_DEBUG ("missed ack"); |
530 m_slrc++; |
520 m_slrc++; |
531 m_acktimeoutTrace (m_slrc); |
521 m_acktimeoutTrace (m_slrc); |
532 if (m_slrc > Parameters ()->GetMaxSlrc ()) |
522 if (m_slrc > Parameters ()->GetMaxSlrc ()) |
533 { |
523 { |
534 // to reset the dcf. |
524 // to reset the dcf. |
550 |
540 |
551 } |
541 } |
552 void |
542 void |
553 DcaTxop::StartNext (void) |
543 DcaTxop::StartNext (void) |
554 { |
544 { |
555 TRACE ("start next packet fragment"); |
545 NS_LOG_DEBUG ("start next packet fragment"); |
556 /* this callback is used only for fragments. */ |
546 /* this callback is used only for fragments. */ |
557 NextFragment (); |
547 NextFragment (); |
558 WifiMacHeader hdr; |
548 WifiMacHeader hdr; |
559 Packet fragment = GetFragmentPacket (&hdr); |
549 Packet fragment = GetFragmentPacket (&hdr); |
560 MacLowTransmissionParameters params; |
550 MacLowTransmissionParameters params; |