]>
git.proxmox.com Git - mirror_frr.git/blob - lib/snmp.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
8 #include <net-snmp/net-snmp-config.h>
9 #include <net-snmp/net-snmp-includes.h>
13 int oid_compare(const oid
*o1
, int o1_len
, const oid
*o2
, int o2_len
)
17 for (i
= 0; i
< MIN(o1_len
, o2_len
); i
++) {
20 else if (o1
[i
] > o2
[i
])
31 void *oid_copy(void *dest
, const void *src
, size_t size
)
33 return memcpy(dest
, src
, size
* sizeof(oid
));
36 void oid2in_addr(oid oid
[], int len
, struct in_addr
*addr
)
44 pnt
= (uint8_t *)addr
;
46 for (i
= 0; i
< len
; i
++)
50 void oid2in6_addr(oid oid
[], struct in6_addr
*addr
)
55 pnt
= (uint8_t *)addr
;
57 for (i
= 0; i
< sizeof(struct in6_addr
); i
++)
61 void oid2int(oid oid
[], int *dest
)
67 pnt
= (uint8_t *)&network_dest
;
69 for (i
= 0; i
< sizeof(int); i
++)
71 *dest
= ntohl(network_dest
);
74 void oid_copy_in_addr(oid oid
[], const struct in_addr
*addr
)
78 int len
= sizeof(struct in_addr
);
80 pnt
= (uint8_t *)addr
;
82 for (i
= 0; i
< len
; i
++)
87 void oid_copy_in6_addr(oid oid
[], const struct in6_addr
*addr
)
91 int len
= sizeof(struct in6_addr
);
93 pnt
= (uint8_t *)addr
;
95 for (i
= 0; i
< len
; i
++)
99 void oid_copy_int(oid oid
[], int *val
)
105 network_val
= htonl(*val
);
106 pnt
= (uint8_t *)&network_val
;
108 for (i
= 0; i
< sizeof(int); i
++)
112 void oid2string(oid oid
[], int len
, char *string
)
120 pnt
= (uint8_t *)string
;
122 for (i
= 0; i
< len
; i
++)
123 *pnt
++ = (uint8_t)oid
[i
];
126 void oid_copy_str(oid oid
[], const char *string
, int len
)
134 pnt
= (uint8_t *)string
;
136 for (i
= 0; i
< len
; i
++)
140 int smux_header_generic(struct variable
*v
, oid
*name
, size_t *length
,
141 int exact
, size_t *var_len
, WriteMethod
**write_method
)
143 oid fulloid
[MAX_OID_LEN
];
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);
151 /* Check single instance. */
152 if ((exact
&& (ret
!= 0)) || (!exact
&& (ret
>= 0)))
155 /* In case of getnext, fill in full instance. */
156 memcpy(name
, fulloid
, (v
->namelen
+ 1) * sizeof(oid
));
157 *length
= v
->namelen
+ 1;
160 *var_len
= sizeof(long); /* default to 'long' results */
162 return MATCH_SUCCEEDED
;
165 int smux_header_table(struct variable
*v
, oid
*name
, size_t *length
, int exact
,
166 size_t *var_len
, WriteMethod
**write_method
)
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) {
173 oid_copy(name
, v
->name
, v
->namelen
);
174 *length
= v
->namelen
;
178 *var_len
= sizeof(long);
180 return MATCH_SUCCEEDED
;