diff options
| author | Anton Degtyarev <adeg47@gmail.com> | 2018-11-14 06:14:04 +0300 |
|---|---|---|
| committer | Anton Degtyarev <adeg47@gmail.com> | 2018-12-20 15:28:52 +0300 |
| commit | 57592a53b5c02094f915a8444d40d2361d31e972 (patch) | |
| tree | 4948c69d7951e9dc0008e110f9d7d489a8c3f742 /bgpd/bgp_label.h | |
| parent | f944fe9b004be9c6076f2fed3004a85fc284cad1 (diff) | |
bgpd, zebra: auto assign labels from label pool to regular prefixes in BGP labeled unicast
This commit is the last missing piece to complete BGP LU support in bgpd. To this moment, bgpd (and zebra) supported auto label assignment only for prefixes leaked from VRFs to vpn and for MPLS SR prefixes. This adds auto label assignment to other routes types in bgpd. The following enhancements have been made:
* bgp_route.c:bgp_process_main_one() now sets implicit-null local_label to all local, aggregate and redistributed routes.
* bgp_route.c:bgp_process_main_one() now will request a label from the label pool for any prefix that loses the label for some reason (for example, when the static label assignment config is removed)
* bgp_label.c:bgp_reg_dereg_for_label() now requests labels from label pool for routes which have no associated label index
* zebra_mpls.c:zebra_mpls_fec_register() now expects both label and label_index from the calling function, one of which must be set to MPLS_INVALID_LABEL or MPLS_INVALID_LABEL_INDEX, based on this it will decide how to register the provided FEC.
Signed-off-by: Anton Degtyarev <anton@cumulusnetworks.com>
Diffstat (limited to 'bgpd/bgp_label.h')
| -rw-r--r-- | bgpd/bgp_label.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/bgpd/bgp_label.h b/bgpd/bgp_label.h index b0fc07e547..89bc9aabb0 100644 --- a/bgpd/bgp_label.h +++ b/bgpd/bgp_label.h @@ -30,8 +30,10 @@ struct bgp_node; struct bgp_path_info; struct peer; +extern int bgp_reg_for_label_callback(mpls_label_t new_label, void *labelid, + bool allocated); extern void bgp_reg_dereg_for_label(struct bgp_node *rn, - struct bgp_path_info *pi, int reg); + struct bgp_path_info *pi, bool reg); extern int bgp_parse_fec_update(void); extern mpls_label_t bgp_adv_label(struct bgp_node *rn, struct bgp_path_info *pi, struct peer *to, afi_t afi, safi_t safi); @@ -87,12 +89,12 @@ static inline void bgp_unset_valid_label(mpls_label_t *label) static inline void bgp_register_for_label(struct bgp_node *rn, struct bgp_path_info *pi) { - bgp_reg_dereg_for_label(rn, pi, 1); + bgp_reg_dereg_for_label(rn, pi, true); } static inline void bgp_unregister_for_label(struct bgp_node *rn) { - bgp_reg_dereg_for_label(rn, NULL, 0); + bgp_reg_dereg_for_label(rn, NULL, false); } /* Label stream to value */ |
