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