/** * interface object */ struct interface { struct vlist_node node; struct list_head hotplug_list; enum interface_event hotplug_ev; const char *name; const char *ifname; bool available; bool autostart; bool config_autostart; bool device_config; bool enabled; bool link_state; bool force_link; bool dynamic; time_t start_time; enum interface_state state; enum interface_config_state config_state; enum interface_update_flags updated; struct list_head users; const char *parent_ifname; struct interface_user parent_iface; /* main interface that the interface is bound to */ struct device_user main_dev; /* interface that layer 3 communication will go through */ struct device_user l3_dev; struct blob_attr *config; /* primary protocol state */ const struct proto_handler *proto_handler; struct interface_proto_state *proto; struct interface_ip_settings proto_ip; struct interface_ip_settings config_ip; struct vlist_tree host_routes; int metric; unsigned int ip4table; unsigned int ip6table; /* IPv6 assignment parameters */ uint8_t assignment_length; int32_t assignment_hint; struct list_head assignment_classes; /* errors/warnings while trying to bring up the interface */ struct list_head errors; /* extra data provided by protocol handlers or modules */ struct avl_tree data; struct uloop_timeout remove_timer; struct ubus_object ubus; };
enum interface_event { IFEV_DOWN, IFEV_UP, IFEV_UPDATE, IFEV_FREE, IFEV_RELOAD, }; enum interface_state { IFS_SETUP, IFS_UP, IFS_TEARDOWN, IFS_DOWN, }; enum interface_config_state { IFC_NORMAL, IFC_RELOAD, IFC_REMOVE }; enum interface_update_flags { IUF_ADDRESS = (1 << 0), IUF_ROUTE = (1 << 1), IUF_PREFIX = (1 << 2), IUF_DATA = (1 << 3), }; struct interface_error { struct list_head list; const char *subsystem; const char *code; const char *data[]; }; /** * interface 引用 */ struct interface_user { struct list_head list; struct interface *iface; void (*cb)(struct interface_user *dep, struct interface *iface, enum interface_event ev); }; /** * interface ip 配置對象 */ struct interface_ip_settings { struct interface *iface; bool enabled; bool no_defaultroute; bool no_dns; bool no_delegation; struct vlist_tree addr; struct vlist_tree route; struct vlist_tree prefix; struct vlist_simple_tree dns_servers; struct vlist_simple_tree dns_search; }; struct interface_data { struct avl_node node; struct blob_attr data[]; }; struct interface_assignment_class { struct list_head head; char name[]; };
/** * 根據輸入配置建立並初始化interface object * * @param name interface name * @param config configure of interface object * @return interface object */ struct interface *interface_alloc(const char *name, struct blob_attr *config)
/** * 添加設置到interface中 * * @param iface interface object * @param config configure of interface object */ void interface_add(struct interface *iface, struct blob_attr *config)
/** * 設置interface object的proto處理對象 * * @param iface interface object * @param state proto handler object */ void interface_set_proto_state(struct interface *iface, struct interface_proto_state *state)
/** * 使能interface object * * @param iface interface object * @return true - success false - failed */ int interface_set_up(struct interface *iface) /** * 停用interface object * * @param iface interface object * @return true - success false - failed */ int interface_set_down(struct interface *iface)
/** * 設置interface對象主device對象 * * @param iface interface object * @param dev device object */ void interface_set_main_dev(struct interface *iface, struct device *dev) /** * 設置interface對象3層device對象 * * @param iface interface object * @param dev device object */ void interface_set_l3_dev(struct interface *iface, struct device *dev)
/** * 添加interface object引用 * * @param dep interface reference object * @param iface interface object */ void interface_add_user(struct interface_user *dep, struct interface *iface) /** * 刪除interface object引用 * * @param dep interface reference object */ void interface_remove_user(struct interface_user *dep)
/** * */ int interface_add_link(struct interface *iface, struct device *dev) /** * */ int interface_remove_link(struct interface *iface, struct device *dev) /** * */ int interface_handle_link(struct interface *iface, const char *name, bool add)
interface對象avl tree鏈表設置了keep_old
和no_delete
標誌,每次執行config_init_all時首先vlist_update把avl tree鏈表頭結點的version
標誌加1,當根據UCI更新interface鏈表中對象時每一個node的version
保持與頭結點version
一致,後繼作vlist_flush時若是存在node的version
與頭結點version
不一致的將被刪除,而netifd在刪除某個interface時其實並無把相應的對象從avl tree鏈表中刪除,而是等下一次restart或reload時再node