]> git.proxmox.com Git - mirror_frr.git/blame - lib/snmp.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / snmp.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
3a4c9688
VB
2/* SNMP support
3 * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
3a4c9688
VB
4 */
5
6#include <zebra.h>
7
3a4c9688
VB
8#include <net-snmp/net-snmp-config.h>
9#include <net-snmp/net-snmp-includes.h>
10
11#include "smux.h"
12
d62a17ae 13int oid_compare(const oid *o1, int o1_len, const oid *o2, int o2_len)
3a4c9688 14{
d62a17ae 15 int i;
16
7a8ce9d5 17 for (i = 0; i < MIN(o1_len, o2_len); i++) {
d62a17ae 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;
3a4c9688
VB
29}
30
d62a17ae 31void *oid_copy(void *dest, const void *src, size_t size)
3a4c9688 32{
d62a17ae 33 return memcpy(dest, src, size * sizeof(oid));
3a4c9688
VB
34}
35
d62a17ae 36void oid2in_addr(oid oid[], int len, struct in_addr *addr)
3a4c9688 37{
d62a17ae 38 int i;
d7c0a89a 39 uint8_t *pnt;
3a4c9688 40
d62a17ae 41 if (len == 0)
42 return;
3a4c9688 43
d7c0a89a 44 pnt = (uint8_t *)addr;
d62a17ae 45
46 for (i = 0; i < len; i++)
47 *pnt++ = oid[i];
3a4c9688
VB
48}
49
5a224c19
PR
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
4f13e83d
PR
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
9e263221 74void oid_copy_in_addr(oid oid[], const struct in_addr *addr)
3a4c9688 75{
d62a17ae 76 int i;
4ce217af 77 const uint8_t *pnt;
9e263221 78 int len = sizeof(struct in_addr);
d62a17ae 79
9e263221
PR
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);
3a4c9688 92
d7c0a89a 93 pnt = (uint8_t *)addr;
3a4c9688 94
d62a17ae 95 for (i = 0; i < len; i++)
96 oid[i] = *pnt++;
3a4c9688
VB
97}
98
4f13e83d
PR
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
0d020cd6
PR
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++)
4f13e83d 123 *pnt++ = (uint8_t)oid[i];
0d020cd6
PR
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
d62a17ae 140int smux_header_generic(struct variable *v, oid *name, size_t *length,
141 int exact, size_t *var_len, WriteMethod **write_method)
3a4c9688 142{
d62a17ae 143 oid fulloid[MAX_OID_LEN];
144 int ret;
3a4c9688 145
d62a17ae 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);
3a4c9688 150
d62a17ae 151 /* Check single instance. */
152 if ((exact && (ret != 0)) || (!exact && (ret >= 0)))
153 return MATCH_FAILED;
3a4c9688 154
d62a17ae 155 /* In case of getnext, fill in full instance. */
156 memcpy(name, fulloid, (v->namelen + 1) * sizeof(oid));
157 *length = v->namelen + 1;
3a4c9688 158
d62a17ae 159 *write_method = 0;
160 *var_len = sizeof(long); /* default to 'long' results */
3a4c9688 161
d62a17ae 162 return MATCH_SUCCEEDED;
3a4c9688 163}
8046ba6e 164
d62a17ae 165int smux_header_table(struct variable *v, oid *name, size_t *length, int exact,
166 size_t *var_len, WriteMethod **write_method)
8046ba6e 167{
d62a17ae 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;
8046ba6e 181}