MPTCP skb路径

发送

tcp_sendmsg 将 skb 写入 meta_sk 的 sk_write_queue 然后复制一份skb,将 clone_skb 写入subsk的sk_write_queue。

相同的[seq, endseq]会同时存在meta_sk->sk_write_queue, meta_sk->reinject_queue, subsk->sk_write_queue

meta_sk->reinject_queue 跟 meta_sk->sk_write_queue 差不多,目前的pm中reinject_queue的发送优先级高于sk_write_queue。

reinject_queue 中skb的来源有:

  1. 重传时调mptcp_reinject_data将skb放到meta_sk的reinject_queue,也就是一个subsk重传skb,可以放到另一个subsk

  2. subsk 调 tcp_write_queue_purge 时可能这些skb还是要发出去的,所以把skb放到meta_sk的reinject_queue

  3. mptcp_sub_retransmit_timer, mptcp_del_sock, mptcp_send_reset_rem_id 等

	mptcp_write_wakeup
		reinject = 0
	mptcp_write_xmit
		if (skb from reinject_queue)
			reinject = 1
		else
			reinject = 0
	mptcp_retransmit_skb
		reinject = -1

		-> mptcp_skb_entail(, skb, reinject)
			-> mptcp_save_dss_data_seq 设置seq
			-> tcp_add_write_queue_tail 或 tcp_transmit_skb


	mptcp_sub_retransmit_timer
	mptcp_del_sock
	mptcp_send_reset_rem_id
	tcp_write_queue_purge
		-> mptcp_reinject_data
			-> skb_queue_tail(meta_sk->reinject_queue, skb)

接收

	mptcp_data_ready
		-> mptcp_queue_skb
			-> tcp_queue_rcv(meta_sk, tmp1, 0, &fragstolen)
			-> tcp_data_queue_ofo(meta_sk, tmp1);

	tcp_validate_incoming
		-> mptcp_handle_options
			-> mptcp_process_data_ack
				-> mptcp_clean_rtx_queue
					-> 清理 meta_sk->sk_write_queue
					-> 清理 mpcb->reinject_queue
	tcp_ack
		-> tcp_clean_rtx_queue
			-> 清理 subsk->sk_write_queue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值