1 --- net-snmp-5.4.1.2/agent/Makefile.in.~1~ 2014-03-13 23:54:04.717800170 +0400
2 +++ net-snmp-5.4.1.2/agent/Makefile.in 2014-03-13 23:56:36.202934491 +0400
4 LOBJS = $(LLIBAGENTOBJS) $(LAGENTOBJS) mib_modules.lo auto_nlist.lo
6 LIB_LD_ADD_AGENT =-lnetsnmp -lnetsnmphelpers
8 +LIB_LD_ADD_MIBS =-ldladm
10 LIB_LD_ADD_PATH_MIBS =-Lhelpers -L../snmplib
15 libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION): ${LMIBOBJS} $(HELPERLIB) $(AGENTLIB) $(USELIBS)
16 - $(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(HELPERLIB) $(AGENTLIB) $(USELIBS) ${LMIBLIBS} $(LDFLAGS) $(LIB_LD_LIBS)
17 + $(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(HELPERLIB) $(AGENTLIB) $(USELIBS) ${LMIBLIBS} $(LDFLAGS) $(LIB_LD_LIBS) $(LIB_LD_ADD_MIBS)
21 --- net-snmp-5.4.1.old/agent/mibgroup/kernel_sunos5.c 2014-02-25 06:04:49.253524010 -0500
22 +++ net-snmp-5.4.1/agent/mibgroup/kernel_sunos5.c 2014-02-26 05:32:10.697219080 -0500
25 #include <netinet/in.h>
27 +#include <libdladm.h>
28 +#include <libdllink.h>
30 * Includes of local application header files
33 set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags,
34 boolean_t flags_unknown, int mtu);
35 static int get_if_stats(mib2_ifEntry_t *ifp);
37 +static int link_to_phydev(char *link, char *phy_devname);
38 #if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)
39 static int _dlpi_open(const char *devname);
40 static int _dlpi_get_phys_address(int fd, char *paddr, int maxlen,
41 @@ -1724,11 +1726,155 @@
43 #endif /*defined(HAVE_IF_NAMEINDEX)&&defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)*/
45 +int link_to_phydev(char *link, char *phy_devname)
48 + datalink_id_t linkid;
49 + dladm_phys_attr_t dpa;
50 + dladm_handle_t handle;
52 + if (dladm_open(&handle) != DLADM_STATUS_OK) {
53 + DEBUGMSGTL(("kernel_sunos5","dladm_open failed "
54 + "with errno=%d\n",errno));
58 + if (dladm_name2info(handle, link, &linkid, NULL, NULL, NULL) !=
60 + DEBUGMSGTL(("kernel_sunos5","dladm_name2info failed "
61 + "with errno=%d\n",errno));
62 + dladm_close(handle);
67 + * Get the device name of the link, which will be used as the door
68 + * file name used to communicate with the driver.
70 + if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE) !=
72 + DEBUGMSGTL(("kernel_sunos5","dladm_phys_info failed "
73 + "with errno=%d\n",errno));
74 + dladm_close(handle);
78 + if(dpa.dp_dev == NULL) {
79 + DEBUGMSGTL(("kernel_sunos5","device name from "
80 + "dladm_phys_info = NULL\n"));
81 + dladm_close(handle);
85 + strcpy(phy_devname, dpa.dp_dev);
86 + dladm_close(handle);
92 +static int getKstatIntInstance(const char *classname, int instance,
93 + const char *statname, const char *varname,
99 + kstat_named_t *named;
101 + int ret = -1; /* fail unless ... */
102 + int lookup_stat = 0;
104 + DEBUGMSGTL(("kernel_sunos5","\n Inside getKstatIntInstance: variable = %s",
107 + if (kstat_fd == 0) {
108 + kstat_fd = kstat_open();
109 + if (kstat_fd == 0) {
110 + snmp_log_perror("kstat_open");
113 + if ((ksc = kstat_fd) == NULL) {
117 + ks = kstat_lookup(ksc, classname, instance, statname);
119 + DEBUGMSGTL(("kernel_sunos5","\nclass %s, stat %s not found\n",
120 + classname ? classname : "NULL",
121 + statname ? statname : "NULL"));
125 + kid = kstat_read(ksc, ks, NULL);
127 + DEBUGMSGTL(("kernel_sunos5","\ncannot read class %s stats %s\n",
128 + classname ? classname : "NULL",
129 + statname ? statname : "NULL"));
133 + named = kstat_data_lookup(ks, varname);
134 + if (named == NULL) {
135 + DEBUGMSGTL(("kernel_sunos5","\nno var %s for class %s stat %s\n",
136 + varname, classname ? classname : "NULL",
137 + statname ? statname : "NULL"));
140 + ret = 0; /* maybe successful */
141 + switch (named->data_type) {
142 +#ifdef KSTAT_DATA_INT32 /* Solaris 2.6 and up */
143 + case KSTAT_DATA_INT32:
144 + DEBUGMSGTL(("kernel_sunos5"," value: %d\n", named->value.i32));
145 + *value = named->value.i32;
147 + case KSTAT_DATA_UINT32:
148 + DEBUGMSGTL(("kernel_sunos5"," value: %u\n", named->value.ui32));
149 + *value = named->value.ui32;
151 + case KSTAT_DATA_INT64:
152 + DEBUGMSGTL(("kernel_sunos5"," value: %ld\n", named->value.i64));
153 + *value = named->value.i64;
155 + case KSTAT_DATA_UINT64:
156 + DEBUGMSGTL(("kernel_sunos5"," value: %llu\n", named->value.ui64));
157 + *value = named->value.ui64;
160 + case KSTAT_DATA_LONG:
161 + DEBUGMSGTL(("kernel_sunos5"," value: %ld\n", named->value.l));
162 + *value = named->value.l;
164 + case KSTAT_DATA_ULONG:
165 + DEBUGMSGTL(("kernel_sunos5"," value: %lu\n", named->value.ul));
166 + *value = named->value.ul;
168 + case KSTAT_DATA_LONGLONG:
169 + DEBUGMSGTL(("kernel_sunos5"," value: %lld\n", (long) named->value.ll));
170 + *value = (long)named->value.ll;
172 + case KSTAT_DATA_ULONGLONG:
173 + DEBUGMSGTL(("kernel_sunos5"," value: %llu\n",
174 + (unsigned long) named->value.ull));
175 + *value = (unsigned long)named->value.ull;
179 + ret = -1; /* fail */
187 set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags,
188 boolean_t flags_unknown, int mtu)
190 boolean_t havespeed = B_FALSE;
191 + char phydevname[100];
192 + char devbasename[100];
196 * Set basic information
197 @@ -1770,6 +1916,16 @@
198 /* only UPed interfaces get correct link status - if any */
199 if (getKstatInt(NULL, name,"link_up",&i_tmp) == 0) {
200 ifp->ifOperStatus = i_tmp ? 1 : 2;
201 + } else if(link_to_phydev(name, phydevname) == 0) {
202 + strcpy(devbasename, phydevname);
203 + DEBUGMSGTL(("kernel_sunos5","phydevname = %s\n", phydevname));
204 + _dlpi_parse_devname(devbasename, &instance);
205 + DEBUGMSGTL(("kernel_sunos5","devbasename = %s, "
206 + "instance= %d\n", devbasename, instance));
207 + if(getKstatIntInstance(devbasename, instance, "phys",
208 + "link_up", &i_tmp) == 0) {
209 + ifp->ifOperStatus = i_tmp ? 1 : 2;
212 } else if (flags & IFF_FAILED) {