Android P Netlink--communication between kernel and user space

迷南。 2022-02-13 15:47 256阅读 0赞

Android P系统内核与用户进程通信–Netlink

以下代码,都是以android p系统里的代码作为demo说明。

本文只讲一个大概的流程,只分析通信的一个过程,不深入解析具体的数据结构和传递的参数。

用户进程使用 netlink

用户态使用标准的socket APIs,其包含的接口有:socket() , bind() , sendmsg() , recvmsg() , close() ,sendto(),recvfrom()等。

使用步骤:

1、使用接口:socket(),创建一个 netlink socket

  1. mSockFd = socket(AF_NETLINK, SOCK_RAW, PROTOCOL_ID);

2、使用接口:bind(),用于将打开的socket地址(用户socket)与netlink源socket(内核socket)绑定在一起

  1. retVal = bind(mSockFd, (struct sockaddr *)&servAddr, sizeof(servAddr));

3、使用接口:sendto(),发送消息,或者sendmsg()

  1. ret = sendto(mSockFd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *)&daddr, sizeof(struct sockaddr_nl));

4、使用接口:recvfrom(),接收消息,或者recvmsg()

  1. ret = recvfrom(mSockFd, &u_info, sizeof(u_info), 0, (struct sockaddr *)&nl_socket, &nl_socket_len);

5、使用接口:close(),用于关闭打开的netlink socket。

  1. close(mSockFd);

内核使用netlink

内核的接口有:netlink_kernel_create(),netlink_unicast(),netlink_broadcast(),sock_release()等。

使用步骤:

1、使用接口:netlink_kernel_create(),创建一个 netlink socket,并且注册接收消息的函数netlink_rcv_msg()

  1. static void create_netlink_vehicle(void)
  2. {
  3. struct netlink_kernel_cfg cfg = {
  4. .input = netlink_rcv_msg, //注册回调,用于接收消息
  5. };
  6. //创建netlink socket
  7. nlsk = netlink_kernel_create(&init_net, PROTOCOL_ID, &cfg);
  8. if(nlsk == NULL) {
  9. pr_err("netlink_kernel_create error !\n");
  10. return;
  11. }
  12. }

2、使用接口:netlink_unicast(),发送单播消息;或者使用netlink_broadcast()发送多播消息

  1. ret = netlink_unicast(nlsk, nl_skb, user_pid, MSG_DONTWAIT);

3、在步骤1中注册的回调:netlink_rcv_msg(),接收消息

4、使用接口:sock_release(),放函数netlink_kernel_create()创建的netlink socket

  1. sock_release(nlsk);

参考文章:
1.https://www.cnblogs.com/iceocean/articles/1594195.html

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读