1 Star 0 Fork 0

laokz / ohos_memo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
libnl.md 5.37 KB
一键复制 编辑 原始数据 按行查看 历史
laokz 提交于 2022-01-17 17:11 . add libnl doc

nl_cb_type收发信息类型

目的是针对收发信息时出现的不同情况,调用预先设置好的回调函数进行处理。以下均以回调角度对照原注释说明。

enum nl_cb_type {
	/** Message is valid */
0	NL_CB_VALID,        5   接收的消息类型没有这些标志时
	/** Last message in a series of multi part messages received */
1	NL_CB_FINISH,       5   接收的消息类型是NLMSG_DONE时,多部分消息中的最后一个
    /** Report received that data was lost */
2	NL_CB_OVERRUN,      5   接收的消息类型是NLMSG_OVERRUN时,消息数据丢失
	/** Message wants to be skipped */
3	NL_CB_SKIPPED,      5   接收的消息类型是NLMSG_NOOP时,对方要求忽略
	/** Message is an acknowledge */
4	NL_CB_ACK,          5   接收的消息类型是NLMSG_ERROR时,对方要求ACK
	/** Called for every message received */
5	NL_CB_MSG_IN,       1   刚收到的看似好的信息时
	/** Called for every message sent out except for nl_sendto() */
6	NL_CB_MSG_OUT,
	/** Message is malformed and invalid */
7	NL_CB_INVALID,          在消息类型为NLMSG_ERROR时,可能也会被调用。
	/** Called instead of internal sequence number checking */
8	NL_CB_SEQ_CHECK,    2   检查序号。内部回调如出错会回调NL_CB_INVALID
	/** Sending of an acknowledge message has been requested */
9	NL_CB_SEND_ACK,     4   接收的消息中有NLM_F_ACK标志时,对方要求ACK
	/** Flag NLM_F_DUMP_INTR is set in message */
10	NL_CB_DUMP_INTR,    3   接收的消息中有这个标志时,大概是传过来的数据有问题
	__NL_CB_TYPE_MAX,
};

NL_CB_MSG_OUT在发送信息前回调(均于nl_sendmsg)。其它均针对的是接收信息(均于recvmsgs)时的情况。

注意

  • 接收的消息可能为“垃圾”信息,比如之前因NL_STOP而未接收的信息、订阅的多播组中与已无关的信息、自己向多播组发出而被内核广播回弹来的消息等。因此,为防止张冠李戴,尽量不要使用NL_STOP的回调,不要屏蔽序列号检查(订阅多播组情况除外)。
  • 在触发WIFI扫描和获取无线网卡信息这两个通信过程中,NL_CB_FINISH对应的接收消息均是空消息,仅指示多部分报文的结束,并没有信息能够表示要获取信息的到来。因此检查要获取信息的到来,应体现在NL_CB_VALID中。不确定这一原则是否能够推广。
  • 接收到多部分消息的NLMSG_DONE时,即使没有NL_CB_FINISH回调,接收函数也能结束。而没接收到NLMSG_DONE时,即使有NL_CB_FINISH,也没机会回调,对多部分报文,系统会一直持续接收。因此NL_CB_FINISH这个回调时机没什么意义。

消息的顺序号

顺序号是相对于一次收发请求/应答而言的,即在这一次请求中,不论消息由多少个组成,均使用同一个顺序号。

内核主动发出的消息/广播,顺序号为0。因此用户这时不能进行顺序号检查。

消息的标志

  • NLM_F_ACK 这是要求接收方要ACK的标志。该标志由socket的NL_NO_AUTO_ACK标志自动决定,一般不能通过组织消息或发送函数改变。socket默认要求ACK。
  • NLM_F_DUMP 不甚了了,看起来象是要求所有信息。至少在获取网卡信息时,如果不设此标志会出错。

socket的回调函数

针对收发信息的不同类型,如NL_CB_VALID、NL_CB_FINISH、NL_CB_MSG_OUT等,libnl均提供了4种默认实现,其中:

  • NL_CB_DEFAULT 其实应叫quiet,安静模式,既NULL指针,什么也不做
  • NL_CB_VERBOSE 详细模式,部分类型的信息实现了
  • NL_CB_DEBUG 调试模式,部分类型的信息实现了
  • NL_CB_CUSTOM 定制模式,由用户自行设置(库本身也用到了这一机制)。初始为空指针

socket初始分配时,根据程序运行时的环境变量,选择设置前三种之一的回调集合;未设置环境变量时,选择quiet模式,即回函数使用的是NL_CB_DEFAULT集,也就是都是空指针,没有回调。NL_CB_CUSTOM供定制回调。

应用程序可以通过nl_cb_alloc新建前三种之一的回调集合。

绑定到socket的回调一经设置,不做专门调整,将一直起作用,除非收发时使用了带指定回调接口的方法。

socket的错误处理回调函数

由nl_cb_err等方法设置,用于专门处理内核发过来的带NLMSG_ERROR标志的信息。

nl_socket_modify_cb(socket, type, kind, func, arg)

定制socket的回调函数。其中:

  • type 是指信息类型
  • kind 是指模式
  • func, arg 是指回调函数及参数

当kind为NL_CB_CUSTOM时,就是正常理解上的定制;否则是恢复相应模式对此类信息的默认处理函数,并设置参数,即func会被忽略。

如果不传递错误的type、kind参数,此函数不可能返回错误值。

nl_cb_set与其类似,只是不绑定socket。

nl_cb_alloc(kind)

新建指定类别(模式)的回调函数集,包括错误处理回调函数。前三种模式为使用系统的默认实现,第4种均为空指针;所有模式参数均为空指针。

引用计数置为1。

文档中未说明的函数

函数原型:

struct nl_cb *nl_cb_get(struct nl_cb *cb)//增加cb的引用计数,并返回它
struct nl_cb *nl_socket_get_cb(const struct nl_sock *sk)//获取socket的回调集,并增加其引用计数
void nl_cb_put(struct nl_cb *cb)//减少引用计数,如为0则释放它
HTML
1
https://gitee.com/laokz/ohos_memo.git
git@gitee.com:laokz/ohos_memo.git
laokz
ohos_memo
ohos_memo
master

搜索帮助