ospfd: ospf GR helper data structure definitions.

Description:
	Graceful restart helper support specific data structure
	changes.

Signed-off-by: Rajesh Girada <rgirada@vmware.com>
This commit is contained in:
rgirada 2020-08-21 04:46:56 -07:00
parent cc1a92d806
commit f96f271366
4 changed files with 198 additions and 2 deletions

View File

@ -62,6 +62,9 @@
#define OSPF_DEBUG_DEFAULTINFO 0x20
#define OSPF_DEBUG_LDP_SYNC 0x40
#define OSPF_DEBUG_GR_HELPER 0x01
#define OSPF_DEBUG_GR 0x03
/* Macro for setting debug option. */
#define CONF_DEBUG_PACKET_ON(a, b) conf_debug_ospf_packet[a] |= (b)
#define CONF_DEBUG_PACKET_OFF(a, b) conf_debug_ospf_packet[a] &= ~(b)
@ -109,6 +112,7 @@
#define IS_DEBUG_OSPF_DEFAULT_INFO IS_DEBUG_OSPF(defaultinfo, DEFAULTINFO)
#define IS_DEBUG_OSPF_LDP_SYNC IS_DEBUG_OSPF(ldp_sync, LDP_SYNC)
#define IS_DEBUG_OSPF_GR_HELPER IS_DEBUG_OSPF(gr, GR_HELPER)
#define IS_CONF_DEBUG_OSPF_PACKET(a, b) \
(conf_debug_ospf_packet[a] & OSPF_DEBUG_##b)
@ -130,6 +134,7 @@ extern unsigned long term_debug_ospf_ext;
extern unsigned long term_debug_ospf_sr;
extern unsigned long term_debug_ospf_defaultinfo;
extern unsigned long term_debug_ospf_ldp_sync;
extern unsigned long term_debug_ospf_gr;
/* Message Strings. */
extern char *ospf_lsa_type_str[];

154
ospfd/ospf_gr_helper.h Normal file
View File

@ -0,0 +1,154 @@
/*
* OSPF Graceful Restart helper functions.
*
* Copyright (C) 2020-21 Vmware, Inc.
* Rajesh Kumar Girada
*
* 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
*/
#ifndef _ZEBRA_OSPF_HELPER_H
#define _ZEBRA_OSPF_HELPER_H
#define OSPF_GR_NOT_HELPER 0
#define OSPF_GR_ACTIVE_HELPER 1
#define OSPF_GR_HELPER_NO_LSACHECK 0
#define OSPF_GR_HELPER_LSACHECK 1
#define OSPF_MAX_GRACE_INTERVAL 1800
#define OSPF_MIN_GRACE_INTERVAL 1
enum ospf_helper_exit_reason {
OSPF_GR_HELPER_EXIT_NONE = 0,
OSPF_GR_HELPER_INPROGRESS,
OSPF_GR_HELPER_TOPO_CHG,
OSPF_GR_HELPER_GRACE_TIMEOUT,
OSPF_GR_HELPER_COMPLETED
};
enum ospf_gr_restart_reason {
OSPF_GR_UNKNOWN_RESTART = 0,
OSPF_GR_SW_RESTART = 1,
OSPF_GR_SW_UPGRADE = 2,
OSPF_GR_SWITCH_REDUNDANT_CARD = 3,
OSPF_GR_INVALID_REASON_CODE = 4
};
enum ospf_gr_helper_rejected_reason {
OSPF_HELPER_REJECTED_NONE,
OSPF_HELPER_SUPPORT_DISABLED,
OSPF_HELPER_NOT_A_VALID_NEIGHBOUR,
OSPF_HELPER_PLANNED_ONLY_RESTART,
OSPF_HELPER_TOPO_CHANGE_RTXMT_LIST,
OSPF_HELPER_LSA_AGE_MORE
};
/* Ref RFC3623 appendex-A */
/* Grace period TLV */
#define GRACE_PERIOD_TYPE 1
#define GRACE_PERIOD_LENGTH 4
struct grace_tlv_graceperiod {
struct tlv_header header;
uint32_t interval;
};
/* Restart reason TLV */
#define RESTART_REASON_TYPE 2
#define RESTART_REASON_LENGTH 1
struct grace_tlv_restart_reason {
struct tlv_header header;
uint8_t reason;
uint8_t reserved[3];
};
/* Restarter ip address TLV */
#define RESTARTER_IP_ADDR_TYPE 3
#define RESTARTER_IP_ADDR_LEN 4
struct grace_tlv_restart_addr {
struct tlv_header header;
struct in_addr addr;
};
struct ospf_helper_info {
/* Grace interval received from
* Restarting Router.
*/
uint32_t recvd_grace_period;
/* Grace interval used for grace
* gracetimer.
*/
uint32_t actual_grace_period;
/* Grace timer,This Router acts as
* helper until this timer until
* this timer expires*/
struct thread *t_grace_timer;
/* Helper status */
uint32_t gr_helper_status;
/* Helper exit reason*/
enum ospf_helper_exit_reason helper_exit_reason;
/* Planned/Unplanned restart*/
enum ospf_gr_restart_reason gr_restart_reason;
/* Helper rejected reason */
enum ospf_gr_helper_rejected_reason rejected_reason;
};
struct advRtr {
struct in_addr advRtrAddr;
};
#define OSPF_HELPER_ENABLE_RTR_COUNT(ospf) (ospf->enable_rtr_list->count)
/* Check for planned restart */
#define OSPF_GR_IS_PLANNED_RESTART(reason) \
((reason == OSPF_GR_SW_RESTART) || (reason == OSPF_GR_SW_UPGRADE))
/* Check the router is HELPER for current neighbour */
#define OSPF_GR_IS_ACTIVE_HELPER(N) \
((N)->gr_helper_info.gr_helper_status == OSPF_GR_ACTIVE_HELPER)
/* Check the LSA is GRACE LSA */
#define IS_GRACE_LSA(lsa) \
((lsa->data->type == OSPF_OPAQUE_LINK_LSA) \
&& (GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)) \
== OPAQUE_TYPE_GRACE_LSA))
/* Check neighbour is in FULL state */
#define IS_NBR_STATE_FULL(nbr) (nsm_should_adj(nbr) && (nbr->state == NSM_Full))
/* Check neighbour is DR_OTHER and state is 2_WAY */
#define IS_NBR_STATE_2_WAY_WITH_DROTHER(nbr) \
((ospf_get_nbr_ism_role(nbr) == ISM_DROther) \
&& (nbr->state == NSM_TwoWay))
#define OSPF_GR_FALSE false
#define OSPF_GR_TRUE true
#define OSPF_GR_SUCCESS 1
#define OSPF_GR_FAILURE 0
#define OSPF_GR_INVALID -1
#endif /* _ZEBRA_OSPF_HELPER_H */

