]> git.proxmox.com Git - mirror_frr.git/blame_incremental - lib/snmp.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / snmp.c
... / ...
CommitLineData
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
13int 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
31void *oid_copy(void *dest, const void *src, size_t size)
32{
33 return memcpy(dest, src, size * sizeof(oid));
34}
35
36void 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
50void 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
61void 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
74void 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
87void 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
99void 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
112void 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
126void 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
140int 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
165int 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}