]> git.proxmox.com Git - mirror_frr.git/blob - lib/snmp.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / snmp.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* SNMP support
3 * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
4 */
5
6 #include <zebra.h>
7
8 #include <net-snmp/net-snmp-config.h>
9 #include <net-snmp/net-snmp-includes.h>
10
11 #include "smux.h"
12
13 int oid_compare(const oid *o1, int o1_len, const oid *o2, int o2_len)
14 {
15 int i;
16
17 for (i = 0; i < MIN(o1_len, o2_len); i++) {
18 if (o1[i] < o2[i])
19 return -1;
20 else if (o1[i] > o2[i])
21 return 1;
22 }
23 if (o1_len < o2_len)
24 return -1;
25 if (o1_len > o2_len)
26 return 1;
27
28 return 0;
29 }
30
31 void *oid_copy(void *dest, const void *src, size_t size)
32 {
33 return memcpy(dest, src, size * sizeof(oid));
34 }
35
36 void oid2in_addr(oid oid[], int len, struct in_addr *addr)
37 {
38 int i;
39 uint8_t *pnt;
40
41 if (len == 0)
42 return;
43
44 pnt = (uint8_t *)addr;
45
46 for (i = 0; i < len; i++)
47 *pnt++ = oid[i];
48 }
49
50 void oid2in6_addr(oid oid[], struct in6_addr *addr)
51 {
52 unsigned int i;
53 uint8_t *pnt;
54
55 pnt = (uint8_t *)addr;
56
57 for (i = 0; i < sizeof(struct in6_addr); i++)
58 *pnt++ = oid[i];
59 }
60
61 void oid2int(oid oid[], int *dest)
62 {
63 uint8_t i;
64 uint8_t *pnt;
65 int network_dest;
66
67 pnt = (uint8_t *)&network_dest;
68
69 for (i = 0; i < sizeof(int); i++)
70 *pnt++ = oid[i];
71 *dest = ntohl(network_dest);
72 }
73
74 void oid_copy_in_addr(oid oid[], const struct in_addr *addr)
75 {
76 int i;
77 const uint8_t *pnt;
78 int len = sizeof(struct in_addr);
79
80 pnt = (uint8_t *)addr;
81
82 for (i = 0; i < len; i++)
83 oid[i] = *pnt++;
84 }
85
86
87 void oid_copy_in6_addr(oid oid[], const struct in6_addr *addr)
88 {
89 int i;
90 const uint8_t *pnt;
91 int len = sizeof(struct in6_addr);
92
93 pnt = (uint8_t *)addr;
94
95 for (i = 0; i < len; i++)
96 oid[i] = *pnt++;
97 }
98
99 void oid_copy_int(oid oid[], int *val)
100 {
101 uint8_t i;
102 const uint8_t *pnt;
103 int network_val;
104
105 network_val = htonl(*val);
106 pnt = (uint8_t *)&network_val;
107
108 for (i = 0; i < sizeof(int); i++)
109 oid[i] = *pnt++;
110 }
111
112 void oid2string(oid oid[], int len, char *string)
113 {
114 int i;
115 uint8_t *pnt;
116
117 if (len == 0)
118 return;
119
120 pnt = (uint8_t *)string;
121
122 for (i = 0; i < len; i++)
123 *pnt++ = (uint8_t)oid[i];
124 }
125
126 void oid_copy_str(oid oid[], const char *string, int len)
127 {
128 int i;
129 const uint8_t *pnt;
130
131 if (len == 0)
132 return;
133
134 pnt = (uint8_t *)string;
135
136 for (i = 0; i < len; i++)
137 oid[i] = *pnt++;
138 }
139
140 int smux_header_generic(struct variable *v, oid *name, size_t *length,
141 int exact, size_t *var_len, WriteMethod **write_method)
142 {
143 oid fulloid[MAX_OID_LEN];
144 int ret;
145
146 oid_copy(fulloid, v->name, v->namelen);
147 fulloid[v->namelen] = 0;
148 /* Check against full instance. */
149 ret = oid_compare(name, *length, fulloid, v->namelen + 1);
150
151 /* Check single instance. */
152 if ((exact && (ret != 0)) || (!exact && (ret >= 0)))
153 return MATCH_FAILED;
154
155 /* In case of getnext, fill in full instance. */
156 memcpy(name, fulloid, (v->namelen + 1) * sizeof(oid));
157 *length = v->namelen + 1;
158
159 *write_method = 0;
160 *var_len = sizeof(long); /* default to 'long' results */
161
162 return MATCH_SUCCEEDED;
163 }
164
165 int smux_header_table(struct variable *v, oid *name, size_t *length, int exact,
166 size_t *var_len, WriteMethod **write_method)
167 {
168 /* If the requested OID name is less than OID prefix we
169 handle, adjust it to our prefix. */
170 if ((oid_compare(name, *length, v->name, v->namelen)) < 0) {
171 if (exact)
172 return MATCH_FAILED;
173 oid_copy(name, v->name, v->namelen);
174 *length = v->namelen;
175 }
176
177 *write_method = 0;
178 *var_len = sizeof(long);
179
180 return MATCH_SUCCEEDED;
181 }