File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / zebra / if_sysctl.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 4 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    1: /*
    2:  * Get interface's address and mask information by sysctl() function.
    3:  * Copyright (C) 1997, 98 Kunihiro Ishiguro
    4:  *
    5:  * This file is part of GNU Zebra.
    6:  *
    7:  * GNU Zebra is free software; you can redistribute it and/or modify it
    8:  * under the terms of the GNU General Public License as published by the
    9:  * Free Software Foundation; either version 2, or (at your option) any
   10:  * later version.
   11:  *
   12:  * GNU Zebra is distributed in the hope that it will be useful, but
   13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
   14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   15:  * General Public License for more details.
   16:  *
   17:  * You should have received a copy of the GNU General Public License
   18:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
   19:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   20:  * 02111-1307, USA.  
   21:  */
   22: 
   23: #include <zebra.h>
   24: 
   25: #include "if.h"
   26: #include "sockunion.h"
   27: #include "prefix.h"
   28: #include "connected.h"
   29: #include "memory.h"
   30: #include "ioctl.h"
   31: #include "log.h"
   32: 
   33: #include "zebra/rt.h"
   34: #include "zebra/kernel_socket.h"
   35: 
   36: void
   37: ifstat_update_sysctl (void)
   38: {
   39:   caddr_t ref, buf, end;
   40:   size_t bufsiz;
   41:   struct if_msghdr *ifm;
   42:   struct interface *ifp;
   43: 
   44: #define MIBSIZ 6
   45:   int mib[MIBSIZ] =
   46:   { 
   47:     CTL_NET,
   48:     PF_ROUTE,
   49:     0,
   50:     0, /*  AF_INET & AF_INET6 */
   51:     NET_RT_IFLIST,
   52:     0 
   53:   };
   54: 
   55:   /* Query buffer size. */
   56:   if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0) 
   57:     {
   58:       zlog_warn ("sysctl() error by %s", safe_strerror (errno));
   59:       return;
   60:     }
   61: 
   62:   /* We free this memory at the end of this function. */
   63:   ref = buf = XMALLOC (MTYPE_TMP, bufsiz);
   64: 
   65:   /* Fetch interface informations into allocated buffer. */
   66:   if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0) 
   67:     {
   68:       zlog (NULL, LOG_WARNING, "sysctl error by %s", safe_strerror (errno));
   69:       return;
   70:     }
   71: 
   72:   /* Parse both interfaces and addresses. */
   73:   for (end = buf + bufsiz; buf < end; buf += ifm->ifm_msglen) 
   74:     {
   75:       ifm = (struct if_msghdr *) buf;
   76:       if (ifm->ifm_type == RTM_IFINFO)
   77: 	{
   78: 	  ifp = if_lookup_by_index (ifm->ifm_index);
   79: 	  if (ifp)
   80: 	    ifp->stats = ifm->ifm_data;
   81: 	}
   82:     }
   83: 
   84:   /* Free sysctl buffer. */
   85:   XFREE (MTYPE_TMP, ref);
   86: 
   87:   return;
   88: }
   89: 
   90: /* Interface listing up function using sysctl(). */
   91: void
   92: interface_list ()
   93: {
   94:   caddr_t ref, buf, end;
   95:   size_t bufsiz;
   96:   struct if_msghdr *ifm;
   97: 
   98: #define MIBSIZ 6
   99:   int mib[MIBSIZ] =
  100:   { 
  101:     CTL_NET,
  102:     PF_ROUTE,
  103:     0,
  104:     0, /*  AF_INET & AF_INET6 */
  105:     NET_RT_IFLIST,
  106:     0 
  107:   };
  108: 
  109:   /* Query buffer size. */
  110:   if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0) 
  111:     {
  112:       zlog (NULL, LOG_WARNING, "sysctl() error by %s", safe_strerror (errno));
  113:       return;
  114:     }
  115: 
  116:   /* We free this memory at the end of this function. */
  117:   ref = buf = XMALLOC (MTYPE_TMP, bufsiz);
  118: 
  119:   /* Fetch interface informations into allocated buffer. */
  120:   if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0) 
  121:     {
  122:       zlog (NULL, LOG_WARNING, "sysctl error by %s", safe_strerror (errno));
  123:       return;
  124:     }
  125: 
  126:   /* Parse both interfaces and addresses. */
  127:   for (end = buf + bufsiz; buf < end; buf += ifm->ifm_msglen) 
  128:     {
  129:       ifm = (struct if_msghdr *) buf;
  130: 
  131:       switch (ifm->ifm_type) 
  132: 	{
  133: 	case RTM_IFINFO:
  134: 	  ifm_read (ifm);
  135: 	  break;
  136: 	case RTM_NEWADDR:
  137: 	  ifam_read ((struct ifa_msghdr *) ifm);
  138: 	  break;
  139: 	default:
  140: 	  zlog_info ("interfaces_list(): unexpected message type");
  141: 	  XFREE (MTYPE_TMP, ref);
  142: 	  return;
  143: 	  break;
  144: 	}
  145:     }
  146: 
  147:   /* Free sysctl buffer. */
  148:   XFREE (MTYPE_TMP, ref);
  149: }

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