Our application sends small 470B data packets, for which we would like to disable WiFi retransmissions. The right place to consider this seems to be the WifiRemoteStationManager, which has two retransmission counters:
1) MaxSsrc, which is used for all packets whose size is <= RtsCtsTreshold
2) MaxSlrc, which is used for all packets whose size is > RtsCtsTreshold
so we set the RtsCtsThreshold to 469B, which leads to all our packets being >threshold, hence the MaxSlrc value is used, which we set to zero. And RTX are off, nice! However, we don't really wish to enable RTS/CTS for our packets, either.
If we leave the threshold untouched (its default is at 65535), but set the MaxSsrc=0, then all control packets such as association requests are also not retransmitted, which leads to everything breaking. Also, besides our data packets, we have custom control packets as well, which are likewise very small (~100B), and these should also be retransmitted.
We've also tried tinkering with the bool
WifiRemoteStationManager::NeedRetransmission(Ptr<const WifiMpdu> mpdu) function itself. Ideally we want to selectively react to only our data packets and not retransmit those. However, we couldn't find any way to do this, because packets are often aggregated. Therefore we cannot filter by size (as sizes change when data is aggregated). And we cannot filter by header, because if one of our control packets is aggregated into an A-MPDU, then the header is identical to a data packet header (QOS_DATA).
Questions:
How could we selectively retransmit everything but our data packets?
How could we prevent our custom control packets from being aggregated together with data packets?