View File

@ -22,6 +22,7 @@
#ifndef _ZEBRA_OSPF_NEIGHBOR_H
#define _ZEBRA_OSPF_NEIGHBOR_H
#include <ospfd/ospf_gr_helper.h>
#include <ospfd/ospf_packet.h>
/* Neighbor Data Structure */
@ -88,6 +89,9 @@ struct ospf_neighbor {
/* BFD information */
void *bfd_info;
/* ospf graceful restart HELPER info */
struct ospf_helper_info gr_helper_info;
};
/* Macros. */
@ -113,5 +117,4 @@ extern struct ospf_neighbor *ospf_nbr_lookup_by_addr(struct route_table *,
extern struct ospf_neighbor *ospf_nbr_lookup_by_routerid(struct route_table *,
struct in_addr *);
extern void ospf_renegotiate_optional_capabilities(struct ospf *top);
#endif /* _ZEBRA_OSPF_NEIGHBOR_H */

View File

@ -319,7 +319,41 @@ struct ospf {
/* Redistributed external information. */
struct list *external[ZEBRA_ROUTE_MAX + 1];
#define EXTERNAL_INFO(E) (E->external_info)
#define EXTERNAL_INFO(E) (E->external_info)
/* Gracefull restart Helper supported configs*/
/* Supported grace interval*/
uint32_t supported_grace_time;
/* Helper support
* Supported : True
* Not Supported : False.
*/
bool is_helper_supported;
/* Support for strict LSA check.
* if it is set,Helper aborted
* upon a TOPO change.
*/
bool strict_lsa_check;
/* Support as HELPER only for
* planned restarts.
*/
bool only_planned_restart;
/* This list contains the advertisement
* routerids which are not support for HELPERs.
*/
struct hash *enable_rtr_list;
/* HELPER for number of active
* RESTARTERs.
*/
uint16_t active_restarter_cnt;
/* last HELPER exit reason */
uint32_t last_exit_reason;
/* MPLS LDP-IGP Sync */
struct ldp_sync_info_cmd ldp_sync_cmd;