调试打印
1.D打印
在/etc/init.d/network中增加如下内容就能使用“logread -e netifd”看到D打印的内容,
注意:D打印的内容是"daemon.err netifd[10824]"开头的,而netifd使用的syslog级别为L_CRIT,L_WARNING,L_NOTICE,L_INFO,L_DEBUG,感觉是特意避开err级别,避免跟D混淆。
2.syslog打印
如果将上面的启动参数修改为“procd_set_param command /sbin/netifd -l 5 -d 15”,则代码及对应的打印内容如下所示:
DPRINTF("connected as %08x\n", ubus_ctx->local_id);
netifd_log_message(L_DEBUG, "connected as %08x\n", ubus_ctx->local_id);
netifd_log_message(L_INFO, "connected as %08x\n", ubus_ctx->local_id);
netifd_log_message(L_NOTICE, "connected as %08x\n", ubus_ctx->local_id);
netifd_log_message(L_WARNING, "connected as %08x\n", ubus_ctx->local_id);
netifd_log_message(L_CRIT, "connected as %08x\n", ubus_ctx->local_id);
daemon.err netifd[17096]: netifd_ubus_init(1364): connected as 0d6fc15a
daemon.debug netifd: connected as 0d6fc15a
daemon.info netifd: connected as 0d6fc15a
daemon.notice netifd: connected as 0d6fc15a
daemon.warn netifd: connected as 0d6fc15a
daemon.crit netifd: connected as 0d6fc15a
监听内核接口状态的变化
1、system_init中调用create_event_socket创建监听netlink的socket
2、当接口link up或者link down时,在内核中调用netif_carrier_on,最终会走到netdev_state_change,
再通过rtmsg_ifinfo发出netlink消息。
3、在system_init中注册的cb_rtnl_event监听到消息之后,做相应的处理。
netifd支持的device类型
设备类型 | 对应结构体 | 使用场景 |
bridge | bridge_device_type | 用于创建br-lan |
macvlan | macvlan_device_type | |
Network device | simple_device_type | |
tunnel | tunnel_device_type | |
veth | veth_device_type | |
8021ad | vlan8021ad_device_type | |
8021q | vlan8021q_device_type |
所有类型都通过device_type_add来添加。