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