mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-30 22:25:41 +00:00
Merge pull request #1623 from donaldsharp/zebra_interface_one_shot
zebra: Add one-shot thread to recheck speed
This commit is contained in:
commit
3cd878d925
@ -387,6 +387,11 @@ static int get_iflink_speed(const char *ifname)
|
|||||||
return (ecmd.speed_hi << 16) | ecmd.speed;
|
return (ecmd.speed_hi << 16) | ecmd.speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t kernel_get_speed(struct interface *ifp)
|
||||||
|
{
|
||||||
|
return get_iflink_speed(ifp->name);
|
||||||
|
}
|
||||||
|
|
||||||
static int netlink_extract_bridge_info(struct rtattr *link_data,
|
static int netlink_extract_bridge_info(struct rtattr *link_data,
|
||||||
struct zebra_l2info_bridge *bridge_info)
|
struct zebra_l2info_bridge *bridge_info)
|
||||||
{
|
{
|
||||||
|
@ -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),
|
DEFINE_HOOK(zebra_if_config_wr, (struct vty *vty, struct interface *ifp),
|
||||||
(vty, ifp))
|
(vty, ifp))
|
||||||
|
|
||||||
|
|
||||||
static void if_down_del_nbr_connected(struct interface *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,
|
static void zebra_if_node_destroy(route_table_delegate_t *delegate,
|
||||||
struct route_table *table,
|
struct route_table *table,
|
||||||
struct route_node *node)
|
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);
|
route_table_init_with_delegate(&zebra_if_table_delegate);
|
||||||
|
|
||||||
ifp->info = zebra_if;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +172,8 @@ static int if_zebra_delete_hook(struct interface *ifp)
|
|||||||
list_delete_and_null(&rtadv->AdvPrefixList);
|
list_delete_and_null(&rtadv->AdvPrefixList);
|
||||||
#endif /* HAVE_RTADV */
|
#endif /* HAVE_RTADV */
|
||||||
|
|
||||||
|
THREAD_OFF(zebra_if->speed_update);
|
||||||
|
|
||||||
XFREE(MTYPE_TMP, zebra_if);
|
XFREE(MTYPE_TMP, zebra_if);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,6 +273,8 @@ struct zebra_if {
|
|||||||
/* Link fields - for sub-interfaces. */
|
/* Link fields - for sub-interfaces. */
|
||||||
ifindex_t link_ifindex;
|
ifindex_t link_ifindex;
|
||||||
struct interface *link;
|
struct interface *link;
|
||||||
|
|
||||||
|
struct thread *speed_update;
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_HOOK(zebra_if_extra_info, (struct vty *vty, struct interface *ifp),
|
DECLARE_HOOK(zebra_if_extra_info, (struct vty *vty, struct interface *ifp),
|
||||||
|
@ -98,6 +98,7 @@ extern void kernel_lsp_pass_fail(zebra_lsp_t *lsp,
|
|||||||
|
|
||||||
extern int mpls_kernel_init(void);
|
extern int mpls_kernel_init(void);
|
||||||
|
|
||||||
|
extern uint32_t kernel_get_speed(struct interface *ifp);
|
||||||
extern int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *mroute);
|
extern int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *mroute);
|
||||||
extern int kernel_add_vtep(vni_t vni, struct interface *ifp,
|
extern int kernel_add_vtep(vni_t vni, struct interface *ifp,
|
||||||
struct in_addr *vtep_ip);
|
struct in_addr *vtep_ip);
|
||||||
|
@ -473,4 +473,9 @@ extern int kernel_interface_set_master(struct interface *master,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t kernel_get_speed(struct interface *ifp)
|
||||||
|
{
|
||||||
|
return ifp->speed;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !HAVE_NETLINK */
|
#endif /* !HAVE_NETLINK */
|
||||||
|
Loading…
Reference in New Issue
Block a user