linkwatch 是 Linux 内核网络子系统中的一个重要机制,负责监控网络接口的链路状态变化并处理相关事件。它不是传统意义上的用户空间进程,而是内核中的一个工作队列机制。
struct net_device
:每个网络设备都包含链路状态相关字段linkwatch_work
:工作队列项,用于延迟处理链路事件lweventlist
:链表,存储待处理的链路事件netif_carrier_on/off()
:设置设备的载波状态(连接/断开)linkwatch_fire_event()
:触发链路状态事件处理linkwatch_do_dev()
:实际处理设备链路状态变化的函数linkwatch_event()
:工作队列处理函数netif_carrier_on()
或netif_carrier_off()
linkwatch_fire_event()
linkwatch_fire_event()
将设备添加到lweventlist
并调度工作队列linkwatch_event()
处理所有待处理事件linkwatch_do_dev()
更新设备状态并通知上层为了避免链路状态频繁抖动(flapping)带来的问题,linkwatch 实现了延迟处理:
LINKWATCH_DEFERRED_TIME
)查看链路状态:
cat /sys/class/net/<interface>/carrier
ip link show
调试信息:
CONFIG_NET_DEBUG
和动态调试获取更多信息统计信息:
/proc/net/dev
和/proc/net/softnet_stat
获取链路状态检测延迟:
LINKWATCH_DEFERRED_TIME
(需要重新编译内核)虚假链路状态变化:
性能问题:
lweventlist
长度Linux linkwatch 机制是网络子系统稳定运行的重要保障,它通过智能的事件合并和延迟处理,有效管理了网络接口的物理链路状态变化,为上层协议提供了可靠的基础设施。