ccp与内核交互

在这里插入图片描述在这里插入图片描述
ccp和内核交互方式和cubic bbr一样

1.把自身加入到内核拥塞算法中

return tcp_register_congestion_control(&tcp_ccp_congestion_ops);

2.使用sock的icsk_ca_priv储存并且标识每个sock的数据

icsk_ca_priv是每个sock的私有数据
大小如下

#linux/include/net/inet_connection_sock.h
struct inet_connection_sock {
...
u64			  icsk_ca_priv[104 / sizeof(u64)];
}

inet_csk_ca(sk)返回void *指向icsk_ca_priv
ccp用icsk_ca_priv来存储struct cpp

https://blog.csdn.net/qq_42804416/article/details/88671823
struct cpp{
...
	struct ccp_connection *dp
}
struct ccp_connection{
...
	void *state;
	struct ccp_primitives prims;
}
//tcp_register_congestion_control(&tcp_ccp_congestion_ops);
//后所有tcp都通过tcp_ccp_init(struct sock *sk)初始化
struct tcp_sock *tp = tcp_sk(sk);
struct ccp_datapath_info dp = {
    .init_cwnd = tp->snd_cwnd * tp->mss_cache,
    .mss = tp->mss_cache,
    .src_ip = tp->inet_conn.icsk_inet.inet_rcv_saddr,
    .src_port = tp->inet_conn.icsk_inet.inet_num,
    .dst_ip = tp->inet_conn.icsk_inet.inet_saddr,
    .dst_port = tp->inet_conn.icsk_inet.inet_dport,
    .congAlg = "reno",
};
cpl = inet_csk_ca(sk);
cpl->dp = ccp_connection_start((void *) sk, &dp);
//ccp_connection_start完成后
//sock的icsk_ca_priv(sk)->dp指向的struct ccp_connection包含了这一条tcp sock的详细属性

cpl->dp->conn->impl = impl;//impl就是tcp sock
cpl->dp->conn->index = sid + 1;//分配一个sid作为conn->index用于唯一标识一条tcp sock链接

send_conn_create(datapath, conn){
	msg_size = write_create_msg(msg, REPORT_MSG_SIZE, conn->index, cr);
	ok = datapath->send_msg(datapath, conn, msg, msg_size);
//每条tcp sock的创建都必须通过netlink告知用户态程序
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值