Annotation of src/usr.bin/snmp/snmp.h, Revision 1.7
1.7 ! martijn 1: /* $OpenBSD: snmp.h,v 1.6 2019/10/03 11:02:26 martijn Exp $ */
1.1 martijn 2:
3: /*
4: * Copyright (c) 2019 Martijn van Duren <martijn@openbsd.org>
5: * Copyright (c) 2007, 2008, 2012 Reyk Floeter <reyk@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_SNMP_H
21: #define SNMPD_SNMP_H
22:
23: #include <sys/types.h>
24: #include <sys/queue.h>
25: #include <endian.h>
26:
27: #include <time.h>
28:
29: #define READ_BUF_SIZE 65535
30:
31: #define SNMP_MAX_OID_STRLEN 128 /* max size of the OID _string_ */
32:
33: /*
34: * SNMP BER types
35: */
36:
37: enum snmp_version {
38: SNMP_V1 = 0,
39: SNMP_V2C = 1, /* SNMPv2c */
40: SNMP_V3 = 3
41: };
42:
43: enum snmp_context {
44: SNMP_C_GETREQ = 0,
45: SNMP_C_GETNEXTREQ = 1,
46: SNMP_C_GETRESP = 2,
47: SNMP_C_SETREQ = 3,
48: SNMP_C_TRAP = 4,
49:
50: /* SNMPv2 */
51: SNMP_C_GETBULKREQ = 5,
52: SNMP_C_INFORMREQ = 6,
53: SNMP_C_TRAPV2 = 7,
54: SNMP_C_REPORT = 8
55: };
56:
57: enum snmp_application {
58: SNMP_T_IPADDR = 0,
59: SNMP_T_COUNTER32 = 1,
60: SNMP_T_GAUGE32 = 2,
61: SNMP_T_UNSIGNED32 = 2,
62: SNMP_T_TIMETICKS = 3,
63: SNMP_T_OPAQUE = 4,
64: SNMP_T_NSAPADDR = 5,
65: SNMP_T_COUNTER64 = 6,
66: SNMP_T_UINTEGER32 = 7
67: };
68:
69: enum snmp_generic_trap {
70: SNMP_TRAP_COLDSTART = 0,
71: SNMP_TRAP_WARMSTART = 1,
72: SNMP_TRAP_LINKDOWN = 2,
73: SNMP_TRAP_LINKUP = 3,
74: SNMP_TRAP_AUTHFAILURE = 4,
75: SNMP_TRAP_EGPNEIGHLOSS = 5,
76: SNMP_TRAP_ENTERPRISE = 6
77: };
78:
79: enum snmp_error {
80: SNMP_ERROR_NONE = 0,
81: SNMP_ERROR_TOOBIG = 1,
82: SNMP_ERROR_NOSUCHNAME = 2,
83: SNMP_ERROR_BADVALUE = 3,
84: SNMP_ERROR_READONLY = 4,
85: SNMP_ERROR_GENERR = 5,
86:
87: /* SNMPv2 */
88: SNMP_ERROR_NOACCESS = 6,
89: SNMP_ERROR_WRONGTYPE = 7,
90: SNMP_ERROR_WRONGLENGTH = 8,
91: SNMP_ERROR_WRONGENC = 9,
92: SNMP_ERROR_WRONGVALUE = 10,
93: SNMP_ERROR_NOCREATION = 11,
94: SNMP_ERROR_INCONVALUE = 12,
95: SNMP_ERROR_RESUNAVAIL = 13, /* EGAIN */
96: SNMP_ERROR_COMMITFAILED = 14,
97: SNMP_ERROR_UNDOFAILED = 15,
98: SNMP_ERROR_AUTHERROR = 16,
99: SNMP_ERROR_NOTWRITABLE = 17,
100: SNMP_ERROR_INCONNAME = 18
101: };
102:
103: enum snmp_security_model {
104: SNMP_SEC_ANY = 0,
105: SNMP_SEC_SNMPv1 = 1,
106: SNMP_SEC_SNMPv2c = 2,
107: SNMP_SEC_USM = 3,
108: SNMP_SEC_TSM = 4
1.7 ! martijn 109: };
! 110:
! 111: enum snmp_application_exception {
! 112: SNMP_E_NOSUCHOBJECT = 0,
! 113: SNMP_E_NOSUCHINSTANCE = 1,
! 114: SNMP_E_ENDOFMIB = 2
1.1 martijn 115: };
116:
1.3 martijn 117: struct snmp_agent;
118:
119: struct snmp_sec {
120: enum snmp_security_model model;
121: int (*init)(struct snmp_agent *);
1.4 martijn 122: char *(*genparams)(struct snmp_agent *, size_t *, void **);
1.5 martijn 123: struct ber_element *(*encpdu)(struct snmp_agent *,
124: struct ber_element *, void *);
1.4 martijn 125: int (*finalparams)(struct snmp_agent *, char *, size_t, size_t, void *);
1.3 martijn 126: int (*parseparams)(struct snmp_agent *, char *, size_t, off_t, char *,
1.5 martijn 127: size_t, uint8_t, void **);
128: struct ber_element *(*decpdu)(struct snmp_agent *, char *, size_t,
129: void *);
1.3 martijn 130: void (*free)(void *);
1.4 martijn 131: void (*freecookie)(void *);
1.3 martijn 132: void *data;
133: };
134:
135: struct snmp_v3 {
136: uint8_t level;
137: char *ctxname;
138: size_t ctxnamelen;
139: int engineidset;
140: char *engineid;
141: size_t engineidlen;
142: struct snmp_sec *sec;
143: };
144:
1.1 martijn 145: struct snmp_agent {
146: int fd;
1.3 martijn 147: int timeout;
148: int retries;
1.1 martijn 149: enum snmp_version version;
1.3 martijn 150: /* SNMP_V1 & SNMP_V2C */
1.1 martijn 151: char *community;
1.3 martijn 152: /* SNMP_V3 */
153: struct snmp_v3 *v3;
1.1 martijn 154: };
155:
156: #define SNMP_MSGFLAG_AUTH 0x01
157: #define SNMP_MSGFLAG_PRIV 0x02
158: #define SNMP_MSGFLAG_SECMASK (SNMP_MSGFLAG_AUTH | SNMP_MSGFLAG_PRIV)
159: #define SNMP_MSGFLAG_REPORT 0x04
160:
161: #define SNMP_MAX_TIMEWINDOW 150 /* RFC3414 */
162:
1.3 martijn 163: struct snmp_v3 *snmp_v3_init(int, const char *, size_t, struct snmp_sec *);
164: int snmp_v3_setengineid(struct snmp_v3 *, char *, size_t);
1.1 martijn 165: struct snmp_agent *snmp_connect_v12(int, enum snmp_version, const char *);
1.3 martijn 166: struct snmp_agent *snmp_connect_v3(int, struct snmp_v3 *);
1.1 martijn 167: void snmp_free_agent(struct snmp_agent *);
168: struct ber_element *
169: snmp_get(struct snmp_agent *agent, struct ber_oid *oid, size_t len);
170: struct ber_element *snmp_getnext(struct snmp_agent *, struct ber_oid *, size_t);
171: struct ber_element *
172: snmp_getbulk(struct snmp_agent *, struct ber_oid *, size_t, int, int);
1.6 martijn 173: struct ber_element *snmp_set(struct snmp_agent *, struct ber_element *);
1.1 martijn 174: int snmp_trap(struct snmp_agent *, struct timespec *, struct ber_oid *,
175: struct ber_element *);
1.2 martijn 176:
177: ssize_t ber_copy_writebuf(struct ber *, void **);
1.1 martijn 178:
179: #endif /* SNMPD_SNMP_H */