#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"
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);
}
- ea_set_attr_u32(&a->eattrs, s->pool, EA_MPLS_POLICY, 0, EAF_TYPE_INT, mc->label_policy);
+
+ /* 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(to, &ea_gen_mpls_policy, 0, mc->label_policy);
+ }
}
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
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)
{
if (C->stale)
same = proto_configure_channel(P, &C, NULL) && same;
- proto_setup_mpls_map(P, RTS_BGP, 1);
+ if (same)
++ proto_setup_mpls_map(P, RTS_BGP);
+
if (same && (p->start_state > BSS_PREPARE))
bgp_update_bfd(p, new->bfd);
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,
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);
}
}