src/libexec/snmpd/snmpd_metrics/snmpd.h

285 lines
7.2 KiB
C

/* $OpenBSD: snmpd.h,v 1.1.1.1 2022/09/01 14:20:33 martijn Exp $ */
/*
* Copyright (c) 2007, 2008, 2012 Reyk Floeter <reyk@openbsd.org>
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef SNMPD_H
#define SNMPD_H
#include <sys/tree.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <net/pfvar.h>
#include <net/route.h>
#include <ber.h>
#include <stdio.h>
#include <imsg.h>
#include "log.h"
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
#endif
/*
* common definitions for snmpd
*/
#define CONF_FILE "/etc/snmpd.conf"
#define SNMPD_SOCKET "/var/run/snmpd.sock"
#define SNMPD_USER "_snmpd"
#define SNMP_PORT "161"
#define SNMPTRAP_PORT "162"
#define SNMPD_MAXSTRLEN 484
#define SNMPD_MAXCOMMUNITYLEN SNMPD_MAXSTRLEN
#define SNMPD_MAXVARBIND 0x7fffffff
#define SNMPD_MAXVARBINDLEN 1210
#define SNMPD_MAXENGINEIDLEN 32
#define SNMPD_MAXUSERNAMELEN 32
#define SNMPD_MAXCONTEXNAMELEN 32
#define SNMP_USM_MAXDIGESTLEN 48
#define SNMP_USM_SALTLEN 8
#define SNMP_USM_KEYLEN 64
#define SNMP_CIPHER_KEYLEN 16
#define SMALL_READ_BUF_SIZE 1024
#define READ_BUF_SIZE 65535
#define RT_BUF_SIZE 16384
#define MAX_RTSOCK_BUF (2 * 1024 * 1024)
#define SNMP_ENGINEID_OLD 0x00
#define SNMP_ENGINEID_NEW 0x80 /* RFC3411 */
#define SNMP_ENGINEID_FMT_IPv4 1
#define SNMP_ENGINEID_FMT_IPv6 2
#define SNMP_ENGINEID_FMT_MAC 3
#define SNMP_ENGINEID_FMT_TEXT 4
#define SNMP_ENGINEID_FMT_OCT 5
#define SNMP_ENGINEID_FMT_HH 129
#define PEN_OPENBSD 30155
#if DEBUG
#define DPRINTF log_debug
#else
#define DPRINTF(x...) do {} while(0)
#endif
/*
* kroute
*/
struct kroute_node;
struct kroute6_node;
RB_HEAD(kroute_tree, kroute_node);
RB_HEAD(kroute6_tree, kroute6_node);
struct ktable {
struct kroute_tree krt;
struct kroute6_tree krt6;
u_int rtableid;
u_int rdomain;
};
union kaddr {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
struct sockaddr_dl sdl;
char pad[32];
};
struct kroute {
struct in_addr prefix;
struct in_addr nexthop;
u_long ticks;
u_int16_t flags;
u_short if_index;
u_int8_t prefixlen;
u_int8_t priority;
};
struct kroute6 {
struct in6_addr prefix;
struct in6_addr nexthop;
u_long ticks;
u_int16_t flags;
u_short if_index;
u_int8_t prefixlen;
u_int8_t priority;
};
struct kif_addr {
u_short if_index;
union kaddr addr;
union kaddr mask;
union kaddr dstbrd;
TAILQ_ENTRY(kif_addr) entry;
RB_ENTRY(kif_addr) node;
};
struct kif_arp {
u_short flags;
u_short if_index;
union kaddr addr;
union kaddr target;
TAILQ_ENTRY(kif_arp) entry;
};
struct kif {
char if_name[IF_NAMESIZE];
char if_descr[IFDESCRSIZE];
u_int8_t if_lladdr[ETHER_ADDR_LEN];
struct if_data if_data;
u_long if_ticks;
int if_flags;
u_short if_index;
};
#define if_mtu if_data.ifi_mtu
#define if_type if_data.ifi_type
#define if_addrlen if_data.ifi_addrlen
#define if_hdrlen if_data.ifi_hdrlen
#define if_metric if_data.ifi_metric
#define if_link_state if_data.ifi_link_state
#define if_baudrate if_data.ifi_baudrate
#define if_ipackets if_data.ifi_ipackets
#define if_ierrors if_data.ifi_ierrors
#define if_opackets if_data.ifi_opackets
#define if_oerrors if_data.ifi_oerrors
#define if_collisions if_data.ifi_collisions
#define if_ibytes if_data.ifi_ibytes
#define if_obytes if_data.ifi_obytes
#define if_imcasts if_data.ifi_imcasts
#define if_omcasts if_data.ifi_omcasts
#define if_iqdrops if_data.ifi_iqdrops
#define if_oqdrops if_data.ifi_oqdrops
#define if_noproto if_data.ifi_noproto
#define if_lastchange if_data.ifi_lastchange
#define if_capabilities if_data.ifi_capabilities
#define F_CONNECTED 0x0001
#define F_STATIC 0x0002
#define F_BLACKHOLE 0x0004
#define F_REJECT 0x0008
#define F_DYNAMIC 0x0010
/*
* pf
*/
enum { PFRB_TABLES = 1, PFRB_TSTATS, PFRB_ADDRS, PFRB_ASTATS,
PFRB_IFACES, PFRB_TRANS, PFRB_MAX };
enum { IN, OUT };
enum { IPV4, IPV6 };
enum { PASS, BLOCK };
enum { PFI_IFTYPE_GROUP, PFI_IFTYPE_INSTANCE };
struct pfr_buffer {
int pfrb_type; /* type of content, see enum above */
int pfrb_size; /* number of objects in buffer */
int pfrb_msize; /* maximum number of objects in buffer */
void *pfrb_caddr; /* malloc'ated memory area */
};
#define PFRB_FOREACH(var, buf) \
for ((var) = pfr_buf_next((buf), NULL); \
(var) != NULL; \
(var) = pfr_buf_next((buf), (var)))
/*
* daemon structures
*/
struct snmpd {
int sc_ncpu;
int64_t *sc_cpustates;
int sc_rtfilter;
};
extern struct snmpd *snmpd_env;
/* mib.c */
u_long smi_getticks(void);
/* kroute.c */
void kr_init(void);
void kr_shutdown(void);
u_int kr_ifnumber(void);
u_long kr_iflastchange(void);
int kr_updateif(u_int);
u_long kr_routenumber(void);
struct kif *kr_getif(u_short);
struct kif *kr_getnextif(u_short);
struct kif_addr *kr_getaddr(struct sockaddr *);
struct kif_addr *kr_getnextaddr(struct sockaddr *);
struct kroute *kroute_first(void);
struct kroute *kroute_getaddr(in_addr_t, u_int8_t, u_int8_t, int);
struct kif_arp *karp_first(u_short);
struct kif_arp *karp_getaddr(struct sockaddr *, u_short, int);
/* pf.c */
void pf_init(void);
int pf_get_stats(struct pf_status *);
int pfr_get_astats(struct pfr_table *, struct pfr_astats *,
int *, int);
int pfr_get_tstats(struct pfr_table *, struct pfr_tstats *,
int *, int);
int pfr_buf_grow(struct pfr_buffer *, int);
const void *pfr_buf_next(struct pfr_buffer *, const void *);
int pfi_get_ifaces(const char *, struct pfi_kif *, int *);
int pfi_get(struct pfr_buffer *, const char *);
int pfi_count(void);
int pfi_get_if(struct pfi_kif *, int);
int pft_get(struct pfr_buffer *, struct pfr_table *);
int pft_count(void);
int pft_get_table(struct pfr_tstats *, int);
int pfta_get(struct pfr_buffer *, struct pfr_table *);
int pfta_get_addr(struct pfr_astats *, int);
int pfta_get_nextaddr(struct pfr_astats *, int *);
int pfta_get_first(struct pfr_astats *);
/* timer.c */
void timer_init(void);
/* util.c */
ssize_t sendtofrom(int, void *, size_t, int, struct sockaddr *,
socklen_t, struct sockaddr *, socklen_t);
ssize_t recvfromto(int, void *, size_t, int, struct sockaddr *,
socklen_t *, struct sockaddr *, socklen_t *);
const char *log_in6addr(const struct in6_addr *);
const char *print_host(struct sockaddr_storage *, char *, size_t);
char *tohexstr(u_int8_t *, int);
uint8_t *fromhexstr(uint8_t *, const char *, size_t);
#endif /* SNMPD_H */