summaryrefslogtreecommitdiff
path: root/proto/bgp
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-01-10 09:31:27 +0100
committerMaria Matejka <mq@ucw.cz>2022-02-03 10:30:33 +0100
commitfccaeb0141136b192884f76edd0a53575f47d87e (patch)
treeb883d8618192d3ec6b9b65caea6ca617241e49bc /proto/bgp
parent8447b24e59bcb6bf1f5d0c2a00880b74bde748fd (diff)
BGP: Static global linpools replaced by private linpools
Diffstat (limited to 'proto/bgp')
-rw-r--r--proto/bgp/attrs.c12
-rw-r--r--proto/bgp/bgp.c28
-rw-r--r--proto/bgp/bgp.h4
-rw-r--r--proto/bgp/packets.c4
4 files changed, 12 insertions, 36 deletions
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index 1080db77..02b07410 100644
--- a/proto/bgp/attrs.c
+++ b/proto/bgp/attrs.c
@@ -1847,13 +1847,11 @@ bgp_rt_notify(struct proto *P, struct channel *C, const net_addr *n, rte *new, c
if (new)
{
- struct ea_list *attrs = bgp_update_attrs(p, c, new, new->attrs->eattrs, bgp_linpool2);
+ struct ea_list *attrs = bgp_update_attrs(p, c, new, new->attrs->eattrs, C->rte_update_pool);
/* If attributes are invalid, we fail back to withdraw */
buck = attrs ? bgp_get_bucket(c, attrs) : bgp_get_withdraw_bucket(c);
path = new->src->global_id;
-
- lp_flush(bgp_linpool2);
}
else
{
@@ -2293,14 +2291,14 @@ bgp_rte_modify_stale(struct rt_export_request *req, const net_addr *n, struct rt
rte_import(&c->c.in_req, n, &e0, r->src);
else {
- rta *a = e0.attrs = rta_do_cow(r->attrs, bgp_linpool);
+ rta *a = e0.attrs = rta_do_cow(r->attrs, c->c.rte_update_pool);
- bgp_set_attr_ptr(&(a->eattrs), bgp_linpool, BA_COMMUNITY, flags,
- int_set_add(bgp_linpool, ad, BGP_COMM_LLGR_STALE));
+ bgp_set_attr_ptr(&(a->eattrs), c->c.rte_update_pool, BA_COMMUNITY, flags,
+ int_set_add(c->c.rte_update_pool, ad, BGP_COMM_LLGR_STALE));
e0.pflags |= BGP_REF_STALE;
rte_import(&c->c.in_req, n, &e0, r->src);
- lp_flush(bgp_linpool);
+ lp_flush(c->c.rte_update_pool);
}
} while (count);
}
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 7e803f64..c453b176 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -124,11 +124,8 @@
#include "bgp.h"
-
-struct linpool *bgp_linpool; /* Global temporary pool */
-struct linpool *bgp_linpool2; /* Global temporary pool for bgp_rt_notify() */
-static list bgp_sockets; /* Global list of listening sockets */
-
+/* Global list of listening sockets */
+static list STATIC_LIST_INIT(bgp_sockets);
static void bgp_connect(struct bgp_proto *p);
static void bgp_active(struct bgp_proto *p);
@@ -167,10 +164,6 @@ bgp_open(struct bgp_proto *p)
(p->ipv4 ? IPA_NONE4 : IPA_NONE6);
uint port = p->cf->local_port;
- /* FIXME: Add some global init? */
- if (!bgp_linpool)
- init_list(&bgp_sockets);
-
/* We assume that cf->iface is defined iff cf->local_ip is link-local */
WALK_LIST(bs, bgp_sockets)
@@ -207,12 +200,6 @@ bgp_open(struct bgp_proto *p)
add_tail(&bgp_sockets, &bs->n);
- if (!bgp_linpool)
- {
- bgp_linpool = lp_new_default(proto_pool);
- bgp_linpool2 = lp_new_default(proto_pool);
- }
-
return 0;
err:
@@ -241,15 +228,6 @@ bgp_close(struct bgp_proto *p)
rfree(bs->sk);
rem_node(&bs->n);
mb_free(bs);
-
- if (!EMPTY_LIST(bgp_sockets))
- return;
-
- rfree(bgp_linpool);
- bgp_linpool = NULL;
-
- rfree(bgp_linpool2);
- bgp_linpool2 = NULL;
}
static inline int
@@ -1602,6 +1580,8 @@ bgp_start(struct proto *P)
p->startup_timer = tm_new_init(p->p.pool, bgp_startup_timeout, p, 0, 0);
p->gr_timer = tm_new_init(p->p.pool, bgp_graceful_restart_timeout, p, 0, 0);
+ p->rx_lp = lp_new_default(p->p.pool);
+
p->local_id = proto_get_router_id(P->cf);
if (p->rr_client)
p->rr_cluster_id = p->cf->rr_cluster_id ? p->cf->rr_cluster_id : p->local_id;
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h
index 60f93bce..56360a9f 100644
--- a/proto/bgp/bgp.h
+++ b/proto/bgp/bgp.h
@@ -312,6 +312,7 @@ struct bgp_proto {
struct bgp_conn *conn; /* Connection we have established */
struct bgp_conn outgoing_conn; /* Outgoing connection we're working with */
struct bgp_conn incoming_conn; /* Incoming connection we have neither accepted nor rejected yet */
+ struct linpool *rx_lp; /* Linpool for parsing received updates */
struct object_lock *lock; /* Lock for neighbor connection */
struct neighbor *neigh; /* Neighbor entry corresponding to remote ip, NULL if multihop */
struct bgp_socket *sock; /* Shared listening socket */
@@ -494,9 +495,6 @@ bgp_parse_error(struct bgp_parse_state *s, uint subcode)
longjmp(s->err_jmpbuf, 1);
}
-extern struct linpool *bgp_linpool;
-extern struct linpool *bgp_linpool2;
-
void bgp_start_timer(timer *t, uint value);
void bgp_check_config(struct bgp_config *c);
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index ea9adb4c..de4f70c1 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -2295,7 +2295,7 @@ again: ;
struct bgp_write_state s = {
.proto = p,
.channel = c,
- .pool = bgp_linpool,
+ .pool = c->c.rte_update_pool,
.mp_reach = (c->afi != BGP_AF_IPV4) || c->ext_next_hop,
.as4_session = p->as4_session,
.add_path = c->add_path_tx,
@@ -2480,7 +2480,7 @@ bgp_rx_update(struct bgp_conn *conn, byte *pkt, uint len)
/* Initialize parse state */
struct bgp_parse_state s = {
.proto = p,
- .pool = bgp_linpool,
+ .pool = p->rx_lp,
.as4_session = p->as4_session,
};