|
|
| 679 |
{ |
679 |
{ |
| 680 |
m_low->FlushAggregateQueue (); |
680 |
m_low->FlushAggregateQueue (); |
| 681 |
uint8_t tid = 0; |
681 |
uint8_t tid = 0; |
|
|
682 |
// Bug 2224 workaround; avoid taking BAR action if m_currentHdr is not QoS |
| 682 |
if (m_currentHdr.IsQosData ()) |
683 |
if (m_currentHdr.IsQosData ()) |
| 683 |
{ |
684 |
{ |
| 684 |
tid = m_currentHdr.GetQosTid (); |
685 |
tid = m_currentHdr.GetQosTid (); |
| 685 |
} |
|
|
| 686 |
else |
| 687 |
{ |
| 688 |
NS_FATAL_ERROR ("Current packet is not Qos Data"); |
| 689 |
} |
| 690 |
|
686 |
|
| 691 |
if (GetBaAgreementExists (m_currentHdr.GetAddr1 (), tid)) |
687 |
if (GetBaAgreementExists (m_currentHdr.GetAddr1 (), tid)) |
| 692 |
{ |
688 |
{ |
| 693 |
NS_LOG_DEBUG ("Transmit Block Ack Request"); |
689 |
NS_LOG_DEBUG ("Transmit Block Ack Request"); |
| 694 |
CtrlBAckRequestHeader reqHdr; |
690 |
CtrlBAckRequestHeader reqHdr; |
| 695 |
reqHdr.SetType (COMPRESSED_BLOCK_ACK); |
691 |
reqHdr.SetType (COMPRESSED_BLOCK_ACK); |
| 696 |
reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr)); |
692 |
reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr)); |
| 697 |
reqHdr.SetTidInfo (tid); |
693 |
reqHdr.SetTidInfo (tid); |
| 698 |
reqHdr.SetHtImmediateAck (true); |
694 |
reqHdr.SetHtImmediateAck (true); |
| 699 |
Ptr<Packet> bar = Create<Packet> (); |
695 |
Ptr<Packet> bar = Create<Packet> (); |
| 700 |
bar->AddHeader (reqHdr); |
696 |
bar->AddHeader (reqHdr); |
| 701 |
Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ()); |
697 |
Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ()); |
| 702 |
m_currentBar = request; |
698 |
m_currentBar = request; |
| 703 |
WifiMacHeader hdr; |
699 |
WifiMacHeader hdr; |
| 704 |
hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
700 |
hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
| 705 |
hdr.SetAddr1 (request.recipient); |
701 |
hdr.SetAddr1 (request.recipient); |
| 706 |
hdr.SetAddr2 (m_low->GetAddress ()); |
702 |
hdr.SetAddr2 (m_low->GetAddress ()); |
| 707 |
hdr.SetAddr3 (m_low->GetBssid ()); |
703 |
hdr.SetAddr3 (m_low->GetBssid ()); |
| 708 |
hdr.SetDsNotTo (); |
704 |
hdr.SetDsNotTo (); |
| 709 |
hdr.SetDsNotFrom (); |
705 |
hdr.SetDsNotFrom (); |
| 710 |
hdr.SetNoRetry (); |
706 |
hdr.SetNoRetry (); |
| 711 |
hdr.SetNoMoreFragments (); |
707 |
hdr.SetNoMoreFragments (); |
| 712 |
m_currentPacket = request.bar; |
708 |
m_currentPacket = request.bar; |
| 713 |
m_currentHdr = hdr; |
709 |
m_currentHdr = hdr; |
| 714 |
resetCurrentPacket = false; |
710 |
resetCurrentPacket = false; |
|
|
711 |
} |
| 715 |
} |
712 |
} |
| 716 |
} |
713 |
} |
| 717 |
//to reset the dcf. |
714 |
//to reset the dcf. |
|
|
| 833 |
if (m_currentHdr.IsQosData ()) |
830 |
if (m_currentHdr.IsQosData ()) |
| 834 |
{ |
831 |
{ |
| 835 |
tid = m_currentHdr.GetQosTid (); |
832 |
tid = m_currentHdr.GetQosTid (); |
| 836 |
} |
|
|
| 837 |
else |
| 838 |
{ |
| 839 |
NS_FATAL_ERROR ("Current packet is not Qos Data"); |
| 840 |
} |
| 841 |
|
833 |
|
| 842 |
if (GetBaAgreementExists (m_currentHdr.GetAddr1 (), tid)) |
834 |
if (GetBaAgreementExists (m_currentHdr.GetAddr1 (), tid)) |
| 843 |
{ |
835 |
{ |
| 844 |
//send Block ACK Request in order to shift WinStart at the receiver |
836 |
//send Block ACK Request in order to shift WinStart at the receiver |
| 845 |
NS_LOG_DEBUG ("Transmit Block Ack Request"); |
837 |
NS_LOG_DEBUG ("Transmit Block Ack Request"); |
| 846 |
CtrlBAckRequestHeader reqHdr; |
838 |
CtrlBAckRequestHeader reqHdr; |
| 847 |
reqHdr.SetType (COMPRESSED_BLOCK_ACK); |
839 |
reqHdr.SetType (COMPRESSED_BLOCK_ACK); |
| 848 |
reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr)); |
840 |
reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr)); |
| 849 |
reqHdr.SetTidInfo (tid); |
841 |
reqHdr.SetTidInfo (tid); |
| 850 |
reqHdr.SetHtImmediateAck (true); |
842 |
reqHdr.SetHtImmediateAck (true); |
| 851 |
Ptr<Packet> bar = Create<Packet> (); |
843 |
Ptr<Packet> bar = Create<Packet> (); |
| 852 |
bar->AddHeader (reqHdr); |
844 |
bar->AddHeader (reqHdr); |
| 853 |
Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ()); |
845 |
Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ()); |
| 854 |
m_currentBar = request; |
846 |
m_currentBar = request; |
| 855 |
WifiMacHeader hdr; |
847 |
WifiMacHeader hdr; |
| 856 |
hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
848 |
hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
| 857 |
hdr.SetAddr1 (request.recipient); |
849 |
hdr.SetAddr1 (request.recipient); |
| 858 |
hdr.SetAddr2 (m_low->GetAddress ()); |
850 |
hdr.SetAddr2 (m_low->GetAddress ()); |
| 859 |
hdr.SetAddr3 (m_low->GetBssid ()); |
851 |
hdr.SetAddr3 (m_low->GetBssid ()); |
| 860 |
hdr.SetDsNotTo (); |
852 |
hdr.SetDsNotTo (); |
| 861 |
hdr.SetDsNotFrom (); |
853 |
hdr.SetDsNotFrom (); |
| 862 |
hdr.SetNoRetry (); |
854 |
hdr.SetNoRetry (); |
| 863 |
hdr.SetNoMoreFragments (); |
855 |
hdr.SetNoMoreFragments (); |
| 864 |
m_currentPacket = request.bar; |
856 |
m_currentPacket = request.bar; |
| 865 |
m_currentHdr = hdr; |
857 |
m_currentHdr = hdr; |
| 866 |
resetCurrentPacket = false; |
858 |
resetCurrentPacket = false; |
|
|
859 |
} |
| 867 |
} |
860 |
} |
| 868 |
} |
861 |
} |
| 869 |
//to reset the dcf. |
862 |
//to reset the dcf. |