cli_msg(code, b.start);
}
-static const char *
+const char *
bgp_format_role_name(u8 role)
{
static const char *bgp_role_names[] = { "provider", "rs_server", "rs_client", "customer", "peer" };
void bgp_refresh_end(struct bgp_channel *c);
void bgp_store_error(struct bgp_proto *p, struct bgp_conn *c, u8 class, u32 code);
void bgp_stop(struct bgp_proto *p, int subcode, byte *data, uint len);
-
-struct rte_source *bgp_find_source(struct bgp_proto *p, u32 path_id);
-struct rte_source *bgp_get_source(struct bgp_proto *p, u32 path_id);
+const char *bgp_format_role_name(u8 role);
static inline int
rte_resolvable(rte *rt)
(local_role == BGP_ROLE_PROVIDER && neigh_role == BGP_ROLE_CUSTOMER) ||
(local_role == BGP_ROLE_RS_CLIENT && neigh_role == BGP_ROLE_RS_SERVER) ||
(local_role == BGP_ROLE_RS_SERVER && neigh_role == BGP_ROLE_RS_CLIENT)))
- { bgp_error(conn, 2, 11, NULL, 0); return; }
+ { bgp_error(conn, 2, 11, &neigh_role, -1); return; }
if ((p->cf->require_roles) && (neigh_role == BGP_ROLE_UNDEFINED))
- { bgp_error(conn, 2, 11, NULL, 0); return; }
+ { bgp_error(conn, 2, 11, &neigh_role, -1); return; }
/* Check the other connection */
other = (conn == &p->outgoing_conn) ? &p->incoming_conn : &p->outgoing_conn;
goto done;
}
+ if ((code == 2) && (subcode == 11) && (len == 1))
+ {
+ t += bsprintf(t, " (%s)", bgp_format_role_name(get_u8(data)));
+ goto done;
+ }
+
/* RFC 8203 - shutdown communication */
if (((code == 6) && ((subcode == 2) || (subcode == 4))))
if (bgp_handle_message(p, data, len, &t))