diff options
Diffstat (limited to 'bgpd/bgp_mpath.h')
-rw-r--r-- | bgpd/bgp_mpath.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/bgpd/bgp_mpath.h b/bgpd/bgp_mpath.h new file mode 100644 index 0000000..129682d --- /dev/null +++ b/bgpd/bgp_mpath.h @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * BGP Multipath + * Copyright (C) 2010 Google Inc. + * + * This file is part of Quagga + */ + +#ifndef _FRR_BGP_MPATH_H +#define _FRR_BGP_MPATH_H + +/* Supplemental information linked to bgp_path_info for keeping track of + * multipath selections, lazily allocated to save memory + */ +struct bgp_path_info_mpath { + /* Points to the first multipath (on bestpath) or the next multipath */ + struct bgp_path_info_mpath *mp_next; + + /* Points to the previous multipath or NULL on bestpath */ + struct bgp_path_info_mpath *mp_prev; + + /* Points to bgp_path_info associated with this multipath info */ + struct bgp_path_info *mp_info; + + /* When attached to best path, the number of selected multipaths */ + uint16_t mp_count; + + /* Flags - relevant as noted. */ + uint16_t mp_flags; +#define BGP_MP_LB_PRESENT 0x1 /* Link-bandwidth present for >= 1 path */ +#define BGP_MP_LB_ALL 0x2 /* Link-bandwidth present for all multipaths */ + + /* Aggregated attribute for advertising multipath route */ + struct attr *mp_attr; + + /* Cumulative bandiwdth of all multipaths - attached to best path. */ + uint64_t cum_bw; +}; + +/* Functions to support maximum-paths configuration */ +extern int bgp_maximum_paths_set(struct bgp *bgp, afi_t afi, safi_t safi, + int peertype, uint16_t maxpaths, + bool clusterlen); +extern int bgp_maximum_paths_unset(struct bgp *bgp, afi_t afi, safi_t safi, + int peertype); + +/* Functions used by bgp_best_selection to record current + * multipath selections + */ +extern int bgp_path_info_nexthop_cmp(struct bgp_path_info *bpi1, + struct bgp_path_info *bpi2); +extern void bgp_mp_list_init(struct list *mp_list); +extern void bgp_mp_list_clear(struct list *mp_list); +extern void bgp_mp_list_add(struct list *mp_list, struct bgp_path_info *mpinfo); +extern void bgp_mp_dmed_deselect(struct bgp_path_info *dmed_best); +extern void bgp_path_info_mpath_update(struct bgp *bgp, struct bgp_dest *dest, + struct bgp_path_info *new_best, + struct bgp_path_info *old_best, + struct list *mp_list, + struct bgp_maxpaths_cfg *mpath_cfg); +extern void +bgp_path_info_mpath_aggregate_update(struct bgp_path_info *new_best, + struct bgp_path_info *old_best); + +/* Unlink and free multipath information associated with a bgp_path_info */ +extern void bgp_path_info_mpath_dequeue(struct bgp_path_info *path); +extern void bgp_path_info_mpath_free(struct bgp_path_info_mpath **mpath); + +/* Walk list of multipaths associated with a best path */ +extern struct bgp_path_info * +bgp_path_info_mpath_first(struct bgp_path_info *path); +extern struct bgp_path_info * +bgp_path_info_mpath_next(struct bgp_path_info *path); + +/* Accessors for multipath information */ +extern uint32_t bgp_path_info_mpath_count(struct bgp_path_info *path); +extern struct attr *bgp_path_info_mpath_attr(struct bgp_path_info *path); +extern bool bgp_path_info_mpath_chkwtd(struct bgp *bgp, + struct bgp_path_info *path); +extern uint64_t bgp_path_info_mpath_cumbw(struct bgp_path_info *path); + +#endif /* _FRR_BGP_MPATH_H */ |