return state;
}
+void
+snmp_bgp_reg_ok(struct snmp_proto *p, struct agentx_response *r, struct oid *oid)
+{
+ const struct oid *in_buf = ((void *) r) + sizeof(r);
+ int byte_ord = r->h.flags & AGENTX_NETWORK_BYTE_ORDER;
+ struct oid *dup = snmp_prefixize(p, in_buf, byte_ord);
+
+ ASSUME(snmp_bgp_state(oid) == snmp_bgp_state(dup));
+ mb_free(dup);
+}
+
+void
+snmp_bgp_reg_failed(struct snmp_proto *p, struct agentx_response UNUSED *r, struct oid UNUSED *oid)
+{
+ snmp_stop_subagent(p);
+}
+
static void
snmp_bgp_notify_common(struct snmp_proto *p, uint type, ip4_addr ip4, char last_error[], uint state_val)
{
/* 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->pool, snmp_oid_sizeof(2));
- STORE_U8(oid->n_subid, 2);
+ struct oid *oid = mb_alloc(p->pool,
+ snmp_oid_sizeof(ARRAY_SIZE(bgp_mib_prefix)));
+ STORE_U8(oid->n_subid, ARRAY_SIZE(bgp_mib_prefix));
STORE_U8(oid->prefix, SNMP_MGMT);
- memcpy(oid->ids, bgp_mib_prefix, 2 * sizeof(u32));
-
+ memcpy(oid->ids, bgp_mib_prefix, sizeof(bgp_mib_prefix));
registering->oid = oid;
- add_tail(&p->register_queue, ®istering->n);
- p->register_to_ack++;
/* snmp_register(struct snmp_proto *p, struct oid *oid, uint index, uint len, u8 is_instance, uint contid) */
snmp_register(p, oid, 1, 0, SNMP_REGISTER_TREE, SNMP_DEFAULT_CONTEXT);
[AGENTX_RESPONSE_PDU] = "Response-PDU",
};
+
+static void
+snmp_register_ok(struct snmp_proto *p, struct agentx_response *res, struct oid *oid, u8 UNUSED class)
+{
+ // TODO switch based on oid type
+ snmp_bgp_reg_ok(p, res, oid);
+}
+
+static void
+snmp_register_failed(struct snmp_proto *p, struct agentx_response *res, struct oid *oid, u8 UNUSED class)
+{
+ // TODO switch based on oid type
+ snmp_bgp_reg_failed(p, res, oid);
+}
+
void
-snmp_register_ack(struct snmp_proto *p, struct agentx_header *h, u8 class)
+snmp_register_ack(struct snmp_proto *p, struct agentx_response *res, u8 class)
{
struct snmp_register *reg;
WALK_LIST(reg, p->register_queue)
{
// TODO add support for more mib trees (other than BGP)
- if (snmp_register_same(reg, h, class))
+ if (snmp_register_same(reg, &res->h, class))
{
struct snmp_registered_oid *ro = \
mb_alloc(p->p.pool, sizeof(struct snmp_registered_oid));
p->register_to_ack--;
add_tail(&p->bgp_registered, &ro->n);
+
+ if (res->error == AGENTX_RES_NO_ERROR)
+ snmp_register_ok(p, res, ro->oid, class);
+ else
+ snmp_register_failed(p, res, ro->oid, class);
return;
}
}
static int snmp_testset(struct snmp_proto *p, const struct agentx_varbind *vb, uint pkt_size);
*/
/* return 1 if the value could be set */
-static int
+static int UNUSED
snmp_testset(struct snmp_proto *p, const struct agentx_varbind *vb, struct oid *oid, uint pkt_size)
{
/* Hard-coded no support for writing */
ADVANCE(pkt, size, AGENTX_HEADER_SIZE);
uint pkt_size = LOAD_U32(h->payload, h->flags & AGENTX_NETWORK_BYTE_ORDER);
+ if (pkt_size < size)
+ return 0;
+
sock *sk = p->sock;
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
c.byte_ord = 0; /* use little-endian */
}
}
-static void
-snmp_register_ok(struct snmp_proto *p, struct agentx_response *r, uint size, u8 type)
-{
- (void)p;(void)r;(void)size;(void)type;
-}
-
-static void
-snmp_register_failed(struct snmp_proto *p, struct agentx_response *r, uint size, u8 type)
-{
- (void)p;(void)r;(void)size;(void)type;
-}
-
-static void
-unsupported_context(struct snmp_proto *p, struct agentx_response *r, uint size)
-{
- (void)p;(void)r;(void)size;
- // TODO unsupported_context
-}
static uint
parse_response(struct snmp_proto *p, byte *res, uint size)
/* Registration errors */
case AGENTX_RES_DUPLICATE_REGISTER:
case AGENTX_RES_REQUEST_DENIED:
- snmp_register_failed(p, r, size, h->type);
- break;
-
- case AGENTX_RES_UNSUPPORTED_CONTEXT:
- unsupported_context(p, r, size);
+ // TODO: more direct path to mib-specifiec code
+ snmp_register_ack(p, r, size);
break;
/* We are trying to unregister a MIB, the unknownRegistration has same
* effect as success */
case AGENTX_RES_UNKNOWN_REGISTER:
case AGENTX_RES_UNKNOWN_AGENT_CAPS:
+ case AGENTX_RES_UNSUPPORTED_CONTEXT:
case AGENTX_RES_PARSE_ERROR:
case AGENTX_RES_PROCESSING_ERR:
default:
const struct oid *oid = (void *) pkt;
- snmp_register_ack(p, h, snmp_get_mib_class(oid));
+ snmp_register_ack(p, r, snmp_get_mib_class(oid));
if (p->register_to_ack == 0)
{