2022-08-01 11:01:49 +00:00
|
|
|
/*
|
|
|
|
* BIRD -- Simple Network Management Protocol (SNMP)
|
|
|
|
*
|
|
|
|
* (c) 2022 Vojtech Vilimek <vojtech.vilimek@nic.cz>
|
|
|
|
* (c) 2022 CZ.NIC z.s.p.o
|
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BIRD_SNMP_H_
|
2022-08-10 15:31:32 +00:00
|
|
|
#define _BIRD_SNMP_H_
|
2022-08-01 11:01:49 +00:00
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
#include "lib/ip.h"
|
|
|
|
#include "lib/socket.h"
|
|
|
|
#include "lib/timer.h"
|
|
|
|
#include "nest/bird.h"
|
|
|
|
#include "nest/protocol.h"
|
2022-09-30 07:36:09 +00:00
|
|
|
#include "filter/data.h"
|
2022-08-01 11:01:49 +00:00
|
|
|
#include "proto/bgp/bgp.h"
|
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
|
2022-08-02 14:04:25 +00:00
|
|
|
#define SNMP_UNDEFINED 0
|
|
|
|
#define SNMP_BGP 1
|
|
|
|
#define SNMP_OSPF 2
|
|
|
|
#define SNMP_INVALID 255
|
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
#define SNMP_PORT 705
|
|
|
|
|
2023-08-08 17:00:54 +00:00
|
|
|
#define SNMP_RX_BUFFER_SIZE 8192
|
|
|
|
#define SNMP_TX_BUFFER_SIZE 8192
|
2022-08-10 15:31:32 +00:00
|
|
|
|
2022-12-17 17:16:19 +00:00
|
|
|
enum snmp_proto_state {
|
|
|
|
SNMP_ERR = 0,
|
2023-09-04 07:25:51 +00:00
|
|
|
|
|
|
|
SNMP_INIT = 1,
|
|
|
|
SNMP_LOCKED,
|
|
|
|
SNMP_OPEN,
|
|
|
|
SNMP_REGISTER,
|
|
|
|
SNMP_CONN,
|
|
|
|
SNMP_STOP,
|
|
|
|
SNMP_DOWN,
|
|
|
|
|
|
|
|
/*
|
|
|
|
SNMP_ERR = 0,
|
2022-12-17 17:16:19 +00:00
|
|
|
SNMP_DELAY,
|
|
|
|
SNMP_INIT,
|
|
|
|
SNMP_REGISTER,
|
|
|
|
SNMP_CONN,
|
|
|
|
SNMP_STOP,
|
|
|
|
SNMP_DOWN,
|
|
|
|
SNMP_LISTEN,
|
2023-09-04 07:25:51 +00:00
|
|
|
SNMP_RESET,
|
|
|
|
*/
|
2022-12-17 17:16:19 +00:00
|
|
|
};
|
2022-09-06 16:04:29 +00:00
|
|
|
|
|
|
|
/* hash table macros */
|
2022-09-20 12:28:57 +00:00
|
|
|
#define SNMP_HASH_KEY(n) n->peer_ip
|
|
|
|
#define SNMP_HASH_NEXT(n) n->next
|
2022-09-06 16:04:29 +00:00
|
|
|
#define SNMP_HASH_EQ(ip1, ip2) ipa_equal(ip1, ip2)
|
|
|
|
#define SNMP_HASH_FN(ip) ipa_hash(ip)
|
|
|
|
|
2022-09-30 07:36:09 +00:00
|
|
|
#define SNMP_HASH_LESS4(ip1, ip2) ip4_less(ip1, ip2)
|
|
|
|
#define SNMP_HASH_LESS6(ip1, ip2) ip6_less(ip1, ip2)
|
|
|
|
|
|
|
|
/* hash table only store ip4 addresses */
|
|
|
|
#define SNMP_HASH_LESS(ip1, ip2) SNMP_HASH_LESS4(ip1,ip2)
|
|
|
|
|
2022-08-02 14:04:25 +00:00
|
|
|
struct snmp_bond {
|
|
|
|
node n;
|
|
|
|
struct proto_config *proto;
|
|
|
|
u8 type;
|
|
|
|
};
|
|
|
|
|
2022-08-01 11:01:49 +00:00
|
|
|
struct snmp_config {
|
2022-08-10 15:31:32 +00:00
|
|
|
struct proto_config cf;
|
|
|
|
ip_addr local_ip;
|
|
|
|
ip_addr remote_ip;
|
|
|
|
u16 local_port;
|
|
|
|
u16 remote_port;
|
2022-09-20 12:28:57 +00:00
|
|
|
u32 local_as;
|
2022-08-10 15:31:32 +00:00
|
|
|
u8 timeout;
|
|
|
|
//struct iface *iface;
|
2022-08-02 14:04:25 +00:00
|
|
|
list bgp_entries;
|
2022-09-30 07:36:09 +00:00
|
|
|
u32 bonds;
|
2022-08-01 11:01:49 +00:00
|
|
|
};
|
|
|
|
|
2022-09-20 12:28:57 +00:00
|
|
|
struct snmp_bgp_peer {
|
2022-09-30 07:36:09 +00:00
|
|
|
struct bgp_config *config;
|
2022-09-06 16:04:29 +00:00
|
|
|
ip_addr peer_ip;
|
2022-09-20 12:28:57 +00:00
|
|
|
struct snmp_bgp_peer *next;
|
|
|
|
};
|
2022-09-06 16:04:29 +00:00
|
|
|
|
2022-12-10 17:08:00 +00:00
|
|
|
struct snmp_register {
|
|
|
|
node n;
|
|
|
|
u8 mib_class;
|
|
|
|
u32 session_id;
|
|
|
|
u32 transaction_id;
|
|
|
|
u32 packet_id;
|
|
|
|
struct oid *oid;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct snmp_registered_oid {
|
|
|
|
node n;
|
|
|
|
struct oid *oid;
|
|
|
|
};
|
|
|
|
|
2022-08-01 11:01:49 +00:00
|
|
|
struct snmp_proto {
|
2022-08-10 15:31:32 +00:00
|
|
|
struct proto p;
|
|
|
|
struct object_lock *lock;
|
2022-09-30 07:36:09 +00:00
|
|
|
struct linpool *pool;
|
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
ip_addr local_ip;
|
|
|
|
ip_addr remote_ip;
|
|
|
|
u16 local_port;
|
|
|
|
u16 remote_port;
|
2022-09-20 12:28:57 +00:00
|
|
|
u32 local_as;
|
2022-09-06 16:04:29 +00:00
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
sock *sock;
|
2022-12-10 17:08:00 +00:00
|
|
|
// timeout for what ??
|
2022-08-10 15:31:32 +00:00
|
|
|
u8 timeout;
|
2022-09-06 16:04:29 +00:00
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
u32 session_id;
|
|
|
|
u32 transaction_id;
|
|
|
|
u32 packet_id;
|
2022-09-06 16:04:29 +00:00
|
|
|
|
2022-12-10 17:08:00 +00:00
|
|
|
uint register_to_ack; /* counter of pending responses to register-pdu */
|
|
|
|
list register_queue; /* list containing snmp_register records */
|
|
|
|
list bgp_registered; /* list of currently registered bgp oids
|
2023-07-26 12:34:01 +00:00
|
|
|
* (struct snmp_registered_oid) */
|
2022-12-10 12:22:37 +00:00
|
|
|
|
|
|
|
// map
|
2022-09-30 07:36:09 +00:00
|
|
|
struct f_trie *bgp_trie;
|
2022-09-20 12:28:57 +00:00
|
|
|
HASH(struct snmp_bgp_peer) bgp_hash;
|
2022-08-01 11:01:49 +00:00
|
|
|
struct tbf rl_gen;
|
2022-09-06 16:04:29 +00:00
|
|
|
|
2022-08-10 15:31:32 +00:00
|
|
|
timer *ping_timer;
|
2022-08-01 11:01:49 +00:00
|
|
|
|
2022-09-30 07:36:09 +00:00
|
|
|
uint startup_delay;
|
|
|
|
timer *startup_timer;
|
|
|
|
u8 state;
|
2022-08-01 11:01:49 +00:00
|
|
|
|
2022-09-30 07:36:09 +00:00
|
|
|
uint to_send;
|
|
|
|
uint errs;
|
2022-08-10 15:31:32 +00:00
|
|
|
|
2023-08-08 17:00:54 +00:00
|
|
|
/*
|
|
|
|
* if the packet hasn't been fully recieved, partial_reponse points
|
|
|
|
* into the TX buffer to the Response-PDU header (needed for packet payload)
|
|
|
|
*/
|
|
|
|
struct agentx_response *partial_response;
|
2022-12-10 17:08:00 +00:00
|
|
|
};
|
2023-07-26 12:34:01 +00:00
|
|
|
|
|
|
|
void snmp_tx(sock *sk);
|
2022-12-10 17:08:00 +00:00
|
|
|
|
2022-08-01 11:01:49 +00:00
|
|
|
#endif
|