Android P Netlink--communication between kernel and user space
Android P系统内核与用户进程通信–Netlink
以下代码,都是以android p系统里的代码作为demo说明。
本文只讲一个大概的流程,只分析通信的一个过程,不深入解析具体的数据结构和传递的参数。
用户进程使用 netlink
用户态使用标准的socket APIs,其包含的接口有:socket() , bind() , sendmsg() , recvmsg() , close() ,sendto(),recvfrom()等。
使用步骤:
1、使用接口:socket(),创建一个 netlink socket
mSockFd = socket(AF_NETLINK, SOCK_RAW, PROTOCOL_ID);
2、使用接口:bind(),用于将打开的socket地址(用户socket)与netlink源socket(内核socket)绑定在一起
retVal = bind(mSockFd, (struct sockaddr *)&servAddr, sizeof(servAddr));
3、使用接口:sendto(),发送消息,或者sendmsg()
ret = sendto(mSockFd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *)&daddr, sizeof(struct sockaddr_nl));
4、使用接口:recvfrom(),接收消息,或者recvmsg()
ret = recvfrom(mSockFd, &u_info, sizeof(u_info), 0, (struct sockaddr *)&nl_socket, &nl_socket_len);
5、使用接口:close(),用于关闭打开的netlink socket。
close(mSockFd);
内核使用netlink
内核的接口有:netlink_kernel_create(),netlink_unicast(),netlink_broadcast(),sock_release()等。
使用步骤:
1、使用接口:netlink_kernel_create(),创建一个 netlink socket,并且注册接收消息的函数netlink_rcv_msg()
static void create_netlink_vehicle(void)
{
struct netlink_kernel_cfg cfg = {
.input = netlink_rcv_msg, //注册回调,用于接收消息
};
//创建netlink socket
nlsk = netlink_kernel_create(&init_net, PROTOCOL_ID, &cfg);
if(nlsk == NULL) {
pr_err("netlink_kernel_create error !\n");
return;
}
}
2、使用接口:netlink_unicast(),发送单播消息;或者使用netlink_broadcast()发送多播消息
ret = netlink_unicast(nlsk, nl_skb, user_pid, MSG_DONTWAIT);
3、在步骤1中注册的回调:netlink_rcv_msg(),接收消息
4、使用接口:sock_release(),放函数netlink_kernel_create()创建的netlink socket
sock_release(nlsk);
参考文章:
1.https://www.cnblogs.com/iceocean/articles/1594195.html
还没有评论,来说两句吧...