内核态到用户态的通信之netlink(二)

本文介绍了内核态与用户态通信的一种方式——netlink,概述了netlink的基本概念,并通过实际问题展示了如何在无线驱动中使用netlink发送状态消息到用户态程序,以及用户态如何接收这些事件消息。
摘要由CSDN通过智能技术生成

内核态到用户态通信

(一) netlink简介

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


(二) netlink使用

下面首先通过一个实际问题来说明netlink的使用方法

1、要解决的问题

  • 环境
    硬件:路由器, 操作系统:openwrt,芯片:mt7628
  • 问题
    解决无线驱动接口的状态消息发送到用户态程序

2、无线驱动中使用netlink
在加入该代码的文件必须包含内核部分封装netlink的源文件

/* 封装netlink在内核态发送消息到用户态的代码 */


enum {
    ACTION_DOWN = 0,    /* 初始默认APCLI状态为down */
    ACTION_UP
};
/* 在下述apcli_status.h文件中实现 */
extern int send_netlink_data(char *data, u_int data_len);

static VOID ApCliCtrlSendNetlinkMsg(
    IN PRTMP_ADAPTER pAd,
    IN USHORT ifIndex,
    IN ULONG action)
{
    NlAPCliStatusMsg nlData;
    memset(&nlData, 0, sizeof(nlData));
    nlData.msg_type = action;
    nlData.band_type = WIRELESS_BAND_2G;
    nlData.ssid_len = pAd->ApCfg.ApCliTab[ifIndex].SsidLen;
    memcpy(nlData.ssid, pAd->ApCfg.ApCliTab[ifIndex].Ssid, MAX_LEN_OF_SSID);
    send_netlink_data((char *)&nlData, sizeof(nlData));
    DBGPRINT(RT_DEBUG_TRACE, ("(%s) 2.4G %s, send netlink msg.\n", __FUNCTION__, action == ACTION_DOWN? "down" : "up"));
}

在相应的地方调用上述函数发送消息

ApCliCtrlSendNetlinkMsg(pAd, ifIndex, ACTION_UP);

3、内核封装netlink
无线驱动使用netlink时,需要包含如下两个文件

/*************************************************************************
File name: apcli_status.c
Description:
The module supports reporting status to application layer
*************************************************************************/

#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <net/sock.h>
#include <net/netlink.h>
#include <linux/apcli_status.h>

#define DEBUG_APCLI_STATUS  0
#if DEBUG_APCLI_STATUS
#define DEBUG_PRINT(fmt ,args...)   printk("[%s |%d]" fmt, __func__, __LINE__, ##args)
#else
#define DEBUG_PRINT(fmt, argx...)
#endif

static int pid = 0;
static struct sock *nl_sk = NULL;

static DEFINE_MUTEX(apcli_status_mutex);

int send_netlink_data(char *data, u_int data_len)
{
    struct sk_buff *skb;
    struct nlmsghdr *nlh;
    int ret = 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值