const struct bgp_stats UNUSED *stats; \
const struct bgp_config UNUSED *config
-#define POPULATE_BGP4(addr, proto, conn, stats, config) populate_bgp4(d, &(addr), &(proto), &(conn), &(stats), &(config))
+#define POPULATE_BGP4(addr, proto, conn, stats, config) populate_bgp4(c, &(addr), &(proto), &(conn), &(stats), &(config))
static inline void ip4_to_oid(struct oid *oid, ip4_addr addr);
void
snmp_bgp4_register(struct snmp_proto *p)
{
- u32 bgp_mib_prefix[] = { 1, BGP4_MIB }; // TODO remove constant
+ u32 bgp_mib_prefix[] = { SNMP_MIB_2, BGP4_MIB };
{
/* Register the whole BGP4-MIB::bgp root tree node */
static inline enum snmp_search_res
-populate_bgp4(struct snmp_data *d, ip4_addr *addr, const struct bgp_proto **proto, const struct bgp_conn
+populate_bgp4(struct snmp_pdu *c, ip4_addr *addr, const struct bgp_proto **proto, const struct bgp_conn
**conn, const struct bgp_stats **stats, const struct bgp_config **config)
{
- const struct oid * const oid = &d->c->sr_vb_start->name;
+ const struct oid * const oid = &c->sr_vb_start->name;
if (snmp_bgp_valid_ip4(oid) && LOAD_U8(oid->n_subid) == 9)
*addr = ip4_from_oid(oid);
else
return SNMP_SEARCH_NO_INSTANCE;
}
- struct snmp_bgp_peer *pe = snmp_hash_find(d->p, *addr);
+ struct snmp_bgp_peer *pe = snmp_hash_find(c->p, *addr);
if (!pe)
{
snmp_log("populate() hash find failed");
if (!ipa_is_ip4(bgp_proto->remote_ip))
{
log(L_ERR "%s: Found BGP protocol instance with IPv6 address", bgp_proto->p.name);
- d->c->error = AGENTX_RES_GEN_ERROR;
+ c->error = AGENTX_RES_GEN_ERROR;
return SNMP_SEARCH_NO_INSTANCE;
}
/* Here, we could be in problem as the bgp_proto IP address could be changed */
log(L_ERR "%s: Stored hash key IP address and peer remote address differ "
"(%I, %I).", bgp_proto->p.name, proto_ip, pe->peer_ip);
- d->c->error = AGENTX_RES_GEN_ERROR;
+ c->error = AGENTX_RES_GEN_ERROR;
return SNMP_SEARCH_NO_INSTANCE;
}
}
static enum snmp_search_res
-fill_bgp_version(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_bgp_version(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill ver");
- if (LOAD_U8(d->c->sr_vb_start->name.n_subid) != 3)
+ if (LOAD_U8(c->sr_vb_start->name.n_subid) != 3)
return SNMP_SEARCH_NO_INSTANCE;
- d->c->size -= snmp_str_size_from_len(1);
- snmp_varbind_nstr(d->c, BGP4_VERSIONS, 1);
+ c->size -= snmp_str_size_from_len(1);
+ snmp_varbind_nstr(c, BGP4_VERSIONS, 1);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_local_as(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_local_as(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill as");
- if (LOAD_U8(d->c->sr_vb_start->name.n_subid) != 3)
+ if (LOAD_U8(c->sr_vb_start->name.n_subid) != 3)
return SNMP_SEARCH_NO_INSTANCE;
- snmp_varbind_int(d->c, d->p->bgp_local_as);
+ snmp_varbind_int(c, c->p->bgp_local_as);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_peer_id(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_peer_id(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill peer id");
enum snmp_search_res res;
if (fsm_state == BGP4_MIB_OPENCONFIRM || fsm_state == BGP4_MIB_ESTABLISHED)
// TODO last
- snmp_varbind_ip4(d->c, ip4_from_u32(bgp_proto->remote_id));
+ snmp_varbind_ip4(c, ip4_from_u32(bgp_proto->remote_id));
else
- snmp_varbind_ip4(d->c, IP4_NONE);
+ snmp_varbind_ip4(c, IP4_NONE);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_peer_state(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_peer_state(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill peer state");
enum snmp_search_res res;
uint fsm_state = snmp_bgp_fsm_state(bgp_proto);
- snmp_varbind_int(d->c, fsm_state);
+ snmp_varbind_int(c, fsm_state);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_admin_status(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_admin_status(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill adm status");
enum snmp_search_res res;
return res;
if (bgp_proto->p.disabled)
- snmp_varbind_int(d->c, AGENTX_ADMIN_STOP);
+ snmp_varbind_int(c, AGENTX_ADMIN_STOP);
else
- snmp_varbind_int(d->c, AGENTX_ADMIN_START);
+ snmp_varbind_int(c, AGENTX_ADMIN_START);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_neg_version(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_neg_version(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill neg ver");
enum snmp_search_res res;
uint fsm_state = snmp_bgp_fsm_state(bgp_proto);
if (fsm_state == BGP4_MIB_ESTABLISHED || fsm_state == BGP4_MIB_ESTABLISHED)
- snmp_varbind_int(d->c, BGP4_MIB_NEGOTIATED_VER_VALUE);
+ snmp_varbind_int(c, BGP4_MIB_NEGOTIATED_VER_VALUE);
else
- snmp_varbind_int(d->c, BGP4_MIB_NEGOTIATED_VER_NO_VALUE);
+ snmp_varbind_int(c, BGP4_MIB_NEGOTIATED_VER_NO_VALUE);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_local_addr(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_local_addr(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("bgp4_mib fill local addr");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_ip4(d->c, ipa_to_ip4(bgp_proto->local_ip));
+ snmp_varbind_ip4(c, ipa_to_ip4(bgp_proto->local_ip));
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_local_port(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_local_port(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("bgp4_mib fill local port");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_int(d->c, bgp_conf->local_port);
+ snmp_varbind_int(c, bgp_conf->local_port);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_remote_addr(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_remote_addr(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("bgp4_mib fill remote addr");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_ip4(d->c, ipa_to_ip4(bgp_proto->remote_ip));
+ snmp_varbind_ip4(c, ipa_to_ip4(bgp_proto->remote_ip));
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_remote_port(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_remote_port(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("bgp4_mib fill remote port");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_int(d->c, bgp_conf->remote_port);
+ snmp_varbind_int(c, bgp_conf->remote_port);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_remote_as(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_remote_as(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill rem as");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_int(d->c, bgp_proto->remote_as);
+ snmp_varbind_int(c, bgp_proto->remote_as);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_in_updates(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_in_updates(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill in updates");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_counter32(d->c, bgp_stats->rx_updates);
+ snmp_varbind_counter32(c, bgp_stats->rx_updates);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_out_updates(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_out_updates(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill out updates");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_counter32(d->c, bgp_stats->tx_updates);
+ snmp_varbind_counter32(c, bgp_stats->tx_updates);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_in_total_msg(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_in_total_msg(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill in total");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_counter32(d->c, bgp_stats->rx_messages);
+ snmp_varbind_counter32(c, bgp_stats->rx_messages);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_out_total_msg(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_out_total_msg(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill out total");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_counter32(d->c, bgp_stats->tx_messages);
+ snmp_varbind_counter32(c, bgp_stats->tx_messages);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_last_err(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_last_err(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill last err");
enum snmp_search_res res;
char last_error[2];
snmp_bgp_last_error(bgp_proto, last_error);
- snmp_varbind_nstr(d->c, last_error, 2);
+ snmp_varbind_nstr(c, last_error, 2);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_established_trans(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_established_trans(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill est trans");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_counter32(d->c,
+ snmp_varbind_counter32(c,
bgp_stats->fsm_established_transitions);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_established_time(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_established_time(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill est time");
enum snmp_search_res res;
return res;
- snmp_varbind_gauge32(d->c,
+ snmp_varbind_gauge32(c,
(current_time() - bgp_proto->last_established) TO_S);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_retry_interval(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_retry_interval(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill retry int");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_int(d->c, bgp_conf->connect_retry_time);
+ snmp_varbind_int(c, bgp_conf->connect_retry_time);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_hold_time(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_hold_time(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill hold time");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_int(d->c, (bgp_conn) ? bgp_conn->hold_time : 0);
+ snmp_varbind_int(c, (bgp_conn) ? bgp_conn->hold_time : 0);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_keep_alive(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_keep_alive(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill keepalive");
enum snmp_search_res res;
return res;
if (!bgp_conf->hold_time)
- snmp_varbind_int(d->c, 0);
+ snmp_varbind_int(c, 0);
else
- snmp_varbind_int(d->c,
+ snmp_varbind_int(c,
(bgp_conn) ? bgp_conn->keepalive_time : 0);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_hold_time_conf(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_hold_time_conf(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill hold time c");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_int(d->c, bgp_conf->hold_time);
+ snmp_varbind_int(c, bgp_conf->hold_time);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_keep_alive_conf(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_keep_alive_conf(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill keepalive c");
enum snmp_search_res res;
if (!bgp_conf->keepalive_time)
- snmp_varbind_int(d->c, 0);
+ snmp_varbind_int(c, 0);
else
- snmp_varbind_int(d->c,
+ snmp_varbind_int(c,
(bgp_conn) ? bgp_conn->keepalive_time : 0);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_min_as_org_interval(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_min_as_org_interval(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill min org int");
enum snmp_search_res res;
return res;
/* value should be in 1..65535 but is not supported by bird */
- snmp_varbind_int(d->c, 0);
+ snmp_varbind_int(c, 0);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_route_adv_interval(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_route_adv_interval(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill rt adv int");
enum snmp_search_res res;
return res;
/* value should be in 1..65535 but is not supported by bird */
- snmp_varbind_int(d->c, 0);
+ snmp_varbind_int(c, 0);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_in_update_elapsed_time(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_in_update_elapsed_time(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fil in elapsed");
enum snmp_search_res res;
if (res != SNMP_SEARCH_OK)
return res;
- snmp_varbind_gauge32(d->c,
+ snmp_varbind_gauge32(c,
(current_time() - bgp_proto->last_rx_update) TO_S
);
return SNMP_SEARCH_OK;
}
static enum snmp_search_res
-fill_local_id(struct mib_walk_state *walk UNUSED, struct snmp_data *d)
+fill_local_id(struct mib_walk_state *walk UNUSED, struct snmp_pdu *c)
{
snmp_log("fill local id");
- if (LOAD_U8(d->c->sr_vb_start->name.n_subid) != 3)
+ if (LOAD_U8(c->sr_vb_start->name.n_subid) != 3)
return SNMP_SEARCH_NO_INSTANCE;
- snmp_varbind_ip4(d->c, d->p->bgp_local_id);
+ snmp_varbind_ip4(c, c->p->bgp_local_id);
return SNMP_SEARCH_OK;
}
* bgp4_next_peer
*/
static int
-bgp4_next_peer(struct mib_walk_state *state, struct snmp_data *data)
+bgp4_next_peer(struct mib_walk_state *state, struct snmp_pdu *c)
{
- //struct agentx_varbind *vb = data->c->sr_vb_start;
- struct oid *oid = &data->c->sr_vb_start->name;
+ struct oid *oid = &c->sr_vb_start->name;
/* BGP4-MIB::bgpPeerIdentifier */
STATIC_OID(9) bgp4_peer_id = {
int old = snmp_oid_size(oid);
int new = snmp_oid_size(peer_oid);
- if (new - old > 0 && (uint) new - old > data->c->size)
+ if (new - old > 0 && (uint) new - old > c->size)
{
snmp_log("bgp4_next_peer small buffer");
- snmp_manage_tbuf(data->p, data->c);
- oid = &data->c->sr_vb_start->name; // TODO fix sr_vb_start in manage_tbuf
+ snmp_manage_tbuf(c->p, c);
+ oid = &c->sr_vb_start->name; // TODO fix sr_vb_start in manage_tbuf
}
- data->c->buffer += (new - old);
+ c->buffer += (new - old);
snmp_oid_copy(oid, peer_oid);
STORE_U8(oid->include, 1);
net_fill_ip4(&net, ip4, IP4_MAX_PREFIX_LENGTH);
struct f_trie_walk_state ws;
- int match = trie_walk_init(&ws, data->p->bgp_trie, &net, 1);
+ int match = trie_walk_init(&ws, c->p->bgp_trie, &net, 1);
if (match && LOAD_U8(oid->include) && precise)
{
struct {
u32 id;
- enum snmp_search_res (*filler)(struct mib_walk_state *state, struct snmp_data *data);
+ enum snmp_search_res (*filler)(struct mib_walk_state *state, struct snmp_pdu *c);
enum agentx_type type;
int size;
} leafs[] = {
};
struct {
- enum snmp_search_res (*filler)(struct mib_walk_state *state, struct snmp_data *data);
+ enum snmp_search_res (*filler)(struct mib_walk_state *state, struct snmp_pdu *c);
enum agentx_type type;
int size;
} entry_leafs[] = {
#include <stdio.h>
inline void
-snmp_pdu_context(struct snmp_pdu *pdu, sock *sk)
+snmp_pdu_context(struct snmp_pdu *pdu, struct snmp_proto *p, sock *sk)
{
+ pdu->p = p;
pdu->error = AGENTX_RES_NO_ERROR;
pdu->buffer = sk->tpos;
pdu->size = sk->tbuf + sk->tbsize - sk->tpos;
* SNMP MIB tree walking
*/
struct mib_leaf *
-snmp_walk_init(struct mib_tree *tree, struct mib_walk_state *walk, const struct oid *oid, struct snmp_data *data)
+snmp_walk_init(struct mib_tree *tree, struct mib_walk_state *walk, const struct oid *oid, struct snmp_pdu *c)
{
mib_tree_walk_init(walk, tree);
- snmp_vb_to_tx(data->p, oid, data->c);
+ snmp_vb_to_tx(c->p, oid, c);
- mib_node_u *node = mib_tree_find(tree, walk, &data->c->sr_vb_start->name);
+ mib_node_u *node = mib_tree_find(tree, walk, &c->sr_vb_start->name);
// TODO hide me in mib_tree code
/* mib_tree_find() returns NULL if the oid is longer than existing any path */
// TODO alter the varbind
struct mib_leaf *
-snmp_walk_next(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_data *data)
+snmp_walk_next(struct mib_tree *tree, struct mib_walk_state *walk, struct snmp_pdu *c)
{
ASSUME(tree && walk);
if (mib_node_is_leaf(node) && leaf->call_next)
{
- const struct oid *oid = &data->c->sr_vb_start->name;
+ const struct oid *oid = &c->sr_vb_start->name;
if (mib_tree_walk_oid_compare(walk, oid) > 0)
{
- int old = snmp_oid_size(&data->c->sr_vb_start->name);
+ int old = snmp_oid_size(&c->sr_vb_start->name);
if (mib_tree_walk_to_oid(walk,
- &data->c->sr_vb_start->name, 20 * sizeof(u32)))
+ &c->sr_vb_start->name, 20 * sizeof(u32)))
{
snmp_log("walk_next copy failed");
return NULL;
}
- int new = snmp_oid_size(&data->c->sr_vb_start->name);
- data->c->buffer += (new - old);
+ int new = snmp_oid_size(&c->sr_vb_start->name);
+ c->buffer += (new - old);
}
- found = !leaf->call_next(walk, data);
+ found = !leaf->call_next(walk, c);
}
- else if (mib_node_is_leaf(node) && LOAD_U8(data->c->sr_vb_start->name.include))
+ else if (mib_node_is_leaf(node) && LOAD_U8(c->sr_vb_start->name.include))
{
found = 1;
- STORE_U8(data->c->sr_vb_start->name.include, 0);
+ STORE_U8(c->sr_vb_start->name.include, 0);
}
- const struct oid *oid = &data->c->sr_vb_start->name;
+ const struct oid *oid = &c->sr_vb_start->name;
u32 skip = (walk->id_pos < LOAD_U8(oid->n_subid)) ?
LOAD_U32(oid->ids[walk->id_pos]) : 0;
while (!found && (leaf = mib_tree_walk_next_leaf(tree, walk, skip)) != NULL)
{
/* mib_tree_walk_next() forces VarBind's name OID overwriting */
- int old = snmp_oid_size(&data->c->sr_vb_start->name);
+ int old = snmp_oid_size(&c->sr_vb_start->name);
// TODO autogrow
- if (mib_tree_walk_to_oid(walk, &data->c->sr_vb_start->name, 20 * sizeof(u32)))
+ if (mib_tree_walk_to_oid(walk, &c->sr_vb_start->name, 20 * sizeof(u32)))
{
snmp_log("walk_next copy failed");
return NULL;
}
- int new = snmp_oid_size(&data->c->sr_vb_start->name);
- data->c->buffer += (new - old);
+ int new = snmp_oid_size(&c->sr_vb_start->name);
+ c->buffer += (new - old);
- if (leaf->call_next && !leaf->call_next(walk, data))
+ if (leaf->call_next && !leaf->call_next(walk, c))
found = 1;
else if (!leaf->call_next)
found = 1;
- oid = &data->c->sr_vb_start->name;
+ oid = &c->sr_vb_start->name;
skip = (walk->id_pos < LOAD_U8(oid->n_subid)) ?
LOAD_U32(oid->ids[walk->id_pos]) : 0;
}
}
enum snmp_search_res
-snmp_walk_fill(struct mib_leaf *leaf, struct mib_walk_state *walk, struct snmp_data *data)
+snmp_walk_fill(struct mib_leaf *leaf, struct mib_walk_state *walk, struct snmp_pdu *c)
{
- struct agentx_varbind *vb = data->c->sr_vb_start;
+ struct agentx_varbind *vb = c->sr_vb_start;
if (!leaf)
return SNMP_SEARCH_NO_OBJECT;
snmp_log("walk_fill got size %u based on lt %u ls %u, calling filler()", size, leaf->type, leaf->size);
- if (size >= data->c->size)
+ if (size >= c->size)
{
- snmp_log("walk_fill small buffer size %d to %d", size, data->c->size);
- snmp_manage_tbuf(data->p, data->c);
+ snmp_log("walk_fill small buffer size %d to %d", size, c->size);
+ snmp_manage_tbuf(c->p, c);
}
- enum snmp_search_res res = leaf->filler(walk, data);
+ enum snmp_search_res res = leaf->filler(walk, c);
- vb = data->c->sr_vb_start;
+ vb = c->sr_vb_start;
if (res != SNMP_SEARCH_OK)
snmp_set_varbind_type(vb, snmp_search_res_to_type(res));
{
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
ASSUME(c.size >= sizeof(struct agentx_response));
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
#define TIMEOUT_SIZE sizeof(u32) /* 1B timeout, 3B zero padding */
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
#define UPTIME_SIZE \
sizeof( struct { u32 vb_type; u32 oid_hdr; u32 ids[4]; } )
const struct snmp_config *cf = SKIP_BACK(struct snmp_config, cf, p->p.cf);
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
#define BOUND_SIZE sizeof(u32)
/* conditional +4 for upper-bound (optinal field) */
{
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
#define REASON_SIZE sizeof(u32)
if (c.size < AGENTX_HEADER_SIZE + REASON_SIZE)
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
if (c.size < AGENTX_HEADER_SIZE)
{
}
struct snmp_pdu c;
- snmp_pdu_context(&c, p->sock);
+ snmp_pdu_context(&c, p, p->sock);
if (c.size < sizeof(struct agentx_response))
{
snmp_log("parse_sets_pdu small buffer");
snmp_get_pdu(struct snmp_proto *p, struct snmp_pdu *c, const struct oid *o_start, struct mib_walk_state *walk)
{
snmp_log("snmp_get_pdu()");
- struct snmp_data d = {
- .p = p,
- .c = c,
- };
struct mib_leaf *leaf;
- leaf = snmp_walk_init(p->mib_tree, walk, o_start, &d);
+ leaf = snmp_walk_init(p->mib_tree, walk, o_start, c);
snmp_log("found node %p", leaf);
enum snmp_search_res res;
- res = snmp_walk_fill(leaf, walk, &d);
+ res = snmp_walk_fill(leaf, walk, c);
snmp_log("fill result %u", res);
int
snmp_get_next_pdu(struct snmp_proto *p, struct snmp_pdu *c, const struct oid *o_start, struct mib_walk_state *walk)
{
- struct snmp_data d = {
- .p = p,
- .c = c,
- };
-
- (void) snmp_walk_init(p->mib_tree, walk, o_start, &d);
- struct mib_leaf *leaf = snmp_walk_next(p->mib_tree, walk, &d);
+ (void) snmp_walk_init(p->mib_tree, walk, o_start, c);
+ struct mib_leaf *leaf = snmp_walk_next(p->mib_tree, walk, c);
enum snmp_search_res res;
- res = snmp_walk_fill(leaf, walk, &d);
+ res = snmp_walk_fill(leaf, walk, c);
if (res != SNMP_SEARCH_OK)
snmp_set_varbind_type(c->sr_vb_start, AGENTX_END_OF_MIB_VIEW);
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
/*
* Get-Bulk processing stops if all the varbind have type END_OF_MIB_VIEW
sock *sk = p->sock;
struct snmp_pdu c;
- snmp_pdu_context(&c, sk);
+ snmp_pdu_context(&c, p, sk);
if (c.size < AGENTX_HEADER_SIZE)
return;
}
void
-snmp_tbuf_reserve(struct snmp_data *data, size_t size)
+snmp_tbuf_reserve(struct snmp_pdu *c, size_t size)
{
- if (size > data->c->size)
+ if (size > c->size)
{
- snmp_manage_tbuf(data->p, data->c);
+ snmp_manage_tbuf(c->p, c);
}
}