NETIF 消息级别¶
网络接口消息级别设置的设计。
历史¶
调试消息接口的设计受限于向后兼容性和之前的实践。了解其历史和演变过程有助于理解当前的实践,并将其与较旧的驱动程序源代码联系起来。
从 Linux 的早期开始,每个网络设备驱动程序都有一个本地整数变量来控制调试消息级别。消息级别范围从 0 到 7,并且单调递增,级别越高,消息越详细。
消息级别在 3 级之后没有明确定义,但始终在指定级别的 +-1 范围内实现。驱动程序在成熟时倾向于减少更详细级别的消息。
0 最小消息,仅有关致命错误的基本信息。
1 标准消息,初始化状态。无运行时消息
2 特殊介质选择消息,通常是定时器驱动程序。
3 接口启动和停止,包括正常状态消息
4 Tx 和 Rx 帧错误消息以及异常驱动程序操作
5 Tx 数据包队列信息,中断事件。
6 每个已完成的 Tx 数据包和接收的 Rx 数据包的状态
7 Tx 和 Rx 数据包的初始内容
最初,此消息级别变量在每个驱动程序中都有唯一的名称,例如“lance_debug”,以便内核符号调试器可以定位并修改设置。当内核模块变得普遍时,变量被一致地重命名为“debug”,并允许设置为模块参数。
这种方法效果很好。但是,总是需要额外的功能。多年来,以下内容作为合理且易于实现的增强功能而出现
使用 ioctl() 调用来修改级别。
每个接口而不是每个驱动程序的消息级别设置。
更精细地控制发出的消息类型。
netif_msg 建议通过略微增加复杂性和代码大小来添加这些功能。
建议如下几点
保留每个驱动程序整数变量“debug”作为模块参数,默认级别为“1”。
添加一个名为“msg_enable”的每个接口的私有变量。该变量是一个位图,而不是级别,并初始化为
1 << debug或者更准确地说
debug < 0 ? 0 : 1 << min(sizeof(int)-1, debug)消息应该从
if (debug > 1) printk(MSG_DEBUG "%s: ...变成
if (np->msg_enable & NETIF_MSG_LINK) printk(MSG_DEBUG "%s: ...
消息级别集命名为
旧级别
名称
位位置
0
NETIF_MSG_DRV
0x0001
1
NETIF_MSG_PROBE
0x0002
2
NETIF_MSG_LINK
0x0004
2
NETIF_MSG_TIMER
0x0004
3
NETIF_MSG_IFDOWN
0x0008
3
NETIF_MSG_IFUP
0x0008
4
NETIF_MSG_RX_ERR
0x0010
4
NETIF_MSG_TX_ERR
0x0010
5
NETIF_MSG_TX_QUEUED
0x0020
5
NETIF_MSG_INTR
0x0020
6
NETIF_MSG_TX_DONE
0x0040
6
NETIF_MSG_RX_STATUS
0x0040
7
NETIF_MSG_PKTDATA
0x0080