接下来,我们使用sock_init_data()函数来初始化sock对象。这个函数将sock对象与之前分配的内存空间相关联,并设置一些基本的数据结构。在初始化完成后,我们需要将netlink_ops与sock对象进行关联。netlink_ops是一个结构体,其中定义了Netlink socket在不同情况下的操作,如绑定、连接、释放等。通过将这些操作与sock对...
第一个参数必须是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它们俩实际为一个东西,它表示要使用netlink,第二个参数必须是SOCK_RAW或SOCK_DGRAM, 第三个参数指定netlink协议类型,如前面讲的用户自定义协议类型NETLINK_MYTEST, NETLINK_GENERIC是一个通用的协议类型,它是专门为用户使用的,因此,用户可以直接使用它...
由于struct sock 结构体位于netlink_sock结构体成员的最前端,所以在分配完struct sock后可以直接找到netlink_sock首地址(struct sock结构体地址与netlink_sock结构体首地址一样),之后对netlink_sock进行初始化,如下在netlinkl_cteate中的实现源码,其中nlk_sk函数获取到netlink_sock的首地址,也就是struct sock的首地址。
*/#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */#define NETLINK_SOCK_DIAG 4 /* socket monitoring */#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */#define ...
内核还有一个get_info接口可以获得很多数据,但是sock_diag没有对外提供,其实完全可以对外提供的,就可以获得tcp最详细的数据。也就是说现在inet_diag和tcp_diag都支持获得tcp_info,只是sock_diag没有对外提供。而tcp通过getsockopt对外提供了获得tcp_info结构体的能力。
DIAG NETLINK_SOCK_DIAG#defineMAX_LINKS 32 netlink如下些常用宏: #defineNLMSG_ALIGNTO 4U#defineNLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )---用于得到不小于len且字节对齐的最小数值#defineNLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))---netlink头部长度#...
25. 31 #define NETLINK_INET_DIAG NETLINK_SOCK_DIAG 26. 32 27. 33 #define MAX_LINKS 32 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 图14.1 netlink消息格式 ...
按照netlink的手册,socket_type可以取SOCK_RAW和SOCK_DGRAM,不过内核不区分这两个字段。netlink_family字段指定了我们期望的通讯协议,主要有: NETLINK_ROUTE 用来获取,创建和修改设备的各种信息,详细参见 rtnetlink(7) NETLINK_SKIP Enskip 的保留选项 NETLINK_USERSOCK ...
#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ #define NETLINK_SOCK_DIAG 4 /* socket monitoring */ #define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ #define NETLINK_XFRM 6 /* ipsec */ #define NETLINK_SELINUX 7 /* SELinux event notifications */ #define NET...
int(*create)(structnet *net,structsocket *sock,intprotocol); structmodule*owner; }; net_families 是 net_proto_family 类型的数据,此时 net_families[PF_NETLINK]->create == netlink_create ,到此也就完成了模块初始化过程。 系统调用 socket 时会调用 net_families 中的 netlink_create : ...