首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >netlink是否使用“广播”传递消息?

netlink是否使用“广播”传递消息?
EN

Stack Overflow用户
提问于 2015-06-18 03:06:10
回答 1查看 523关注 0票数 0

我正在this question and answer上学习netlink的例子。

但是,我在源代码中没有看到一种connection identifier。可以这样说:

内核

代码语言:javascript
复制
my_nl_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0,
                 my_nl_rcv_msg, NULL, THIS_MODULE);

用户空间

代码语言:javascript
复制
nls = nl_socket_alloc();
ret = nl_connect(nls, NETLINK_USERSOCK);
ret = nl_send_simple(nls, MY_MSG_TYPE, 0, msg, sizeof(msg));

NETLINK_USERSOCKMY_MSG_TYPE似乎不是connection identifier

在这种情况下,netlink如何知道哪些数据来自哪个用户空间应用程序或内核模块,以及数据应该来自哪个用户空间应用程序或内核模块?

在我看来,netlink从用户空间应用程序或内核模块接收数据并进行广播。每个连接到netlink的应用程序或模块都会检查消息类型,如果数据被指定为“me”。

我想得对吗?

EN

回答 1

Stack Overflow用户

发布于 2015-06-18 14:51:21

首先,我建议阅读一些文档,例如howto

要进行通信,您必须使用支持的操作注册一个家庭。它可以通过以下功能来完成

代码语言:javascript
复制
int genl_register_family( struct genl_family *family)   
int genl_register_ops( struct genl_family * family, struct genl_ops *ops)

家庭定义的一个例子:

代码语言:javascript
复制
/* 
 *  Attributes (variables): the index in this enum is used as a reference for the type,
 *  userspace application has to indicate the corresponding type
 */
enum {
    CTRL_ATT_R_UNSPEC = 0,
    CTRL_ATT_CNT_SESSIONS,
    __CTRL_ATT_R_MAX
};

#define CTRL_ATT_R_MAX ( __CTRL_ATT_R_MAX - 1 )

#define CTRL_FAMILY "your-family"
#define CTRL_PROTO_VERSION 1

/* Family definition */
static struct genl_family ctrl_bin_gnl_family = {
    .id = GENL_ID_GENERATE,         // genetlink should generate an id
    .hdrsize = 0,
    .name = CTRL_FAMILY,            // the name of this family, used by userspace application
    .version = CTRL_PROTO_VERSION,  // version number  
    .maxattr = CTRL_ATT_R_MAX,      // max number of attr 
};

操作定义的示例:

代码语言:javascript
复制
struct genl_ops ctrl_info = {
    .cmd = CTRL_CMD_INFO,
    .flags = 0,
    .policy = 0,      // you can use policy if you need 
    .doit = 0,        // set this callback if this op does some interval stuff 
    .dumpit = __info, // set this callback if this op dump data
};

之后,你可以在你的用户空间应用程序,你的家庭和操作沟通。连接:

代码语言:javascript
复制
struct nl_sock * _nl = nl_socket_alloc();

int ret = genl_connect(nl);
// test if fail

int gid = genl_ctrl_resolve( nl, CTRL_FAMILY );
// test if fail

发送信息操作

代码语言:javascript
复制
struct nl_msg * msg = msg_alloc( 
    CTRL_CMD_INFO,
    NLM_F_DUMP 
);

int ret = nl_send_auto(_nl, msg );
// test if fail
// wait for the ack
// read a reply 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30905830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档