

MPTCP DSS && MPTCPHDR_INF
source link: http://abcdxyzk.github.io/blog/2020/07/19/kernel-mptcp-dss/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MPTCP DSS && MPTCPHDR_INF
2020-07-19 23:33:00
dss=Data Sequence Signal
用于将子流的seq映射到主流上。
三次握手后 maskter_sk = meta_sk, 然后 meta_sk 会重新分配seq, snd_nxt, rcv_nxt, write_seq, copied_seq 等。
master_sk, subflow 的seq和 meta_sk 建立联系
output
mptcp_save_dss_data_seq {
mptcp_write_dss_data_ack
mptcp_write_dss_mapping
}
先写ACK映射,再写DATA映射。
static int mptcp_write_dss_data_ack(const struct tcp_sock *tp, const struct sk_buff *skb,
__be32 *ptr)
{
struct mp_dss *mdss = (struct mp_dss *)ptr;
__be32 *start = ptr;
mdss->kind = TCPOPT_MPTCP;
mdss->sub = MPTCP_SUB_DSS;
mdss->rsv1 = 0;
mdss->rsv2 = 0;
mdss->F = mptcp_is_data_fin(skb) ? 1 : 0;
mdss->m = 0;
mdss->M = mptcp_is_data_seq(skb) ? 1 : 0;
mdss->a = 0;
mdss->A = 1;
mdss->len = mptcp_sub_len_dss(mdss, tp->mpcb->dss_csum);
ptr++;
*ptr++ = htonl(mptcp_meta_tp(tp)->rcv_nxt);
return ptr - start;
}
static int mptcp_write_dss_mapping(const struct tcp_sock *tp, const struct sk_buff *skb,
__be32 *ptr)
{
const struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
__be32 *start = ptr;
__u16 data_len;
*ptr++ = htonl(tcb->seq); /* data_seq */
/* If it's a non-data DATA_FIN, we set subseq to 0 (draft v7) */
if (mptcp_is_data_fin(skb) && skb->len == 0)
*ptr++ = 0; /* subseq */
else
*ptr++ = htonl(tp->write_seq - tp->mptcp->snt_isn); /* subseq */
if (tcb->mptcp_flags & MPTCPHDR_INF)
data_len = 0;
else
data_len = tcb->end_seq - tcb->seq;
if (tp->mpcb->dss_csum && data_len) {
__sum16 *p16 = (__sum16 *)ptr;
__be32 hdseq = mptcp_get_highorder_sndbits(skb, tp->mpcb);
__wsum csum;
*ptr = htonl(((data_len) << 16) |
(TCPOPT_EOL << 8) |
(TCPOPT_EOL));
csum = csum_partial(ptr - 2, 12, skb->csum);
p16++;
*p16++ = csum_fold(csum_partial(&hdseq, sizeof(hdseq), csum));
} else {
*ptr++ = htonl(((data_len) << 16) |
(TCPOPT_NOP << 8) |
(TCPOPT_NOP));
}
return ptr - start;
}
input
- 收到的包有可能被中间设备分成多个包,或由于gso、tso、gro造成收发包大小不一一对应。所以在接收端能看到很多 skb_queue_walk_safe(&sk->sk_receive_queue, skb, tmp)
映射处理顺序: mptcp_data_ready -> mptcp_prevalidate_skb, mptcp_detect_mapping, mptcp_validate_mapping
mptcp_detect_mapping
发送一个包可能对应多个接收包,在接收第一个包的时候设置好
tp->mptcp->map_data_len = data_len;
tp->mptcp->map_subseq = sub_seq;
tp->mptcp->map_data_fin = mptcp_is_data_fin(skb) ? 1 : 0;
tp->mptcp->mapping_present = 1;
mptcp_queue_skb
处理完一个或多个接收包(=一个发送包)后调mptcp_reset_mapping,重置 map_data_len,map_data_seq,map_subseq,map_data_fin,mapping_present。
MPTCPHDR_INF 模式
MPTCPHDR_INF 模式是取消子流seq,退避回普通tcp,通通让meta_sk处理。
infinite 模式正常不开启的
dss_csum != 0 并且没有established连接,见 mptcp_verif_dss_csum()
进入 mptcp_mp_fail_rcvd()
接收到数据时还没established,进入INF模式。见 mptcp_prevalidate_skb()
send_infinite_mapping = 1 发送端出错进入inf模式,需要发送数据通知接收端
infinite_mapping_snd = 1 发送端进入INF模式
infinite_mapping_rcv = 1 接收端进入INF模式, 接收seq映射改用 infinite_rcv_seq
mptcp_detect_mapping()
{
if (!data_len) {
...
set_infinite_rcv = true;
...
}
...
if (set_infinite_rcv)
mpcb->infinite_rcv_seq = tp->mptcp->map_data_seq;
}
Posted by kk
Recommend
-
77
Contribute to inf-ruby development by creating an account on GitHub.
-
13
Tomcat访问webapp下的WEB-INF文件中的html和jsp文件重定向问题servlet中创建的webapp项目下的WEB-INF文件用来存放web.xml, class文件, jar包,当前项目的核心配置文件等。...
-
8
MPTCP pre_established fully_established 2020-07-19 01:37:00 一、pre_established 只在subflow的客户端起作用,在收到synack时置为1,收到第4个ack时置为0,防止在synack到第四个ack期间发送数据包...
-
4
MPTCP 回复一样的option 2020-07-09 01:39:00 对方回复一模一样的option curl ksurl.cn 01:42:57.092471 IP 192.168.8.162.34366 > 103.102.200.3.80: Flags [S], seq 846976...
-
6
company-mode completion back-end for inf-ruby buffers. NOTE: Now that inf-ruby 2.4.0 supports completion-at-point, this backend is deprecated. Y...
-
12
shan-shui-inf是一款有趣的开源程序,可以无限生成中国山水画。全部基于Javascript编写,遵守MIT开源协议。使用了噪音和数学函数从头开始建模山峰和树木,并输出可缩放矢量图形(SVG)格式。
-
13
2022年3月8日星期二 数学公式里 sup, inf 的含义 sup 的定义:最小的上界inf 的定义 :最大的下界 没有评论:
-
5
V2EX › Linux Ubuntu 22.04 自带 mptcp 了,有什么好的应用方法吗? seakingii · 13 小时 38...
-
7
README.md Inferno® is a distributed operat...
-
5
MPTCP: 一个在 Go 1.21中的被忽略的新特性 Go 1.21 再有两三个月就发布了,很多同学都已经总结了Go 1.21的新特性了,为新的Go版本的到来造势,但是...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK