|
1 --- net-snmp-5.4.1.old/snmplib/Makefile.in 2013-08-16 04:02:40.253396400 -0700 |
|
2 +++ net-snmp-5.4.1/snmplib/Makefile.in 2013-08-01 03:20:45.668713600 -0700 |
|
3 @@ -182,7 +182,7 @@ |
|
4 TOBJS=$(LOBJS) |
|
5 |
|
6 # To satisfy -zdefs |
|
7 -LIB_LD_ADD =-lnsl -lsocket -L$(libdir) |
|
8 +LIB_LD_ADD =-lnsl -lsocket -ldladm -L$(libdir) |
|
9 |
|
10 # |
|
11 CPPFLAGS = $(TOP_INCLUDES) -I. $(SNMPLIB_INCLUDES) @CPPFLAGS@ |
|
12 --- net-snmp-5.4.1.old/agent/mibgroup/kernel_sunos5.c 2014-02-25 06:04:49.253524010 -0500 |
|
13 +++ net-snmp-5.4.1/agent/mibgroup/kernel_sunos5.c 2014-02-26 05:32:10.697219080 -0500 |
|
14 @@ -60,6 +60,8 @@ |
|
15 #include <net/if.h> |
|
16 #include <netinet/in.h> |
|
17 |
|
18 +#include <libdladm.h> |
|
19 +#include <libdllink.h> |
|
20 /*- |
|
21 * Includes of local application header files |
|
22 */ |
|
23 @@ -172,7 +174,7 @@ |
|
24 set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags, |
|
25 boolean_t flags_unknown, int mtu); |
|
26 static int get_if_stats(mib2_ifEntry_t *ifp); |
|
27 - |
|
28 +static int link_to_phydev(char *link, char *phy_devname); |
|
29 #if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES) |
|
30 static int _dlpi_open(const char *devname); |
|
31 static int _dlpi_get_phys_address(int fd, char *paddr, int maxlen, |
|
32 @@ -1724,11 +1726,155 @@ |
|
33 } |
|
34 #endif /*defined(HAVE_IF_NAMEINDEX)&&defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)*/ |
|
35 |
|
36 +int link_to_phydev(char *link, char *phy_devname) |
|
37 +{ |
|
38 + char *key = NULL; |
|
39 + datalink_id_t linkid; |
|
40 + dladm_phys_attr_t dpa; |
|
41 + dladm_handle_t handle; |
|
42 + |
|
43 + if (dladm_open(&handle, NULL) != DLADM_STATUS_OK) { |
|
44 + DEBUGMSGTL(("kernel_sunos5","dladm_open failed " |
|
45 + "with errno=%d\n",errno)); |
|
46 + return (-1); |
|
47 + } |
|
48 + |
|
49 + if (dladm_name2info(handle, link, &linkid, NULL, NULL, NULL) != |
|
50 + DLADM_STATUS_OK) { |
|
51 + DEBUGMSGTL(("kernel_sunos5","dladm_name2info failed " |
|
52 + "with errno=%d\n",errno)); |
|
53 + dladm_close(handle); |
|
54 + return (-1); |
|
55 + } |
|
56 + |
|
57 + /* |
|
58 + * Get the device name of the link, which will be used as the door |
|
59 + * file name used to communicate with the driver. |
|
60 + */ |
|
61 + if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE) != |
|
62 + DLADM_STATUS_OK) { |
|
63 + DEBUGMSGTL(("kernel_sunos5","dladm_phys_info failed " |
|
64 + "with errno=%d\n",errno)); |
|
65 + dladm_close(handle); |
|
66 + return (-1); |
|
67 + } |
|
68 + |
|
69 + if(dpa.dp_dev == NULL) { |
|
70 + DEBUGMSGTL(("kernel_sunos5","device name from " |
|
71 + "dladm_phys_info = NULL\n")); |
|
72 + dladm_close(handle); |
|
73 + return -1; |
|
74 + |
|
75 + } |
|
76 + strcpy(phy_devname, dpa.dp_dev); |
|
77 + dladm_close(handle); |
|
78 + |
|
79 + return 0; |
|
80 +} |
|
81 + |
|
82 + |
|
83 +static int getKstatIntInstance(const char *classname, int instance, |
|
84 + const char *statname, const char *varname, |
|
85 + int *value) |
|
86 +{ |
|
87 + kstat_ctl_t *ksc; |
|
88 + kstat_t *ks; |
|
89 + kid_t kid; |
|
90 + kstat_named_t *named; |
|
91 + |
|
92 + int ret = -1; /* fail unless ... */ |
|
93 + int lookup_stat = 0; |
|
94 + |
|
95 + DEBUGMSGTL(("kernel_sunos5","\n Inside getKstatIntInstance: variable = %s", |
|
96 + varname)); |
|
97 + |
|
98 + if (kstat_fd == 0) { |
|
99 + kstat_fd = kstat_open(); |
|
100 + if (kstat_fd == 0) { |
|
101 + snmp_log_perror("kstat_open"); |
|
102 + } |
|
103 + } |
|
104 + if ((ksc = kstat_fd) == NULL) { |
|
105 + goto Return; |
|
106 + } |
|
107 + |
|
108 + ks = kstat_lookup(ksc, classname, instance, statname); |
|
109 + if (ks == NULL) { |
|
110 + DEBUGMSGTL(("kernel_sunos5","\nclass %s, stat %s not found\n", |
|
111 + classname ? classname : "NULL", |
|
112 + statname ? statname : "NULL")); |
|
113 + goto Return; |
|
114 + } |
|
115 + |
|
116 + kid = kstat_read(ksc, ks, NULL); |
|
117 + if (kid == -1) { |
|
118 + DEBUGMSGTL(("kernel_sunos5","\ncannot read class %s stats %s\n", |
|
119 + classname ? classname : "NULL", |
|
120 + statname ? statname : "NULL")); |
|
121 + goto Return; |
|
122 + } |
|
123 + |
|
124 + named = kstat_data_lookup(ks, varname); |
|
125 + if (named == NULL) { |
|
126 + DEBUGMSGTL(("kernel_sunos5","\nno var %s for class %s stat %s\n", |
|
127 + varname, classname ? classname : "NULL", |
|
128 + statname ? statname : "NULL")); |
|
129 + goto Return; |
|
130 + } |
|
131 + ret = 0; /* maybe successful */ |
|
132 + switch (named->data_type) { |
|
133 +#ifdef KSTAT_DATA_INT32 /* Solaris 2.6 and up */ |
|
134 + case KSTAT_DATA_INT32: |
|
135 + DEBUGMSGTL(("kernel_sunos5"," value: %d\n", named->value.i32)); |
|
136 + *value = named->value.i32; |
|
137 + break; |
|
138 + case KSTAT_DATA_UINT32: |
|
139 + DEBUGMSGTL(("kernel_sunos5"," value: %u\n", named->value.ui32)); |
|
140 + *value = named->value.ui32; |
|
141 + break; |
|
142 + case KSTAT_DATA_INT64: |
|
143 + DEBUGMSGTL(("kernel_sunos5"," value: %ld\n", named->value.i64)); |
|
144 + *value = named->value.i64; |
|
145 + break; |
|
146 + case KSTAT_DATA_UINT64: |
|
147 + DEBUGMSGTL(("kernel_sunos5"," value: %llu\n", named->value.ui64)); |
|
148 + *value = named->value.ui64; |
|
149 + break; |
|
150 +#else |
|
151 + case KSTAT_DATA_LONG: |
|
152 + DEBUGMSGTL(("kernel_sunos5"," value: %ld\n", named->value.l)); |
|
153 + *value = named->value.l; |
|
154 + break; |
|
155 + case KSTAT_DATA_ULONG: |
|
156 + DEBUGMSGTL(("kernel_sunos5"," value: %lu\n", named->value.ul)); |
|
157 + *value = named->value.ul; |
|
158 + break; |
|
159 + case KSTAT_DATA_LONGLONG: |
|
160 + DEBUGMSGTL(("kernel_sunos5"," value: %lld\n", (long) named->value.ll)); |
|
161 + *value = (long)named->value.ll; |
|
162 + break; |
|
163 + case KSTAT_DATA_ULONGLONG: |
|
164 + DEBUGMSGTL(("kernel_sunos5"," value: %llu\n", |
|
165 + (unsigned long) named->value.ull)); |
|
166 + *value = (unsigned long)named->value.ull; |
|
167 + break; |
|
168 +#endif |
|
169 + default: |
|
170 + ret = -1; /* fail */ |
|
171 + break; |
|
172 + } |
|
173 + Return: |
|
174 + return ret; |
|
175 +} |
|
176 + |
|
177 static void |
|
178 set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags, |
|
179 boolean_t flags_unknown, int mtu) |
|
180 { |
|
181 boolean_t havespeed = B_FALSE; |
|
182 + char phydevname[100]; |
|
183 + char devbasename[100]; |
|
184 + int instance = -1; |
|
185 |
|
186 /* |
|
187 * Set basic information |
|
188 @@ -1770,6 +1916,16 @@ |
|
189 /* only UPed interfaces get correct link status - if any */ |
|
190 if (getKstatInt(NULL, name,"link_up",&i_tmp) == 0) { |
|
191 ifp->ifOperStatus = i_tmp ? 1 : 2; |
|
192 + } else if(link_to_phydev(name, phydevname) == 0) { |
|
193 + strcpy(devbasename, phydevname); |
|
194 + DEBUGMSGTL(("kernel_sunos5","phydevname = %s\n", phydevname)); |
|
195 + _dlpi_parse_devname(devbasename, &instance); |
|
196 + DEBUGMSGTL(("kernel_sunos5","devbasename = %s, " |
|
197 + "instance= %d\n", devbasename, instance)); |
|
198 + if(getKstatIntInstance(devbasename, instance, "phys", |
|
199 + "link_up", &i_tmp) == 0) { |
|
200 + ifp->ifOperStatus = i_tmp ? 1 : 2; |
|
201 + } |
|
202 #ifdef IFF_FAILED |
|
203 } else if (flags & IFF_FAILED) { |
|
204 /* |