|
1 --- net-snmp-5.4.1/agent/mibgroup/kernel_sunos5.c 2009-05-11 15:32:06.000000000 -0700 |
|
2 +++ net-snmp-5.4.1.fix/agent/mibgroup/kernel_sunos5.c 2009-05-11 16:47:40.637063871 -0700 |
|
3 @@ -170,7 +170,7 @@ |
|
4 size_t *length, int (*comp)(void *, void *), void *arg); |
|
5 static void |
|
6 set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags, |
|
7 - int mtu); |
|
8 + boolean_t flags_unknown, int mtu); |
|
9 static int get_if_stats(mib2_ifEntry_t *ifp); |
|
10 |
|
11 #if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES) |
|
12 @@ -1332,8 +1332,9 @@ |
|
13 mib2_ifEntry_t *ifp; |
|
14 int nentries = size / sizeof(mib2_ifEntry_t); |
|
15 found_e result = NOT_FOUND; |
|
16 - boolean_t if_isv6; |
|
17 + boolean_t if_isv6, flags_unknown; |
|
18 uint64_t if_flags; |
|
19 + short mtu = 0; |
|
20 struct if_nameindex *ifname, *ifnp; |
|
21 |
|
22 lifrp = &lifreq; |
|
23 @@ -1365,6 +1366,7 @@ |
|
24 memcpy(lifrp->lifr_name, ifnp->if_name, LIFNAMSIZ); |
|
25 if_isv6 = B_FALSE; |
|
26 |
|
27 + flags_unknown = B_FALSE; |
|
28 if (ioctl(ifsd, SIOCGLIFFLAGS, lifrp) < 0) { |
|
29 if (ifsd6 == -1) { |
|
30 if ((ifsd6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { |
|
31 @@ -1373,17 +1375,19 @@ |
|
32 } |
|
33 } |
|
34 if (ioctl(ifsd6, SIOCGLIFFLAGS, lifrp) < 0) { |
|
35 - snmp_log(LOG_ERR, "SIOCGLIFFLAGS %s: %s\n", |
|
36 - lifrp->lifr_name, strerror(errno)); |
|
37 - continue; |
|
38 + DEBUGMSGTL(("kernel_sunos5", |
|
39 + "...... SIOCGLIFFLAGS failed\n")); |
|
40 + flags_unknown = B_TRUE; |
|
41 } |
|
42 if_isv6 = B_TRUE; |
|
43 } |
|
44 if_flags = lifrp->lifr_flags; |
|
45 |
|
46 if (ioctl(if_isv6?ifsd6:ifsd, SIOCGLIFMTU, lifrp) < 0) { |
|
47 + mtu = 0; |
|
48 DEBUGMSGTL(("kernel_sunos5", "...... SIOCGLIFMTU failed\n")); |
|
49 - continue; |
|
50 + } else { |
|
51 + mtu = lifrp->lifr_mtu; |
|
52 } |
|
53 |
|
54 memset(ifp, 0, sizeof(mib2_ifEntry_t)); |
|
55 @@ -1398,11 +1402,12 @@ |
|
56 } |
|
57 |
|
58 set_if_info(ifp, ifnp->if_index, ifnp->if_name, if_flags, |
|
59 - lifrp->lifr_metric); |
|
60 + flags_unknown, mtu); |
|
61 |
|
62 if (get_if_stats(ifp) < 0) { |
|
63 + snmp_log(LOG_ERR, "Failed to get interface statistics for %s\n", |
|
64 + ifnp->if_name); |
|
65 DEBUGMSGTL(("kernel_sunos5", "...... get_if_stats failed\n")); |
|
66 - continue; |
|
67 } |
|
68 |
|
69 /* |
|
70 @@ -1581,7 +1586,7 @@ |
|
71 |
|
72 static void |
|
73 set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags, |
|
74 - int mtu) |
|
75 + boolean_t flags_unknown, int mtu) |
|
76 { |
|
77 boolean_t havespeed = B_FALSE; |
|
78 |
|
79 @@ -1592,7 +1597,10 @@ |
|
80 ifp->ifDescr.o_length = strlen(name); |
|
81 strcpy(ifp->ifDescr.o_bytes, name); |
|
82 ifp->ifAdminStatus = (flags & IFF_UP) ? 1 : 2; |
|
83 - ifp->ifOperStatus = ((flags & IFF_UP) && (flags & IFF_RUNNING)) ? 1 : 2; |
|
84 + if (flags_unknown) |
|
85 + ifp->ifOperStatus = 4; /* status unknown */ |
|
86 + else |
|
87 + ifp->ifOperStatus = ((flags & IFF_UP) && (flags & IFF_RUNNING)) ? 1 : 2; |
|
88 ifp->ifLastChange = 0; /* Who knows ... */ |
|
89 ifp->flags = flags; |
|
90 ifp->ifMtu = mtu; |