From: Maria Matejka Date: Wed, 8 Nov 2023 21:24:33 +0000 (+0100) Subject: Merge branch 'mq-aggregator-for-v3' into thread-next X-Git-Tag: v3.0.0~348 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=515df18da742442323047a13b04ecc2bd97b0855;p=thirdparty%2Fbird.git Merge branch 'mq-aggregator-for-v3' into thread-next --- 515df18da742442323047a13b04ecc2bd97b0855 diff --cc proto/bgp/attrs.c index 9c85ab794,9387ddba9..6c4d9dcd9 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@@ -16,7 -16,8 +16,8 @@@ #include "nest/iface.h" #include "nest/protocol.h" #include "nest/route.h" -#include "nest/attrs.h" +#include "lib/attrs.h" + #include "nest/mpls.h" #include "conf/conf.h" #include "lib/resource.h" #include "lib/string.h" @@@ -1557,8 -1500,15 +1558,15 @@@ bgp_finish_attrs(struct bgp_parse_stat if (!e && (p->cf->local_role == BGP_ROLE_CUSTOMER || p->cf->local_role == BGP_ROLE_PEER || p->cf->local_role == BGP_ROLE_RS_CLIENT)) - bgp_set_attr_u32(&a->eattrs, s->pool, BA_ONLY_TO_CUSTOMER, 0, p->cf->remote_as); + bgp_set_attr_u32(to, BA_ONLY_TO_CUSTOMER, 0, p->cf->remote_as); } + + /* Apply MPLS policy for labeled SAFIs */ + if (s->mpls && s->proto->p.mpls_channel) + { + struct mpls_channel *mc = (void *) s->proto->p.mpls_channel; - ea_set_attr_u32(&a->eattrs, s->pool, EA_MPLS_POLICY, 0, EAF_TYPE_INT, mc->label_policy); ++ ea_set_attr_u32(to, &ea_gen_mpls_policy, 0, mc->label_policy); + } } diff --cc proto/bgp/bgp.c index ea89b3b9c,4651b76a2..c93c553ff --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@@ -621,17 -522,12 +621,19 @@@ bgp_spawn(struct bgp_proto *pp, ip_add void bgp_stop(struct bgp_proto *p, int subcode, byte *data, uint len) { - proto_shutdown_mpls_map(&p->p, 1); ++ proto_shutdown_mpls_map(&p->p); + proto_notify_state(&p->p, PS_STOP); + p->uncork_ev->data = NULL; bgp_graceful_close_conn(&p->outgoing_conn, subcode, data, len); bgp_graceful_close_conn(&p->incoming_conn, subcode, data, len); - ev_schedule(p->event); + + struct bgp_channel *c; + WALK_LIST(c, p->p.channels) + if (c->ptx) + bgp_free_pending_tx(c); + + proto_send_event(&p->p, p->event); } static inline void @@@ -1780,6 -1575,8 +1782,8 @@@ bgp_start(struct proto *P p->remote_id = 0; p->link_addr = IPA_NONE; - proto_setup_mpls_map(P, RTS_BGP, 1); ++ proto_setup_mpls_map(P, RTS_BGP); + /* Lock all channels when in GR recovery mode */ if (p->p.gr_recovery && p->cf->gr_mode) { @@@ -2375,6 -2174,9 +2386,9 @@@ bgp_reconfigure(struct proto *P, struc if (C->stale) same = proto_configure_channel(P, &C, NULL) && same; + if (same) - proto_setup_mpls_map(P, RTS_BGP, 1); ++ proto_setup_mpls_map(P, RTS_BGP); + if (same && (p->start_state > BSS_PREPARE)) bgp_update_bfd(p, new->bfd); @@@ -2883,8 -2665,9 +2897,8 @@@ const struct channel_class channel_bgp struct protocol proto_bgp = { .name = "BGP", .template = "bgp%d", - .class = PROTOCOL_BGP, .preference = DEF_PREF_BGP, - .channel_mask = NB_IP | NB_VPN | NB_FLOW, + .channel_mask = NB_IP | NB_VPN | NB_FLOW | NB_MPLS, .proto_size = sizeof(struct bgp_proto), .config_size = sizeof(struct bgp_config), .postconfig = bgp_postconfig, diff --cc proto/bgp/packets.c index 542ec7072,b7df5a7ad..b2228db75 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@@ -1227,17 -1214,16 +1227,16 @@@ bgp_update_next_hop_ip(struct bgp_expor else { ip_addr nh[2] = { s->channel->next_hop_addr, s->channel->link_addr }; - bgp_set_attr_data(to, s->pool, BA_NEXT_HOP, 0, nh, ipa_nonzero(nh[1]) ? 32 : 16); + bgp_set_attr_data(to, BA_NEXT_HOP, 0, nh, ipa_nonzero(nh[1]) ? 32 : 16); s->local_next_hop = 1; - /* TODO: Use local MPLS assigned label */ if (s->mpls) { - u32 implicit_null = BGP_MPLS_NULL; - bgp_set_attr_data(to, BA_MPLS_LABEL_STACK, 0, &implicit_null, 4); - u32 label = ea_get_int(s->route->attrs->eattrs, EA_MPLS_LABEL, BGP_MPLS_NULL); - bgp_set_attr_data(to, s->pool, BA_MPLS_LABEL_STACK, 0, &label, 4); ++ u32 label = ea_get_int(s->route->attrs, &ea_gen_mpls_label, BGP_MPLS_NULL); ++ bgp_set_attr_data(to, BA_MPLS_LABEL_STACK, 0, &label, 4); } else - bgp_unset_attr(to, s->pool, BA_MPLS_LABEL_STACK); + bgp_unset_attr(to, BA_MPLS_LABEL_STACK); } }