1 /* 2 * Generic 3 */ 4 #define OID_MAX 128 5 6 struct oid { 7 uint32_t subid[OID_MAX]; 8 size_t n_subid; 9 int include; 10 }; 11 12 struct searchrange { 13 struct oid start; 14 struct oid end; 15 }; 16 17 enum type { 18 TYPE_INTEGER = 2, 19 TYPE_OCTETSTRING = 4, 20 TYPE_NULL = 5, 21 TYPE_OBJECTIDENTIFIER = 6, 22 TYPE_IPADDRESS = 64, 23 TYPE_COUNTER32 = 65, 24 TYPE_GAUGE32 = 66, 25 TYPE_TIMETICKS = 67, 26 TYPE_OPAQUE = 68, 27 TYPE_COUNTER64 = 70, 28 TYPE_NOSUCHOBJECT = 128, 29 TYPE_NOSUCHINSTANCE = 129, 30 TYPE_ENDOFMIBVIEW = 130, 31 /* Don't expect a specific value: mod 1000 */ 32 TYPE_INTEGER_UNKNOWN = 1002, 33 TYPE_OCTETSTRING_UNKNOWN = 1004, 34 TYPE_OBJECTIDENTIFIER_UNKNOWN = 1006, 35 TYPE_IPADDRESS_UNKNOWN = 1064 36 }; 37 38 enum error { 39 NOERROR = 0, 40 NOAGENTXERROR = 0, 41 TOOBIG = 1, 42 NOSUCHNAME = 2, 43 BADVALUE = 3, 44 READONLY = 4, 45 GENERR = 5, 46 NOACCESS = 6, 47 WRONGTYPE = 7, 48 WRONGLENGTH = 8, 49 WRONGENCODING = 9, 50 WRONGVALUE = 10, 51 NOCREATION = 11, 52 INCONSISTENTVALUE = 12, 53 RESOURCEUNAVAILABLE = 13, 54 COMMITFAILED = 14, 55 UNDOFAILED = 15, 56 AUTHORIZATIONERROR = 16, 57 NOTWRITABLE = 17, 58 INCONSISTENTNAME = 18, 59 OPENFAILED = 256, 60 NOTOPEN = 257, 61 INDEXWRONGTYPE = 258, 62 INDEXALREADYALLOCATED = 259, 63 INDEXNONEAVAILABLE = 260, 64 INDEXNOTALLOCATED = 261, 65 UNSUPPORTEDCONTEXT = 262, 66 DUPLICATEREGISTRATION = 263, 67 UNKNOWNREGISTRATION = 264, 68 UNKNOWNAGENTCAPS = 265, 69 PARSEERROR = 266, 70 REQUESTDENIED = 267, 71 PROCESSINGERROR = 268 72 }; 73 74 enum close_reason { 75 REASONOTHER = 1, 76 REASONPARSEERROR = 2, 77 REASONPROTOCOLERROR = 3, 78 REASONTIMEOUTS = 4, 79 REASONSHUTDOWN = 5, 80 REASONBYMANAGER = 6 81 }; 82 83 struct varbind { 84 int typeunknown; 85 int nameunknown; 86 int dataunknown; 87 enum type type; 88 struct oid name; 89 union data { 90 int32_t int32; 91 uint32_t uint32; 92 uint64_t uint64; 93 struct oid oid; 94 struct octetstring { 95 char *string; 96 size_t len; 97 } octetstring; 98 } data; 99 }; 100 101 enum snmp_request { 102 REQUEST_GET = 0, 103 REQUEST_GETNEXT = 1, 104 REQUEST_RESPONSE = 2, 105 REQUEST_SET = 3, 106 REQUEST_TRAP = 4, 107 REQUEST_GETBULK = 5, 108 REQUEST_INFORM = 6, 109 REQUEST_TRAPV2 = 7, 110 REQUEST_REPORT = 8 111 }; 112 113 114 extern int verbose; 115 extern char *axsocket; 116 extern char *hostname; 117 extern char *servname; 118 extern char *community; 119 120 int oid_cmp(struct oid *, struct oid *); 121 char *oid_print(struct oid *, char *, size_t); 122 123 #define OID_STRUCT(...) (struct oid){ \ 124 .subid = { __VA_ARGS__ }, \ 125 .n_subid = (sizeof((uint32_t []) { __VA_ARGS__ }) / sizeof(uint32_t)) \ 126 } 127 128 #define OID_ARG(...) (uint32_t []) { __VA_ARGS__ }, \ 129 (sizeof((uint32_t []) { __VA_ARGS__ }) / sizeof(uint32_t)) 130 131 /* 132 * AgentX 133 */ 134 #define MIB_OPENBSD_REGRESS 1, 3, 6, 1, 4, 1, 30155, 42 135 /* Subagent names */ 136 #define MIB_SUBAGENTS MIB_OPENBSD_REGRESS, 1 137 #define MIB_SUBAGENT_OPEN MIB_SUBAGENTS, 1 138 #define MIB_SUBAGENT_PING MIB_SUBAGENTS, 2 139 #define MIB_SUBAGENT_CLOSE MIB_SUBAGENTS, 3 140 #define MIB_SUBAGENT_REGISTER MIB_SUBAGENTS, 4 141 #define MIB_SUBAGENT_UNREGISTER MIB_SUBAGENTS, 4 142 #define MIB_SUBAGENT_BACKEND MIB_SUBAGENTS, 5 143 #define MIB_SUBAGENT_SNMP MIB_SUBAGENTS, 6 144 #define MIB_SUBAGENT_TRANSPORT MIB_SUBAGENTS, 7 145 /* Region used for registration testing */ 146 #define MIB_REGISTER MIB_OPENBSD_REGRESS, 2 147 #define MIB_UNREGISTER MIB_OPENBSD_REGRESS, 3 148 #define MIB_BACKEND MIB_OPENBSD_REGRESS, 4 149 #define MIB_SNMP MIB_OPENBSD_REGRESS, 5 150 #define MIB_TRANSPORT MIB_OPENBSD_REGRESS, 6 151 152 #define SYSORTABLE 1, 3, 6, 1, 2, 1, 1, 9 153 154 int agentx_connect(const char *); 155 uint32_t agentx_open(int, int, uint8_t, uint32_t[], size_t, const char *); 156 void agentx_close(int, uint32_t, enum close_reason); 157 void agentx_register(int, uint32_t, uint8_t, uint8_t, uint8_t, uint8_t, 158 uint32_t[], size_t, uint32_t); 159 void agentx_response(int, void *, enum error, uint16_t, struct varbind *, 160 size_t); 161 void agentx_get_handle(const char *, const void *, size_t, uint8_t, uint32_t, 162 struct varbind *, size_t); 163 void agentx_getnext_handle(const char *, const void *, size_t, uint8_t, 164 uint32_t, struct searchrange *, struct varbind *, size_t); 165 size_t agentx_getbulk_handle(const char *, const void *, size_t, uint8_t, int32_t, 166 struct varbind *, size_t, struct varbind *); 167 size_t agentx_read(int, void *, size_t, int); 168 void agentx_timeout(int, int); 169 170 171 /* Tests */ 172 void agentx_open_nnbo(void); 173 void agentx_open_nbo(void); 174 void agentx_open_invalidversion(void); 175 void agentx_open_ignore_sessionid(void); 176 void agentx_open_invalid_oid(void); 177 void agentx_open_descr_too_long(void); 178 void agentx_open_descr_invalid(void); 179 void agentx_open_context(void); 180 void agentx_open_instance_registration(void); 181 void agentx_open_new_index(void); 182 void agentx_open_any_index(void); 183 void agentx_ping_notopen(void); 184 void agentx_ping_invalid_sessionid(void); 185 void agentx_ping_default(void); 186 void agentx_ping_context(void); 187 void agentx_ping_invalid_version(void); 188 void agentx_ping_instance_registration(void); 189 void agentx_ping_new_index(void); 190 void agentx_ping_any_index(void); 191 void agentx_ping_nbo_nnbo(void); 192 void agentx_ping_nnbo_nbo(void); 193 void agentx_ping_invalid_version_close(void); 194 void agentx_close_notopen(void); 195 void agentx_close_reasonother(void); 196 void agentx_close_reasonparseerror(void); 197 void agentx_close_reasonprotocolerror(void); 198 void agentx_close_reasontimouts(void); 199 void agentx_close_reasonshutdown(void); 200 void agentx_close_reasonbymanager(void); 201 void agentx_close_reasoninvalid(void); 202 void agentx_close_single(void); 203 void agentx_close_notowned(void); 204 void agentx_close_invalid_sessionid(void); 205 void agentx_close_context(void); 206 void agentx_close_invalid_version(void); 207 void agentx_close_instance_registration(void); 208 void agentx_close_new_index(void); 209 void agentx_close_any_index(void); 210 void agentx_close_nnbo_nbo(void); 211 void agentx_register_notopen(void); 212 void agentx_register_invalid_sessionid(void); 213 void agentx_register_default(void); 214 void agentx_register_context(void); 215 void agentx_register_invalid_version(void); 216 void agentx_register_instance_registration(void); 217 void agentx_register_new_index(void); 218 void agentx_register_any_index(void); 219 void agentx_register_duplicate_self(void); 220 void agentx_register_duplicate_twocon(void); 221 void agentx_register_duplicate_priority(void); 222 void agentx_register_range(void); 223 void agentx_register_range_invalidupperbound(void); 224 void agentx_register_range_single(void); 225 void agentx_register_range_overlap_single(void); 226 void agentx_register_single_overlap_range(void); 227 void agentx_register_range_overlap_range(void); 228 void agentx_register_below(void); 229 void agentx_register_above(void); 230 void agentx_register_restricted(void); 231 void agentx_unregister_notopen(void); 232 void agentx_unregister_invalid_sessionid(void); 233 void agentx_unregister_notregistered(void); 234 void agentx_unregister_single(void); 235 void agentx_unregister_single_notowned(void); 236 void agentx_unregister_range(void); 237 void agentx_unregister_range_single(void); 238 void agentx_unregister_range_subset(void); 239 void agentx_unregister_range_extra(void); 240 void agentx_unregister_range_priority(void); 241 void agentx_unregister_range_notowned(void); 242 243 /* 244 * SNMP 245 */ 246 socklen_t snmp_resolve(int, const char *, const char *, struct sockaddr *); 247 int snmp_connect(int, struct sockaddr *, socklen_t); 248 int32_t snmpv2_get(int, const char *, int32_t, struct varbind *, size_t); 249 int32_t snmpv2_getnext(int, const char *, int32_t, struct varbind *, size_t); 250 int32_t snmpv2_getbulk(int, const char *, int32_t, int32_t, int32_t, 251 struct varbind *, size_t); 252 struct ber_element *snmpv2_build(const char *, enum snmp_request, int32_t, 253 int32_t, int32_t, struct varbind *, size_t); 254 void snmpv2_response_validate(int, int, const char *, int32_t, int32_t, int32_t, 255 struct varbind *, size_t); 256 void snmp_timeout(int, int); 257 void smi_debug_elements(struct ber_element *); 258 259 void backend_get_integer(void); 260 void backend_get_octetstring(void); 261 void backend_get_objectidentifier(void); 262 void backend_get_ipaddress(void); 263 void backend_get_counter32(void); 264 void backend_get_gauge32(void); 265 void backend_get_timeticks(void); 266 void backend_get_opaque(void); 267 void backend_get_counter64(void); 268 void backend_get_nosuchobject(void); 269 void backend_get_nosuchinstance(void); 270 void backend_get_endofmibview(void); 271 void backend_get_two_single_backend(void); 272 void backend_get_two_double_backend(void); 273 void backend_get_wrongorder(void); 274 void backend_get_toofew(void); 275 void backend_get_toomany(void); 276 void backend_get_instance(void); 277 void backend_get_instance_below(void); 278 void backend_get_timeout_default(void); 279 void backend_get_timeout_session_lower(void); 280 void backend_get_timeout_session_higher(void); 281 void backend_get_timeout_region_lower(void); 282 void backend_get_timeout_region_higher(void); 283 void backend_get_priority_lower(void); 284 void backend_get_priority_higher(void); 285 void backend_get_priority_below_lower(void); 286 void backend_get_priority_below_higher(void); 287 void backend_get_close(void); 288 void backend_get_close_overlap(void); 289 void backend_get_disappear(void); 290 void backend_get_disappear_overlap(void); 291 void backend_get_disappear_doublesession(void); 292 void backend_getnext_selfbound(void); 293 void backend_getnext_lowerbound(void); 294 void backend_getnext_lowerbound_self(void); 295 void backend_getnext_lowerbound_highprio(void); 296 void backend_getnext_lowerbound_lowprio(void); 297 void backend_getnext_sibling(void); 298 void backend_getnext_child_gap(void); 299 void backend_getnext_nosuchobject(void); 300 void backend_getnext_nosuchinstance(void); 301 void backend_getnext_endofmibview(void); 302 void backend_getnext_inclusive(void); 303 void backend_getnext_jumpnext(void); 304 void backend_getnext_jumpnext_endofmibview(void); 305 void backend_getnext_jump_up(void); 306 void backend_getnext_jump_up(void); 307 void backend_getnext_two_single_backend(void); 308 void backend_getnext_two_double_backend(void); 309 void backend_getnext_instance_below(void); 310 void backend_getnext_instance(void); 311 void backend_getnext_instance_exact(void); 312 void backend_getnext_instance_ignore(void); 313 void backend_getnext_instance_ignore(void); 314 void backend_getnext_backwards(void); 315 void backend_getnext_stale(void); 316 void backend_getnext_inclusive_backwards(void); 317 void backend_getnext_toofew(void); 318 void backend_getnext_toomany(void); 319 void backend_getnext_response_equal_end(void); 320 void backend_getnext_instance_below_region_before_instance(void); 321 void backend_getnext_instance_below_region_on_instance(void); 322 void backend_getnext_instance_below_region_below_instance(void); 323 void backend_getbulk_nonrep_zero_maxrep_one(void); 324 void backend_getbulk_nonrep_zero_maxrep_two(void); 325 void backend_getbulk_nonrep_one_maxrep_one(void); 326 void backend_getbulk_nonrep_one_maxrep_two(void); 327 void backend_getbulk_nonrep_two_maxrep_two(void); 328 void backend_getbulk_nonrep_negative(void); 329 void backend_getbulk_endofmibview(void); 330 void backend_getbulk_endofmibview_second_rep(void); 331 void backend_getbulk_endofmibview_two_varbinds(void); 332 void backend_error_get_toobig(void); 333 void backend_error_get_nosuchname(void); 334 void backend_error_get_badvalue(void); 335 void backend_error_get_readonly(void); 336 void backend_error_get_generr(void); 337 void backend_error_get_wrongtype(void); 338 void backend_error_get_wronglength(void); 339 void backend_error_get_wrongencoding(void); 340 void backend_error_get_wrongvalue(void); 341 void backend_error_get_nocreation(void); 342 void backend_error_get_inconsistentvalue(void); 343 void backend_error_get_commitfailed(void); 344 void backend_error_get_undofailed(void); 345 void backend_error_get_authorizationerror(void); 346 void backend_error_get_notwritable(void); 347 void backend_error_get_inconsistentname(void); 348 void backend_error_get_openfailed(void); 349 void backend_error_get_notopen(void); 350 void backend_error_get_indexwrongtype(void); 351 void backend_error_get_indexalreadyallocated(void); 352 void backend_error_get_indexnonavailable(void); 353 void backend_error_get_indexnotallocated(void); 354 void backend_error_get_duplicateregistration(void); 355 void backend_error_get_requestdenied(void); 356 void backend_error_get_processingerror(void); 357 void backend_error_get_nonstandard(void); 358 void backend_error_getnext_toobig(void); 359 void backend_error_getnext_nosuchname(void); 360 void backend_error_getnext_badvalue(void); 361 void backend_error_getnext_readonly(void); 362 void backend_error_getnext_generr(void); 363 void backend_error_getnext_noaccess(void); 364 void backend_error_getnext_wrongtype(void); 365 void backend_error_getnext_wronglength(void); 366 void backend_error_getnext_wrongencoding(void); 367 void backend_error_getnext_wrongvalue(void); 368 void backend_error_getnext_nocreation(void); 369 void backend_error_getnext_inconsistentvalue(void); 370 void backend_error_getnext_resourceunavailable(void); 371 void backend_error_getnext_commitfailed(void); 372 void backend_error_getnext_undofailed(void); 373 void backend_error_getnext_notwritable(void); 374 void backend_error_getnext_inconsistentname(void); 375 void backend_error_getnext_openfailed(void); 376 void backend_error_getnext_notopen(void); 377 void backend_error_getnext_indexwrongtype(void); 378 void backend_error_getnext_indexalreadyallocated(void); 379 void backend_error_getnext_indexnonavailable(void); 380 void backend_error_getnext_indexnotallocated(void); 381 void backend_error_getnext_unsupportedcontext(void); 382 void backend_error_getnext_duplicateregistration(void); 383 void backend_error_getnext_unknownregistration(void); 384 void backend_error_getnext_parseerror(void); 385 void backend_error_getnext_requestdenied(void); 386 void backend_error_getnext_processingerror(void); 387 void backend_error_getnext_nonstandard(void); 388 void backend_error_getbulk_firstrepetition(void); 389 void backend_error_getbulk_secondrepetition(void); 390 void snmp_v3_usm_noauthpriv(void); 391 void transport_tcp_get(void); 392 void transport_tcp_disconnect(void); 393 void transport_tcp_double_get_disconnect(void); 394