mtu_kvm.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:2k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* MTU get using kvm_read.
  2.  * Copyright (C) 1999 Kunihiro Ishiguro
  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. #include <zebra.h>
  22. #include <kvm.h>
  23. #include <limits.h>
  24. #include <fcntl.h>
  25. #include "if.h"
  26. /* get interface MTU to use kvm_read */
  27. void
  28. if_kvm_get_mtu (struct interface *ifp)
  29. {
  30.   kvm_t *kvmd;
  31.   struct ifnet ifnet;
  32.   unsigned long ifnetaddr;
  33.   int len;
  34.  
  35.   char ifname[IFNAMSIZ];
  36.   char tname[INTERFACE_NAMSIZ + 1];
  37.   char buf[_POSIX2_LINE_MAX];
  38.  
  39.   struct nlist nl[] = 
  40.   {
  41.     {"_ifnet"},
  42.     {""}
  43.   };
  44.   ifp->mtu = -1;
  45.   
  46.   kvmd = kvm_openfiles (NULL, NULL, NULL, O_RDONLY, buf);
  47.   if (kvmd == NULL) 
  48.     return ;
  49.   
  50.   kvm_nlist(kvmd, nl);
  51.  
  52.   ifnetaddr = nl[0].n_value;
  53.  
  54.   if (kvm_read(kvmd, ifnetaddr, (char *)&ifnetaddr, sizeof ifnetaddr) < 0) 
  55.     {
  56.       kvm_close (kvmd);
  57.       return ;
  58.     }
  59.  
  60.   while(ifnetaddr != 0) 
  61.     {
  62.       if (kvm_read (kvmd, ifnetaddr, (char *)&ifnet, sizeof ifnet) < 0) 
  63. {
  64.   kvm_close (kvmd);
  65.   return ;
  66. }
  67.       if (kvm_read (kvmd, (u_long)ifnet.if_name, ifname, IFNAMSIZ) < 0) 
  68. {
  69.   kvm_close (kvmd);
  70.   return ;
  71. }
  72.       len = snprintf (tname, INTERFACE_NAMSIZ + 1, 
  73.       "%s%d", ifname, ifnet.if_unit);
  74.       if (strncmp (tname, ifp->name, len) == 0)
  75. break;
  76.       ifnetaddr = (u_long)ifnet.if_next;
  77.     }
  78.   kvm_close (kvmd);
  79.   if (ifnetaddr == 0) 
  80.     {
  81.       return ;
  82.     }
  83.   ifp->mtu = ifnet.if_mtu;
  84. }