]> git.proxmox.com Git - mirror_frr.git/blob - lib/smux.h
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / lib / smux.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* SNMP support
3 * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
4 */
5
6 #ifndef _ZEBRA_SNMP_H
7 #define _ZEBRA_SNMP_H
8
9 #include <net-snmp/agent/net-snmp-agent-includes.h>
10 #include <net-snmp/agent/snmp_vars.h>
11
12 #include "frrevent.h"
13 #include "hook.h"
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 /* Structures here are mostly compatible with UCD SNMP 4.1.1 */
20 #define MATCH_FAILED (-1)
21 #define MATCH_SUCCEEDED 0
22
23 /* SYNTAX TruthValue from SNMPv2-TC. */
24 #define SNMP_TRUE 1
25 #define SNMP_FALSE 2
26
27 /* SYNTAX RowStatus from SNMPv2-TC. */
28 #define SNMP_VALID 1
29 #define SNMP_INVALID 2
30
31 #define IN_ADDR_SIZE sizeof(struct in_addr)
32 #define IN6_ADDR_SIZE sizeof(struct in6_addr)
33
34 /* IANAipRouteProtocol */
35 #define IANAIPROUTEPROTOCOLOTHER 1
36 #define IANAIPROUTEPROTOCOLLOCAL 2
37 #define IANAIPROUTEPROTOCOLNETMGMT 3
38 #define IANAIPROUTEPROTOCOLICMP 4
39 #define IANAIPROUTEPROTOCOLEGP 5
40 #define IANAIPROUTEPROTOCOLGGP 6
41 #define IANAIPROUTEPROTOCOLHELLO 7
42 #define IANAIPROUTEPROTOCOLRIP 8
43 #define IANAIPROUTEPROTOCOLISIS 9
44 #define IANAIPROUTEPROTOCOLESIS 10
45 #define IANAIPROUTEPROTOCOLCISCOIGRP 11
46 #define IANAIPROUTEPROTOCOLBBNSPFIGP 12
47 #define IANAIPROUTEPROTOCOLOSPF 13
48 #define IANAIPROUTEPROTOCOLBGP 14
49 #define IANAIPROUTEPROTOCOLIDPR 15
50 #define IANAIPROUTEPROTOCOLCISCOEIGRP 16
51 #define IANAIPROUTEPROTOCOLDVMRP 17
52
53 #define INETADDRESSTYPEUNKNOWN 0
54 #define INETADDRESSTYPEIPV4 1
55 #define INETADDRESSTYPEIPV6 2
56
57 #undef REGISTER_MIB
58 #define REGISTER_MIB(descr, var, vartype, theoid) \
59 smux_register_mib(descr, (struct variable *)var, \
60 sizeof(struct vartype), \
61 sizeof(var) / sizeof(struct vartype), theoid, \
62 sizeof(theoid) / sizeof(oid))
63
64 struct trap_object {
65 int namelen; /* Negative if the object is not indexed */
66 oid name[MAX_OID_LEN];
67 };
68
69 struct index_oid {
70 int indexlen;
71 oid indexname[MAX_OID_LEN];
72 };
73 /* Declare SMUX return value. */
74 #define SNMP_LOCAL_VARIABLES \
75 static long snmp_int_val __attribute__((unused)); \
76 static struct in_addr snmp_in_addr_val __attribute__((unused)); \
77 static uint8_t snmp_octet_val __attribute__((unused)); \
78 static char snmp_string_val[255] __attribute__((unused));
79 #define SNMP_INTEGER(V) \
80 (*var_len = sizeof(snmp_int_val), snmp_int_val = V, \
81 (uint8_t *)&snmp_int_val)
82
83 #define SNMP_OCTET(V) \
84 (*var_len = sizeof(snmp_octet_val), snmp_octet_val = V, \
85 (uint8_t *)&snmp_octet_val)
86
87 #define SNMP_STRING(V) \
88 (*var_len = MIN(sizeof(snmp_string_val), strlen(V) + 1), \
89 strlcpy(snmp_string_val, V, *var_len), (uint8_t *)&snmp_string_val)
90
91 #define SNMP_IPADDRESS(V) \
92 (*var_len = sizeof(struct in_addr), snmp_in_addr_val = V, \
93 (uint8_t *)&snmp_in_addr_val)
94
95 #define SNMP_IP6ADDRESS(V) (*var_len = sizeof(struct in6_addr), (uint8_t *)&V)
96
97 /*
98 * Check to see if snmp is enabled or not
99 */
100 extern bool smux_enabled(void);
101
102 extern void smux_init(struct event_loop *tm);
103 extern void smux_agentx_enable(void);
104 extern void smux_register_mib(const char *, struct variable *, size_t, int,
105 oid[], size_t);
106 extern int smux_header_generic(struct variable *, oid[], size_t *, int,
107 size_t *, WriteMethod **);
108 extern int smux_header_table(struct variable *, oid *, size_t *, int, size_t *,
109 WriteMethod **);
110
111 /* For traps, three OID are provided:
112
113 1. The enterprise OID to use (the last argument will be appended to
114 it to form the SNMP trap OID)
115
116 2. The base OID for objects to be sent in traps.
117
118 3. The index OID for objects to be sent in traps. This index is used
119 to designate a particular instance of a column.
120
121 The provided trap object contains the bindings to be sent with the
122 trap. The base OID will be prefixed to the provided OID and, if the
123 length is positive, the requested OID is assumed to be a columnar
124 object and the index OID will be appended.
125
126 The two first arguments are the MIB registry used to locate the trap
127 objects.
128
129 The use of the arguments may differ depending on the implementation
130 used.
131 */
132 extern void smux_trap(struct variable *, size_t, const oid *, size_t,
133 const oid *, size_t, const oid *, size_t,
134 const struct trap_object *, size_t, uint8_t);
135
136 extern int smux_trap_multi_index(struct variable *vp, size_t vp_len,
137 const oid *ename, size_t enamelen,
138 const oid *name, size_t namelen,
139 struct index_oid *iname, size_t index_len,
140 const struct trap_object *trapobj,
141 size_t trapobjlen, uint8_t sptrap);
142
143 extern void smux_events_update(void);
144 extern int oid_compare(const oid *, int, const oid *, int);
145 extern void oid2in_addr(oid[], int, struct in_addr *);
146 extern void oid2in6_addr(oid oid[], struct in6_addr *addr);
147 extern void oid2int(oid oid[], int *dest);
148 extern void *oid_copy(void *, const void *, size_t);
149 extern void oid_copy_in_addr(oid[], const struct in_addr *);
150 extern void oid_copy_in6_addr(oid[], const struct in6_addr *);
151 extern void oid_copy_int(oid oid[], int *val);
152 extern void oid2string(oid oid[], int len, char *string);
153 extern void oid_copy_str(oid oid[], const char *string, int len);
154
155 DECLARE_HOOK(agentx_enabled, (), ());
156
157 #ifdef __cplusplus
158 }
159 #endif
160
161 #endif /* _ZEBRA_SNMP_H */