File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / snmp.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:11 2016 UTC (8 years ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /* SNMP support
    2:  * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
    3:  *
    4:  * This file is part of GNU Zebra.
    5:  *
    6:  * GNU Zebra is free software; you can redistribute it and/or modify it
    7:  * under the terms of the GNU General Public License as published by the
    8:  * Free Software Foundation; either version 2, or (at your option) any
    9:  * later version.
   10:  *
   11:  * GNU Zebra is distributed in the hope that it will be useful, but
   12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
   13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:  * General Public License for more details.
   15:  *
   16:  * You should have received a copy of the GNU General Public License
   17:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
   18:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   19:  * 02111-1307, USA.  
   20:  */
   21: 
   22: #include <zebra.h>
   23: 
   24: #ifdef HAVE_SNMP
   25: #include <net-snmp/net-snmp-config.h>
   26: #include <net-snmp/net-snmp-includes.h>
   27: 
   28: #include "smux.h"
   29: 
   30: #define min(A,B) ((A) < (B) ? (A) : (B))
   31: 
   32: int
   33: oid_compare (const oid *o1, int o1_len, const oid *o2, int o2_len)
   34: {
   35:   int i;
   36: 
   37:   for (i = 0; i < min (o1_len, o2_len); i++)
   38:     {
   39:       if (o1[i] < o2[i])
   40: 	return -1;
   41:       else if (o1[i] > o2[i])
   42: 	return 1;
   43:     }
   44:   if (o1_len < o2_len)
   45:     return -1;
   46:   if (o1_len > o2_len)
   47:     return 1;
   48: 
   49:   return 0;
   50: }
   51: 
   52: void *
   53: oid_copy (void *dest, const void *src, size_t size)
   54: {
   55:   return memcpy (dest, src, size * sizeof (oid));
   56: }
   57: 
   58: void
   59: oid2in_addr (oid oid[], int len, struct in_addr *addr)
   60: {
   61:   int i;
   62:   u_char *pnt;
   63:   
   64:   if (len == 0)
   65:     return;
   66: 
   67:   pnt = (u_char *) addr;
   68: 
   69:   for (i = 0; i < len; i++)
   70:     *pnt++ = oid[i];
   71: }
   72: 
   73: void
   74: oid_copy_addr (oid oid[], struct in_addr *addr, int len)
   75: {
   76:   int i;
   77:   u_char *pnt;
   78:   
   79:   if (len == 0)
   80:     return;
   81: 
   82:   pnt = (u_char *) addr;
   83: 
   84:   for (i = 0; i < len; i++)
   85:     oid[i] = *pnt++;
   86: }
   87: 
   88: int
   89: smux_header_generic (struct variable *v, oid *name, size_t *length, int exact,
   90: 		     size_t *var_len, WriteMethod **write_method)
   91: {
   92:   oid fulloid[MAX_OID_LEN];
   93:   int ret;
   94: 
   95:   oid_copy (fulloid, v->name, v->namelen);
   96:   fulloid[v->namelen] = 0;
   97:   /* Check against full instance. */
   98:   ret = oid_compare (name, *length, fulloid, v->namelen + 1);
   99: 
  100:   /* Check single instance. */
  101:   if ((exact && (ret != 0)) || (!exact && (ret >= 0)))
  102: 	return MATCH_FAILED;
  103: 
  104:   /* In case of getnext, fill in full instance. */
  105:   memcpy (name, fulloid, (v->namelen + 1) * sizeof (oid));
  106:   *length = v->namelen + 1;
  107: 
  108:   *write_method = 0;
  109:   *var_len = sizeof(long);    /* default to 'long' results */
  110: 
  111:   return MATCH_SUCCEEDED;
  112: }
  113: 
  114: int
  115: smux_header_table (struct variable *v, oid *name, size_t *length, int exact,
  116: 		   size_t *var_len, WriteMethod **write_method)
  117: {
  118:   /* If the requested OID name is less than OID prefix we
  119:      handle, adjust it to our prefix. */
  120:   if ((oid_compare (name, *length, v->name, v->namelen)) < 0)
  121:     {
  122:       if (exact)
  123: 	return MATCH_FAILED;
  124:       oid_copy(name, v->name, v->namelen);
  125:       *length = v->namelen;
  126:     }
  127: 
  128:   *write_method = 0;
  129:   *var_len = sizeof(long);
  130: 
  131:   return MATCH_SUCCEEDED;
  132: }
  133: #endif /* HAVE_SNMP */

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