summaryrefslogtreecommitdiff
path: root/zebra/interface.c
diff options
context:
space:
mode:
authorRenato Westphal <renato@openbsd.org>2018-01-15 10:35:39 -0200
committerGitHub <noreply@github.com>2018-01-15 10:35:39 -0200
commit3cd878d9250347863372dba152d1cd47a745576b (patch)
treeaa8ce7d18b5f52ee6ac55086b5c76531b434a942 /zebra/interface.c
parentb782607f7f2125dd0e5789d5744cc97baf03b0e6 (diff)
parentdc7b3caefbd8baccb7fc3787a774e78d1a96636f (diff)
Merge pull request #1623 from donaldsharp/zebra_interface_one_shot
zebra: Add one-shot thread to recheck speed
Diffstat (limited to 'zebra/interface.c')
-rw-r--r--zebra/interface.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/zebra/interface.c b/zebra/interface.c
index 18588ee52c..906f796136 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -57,8 +57,29 @@ DEFINE_HOOK(zebra_if_extra_info, (struct vty *vty, struct interface *ifp),
DEFINE_HOOK(zebra_if_config_wr, (struct vty *vty, struct interface *ifp),
(vty, ifp))
+
static void if_down_del_nbr_connected(struct interface *ifp);
+static int if_zebra_speed_update(struct thread *thread)
+{
+ struct interface *ifp = THREAD_ARG(thread);
+ struct zebra_if *zif = ifp->info;
+ uint32_t new_speed;
+
+ zif->speed_update = NULL;
+
+ new_speed = kernel_get_speed(ifp);
+ if (new_speed != ifp->speed) {
+ zlog_info("%s: %s old speed: %u new speed: %u",
+ __PRETTY_FUNCTION__, ifp->name,
+ ifp->speed, new_speed);
+ ifp->speed = new_speed;
+ if_add_update(ifp);
+ }
+
+ return 1;
+}
+
static void zebra_if_node_destroy(route_table_delegate_t *delegate,
struct route_table *table,
struct route_node *node)
@@ -119,6 +140,16 @@ static int if_zebra_new_hook(struct interface *ifp)
route_table_init_with_delegate(&zebra_if_table_delegate);
ifp->info = zebra_if;
+
+ /*
+ * Some platforms are telling us that the interface is
+ * up and ready to go. When we check the speed we
+ * sometimes get the wrong value. Wait a couple
+ * of seconds and ask again. Hopefully it's all settled
+ * down upon startup.
+ */
+ thread_add_timer(zebrad.master, if_zebra_speed_update,
+ ifp, 15, &zebra_if->speed_update);
return 0;
}
@@ -141,6 +172,8 @@ static int if_zebra_delete_hook(struct interface *ifp)
list_delete_and_null(&rtadv->AdvPrefixList);
#endif /* HAVE_RTADV */
+ THREAD_OFF(zebra_if->speed_update);
+
XFREE(MTYPE_TMP, zebra_if);
}