当前位置:首页 > Web开发 > 正文

umsg ) ; memset ( u_info

2024-03-31 Web开发

标签:

linux下netlink的使用简介 一、什么是netlink

Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用措施与内核通信的最常用的接口。

在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如

路由 daemon(NETLINK_ROUTE)

用户态 socket 协议(NETLINK_USERSOCK)

防火墙(NETLINK_FIREWALL)

netfilter 子系统(NETLINK_NETFILTER)

内核事件向用户态通知(NETLINK_KOBJECT_UEVENT)

通用netlink(NETLINK_GENERIC)

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方法,用户态应用使用标准的 socket API 就可以使用 netlink 供给的强大成果,内核态需要使用专门的内核 API 来使用 netlink。

一般来说用户空间和内核空间的通信方法有三种:/proc、ioctl、Netlink。而前两种都是单向的,而Netlink可以实现双工通信。

Netlink 相对付系统挪用,ioctl 以及 /proc文件系统而言,具有以下长处:

netlink使用简单,只需要在include/linux/netlink.h中增加一个新类型的 netlink 协议界说即可,(如 #define NETLINK_TEST 20 然后,内核和用户态应用就可以当即通过 socket API 使用该 netlink 协议类型进行数据交换)

netlink是一种异步通信机制,在内核与用户态应用之间通报的动静生存在socket缓存行列队伍中,发送动静只是把动静生存在接收者的socket的接收行列队伍,而不需要期待接收者收到动静

使用 netlink 的内核部分可以给与模块的方法实现,使用 netlink 的应用部分和内核部分没有编译时依赖

netlink 撑持多播,内核模块或应用可以把动静多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收到该动静,内核事件向用户态的通知机制就使用了这一特性

内核可以使用 netlink 首先倡议会话

Netlink协议基于BSD socket和AF_NETLINK地点簇,使用32位的端标语寻址,每个Netlink协议凡是与一个或一组内查处事/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。

二、用户态数据布局

用户态应用使用标准的 socket API有sendto(),recvfrom(), sendmsg(), recvmsg()。

Netlink通信跟常用UDP Socket通信类似,struct sockaddr_nl是netlink通信地点,跟普通socket struct sockaddr_in类似。

1. struct sockaddr_nl布局:

struct sockaddr_nl { __kernel_sa_family_t nl_family; /* AF_NETLINK (跟AF_INET对应)*/ unsigned short nl_pad; /* zero */ __u32 nl_pid; /* port ID (通信端标语)*/ __u32 nl_groups; /* multicast groups mask */ };

2. struct nlmsghd 布局:

/* struct nlmsghd 是netlink动静头*/ struct nlmsghdr { __u32 nlmsg_len; /* Length of message including header */ __u16 nlmsg_type; /* Message content */ __u16 nlmsg_flags; /* Additional flags */ __u32 nlmsg_seq; /* Sequence number */ __u32 nlmsg_pid; /* Sending process port ID */ };

nlmsg_type:动静状态,内核在include/uapi/linux/netlink.h中界说了以下4种通用的动静类型,它们分袂是:

#define NLMSG_NOOP 0x1 /* Nothing. */ #define NLMSG_ERROR 0x2 /* Error */ #define NLMSG_DONE 0x3 /* End of a dump */ #define NLMSG_OVERRUN 0x4 /* Data lost */ #define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */

nlmsg_flags:动静符号,它们用以暗示动静的类型,如下

/* Flags values */ #define NLM_F_REQUEST 1 /* It is request message. */ #define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */ #define NLM_F_ACK 4 /* Reply with ack, with zero or error code */ #define NLM_F_ECHO 8 /* Echo this request */ #define NLM_F_DUMP_INTR 16 /* Dump was inconsistent due to sequence change */ /* Modifiers to GET request */ #define NLM_F_ROOT 0x100 /* specify tree root */ #define NLM_F_MATCH 0x200 /* return all matching */ #define NLM_F_ATOMIC 0x400 /* atomic GET */ #define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) /* Modifiers to NEW request */ #define NLM_F_REPLACE 0x100 /* Override existing */ #define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ #define NLM_F_CREATE 0x400 /* Create, if it does not exist */ #define NLM_F_APPEND 0x800 /* Add to end of list */

3. struct msghdr 布局体

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30261.html