diff options
Diffstat (limited to 'zebra/rt_netlink.c')
-rw-r--r-- | zebra/rt_netlink.c | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 569dc807..4b9daef4 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1008,6 +1008,7 @@ netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h) /* Add interface. */ if (h->nlmsg_type == RTM_NEWLINK) { + unsigned long new_flags = ifi->ifi_flags & 0x0000fffff; ifp = if_lookup_by_name (name); if (ifp == NULL || !CHECK_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE)) @@ -1015,8 +1016,11 @@ netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h) if (ifp == NULL) ifp = if_get_by_name (name); + zlog_info ("interface %s index %d %s added.", + name, ifi->ifi_index, if_flag_dump(new_flags)); + set_ifindex(ifp, ifi->ifi_index); - ifp->flags = ifi->ifi_flags & 0x0000fffff; + ifp->flags = new_flags; ifp->mtu6 = ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]); ifp->metric = 1; @@ -1030,26 +1034,32 @@ netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h) ifp->mtu6 = ifp->mtu = *(int *) RTA_DATA (tb[IFLA_MTU]); ifp->metric = 1; - if (if_is_operative (ifp)) - { - ifp->flags = ifi->ifi_flags & 0x0000fffff; - if (!if_is_operative (ifp)) - if_down (ifp); + if (new_flags != ifp->flags) + { + zlog_info ("interface %s index %d changed %s.", + name, ifi->ifi_index, if_flag_dump(new_flags)); + + if (if_is_operative (ifp)) + { + ifp->flags = new_flags; + if (!if_is_operative (ifp)) + if_down (ifp); + else + /* Must notify client daemons of new interface status. */ + zebra_interface_up_update (ifp); + } else - /* Must notify client daemons of new interface status. */ - zebra_interface_up_update (ifp); - } - else - { - ifp->flags = ifi->ifi_flags & 0x0000fffff; - if (if_is_operative (ifp)) - if_up (ifp); - } + { + ifp->flags = new_flags; + if (if_is_operative (ifp)) + if_up (ifp); + } + } } } else { - // RTM_DELLINK. + // RTM_DELLINK. ifp = if_lookup_by_name (name); if (ifp == NULL) @@ -1058,6 +1068,9 @@ netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h) name); return 0; } + else + zlog_info ("interface %s index %d deleted.", + name, ifi->ifi_index); if_delete_update (ifp); } |