version 1.1.1.2, 2012/10/09 09:22:28
|
version 1.1.1.3, 2013/07/21 23:54:39
|
Line 21
|
Line 21
|
|
|
#include <zebra.h> |
#include <zebra.h> |
|
|
#ifdef HAVE_SNMP | #if defined HAVE_SNMP && defined SNMP_SMUX |
#ifdef HAVE_NETSNMP | |
#include <net-snmp/net-snmp-config.h> |
#include <net-snmp/net-snmp-config.h> |
#include <net-snmp/net-snmp-includes.h> |
#include <net-snmp/net-snmp-includes.h> |
#else |
|
#include <asn1.h> |
|
#include <snmp.h> |
|
#include <snmp_impl.h> |
|
#endif |
|
|
|
#include "log.h" |
#include "log.h" |
#include "thread.h" |
#include "thread.h" |
Line 40
|
Line 34
|
#include "sockunion.h" |
#include "sockunion.h" |
#include "smux.h" |
#include "smux.h" |
|
|
|
#define SMUX_PORT_DEFAULT 199 |
|
|
|
#define SMUXMAXPKTSIZE 1500 |
|
#define SMUXMAXSTRLEN 256 |
|
|
|
#define SMUX_OPEN (ASN_APPLICATION | ASN_CONSTRUCTOR | 0) |
|
#define SMUX_CLOSE (ASN_APPLICATION | ASN_PRIMITIVE | 1) |
|
#define SMUX_RREQ (ASN_APPLICATION | ASN_CONSTRUCTOR | 2) |
|
#define SMUX_RRSP (ASN_APPLICATION | ASN_PRIMITIVE | 3) |
|
#define SMUX_SOUT (ASN_APPLICATION | ASN_PRIMITIVE | 4) |
|
|
|
#define SMUX_GET (ASN_CONTEXT | ASN_CONSTRUCTOR | 0) |
|
#define SMUX_GETNEXT (ASN_CONTEXT | ASN_CONSTRUCTOR | 1) |
|
#define SMUX_GETRSP (ASN_CONTEXT | ASN_CONSTRUCTOR | 2) |
|
#define SMUX_SET (ASN_CONTEXT | ASN_CONSTRUCTOR | 3) |
|
#define SMUX_TRAP (ASN_CONTEXT | ASN_CONSTRUCTOR | 4) |
|
|
|
#define SMUX_MAX_FAILURE 3 |
|
|
|
/* SNMP tree. */ |
|
struct subtree |
|
{ |
|
/* Tree's oid. */ |
|
oid name[MAX_OID_LEN]; |
|
u_char name_len; |
|
|
|
/* List of the variables. */ |
|
struct variable *variables; |
|
|
|
/* Length of the variables list. */ |
|
int variables_num; |
|
|
|
/* Width of the variables list. */ |
|
int variables_width; |
|
|
|
/* Registered flag. */ |
|
int registered; |
|
}; |
|
|
#define min(A,B) ((A) < (B) ? (A) : (B)) |
#define min(A,B) ((A) < (B) ? (A) : (B)) |
|
|
enum smux_event {SMUX_SCHEDULE, SMUX_CONNECT, SMUX_READ}; |
enum smux_event {SMUX_SCHEDULE, SMUX_CONNECT, SMUX_READ}; |
Line 82 static struct cmd_node smux_node =
|
Line 115 static struct cmd_node smux_node =
|
/* thread master */ |
/* thread master */ |
static struct thread_master *master; |
static struct thread_master *master; |
|
|
void * |
|
oid_copy (void *dest, const void *src, size_t size) |
|
{ |
|
return memcpy (dest, src, size * sizeof (oid)); |
|
} |
|
|
|
void |
|
oid2in_addr (oid oid[], int len, struct in_addr *addr) |
|
{ |
|
int i; |
|
u_char *pnt; |
|
|
|
if (len == 0) |
|
return; |
|
|
|
pnt = (u_char *) addr; |
|
|
|
for (i = 0; i < len; i++) |
|
*pnt++ = oid[i]; |
|
} |
|
|
|
void |
|
oid_copy_addr (oid oid[], struct in_addr *addr, int len) |
|
{ |
|
int i; |
|
u_char *pnt; |
|
|
|
if (len == 0) |
|
return; |
|
|
|
pnt = (u_char *) addr; |
|
|
|
for (i = 0; i < len; i++) |
|
oid[i] = *pnt++; |
|
} |
|
|
|
int |
|
oid_compare (oid *o1, int o1_len, oid *o2, int o2_len) |
|
{ |
|
int i; |
|
|
|
for (i = 0; i < min (o1_len, o2_len); i++) |
|
{ |
|
if (o1[i] < o2[i]) |
|
return -1; |
|
else if (o1[i] > o2[i]) |
|
return 1; |
|
} |
|
if (o1_len < o2_len) |
|
return -1; |
|
if (o1_len > o2_len) |
|
return 1; |
|
|
|
return 0; |
|
} |
|
|
|
static int |
static int |
oid_compare_part (oid *o1, int o1_len, oid *o2, int o2_len) |
oid_compare_part (oid *o1, int o1_len, oid *o2, int o2_len) |
{ |
{ |
Line 479 smux_set (oid *reqid, size_t *reqid_len,
|
Line 456 smux_set (oid *reqid, size_t *reqid_len,
|
if (write_method) |
if (write_method) |
{ |
{ |
return (*write_method)(action, val, val_type, val_len, |
return (*write_method)(action, val, val_type, val_len, |
statP, suffix, suffix_len, v); | statP, suffix, suffix_len); |
} |
} |
else |
else |
{ |
{ |
Line 991 smux_open (int sock)
|
Line 968 smux_open (int sock)
|
return send (sock, buf, (ptr - buf), 0); |
return send (sock, buf, (ptr - buf), 0); |
} |
} |
|
|
|
/* `ename` is ignored. Instead of using the provided enterprise OID, |
|
the SMUX peer is used. This keep compatibility with the previous |
|
versions of Quagga. |
|
|
|
All other fields are used as they are intended. */ |
int |
int |
smux_trap (const oid *name, size_t namelen, | smux_trap (struct variable *vp, size_t vp_len, |
| const oid *ename, size_t enamelen, |
| const oid *name, size_t namelen, |
const oid *iname, size_t inamelen, |
const oid *iname, size_t inamelen, |
const struct trap_object *trapobj, size_t trapobjlen, |
const struct trap_object *trapobj, size_t trapobjlen, |
unsigned int tick, u_char sptrap) | u_char sptrap) |
{ |
{ |
unsigned int i; |
unsigned int i; |
u_char buf[BUFSIZ]; |
u_char buf[BUFSIZ]; |
Line 1358 smux_peer_oid (struct vty *vty, const char *oid_str, c
|
Line 1342 smux_peer_oid (struct vty *vty, const char *oid_str, c
|
smux_passwd = strdup (""); |
smux_passwd = strdup (""); |
|
|
return 0; |
return 0; |
} |
|
|
|
int |
|
smux_header_generic (struct variable *v, oid *name, size_t *length, int exact, |
|
size_t *var_len, WriteMethod **write_method) |
|
{ |
|
oid fulloid[MAX_OID_LEN]; |
|
int ret; |
|
|
|
oid_copy (fulloid, v->name, v->namelen); |
|
fulloid[v->namelen] = 0; |
|
/* Check against full instance. */ |
|
ret = oid_compare (name, *length, fulloid, v->namelen + 1); |
|
|
|
/* Check single instance. */ |
|
if ((exact && (ret != 0)) || (!exact && (ret >= 0))) |
|
return MATCH_FAILED; |
|
|
|
/* In case of getnext, fill in full instance. */ |
|
memcpy (name, fulloid, (v->namelen + 1) * sizeof (oid)); |
|
*length = v->namelen + 1; |
|
|
|
*write_method = 0; |
|
*var_len = sizeof(long); /* default to 'long' results */ |
|
|
|
return MATCH_SUCCEEDED; |
|
} |
} |
|
|
static int |
static int |