add a new event for interface free
[project/netifd.git] / interface.h
index f0b26f5..14aefce 100644 (file)
@@ -10,6 +10,7 @@ struct interface_proto_state;
 enum interface_event {
        IFEV_DOWN,
        IFEV_UP,
+       IFEV_FREE,
 };
 
 enum interface_state {
@@ -36,7 +37,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 +52,11 @@ struct interface_ip_settings {
        struct vlist_simple_tree dns_search;
 };
 
+struct interface_data {
+       struct avl_node node;
+       struct blob_attr data[];
+};
+
 /*
  * interface configuration
  */
@@ -76,7 +82,7 @@ struct interface {
        struct device_user main_dev;
 
        /* interface that layer 3 communication will go through */
-       struct device_user *l3_dev;
+       struct device_user l3_dev;
 
        struct blob_attr *config;
 
@@ -86,12 +92,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;
 };
@@ -111,6 +121,8 @@ int interface_set_up(struct interface *iface);
 int interface_set_down(struct interface *iface);
 void __interface_set_down(struct interface *iface, bool force);
 
+void interface_set_main_dev(struct interface *iface, struct device *dev);
+void interface_set_l3_dev(struct interface *iface, struct device *dev);
 
 void interface_add_user(struct interface_user *dep, struct interface *iface);
 void interface_remove_user(struct interface_user *dep);
@@ -121,6 +133,8 @@ 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);