首页 理论教育 Linux驱动程序开发实例:Netlink机制

Linux驱动程序开发实例:Netlink机制

时间:2023-10-19 理论教育 版权反馈
【摘要】:Netlink是Linux内核与应用程序之间的一种通信机制,像TCP与UDP等网络协议一样,内核将Netlink作为一种网络协议族来处理。Netlink协议在RFC3549中定义。本节将介绍Linux内核中的Netlink机制。Netlink消息结构由Netlink消息头加数据组成。当内核中发送Netlink消息时,需要设置目标地址与源地址。skb是网络数据结构,其data成员用来存放Netlink消息。本次广播将不发送给端口ID为portid的Netlink socket。group为接收Netlink消息的多播组组号。例13.5 内核Netlink广播发送实例

Linux驱动程序开发实例:Netlink机制

Netlink是Linux内核与应用程序之间的一种通信机制,像TCP与UDP等网络协议一样,内核将Netlink作为一种网络协议族来处理。Netlink协议在RFC3549中定义。在Linux内核中,Netlink使用专门的内核Netlink API,而在应用层调用标准的socket API就可以使用Netlink机制提供的强大功能。Netlink的数据传递单元为Netlink消息。Netlink不仅支持单播,而且支持多播。如果内核模块或应用把Netlink消息发送给一个Netlink组,属于该Netlink组的任何内核模块或应用都能接收到该消息。本节将介绍Linux内核中的Netlink机制。

内核中Netlink socket使用下面的结构描述:

netlink是以协议族形式在内核中注册的。注册过程如下:

在内核模块中,可以使用netlink_kernel_create函数创建一个Netlink socket:

struct sock*netlink_kernel_create(struct net*net,int unit,struct netlink_kernel_cfg*cfg);

参数unit表示Netlink协议类型。内核预定义的协议类型有如下类型:

netlink_kernel_cfg结构定义如下:

上面的input成员函数是Netlink消息处理函数,当有消息到达Netlink socket时,该input函数指针就会被引用,传递给input函数的参数是sk_buff结构。

Netlink消息结构由Netlink消息头加数据组成。Netlink消息头结构是nlmsghdr:

nlmsghdr结构的nlmsg_flags字段用于设置消息标志,可用的标志包括:

内核中网络消息是通过sk_buff结构来管理的,Netlink消息通常放置在sk_buff的data成员中。当内核中发送Netlink消息时,需要设置目标地址与源地址。NETLINK_CB宏用来返回保存在sk_buff的cb成员中的netlink_skb_parms结构,netlink_skb_parms中存放着一些地址信息:(www.xing528.com)

#define NETLINK_CB(skb)(*(struct netlink_skb_parms*)&((skb)->cb))

下面是一个消息地址设置的例子:

NETLINK_CB(skb).portid=0;//消息发送者端口,一般内核设置为0

NETLINK_CB(skb).dst_group=1;//目标组地址。

在内核中可以调用函数netlink_unicast来发送单播消息:

int netlink_unicast(struct sock*ssk,struct sk_buff*skb,u32 portid,int nonblock)

其中ssk是netlink_kernel_create函数返回的Netlink套接字。skb是网络数据结构,其data成员用来存放Netlink消息。portid参数为目的端口,通常为接收消息的进程的ID。nonblock为阻塞标志,如果为MSG_DONTWAIT,表示采用非阻塞方式,此时如果没有接收缓存则立即返回;如果为0,表示阻塞方式,此时如果没有接收缓存则睡眠等待。

内核模块或子系统也可以使用函数netlink_broadcast来发送广播消息:int netlink_broadcast(struct sock*ssk,struct sk_buff*skb,u32 portid,u32 group,gfp_t allocation);

参数ssk、skb与portid的含义与netlink_unicast函数的参数相同。本次广播将不发送给端口ID为portid的Netlink socket。group为接收Netlink消息的多播组组号。allocation为内存分配标志,包括GFP_ATOMIC和GFP_KERNEL等。

例13.5 内核Netlink广播发送实例

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