// SOCK_RAW
1.1 static struct inet_protosw inetsw_array[] =
{
...
{
.type = SOCK_RAW,
.protocol = IPPROTO_IP, /* 通配符 */
.prot = &raw_prot, /* Networking protocol blocks attached to sockets */
.ops = &inet_sockraw_ops,
.no_check = UDP_CSUM_DEFAULT,
.flags = INET_PROTOSW_REUSE,
}
...
}
// struct socket->ops字段
// 向上的数据结构
2.1 static const struct proto_ops inet_sockraw_ops = {
.family = PF_INET,
.owner = THIS_MODULE,
.release = inet_release,
.bind = inet_bind,
.connect = inet_dgram_connect,
.socketpair = sock_no_socketpair,
.accept = sock_no_accept,
.getname = inet_getname,
.poll = datagram_poll,
.ioctl = inet_ioctl,
.listen = sock_no_listen,
.shutdown = inet_shutdown,
.setsockopt = sock_common_setsockopt,
.getsockopt = sock_common_getsockopt,
.sendmsg = inet_sendmsg,
.recvmsg = inet_recvmsg,
.mmap = sock_no_mmap,
.sendpage = inet_sendpage,
};
// sock绑定地址
// inet_sock->inet_rcv_saddr - Bound local ipv4 addr
// inet_sock->inet_num - Local port
// 步骤:
// 1.安全性检查
// 1.1 地址长度是否足够
// 1.2 地址类型是否正确
// 1.3 端口是否已经被占用
// 2.设置inet_sock结构的源地址和源端口
3.1 int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
{
//inet使用sockaddr_in
struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
struct sock *sk = sock->sk;
//inet使用inet_sock
struct inet_sock *inet = ine
网络子系统80_inet协议族-SOCK_RAW(一)
最新推荐文章于 2020-08-26 12:31:15 发布