0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +00:00

BGP: Start state is now using extended state

This commit is contained in:
Maria Matejka 2024-10-15 13:10:58 +02:00
parent b97d924e52
commit fa75007156
3 changed files with 38 additions and 10 deletions

View File

@ -1215,6 +1215,16 @@ bgp_find_attr(ea_list *attrs, uint code)
return ea_find(attrs, BGP_EA_ID(code)); return ea_find(attrs, BGP_EA_ID(code));
} }
/*
* Protocol extended state information
*/
struct ea_class ea_bgp_state_startup = {
.name = "bgp_state_startup",
.type = T_INT,
};
void void
bgp_register_attrs(void) bgp_register_attrs(void)
{ {
@ -1234,6 +1244,10 @@ bgp_register_attrs(void)
ea_register_init(&bgp_attr_table[i].class); ea_register_init(&bgp_attr_table[i].class);
} }
EA_REGISTER_ALL(
&ea_bgp_state_startup
);
} }
struct ea_class * struct ea_class *

View File

@ -369,7 +369,7 @@ static void
bgp_startup(struct bgp_proto *p) bgp_startup(struct bgp_proto *p)
{ {
BGP_TRACE(D_EVENTS, "Started"); BGP_TRACE(D_EVENTS, "Started");
p->start_state = BSS_CONNECT; bgp_set_start_state(p, BSS_CONNECT);
if (!p->passive) if (!p->passive)
bgp_active(p); bgp_active(p);
@ -403,7 +403,7 @@ bgp_initiate(struct bgp_proto *p)
if (p->startup_delay) if (p->startup_delay)
{ {
p->start_state = BSS_DELAY; bgp_set_start_state(p, BSS_DELAY);
BGP_TRACE(D_EVENTS, "Startup delayed by %d seconds due to errors", p->startup_delay); BGP_TRACE(D_EVENTS, "Startup delayed by %d seconds due to errors", p->startup_delay);
bgp_start_timer(p, p->startup_timer, p->startup_delay); bgp_start_timer(p, p->startup_timer, p->startup_delay);
} }
@ -565,7 +565,7 @@ bgp_graceful_close_conn(struct bgp_conn *conn, int subcode, byte *data, uint len
static void static void
bgp_down(struct bgp_proto *p) bgp_down(struct bgp_proto *p)
{ {
if (p->start_state > BSS_PREPARE) if (bgp_start_state(p) > BSS_PREPARE)
{ {
bgp_setup_auth(p, 0); bgp_setup_auth(p, 0);
bgp_close(p); bgp_close(p);
@ -1366,7 +1366,7 @@ bgp_incoming_connection(sock *sk, uint dummy UNUSED)
*/ */
acc = (p->p.proto_state == PS_START || p->p.proto_state == PS_UP) && acc = (p->p.proto_state == PS_START || p->p.proto_state == PS_UP) &&
(p->start_state >= BSS_CONNECT) && (!p->incoming_conn.sk); (bgp_start_state(p) >= BSS_CONNECT) && (!p->incoming_conn.sk);
if (p->conn && (p->conn->state == BS_ESTABLISHED) && p->gr_ready) if (p->conn && (p->conn->state == BS_ESTABLISHED) && p->gr_ready)
{ {
@ -1473,7 +1473,7 @@ bgp_neigh_notify(neighbor *n)
if ((ps == PS_DOWN) || (ps == PS_STOP)) if ((ps == PS_DOWN) || (ps == PS_STOP))
return; return;
int prepare = (ps == PS_START) && (p->start_state == BSS_PREPARE); int prepare = (ps == PS_START) && (bgp_start_state(p) == BSS_PREPARE);
if (n->scope <= 0) if (n->scope <= 0)
{ {
@ -1706,7 +1706,7 @@ bgp_start(struct proto *P)
p->passive = cf->passive || bgp_is_dynamic(p); p->passive = cf->passive || bgp_is_dynamic(p);
p->start_state = BSS_PREPARE; bgp_set_start_state(p, BSS_PREPARE);
p->outgoing_conn.state = BS_IDLE; p->outgoing_conn.state = BS_IDLE;
p->incoming_conn.state = BS_IDLE; p->incoming_conn.state = BS_IDLE;
p->neigh = NULL; p->neigh = NULL;
@ -2372,7 +2372,7 @@ bgp_reconfigure(struct proto *P, struct proto_config *CF)
if (((co->state == BS_OPENCONFIRM) || (co->state == BS_ESTABLISHED)) && !bgp_check_capabilities(co)) if (((co->state == BS_OPENCONFIRM) || (co->state == BS_ESTABLISHED)) && !bgp_check_capabilities(co))
return 0; return 0;
if (p->start_state > BSS_PREPARE) if (bgp_start_state(p) > BSS_PREPARE)
bgp_update_bfd(p, new->bfd); bgp_update_bfd(p, new->bfd);
return 1; return 1;
@ -2546,7 +2546,7 @@ bgp_state_dsc(struct bgp_proto *p)
return "Down"; return "Down";
int state = MAX(p->incoming_conn.state, p->outgoing_conn.state); int state = MAX(p->incoming_conn.state, p->outgoing_conn.state);
if ((state == BS_IDLE) && (p->start_state >= BSS_CONNECT) && p->passive) if ((state == BS_IDLE) && (bgp_start_state(p) >= BSS_CONNECT) && p->passive)
return "Passive"; return "Passive";
return bgp_state_names[state]; return bgp_state_names[state];
@ -2756,7 +2756,7 @@ bgp_show_proto_info(struct proto *P)
{ {
struct bgp_conn *oc = &p->outgoing_conn; struct bgp_conn *oc = &p->outgoing_conn;
if ((p->start_state < BSS_CONNECT) && if ((bgp_start_state(p) < BSS_CONNECT) &&
(tm_active(p->startup_timer))) (tm_active(p->startup_timer)))
cli_msg(-1006, " Error wait: %t/%u", cli_msg(-1006, " Error wait: %t/%u",
tm_remains(p->startup_timer), p->startup_delay); tm_remains(p->startup_timer), p->startup_delay);

View File

@ -338,7 +338,6 @@ struct bgp_proto {
u32 local_id; /* BGP identifier of this router */ u32 local_id; /* BGP identifier of this router */
u32 remote_id; /* BGP identifier of the neighbor */ u32 remote_id; /* BGP identifier of the neighbor */
u32 rr_cluster_id; /* Route reflector cluster ID */ u32 rr_cluster_id; /* Route reflector cluster ID */
u8 start_state; /* Substates that partitions BS_START */
u8 is_internal; /* Internal BGP session (local_as == remote_as) */ u8 is_internal; /* Internal BGP session (local_as == remote_as) */
u8 is_interior; /* Internal or intra-confederation BGP session */ u8 is_interior; /* Internal or intra-confederation BGP session */
u8 as4_session; /* Session uses 4B AS numbers in AS_PATH (both sides support it) */ u8 as4_session; /* Session uses 4B AS numbers in AS_PATH (both sides support it) */
@ -379,6 +378,10 @@ struct bgp_proto {
are encoded as (bgp_err_code << 16 | bgp_err_subcode) */ are encoded as (bgp_err_code << 16 | bgp_err_subcode) */
}; };
#define bgp_ea_state(p) _Generic((p), \
struct bgp_proto *: (p)->p.ea_state, \
ea_list *: (p))
struct bgp_channel { struct bgp_channel {
struct channel c; struct channel c;
@ -695,6 +698,10 @@ bgp_total_aigp_metric(const rte *e)
return metric; return metric;
} }
/* Extended state attributes */
extern struct ea_class
ea_bgp_state_startup;
void bgp_register_attrs(void); void bgp_register_attrs(void);
struct ea_class *bgp_find_ea_class_by_id(uint id); struct ea_class *bgp_find_ea_class_by_id(uint id);
@ -788,6 +795,13 @@ enum bgp_attr_id {
#define BSS_DELAY 1 /* Startup delay due to previous errors */ #define BSS_DELAY 1 /* Startup delay due to previous errors */
#define BSS_CONNECT 2 /* Ordinary BGP connecting */ #define BSS_CONNECT 2 /* Ordinary BGP connecting */
#define bgp_start_state(p) ea_get_int(bgp_ea_state(p), &ea_bgp_state_startup, BSS_PREPARE)
#define bgp_set_start_state(p, val) do { \
ea_list *L = bgp_ea_state(p); \
ea_set_attr_u32(&L, &ea_bgp_state_startup, 0, val); \
proto_announce_state(&p->p, L); \
} while (0)
/* BGP feed states (TX) /* BGP feed states (TX)
* *