|
|
| 308 |
MakeBooleanAccessor (&WifiPhy::GetShortPlcpPreambleSupported, |
308 |
MakeBooleanAccessor (&WifiPhy::GetShortPlcpPreambleSupported, |
| 309 |
&WifiPhy::SetShortPlcpPreambleSupported), |
309 |
&WifiPhy::SetShortPlcpPreambleSupported), |
| 310 |
MakeBooleanChecker ()) |
310 |
MakeBooleanChecker ()) |
|
|
311 |
.AddAttribute ("PreambleCaptureEnabled", |
| 312 |
"Whether or not to enable capture at the preamble portion of the packet.", |
| 313 |
BooleanValue (false), |
| 314 |
MakeBooleanAccessor (&WifiPhy::m_doPreambleCapture), |
| 315 |
MakeBooleanChecker ()) |
| 316 |
.AddAttribute ("PayloadCaptureEnabled", |
| 317 |
"Whether or not to enable capture at the payload portion of the packet", |
| 318 |
BooleanValue (false), |
| 319 |
MakeBooleanAccessor (&WifiPhy::m_doPayloadCapture), |
| 320 |
MakeBooleanChecker ()) |
| 311 |
.AddTraceSource ("PhyTxBegin", |
321 |
.AddTraceSource ("PhyTxBegin", |
| 312 |
"Trace source indicating a packet " |
322 |
"Trace source indicating a packet " |
| 313 |
"has begun transmitting over the channel medium", |
323 |
"has begun transmitting over the channel medium", |
|
|
| 883 |
{ |
893 |
{ |
| 884 |
// erase all HtMcs modes from deviceMcsSet |
894 |
// erase all HtMcs modes from deviceMcsSet |
| 885 |
size_t index = m_deviceMcsSet.size () - 1; |
895 |
size_t index = m_deviceMcsSet.size () - 1; |
| 886 |
for (std::vector<WifiMode>::reverse_iterator rit = m_deviceMcsSet.rbegin (); rit != m_deviceMcsSet.rend(); ++rit, --index) |
896 |
for (std::vector<WifiMode>::reverse_iterator rit = m_deviceMcsSet.rbegin (); rit != m_deviceMcsSet.rend (); ++rit, --index) |
| 887 |
{ |
897 |
{ |
| 888 |
if (m_deviceMcsSet[index].GetModulationClass ()== WIFI_MOD_CLASS_HT) |
898 |
if (m_deviceMcsSet[index].GetModulationClass () == WIFI_MOD_CLASS_HT) |
| 889 |
{ |
899 |
{ |
| 890 |
m_deviceMcsSet.erase (m_deviceMcsSet.begin () + index); |
900 |
m_deviceMcsSet.erase (m_deviceMcsSet.begin () + index); |
| 891 |
} |
901 |
} |
|
|
| 999 |
{ |
1009 |
{ |
| 1000 |
if (it->second == f) |
1010 |
if (it->second == f) |
| 1001 |
{ |
1011 |
{ |
| 1002 |
found = true; |
1012 |
found = true; |
| 1003 |
break; |
1013 |
break; |
| 1004 |
} |
1014 |
} |
| 1005 |
++it; |
1015 |
++it; |
| 1006 |
} |
1016 |
} |
|
|
| 1945 |
//check tables 20-35 and 20-36 in the .11n standard to get cases when nes = 2 |
1955 |
//check tables 20-35 and 20-36 in the .11n standard to get cases when nes = 2 |
| 1946 |
double Nes = 1; |
1956 |
double Nes = 1; |
| 1947 |
if (payloadMode.GetUniqueName () == "HtMcs21" |
1957 |
if (payloadMode.GetUniqueName () == "HtMcs21" |
| 1948 |
|| payloadMode.GetUniqueName () == "HtMcs22" |
1958 |
|| payloadMode.GetUniqueName () == "HtMcs22" |
| 1949 |
|| payloadMode.GetUniqueName () == "HtMcs23" |
1959 |
|| payloadMode.GetUniqueName () == "HtMcs23" |
| 1950 |
|| payloadMode.GetUniqueName () == "HtMcs28" |
1960 |
|| payloadMode.GetUniqueName () == "HtMcs28" |
| 1951 |
|| payloadMode.GetUniqueName () == "HtMcs29" |
1961 |
|| payloadMode.GetUniqueName () == "HtMcs29" |
| 1952 |
|| payloadMode.GetUniqueName () == "HtMcs30" |
1962 |
|| payloadMode.GetUniqueName () == "HtMcs30" |
| 1953 |
|| payloadMode.GetUniqueName () == "HtMcs31") |
1963 |
|| payloadMode.GetUniqueName () == "HtMcs31") |
| 1954 |
{ |
1964 |
{ |
| 1955 |
Nes = 2; |
1965 |
Nes = 2; |
| 1956 |
} |
1966 |
} |
|
|
| 2125 |
Time |
2135 |
Time |
| 2126 |
WifiPhy::CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txVector) |
2136 |
WifiPhy::CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txVector) |
| 2127 |
{ |
2137 |
{ |
| 2128 |
WifiPreamble preamble = txVector.GetPreambleType(); |
2138 |
WifiPreamble preamble = txVector.GetPreambleType (); |
| 2129 |
Time duration = GetPlcpPreambleDuration (txVector) |
2139 |
Time duration = GetPlcpPreambleDuration (txVector) |
| 2130 |
+ GetPlcpHeaderDuration (txVector) |
2140 |
+ GetPlcpHeaderDuration (txVector) |
| 2131 |
+ GetPlcpHtSigHeaderDuration (preamble) |
2141 |
+ GetPlcpHtSigHeaderDuration (preamble) |
|
|
| 2213 |
* - we are idle |
2223 |
* - we are idle |
| 2214 |
*/ |
2224 |
*/ |
| 2215 |
NS_ASSERT (!m_state->IsStateTx () && !m_state->IsStateSwitching ()); |
2225 |
NS_ASSERT (!m_state->IsStateTx () && !m_state->IsStateSwitching ()); |
| 2216 |
|
2226 |
|
| 2217 |
if (txVector.GetNss () > GetMaxSupportedTxSpatialStreams ()) |
2227 |
if (txVector.GetNss () > GetMaxSupportedTxSpatialStreams ()) |
| 2218 |
{ |
2228 |
{ |
| 2219 |
NS_FATAL_ERROR ("Unsupported number of spatial streams!"); |
2229 |
NS_FATAL_ERROR ("Unsupported number of spatial streams!"); |
|
|
| 2252 |
newPacket->RemovePacketTag (oldtag); |
2262 |
newPacket->RemovePacketTag (oldtag); |
| 2253 |
WifiPhyTag tag (txVector, mpdutype); |
2263 |
WifiPhyTag tag (txVector, mpdutype); |
| 2254 |
newPacket->AddPacketTag (tag); |
2264 |
newPacket->AddPacketTag (tag); |
| 2255 |
|
2265 |
|
| 2256 |
StartTx (newPacket, txVector, txDuration); |
2266 |
StartTx (newPacket, txVector, txDuration); |
| 2257 |
} |
2267 |
} |
| 2258 |
|
2268 |
|
|
|
| 2264 |
NS_LOG_FUNCTION (this << packet << WToDbm (rxPowerW) << rxDuration); |
2274 |
NS_LOG_FUNCTION (this << packet << WToDbm (rxPowerW) << rxDuration); |
| 2265 |
AmpduTag ampduTag; |
2275 |
AmpduTag ampduTag; |
| 2266 |
Time endRx = Simulator::Now () + rxDuration; |
2276 |
Time endRx = Simulator::Now () + rxDuration; |
| 2267 |
|
2277 |
|
| 2268 |
WifiPhyTag tag; |
2278 |
WifiPhyTag tag; |
| 2269 |
bool found = packet->RemovePacketTag (tag); |
2279 |
bool found = packet->RemovePacketTag (tag); |
| 2270 |
if (!found) |
2280 |
if (!found) |
|
|
| 2274 |
} |
2284 |
} |
| 2275 |
|
2285 |
|
| 2276 |
WifiTxVector txVector = tag.GetWifiTxVector (); |
2286 |
WifiTxVector txVector = tag.GetWifiTxVector (); |
| 2277 |
|
2287 |
|
| 2278 |
if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT |
2288 |
if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT |
| 2279 |
&& (txVector.GetNss () != (1 + (txVector.GetMode ().GetMcsValue () / 8)))) |
2289 |
&& (txVector.GetNss () != (1 + (txVector.GetMode ().GetMcsValue () / 8)))) |
| 2280 |
{ |
2290 |
{ |
| 2281 |
NS_FATAL_ERROR ("MCS value does not match NSS value: MCS = " << (uint16_t)txVector.GetMode ().GetMcsValue () << ", NSS = " << (uint16_t)txVector.GetNss ()); |
2291 |
NS_FATAL_ERROR ("MCS value does not match NSS value: MCS = " << (uint16_t)txVector.GetMode ().GetMcsValue () << ", NSS = " << (uint16_t)txVector.GetNss ()); |
| 2282 |
} |
2292 |
} |
| 2283 |
|
2293 |
|
| 2284 |
if (txVector.GetNss () > GetMaxSupportedRxSpatialStreams ()) |
2294 |
if (txVector.GetNss () > GetMaxSupportedRxSpatialStreams ()) |
| 2285 |
{ |
2295 |
{ |
| 2286 |
NS_FATAL_ERROR ("Reception ends in failure because of an unsupported number of spatial streams"); |
2296 |
NS_FATAL_ERROR ("Reception ends in failure because of an unsupported number of spatial streams"); |
| 2287 |
} |
2297 |
} |
| 2288 |
|
2298 |
|
| 2289 |
WifiPreamble preamble = txVector.GetPreambleType (); |
2299 |
WifiPreamble preamble = txVector.GetPreambleType (); |
| 2290 |
MpduType mpdutype = tag.GetMpduType (); |
2300 |
MpduType mpdutype = tag.GetMpduType (); |
|
|
| 2314 |
{ |
2324 |
{ |
| 2315 |
//that packet will be noise _after_ the completion of the |
2325 |
//that packet will be noise _after_ the completion of the |
| 2316 |
//channel switching. |
2326 |
//channel switching. |
| 2317 |
goto maybeCcaBusy; |
2327 |
CalculateCcaBusyDuration (); |
| 2318 |
} |
2328 |
} |
| 2319 |
break; |
2329 |
break; |
| 2320 |
case WifiPhy::RX: |
2330 |
case WifiPhy::RX: |
| 2321 |
NS_LOG_DEBUG ("drop packet because already in Rx (power=" << |
2331 |
{ |
| 2322 |
rxPowerW << "W)"); |
2332 |
NS_ASSERT (m_rxPacketEvent != NULL); |
| 2323 |
NotifyRxDrop (packet); |
2333 |
if ((m_doPreambleCapture == false |
| 2324 |
if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ()) |
2334 |
&& m_doPayloadCapture == false) |
| 2325 |
{ |
2335 |
|| preamble == WIFI_PREAMBLE_NONE) |
| 2326 |
//that packet will be noise _after_ the reception of the |
2336 |
{ |
| 2327 |
//currently-received packet. |
2337 |
NotifyRxDrop (packet); |
| 2328 |
goto maybeCcaBusy; |
2338 |
if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ()) |
| 2329 |
} |
2339 |
{ |
| 2330 |
break; |
2340 |
CalculateCcaBusyDuration (); |
|
|
2341 |
} |
| 2342 |
break; |
| 2343 |
} |
| 2344 |
|
| 2345 |
Time currentRxDuration = Simulator::Now () - m_rxPacketEvent->GetStartTime (); |
| 2346 |
if (m_rxPreambleType != WIFI_PREAMBLE_NONE |
| 2347 |
&& currentRxDuration < preambleAndHeaderDuration) // still receiving the preamble and plcp header portion of the old packet |
| 2348 |
{ |
| 2349 |
CheckFrameCapture (PreambleCapture, packet, event, preamble, preambleAndHeaderDuration, rxDuration, txVector, mpdutype); |
| 2350 |
} |
| 2351 |
else |
| 2352 |
{ |
| 2353 |
CheckFrameCapture (PayloadCapture, packet, event, preamble, preambleAndHeaderDuration, rxDuration, txVector, mpdutype); |
| 2354 |
} |
| 2355 |
break; |
| 2356 |
} |
| 2331 |
case WifiPhy::TX: |
2357 |
case WifiPhy::TX: |
| 2332 |
NS_LOG_DEBUG ("drop packet because already in Tx (power=" << |
2358 |
NS_LOG_DEBUG ("drop packet because already in Tx (power=" << |
| 2333 |
rxPowerW << "W)"); |
2359 |
rxPowerW << "W)"); |
|
|
| 2336 |
{ |
2362 |
{ |
| 2337 |
//that packet will be noise _after_ the transmission of the |
2363 |
//that packet will be noise _after_ the transmission of the |
| 2338 |
//currently-transmitted packet. |
2364 |
//currently-transmitted packet. |
| 2339 |
goto maybeCcaBusy; |
2365 |
CalculateCcaBusyDuration (); |
| 2340 |
} |
2366 |
} |
| 2341 |
break; |
2367 |
break; |
| 2342 |
case WifiPhy::CCA_BUSY: |
2368 |
case WifiPhy::CCA_BUSY: |
|
|
| 2349 |
m_mpdusNum = 0; |
2375 |
m_mpdusNum = 0; |
| 2350 |
NS_LOG_DEBUG ("drop packet because no PLCP preamble/header has been received"); |
2376 |
NS_LOG_DEBUG ("drop packet because no PLCP preamble/header has been received"); |
| 2351 |
NotifyRxDrop (packet); |
2377 |
NotifyRxDrop (packet); |
| 2352 |
goto maybeCcaBusy; |
2378 |
CalculateCcaBusyDuration (); |
| 2353 |
} |
2379 |
} |
| 2354 |
else if (preamble != WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum == 0) |
2380 |
else if (preamble != WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum == 0) |
| 2355 |
{ |
2381 |
{ |
|
|
| 2387 |
NS_ASSERT (m_endPlcpRxEvent.IsExpired ()); |
2413 |
NS_ASSERT (m_endPlcpRxEvent.IsExpired ()); |
| 2388 |
NotifyRxBegin (packet); |
2414 |
NotifyRxBegin (packet); |
| 2389 |
m_interference.NotifyRxStart (); |
2415 |
m_interference.NotifyRxStart (); |
|
|
2416 |
m_rxPacket = packet; |
| 2417 |
m_rxPacketEvent = event; |
| 2418 |
m_rxPreambleType = preamble; |
| 2390 |
|
2419 |
|
| 2391 |
if (preamble != WIFI_PREAMBLE_NONE) |
2420 |
if (preamble != WIFI_PREAMBLE_NONE) |
| 2392 |
{ |
2421 |
{ |
|
|
| 2405 |
rxPowerW << "<" << GetEdThresholdW () << ")"); |
2434 |
rxPowerW << "<" << GetEdThresholdW () << ")"); |
| 2406 |
NotifyRxDrop (packet); |
2435 |
NotifyRxDrop (packet); |
| 2407 |
m_plcpSuccess = false; |
2436 |
m_plcpSuccess = false; |
| 2408 |
goto maybeCcaBusy; |
2437 |
CalculateCcaBusyDuration (); |
| 2409 |
} |
2438 |
} |
| 2410 |
break; |
2439 |
break; |
| 2411 |
case WifiPhy::SLEEP: |
2440 |
case WifiPhy::SLEEP: |
|
|
| 2416 |
} |
2445 |
} |
| 2417 |
|
2446 |
|
| 2418 |
return; |
2447 |
return; |
| 2419 |
|
2448 |
} |
| 2420 |
maybeCcaBusy: |
2449 |
|
| 2421 |
//We are here because we have received the first bit of a packet and we are |
2450 |
void |
| 2422 |
//not going to be able to synchronize on it |
2451 |
WifiPhy::CalculateCcaBusyDuration () |
| 2423 |
//In this model, CCA becomes busy when the aggregation of all signals as |
2452 |
{ |
| 2424 |
//tracked by the InterferenceHelper class is higher than the CcaBusyThreshold |
2453 |
// maybeCcaBusy: |
| 2425 |
|
2454 |
// We are here because we have received the first bit of a packet and we are |
|
|
2455 |
// not going to be able to synchronize on it |
| 2456 |
// In this model, CCA becomes busy when the aggregation of all signals as |
| 2457 |
// tracked by the InterferenceHelper class is higher than the CcaBusyThreshold |
| 2426 |
Time delayUntilCcaEnd = m_interference.GetEnergyDuration (DbmToW (GetCcaMode1Threshold ())); |
2458 |
Time delayUntilCcaEnd = m_interference.GetEnergyDuration (DbmToW (GetCcaMode1Threshold ())); |
| 2427 |
if (!delayUntilCcaEnd.IsZero ()) |
2459 |
if (!delayUntilCcaEnd.IsZero ()) |
| 2428 |
{ |
2460 |
{ |
|
|
| 2431 |
} |
2463 |
} |
| 2432 |
|
2464 |
|
| 2433 |
void |
2465 |
void |
|
|
2466 |
WifiPhy::CheckFrameCapture (FrameCaptureType captureType, Ptr<Packet> packet, Ptr<InterferenceHelper::Event> event, |
| 2467 |
WifiPreamble preamble, Time preambleAndHeaderDuration, Time rxDuration, |
| 2468 |
WifiTxVector txVector, MpduType mpdutype) |
| 2469 |
{ |
| 2470 |
NS_LOG_FUNCTION (this << packet << event); |
| 2471 |
NS_LOG_DEBUG (Simulator::Now () << ", " << captureType |
| 2472 |
<< " check: old reception event start at " |
| 2473 |
<< m_rxPacketEvent->GetStartTime () |
| 2474 |
<< ", old preamble type " << m_rxPreambleType |
| 2475 |
<< ", end at " << m_rxPacketEvent->GetEndTime () |
| 2476 |
<< ", old rxPower " << m_rxPacketEvent->GetRxPowerW ()); |
| 2477 |
|
| 2478 |
double sinrForNewPkt = m_interference.CalculateEventSinr (event); |
| 2479 |
double prob = 0.0; |
| 2480 |
if (captureType == PreambleCapture) |
| 2481 |
{ |
| 2482 |
prob = m_interference.CalculatePreambleCaptureProbability (sinrForNewPkt); |
| 2483 |
} |
| 2484 |
else if (captureType == PayloadCapture) |
| 2485 |
{ |
| 2486 |
prob = m_interference.CalculatePayloadCaptureProbability (sinrForNewPkt); |
| 2487 |
} |
| 2488 |
|
| 2489 |
if (m_random->GetValue () < prob) |
| 2490 |
{ |
| 2491 |
AbortCurrentReception (); |
| 2492 |
NS_ASSERT (m_endPlcpRxEvent.IsExpired () && m_endRxEvent.IsExpired ()); |
| 2493 |
NS_LOG_INFO (Simulator::Now () << " " << captureType << " switch to new packet"); |
| 2494 |
SwitchReception (packet, event); |
| 2495 |
NS_LOG_INFO ("The receiver switches to the new packet (rxPowerDbm " << WToDbm (event->GetRxPowerW ()) << ")"); |
| 2496 |
m_endPlcpRxEvent = Simulator::Schedule (preambleAndHeaderDuration, &WifiPhy::StartReceivePacket, this, |
| 2497 |
packet, txVector, mpdutype, event); |
| 2498 |
m_endRxEvent = Simulator::Schedule (rxDuration, &WifiPhy::EndReceive, this, |
| 2499 |
packet, preamble, mpdutype, event); |
| 2500 |
m_rxPreambleType = preamble; |
| 2501 |
} |
| 2502 |
else |
| 2503 |
{ |
| 2504 |
NS_LOG_INFO (Simulator::Now () << " " << captureType << " signal is too low for capture"); |
| 2505 |
Time endRx = event->GetEndTime (); |
| 2506 |
NotifyRxDrop (packet); |
| 2507 |
if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ()) |
| 2508 |
{ |
| 2509 |
CalculateCcaBusyDuration (); |
| 2510 |
} |
| 2511 |
} |
| 2512 |
} |
| 2513 |
|
| 2514 |
void |
| 2515 |
WifiPhy::AbortCurrentReception () |
| 2516 |
{ |
| 2517 |
NS_LOG_FUNCTION (this); |
| 2518 |
if (m_endPlcpRxEvent.IsRunning ()) |
| 2519 |
{ |
| 2520 |
m_endPlcpRxEvent.Cancel (); |
| 2521 |
} |
| 2522 |
if (m_endRxEvent.IsRunning ()) |
| 2523 |
{ |
| 2524 |
m_endRxEvent.Cancel (); |
| 2525 |
} |
| 2526 |
m_interference.NotifyRxEnd (); |
| 2527 |
m_state->SwitchFromRxAbort (); |
| 2528 |
m_rxPacket = NULL; |
| 2529 |
m_rxPacketEvent = NULL; |
| 2530 |
m_rxPreambleType = WIFI_PREAMBLE_NONE; |
| 2531 |
} |
| 2532 |
|
| 2533 |
void |
| 2534 |
WifiPhy::SwitchReception (Ptr<Packet> packet, Ptr<InterferenceHelper::Event> event) |
| 2535 |
{ |
| 2536 |
NS_LOG_FUNCTION (this << packet << event); |
| 2537 |
m_rxPacket = packet; |
| 2538 |
m_rxPacketEvent = event; |
| 2539 |
m_state->SwitchToRx (event->GetDuration ()); |
| 2540 |
NotifyRxBegin (packet); |
| 2541 |
m_interference.NotifyRxStart (); |
| 2542 |
} |
| 2543 |
|
| 2544 |
void |
| 2434 |
WifiPhy::StartReceivePacket (Ptr<Packet> packet, |
2545 |
WifiPhy::StartReceivePacket (Ptr<Packet> packet, |
| 2435 |
WifiTxVector txVector, |
2546 |
WifiTxVector txVector, |
| 2436 |
MpduType mpdutype, |
2547 |
MpduType mpdutype, |
|
|
| 2452 |
{ |
2563 |
{ |
| 2453 |
NS_LOG_DEBUG ("receiving plcp payload"); //endReceive is already scheduled |
2564 |
NS_LOG_DEBUG ("receiving plcp payload"); //endReceive is already scheduled |
| 2454 |
m_plcpSuccess = true; |
2565 |
m_plcpSuccess = true; |
|
|
2566 |
NS_LOG_INFO ("decode plcp successfully (rxPowerDbm " << WToDbm (event->GetRxPowerW ()) << ")"); |
| 2455 |
} |
2567 |
} |
| 2456 |
else //mode is not allowed |
2568 |
else //mode is not allowed |
| 2457 |
{ |
2569 |
{ |
|
|
| 2495 |
aMpdu.mpduRefNumber = m_rxMpduReferenceNumber; |
2607 |
aMpdu.mpduRefNumber = m_rxMpduReferenceNumber; |
| 2496 |
NotifyMonitorSniffRx (packet, GetFrequency (), event->GetTxVector (), aMpdu, signalNoise); |
2608 |
NotifyMonitorSniffRx (packet, GetFrequency (), event->GetTxVector (), aMpdu, signalNoise); |
| 2497 |
m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetTxVector ()); |
2609 |
m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetTxVector ()); |
|
|
2610 |
NS_LOG_INFO ("decode payload successfully (rxPowerDbm " << WToDbm (event->GetRxPowerW ()) << ")"); |
| 2498 |
} |
2611 |
} |
| 2499 |
else |
2612 |
else |
| 2500 |
{ |
2613 |
{ |
|
|
| 3311 |
WifiPhy::IsValidTxVector (WifiTxVector txVector) |
3424 |
WifiPhy::IsValidTxVector (WifiTxVector txVector) |
| 3312 |
{ |
3425 |
{ |
| 3313 |
uint8_t chWidth = txVector.GetChannelWidth (); |
3426 |
uint8_t chWidth = txVector.GetChannelWidth (); |
| 3314 |
uint8_t nss = txVector.GetNss(); |
3427 |
uint8_t nss = txVector.GetNss (); |
| 3315 |
std::string modeName = txVector.GetMode ().GetUniqueName (); |
3428 |
std::string modeName = txVector.GetMode ().GetUniqueName (); |
| 3316 |
|
3429 |
|
| 3317 |
if (chWidth == 20) |
3430 |
if (chWidth == 20) |