| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |  | 
|  | 2 | ________________ | 
|  | 3 | NETIF Msg Level | 
|  | 4 |  | 
|  | 5 | The design of the network interface message level setting. | 
|  | 6 |  | 
|  | 7 | History | 
|  | 8 |  | 
|  | 9 | The design of the debugging message interface was guided and | 
|  | 10 | constrained by backwards compatibility previous practice.  It is useful | 
|  | 11 | to understand the history and evolution in order to understand current | 
|  | 12 | practice and relate it to older driver source code. | 
|  | 13 |  | 
|  | 14 | From the beginning of Linux, each network device driver has had a local | 
|  | 15 | integer variable that controls the debug message level.  The message | 
|  | 16 | level ranged from 0 to 7, and monotonically increased in verbosity. | 
|  | 17 |  | 
|  | 18 | The message level was not precisely defined past level 3, but were | 
|  | 19 | always implemented within +-1 of the specified level.  Drivers tended | 
|  | 20 | to shed the more verbose level messages as they matured. | 
|  | 21 | 0  Minimal messages, only essential information on fatal errors. | 
|  | 22 | 1  Standard messages, initialization status.  No run-time messages | 
|  | 23 | 2  Special media selection messages, generally timer-driver. | 
|  | 24 | 3  Interface starts and stops, including normal status messages | 
|  | 25 | 4  Tx and Rx frame error messages, and abnormal driver operation | 
|  | 26 | 5  Tx packet queue information, interrupt events. | 
|  | 27 | 6  Status on each completed Tx packet and received Rx packets | 
|  | 28 | 7  Initial contents of Tx and Rx packets | 
|  | 29 |  | 
|  | 30 | Initially this message level variable was uniquely named in each driver | 
|  | 31 | e.g. "lance_debug", so that a kernel symbolic debugger could locate and | 
|  | 32 | modify the setting.  When kernel modules became common, the variables | 
|  | 33 | were consistently renamed to "debug" and allowed to be set as a module | 
|  | 34 | parameter. | 
|  | 35 |  | 
|  | 36 | This approach worked well.  However there is always a demand for | 
|  | 37 | additional features.  Over the years the following emerged as | 
|  | 38 | reasonable and easily implemented enhancements | 
|  | 39 | Using an ioctl() call to modify the level. | 
|  | 40 | Per-interface rather than per-driver message level setting. | 
|  | 41 | More selective control over the type of messages emitted. | 
|  | 42 |  | 
|  | 43 | The netif_msg recommandation adds these features with only a minor | 
|  | 44 | complexity and code size increase. | 
|  | 45 |  | 
|  | 46 | The recommendation is the following points | 
|  | 47 | Retaining the per-driver integer variable "debug" as a module | 
|  | 48 | parameter with a default level of '1'. | 
|  | 49 |  | 
|  | 50 | Adding a per-interface private variable named "msg_enable".  The | 
|  | 51 | variable is a bit map rather than a level, and is initialized as | 
|  | 52 | 1 << debug | 
|  | 53 | Or more precisely | 
|  | 54 | debug < 0 ? 0 : 1 << min(sizeof(int)-1, debug) | 
|  | 55 |  | 
|  | 56 | Messages should changes from | 
|  | 57 | if (debug > 1) | 
|  | 58 | printk(MSG_DEBUG "%s: ... | 
|  | 59 | to | 
|  | 60 | if (np->msg_enable & NETIF_MSG_LINK) | 
|  | 61 | printk(MSG_DEBUG "%s: ... | 
|  | 62 |  | 
|  | 63 |  | 
|  | 64 | The set of message levels is named | 
|  | 65 | Old level   Name   Bit position | 
|  | 66 | 0    NETIF_MSG_DRV		0x0001 | 
|  | 67 | 1    NETIF_MSG_PROBE	0x0002 | 
|  | 68 | 2    NETIF_MSG_LINK		0x0004 | 
|  | 69 | 2    NETIF_MSG_TIMER	0x0004 | 
|  | 70 | 3    NETIF_MSG_IFDOWN	0x0008 | 
|  | 71 | 3    NETIF_MSG_IFUP		0x0008 | 
|  | 72 | 4    NETIF_MSG_RX_ERR	0x0010 | 
|  | 73 | 4    NETIF_MSG_TX_ERR	0x0010 | 
|  | 74 | 5    NETIF_MSG_TX_QUEUED	0x0020 | 
|  | 75 | 5    NETIF_MSG_INTR		0x0020 | 
|  | 76 | 6    NETIF_MSG_TX_DONE	0x0040 | 
|  | 77 | 6    NETIF_MSG_RX_STATUS	0x0040 | 
|  | 78 | 7    NETIF_MSG_PKTDATA	0x0080 | 
|  | 79 |  |