2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
________________
|
|
|
|
NETIF Msg Level
|
|
|
|
|
|
|
|
The design of the network interface message level setting.
|
|
|
|
|
|
|
|
History
|
|
|
|
|
|
|
|
The design of the debugging message interface was guided and
|
|
|
|
constrained by backwards compatibility previous practice. It is useful
|
|
|
|
to understand the history and evolution in order to understand current
|
|
|
|
practice and relate it to older driver source code.
|
|
|
|
|
|
|
|
From the beginning of Linux, each network device driver has had a local
|
|
|
|
integer variable that controls the debug message level. The message
|
|
|
|
level ranged from 0 to 7, and monotonically increased in verbosity.
|
|
|
|
|
|
|
|
The message level was not precisely defined past level 3, but were
|
|
|
|
always implemented within +-1 of the specified level. Drivers tended
|
|
|
|
to shed the more verbose level messages as they matured.
|
|
|
|
0 Minimal messages, only essential information on fatal errors.
|
|
|
|
1 Standard messages, initialization status. No run-time messages
|
|
|
|
2 Special media selection messages, generally timer-driver.
|
|
|
|
3 Interface starts and stops, including normal status messages
|
|
|
|
4 Tx and Rx frame error messages, and abnormal driver operation
|
|
|
|
5 Tx packet queue information, interrupt events.
|
|
|
|
6 Status on each completed Tx packet and received Rx packets
|
|
|
|
7 Initial contents of Tx and Rx packets
|
|
|
|
|
|
|
|
Initially this message level variable was uniquely named in each driver
|
|
|
|
e.g. "lance_debug", so that a kernel symbolic debugger could locate and
|
|
|
|
modify the setting. When kernel modules became common, the variables
|
|
|
|
were consistently renamed to "debug" and allowed to be set as a module
|
|
|
|
parameter.
|
|
|
|
|
|
|
|
This approach worked well. However there is always a demand for
|
|
|
|
additional features. Over the years the following emerged as
|
|
|
|
reasonable and easily implemented enhancements
|
|
|
|
Using an ioctl() call to modify the level.
|
|
|
|
Per-interface rather than per-driver message level setting.
|
|
|
|
More selective control over the type of messages emitted.
|
|
|
|
|
2006-10-03 13:54:15 -07:00
|
|
|
The netif_msg recommendation adds these features with only a minor
|
2005-04-16 15:20:36 -07:00
|
|
|
complexity and code size increase.
|
|
|
|
|
|
|
|
The recommendation is the following points
|
|
|
|
Retaining the per-driver integer variable "debug" as a module
|
|
|
|
parameter with a default level of '1'.
|
|
|
|
|
|
|
|
Adding a per-interface private variable named "msg_enable". The
|
|
|
|
variable is a bit map rather than a level, and is initialized as
|
|
|
|
1 << debug
|
|
|
|
Or more precisely
|
|
|
|
debug < 0 ? 0 : 1 << min(sizeof(int)-1, debug)
|
|
|
|
|
|
|
|
Messages should changes from
|
|
|
|
if (debug > 1)
|
|
|
|
printk(MSG_DEBUG "%s: ...
|
|
|
|
to
|
|
|
|
if (np->msg_enable & NETIF_MSG_LINK)
|
|
|
|
printk(MSG_DEBUG "%s: ...
|
|
|
|
|
|
|
|
|
|
|
|
The set of message levels is named
|
|
|
|
Old level Name Bit position
|
|
|
|
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
|
|
|
|
|