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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值