zebra通過netlink機制擷取主機接口資訊。
具體過程如下:
main.c—》(if_netlink.c) interface_list()
—》(rt_netlink.c) interface_lookup_netlink()
interface_lookup_netlink 通過
netlink_request函數與核心通信,發送相應的請求資訊(getlink,getaddr);
接口name、index等屬性 與接口ip位址是分别擷取的。
netlink_parse_info函數收到核心回報的資料,進行相應的解析;
其中netlink_interface 解析接口name、index等資訊,并插入到iflist連結清單中;
netlink_interface_addr通過接口index找到接口,并添加相應接口IP位址。
netlink_parse_info 函數内
通過buf接收核心回報的資料,一般的buf大小為4096,經過測試發現,這可以支援9個接口資訊,
如果接口資訊增加,則由于接收的資訊過多,導緻記憶體溢出,進而導緻接收的接口資訊與IP位址不全,進而影響
後續的路由處理,比如:ipv6的nexthop為全零(::)