0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-23 02:01:55 +00:00

tmp: compiles

This commit is contained in:
Vojtech Vilimek 2022-11-29 16:30:20 +01:00
parent 6f74f4a663
commit 9a11ec8d83
7 changed files with 248 additions and 16 deletions

View File

@ -2,6 +2,7 @@
#define _BIRD_SNMP_BGP_MIB_H_ #define _BIRD_SNMP_BGP_MIB_H_
#include "snmp.h" #include "snmp.h"
#include "subagent.h"
/* peers attributes */ /* peers attributes */
enum BGP4_MIB { enum BGP4_MIB {

View File

@ -23,6 +23,15 @@ static void snmp_startup(struct snmp_proto *p);
static void snmp_startup_timeout(timer *t); static void snmp_startup_timeout(timer *t);
static void snmp_start_locked(struct object_lock *lock); static void snmp_start_locked(struct object_lock *lock);
static const char * const snmp_state[] = {
[SNMP_ERR] = "SNMP ERROR",
[SNMP_DELAY] = "SNMP DELAY",
[SNMP_INIT] = "SNMP INIT",
[SNMP_REGISTR] = "SNMP REGISTERING",
[SNMP_CONN] = "SNMP CONNECTED",
};
static struct proto * static struct proto *
snmp_init(struct proto_config *CF) snmp_init(struct proto_config *CF)
{ {
@ -50,6 +59,7 @@ snmp_init(struct proto_config *CF)
static void static void
snmp_startup_timeout(timer *t) snmp_startup_timeout(timer *t)
{ {
log(L_INFO "startup timer triggered");
snmp_startup(t->data); snmp_startup(t->data);
} }
@ -59,6 +69,9 @@ snmp_startup(struct snmp_proto *p)
/* starting agentX communicaiton channel */ /* starting agentX communicaiton channel */
log(L_INFO "preparing lock"); log(L_INFO "preparing lock");
struct object_lock *lock; struct object_lock *lock;
log(L_INFO "snmp_startup() object lock state %p", p->lock);
/* we could have the lock already acquired but be in ERROR state */
lock = p->lock = olock_new(p->p.pool); lock = p->lock = olock_new(p->p.pool);
lock->type = OBJLOCK_TCP; lock->type = OBJLOCK_TCP;
@ -136,6 +149,9 @@ snmp_sock_err(sock *sk, int err)
rfree(p->sock); rfree(p->sock);
p->sock = NULL; p->sock = NULL;
rfree(p->lock);
p->lock = NULL;
p->state = SNMP_ERR; p->state = SNMP_ERR;
tm_start(p->startup_timer, 15 S); tm_start(p->startup_timer, 15 S);
} }
@ -222,9 +238,12 @@ snmp_reconfigure(struct proto *P, struct proto_config *CF)
static void snmp_show_proto_info(struct proto *P) static void snmp_show_proto_info(struct proto *P)
{ {
//struct snmp_proto *sp = (void *) P; struct snmp_proto *sp = (void *) P;
struct snmp_config *c = (void *) P->cf; struct snmp_config *c = (void *) P->cf;
cli_msg(-1006, "");
cli_msg(-1006, " snmp status %s", snmp_state[sp->state]);
cli_msg(-1006, "");
cli_msg(-1006, " BGP peers"); cli_msg(-1006, " BGP peers");
struct snmp_bond *bond; struct snmp_bond *bond;
WALK_LIST(bond, c->bgp_entries) WALK_LIST(bond, c->bgp_entries)

View File

@ -25,18 +25,13 @@
#define BYTE_ORD 0 #define BYTE_ORD 0
#endif #endif
void #define OID_ALLOCATE(size) mb_alloc(&root_pool, sizeof(struct oid) + (size) * sizeof (u32))
dump_oid(struct oid *oid)
{
bt_debug(" OID DUMP: \n");
bt_debug(" n_subid = %3u prefix = %3u include %s --- \n",
oid->n_subid, oid->prefix, (oid->include != 0) ? "yes" : "no" );
for (int i = 0; i < oid->n_subid; i++) #define OID_INIT(oid, n_subid_, prefix_, include_, arr_) \
bt_debug(" %u: %u\n", i + 1, oid->ids[i]); (oid)->n_subid = (n_subid_); \
(oid)->prefix = (prefix_); \
bt_debug(" OID DUMP END\n"); (oid)->include = (include_); \
} memcpy((oid)->ids, (arr_), sizeof(arr_)); \
void void
test_fill(struct snmp_proto *p) test_fill(struct snmp_proto *p)
@ -68,7 +63,7 @@ test_oid(struct oid *oid, uint base_size)
oid->n_subid = base_size + 4; oid->n_subid = base_size + 4;
oid->ids[2] = 3; oid->ids[2] = 3;
oid->ids[3] = 1; // BGP4-MIB::bgpPeerEntry oid->ids[3] = 1; // BGP4-MIB::bgpPeerEntry
dump_oid(oid); snmp_oid_dump(oid);
SNMP_EXPECTED(snmp_bgp_state(oid), BGP_INTERNAL_PEER_ENTRY); SNMP_EXPECTED(snmp_bgp_state(oid), BGP_INTERNAL_PEER_ENTRY);
bt_assert(snmp_bgp_state(oid) == BGP_INTERNAL_PEER_ENTRY); bt_assert(snmp_bgp_state(oid) == BGP_INTERNAL_PEER_ENTRY);
@ -215,6 +210,13 @@ t_s_prefixize(void)
test_fill(&snmp_proto); test_fill(&snmp_proto);
bt_debug("before seg fault\n"); bt_debug("before seg fault\n");
if (snmp_is_oid_empty(NULL))
bt_debug("null oid is empty");
else
bt_debug("null oid is not empty");
bt_debug("main cause\n");
struct oid *tmp = snmp_prefixize(&snmp_proto, nulled, BYTE_ORD); struct oid *tmp = snmp_prefixize(&snmp_proto, nulled, BYTE_ORD);
bt_debug("after snmp_prefixize() call\n"); bt_debug("after snmp_prefixize() call\n");
bt_assert( NULL == tmp ); bt_assert( NULL == tmp );
@ -270,6 +272,135 @@ t_s_prefixize(void)
return 1; return 1;
} }
static int
t_oid_compare(void)
{
/* same length, no prefix */
struct oid *l1 = OID_ALLOCATE(5);
{
u32 arr[] = { 1, 2, 3, 4, 5 };
OID_INIT(l1, 5, 0, 1, arr);
}
struct oid *r1 = OID_ALLOCATE(5);
{
u32 arr[] = { 1, 2, 3, 4, 6 };
OID_INIT(r1, 5, 0, 0, arr);
}
bt_assert(snmp_oid_compare(l1, r1) == -1);
bt_assert(snmp_oid_compare(r1, l1) == 1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
/* same results for prefixed oids */
l1->prefix = 1;
r1->prefix = 1;
bt_assert(snmp_oid_compare(l1, r1) == -1);
bt_assert(snmp_oid_compare(r1, l1) == 1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
mb_free(l1);
mb_free(r1);
/* different length, no prefix */
l1 = OID_ALLOCATE(4);
{
u32 arr[] = { 1, 2, 3, 4 };
OID_INIT(l1, 4, 0, 0, arr);
}
r1 = OID_ALLOCATE(5);
{
u32 arr[] = { 1, 2, 3, 4, 1 };
OID_INIT(l1, 5, 0, 1, arr);
}
bt_assert(snmp_oid_compare(l1, r1) == -1);
bt_assert(snmp_oid_compare(r1, l1) == 1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
/* same results for prefixed oids */
l1->prefix = 3;
r1->prefix = 3;
bt_assert(snmp_oid_compare(l1, r1) == -1);
bt_assert(snmp_oid_compare(r1, l1) == 1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
mb_free(l1);
mb_free(r1);
/* inverse order different length, no prefix */
l1 = OID_ALLOCATE(4);
{
u32 arr[] = { 1, 2, 3, 5 };
OID_INIT(l1, 4, 0, 0, arr);
}
r1 = OID_ALLOCATE(5);
{
u32 arr[] = { 1, 2, 3, 4, 1 };
OID_INIT(r1, 5, 0, 0, arr);
}
bt_assert(snmp_oid_compare(l1, r1) == 1);
bt_assert(snmp_oid_compare(r1, l1) == -1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
/* same results for prefixed oids */
l1->prefix = 254;
r1->prefix = 254;
bt_assert(snmp_oid_compare(l1, r1) == 1);
bt_assert(snmp_oid_compare(r1, l1) == -1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
mb_free(l1);
mb_free(r1);
/* ==== MIXED PREFIXED / NON PREFIXED OID compare ==== */
/* same length, mixed */
l1 = OID_ALLOCATE(6); /* OID .1.2.17.3.21.4 */
{
u32 arr[] = { 1, 2, 17, 3, 21, 4 };
OID_INIT(l1, 6, 0, 1, arr);
}
r1 = OID_ALLOCATE(1); /* OID .1.3.6.1.5.3 */
{
u32 arr[] = { 3 };
OID_INIT(l1, 1, 5, 1, arr);
}
bt_assert(snmp_oid_compare(l1, r1) == -1);
bt_assert(snmp_oid_compare(r1, l1) == 1);
bt_assert(snmp_oid_compare(l1, l1) == 0);
bt_assert(snmp_oid_compare(r1, r1) == 0);
mb_free(l1);
mb_free(r1);
return 1;
}
static int static int
t_s_bgp_state(void) t_s_bgp_state(void)
{ {
@ -323,5 +454,7 @@ int main(int argc, char **argv)
bt_test_suite(t_s_prefixize, "Function snmp_prefixize()"); bt_test_suite(t_s_prefixize, "Function snmp_prefixize()");
bt_test_suite(t_oid_compare, "Function snmp_oid_compare()");
return bt_exit_value(); return bt_exit_value();
} }

View File

@ -238,3 +238,63 @@ void snmp_oid_dump(struct oid *oid)
log(L_WARN "OID DUMP END ===="); log(L_WARN "OID DUMP END ====");
log(L_WARN); log(L_WARN);
} }
/** snmp_oid_compare - find the lexicographical order relation between @left and @right
* @left: left object id relation operant
* @right: right object id relation operant
*
* function returns 0 if left == right -1 if left < right and 1 otherwise
*/
int
snmp_oid_compare(struct oid *left, struct oid *right)
{
const u32 INTERNET_PREFIX[] = {1, 3, 6, 1};
if (left->prefix == 0 && right->prefix == 0)
goto test_ids;
if (right->prefix == 0)
{
struct oid *temp = left;
left = right;
right = temp;
}
if (left->prefix == 0)
{
for (int i = 0; i < 4; i++)
if (left->ids[i] < INTERNET_PREFIX[i])
return -1;
else if (left->ids[i] > INTERNET_PREFIX[i])
return 1;
for (int i = 0; i < MIN(left->n_subid - 4, right->n_subid); i++)
if (left->ids[i + 4] < right->ids[i])
return -1;
else if (left->ids[i + 4] > right->ids[i])
return 1;
goto all_same;
}
if (left->prefix < right->prefix)
return -1;
else if (left->prefix > right->prefix)
return 1;
test_ids:
for (int i = 0; i < MIN(left->n_subid, right->n_subid); i++)
if (left->ids[i] < right->ids[i])
return -1;
else if (left->ids[i] > right->ids[i])
return 1;
all_same:
/* shorter sequence is before longer in lexicografical order */
if (left->n_subid < right->n_subid)
return -1;
else if (left->n_subid > right->n_subid)
return 1;
else
return 0;
}

View File

@ -29,4 +29,6 @@ void snmp_oid_ip4_index(struct oid *o, uint start, ip4_addr addr);
void snmp_oid_dump(struct oid *oid); void snmp_oid_dump(struct oid *oid);
int snmp_oid_compare(struct oid *left, struct oid *right);
#endif #endif

View File

@ -26,6 +26,9 @@
* *
*/ */
static byte *snmp_mib_fill(struct snmp_proto *p, struct oid *oid, u8 mib_class,
byte *buf, uint size, struct snmp_error *error, uint contid, int byte_ord);
static int parse_response(struct snmp_proto *p, byte *buf, uint size); static int parse_response(struct snmp_proto *p, byte *buf, uint size);
static int snmp_stop_ack(sock *sk, uint size); static int snmp_stop_ack(sock *sk, uint size);
static void do_response(struct snmp_proto *p, byte *buf, uint size); static void do_response(struct snmp_proto *p, byte *buf, uint size);
@ -36,6 +39,7 @@ static void response_err_ind(byte *buf, uint err, uint ind);
static struct oid *search_mib(struct snmp_proto *p, struct oid *o_start, struct oid *o_end, struct oid *o_curr, u8 mib_class, uint contid); static struct oid *search_mib(struct snmp_proto *p, struct oid *o_start, struct oid *o_end, struct oid *o_curr, u8 mib_class, uint contid);
static inline byte *find_n_fill(struct snmp_proto *p, struct oid *o, byte *buf, uint size, uint contid, int byte_ord); static inline byte *find_n_fill(struct snmp_proto *p, struct oid *o, byte *buf, uint size, uint contid, int byte_ord);
static const char * const snmp_errs[] = { static const char * const snmp_errs[] = {
#define SNMP_ERR_SHIFT 256 #define SNMP_ERR_SHIFT 256
[AGENTX_RES_OPEN_FAILED - SNMP_ERR_SHIFT] = "Open failed", [AGENTX_RES_OPEN_FAILED - SNMP_ERR_SHIFT] = "Open failed",
@ -541,15 +545,28 @@ byte *pkt, uint rsize, uint contid, u8 mib_class, int byte_ord)
.type = AGENTX_END_OF_MIB_VIEW, .type = AGENTX_END_OF_MIB_VIEW,
}; };
/*
pkt = snmp_mib_fill( pkt = snmp_mib_fill(
p, o_copy, mib_class, pkt, rsize, &error, contid, byte_ord p, o_copy, mib_class, pkt, rsize, &error, contid, byte_ord
); );
*/
if (o_copy) if (o_copy)
{ {
pkt = snmp_mib_fill(
p, o_copy, mib_class, pkt, rsize, &error, contid, byte_ord
);
mb_free(o_copy); mb_free(o_copy);
} }
else
{
struct agentx_varbind *vb = snmp_create_varbind(pkt, o_start);
pkt += snmp_varbind_size(vb);
vb->type = AGENTX_NO_SUCH_OBJECT;
}
log(L_INFO "over HERE ");
return pkt; return pkt;
} }
@ -1317,6 +1334,9 @@ snmp_prefixize(struct snmp_proto *proto, struct oid *oid, int byte_ord)
{ {
const u32 prefix[] = {1, 3, 6, 1}; const u32 prefix[] = {1, 3, 6, 1};
if (oid == NULL)
return NULL;
if (snmp_is_oid_empty(oid)) if (snmp_is_oid_empty(oid))
{ {
/* allocate new zeroed oid */ /* allocate new zeroed oid */

View File

@ -274,7 +274,4 @@ enum agentx_response_err {
int snmp_rx(sock *sk, uint size); int snmp_rx(sock *sk, uint size);
static byte *snmp_mib_fill(struct snmp_proto *p, struct oid *oid, u8 mib_class,
byte *buf, uint size, struct snmp_error *error, uint contid, int byte_ord);
#endif #endif