前情提要:
在之前的buffer float 實驗中,了解到Linux kernel 利用 TCP Small Queue(TSQ) 機制,限制單TCP steam 在本機 TX queue (NIC ring buffer + QDisc queue) 注入的Packet 數量。
因此需要修改kernel code bypass TSQ 檢查機制,製造local tx queue buffer float 的可能性。
Temp load修改方案:
tcp_output.c
function: tcp_write_xmit:
if (skb->len > limit &&
unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
break;
//if (tcp_small_queue_check(sk, skb, 0))
// break;
/* Argh, we hit an empty skb(), presumably a thread
* is sleeping in sendmsg()/sk_stream_wait_memory().
* We do not want to send a pure-ack packet and have
* a strange looking rtx queue with empty packet(s).
*/
if (TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq)
break;
function:
tcp_xmit_retransmit_queue:
if (sacked & (TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS))
continue;
//if (tcp_small_queue_check(sk, skb, 1))
// break;
if (tcp_retransmit_skb(sk, skb, segs))
break;
註解掉以上兩處TSQ check and break 判斷式,bypass TSQ 檢查機制。
預期TCP stack 就能無限制注入packet 到 local tx queue 了。