diff options
Diffstat (limited to 'ospf6d/ospf6_interface.c')
| -rw-r--r-- | ospf6d/ospf6_interface.c | 285 |
1 files changed, 178 insertions, 107 deletions
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c index 155374d3f0..0fb3d29e25 100644 --- a/ospf6d/ospf6_interface.c +++ b/ospf6d/ospf6_interface.c @@ -1,21 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (C) 2003 Yasuhiro Ohara - * - * This file is part of GNU Zebra. - * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include <zebra.h> @@ -24,7 +9,7 @@ #include "if.h" #include "log.h" #include "command.h" -#include "thread.h" +#include "frrevent.h" #include "prefix.h" #include "plist.h" #include "zclient.h" @@ -37,6 +22,7 @@ #include "ospf6_route.h" #include "ospf6_area.h" #include "ospf6_abr.h" +#include "ospf6_nssa.h" #include "ospf6_interface.h" #include "ospf6_neighbor.h" #include "ospf6_intra.h" @@ -49,6 +35,7 @@ #include "ospf6_proto.h" #include "lib/keychain.h" #include "ospf6_auth_trailer.h" +#include "ospf6d/ospf6_interface_clippy.c" DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_IF, "OSPF6 interface"); DEFINE_MTYPE(OSPF6D, OSPF6_AUTH_KEYCHAIN, "OSPF6 auth keychain"); @@ -216,6 +203,7 @@ struct ospf6_interface *ospf6_interface_create(struct interface *ifp) oi->priority = OSPF6_INTERFACE_PRIORITY; oi->hello_interval = OSPF_HELLO_INTERVAL_DEFAULT; + oi->gr.hello_delay.interval = OSPF_HELLO_DELAY_DEFAULT; oi->dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT; oi->rxmt_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT; oi->type = ospf6_default_iftype(ifp); @@ -274,11 +262,11 @@ void ospf6_interface_delete(struct ospf6_interface *oi) list_delete(&oi->neighbor_list); - THREAD_OFF(oi->thread_send_hello); - THREAD_OFF(oi->thread_send_lsupdate); - THREAD_OFF(oi->thread_send_lsack); - THREAD_OFF(oi->thread_sso); - THREAD_OFF(oi->thread_wait_timer); + EVENT_OFF(oi->thread_send_hello); + EVENT_OFF(oi->thread_send_lsupdate); + EVENT_OFF(oi->thread_send_lsack); + EVENT_OFF(oi->thread_sso); + EVENT_OFF(oi->thread_wait_timer); ospf6_lsdb_remove_all(oi->lsdb); ospf6_lsdb_remove_all(oi->lsupdate_list); @@ -302,6 +290,9 @@ void ospf6_interface_delete(struct ospf6_interface *oi) /* disable from area list if possible */ ospf6_area_interface_delete(oi); + if (oi->at_data.auth_key) + XFREE(MTYPE_OSPF6_AUTH_MANUAL_KEY, oi->at_data.auth_key); + /* Free BFD allocated data. */ XFREE(MTYPE_TMP, oi->bfd_config.profile); @@ -318,23 +309,26 @@ void ospf6_interface_disable(struct ospf6_interface *oi) { SET_FLAG(oi->flag, OSPF6_INTERFACE_DISABLE); - thread_execute(master, interface_down, oi, 0); + event_execute(master, interface_down, oi, 0); ospf6_lsdb_remove_all(oi->lsdb); ospf6_lsdb_remove_all(oi->lsdb_self); ospf6_lsdb_remove_all(oi->lsupdate_list); ospf6_lsdb_remove_all(oi->lsack_list); - THREAD_OFF(oi->thread_send_hello); - THREAD_OFF(oi->thread_send_lsupdate); - THREAD_OFF(oi->thread_send_lsack); - THREAD_OFF(oi->thread_sso); + EVENT_OFF(oi->thread_send_hello); + EVENT_OFF(oi->thread_send_lsupdate); + EVENT_OFF(oi->thread_send_lsack); + EVENT_OFF(oi->thread_sso); - THREAD_OFF(oi->thread_network_lsa); - THREAD_OFF(oi->thread_link_lsa); - THREAD_OFF(oi->thread_intra_prefix_lsa); - THREAD_OFF(oi->thread_as_extern_lsa); - THREAD_OFF(oi->thread_wait_timer); + EVENT_OFF(oi->thread_network_lsa); + EVENT_OFF(oi->thread_link_lsa); + EVENT_OFF(oi->thread_intra_prefix_lsa); + EVENT_OFF(oi->thread_as_extern_lsa); + EVENT_OFF(oi->thread_wait_timer); + + oi->gr.hello_delay.elapsed_seconds = 0; + EVENT_OFF(oi->gr.hello_delay.t_grace_send); } static struct in6_addr * @@ -393,9 +387,9 @@ void ospf6_interface_state_update(struct interface *ifp) if (if_is_operative(ifp) && (ospf6_interface_get_linklocal_address(oi->interface) || if_is_loopback(oi->interface))) - thread_execute(master, interface_up, oi, 0); + event_execute(master, interface_up, oi, 0); else - thread_execute(master, interface_down, oi, 0); + event_execute(master, interface_down, oi, 0); return; } @@ -522,7 +516,6 @@ static int ospf6_interface_state_change(uint8_t next_state, OSPF6_NETWORK_LSA_EXECUTE(oi); OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT(oi); OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB(oi->area); - OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT(oi); } else if (prev_state == OSPF6_INTERFACE_DR || next_state == OSPF6_INTERFACE_DR) { OSPF6_NETWORK_LSA_SCHEDULE(oi); @@ -603,6 +596,7 @@ static struct ospf6_neighbor *better_drouter(struct ospf6_neighbor *a, uint8_t dr_election(struct ospf6_interface *oi) { + struct ospf6 *ospf6 = oi->area->ospf6; struct listnode *node, *nnode; struct ospf6_neighbor *on, *drouter, *bdrouter, myself; struct ospf6_neighbor *best_drouter, *best_bdrouter; @@ -613,13 +607,12 @@ uint8_t dr_election(struct ospf6_interface *oi) /* pseudo neighbor myself, including noting current DR/BDR (1) */ memset(&myself, 0, sizeof(myself)); - inet_ntop(AF_INET, &oi->area->ospf6->router_id, myself.name, - sizeof(myself.name)); + inet_ntop(AF_INET, &ospf6->router_id, myself.name, sizeof(myself.name)); myself.state = OSPF6_NEIGHBOR_TWOWAY; myself.drouter = oi->drouter; myself.bdrouter = oi->bdrouter; myself.priority = oi->priority; - myself.router_id = oi->area->ospf6->router_id; + myself.router_id = ospf6->router_id; /* Electing BDR (2) */ for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on)) @@ -668,8 +661,10 @@ uint8_t dr_election(struct ospf6_interface *oi) /* If DR or BDR change, invoke AdjOK? for each neighbor (7) */ /* RFC 2328 section 12.4. Originating LSAs (3) will be handled accordingly after AdjOK */ - if (oi->drouter != (drouter ? drouter->router_id : htonl(0)) - || oi->bdrouter != (bdrouter ? bdrouter->router_id : htonl(0))) { + + if (oi->drouter != (drouter ? drouter->router_id : htonl(0)) || + oi->bdrouter != (bdrouter ? bdrouter->router_id : htonl(0)) || + ospf6->gr_info.restart_in_progress) { if (IS_OSPF6_DEBUG_INTERFACE) zlog_debug("DR Election on %s: DR: %s BDR: %s", oi->interface->name, @@ -680,8 +675,8 @@ uint8_t dr_election(struct ospf6_interface *oi) if (on->state < OSPF6_NEIGHBOR_TWOWAY) continue; /* Schedule AdjOK. */ - thread_add_event(master, adj_ok, on, 0, - &on->thread_adj_ok); + event_add_event(master, adj_ok, on, 0, + &on->thread_adj_ok); } } @@ -729,18 +724,18 @@ static bool ifmaddr_check(ifindex_t ifindex, struct in6_addr *addr) #endif /* __FreeBSD__ */ /* Interface State Machine */ -void interface_up(struct thread *thread) +void interface_up(struct event *thread) { struct ospf6_interface *oi; struct ospf6 *ospf6; - oi = (struct ospf6_interface *)THREAD_ARG(thread); + oi = (struct ospf6_interface *)EVENT_ARG(thread); assert(oi && oi->interface); if (!oi->type_cfg) oi->type = ospf6_default_iftype(oi->interface); - thread_cancel(&oi->thread_sso); + event_cancel(&oi->thread_sso); if (IS_OSPF6_DEBUG_INTERFACE) zlog_debug("Interface Event %s: [InterfaceUp]", @@ -781,6 +776,17 @@ void interface_up(struct thread *thread) return; } + /* + * RFC 3623 - Section 5 ("Unplanned Outages"): + * "The grace-LSAs are encapsulated in Link State Update Packets + * and sent out to all interfaces, even though the restarted + * router has no adjacencies and no knowledge of previous + * adjacencies". + */ + if (oi->area->ospf6->gr_info.restart_in_progress && + oi->area->ospf6->gr_info.reason == OSPF6_GR_UNKNOWN_RESTART) + ospf6_gr_unplanned_start_interface(oi); + #ifdef __FreeBSD__ /* * There's a delay in FreeBSD between issuing a command to leave a @@ -794,9 +800,8 @@ void interface_up(struct thread *thread) zlog_info( "Interface %s is still in all routers group, rescheduling for SSO", oi->interface->name); - thread_add_timer(master, interface_up, oi, - OSPF6_INTERFACE_SSO_RETRY_INT, - &oi->thread_sso); + event_add_timer(master, interface_up, oi, + OSPF6_INTERFACE_SSO_RETRY_INT, &oi->thread_sso); return; } #endif /* __FreeBSD__ */ @@ -811,9 +816,9 @@ void interface_up(struct thread *thread) zlog_info( "Scheduling %s for sso retry, trial count: %d", oi->interface->name, oi->sso_try_cnt); - thread_add_timer(master, interface_up, oi, - OSPF6_INTERFACE_SSO_RETRY_INT, - &oi->thread_sso); + event_add_timer(master, interface_up, oi, + OSPF6_INTERFACE_SSO_RETRY_INT, + &oi->thread_sso); } return; } @@ -825,8 +830,8 @@ void interface_up(struct thread *thread) /* Schedule Hello */ if (!CHECK_FLAG(oi->flag, OSPF6_INTERFACE_PASSIVE) && !if_is_loopback(oi->interface)) { - thread_add_timer(master, ospf6_hello_send, oi, 0, - &oi->thread_send_hello); + event_add_timer(master, ospf6_hello_send, oi, 0, + &oi->thread_send_hello); } /* decide next interface state */ @@ -838,16 +843,16 @@ void interface_up(struct thread *thread) ospf6_interface_state_change(OSPF6_INTERFACE_DROTHER, oi); else { ospf6_interface_state_change(OSPF6_INTERFACE_WAITING, oi); - thread_add_timer(master, wait_timer, oi, oi->dead_interval, - &oi->thread_wait_timer); + event_add_timer(master, wait_timer, oi, oi->dead_interval, + &oi->thread_wait_timer); } } -void wait_timer(struct thread *thread) +void wait_timer(struct event *thread) { struct ospf6_interface *oi; - oi = (struct ospf6_interface *)THREAD_ARG(thread); + oi = (struct ospf6_interface *)EVENT_ARG(thread); assert(oi && oi->interface); if (IS_OSPF6_DEBUG_INTERFACE) @@ -858,11 +863,11 @@ void wait_timer(struct thread *thread) ospf6_interface_state_change(dr_election(oi), oi); } -void backup_seen(struct thread *thread) +void backup_seen(struct event *thread) { struct ospf6_interface *oi; - oi = (struct ospf6_interface *)THREAD_ARG(thread); + oi = (struct ospf6_interface *)EVENT_ARG(thread); assert(oi && oi->interface); if (IS_OSPF6_DEBUG_INTERFACE) @@ -873,11 +878,11 @@ void backup_seen(struct thread *thread) ospf6_interface_state_change(dr_election(oi), oi); } -void neighbor_change(struct thread *thread) +void neighbor_change(struct event *thread) { struct ospf6_interface *oi; - oi = (struct ospf6_interface *)THREAD_ARG(thread); + oi = (struct ospf6_interface *)EVENT_ARG(thread); assert(oi && oi->interface); if (IS_OSPF6_DEBUG_INTERFACE) @@ -890,14 +895,14 @@ void neighbor_change(struct thread *thread) ospf6_interface_state_change(dr_election(oi), oi); } -void interface_down(struct thread *thread) +void interface_down(struct event *thread) { struct ospf6_interface *oi; struct listnode *node, *nnode; struct ospf6_neighbor *on; struct ospf6 *ospf6; - oi = (struct ospf6_interface *)THREAD_ARG(thread); + oi = (struct ospf6_interface *)EVENT_ARG(thread); assert(oi && oi->interface); if (IS_OSPF6_DEBUG_INTERFACE) @@ -905,10 +910,10 @@ void interface_down(struct thread *thread) oi->interface->name); /* Stop Hellos */ - THREAD_OFF(oi->thread_send_hello); + EVENT_OFF(oi->thread_send_hello); /* Stop trying to set socket options. */ - THREAD_OFF(oi->thread_sso); + EVENT_OFF(oi->thread_sso); /* Cease the HELPER role for all the neighbours * of this interface. @@ -945,7 +950,7 @@ void interface_down(struct thread *thread) if (oi->on_write_q) { listnode_delete(ospf6->oi_write_q, oi); if (list_isempty(ospf6->oi_write_q)) - thread_cancel(&ospf6->t_write); + event_cancel(&ospf6->t_write); oi->on_write_q = 0; } @@ -1116,14 +1121,21 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, oi->dead_interval); json_object_int_add(json_obj, "timerIntervalsConfigRetransmit", oi->rxmt_interval); + json_object_boolean_add( + json_obj, "timerPassiveIface", + !!CHECK_FLAG(oi->flag, OSPF6_INTERFACE_PASSIVE)); } else { vty_out(vty, " State %s, Transmit Delay %d sec, Priority %d\n", ospf6_interface_state_str[oi->state], oi->transdelay, oi->priority); vty_out(vty, " Timer intervals configured:\n"); - vty_out(vty, " Hello %d(%pTHd), Dead %d, Retransmit %d\n", - oi->hello_interval, oi->thread_send_hello, - oi->dead_interval, oi->rxmt_interval); + if (!CHECK_FLAG(oi->flag, OSPF6_INTERFACE_PASSIVE)) + vty_out(vty, + " Hello %d(%pTHd), Dead %d, Retransmit %d\n", + oi->hello_interval, oi->thread_send_hello, + oi->dead_interval, oi->rxmt_interval); + else + vty_out(vty, " No Hellos (Passive interface)\n"); } inet_ntop(AF_INET, &oi->drouter, drouter, sizeof(drouter)); @@ -1143,7 +1155,7 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, if (use_json) { timerclear(&res); - if (thread_is_scheduled(oi->thread_send_lsupdate)) + if (event_is_scheduled(oi->thread_send_lsupdate)) timersub(&oi->thread_send_lsupdate->u.sands, &now, &res); timerstring(&res, duration, sizeof(duration)); @@ -1153,9 +1165,8 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, duration); json_object_string_add( json_obj, "lsUpdateSendThread", - (thread_is_scheduled(oi->thread_send_lsupdate) - ? "on" - : "off")); + (event_is_scheduled(oi->thread_send_lsupdate) ? "on" + : "off")); json_arr = json_object_new_array(); for (ALL_LSDB(oi->lsupdate_list, lsa, lsanext)) @@ -1165,7 +1176,7 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, json_arr); timerclear(&res); - if (thread_is_scheduled(oi->thread_send_lsack)) + if (event_is_scheduled(oi->thread_send_lsack)) timersub(&oi->thread_send_lsack->u.sands, &now, &res); timerstring(&res, duration, sizeof(duration)); @@ -1175,8 +1186,8 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, duration); json_object_string_add( json_obj, "lsAckSendThread", - (thread_is_scheduled(oi->thread_send_lsack) ? "on" - : "off")); + (event_is_scheduled(oi->thread_send_lsack) ? "on" + : "off")); json_arr = json_object_new_array(); for (ALL_LSDB(oi->lsack_list, lsa, lsanext)) @@ -1184,32 +1195,38 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, json_arr, json_object_new_string(lsa->name)); json_object_object_add(json_obj, "pendingLsaLsAck", json_arr); + if (oi->gr.hello_delay.interval != 0) + json_object_int_add(json_obj, "grHelloDelaySecs", + oi->gr.hello_delay.interval); } else { timerclear(&res); - if (thread_is_scheduled(oi->thread_send_lsupdate)) + if (event_is_scheduled(oi->thread_send_lsupdate)) timersub(&oi->thread_send_lsupdate->u.sands, &now, &res); timerstring(&res, duration, sizeof(duration)); vty_out(vty, " %d Pending LSAs for LSUpdate in Time %s [thread %s]\n", oi->lsupdate_list->count, duration, - (thread_is_scheduled(oi->thread_send_lsupdate) - ? "on" - : "off")); + (event_is_scheduled(oi->thread_send_lsupdate) ? "on" + : "off")); for (ALL_LSDB(oi->lsupdate_list, lsa, lsanext)) vty_out(vty, " %s\n", lsa->name); timerclear(&res); - if (thread_is_scheduled(oi->thread_send_lsack)) + if (event_is_scheduled(oi->thread_send_lsack)) timersub(&oi->thread_send_lsack->u.sands, &now, &res); timerstring(&res, duration, sizeof(duration)); vty_out(vty, " %d Pending LSAs for LSAck in Time %s [thread %s]\n", oi->lsack_list->count, duration, - (thread_is_scheduled(oi->thread_send_lsack) ? "on" - : "off")); + (event_is_scheduled(oi->thread_send_lsack) ? "on" + : "off")); for (ALL_LSDB(oi->lsack_list, lsa, lsanext)) vty_out(vty, " %s\n", lsa->name); + + if (oi->gr.hello_delay.interval != 0) + vty_out(vty, " Graceful Restart hello delay: %us\n", + oi->gr.hello_delay.interval); } /* BFD specific. */ @@ -1234,7 +1251,8 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp, } } - json_auth = json_object_new_object(); + if (use_json) + json_auth = json_object_new_object(); if (oi->at_data.flags != 0) { if (use_json) { if (CHECK_FLAG(oi->at_data.flags, @@ -1736,8 +1754,10 @@ void ospf6_interface_start(struct ospf6_interface *oi) ospf6_interface_enable(oi); /* If the router is ABR, originate summary routes */ - if (ospf6_check_and_set_router_abr(ospf6)) + if (ospf6_check_and_set_router_abr(ospf6)) { ospf6_abr_enable_area(oa); + ospf6_schedule_abr_task(ospf6); + } } void ospf6_interface_stop(struct ospf6_interface *oi) @@ -1878,8 +1898,8 @@ DEFUN (ipv6_ospf6_ifmtu, /* re-establish adjacencies */ for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on)) { - THREAD_OFF(on->inactivity_timer); - thread_add_event(master, inactivity_timer, on, 0, NULL); + EVENT_OFF(on->inactivity_timer); + event_add_event(master, inactivity_timer, on, 0, NULL); } return CMD_SUCCESS; @@ -1924,8 +1944,8 @@ DEFUN (no_ipv6_ospf6_ifmtu, /* re-establish adjacencies */ for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on)) { - THREAD_OFF(on->inactivity_timer); - thread_add_event(master, inactivity_timer, on, 0, NULL); + EVENT_OFF(on->inactivity_timer); + event_add_event(master, inactivity_timer, on, 0, NULL); } return CMD_SUCCESS; @@ -2107,11 +2127,11 @@ DEFUN (ipv6_ospf6_hellointerval, /* * If the thread is scheduled, send the new hello now. */ - if (thread_is_scheduled(oi->thread_send_hello)) { - THREAD_OFF(oi->thread_send_hello); + if (event_is_scheduled(oi->thread_send_hello)) { + EVENT_OFF(oi->thread_send_hello); - thread_add_timer(master, ospf6_hello_send, oi, 0, - &oi->thread_send_hello); + event_add_timer(master, ospf6_hello_send, oi, 0, + &oi->thread_send_hello); } return CMD_SUCCESS; } @@ -2159,6 +2179,50 @@ ALIAS (ipv6_ospf6_deadinterval, "Interval time after which a neighbor is declared down\n" SECONDS_STR) +DEFPY(ipv6_ospf6_gr_hdelay, ipv6_ospf6_gr_hdelay_cmd, + "ipv6 ospf6 graceful-restart hello-delay (1-1800)", + IP6_STR + OSPF6_STR + "Graceful Restart parameters\n" + "Delay the sending of the first hello packets.\n" + "Delay in seconds\n") +{ + VTY_DECLVAR_CONTEXT(interface, ifp); + struct ospf6_interface *oi; + + oi = ifp->info; + if (oi == NULL) + oi = ospf6_interface_create(ifp); + + /* Note: new or updated value won't affect ongoing graceful restart. */ + oi->gr.hello_delay.interval = hello_delay; + + return CMD_SUCCESS; +} + +DEFPY(no_ipv6_ospf6_gr_hdelay, no_ipv6_ospf6_gr_hdelay_cmd, + "no ipv6 ospf6 graceful-restart hello-delay [(1-1800)]", + NO_STR + IP6_STR + OSPF6_STR + "Graceful Restart parameters\n" + "Delay the sending of the first hello packets.\n" + "Delay in seconds\n") +{ + VTY_DECLVAR_CONTEXT(interface, ifp); + struct ospf6_interface *oi; + + oi = ifp->info; + if (oi == NULL) + oi = ospf6_interface_create(ifp); + + oi->gr.hello_delay.interval = OSPF_HELLO_DELAY_DEFAULT; + oi->gr.hello_delay.elapsed_seconds = 0; + EVENT_OFF(oi->gr.hello_delay.t_grace_send); + + return CMD_SUCCESS; +} + /* interface variable set command */ DEFUN (ipv6_ospf6_transmitdelay, ipv6_ospf6_transmitdelay_cmd, @@ -2324,12 +2388,12 @@ DEFUN (ipv6_ospf6_passive, assert(oi); SET_FLAG(oi->flag, OSPF6_INTERFACE_PASSIVE); - THREAD_OFF(oi->thread_send_hello); - THREAD_OFF(oi->thread_sso); + EVENT_OFF(oi->thread_send_hello); + EVENT_OFF(oi->thread_sso); for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on)) { - THREAD_OFF(on->inactivity_timer); - thread_add_event(master, inactivity_timer, on, 0, NULL); + EVENT_OFF(on->inactivity_timer); + event_add_event(master, inactivity_timer, on, 0, NULL); } return CMD_SUCCESS; @@ -2354,13 +2418,13 @@ DEFUN (no_ipv6_ospf6_passive, assert(oi); UNSET_FLAG(oi->flag, OSPF6_INTERFACE_PASSIVE); - THREAD_OFF(oi->thread_send_hello); - THREAD_OFF(oi->thread_sso); + EVENT_OFF(oi->thread_send_hello); + EVENT_OFF(oi->thread_sso); /* don't send hellos over loopback interface */ if (!if_is_loopback(oi->interface)) - thread_add_timer(master, ospf6_hello_send, oi, 0, - &oi->thread_send_hello); + event_add_timer(master, ospf6_hello_send, oi, 0, + &oi->thread_send_hello); return CMD_SUCCESS; } @@ -2520,8 +2584,8 @@ DEFUN (ipv6_ospf6_network, } /* Reset the interface */ - thread_execute(master, interface_down, oi, 0); - thread_execute(master, interface_up, oi, 0); + event_execute(master, interface_down, oi, 0); + event_execute(master, interface_up, oi, 0); return CMD_SUCCESS; } @@ -2556,8 +2620,8 @@ DEFUN (no_ipv6_ospf6_network, oi->type = type; /* Reset the interface */ - thread_execute(master, interface_down, oi, 0); - thread_execute(master, interface_up, oi, 0); + event_execute(master, interface_down, oi, 0); + event_execute(master, interface_up, oi, 0); return CMD_SUCCESS; } @@ -2626,6 +2690,11 @@ static int config_write_ospf6_interface(struct vty *vty, struct vrf *vrf) else if (oi->type_cfg && oi->type == OSPF_IFTYPE_BROADCAST) vty_out(vty, " ipv6 ospf6 network broadcast\n"); + if (oi->gr.hello_delay.interval != OSPF_HELLO_DELAY_DEFAULT) + vty_out(vty, + " ipv6 ospf6 graceful-restart hello-delay %u\n", + oi->gr.hello_delay.interval); + ospf6_bfd_write_config(vty, oi); ospf6_auth_write_config(vty, &oi->at_data); @@ -2724,12 +2793,14 @@ void ospf6_interface_init(void) install_element(INTERFACE_NODE, &ipv6_ospf6_deadinterval_cmd); install_element(INTERFACE_NODE, &ipv6_ospf6_hellointerval_cmd); + install_element(INTERFACE_NODE, &ipv6_ospf6_gr_hdelay_cmd); install_element(INTERFACE_NODE, &ipv6_ospf6_priority_cmd); install_element(INTERFACE_NODE, &ipv6_ospf6_retransmitinterval_cmd); install_element(INTERFACE_NODE, &ipv6_ospf6_transmitdelay_cmd); install_element(INTERFACE_NODE, &ipv6_ospf6_instance_cmd); install_element(INTERFACE_NODE, &no_ipv6_ospf6_deadinterval_cmd); install_element(INTERFACE_NODE, &no_ipv6_ospf6_hellointerval_cmd); + install_element(INTERFACE_NODE, &no_ipv6_ospf6_gr_hdelay_cmd); install_element(INTERFACE_NODE, &no_ipv6_ospf6_priority_cmd); install_element(INTERFACE_NODE, &no_ipv6_ospf6_retransmitinterval_cmd); install_element(INTERFACE_NODE, &no_ipv6_ospf6_transmitdelay_cmd); @@ -2773,8 +2844,8 @@ void ospf6_interface_clear(struct interface *ifp) zlog_debug("Interface %s: clear by reset", ifp->name); /* Reset the interface */ - thread_execute(master, interface_down, oi, 0); - thread_execute(master, interface_up, oi, 0); + event_execute(master, interface_down, oi, 0); + event_execute(master, interface_up, oi, 0); } /* Clear interface */ |
