mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
BGP: protocol specific state information cleanup
This commit is contained in:
parent
74800729c0
commit
d2ad795c1e
@ -1303,11 +1303,6 @@ struct ea_class ea_bgp_close_bmp = {
|
|||||||
.type = T_OPAQUE,
|
.type = T_OPAQUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ea_class ea_bgp_close_bmp_set = {
|
|
||||||
.name = "bgp_close_bmp_set",
|
|
||||||
.type = T_INT,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ea_class ea_bgp_as4_session = {
|
struct ea_class ea_bgp_as4_session = {
|
||||||
.name = "bgp_as4_session",
|
.name = "bgp_as4_session",
|
||||||
.type = T_INT,
|
.type = T_INT,
|
||||||
@ -1346,7 +1341,7 @@ bgp_register_attrs(void)
|
|||||||
EA_REGISTER_ALL(
|
EA_REGISTER_ALL(
|
||||||
&ea_bgp_rem_id, &ea_bgp_rem_as, &ea_bgp_loc_as, &ea_bgp_rem_ip, &ea_bgp_peer_type, &ea_bgp_afi,
|
&ea_bgp_rem_id, &ea_bgp_rem_as, &ea_bgp_loc_as, &ea_bgp_rem_ip, &ea_bgp_peer_type, &ea_bgp_afi,
|
||||||
&ea_bgp_in_conn_local_open_msg, &ea_bgp_out_conn_local_open_msg, &ea_bgp_in_conn_remote_open_msg,
|
&ea_bgp_in_conn_local_open_msg, &ea_bgp_out_conn_local_open_msg, &ea_bgp_in_conn_remote_open_msg,
|
||||||
&ea_bgp_out_conn_remote_open_msg, &ea_bgp_close_bmp, &ea_bgp_close_bmp_set, &ea_bgp_as4_session,
|
&ea_bgp_out_conn_remote_open_msg, &ea_bgp_close_bmp, &ea_bgp_as4_session,
|
||||||
&ea_bgp_state_startup, &ea_bgp_in_conn_state, &ea_bgp_out_conn_state,
|
&ea_bgp_state_startup, &ea_bgp_in_conn_state, &ea_bgp_out_conn_state,
|
||||||
&ea_bgp_in_conn_sk, &ea_bgp_out_conn_sk, &ea_bgp_as4_in_conn, &ea_bgp_as4_out_conn
|
&ea_bgp_in_conn_sk, &ea_bgp_out_conn_sk, &ea_bgp_as4_in_conn, &ea_bgp_as4_out_conn
|
||||||
);
|
);
|
||||||
|
@ -837,30 +837,20 @@ bgp_conn_leave_established_state(struct bgp_conn *conn, struct bgp_proto *p)
|
|||||||
if (p->p.proto_state == PS_UP)
|
if (p->p.proto_state == PS_UP)
|
||||||
bgp_stop(p, 0, NULL, 0);
|
bgp_stop(p, 0, NULL, 0);
|
||||||
|
|
||||||
#ifdef CONFIG_BMP
|
uint adsz;
|
||||||
struct {
|
struct bgp_session_close_ad *bscad = alloca(adsz = sizeof *bscad + conn->notify_size);
|
||||||
struct closing_bgp closing_struct;
|
*bscad = (struct bgp_session_close_ad) {
|
||||||
byte data[conn->notify_size];
|
.ad.length = adsz - sizeof(adata),
|
||||||
} to_ea;
|
.last_error_class = p->last_error_class,
|
||||||
|
.notify_code = conn->notify_code,
|
||||||
to_ea.closing_struct = (struct closing_bgp) {
|
.notify_subcode = conn->notify_subcode,
|
||||||
.err_class = p->last_error_class,
|
|
||||||
.err_code = conn->notify_code,
|
|
||||||
.err_subcode = conn->notify_subcode,
|
|
||||||
.length = conn->notify_size,
|
|
||||||
};
|
};
|
||||||
memcpy(to_ea.data, conn->notify_data, conn->notify_size);
|
memcpy(bscad->data, conn->notify_data, conn->notify_size);
|
||||||
|
|
||||||
ea_set_attr(&p->p.ea_state, EA_LITERAL_STORE_ADATA(&ea_bgp_close_bmp, 0, &to_ea.closing_struct, sizeof(to_ea)));
|
ea_set_attr(&p->p.ea_state, EA_LITERAL_DIRECT_ADATA(&ea_bgp_close_bmp, 0, &bscad->ad));
|
||||||
ea_set_attr(&p->p.ea_state, EA_LITERAL_EMBEDDED(&ea_bgp_close_bmp_set, 0, 1));
|
|
||||||
p->p.ea_state = ea_lookup(p->p.ea_state, 0, EALS_CUSTOM);
|
p->p.ea_state = ea_lookup(p->p.ea_state, 0, EALS_CUSTOM);
|
||||||
|
|
||||||
proto_announce_state_later(&p->p, p->p.ea_state);
|
proto_announce_state_later(&p->p, p->p.ea_state);
|
||||||
|
|
||||||
//bmp_peer_down(p, p->last_error_class,
|
|
||||||
// conn->notify_code, conn->notify_subcode,
|
|
||||||
// conn->notify_data, conn->notify_size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1274,21 +1264,24 @@ bgp_setup_sk(struct bgp_conn *conn, sock *s)
|
|||||||
s->fast_rx = 1;
|
s->fast_rx = 1;
|
||||||
conn->sk = s;
|
conn->sk = s;
|
||||||
|
|
||||||
struct bgp_conn_sk_ea sk_ea = {
|
struct bgp_conn_sk_ad sk_ad = {
|
||||||
|
.ad = { .length = sizeof sk_ad - sizeof sk_ad.ad },
|
||||||
.saddr = s->saddr,
|
.saddr = s->saddr,
|
||||||
.daddr = s->daddr,
|
.daddr = s->daddr,
|
||||||
.sport = s->sport,
|
.sport = s->sport,
|
||||||
.dport = s->dport
|
.dport = s->dport,
|
||||||
};
|
};
|
||||||
|
|
||||||
ea_list *attr = conn->bgp->p.ea_state;
|
ea_list *attr = conn->bgp->p.ea_state;
|
||||||
|
|
||||||
if (conn == &conn->bgp->incoming_conn)
|
if (conn == &conn->bgp->incoming_conn)
|
||||||
ea_set_attr(&attr, EA_LITERAL_STORE_ADATA(&ea_bgp_in_conn_sk, 0, (byte*)(&sk_ea), sizeof(sk_ea)));
|
ea_set_attr(&attr, EA_LITERAL_DIRECT_ADATA(&ea_bgp_in_conn_sk, 0, &sk_ad.ad));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASSERT_DIE(conn == &conn->bgp->outgoing_conn);
|
ASSERT_DIE(conn == &conn->bgp->outgoing_conn);
|
||||||
ea_set_attr(&attr, EA_LITERAL_STORE_ADATA(&ea_bgp_out_conn_sk, 0, (byte*)(&sk_ea), sizeof(sk_ea)));
|
ea_set_attr(&attr, EA_LITERAL_DIRECT_ADATA(&ea_bgp_out_conn_sk, 0, &sk_ad.ad));
|
||||||
}
|
}
|
||||||
|
|
||||||
conn->bgp->p.ea_state = ea_lookup(conn->bgp->p.ea_state, 0, EALS_CUSTOM);
|
conn->bgp->p.ea_state = ea_lookup(conn->bgp->p.ea_state, 0, EALS_CUSTOM);
|
||||||
proto_announce_state_later(&conn->bgp->p, attr);
|
proto_announce_state_later(&conn->bgp->p, attr);
|
||||||
}
|
}
|
||||||
@ -1994,9 +1987,12 @@ bgp_init(struct proto_config *CF)
|
|||||||
/* Add MPLS channel */
|
/* Add MPLS channel */
|
||||||
proto_configure_mpls_channel(P, CF, RTS_BGP);
|
proto_configure_mpls_channel(P, CF, RTS_BGP);
|
||||||
|
|
||||||
PST_LOCKED(ts)
|
ea_set_attr(&p->p.ea_state, EA_LITERAL_STORE_ADATA(&ea_bgp_rem_ip, 0, &cf->remote_ip, sizeof(ip_addr)));
|
||||||
bgp_state_to_eattr(P, ts->states[P->id]);
|
ea_set_attr(&p->p.ea_state, EA_LITERAL_EMBEDDED(&ea_bgp_peer_type, 0, cf->peer_type));
|
||||||
|
ea_set_attr(&p->p.ea_state, EA_LITERAL_EMBEDDED(&ea_bgp_loc_as, 0, cf->local_as));
|
||||||
|
ea_set_attr(&p->p.ea_state, EA_LITERAL_EMBEDDED(&ea_bgp_rem_as, 0, cf->remote_as));
|
||||||
|
|
||||||
|
proto_announce_state_later(&p->p, p->p.ea_state);
|
||||||
return P;
|
return P;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2463,11 +2459,6 @@ bgp_reconfigure(struct proto *P, struct proto_config *CF)
|
|||||||
/* We should update our copy of configuration ptr as old configuration will be freed */
|
/* We should update our copy of configuration ptr as old configuration will be freed */
|
||||||
p->cf = new;
|
p->cf = new;
|
||||||
|
|
||||||
ea_list *eal = proto_get_state(p->p.id);
|
|
||||||
ea_set_attr(&eal, EA_LITERAL_EMBEDDED(&ea_bgp_peer_type, 0, p->cf->peer_type));
|
|
||||||
p->p.ea_state = ea_lookup(p->p.ea_state, 0, EALS_CUSTOM);
|
|
||||||
proto_announce_state_later(&p->p, eal);
|
|
||||||
|
|
||||||
/* Check whether existing connections are compatible with required capabilities */
|
/* Check whether existing connections are compatible with required capabilities */
|
||||||
struct bgp_conn *ci = &p->incoming_conn;
|
struct bgp_conn *ci = &p->incoming_conn;
|
||||||
if (((ci->state == BS_OPENCONFIRM) || (ci->state == BS_ESTABLISHED)) && !bgp_check_capabilities(ci))
|
if (((ci->state == BS_OPENCONFIRM) || (ci->state == BS_ESTABLISHED)) && !bgp_check_capabilities(ci))
|
||||||
@ -2674,27 +2665,6 @@ bgp_get_status(struct proto *P, byte *buf)
|
|||||||
bsprintf(buf, "%-14s%s%s", bgp_state_dsc(p), err1, err2);
|
bsprintf(buf, "%-14s%s%s", bgp_state_dsc(p), err1, err2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
bgp_state_to_eattr(struct proto *P, struct ea_list *state)
|
|
||||||
{
|
|
||||||
struct bgp_proto *p = (struct bgp_proto *) P;
|
|
||||||
ea_set_attr(&state, EA_LITERAL_EMBEDDED(&ea_bgp_rem_id, 0, p->remote_id));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_STORE_ADATA(&ea_bgp_rem_ip, 0, &p->remote_ip, sizeof(ip_addr)));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_EMBEDDED(&ea_bgp_peer_type, 0, p->cf->peer_type));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_EMBEDDED(&ea_bgp_loc_as, 0, p->local_as));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_EMBEDDED(&ea_bgp_rem_as, 0, p->remote_as));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_EMBEDDED(&ea_bgp_as4_session, 0, p->as4_session));
|
|
||||||
|
|
||||||
ea_set_attr(&state, EA_LITERAL_STORE_ADATA(&ea_bgp_in_conn_local_open_msg, 0, NULL, 0));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_STORE_ADATA(&ea_bgp_in_conn_remote_open_msg, 0, NULL, 0));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_STORE_ADATA(&ea_bgp_out_conn_local_open_msg, 0, NULL, 0));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_STORE_ADATA(&ea_bgp_out_conn_remote_open_msg, 0, NULL, 0));
|
|
||||||
|
|
||||||
ea_set_attr(&state, EA_LITERAL_STORE_ADATA(&ea_bgp_close_bmp, 0, NULL, 0));
|
|
||||||
ea_set_attr(&state, EA_LITERAL_EMBEDDED(&ea_bgp_close_bmp_set, 0, 0));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bgp_show_afis(int code, char *s, u32 *afis, uint count)
|
bgp_show_afis(int code, char *s, u32 *afis, uint count)
|
||||||
{
|
{
|
||||||
|
@ -319,18 +319,19 @@ struct bgp_conn {
|
|||||||
uint hold_time, keepalive_time, send_hold_time; /* Times calculated from my and neighbor's requirements */
|
uint hold_time, keepalive_time, send_hold_time; /* Times calculated from my and neighbor's requirements */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bgp_conn_sk_ea {
|
struct bgp_conn_sk_ad {
|
||||||
|
adata ad;
|
||||||
ip_addr saddr;
|
ip_addr saddr;
|
||||||
ip_addr daddr;
|
ip_addr daddr;
|
||||||
int sport;
|
int sport;
|
||||||
int dport;
|
int dport;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct closing_bgp {
|
struct bgp_session_close_ad {
|
||||||
int err_class;
|
adata ad;
|
||||||
int err_code;
|
int notify_code;
|
||||||
int err_subcode;
|
int notify_subcode;
|
||||||
int length;
|
u8 last_error_class;
|
||||||
byte data[0];
|
byte data[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user