chiark / gitweb /
networkd: netdev - verify that newlink messages has the expected kind
authorTom Gundersen <teg@jklm.no>
Sun, 23 Mar 2014 23:07:46 +0000 (00:07 +0100)
committerTom Gundersen <teg@jklm.no>
Mon, 24 Mar 2014 15:59:30 +0000 (16:59 +0100)
We match 'newlink' messages with expected netdev's based on their names. Now also
make sure that the receieved link has the expected kind.

src/network/networkd-manager.c
src/network/networkd-netdev.c
src/network/networkd.h

index 46815e0fd027df0e7cb17709d248a1bc8d37cf2e..684b1c7ad31499d454f5cc5a6f539965173a4a1e 100644 (file)
@@ -324,7 +324,7 @@ static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, vo
 
                 r = netdev_get(m, name, &netdev);
                 if (r >= 0) {
 
                 r = netdev_get(m, name, &netdev);
                 if (r >= 0) {
-                        r = netdev_set_ifindex(netdev, ifindex);
+                        r = netdev_set_ifindex(netdev, message);
                         if (r < 0)
                                 log_debug("could not set ifindex of netdev '%s' to %d: %s",
                                           name, ifindex, strerror(-r));
                         if (r < 0)
                                 log_debug("could not set ifindex of netdev '%s' to %d: %s",
                                           name, ifindex, strerror(-r));
index 3a670b3f0e7f970af78f9e6121b40815a3d89c91..356341a8735817c20e7c99427fe0674e9f446834 100644 (file)
@@ -157,7 +157,7 @@ static int netdev_enter_ready(NetDev *netdev) {
 static int netdev_getlink_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
                                 void *userdata) {
         NetDev *netdev = userdata;
 static int netdev_getlink_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
                                 void *userdata) {
         NetDev *netdev = userdata;
-        int r, ifindex;
+        int r;
 
         assert(netdev);
 
 
         assert(netdev);
 
@@ -174,19 +174,7 @@ static int netdev_getlink_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
                 return 1;
         }
 
                 return 1;
         }
 
-        r = sd_rtnl_message_link_get_ifindex(m, &ifindex);
-        if (r < 0) {
-                log_struct_netdev(LOG_ERR, netdev,
-                                "MESSAGE=%s: could not get ifindex: %s",
-                                netdev->name, strerror(-r),
-                                "ERRNO=%d", -r,
-                                NULL);
-                return 1;
-        }
-
-        r = netdev_set_ifindex(netdev, ifindex);
-        if (r < 0)
-                log_warning_netdev(netdev, "could not set ifindex to %d", ifindex);
+        netdev_set_ifindex(netdev, m);
 
         return 1;
 }
 
         return 1;
 }
@@ -392,10 +380,46 @@ int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callbac
         return 0;
 }
 
         return 0;
 }
 
-int netdev_set_ifindex(NetDev *netdev, int ifindex) {
+int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *message) {
+        const char *kind;
+        char *received_kind;
+        int r, ifindex;
+
         assert(netdev);
         assert(ifindex > 0);
 
         assert(netdev);
         assert(ifindex > 0);
 
+        kind = netdev_kind_to_string(netdev->kind);
+        if (!kind)
+                log_error_netdev(netdev, "Could not get kind");
+
+        r = sd_rtnl_message_enter_container(message, IFLA_LINKINFO);
+        if (r < 0) {
+                log_error_netdev(netdev, "Could not get LINKINFO");
+                return r;
+        }
+
+        r = sd_rtnl_message_read_string(message, IFLA_INFO_KIND, &received_kind);
+        if (r < 0) {
+                log_error_netdev(netdev, "Could not get KIND");
+                return r;
+        }
+
+        if (!streq(kind, received_kind)) {
+                log_error_netdev(netdev, "Received newlink with wrong KIND");
+                netdev_enter_failed(netdev);
+                return r;
+        }
+
+        r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
+        if (r < 0) {
+                log_struct_netdev(LOG_ERR, netdev,
+                                "MESSAGE=%s: could not get ifindex: %s",
+                                netdev->name, strerror(-r),
+                                "ERRNO=%d", -r,
+                                NULL);
+                return r;
+        }
+
         if (netdev->ifindex > 0) {
                 if (netdev->ifindex == ifindex)
                         return 0;
         if (netdev->ifindex > 0) {
                 if (netdev->ifindex == ifindex)
                         return 0;
index 239ef1cd38b96652bb300bc474897b311d707e95..8144031a99d286987181a190ca5dcf21993528c8 100644 (file)
@@ -264,7 +264,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_free);
 #define _cleanup_netdev_free_ _cleanup_(netdev_freep)
 
 int netdev_get(Manager *manager, const char *name, NetDev **ret);
 #define _cleanup_netdev_free_ _cleanup_(netdev_freep)
 
 int netdev_get(Manager *manager, const char *name, NetDev **ret);
-int netdev_set_ifindex(NetDev *netdev, int ifindex);
+int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
 
 const char *netdev_kind_to_string(NetDevKind d) _const_;
 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
 
 const char *netdev_kind_to_string(NetDevKind d) _const_;