convert interface event queueing to global interface notifier
[project/netifd.git] / interface.h
index b2ecd23..bfdc28e 100644 (file)
@@ -10,6 +10,8 @@ struct interface_proto_state;
 enum interface_event {
        IFEV_DOWN,
        IFEV_UP,
+       IFEV_FREE,
+       IFEV_RELOAD,
 };
 
 enum interface_state {
@@ -36,7 +38,7 @@ struct interface_error {
 struct interface_user {
        struct list_head list;
        struct interface *iface;
-       void (*cb)(struct interface_user *dep, enum interface_event ev);
+       void (*cb)(struct interface_user *dep, struct interface *iface, enum interface_event ev);
 };
 
 struct interface_ip_settings {
@@ -51,6 +53,11 @@ struct interface_ip_settings {
        struct vlist_simple_tree dns_search;
 };
 
+struct interface_data {
+       struct avl_node node;
+       struct blob_attr data[];
+};
+
 /*
  * interface configuration
  */
@@ -86,12 +93,16 @@ struct interface {
 
        struct interface_ip_settings proto_ip;
        struct interface_ip_settings config_ip;
+       struct vlist_tree host_routes;
 
        int metric;
 
        /* 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;
 };
@@ -123,12 +134,11 @@ int interface_remove_link(struct interface *iface, struct device *dev);
 void interface_add_error(struct interface *iface, const char *subsystem,
                         const char *code, const char **data, int n_data);
 
+int interface_add_data(struct interface *iface, const struct blob_attr *data);
+
 void interface_update_start(struct interface *iface);
 void interface_update_complete(struct interface *iface);
 
-void interface_queue_event(struct interface *iface, enum interface_event ev);
-void interface_dequeue_event(struct interface *iface);
-
 void interface_start_pending(void);
 
 #endif