1/* $OpenBSD: snmpd.h,v 1.1.1.1 2022/09/01 14:20:33 martijn Exp $ */ 2 3/* 4 * Copyright (c) 2007, 2008, 2012 Reyk Floeter <reyk@openbsd.org> 5 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20#ifndef SNMPD_H 21#define SNMPD_H 22 23#include <sys/tree.h> 24 25#include <net/if.h> 26#include <net/if_dl.h> 27#include <netinet/in.h> 28#include <netinet/if_ether.h> 29#include <netinet/ip.h> 30#include <arpa/inet.h> 31#include <net/pfvar.h> 32#include <net/route.h> 33 34#include <ber.h> 35#include <stdio.h> 36#include <imsg.h> 37 38#include "log.h" 39 40#ifndef nitems 41#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 42#endif 43 44/* 45 * common definitions for snmpd 46 */ 47 48#define CONF_FILE "/etc/snmpd.conf" 49#define SNMPD_SOCKET "/var/run/snmpd.sock" 50#define SNMPD_USER "_snmpd" 51#define SNMP_PORT "161" 52#define SNMPTRAP_PORT "162" 53 54#define SNMPD_MAXSTRLEN 484 55#define SNMPD_MAXCOMMUNITYLEN SNMPD_MAXSTRLEN 56#define SNMPD_MAXVARBIND 0x7fffffff 57#define SNMPD_MAXVARBINDLEN 1210 58#define SNMPD_MAXENGINEIDLEN 32 59#define SNMPD_MAXUSERNAMELEN 32 60#define SNMPD_MAXCONTEXNAMELEN 32 61 62#define SNMP_USM_MAXDIGESTLEN 48 63#define SNMP_USM_SALTLEN 8 64#define SNMP_USM_KEYLEN 64 65#define SNMP_CIPHER_KEYLEN 16 66 67#define SMALL_READ_BUF_SIZE 1024 68#define READ_BUF_SIZE 65535 69#define RT_BUF_SIZE 16384 70#define MAX_RTSOCK_BUF (2 * 1024 * 1024) 71 72#define SNMP_ENGINEID_OLD 0x00 73#define SNMP_ENGINEID_NEW 0x80 /* RFC3411 */ 74 75#define SNMP_ENGINEID_FMT_IPv4 1 76#define SNMP_ENGINEID_FMT_IPv6 2 77#define SNMP_ENGINEID_FMT_MAC 3 78#define SNMP_ENGINEID_FMT_TEXT 4 79#define SNMP_ENGINEID_FMT_OCT 5 80#define SNMP_ENGINEID_FMT_HH 129 81 82#define PEN_OPENBSD 30155 83 84#if DEBUG 85#define DPRINTF log_debug 86#else 87#define DPRINTF(x...) do {} while(0) 88#endif 89 90/* 91 * kroute 92 */ 93 94struct kroute_node; 95struct kroute6_node; 96RB_HEAD(kroute_tree, kroute_node); 97RB_HEAD(kroute6_tree, kroute6_node); 98 99struct ktable { 100 struct kroute_tree krt; 101 struct kroute6_tree krt6; 102 u_int rtableid; 103 u_int rdomain; 104}; 105 106union kaddr { 107 struct sockaddr sa; 108 struct sockaddr_in sin; 109 struct sockaddr_in6 sin6; 110 struct sockaddr_dl sdl; 111 char pad[32]; 112}; 113 114struct kroute { 115 struct in_addr prefix; 116 struct in_addr nexthop; 117 u_long ticks; 118 u_int16_t flags; 119 u_short if_index; 120 u_int8_t prefixlen; 121 u_int8_t priority; 122}; 123 124struct kroute6 { 125 struct in6_addr prefix; 126 struct in6_addr nexthop; 127 u_long ticks; 128 u_int16_t flags; 129 u_short if_index; 130 u_int8_t prefixlen; 131 u_int8_t priority; 132}; 133 134struct kif_addr { 135 u_short if_index; 136 union kaddr addr; 137 union kaddr mask; 138 union kaddr dstbrd; 139 140 TAILQ_ENTRY(kif_addr) entry; 141 RB_ENTRY(kif_addr) node; 142}; 143 144struct kif_arp { 145 u_short flags; 146 u_short if_index; 147 union kaddr addr; 148 union kaddr target; 149 150 TAILQ_ENTRY(kif_arp) entry; 151}; 152 153struct kif { 154 char if_name[IF_NAMESIZE]; 155 char if_descr[IFDESCRSIZE]; 156 u_int8_t if_lladdr[ETHER_ADDR_LEN]; 157 struct if_data if_data; 158 u_long if_ticks; 159 int if_flags; 160 u_short if_index; 161}; 162#define if_mtu if_data.ifi_mtu 163#define if_type if_data.ifi_type 164#define if_addrlen if_data.ifi_addrlen 165#define if_hdrlen if_data.ifi_hdrlen 166#define if_metric if_data.ifi_metric 167#define if_link_state if_data.ifi_link_state 168#define if_baudrate if_data.ifi_baudrate 169#define if_ipackets if_data.ifi_ipackets 170#define if_ierrors if_data.ifi_ierrors 171#define if_opackets if_data.ifi_opackets 172#define if_oerrors if_data.ifi_oerrors 173#define if_collisions if_data.ifi_collisions 174#define if_ibytes if_data.ifi_ibytes 175#define if_obytes if_data.ifi_obytes 176#define if_imcasts if_data.ifi_imcasts 177#define if_omcasts if_data.ifi_omcasts 178#define if_iqdrops if_data.ifi_iqdrops 179#define if_oqdrops if_data.ifi_oqdrops 180#define if_noproto if_data.ifi_noproto 181#define if_lastchange if_data.ifi_lastchange 182#define if_capabilities if_data.ifi_capabilities 183 184#define F_CONNECTED 0x0001 185#define F_STATIC 0x0002 186#define F_BLACKHOLE 0x0004 187#define F_REJECT 0x0008 188#define F_DYNAMIC 0x0010 189 190/* 191 * pf 192 */ 193 194enum { PFRB_TABLES = 1, PFRB_TSTATS, PFRB_ADDRS, PFRB_ASTATS, 195 PFRB_IFACES, PFRB_TRANS, PFRB_MAX }; 196 197enum { IN, OUT }; 198enum { IPV4, IPV6 }; 199enum { PASS, BLOCK }; 200 201enum { PFI_IFTYPE_GROUP, PFI_IFTYPE_INSTANCE }; 202 203struct pfr_buffer { 204 int pfrb_type; /* type of content, see enum above */ 205 int pfrb_size; /* number of objects in buffer */ 206 int pfrb_msize; /* maximum number of objects in buffer */ 207 void *pfrb_caddr; /* malloc'ated memory area */ 208}; 209 210#define PFRB_FOREACH(var, buf) \ 211 for ((var) = pfr_buf_next((buf), NULL); \ 212 (var) != NULL; \ 213 (var) = pfr_buf_next((buf), (var))) 214 215/* 216 * daemon structures 217 */ 218 219struct snmpd { 220 int sc_ncpu; 221 int64_t *sc_cpustates; 222 int sc_rtfilter; 223}; 224 225extern struct snmpd *snmpd_env; 226 227/* mib.c */ 228u_long smi_getticks(void); 229 230/* kroute.c */ 231void kr_init(void); 232void kr_shutdown(void); 233 234u_int kr_ifnumber(void); 235u_long kr_iflastchange(void); 236int kr_updateif(u_int); 237u_long kr_routenumber(void); 238 239struct kif *kr_getif(u_short); 240struct kif *kr_getnextif(u_short); 241struct kif_addr *kr_getaddr(struct sockaddr *); 242struct kif_addr *kr_getnextaddr(struct sockaddr *); 243 244struct kroute *kroute_first(void); 245struct kroute *kroute_getaddr(in_addr_t, u_int8_t, u_int8_t, int); 246 247struct kif_arp *karp_first(u_short); 248struct kif_arp *karp_getaddr(struct sockaddr *, u_short, int); 249 250/* pf.c */ 251void pf_init(void); 252int pf_get_stats(struct pf_status *); 253int pfr_get_astats(struct pfr_table *, struct pfr_astats *, 254 int *, int); 255int pfr_get_tstats(struct pfr_table *, struct pfr_tstats *, 256 int *, int); 257int pfr_buf_grow(struct pfr_buffer *, int); 258const void *pfr_buf_next(struct pfr_buffer *, const void *); 259int pfi_get_ifaces(const char *, struct pfi_kif *, int *); 260int pfi_get(struct pfr_buffer *, const char *); 261int pfi_count(void); 262int pfi_get_if(struct pfi_kif *, int); 263int pft_get(struct pfr_buffer *, struct pfr_table *); 264int pft_count(void); 265int pft_get_table(struct pfr_tstats *, int); 266int pfta_get(struct pfr_buffer *, struct pfr_table *); 267int pfta_get_addr(struct pfr_astats *, int); 268int pfta_get_nextaddr(struct pfr_astats *, int *); 269int pfta_get_first(struct pfr_astats *); 270 271/* timer.c */ 272void timer_init(void); 273 274/* util.c */ 275ssize_t sendtofrom(int, void *, size_t, int, struct sockaddr *, 276 socklen_t, struct sockaddr *, socklen_t); 277ssize_t recvfromto(int, void *, size_t, int, struct sockaddr *, 278 socklen_t *, struct sockaddr *, socklen_t *); 279const char *log_in6addr(const struct in6_addr *); 280const char *print_host(struct sockaddr_storage *, char *, size_t); 281char *tohexstr(u_int8_t *, int); 282uint8_t *fromhexstr(uint8_t *, const char *, size_t); 283 284#endif /* SNMPD_H */ 285