0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-31 14:11:54 +00:00

SNMP: Add bgp trie cleanup

This commit is contained in:
Vojtech Vilimek 2023-10-18 16:51:21 +02:00
parent 9f4a68be73
commit 7b79f55ae9
5 changed files with 34 additions and 26 deletions

View File

@ -61,7 +61,7 @@ snmp_bgp_notify_common(struct snmp_proto *p, uint type, ip4_addr ip4, char last_
#define SNMP_OID_SIZE_FROM_LEN(x) (sizeof(struct oid) + (x) * sizeof(u32))
/* trap OID bgpEstablishedNotification (.1.3.6.1.2.1.0.1) */
struct oid *head = mb_alloc(p->p.pool, SNMP_OID_SIZE_FROM_LEN(3));
struct oid *head = mb_alloc(p->pool, SNMP_OID_SIZE_FROM_LEN(3));
head->n_subid = 3;
head->prefix = 2;
head->include = head->pad = 0;
@ -75,7 +75,7 @@ snmp_bgp_notify_common(struct snmp_proto *p, uint type, ip4_addr ip4, char last_
/* Paylaod OIDs */
void *data = mb_alloc(p->p.pool, sz);
void *data = mb_alloc(p->pool, sz);
struct agentx_varbind *addr_vb = data;
/* +4 for varbind header, +8 for octet string */
struct agentx_varbind *error_vb = data + SNMP_OID_SIZE_FROM_LEN(9) + 4 + 8;
@ -175,7 +175,7 @@ snmp_bgp_register(struct snmp_proto *p)
/* Register the whole BGP4-MIB::bgp root tree node */
struct snmp_register *registering = snmp_register_create(p, SNMP_BGP4_MIB);
struct oid *oid = mb_alloc(p->p.pool, snmp_oid_sizeof(2));
struct oid *oid = mb_alloc(p->pool, snmp_oid_sizeof(2));
STORE_U8(oid->n_subid, 2);
STORE_U8(oid->prefix, SNMP_MGMT);
@ -201,7 +201,7 @@ snmp_bgp_register(struct snmp_proto *p)
struct snmp_register *registering = snmp_register_create(p, SNMP_BGP4_MIB);
struct oid *oid = mb_alloc(p->p.pool, snmp_oid_sizeof(9));
struct oid *oid = mb_alloc(p->pool, snmp_oid_sizeof(9));
STORE_U8(oid->n_subid, 9);
STORE_U8(oid->prefix, SNMP_MGMT);
@ -772,7 +772,7 @@ bgp_find_dynamic_oid(struct snmp_proto *p, struct oid *o_start, const struct oid
snmp_log("ip4_less() returned true");
// TODO repair
struct oid *o = snmp_oid_duplicate(p->p.pool, o_start);
struct oid *o = snmp_oid_duplicate(p->pool, o_start);
snmp_oid_ip4_index(o, 5, net4_prefix(&net));
return o;

View File

@ -160,9 +160,11 @@ snmp_cleanup(struct snmp_proto *p)
mb_free(p->context_id_map);
p->context_id_map = NULL;
// TODO cleanup trie
rfree(p->lp);
p->bgp_trie = NULL;
return (p->state = SNMP_DOWN);
p->state = SNMP_DOWN;
return PS_DOWN;
}
void
@ -230,9 +232,12 @@ snmp_start_locked(struct object_lock *lock)
p->state = SNMP_LOCKED;
sock *s = p->sock;
if (!p->bgp_trie)
p->bgp_trie = f_new_trie(p->lp, 0); // TODO user-data attachment size
if (!s)
{
s = sk_new(p->p.pool);
s = sk_new(p->pool);
s->type = SK_TCP_ACTIVE;
s->saddr = p->local_ip;
s->daddr = p->remote_ip;
@ -284,8 +289,7 @@ snmp_startup(struct snmp_proto *p)
/* Starting AgentX communicaiton channel. */
struct object_lock *lock;
lock = p->lock = olock_new(p->p.pool);
lock = p->lock = olock_new(p->pool);
// lock->addr
// lock->port
@ -347,30 +351,33 @@ snmp_start(struct proto *P)
p->errs = 0;
p->partial_response = NULL;
p->startup_timer = tm_new_init(p->p.pool, snmp_startup_timeout, p, 0, 0);
p->ping_timer = tm_new_init(p->p.pool, snmp_ping_timeout, p, 0, 0);
p->startup_timer = tm_new_init(p->pool, snmp_startup_timeout, p, 0, 0);
p->ping_timer = tm_new_init(p->pool, snmp_ping_timeout, p, 0, 0);
p->pool = lp_new(p->p.pool);
p->bgp_trie = f_new_trie(p->pool, cf->bonds);
p->pool = p->p.pool;
p->lp = lp_new(p->pool);
p->bgp_trie = f_new_trie(p->lp, 0);
//p->bgp_trie = f_new_trie(lp, cf->bonds); // TODO user-data attachment size
init_list(&p->register_queue);
init_list(&p->bgp_registered);
/* We create copy of bonds to BGP protocols. */
HASH_INIT(p->bgp_hash, p->p.pool, 10);
HASH_INIT(p->context_hash, p->p.pool, 10);
HASH_INIT(p->bgp_hash, p->pool, 10);
HASH_INIT(p->context_hash, p->pool, 10);
/* We always have at least the default context */
p->context_id_map = mb_allocz(p->p.pool, cf->contexts * sizeof(struct snmp_context *));
p->context_id_map = mb_allocz(p->pool, cf->contexts * sizeof(struct snmp_context *));
log(L_INFO "number of context allocated %d", cf->contexts);
struct snmp_context *defaultc = mb_alloc(p->p.pool, sizeof(struct snmp_context));
struct snmp_context *defaultc = mb_alloc(p->pool, sizeof(struct snmp_context));
defaultc->context = "";
defaultc->context_id = 0;
defaultc->flags = 0; /* TODO Default context fl. */
HASH_INSERT(p->context_hash, SNMP_H_CONTEXT, defaultc);
p->context_id_map[0] = defaultc;
p->bgp_trie = NULL;
struct snmp_bond *b;
WALK_LIST(b, cf->bgp_entries)
@ -379,7 +386,7 @@ snmp_start(struct proto *P)
if (bc && !ipa_zero(bc->remote_ip))
{
struct snmp_bgp_peer *peer = \
mb_allocz(p->p.pool, sizeof(struct snmp_bgp_peer));
mb_allocz(p->pool, sizeof(struct snmp_bgp_peer));
peer->config = bc;
peer->peer_ip = bc->remote_ip;

View File

@ -120,7 +120,8 @@ struct snmp_context {
struct snmp_proto {
struct proto p;
struct object_lock *lock;
struct linpool *pool;
pool *pool; /* a shortcut to the procotol mem. pool */
linpool *lp;
ip_addr local_ip;
ip_addr remote_ip;

View File

@ -1236,7 +1236,7 @@ search_mib(struct snmp_proto *p, const struct oid *o_start, const struct oid *o_
if (!o_curr)
{
o_curr = snmp_oid_duplicate(p->p.pool, o_start);
o_curr = snmp_oid_duplicate(p->pool, o_start);
// XXX is it right time to free o_start right now (here) ?
// not for use in snmp_get_next2() the o_start comes and ends in _gets2_()
}
@ -1268,7 +1268,7 @@ search_mib(struct snmp_proto *p, const struct oid *o_start, const struct oid *o_
default:
if (o_curr) mb_free(o_curr);
o_curr = snmp_oid_duplicate(p->p.pool, o_start);
o_curr = snmp_oid_duplicate(p->pool, o_start);
*result = SNMP_SEARCH_END_OF_VIEW;
break;
}
@ -1304,7 +1304,7 @@ snmp_prefixize(struct snmp_proto *proto, const struct oid *oid, int byte_ord)
/* already in prefixed form */
else if (oid->prefix != 0) {
struct oid *new = snmp_oid_duplicate(proto->p.pool, oid);
struct oid *new = snmp_oid_duplicate(proto->pool, oid);
snmp_log("already prefixed");
return new;
}
@ -1320,7 +1320,7 @@ snmp_prefixize(struct snmp_proto *proto, const struct oid *oid, int byte_ord)
if (oid->ids[4] >= 256)
{ snmp_log("outside byte first id"); return NULL; }
struct oid *new = mb_alloc(proto->p.pool,
struct oid *new = mb_alloc(proto->pool,
sizeof(struct oid) + MAX((oid->n_subid - 5) * sizeof(u32), 0));
memcpy(new, oid, sizeof(struct oid));

View File

@ -115,8 +115,8 @@ enum snmp_search_res {
#define COPY_STR(proto, buf, str, length, byte_order) ({ \
length = LOAD_PTR(buf, byte_order); \
log(L_INFO "LOAD_STR(), %p %u", proto->p.pool, length + 1); \
str = mb_alloc(proto->p.pool, length + 1); \
log(L_INFO "LOAD_STR(), %p %u", proto->pool, length + 1); \
str = mb_alloc(proto->pool, length + 1); \
memcpy(str, buf+4, length); \
str[length] = '\0'; /* set term. char */ \
buf += 4 + snmp_str_size_from_len(length); })