#include "bgp_mib.h"
static const char * const debug_bgp_states[] UNUSED = {
- [BGP_INTERNAL_INVALID] = "BGP_INTERNAL_INVALID",
- [BGP_INTERNAL_BGP] = "BGP_INTERNAL_BGP",
- [BGP_INTERNAL_VERSION] = "BGP_INTERNAL_VERSION",
- [BGP_INTERNAL_LOCAL_AS] = "BGP_INTERNAL_LOCAL_AS",
- [BGP_INTERNAL_PEER_TABLE] = "BGP_INTERNAL_PEER_TABLE",
- [BGP_INTERNAL_PEER_ENTRY] = "BGP_INTERNAL_PEER_ENTRY",
- [BGP_INTERNAL_IDENTIFIER] = "BGP_INTERNAL_IDENTIFIER",
- [BGP_INTERNAL_STATE] = "BGP_INTERNAL_STATE",
- [BGP_INTERNAL_ADMIN_STATUS] = "BGP_INTERNAL_ADMIN_STATUS",
- [BGP_INTERNAL_NEGOTIATED_VERSION] = "BGP_INTERNAL_NEGOTIATED_VERSION",
- [BGP_INTERNAL_LOCAL_ADDR] = "BGP_INTERNAL_LOCAL_ADDR",
- [BGP_INTERNAL_LOCAL_PORT] = "BGP_INTERNAL_LOCAL_PORT",
- [BGP_INTERNAL_REMOTE_ADDR] = "BGP_INTERNAL_REMOTE_ADDR",
- [BGP_INTERNAL_REMOTE_PORT] = "BGP_INTERNAL_REMOTE_PORT",
- [BGP_INTERNAL_REMOTE_AS] = "BGP_INTERNAL_REMOTE_AS",
- [BGP_INTERNAL_RX_UPDATES] = "BGP_INTERNAL_RX_UPDATES",
- [BGP_INTERNAL_TX_UPDATES] = "BGP_INTERNAL_TX_UPDATES",
- [BGP_INTERNAL_RX_MESSAGES] = "BGP_INTERNAL_RX_MESSAGES",
- [BGP_INTERNAL_TX_MESSAGES] = "BGP_INTERNAL_TX_MESSAGES",
- [BGP_INTERNAL_LAST_ERROR] = "BGP_INTERNAL_LAST_ERROR",
- [BGP_INTERNAL_FSM_TRANSITIONS] = "BGP_INTERNAL_FSM_TRANSITIONS",
- [BGP_INTERNAL_FSM_ESTABLISHED_TIME] = "BGP_INTERNAL_FSM_ESTABLISHED_TIME",
- [BGP_INTERNAL_RETRY_INTERVAL] = "BGP_INTERNAL_RETRY_INTERVAL",
- [BGP_INTERNAL_HOLD_TIME] = "BGP_INTERNAL_HOLD_TIME",
- [BGP_INTERNAL_KEEPALIVE] = "BGP_INTERNAL_KEEPALIVE",
- [BGP_INTERNAL_HOLD_TIME_CONFIGURED] = "BGP_INTERNAL_HOLD_TIME_CONFIGURED",
- [BGP_INTERNAL_KEEPALIVE_CONFIGURED] = "BGP_INTERNAL_KEEPALIVE_CONFIGURED",
- [BGP_INTERNAL_ORIGINATION_INTERVAL] = "BGP_INTERNAL_ORIGINATION_INTERVAL",
+ [BGP_INTERNAL_INVALID] = "BGP_INTERNAL_INVALID",
+ [BGP_INTERNAL_BGP] = "BGP_INTERNAL_BGP",
+ [BGP_INTERNAL_VERSION] = "BGP_INTERNAL_VERSION",
+ [BGP_INTERNAL_LOCAL_AS] = "BGP_INTERNAL_LOCAL_AS",
+ [BGP_INTERNAL_PEER_TABLE] = "BGP_INTERNAL_PEER_TABLE",
+ [BGP_INTERNAL_PEER_ENTRY] = "BGP_INTERNAL_PEER_ENTRY",
+ [BGP_INTERNAL_IDENTIFIER] = "BGP_INTERNAL_IDENTIFIER",
+ [BGP_INTERNAL_STATE] = "BGP_INTERNAL_STATE",
+ [BGP_INTERNAL_ADMIN_STATUS] = "BGP_INTERNAL_ADMIN_STATUS",
+ [BGP_INTERNAL_NEGOTIATED_VERSION] = "BGP_INTERNAL_NEGOTIATED_VERSION",
+ [BGP_INTERNAL_LOCAL_ADDR] = "BGP_INTERNAL_LOCAL_ADDR",
+ [BGP_INTERNAL_LOCAL_PORT] = "BGP_INTERNAL_LOCAL_PORT",
+ [BGP_INTERNAL_REMOTE_ADDR] = "BGP_INTERNAL_REMOTE_ADDR",
+ [BGP_INTERNAL_REMOTE_PORT] = "BGP_INTERNAL_REMOTE_PORT",
+ [BGP_INTERNAL_REMOTE_AS] = "BGP_INTERNAL_REMOTE_AS",
+ [BGP_INTERNAL_RX_UPDATES] = "BGP_INTERNAL_RX_UPDATES",
+ [BGP_INTERNAL_TX_UPDATES] = "BGP_INTERNAL_TX_UPDATES",
+ [BGP_INTERNAL_RX_MESSAGES] = "BGP_INTERNAL_RX_MESSAGES",
+ [BGP_INTERNAL_TX_MESSAGES] = "BGP_INTERNAL_TX_MESSAGES",
+ [BGP_INTERNAL_LAST_ERROR] = "BGP_INTERNAL_LAST_ERROR",
+ [BGP_INTERNAL_FSM_TRANSITIONS] = "BGP_INTERNAL_FSM_TRANSITIONS",
+ [BGP_INTERNAL_FSM_ESTABLISHED_TIME] = "BGP_INTERNAL_FSM_ESTABLISHED_TIME",
+ [BGP_INTERNAL_RETRY_INTERVAL] = "BGP_INTERNAL_RETRY_INTERVAL",
+ [BGP_INTERNAL_HOLD_TIME] = "BGP_INTERNAL_HOLD_TIME",
+ [BGP_INTERNAL_KEEPALIVE] = "BGP_INTERNAL_KEEPALIVE",
+ [BGP_INTERNAL_HOLD_TIME_CONFIGURED] = "BGP_INTERNAL_HOLD_TIME_CONFIGURED",
+ [BGP_INTERNAL_KEEPALIVE_CONFIGURED] = "BGP_INTERNAL_KEEPALIVE_CONFIGURED",
+ [BGP_INTERNAL_ORIGINATION_INTERVAL] = "BGP_INTERNAL_ORIGINATION_INTERVAL",
[BGP_INTERNAL_MIN_ROUTE_ADVERTISEMENT] = "BGP_INTERNAL_MIN_ROUTE_ADVERTISEMENT",
- [BGP_INTERNAL_IN_UPDATE_ELAPSED_TIME] = "BGP_INTERNAL_IN_UPDATE_ELAPSED_TIME",
- [BGP_INTERNAL_END] = "BGP_INTERNAL_END",
- [BGP_INTERNAL_NO_VALUE] = "BGP_INTERNAL_NO_VALUE",
+ [BGP_INTERNAL_IN_UPDATE_ELAPSED_TIME] = "BGP_INTERNAL_IN_UPDATE_ELAPSED_TIME",
+ [BGP_INTERNAL_END] = "BGP_INTERNAL_END",
+ [BGP_INTERNAL_NO_VALUE] = "BGP_INTERNAL_NO_VALUE",
};
void
struct bgp_conn *conn = bgp_proto->conn;
snmp_log(" name: %s", cf->name);
- snmp_log("");
+ snmp_log(".");
snmp_log(" rem. identifier: %u", bgp_proto->remote_id);
snmp_log(" local ip: %I", config->local_ip);
snmp_log(" remote ip: %I", config->remote_ip);
*
* Returns linearized state for Get-PDU, GetNext-PDU and GetBulk-PDU packets.
*/
-u8
-snmp_bgp_state(struct oid *oid)
+static u8
+snmp_bgp_state(const struct oid *oid)
{
/* already checked:
- xxxxxxxx p
+ * xxxxxxxx p
* (*oid): .1.3.6.1.2.1.15
* -> BGP4-MIB::bgp (root)
*/
state = BGP_INTERNAL_NO_VALUE;
candidate = BGP_INTERNAL_NO_VALUE;
}
-
else /* oid->ids[2] > SNMP_BGP_PEER_TABLE */
state = BGP_INTERNAL_END;
}
o->ids[1] == BGP4_MIB_LOCAL_AS))
return 1;
else if (o->n_subid > 2 && o->ids[1] == BGP4_PEER_TABLE &&
- o->ids[2] == BGP4_PEER_ENTRY)
+ o->ids[2] == BGP4_PEER_ENTRY)
{
if (o->n_subid == 3)
return 1;
/* TODO can be remove after implementing all BGP4-MIB::bgpPeerTable columns */
u8 next_state = current_state;
struct oid *o_copy = o_start;
- do {
+ do
+ {
snmp_log("do-while state %u", next_state);
snmp_oid_dump(o_start);
o_start = o_copy = update_bgp_oid(o_copy, next_state);
// o_start = update_bgp_oid(o_start, next_state);
// snmp_oid_dump(o_start);
//
-// snmp_log("search_bgp_mib() is NOT next_state dynamic %s",
+// snmp_log("snmp_bgp_search() is NOT next_state dynamic %s",
// !is_dynamic(next_state) ? "true" : "false");
//
// if (!is_dynamic(next_state))
#include "snmp.h"
#include "subagent.h"
+#include "snmp_utils.h"
static void snmp_connected(sock *sk);
static void snmp_sock_err(sock *sk, int err);
static void snmp_startup(struct snmp_proto *p);
static void snmp_startup_timeout(timer *t);
static void snmp_start_locked(struct object_lock *lock);
-
+static int snmp_shutdown(struct proto *P);
static const char * const snmp_state[] = {
[SNMP_ERR] = "SNMP ERROR",
p->local_port = cf->local_port;
p->remote_port = cf->remote_port;
p->local_as = cf->local_as;
- snmp_log("chaning proto_snmp state to INIT");
+ snmp_log("changing proto_snmp state to INIT");
p->state = SNMP_INIT;
// p->timeout = cf->timeout;
static inline void
snmp_cleanup(struct snmp_proto *p)
{
+ struct additional_buffer *b;
+ WALK_LIST(b, p->additional_buffers)
+ {
+ mb_free(b->buf);
+ rem_node(&b->n);
+ mb_free(b);
+ }
+ init_list(&p->additional_buffers);
+
rfree(p->startup_timer);
rfree(p->ping_timer);
if (p->sock != NULL)
rfree(p->sock);
+ p->sock = NULL;
if (p->lock != NULL)
rfree(p->lock);
+ p->lock = NULL;
p->state = SNMP_DOWN;
}
snmp_log("socket ready!, trying to connect");
}
-static void
-snmp_tx(sock *sk UNUSED)
-{
- snmp_log("snmp_tx() something, yay!");
-}
-
static void
snmp_connected(sock *sk)
{
struct snmp_proto *p = sk->data;
snmp_log("snmp_connected() connection created");
- byte *buf UNUSED = sk->rbuf;
+ byte *buf UNUSED = sk->rpos;
+ uint size = sk->rbuf + sk->rbsize - sk->rpos;
+ snmp_dump_packet(buf, size);
sk->rx_hook = snmp_rx;
sk->tx_hook = snmp_tx;
snmp_sock_err(sock *sk, int err)
{
snmp_log("snmp_sock_err() %s - err no: %d", strerror(err), err);
-
struct snmp_proto *p = sk->data;
+ p->errs++;
+
tm_stop(p->ping_timer);
rfree(p->sock);
p->lock = NULL;
snmp_log("changing proto_snmp state to ERR[OR]");
- p->state = SNMP_ERR;
+ if (err)
+ p->state = SNMP_ERR;
+ else
+ {
+ snmp_shutdown((struct proto *) p);
+ return;
+ }
// TODO ping interval
- tm_start(p->startup_timer, 15 S);
+ tm_start(p->startup_timer, 4 S);
}
static int
peer->config = (struct bgp_config *) b->proto;
peer->peer_ip = bc->remote_ip;
- struct net_addr *net = mb_allocz(p->p.pool, sizeof(struct net_addr));
- net_fill_ip4(net, ipa_to_ip4(peer->peer_ip), IP4_MAX_PREFIX_LENGTH);
+ struct net_addr net;
+ net_fill_ip4(&net, ipa_to_ip4(peer->peer_ip), IP4_MAX_PREFIX_LENGTH);
- trie_add_prefix(p->bgp_trie, net, IP4_MAX_PREFIX_LENGTH, IP4_MAX_PREFIX_LENGTH);
+ trie_add_prefix(p->bgp_trie, &net, IP4_MAX_PREFIX_LENGTH, IP4_MAX_PREFIX_LENGTH);
HASH_INSERT(p->bgp_hash, SNMP_HASH, peer);
}
}
+ init_list(&p->additional_buffers);
+
snmp_startup(p);
return PS_START;
}
return 1;
}
-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_config *c = (void *) P->cf;
static void
snmp_postconfig(struct proto_config *CF)
{
+ // walk the bgp protocols and cache their references
if (((struct snmp_config *) CF)->local_as == 0)
cf_error("local as not specified");
}
buf = pkt = sk->tbuf;
uint size = sk->tbsize;
+
if (size > AGENTX_HEADER_SIZE + )
{
snmp_log("de_allocate_pdu()");
return;
}
- snmp_log("preparing to sk_send()");
- int ret = sk_send(sk, pkt - buf);
struct agentx_header *h;
SNMP_CREATE(buf, struct agentx_header, h);
SNMP_SESSION(h, p);
ADVANCE(buf, size, AGENTX_HEADER_SIZE);
- if (ret == 0)
- snmp_log("sk_send sleep");
- else if (ret < 0)
- snmp_log("sk_send err");
- else
- log(L_INFO, "sk_send ok !!");
+ uint in_pkt;
+ if (c && c->length)
+ {
+ SNMP_HAS_CONTEXT(h);
+ in_pkt = snmp_put_nstr(buf, c->context, c->length) - buf;
+ ADVANCE(buf, size, in_pkt);
}
+
+ memcpy(buf, cap, snmp_oid_size(cap));
+ ADVANCE(buf, size, snmp_oid_size(cap));
+
+ // update state in snmp_proto structure
+
+ //int ret = sk_send(sk, buf - sk->tbuf);
+ int ret = sk_send(sk, buf - sk->tpos);
+ if (ret == 0)
+ snmp_log("sk_send sleep");
+ else if (ret < 0)
+ snmp_log("sk_send err");
+ else
+ log(L_INFO, "sk_send ok !!");
}
+#endif
static inline void
refresh_ids(struct snmp_proto *p, struct agentx_header *h)
}
static void
-snmp_register_mibs(struct snmp_proto *p) {
+snmp_register_mibs(struct snmp_proto *p)
+{
snmp_log("snmp_register_mibs()");
snmp_bgp_register(p);