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