// struct sock->sk_prot字段
// struct proto为插口层到传输层的接口
4.1 struct proto raw_prot = {
.name = "RAW",
.owner = THIS_MODULE,
.close = raw_close,
.destroy = raw_destroy,
.connect = ip4_datagram_connect,
.disconnect = udp_disconnect,
.ioctl = raw_ioctl,
.init = raw_init,
.setsockopt = raw_setsockopt,
.getsockopt = raw_getsockopt,
.sendmsg = raw_sendmsg,
.recvmsg = raw_recvmsg,
.bind = raw_bind,
.backlog_rcv = raw_rcv_skb,
.release_cb = ip4_datagram_release_cb,
.hash = raw_hash_sk,
.unhash = raw_unhash_sk,
.obj_size = sizeof(struct raw_sock),
.h.raw_hash = &raw_v4_hashinfo,
};
// raw sock绑定地址到socket
4.1 static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
{
struct inet_sock *inet = inet_sk(sk);
struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
int ret = -EINVAL;
int chk_addr_ret;
//sk->sk_state!=TCP_CLOSE说明连接已经建立
if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_in))
goto out;
//检查绑定的地址类型是否合法
chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
ret = -EADDRNOTAVAIL;
//合法的绑定地址类型:本地地址,多播地址,广播地址
if (addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL &&
chk_addr_
网络子系统81_inet协议族-SOCK_RAW(二)
最新推荐文章于 2023-03-01 16:17:09 发布
本文详细介绍了Linux内核中SOCK_RAW协议的实现,包括其初始化、绑定、连接、发送和接收数据的过程。具体涉及raw_prot结构、raw_bind函数、ip4_datagram_connect函数、raw_sendmsg函数、raw_recvmsg函数以及数据包的接收流程。这些函数和流程在处理原始套接字时起着关键作用,涉及路由查找、连接状态管理和数据拷贝等核心操作。
摘要由CSDN通过智能技术生成