rtnl: Interface was added to technology too early
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Thu, 25 Apr 2013 11:47:50 +0000 (14:47 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 26 Apr 2013 09:31:45 +0000 (12:31 +0300)
The __connman_technology_add_interface() needs to be called
after we have created the technology which is done by rtnl->newlink()
callback. If this is done the old way, the ethernet devices
will not get their interfaces set properly.

src/rtnl.c

index ef7f343..af8ab70 100644 (file)
@@ -460,10 +460,8 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
 
                if (type == ARPHRD_ETHER)
                        read_uevent(interface);
-
-               __connman_technology_add_interface(interface->service_type,
-                       interface->index, interface->name, interface->ident);
-       }
+       } else
+               interface = NULL;
 
        for (list = rtnl_list; list; list = list->next) {
                struct connman_rtnl *rtnl = list->data;
@@ -472,6 +470,16 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
                        rtnl->newlink(type, index, flags, change);
        }
 
+       /*
+        * The interface needs to be added after the newlink call.
+        * The newlink will create the technology when needed and
+        * __connman_technology_add_interface() expects the
+        * technology to be there already.
+        */
+       if (interface != NULL)
+               __connman_technology_add_interface(interface->service_type,
+                       interface->index, interface->name, interface->ident);
+
        for (list = watch_list; list; list = list->next) {
                struct watch_data *watch = list->data;