diff options
| author | Mark Stapp <mjs@voltanet.io> | 2019-12-24 14:22:03 -0500 | 
|---|---|---|
| committer | Mark Stapp <mjs@voltanet.io> | 2020-03-27 11:50:03 -0400 | 
| commit | 1d48702edeb418162940e51c99c942fc3c7bff77 (patch) | |
| tree | 35fef07eeff4bba5ed70d9942e1ca42d4f250595 /zebra/zebra_nhg.h | |
| parent | 1df3b1dc656a488cfeebb8a0e5f08921331bfa8a (diff) | |
zebra: add per-nexthop backup index
Use a backup index in a nexthop directly (if it has a backup
nexthop); revise the zebra nhe/nhg code; revise zapi route
decoding to match; revise the dataplane route datastructs.
Refactor some of the rib_add_multipath code to be prepared to
be called with an nhe, carrying nexthop and (possibly) backup
info together.
Signed-off-by: Mark Stapp <mjs@voltanet.io>
Diffstat (limited to 'zebra/zebra_nhg.h')
| -rw-r--r-- | zebra/zebra_nhg.h | 27 | 
1 files changed, 26 insertions, 1 deletions
diff --git a/zebra/zebra_nhg.h b/zebra/zebra_nhg.h index dc3a47c020..340de952be 100644 --- a/zebra/zebra_nhg.h +++ b/zebra/zebra_nhg.h @@ -50,6 +50,9 @@ struct nhg_hash_entry {  	struct nexthop_group nhg; +	/* If supported, a mapping of backup nexthops. */ +	struct nhg_backup_info *backup_info; +  	/* If this is not a group, it  	 * will be a single nexthop  	 * and must have an interface @@ -72,6 +75,7 @@ struct nhg_hash_entry {  	 * faster with ID's.  	 */  	struct nhg_connected_tree_head nhg_depends, nhg_dependents; +  /*   * Is this nexthop group valid, ie all nexthops are fully resolved.   * What is fully resolved?  It's a nexthop that is either self contained @@ -102,11 +106,25 @@ struct nhg_hash_entry {   * from the kernel. Therefore, it is unhashable.   */  #define NEXTHOP_GROUP_UNHASHABLE (1 << 4) + +/* + * Backup nexthop support - identify groups that are backups for + * another group. + */ +#define NEXTHOP_GROUP_BACKUP (1 << 5) +  };  /* Was this one we created, either this session or previously? */  #define ZEBRA_NHG_CREATED(NHE) ((NHE->type) == ZEBRA_ROUTE_NHG) +/* + * Backup nexthops: this is a group object itself, so + * that the backup nexthops can use the same code as a normal object. + */ +struct nhg_backup_info { +	struct nhg_hash_entry *nhe; +};  enum nhg_ctx_op_e {  	NHG_CTX_OP_NONE = 0, @@ -162,13 +180,20 @@ bool zebra_nhg_kernel_nexthops_enabled(void);  /**   * NHE abstracted tree functions. - * Use these where possible instead of the direct ones access ones. + * Use these where possible instead of direct access.   */  struct nhg_hash_entry *zebra_nhg_alloc(void);  void zebra_nhg_free(struct nhg_hash_entry *nhe);  /* In order to clear a generic hash, we need a generic api, sigh. */  void zebra_nhg_hash_free(void *p); +/* Allocate, free backup nexthop info objects */ +struct nhg_backup_info *zebra_nhg_backup_alloc(void); +void zebra_nhg_backup_free(struct nhg_backup_info **p); + +struct nhg_hash_entry *zebra_nhg_get_backup_nhe(struct nhg_hash_entry *nhe); +struct nexthop_group *zebra_nhg_get_backup_nhg(struct nhg_hash_entry *nhe); +  extern struct nhg_hash_entry *zebra_nhg_resolve(struct nhg_hash_entry *nhe);  extern unsigned int zebra_nhg_depends_count(const struct nhg_hash_entry *nhe);  | 
