mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-09 07:07:18 +00:00
Merge pull request #7703 from volta-networks/fix_ldpsync_remove_hello
ldpd, isisd, ospfd: Remove periodic ldp-sync hello message
This commit is contained in:
commit
6f4249f9b7
@ -122,7 +122,6 @@ int isis_ldp_sync_announce_update(struct ldp_igp_sync_announce announce)
|
||||
/* LDP just started up:
|
||||
* set cost to LSInfinity
|
||||
* send request to LDP for LDP-SYNC state for each interface
|
||||
* start hello timer
|
||||
*/
|
||||
vrf = vrf_lookup_by_id(VRF_DEFAULT);
|
||||
FOR_ALL_INTERFACES (vrf, ifp) {
|
||||
@ -135,62 +134,6 @@ int isis_ldp_sync_announce_update(struct ldp_igp_sync_announce announce)
|
||||
}
|
||||
}
|
||||
|
||||
THREAD_OFF(isis->ldp_sync_cmd.t_hello);
|
||||
|
||||
isis->ldp_sync_cmd.sequence = 0;
|
||||
isis_ldp_sync_hello_timer_add();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int isis_ldp_sync_hello_update(struct ldp_igp_sync_hello hello)
|
||||
{
|
||||
struct isis_area *area;
|
||||
struct listnode *node;
|
||||
struct vrf *vrf;
|
||||
struct interface *ifp;
|
||||
struct isis_circuit *circuit;
|
||||
struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
|
||||
|
||||
/* if isis is not enabled or LDP-SYNC is not configured ignore */
|
||||
if (!isis ||
|
||||
!CHECK_FLAG(isis->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE))
|
||||
return 0;
|
||||
|
||||
if (hello.proto != ZEBRA_ROUTE_LDP)
|
||||
return 0;
|
||||
|
||||
/* Received Hello from LDP:
|
||||
* if current sequence number is greater than received hello
|
||||
* sequence number then assume LDP restarted
|
||||
* set cost to LSInfinity
|
||||
* send request to LDP for LDP-SYNC state for each interface
|
||||
* else all is fine just restart hello timer
|
||||
*/
|
||||
if (hello.sequence == 0)
|
||||
/* rolled over */
|
||||
isis->ldp_sync_cmd.sequence = 0;
|
||||
|
||||
if (isis->ldp_sync_cmd.sequence > hello.sequence) {
|
||||
zlog_err("ldp_sync: LDP restarted");
|
||||
|
||||
vrf = vrf_lookup_by_id(VRF_DEFAULT);
|
||||
FOR_ALL_INTERFACES (vrf, ifp) {
|
||||
for (ALL_LIST_ELEMENTS_RO(isis->area_list, node,
|
||||
area)) {
|
||||
circuit = circuit_lookup_by_ifp(ifp,
|
||||
area->circuit_list);
|
||||
if (circuit == NULL)
|
||||
continue;
|
||||
isis_ldp_sync_if_start(circuit, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
THREAD_OFF(isis->ldp_sync_cmd.t_hello);
|
||||
isis_ldp_sync_hello_timer_add();
|
||||
}
|
||||
isis->ldp_sync_cmd.sequence = hello.sequence;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -559,58 +502,6 @@ void isis_ldp_sync_handle_client_close(struct zapi_client_close_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* LDP-SYNC hello timer routines
|
||||
*/
|
||||
static int isis_ldp_sync_hello_timer(struct thread *thread)
|
||||
{
|
||||
struct isis_area *area;
|
||||
struct listnode *node;
|
||||
struct isis_circuit *circuit;
|
||||
struct interface *ifp;
|
||||
struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
|
||||
struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
|
||||
|
||||
if (!isis)
|
||||
return 0;
|
||||
|
||||
/* hello timer expired:
|
||||
* didn't receive hello msg from LDP
|
||||
* set cost of all interfaces to LSInfinity
|
||||
*/
|
||||
FOR_ALL_INTERFACES (vrf, ifp) {
|
||||
for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) {
|
||||
circuit = circuit_lookup_by_ifp(ifp,
|
||||
area->circuit_list);
|
||||
if (circuit == NULL)
|
||||
continue;
|
||||
|
||||
isis_ldp_sync_ldp_fail(circuit);
|
||||
}
|
||||
}
|
||||
|
||||
zlog_debug("ldp_sync: hello timer expired, LDP down");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void isis_ldp_sync_hello_timer_add(void)
|
||||
{
|
||||
struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
|
||||
|
||||
/* Start hello timer:
|
||||
* this timer is used to make sure LDP is up
|
||||
* if expires set interface cost to LSInfinity
|
||||
*/
|
||||
if (!isis ||
|
||||
!CHECK_FLAG(isis->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE))
|
||||
return;
|
||||
|
||||
thread_add_timer(master, isis_ldp_sync_hello_timer,
|
||||
NULL, LDP_IGP_SYNC_HELLO_TIMEOUT,
|
||||
&isis->ldp_sync_cmd.t_hello);
|
||||
}
|
||||
|
||||
/*
|
||||
* LDP-SYNC routes used by set commands.
|
||||
*/
|
||||
@ -699,13 +590,11 @@ void isis_ldp_sync_gbl_exit(bool remove)
|
||||
LDP_IGP_SYNC_IF_STATE_UPDATE);
|
||||
zclient_unregister_opaque(zclient,
|
||||
LDP_IGP_SYNC_ANNOUNCE_UPDATE);
|
||||
zclient_unregister_opaque(zclient, LDP_IGP_SYNC_HELLO_UPDATE);
|
||||
|
||||
/* disable LDP-SYNC globally */
|
||||
UNSET_FLAG(isis->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE);
|
||||
UNSET_FLAG(isis->ldp_sync_cmd.flags, LDP_SYNC_FLAG_HOLDDOWN);
|
||||
isis->ldp_sync_cmd.holddown = LDP_IGP_SYNC_HOLDDOWN_DEFAULT;
|
||||
THREAD_OFF(isis->ldp_sync_cmd.t_hello);
|
||||
|
||||
/* remove LDP-SYNC on all ISIS interfaces */
|
||||
FOR_ALL_INTERFACES (vrf, ifp) {
|
||||
|
@ -40,11 +40,9 @@ extern void isis_ldp_sync_if_complete(struct isis_circuit *circuit);
|
||||
extern void isis_ldp_sync_holddown_timer_add(struct isis_circuit *circuit);
|
||||
extern void
|
||||
isis_ldp_sync_handle_client_close(struct zapi_client_close_info *info);
|
||||
extern void isis_ldp_sync_hello_timer_add(void);
|
||||
extern void isis_ldp_sync_ldp_fail(struct isis_circuit *circuit);
|
||||
extern int isis_ldp_sync_state_update(struct ldp_igp_sync_if_state state);
|
||||
extern int isis_ldp_sync_announce_update(struct ldp_igp_sync_announce announce);
|
||||
extern int isis_ldp_sync_hello_update(struct ldp_igp_sync_hello hello);
|
||||
extern void isis_ldp_sync_state_req_msg(struct isis_circuit *circuit);
|
||||
extern void isis_ldp_sync_set_if_metric(struct isis_circuit *circuit,
|
||||
bool run_regen);
|
||||
|
@ -2305,7 +2305,6 @@ int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args)
|
||||
/* register with opaque client to recv LDP-IGP Sync msgs */
|
||||
zclient_register_opaque(zclient, LDP_IGP_SYNC_IF_STATE_UPDATE);
|
||||
zclient_register_opaque(zclient, LDP_IGP_SYNC_ANNOUNCE_UPDATE);
|
||||
zclient_register_opaque(zclient, LDP_IGP_SYNC_HELLO_UPDATE);
|
||||
|
||||
if (!CHECK_FLAG(isis->ldp_sync_cmd.flags,
|
||||
LDP_SYNC_FLAG_ENABLE)) {
|
||||
|
@ -670,7 +670,6 @@ static int isis_opaque_msg_handler(ZAPI_CALLBACK_ARGS)
|
||||
struct zapi_opaque_msg info;
|
||||
struct ldp_igp_sync_if_state state;
|
||||
struct ldp_igp_sync_announce announce;
|
||||
struct ldp_igp_sync_hello hello;
|
||||
int ret = 0;
|
||||
|
||||
s = zclient->ibuf;
|
||||
@ -686,10 +685,6 @@ static int isis_opaque_msg_handler(ZAPI_CALLBACK_ARGS)
|
||||
STREAM_GET(&announce, s, sizeof(announce));
|
||||
ret = isis_ldp_sync_announce_update(announce);
|
||||
break;
|
||||
case LDP_IGP_SYNC_HELLO_UPDATE:
|
||||
STREAM_GET(&hello, s, sizeof(hello));
|
||||
ret = isis_ldp_sync_hello_update(hello);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -51,8 +51,6 @@ static void ldp_zebra_opaque_register(void);
|
||||
static void ldp_zebra_opaque_unregister(void);
|
||||
static int ldp_sync_zebra_send_announce(void);
|
||||
static int ldp_zebra_opaque_msg_handler(ZAPI_CALLBACK_ARGS);
|
||||
static void ldp_sync_zebra_start_hello_timer(void);
|
||||
static int ldp_sync_zebra_hello(struct thread *thread);
|
||||
static void ldp_sync_zebra_init(void);
|
||||
|
||||
static struct zclient *zclient;
|
||||
@ -175,40 +173,12 @@ stream_failure:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ldp_sync_zebra_start_hello_timer(void)
|
||||
{
|
||||
thread_add_timer_msec(master, ldp_sync_zebra_hello, NULL, 250, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
ldp_sync_zebra_hello(struct thread *thread)
|
||||
{
|
||||
static unsigned int sequence = 0;
|
||||
struct ldp_igp_sync_hello hello;
|
||||
|
||||
sequence++;
|
||||
|
||||
hello.proto = ZEBRA_ROUTE_LDP;
|
||||
hello.sequence = sequence;
|
||||
|
||||
zclient_send_opaque(zclient, LDP_IGP_SYNC_HELLO_UPDATE,
|
||||
(const uint8_t *) &hello, sizeof(hello));
|
||||
|
||||
ldp_sync_zebra_start_hello_timer();
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
ldp_sync_zebra_init(void)
|
||||
{
|
||||
ldp_sync_zebra_send_announce();
|
||||
|
||||
ldp_sync_zebra_start_hello_timer();
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
ldp_zebra_send_mpls_labels(int cmd, struct kroute *kr)
|
||||
{
|
||||
|
@ -39,14 +39,10 @@ extern "C" {
|
||||
|
||||
#define LDP_IGP_SYNC_HOLDDOWN_DEFAULT 0
|
||||
|
||||
#define LDP_IGP_SYNC_HELLO_TIMEOUT 5
|
||||
|
||||
/* LDP-IGP Sync structures */
|
||||
struct ldp_sync_info_cmd {
|
||||
uint16_t flags;
|
||||
uint16_t holddown; /* timer value */
|
||||
uint32_t sequence; /* hello sequence number */
|
||||
struct thread *t_hello; /* hello timer for detecting LDP going down */
|
||||
};
|
||||
|
||||
struct ldp_sync_info {
|
||||
@ -79,11 +75,6 @@ struct ldp_igp_sync_if_state_req {
|
||||
char name[INTERFACE_NAMSIZ];
|
||||
};
|
||||
|
||||
struct ldp_igp_sync_hello {
|
||||
int proto;
|
||||
unsigned int sequence;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -1085,8 +1085,6 @@ enum zapi_opaque_registry {
|
||||
LDP_IGP_SYNC_IF_STATE_UPDATE = 4,
|
||||
/* Announce that LDP is up */
|
||||
LDP_IGP_SYNC_ANNOUNCE_UPDATE = 5,
|
||||
/* Heartbeat indicating that LDP is running */
|
||||
LDP_IGP_SYNC_HELLO_UPDATE = 6,
|
||||
};
|
||||
|
||||
/* Send the hello message.
|
||||
|
@ -93,57 +93,11 @@ int ospf_ldp_sync_announce_update(struct ldp_igp_sync_announce announce)
|
||||
/* LDP just started up:
|
||||
* set cost to LSInfinity
|
||||
* send request to LDP for LDP-SYNC state for each interface
|
||||
* start hello timer
|
||||
*/
|
||||
vrf = vrf_lookup_by_id(ospf->vrf_id);
|
||||
FOR_ALL_INTERFACES (vrf, ifp)
|
||||
ospf_ldp_sync_if_start(ifp, true);
|
||||
|
||||
THREAD_OFF(ospf->ldp_sync_cmd.t_hello);
|
||||
ospf->ldp_sync_cmd.sequence = 0;
|
||||
ospf_ldp_sync_hello_timer_add(ospf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ospf_ldp_sync_hello_update(struct ldp_igp_sync_hello hello)
|
||||
{
|
||||
struct ospf *ospf;
|
||||
struct vrf *vrf;
|
||||
struct interface *ifp;
|
||||
|
||||
/* if ospf is not enabled or LDP-SYNC is not configured ignore */
|
||||
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
||||
if (ospf == NULL ||
|
||||
!CHECK_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE))
|
||||
return 0;
|
||||
|
||||
if (hello.proto != ZEBRA_ROUTE_LDP)
|
||||
return 0;
|
||||
|
||||
/* Received Hello from LDP:
|
||||
* if current sequence number is greater than received hello
|
||||
* sequence number then assume LDP restarted
|
||||
* set cost to LSInfinity
|
||||
* send request to LDP for LDP-SYNC state for each interface
|
||||
* else all is fine just restart hello timer
|
||||
*/
|
||||
if (hello.sequence == 0)
|
||||
/* rolled over */
|
||||
ospf->ldp_sync_cmd.sequence = 0;
|
||||
|
||||
if (ospf->ldp_sync_cmd.sequence > hello.sequence) {
|
||||
zlog_err("ldp_sync: LDP restarted");
|
||||
|
||||
vrf = vrf_lookup_by_id(ospf->vrf_id);
|
||||
FOR_ALL_INTERFACES (vrf, ifp)
|
||||
ospf_ldp_sync_if_start(ifp, true);
|
||||
} else {
|
||||
THREAD_OFF(ospf->ldp_sync_cmd.t_hello);
|
||||
ospf_ldp_sync_hello_timer_add(ospf);
|
||||
}
|
||||
ospf->ldp_sync_cmd.sequence = hello.sequence;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -447,46 +401,6 @@ void ospf_ldp_sync_holddown_timer_add(struct interface *ifp)
|
||||
&ldp_sync_info->t_holddown);
|
||||
}
|
||||
|
||||
/*
|
||||
* LDP-SYNC hello timer routines
|
||||
*/
|
||||
static int ospf_ldp_sync_hello_timer(struct thread *thread)
|
||||
{
|
||||
struct ospf *ospf;
|
||||
struct vrf *vrf;
|
||||
struct interface *ifp;
|
||||
|
||||
/* hello timer expired:
|
||||
* didn't receive hello msg from LDP
|
||||
* set cost of all interfaces to LSInfinity
|
||||
*/
|
||||
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
||||
if (ospf) {
|
||||
vrf = vrf_lookup_by_id(ospf->vrf_id);
|
||||
|
||||
FOR_ALL_INTERFACES (vrf, ifp)
|
||||
ospf_ldp_sync_ldp_fail(ifp);
|
||||
|
||||
zlog_err("ldp_sync: hello timer expired, LDP down");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ospf_ldp_sync_hello_timer_add(struct ospf *ospf)
|
||||
{
|
||||
|
||||
/* Start hello timer:
|
||||
* this timer is used to make sure LDP is up
|
||||
* if expires set interface cost to LSInfinity
|
||||
*/
|
||||
if (!CHECK_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE))
|
||||
return;
|
||||
|
||||
thread_add_timer(master, ospf_ldp_sync_hello_timer,
|
||||
NULL, LDP_IGP_SYNC_HELLO_TIMEOUT,
|
||||
&ospf->ldp_sync_cmd.t_hello);
|
||||
}
|
||||
|
||||
/*
|
||||
* LDP-SYNC exit routes.
|
||||
*/
|
||||
@ -496,7 +410,6 @@ void ospf_ldp_sync_gbl_exit(struct ospf *ospf, bool remove)
|
||||
struct vrf *vrf;
|
||||
|
||||
/* ospf is being removed
|
||||
* stop hello timer
|
||||
* stop any holddown timers
|
||||
*/
|
||||
if (CHECK_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE)) {
|
||||
@ -505,15 +418,12 @@ void ospf_ldp_sync_gbl_exit(struct ospf *ospf, bool remove)
|
||||
LDP_IGP_SYNC_IF_STATE_UPDATE);
|
||||
zclient_unregister_opaque(zclient,
|
||||
LDP_IGP_SYNC_ANNOUNCE_UPDATE);
|
||||
zclient_unregister_opaque(zclient, LDP_IGP_SYNC_HELLO_UPDATE);
|
||||
|
||||
/* disable LDP globally */
|
||||
UNSET_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE);
|
||||
UNSET_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_HOLDDOWN);
|
||||
ospf->ldp_sync_cmd.holddown = LDP_IGP_SYNC_HOLDDOWN_DEFAULT;
|
||||
|
||||
THREAD_OFF(ospf->ldp_sync_cmd.t_hello);
|
||||
|
||||
/* turn off LDP-IGP Sync on all OSPF interfaces */
|
||||
vrf = vrf_lookup_by_id(ospf->vrf_id);
|
||||
FOR_ALL_INTERFACES (vrf, ifp)
|
||||
@ -856,7 +766,6 @@ DEFPY (ospf_mpls_ldp_sync,
|
||||
/* register with opaque client to recv LDP-IGP Sync msgs */
|
||||
zclient_register_opaque(zclient, LDP_IGP_SYNC_IF_STATE_UPDATE);
|
||||
zclient_register_opaque(zclient, LDP_IGP_SYNC_ANNOUNCE_UPDATE);
|
||||
zclient_register_opaque(zclient, LDP_IGP_SYNC_HELLO_UPDATE);
|
||||
|
||||
if (!CHECK_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE)) {
|
||||
SET_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE);
|
||||
|
@ -40,7 +40,6 @@ extern void ospf_ldp_sync_if_remove(struct interface *ifp, bool remove);
|
||||
extern void ospf_ldp_sync_if_down(struct interface *ifp);
|
||||
extern void ospf_ldp_sync_if_complete(struct interface *ifp);
|
||||
extern void ospf_ldp_sync_holddown_timer_add(struct interface *ifp);
|
||||
extern void ospf_ldp_sync_hello_timer_add(struct ospf *ospf);
|
||||
extern void ospf_ldp_sync_ldp_fail(struct interface *ifp);
|
||||
extern void ospf_ldp_sync_show_info(struct vty *vty, struct ospf *ospf,
|
||||
json_object *json_vrf, bool use_json);
|
||||
@ -49,7 +48,6 @@ extern void ospf_ldp_sync_if_write_config(struct vty *vty,
|
||||
struct ospf_if_params *params);
|
||||
extern int ospf_ldp_sync_state_update(struct ldp_igp_sync_if_state state);
|
||||
extern int ospf_ldp_sync_announce_update(struct ldp_igp_sync_announce announce);
|
||||
extern int ospf_ldp_sync_hello_update(struct ldp_igp_sync_hello hello);
|
||||
extern void
|
||||
ospf_ldp_sync_handle_client_close(struct zapi_client_close_info *info);
|
||||
extern void ospf_ldp_sync_state_req_msg(struct interface *ifp);
|
||||
|
@ -1956,7 +1956,6 @@ static int ospf_opaque_msg_handler(ZAPI_CALLBACK_ARGS)
|
||||
struct zapi_opaque_msg info;
|
||||
struct ldp_igp_sync_if_state state;
|
||||
struct ldp_igp_sync_announce announce;
|
||||
struct ldp_igp_sync_hello hello;
|
||||
int ret = 0;
|
||||
|
||||
s = zclient->ibuf;
|
||||
@ -1973,10 +1972,6 @@ static int ospf_opaque_msg_handler(ZAPI_CALLBACK_ARGS)
|
||||
STREAM_GET(&announce, s, sizeof(announce));
|
||||
ret = ospf_ldp_sync_announce_update(announce);
|
||||
break;
|
||||
case LDP_IGP_SYNC_HELLO_UPDATE:
|
||||
STREAM_GET(&hello, s, sizeof(hello));
|
||||
ret = ospf_ldp_sync_hello_update(hello);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user