diff options
| author | Renato Westphal <renato@openbsd.org> | 2018-01-15 10:35:39 -0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-15 10:35:39 -0200 |
| commit | 3cd878d9250347863372dba152d1cd47a745576b (patch) | |
| tree | aa8ce7d18b5f52ee6ac55086b5c76531b434a942 /zebra/interface.c | |
| parent | b782607f7f2125dd0e5789d5744cc97baf03b0e6 (diff) | |
| parent | dc7b3caefbd8baccb7fc3787a774e78d1a96636f (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.c | 33 |
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); } |
