diff options
| -rw-r--r-- | zebra/if_netlink.c | 23 | ||||
| -rw-r--r-- | zebra/interface.c | 21 | ||||
| -rw-r--r-- | zebra/interface.h | 3 |
3 files changed, 36 insertions, 11 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index ba518ea576..ce0834f190 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -690,9 +690,6 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup) ifp->speed = get_iflink_speed(ifp); ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN; - if (desc) - ifp->desc = XSTRDUP(MTYPE_TMP, desc); - /* Set zebra interface type */ zebra_if_set_ziftype(ifp, zif_type, zif_slave_type); if (IS_ZEBRA_IF_VRF(ifp)) @@ -707,6 +704,11 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup) zif = (struct zebra_if *)ifp->info; zif->link_ifindex = link_ifindex; + if (desc) { + XFREE(MTYPE_TMP, zif->desc); + zif->desc = XSTRDUP(MTYPE_TMP, desc); + } + /* Hardware type and address. */ ifp->ll_type = netlink_to_zebra_link_type(ifi->ifi_type); netlink_interface_update_hw_addr(tb, ifp); @@ -1106,7 +1108,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) ifindex_t bond_ifindex = IFINDEX_INTERNAL; ifindex_t link_ifindex = IFINDEX_INTERNAL; uint8_t old_hw_addr[INTERFACE_HWADDR_MAX]; - + struct zebra_if *zif; zns = zebra_ns_lookup(ns_id); ifi = NLMSG_DATA(h); @@ -1186,12 +1188,6 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) /* See if interface is present. */ ifp = if_lookup_by_name_per_ns(zns, name); - if (ifp) { - XFREE(MTYPE_TMP, ifp->desc); - if (desc) - ifp->desc = XSTRDUP(MTYPE_TMP, desc); - } - if (h->nlmsg_type == RTM_NEWLINK) { if (tb[IFLA_MASTER]) { if (slave_kind && (strcmp(slave_kind, "vrf") == 0) @@ -1390,6 +1386,13 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) if_delete_update(ifp); } + zif = ifp->info; + if (zif) { + XFREE(MTYPE_TMP, zif->desc); + if (desc) + zif->desc = XSTRDUP(MTYPE_TMP, desc); + } + return 0; } diff --git a/zebra/interface.c b/zebra/interface.c index 10f1f92100..b0ddcaf8bc 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -181,6 +181,7 @@ static int if_zebra_delete_hook(struct interface *ifp) list_delete(&rtadv->AdvDNSSLList); #endif /* HAVE_RTADV */ + XFREE(MTYPE_TMP, zebra_if->desc); THREAD_OFF(zebra_if->speed_update); XFREE(MTYPE_ZINFO, zebra_if); @@ -1303,6 +1304,9 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp) if (ifp->desc) vty_out(vty, " Description: %s\n", ifp->desc); + if (zebra_if->desc) + vty_out(vty, " OS Description: %s\n", zebra_if->desc); + if (ifp->ifindex == IFINDEX_INTERNAL) { vty_out(vty, " pseudo interface\n"); return; @@ -1696,6 +1700,10 @@ static void if_show_description(struct vty *vty, vrf_id_t vrf_id) vty_out(vty, "Interface Status Protocol Description\n"); FOR_ALL_INTERFACES (vrf, ifp) { int len; + struct zebra_if *zif; + bool intf_desc; + + intf_desc = false; len = vty_out(vty, "%s", ifp->name); vty_out(vty, "%*s", (16 - len), " "); @@ -1715,8 +1723,19 @@ static void if_show_description(struct vty *vty, vrf_id_t vrf_id) vty_out(vty, "down down "); } - if (ifp->desc) + if (ifp->desc) { + intf_desc = true; vty_out(vty, "%s", ifp->desc); + } + zif = ifp->info; + if (zif && zif->desc) { + vty_out(vty, "%s%s", + intf_desc + ? "\n " + : "", + zif->desc); + } + vty_out(vty, "\n"); } } diff --git a/zebra/interface.h b/zebra/interface.h index ce404e8253..bbb5445cc6 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -342,6 +342,9 @@ struct zebra_if { bool v6_2_v4_ll_neigh_entry; char neigh_mac[6]; struct in6_addr v6_2_v4_ll_addr6; + + /* The description of the interface */ + char *desc; }; DECLARE_HOOK(zebra_if_extra_info, (struct vty * vty, struct interface *ifp), |
