为了发送一条netlink消息到内核或者其他的用户空间进程,另外一个struct sockaddr_nl nladdr需要作为目的地址,这和使用sendmsg()发送一个UDP包是一样的。 如果该消息是发送至内核的,那么nl_pid和nl_groups都置为0. 如果消息是发送给另一个进程的单播消息,nl_pid是另外一个进程的pid值而nl_groups为零。 如果消息...
netlink的通信地址,跟struct sockaddr_in 类似 (struct sockaddr_in 跟struct addr 兼容) nl_family:始终为AF_NETLINK nl_pad:总是为0 nl_pid:单播地址。对于内核netlink套接字,该值为0。 用户空间:当前进程id nl_groups:组播组,或组播组掩码。为0表示不加入任何多播组,最多支持32个多播组 若用户空间...
最后,检查nl_table[unit].registered是否为false。如果是,则将nl_table[unit].groups设置为之前计算的groups值。//将Netlink表项的监听者列表设置为新分配的listeners,允许一个Netlink套接字同时发送消息给多个接收者rcu_assign_pointer(nl_table[unit].listeners, listeners);//使用RCU机制为cb_mutex分配互斥锁...
bind(fd, (struct sockaddr*)&, nladdr, sizeof(nladdr)); 3.发送netlink消息 为了发送一条netlink消息到内核或者其他的用户空间进程,另外一个struct sockaddr_nl nladdr需要作为目的地址,这和使用 sendmsg()发送一个UDP包是一样的。 如果该消息是发送至内核的,那么nl_pid和nl_groups都置为0. 如果消息是发...
也就是说,在用户空间的代码里,如果我们要加入到多播组1,需要设置nl_groups设置为1;多播组2的掩码为2;多播组3的掩码为4,依次类推。为0表示我们不希望加入任何多播组。理解这一点很重要。所以我们可以在用户空间也定义一个类似于netlink_group_mask()的功能函数,完成从多播组号到多播组掩码的转换。最终用户空间...
/* port ID */ __u32 nl_groups; /* multicast groups mask */};参数说明:nl_famile : nl_family,固定为AF_NETLINK,表示netlink协议族nl_pad :nl_pad通常设置为0nl_pid :socket的唯一标识符;发送内核空间来说该字段是0,用户空间的通常使用其线程组PID;netlink并没有要求该字...
nl_groups:多播组掩码,每个bit表示一个多播组;每个netlink协议族最多支持32个多播组 其中netlink协议簇包含多个协议,内核中规定最大值是32。理论上是32以内没有被占用的协议号用户都可以用于自定义netlink。下面是内核中规定netlink协议簇的内容 file: include/uapi/linux/netlink.h ...
5. __u32 nl_groups; 6. }; 1. 2. 3. 4. 5. 6. 字段nl_family 必须设置为 AF_NETLINK 或着 PF_NETLINK,字段 nl_pad 当前没有使用,因此要总是设置为 0,字段 nl_pid 为接收或发送消息的进程的 ID,如果希望内核处理消息或多播消息,就把该字段设置为 0,否则设置为处理消息的进程 ID。字段 nl_...
2. sockaddr_nl结构:为Netlink的地址,类似socket编程中的sockaddr_in,包含nl_pid和nl_groups两个重要字段。nl_pid用于唯一标识Netlink通道,nl_groups用于加入多播组。3. nlmsghdr结构:Netlink消息头,包含消息的长度、类型和附加说明信息。nlmsg_len表示整个消息的长度;nlmsg_type表示消息类型,如NLMSG...
nl_family 制定了协议族,netlink 有自己独立的值:AF_NETLINK,nl_pid 一般取为进程 pid。nl_groups 用以多播,当不需要多播时,该字段为 0。 nlmsghdr 消息体 netlink 消息是作为套接字缓冲区 sk_buff 的数据部分传递的,其消息本身又分为头部和数据。头部为: ...