kernel-pfroute: add newly appearing interfaces to the interface cache
authorMartin Willi <martin@revosec.ch>
Fri, 19 Apr 2013 08:46:04 +0000 (10:46 +0200)
committerMartin Willi <martin@revosec.ch>
Mon, 6 May 2013 14:10:12 +0000 (16:10 +0200)
src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c

index face73e..0d12a87 100644 (file)
@@ -472,7 +472,7 @@ static void process_link(private_kernel_pfroute_net_t *this,
 {
        enumerator_t *enumerator;
        iface_entry_t *iface;
-       bool roam = FALSE;
+       bool roam = FALSE, found = FALSE;;
 
        this->lock->write_lock(this->lock);
        enumerator = this->ifaces->create_enumerator(this->ifaces);
@@ -494,10 +494,31 @@ static void process_link(private_kernel_pfroute_net_t *this,
                                }
                        }
                        iface->flags = msg->ifm_flags;
+                       found = TRUE;
                        break;
                }
        }
        enumerator->destroy(enumerator);
+
+       if (!found)
+       {
+               INIT(iface,
+                       .ifindex = msg->ifm_index,
+                       .flags = msg->ifm_flags,
+                       .addrs = linked_list_create(),
+               );
+               if (if_indextoname(iface->ifindex, iface->ifname))
+               {
+                       DBG1(DBG_KNL, "interface %s appeared", iface->ifname);
+                       iface->usable = hydra->kernel_interface->is_interface_usable(
+                                                                               hydra->kernel_interface, iface->ifname);
+                       this->ifaces->insert_last(this->ifaces, iface);
+               }
+               else
+               {
+                       free(iface);
+               }
+       }
        this->lock->unlock(this->lock);
 
        if (roam)