Add technology driver callbacks for adding/removing interfaces
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 15 Jul 2010 17:05:55 +0000 (10:05 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 15 Jul 2010 17:05:55 +0000 (10:05 -0700)
include/technology.h
src/connman.h
src/rtnl.c
src/technology.c

index 7638454..256a2eb 100644 (file)
@@ -42,6 +42,10 @@ struct connman_technology_driver {
        int priority;
        int (*probe) (struct connman_technology *technology);
        void (*remove) (struct connman_technology *technology);
+       void (*add_interface) (struct connman_technology *technology,
+                                               int index, const char *name);
+       void (*remove_interface) (struct connman_technology *technology,
+                                                               int index);
        int (*set_tethering) (struct connman_technology *technology,
                                                connman_bool_t enabled);
 };
index ebd94b3..6b9a34a 100644 (file)
@@ -301,6 +301,10 @@ int __connman_technology_update_rfkill(unsigned int index,
                                                connman_bool_t hardblock);
 int __connman_technology_remove_rfkill(unsigned int index);
 
+void __connman_technology_add_interface(enum connman_service_type type,
+                                               int index, const char *name);
+void __connman_technology_remove_interface(enum connman_service_type type,
+                                               int index, const char *name);
 int __connman_technology_enable_tethering(void);
 int __connman_technology_disable_tethering(void);
 
index 74eafc6..cbf9bb5 100644 (file)
@@ -68,8 +68,8 @@ static void free_interface(gpointer data)
 {
        struct interface_data *interface = data;
 
-       connman_info("Remove interface %s [ %s ]", interface->name,
-                       __connman_service_type2string(interface->type));
+       __connman_technology_remove_interface(interface->type,
+                                       interface->index, interface->name);
 
        g_free(interface->name);
        g_free(interface);
@@ -388,8 +388,8 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
 
                read_uevent(interface);
 
-               connman_info("Create interface %s [ %s ]", interface->name,
-                       __connman_service_type2string(interface->type));
+               __connman_technology_add_interface(interface->type,
+                                       interface->index, interface->name);
        }
 
        for (list = rtnl_list; list; list = list->next) {
index 0ee91a3..34c50be 100644 (file)
@@ -100,6 +100,79 @@ void connman_technology_driver_unregister(struct connman_technology_driver *driv
        driver_list = g_slist_remove(driver_list, driver);
 }
 
+void __connman_technology_add_interface(enum connman_service_type type,
+                                               int index, const char *name)
+{
+       GSList *list;
+
+       switch (type) {
+       case CONNMAN_SERVICE_TYPE_UNKNOWN:
+       case CONNMAN_SERVICE_TYPE_SYSTEM:
+               return;
+       case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_WIMAX:
+       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_GPS:
+       case CONNMAN_SERVICE_TYPE_VPN:
+               break;
+       }
+
+       connman_info("Create interface %s [ %s ]", name,
+                               __connman_service_type2string(type));
+
+       for (list = technology_list; list; list = list->next) {
+               struct connman_technology *technology = list->data;
+
+               if (technology->type != type)
+                       continue;
+
+               if (technology->driver == NULL)
+                       continue;
+
+               if (technology->driver->add_interface)
+                       technology->driver->add_interface(technology,
+                                                               index, name);
+       }
+}
+
+void __connman_technology_remove_interface(enum connman_service_type type,
+                                               int index, const char *name)
+{
+       GSList *list;
+
+       switch (type) {
+       case CONNMAN_SERVICE_TYPE_UNKNOWN:
+       case CONNMAN_SERVICE_TYPE_SYSTEM:
+               return;
+       case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_WIMAX:
+       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_GPS:
+       case CONNMAN_SERVICE_TYPE_VPN:
+               break;
+       }
+
+       connman_info("Remove interface %s [ %s ]", name,
+                               __connman_service_type2string(type));
+
+       for (list = technology_list; list; list = list->next) {
+               struct connman_technology *technology = list->data;
+
+               if (technology->type != type)
+                       continue;
+
+               if (technology->driver == NULL)
+                       continue;
+
+               if (technology->driver->remove_interface)
+                       technology->driver->remove_interface(technology, index);
+       }
+}
+
 static int set_tethering(connman_bool_t enabled)
 {
        GSList *list;