353 NS_LOG_FUNCTION (this); |
352 NS_LOG_FUNCTION (this); |
354 if (m_currentPacket == 0) |
353 if (m_currentPacket == 0) |
355 { |
354 { |
356 if (m_queue->IsEmpty ()) |
355 if (m_queue->IsEmpty ()) |
357 { |
356 { |
358 MY_DEBUG ("queue empty"); |
357 NS_LOG_DEBUG ("queue empty"); |
359 return; |
358 return; |
360 } |
359 } |
361 m_currentPacket = m_queue->Dequeue (&m_currentHdr); |
360 m_currentPacket = m_queue->Dequeue (&m_currentHdr); |
362 NS_ASSERT (m_currentPacket != 0); |
361 NS_ASSERT (m_currentPacket != 0); |
363 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr); |
362 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr); |
364 m_currentHdr.SetSequenceNumber (sequence); |
363 m_currentHdr.SetSequenceNumber (sequence); |
365 m_currentHdr.SetFragmentNumber (0); |
364 m_currentHdr.SetFragmentNumber (0); |
366 m_currentHdr.SetNoMoreFragments (); |
365 m_currentHdr.SetNoMoreFragments (); |
367 m_currentHdr.SetNoRetry (); |
366 m_currentHdr.SetNoRetry (); |
368 m_fragmentNumber = 0; |
367 m_fragmentNumber = 0; |
369 MY_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<< |
368 NS_LOG_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<< |
370 ", to="<<m_currentHdr.GetAddr1 ()<< |
369 ", to="<<m_currentHdr.GetAddr1 ()<< |
371 ", seq="<<m_currentHdr.GetSequenceControl ()); |
370 ", seq="<<m_currentHdr.GetSequenceControl ()); |
372 } |
371 } |
373 MacLowTransmissionParameters params; |
372 MacLowTransmissionParameters params; |
374 params.DisableOverrideDurationId (); |
373 params.DisableOverrideDurationId (); |
383 m_transmissionListener); |
382 m_transmissionListener); |
384 m_currentPacket = 0; |
383 m_currentPacket = 0; |
385 m_dcf->ResetCw (); |
384 m_dcf->ResetCw (); |
386 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
385 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
387 StartAccessIfNeeded (); |
386 StartAccessIfNeeded (); |
388 MY_DEBUG ("tx broadcast"); |
387 NS_LOG_DEBUG ("tx broadcast"); |
389 } |
388 } |
390 else |
389 else |
391 { |
390 { |
392 params.EnableAck (); |
391 params.EnableAck (); |
393 |
392 |
394 if (NeedFragmentation ()) |
393 if (NeedFragmentation ()) |
395 { |
394 { |
396 params.DisableRts (); |
|
397 WifiMacHeader hdr; |
395 WifiMacHeader hdr; |
398 Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
396 Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
|
397 if (NeedRts (fragment, &hdr)) |
|
398 { |
|
399 params.EnableRts (); |
|
400 } |
|
401 else |
|
402 { |
|
403 params.DisableRts (); |
|
404 } |
399 if (IsLastFragment ()) |
405 if (IsLastFragment ()) |
400 { |
406 { |
401 MY_DEBUG ("fragmenting last fragment size="<<fragment->GetSize ()); |
407 NS_LOG_DEBUG ("fragmenting last fragment size="<<fragment->GetSize ()); |
402 params.DisableNextData (); |
408 params.DisableNextData (); |
403 } |
409 } |
404 else |
410 else |
405 { |
411 { |
406 MY_DEBUG ("fragmenting size="<<fragment->GetSize ()); |
412 NS_LOG_DEBUG ("fragmenting size="<<fragment->GetSize ()); |
407 params.EnableNextData (GetNextFragmentSize ()); |
413 params.EnableNextData (GetNextFragmentSize ()); |
408 } |
414 } |
409 Low ()->StartTransmission (fragment, &hdr, params, |
415 Low ()->StartTransmission (fragment, &hdr, params, |
410 m_transmissionListener); |
416 m_transmissionListener); |
411 } |
417 } |
412 else |
418 else |
413 { |
419 { |
414 if (NeedRts ()) |
420 if (NeedRts (m_currentPacket, &m_currentHdr)) |
415 { |
421 { |
416 params.EnableRts (); |
422 params.EnableRts (); |
417 MY_DEBUG ("tx unicast rts"); |
423 NS_LOG_DEBUG ("tx unicast rts"); |
418 } |
424 } |
419 else |
425 else |
420 { |
426 { |
421 params.DisableRts (); |
427 params.DisableRts (); |
422 MY_DEBUG ("tx unicast"); |
428 NS_LOG_DEBUG ("tx unicast"); |
423 } |
429 } |
424 params.DisableNextData (); |
430 params.DisableNextData (); |
425 Low ()->StartTransmission (m_currentPacket, &m_currentHdr, |
431 Low ()->StartTransmission (m_currentPacket, &m_currentHdr, |
426 params, m_transmissionListener); |
432 params, m_transmissionListener); |
427 } |
433 } |
436 } |
442 } |
437 void |
443 void |
438 DcaTxop::NotifyCollision (void) |
444 DcaTxop::NotifyCollision (void) |
439 { |
445 { |
440 NS_LOG_FUNCTION (this); |
446 NS_LOG_FUNCTION (this); |
441 MY_DEBUG ("collision"); |
447 NS_LOG_DEBUG ("collision"); |
442 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
448 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
443 RestartAccessIfNeeded (); |
449 RestartAccessIfNeeded (); |
444 } |
450 } |
445 |
451 |
446 void |
452 void |
452 |
458 |
453 void |
459 void |
454 DcaTxop::GotCts (double snr, WifiMode txMode) |
460 DcaTxop::GotCts (double snr, WifiMode txMode) |
455 { |
461 { |
456 NS_LOG_FUNCTION (this << snr << txMode); |
462 NS_LOG_FUNCTION (this << snr << txMode); |
457 MY_DEBUG ("got cts"); |
463 NS_LOG_DEBUG ("got cts"); |
458 } |
464 } |
459 void |
465 void |
460 DcaTxop::MissedCts (void) |
466 DcaTxop::MissedCts (void) |
461 { |
467 { |
462 NS_LOG_FUNCTION (this); |
468 NS_LOG_FUNCTION (this); |
463 MY_DEBUG ("missed cts"); |
469 NS_LOG_DEBUG ("missed cts"); |
464 if (!NeedRtsRetransmission ()) |
470 if (!NeedRtsRetransmission ()) |
465 { |
471 { |
466 MY_DEBUG ("Cts Fail"); |
472 NS_LOG_DEBUG ("Cts Fail"); |
467 m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
473 m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
468 if (!m_txFailedCallback.IsNull ()) |
474 if (!m_txFailedCallback.IsNull ()) |
469 { |
475 { |
470 m_txFailedCallback (m_currentHdr); |
476 m_txFailedCallback (m_currentHdr); |
471 } |
477 } |
501 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
507 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
502 RestartAccessIfNeeded (); |
508 RestartAccessIfNeeded (); |
503 } |
509 } |
504 else |
510 else |
505 { |
511 { |
506 MY_DEBUG ("got ack. tx not done, size="<<m_currentPacket->GetSize ()); |
512 NS_LOG_DEBUG ("got ack. tx not done, size="<<m_currentPacket->GetSize ()); |
507 } |
513 } |
508 } |
514 } |
509 void |
515 void |
510 DcaTxop::MissedAck (void) |
516 DcaTxop::MissedAck (void) |
511 { |
517 { |
512 NS_LOG_FUNCTION (this); |
518 NS_LOG_FUNCTION (this); |
513 MY_DEBUG ("missed ack"); |
519 NS_LOG_DEBUG ("missed ack"); |
514 if (!NeedDataRetransmission ()) |
520 if (!NeedDataRetransmission ()) |
515 { |
521 { |
516 MY_DEBUG ("Ack Fail"); |
522 NS_LOG_DEBUG ("Ack Fail"); |
517 m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
523 m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
518 if (!m_txFailedCallback.IsNull ()) |
524 if (!m_txFailedCallback.IsNull ()) |
519 { |
525 { |
520 m_txFailedCallback (m_currentHdr); |
526 m_txFailedCallback (m_currentHdr); |
521 } |
527 } |
523 m_currentPacket = 0; |
529 m_currentPacket = 0; |
524 m_dcf->ResetCw (); |
530 m_dcf->ResetCw (); |
525 } |
531 } |
526 else |
532 else |
527 { |
533 { |
528 MY_DEBUG ("Retransmit"); |
534 NS_LOG_DEBUG ("Retransmit"); |
529 m_currentHdr.SetRetry (); |
535 m_currentHdr.SetRetry (); |
530 m_dcf->UpdateFailedCw (); |
536 m_dcf->UpdateFailedCw (); |
531 } |
537 } |
532 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
538 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
533 RestartAccessIfNeeded (); |
539 RestartAccessIfNeeded (); |
534 } |
540 } |
535 void |
541 void |
536 DcaTxop::StartNext (void) |
542 DcaTxop::StartNext (void) |
537 { |
543 { |
538 NS_LOG_FUNCTION (this); |
544 NS_LOG_FUNCTION (this); |
539 MY_DEBUG ("start next packet fragment"); |
545 NS_LOG_DEBUG ("start next packet fragment"); |
540 /* this callback is used only for fragments. */ |
546 /* this callback is used only for fragments. */ |
541 NextFragment (); |
547 NextFragment (); |
542 WifiMacHeader hdr; |
548 WifiMacHeader hdr; |
543 Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
549 Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
544 MacLowTransmissionParameters params; |
550 MacLowTransmissionParameters params; |
558 |
564 |
559 void |
565 void |
560 DcaTxop::Cancel (void) |
566 DcaTxop::Cancel (void) |
561 { |
567 { |
562 NS_LOG_FUNCTION (this); |
568 NS_LOG_FUNCTION (this); |
563 MY_DEBUG ("transmission cancelled"); |
569 NS_LOG_DEBUG ("transmission cancelled"); |
564 /** |
570 /** |
565 * This happens in only one case: in an AP, you have two DcaTxop: |
571 * This happens in only one case: in an AP, you have two DcaTxop: |
566 * - one is used exclusively for beacons and has a high priority. |
572 * - one is used exclusively for beacons and has a high priority. |
567 * - the other is used for everything else and has a normal |
573 * - the other is used for everything else and has a normal |
568 * priority. |
574 * priority. |