Diff for /embedaddon/quagga/lib/smux.c between versions 1.1.1.2 and 1.1.1.3

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

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>