|
1 Index: net-snmp/agent/mibgroup/kernel_sunos5.c |
|
2 =================================================================== |
|
3 --- net-snmp/agent/mibgroup/kernel_sunos5.c (revision 16741) |
|
4 +++ net-snmp/agent/mibgroup/kernel_sunos5.c (revision 16742) |
|
5 @@ -173,12 +173,14 @@ |
|
6 int mtu); |
|
7 static int get_if_stats(mib2_ifEntry_t *ifp); |
|
8 |
|
9 +#if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES) |
|
10 static int _dlpi_open(const char *devname); |
|
11 static int _dlpi_get_phys_address(int fd, char *paddr, int maxlen, |
|
12 int *paddrlen); |
|
13 static int _dlpi_get_iftype(int fd, unsigned int *iftype); |
|
14 static int _dlpi_attach(int fd, int ppa); |
|
15 static int _dlpi_parse_devname(char *devname, int *ppap); |
|
16 +#endif |
|
17 |
|
18 |
|
19 |
|
20 @@ -1044,8 +1046,300 @@ |
|
21 * Get info for interfaces group. Mimics getmib interface as much as possible |
|
22 * to be substituted later if SunSoft decides to extend its mib2 interface. |
|
23 */ |
|
24 + |
|
25 #if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES) |
|
26 + |
|
27 +/* |
|
28 + * If IFTABLE_REWRITES is enabled, then we will also rely on DLPI to obtain |
|
29 + * information from the NIC. |
|
30 + */ |
|
31 + |
|
32 +/* |
|
33 + * Open a DLPI device. |
|
34 + * |
|
35 + * On success the file descriptor is returned. |
|
36 + * On error -1 is returned. |
|
37 + */ |
|
38 static int |
|
39 +_dlpi_open(const char *devname) |
|
40 +{ |
|
41 + char *devstr; |
|
42 + int fd = -1; |
|
43 + int ppa = -1; |
|
44 + |
|
45 + DEBUGMSGTL(("kernel_sunos5", "_dlpi_open called\n")); |
|
46 + |
|
47 + if (devname == NULL) |
|
48 + return (-1); |
|
49 + |
|
50 + if ((devstr = malloc(5 + strlen(devname) + 1)) == NULL) |
|
51 + return (-1); |
|
52 + (void) sprintf(devstr, "/dev/%s", devname); |
|
53 + DEBUGMSGTL(("kernel_sunos5:dlpi", "devstr(%s)\n", devstr)); |
|
54 + /* |
|
55 + * First try opening the device using style 1, if the device does not |
|
56 + * exist we try style 2. Modules will not be pushed, so something like |
|
57 + * ip tunnels will not work. |
|
58 + */ |
|
59 + |
|
60 + DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open(%s)\n", devstr)); |
|
61 + if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) < 0) { |
|
62 + DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open failed\n")); |
|
63 + if (_dlpi_parse_devname(devstr, &ppa) == 0) { |
|
64 + DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 parse: %s, %d\n", |
|
65 + devstr, ppa)); |
|
66 + /* try style 2 */ |
|
67 + DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open(%s)\n", devstr)); |
|
68 + |
|
69 + if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) != -1) { |
|
70 + if (_dlpi_attach(fd, ppa) == 0) { |
|
71 + DEBUGMSGTL(("kernel_sunos5:dlpi", "attached\n")); |
|
72 + } else { |
|
73 + DEBUGMSGTL(("kernel_sunos5:dlpi", "attached failed\n")); |
|
74 + close(fd); |
|
75 + fd = -1; |
|
76 + } |
|
77 + } else { |
|
78 + DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open failed\n")); |
|
79 + } |
|
80 + } |
|
81 + } else { |
|
82 + DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open succeeded\n")); |
|
83 + } |
|
84 + |
|
85 + /* clean up */ |
|
86 + free(devstr); |
|
87 + |
|
88 + return (fd); |
|
89 +} |
|
90 + |
|
91 +/* |
|
92 + * Obtain the physical address of the interface using DLPI |
|
93 + */ |
|
94 +static int |
|
95 +_dlpi_get_phys_address(int fd, char *addr, int maxlen, int *addrlen) |
|
96 +{ |
|
97 + dl_phys_addr_req_t paddr_req; |
|
98 + union DL_primitives *dlp; |
|
99 + struct strbuf ctlbuf; |
|
100 + char buf[MAX(DL_PHYS_ADDR_ACK_SIZE+64, DL_ERROR_ACK_SIZE)]; |
|
101 + int flag = 0; |
|
102 + |
|
103 + DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_phys_address\n")); |
|
104 + |
|
105 + paddr_req.dl_primitive = DL_PHYS_ADDR_REQ; |
|
106 + paddr_req.dl_addr_type = DL_CURR_PHYS_ADDR; |
|
107 + ctlbuf.buf = (char *)&paddr_req; |
|
108 + ctlbuf.len = DL_PHYS_ADDR_REQ_SIZE; |
|
109 + if (putmsg(fd, &ctlbuf, NULL, 0) < 0) |
|
110 + return (-1); |
|
111 + |
|
112 + ctlbuf.maxlen = sizeof(buf); |
|
113 + ctlbuf.len = 0; |
|
114 + ctlbuf.buf = buf; |
|
115 + if (getmsg(fd, &ctlbuf, NULL, &flag) < 0) |
|
116 + return (-1); |
|
117 + |
|
118 + if (ctlbuf.len < sizeof(uint32_t)) |
|
119 + return (-1); |
|
120 + dlp = (union DL_primitives *)buf; |
|
121 + switch (dlp->dl_primitive) { |
|
122 + case DL_PHYS_ADDR_ACK: { |
|
123 + dl_phys_addr_ack_t *phyp = (dl_phys_addr_ack_t *)buf; |
|
124 + |
|
125 + DEBUGMSGTL(("kernel_sunos5:dlpi", "got ACK\n")); |
|
126 + if (ctlbuf.len < DL_PHYS_ADDR_ACK_SIZE || phyp->dl_addr_length > maxlen) |
|
127 + return (-1); |
|
128 + (void) memcpy(addr, buf+phyp->dl_addr_offset, phyp->dl_addr_length); |
|
129 + *addrlen = phyp->dl_addr_length; |
|
130 + return (0); |
|
131 + } |
|
132 + case DL_ERROR_ACK: { |
|
133 + dl_error_ack_t *errp = (dl_error_ack_t *)buf; |
|
134 + |
|
135 + DEBUGMSGTL(("kernel_sunos5:dlpi", "got ERROR ACK\n")); |
|
136 + if (ctlbuf.len < DL_ERROR_ACK_SIZE) |
|
137 + return (-1); |
|
138 + return (errp->dl_errno); |
|
139 + } |
|
140 + default: |
|
141 + DEBUGMSGTL(("kernel_sunos5:dlpi", "got type: %x\n", dlp->dl_primitive)); |
|
142 + return (-1); |
|
143 + } |
|
144 +} |
|
145 + |
|
146 +/* |
|
147 + * Query the interface about it's type. |
|
148 + */ |
|
149 +static int |
|
150 +_dlpi_get_iftype(int fd, unsigned int *iftype) |
|
151 +{ |
|
152 + dl_info_req_t info_req; |
|
153 + union DL_primitives *dlp; |
|
154 + struct strbuf ctlbuf; |
|
155 + char buf[MAX(DL_INFO_ACK_SIZE, DL_ERROR_ACK_SIZE)]; |
|
156 + int flag = 0; |
|
157 + |
|
158 + DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_iftype\n")); |
|
159 + |
|
160 + info_req.dl_primitive = DL_INFO_REQ; |
|
161 + ctlbuf.buf = (char *)&info_req; |
|
162 + ctlbuf.len = DL_INFO_REQ_SIZE; |
|
163 + if (putmsg(fd, &ctlbuf, NULL, 0) < 0) { |
|
164 + DEBUGMSGTL(("kernel_sunos5:dlpi", "putmsg failed: %d\nn", errno)); |
|
165 + return (-1); |
|
166 + } |
|
167 + |
|
168 + ctlbuf.maxlen = sizeof(buf); |
|
169 + ctlbuf.len = 0; |
|
170 + ctlbuf.buf = buf; |
|
171 + if (getmsg(fd, &ctlbuf, NULL, &flag) < 0) { |
|
172 + DEBUGMSGTL(("kernel_sunos5:dlpi", "getmsg failed: %d\n", errno)); |
|
173 + return (-1); |
|
174 + } |
|
175 + |
|
176 + if (ctlbuf.len < sizeof(uint32_t)) |
|
177 + return (-1); |
|
178 + dlp = (union DL_primitives *)buf; |
|
179 + switch (dlp->dl_primitive) { |
|
180 + case DL_INFO_ACK: { |
|
181 + dl_info_ack_t *info = (dl_info_ack_t *)buf; |
|
182 + |
|
183 + if (ctlbuf.len < DL_INFO_ACK_SIZE) |
|
184 + return (-1); |
|
185 + |
|
186 + DEBUGMSGTL(("kernel_sunos5:dlpi", "dl_mac_type: %x\n", |
|
187 + info->dl_mac_type)); |
|
188 + switch (info->dl_mac_type) { |
|
189 + case DL_CSMACD: |
|
190 + case DL_ETHER: |
|
191 + case DL_ETH_CSMA: |
|
192 + *iftype = 6; |
|
193 + break; |
|
194 + case DL_TPB: /* Token Passing Bus */ |
|
195 + *iftype = 8; |
|
196 + break; |
|
197 + case DL_TPR: /* Token Passing Ring */ |
|
198 + *iftype = 9; |
|
199 + break; |
|
200 + case DL_HDLC: |
|
201 + *iftype = 118; |
|
202 + break; |
|
203 + case DL_FDDI: |
|
204 + *iftype = 15; |
|
205 + break; |
|
206 + case DL_FC: /* Fibre channel */ |
|
207 + *iftype = 56; |
|
208 + break; |
|
209 + case DL_ATM: |
|
210 + *iftype = 37; |
|
211 + break; |
|
212 + case DL_X25: |
|
213 + case DL_ISDN: |
|
214 + *iftype = 63; |
|
215 + break; |
|
216 + case DL_HIPPI: |
|
217 + *iftype = 47; |
|
218 + break; |
|
219 +#ifdef DL_IB |
|
220 + case DL_IB: |
|
221 + *iftype = 199; |
|
222 + break; |
|
223 +#endif |
|
224 + case DL_FRAME: /* Frame Relay */ |
|
225 + *iftype = 32; |
|
226 + break; |
|
227 + case DL_LOOP: |
|
228 + *iftype = 24; |
|
229 + break; |
|
230 +#ifdef DL_WIFI |
|
231 + case DL_WIFI: |
|
232 + *iftype = 71; |
|
233 + break; |
|
234 +#endif |
|
235 +#ifdef DL_IPV4 /* then IPv6 is also defined */ |
|
236 + case DL_IPV4: /* IPv4 Tunnel */ |
|
237 + case DL_IPV6: /* IPv6 Tunnel */ |
|
238 + *iftype = 131; |
|
239 + break; |
|
240 +#endif |
|
241 + default: |
|
242 + *iftype = 1; /* Other */ |
|
243 + break; |
|
244 + } |
|
245 + |
|
246 + return (0); |
|
247 + } |
|
248 + case DL_ERROR_ACK: { |
|
249 + dl_error_ack_t *errp = (dl_error_ack_t *)buf; |
|
250 + |
|
251 + DEBUGMSGTL(("kernel_sunos5:dlpi", |
|
252 + "got DL_ERROR_ACK: dlpi %d, error %d\n", errp->dl_errno, |
|
253 + errp->dl_unix_errno)); |
|
254 + |
|
255 + if (ctlbuf.len < DL_ERROR_ACK_SIZE) |
|
256 + return (-1); |
|
257 + return (errp->dl_errno); |
|
258 + } |
|
259 + default: |
|
260 + DEBUGMSGTL(("kernel_sunos5:dlpi", "got type %x\n", dlp->dl_primitive)); |
|
261 + return (-1); |
|
262 + } |
|
263 +} |
|
264 + |
|
265 +static int |
|
266 +_dlpi_attach(int fd, int ppa) |
|
267 +{ |
|
268 + dl_attach_req_t attach_req; |
|
269 + struct strbuf ctlbuf; |
|
270 + union DL_primitives *dlp; |
|
271 + char buf[MAX(DL_OK_ACK_SIZE, DL_ERROR_ACK_SIZE)]; |
|
272 + int flag = 0; |
|
273 + |
|
274 + attach_req.dl_primitive = DL_ATTACH_REQ; |
|
275 + attach_req.dl_ppa = ppa; |
|
276 + ctlbuf.buf = (char *)&attach_req; |
|
277 + ctlbuf.len = DL_ATTACH_REQ_SIZE; |
|
278 + if (putmsg(fd, &ctlbuf, NULL, 0) != 0) |
|
279 + return (-1); |
|
280 + |
|
281 + ctlbuf.buf = buf; |
|
282 + ctlbuf.len = 0; |
|
283 + ctlbuf.maxlen = sizeof(buf); |
|
284 + if (getmsg(fd, &ctlbuf, NULL, &flag) != 0) |
|
285 + return (-1); |
|
286 + |
|
287 + if (ctlbuf.len < sizeof(uint32_t)) |
|
288 + return (-1); |
|
289 + |
|
290 + dlp = (union DL_primitives *)buf; |
|
291 + if (dlp->dl_primitive == DL_OK_ACK && ctlbuf.len >= DL_OK_ACK_SIZE) |
|
292 + return (0); |
|
293 + return (-1); |
|
294 +} |
|
295 + |
|
296 +static int |
|
297 +_dlpi_parse_devname(char *devname, int *ppap) |
|
298 +{ |
|
299 + int ppa = 0; |
|
300 + int m = 1; |
|
301 + int i = strlen(devname) - 1; |
|
302 + |
|
303 + while (i >= 0 && isdigit(devname[i])) { |
|
304 + ppa += m * (devname[i] - '0'); |
|
305 + m *= 10; |
|
306 + i--; |
|
307 + } |
|
308 + |
|
309 + if (m == 1) { |
|
310 + return (-1); |
|
311 + } |
|
312 + *ppap = ppa; |
|
313 + devname[i + 1] = '\0'; |
|
314 + |
|
315 + return (0); |
|
316 +} |
|
317 +static int |
|
318 getif(mib2_ifEntry_t *ifbuf, size_t size, req_e req_type, |
|
319 mib2_ifEntry_t *resp, size_t *length, int (*comp)(void *, void *), |
|
320 void *arg) |
|
321 @@ -1229,7 +1523,8 @@ |
|
322 |
|
323 if (ioctl(ifsd, SIOCGIFFLAGS, ifrp) < 0) { |
|
324 ret = -1; |
|
325 - snmp_log(LOG_ERR, "SIOCGIFFLAGS %s: %s\n", ifrp->ifr_name, strerror(errno)); |
|
326 + snmp_log(LOG_ERR, "SIOCGIFFLAGS %s: %s\n", ifrp->ifr_name, |
|
327 + strerror(errno)); |
|
328 goto Return; |
|
329 } |
|
330 if_flags = ifrp->ifr_flags; |
|
331 @@ -1522,294 +1817,7 @@ |
|
332 ifp->ifHCOutMulticastPkts); |
|
333 return(0); |
|
334 } |
|
335 - |
|
336 /* |
|
337 - * Open a DLPI device. |
|
338 - * |
|
339 - * On success the file descriptor is returned. |
|
340 - * On error -1 is returned. |
|
341 - */ |
|
342 -static int |
|
343 -_dlpi_open(const char *devname) |
|
344 -{ |
|
345 - char *devstr; |
|
346 - int fd = -1; |
|
347 - int ppa = -1; |
|
348 - |
|
349 - DEBUGMSGTL(("kernel_sunos5", "_dlpi_open called\n")); |
|
350 - |
|
351 - if (devname == NULL) |
|
352 - return (-1); |
|
353 - |
|
354 - if ((devstr = malloc(5 + strlen(devname) + 1)) == NULL) |
|
355 - return (-1); |
|
356 - (void) sprintf(devstr, "/dev/%s", devname); |
|
357 - DEBUGMSGTL(("kernel_sunos5:dlpi", "devstr(%s)\n", devstr)); |
|
358 - /* |
|
359 - * First try opening the device using style 1, if the device does not |
|
360 - * exist we try style 2. Modules will not be pushed, so something like |
|
361 - * ip tunnels will not work. |
|
362 - */ |
|
363 - |
|
364 - DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open(%s)\n", devstr)); |
|
365 - if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) < 0) { |
|
366 - DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open failed\n")); |
|
367 - if (_dlpi_parse_devname(devstr, &ppa) == 0) { |
|
368 - DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 parse: %s, %d\n", |
|
369 - devstr, ppa)); |
|
370 - /* try style 2 */ |
|
371 - DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open(%s)\n", devstr)); |
|
372 - |
|
373 - if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) != -1) { |
|
374 - if (_dlpi_attach(fd, ppa) == 0) { |
|
375 - DEBUGMSGTL(("kernel_sunos5:dlpi", "attached\n")); |
|
376 - } else { |
|
377 - DEBUGMSGTL(("kernel_sunos5:dlpi", "attached failed\n")); |
|
378 - close(fd); |
|
379 - fd = -1; |
|
380 - } |
|
381 - } else { |
|
382 - DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open failed\n")); |
|
383 - } |
|
384 - } |
|
385 - } else { |
|
386 - DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open succeeded\n")); |
|
387 - } |
|
388 - |
|
389 - /* clean up */ |
|
390 - free(devstr); |
|
391 - |
|
392 - return (fd); |
|
393 -} |
|
394 - |
|
395 -/* |
|
396 - * Obtain the physical address of the interface using DLPI |
|
397 - */ |
|
398 -static int |
|
399 -_dlpi_get_phys_address(int fd, char *addr, int maxlen, int *addrlen) |
|
400 -{ |
|
401 - dl_phys_addr_req_t paddr_req; |
|
402 - union DL_primitives *dlp; |
|
403 - struct strbuf ctlbuf; |
|
404 - char buf[MAX(DL_PHYS_ADDR_ACK_SIZE+64, DL_ERROR_ACK_SIZE)]; |
|
405 - int flag = 0; |
|
406 - |
|
407 - DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_phys_address\n")); |
|
408 - |
|
409 - paddr_req.dl_primitive = DL_PHYS_ADDR_REQ; |
|
410 - paddr_req.dl_addr_type = DL_CURR_PHYS_ADDR; |
|
411 - ctlbuf.buf = (char *)&paddr_req; |
|
412 - ctlbuf.len = DL_PHYS_ADDR_REQ_SIZE; |
|
413 - if (putmsg(fd, &ctlbuf, NULL, 0) < 0) |
|
414 - return (-1); |
|
415 - |
|
416 - ctlbuf.maxlen = sizeof(buf); |
|
417 - ctlbuf.len = 0; |
|
418 - ctlbuf.buf = buf; |
|
419 - if (getmsg(fd, &ctlbuf, NULL, &flag) < 0) |
|
420 - return (-1); |
|
421 - |
|
422 - if (ctlbuf.len < sizeof(uint32_t)) |
|
423 - return (-1); |
|
424 - dlp = (union DL_primitives *)buf; |
|
425 - switch (dlp->dl_primitive) { |
|
426 - case DL_PHYS_ADDR_ACK: { |
|
427 - dl_phys_addr_ack_t *phyp = (dl_phys_addr_ack_t *)buf; |
|
428 - |
|
429 - DEBUGMSGTL(("kernel_sunos5:dlpi", "got ACK\n")); |
|
430 - if (ctlbuf.len < DL_PHYS_ADDR_ACK_SIZE || phyp->dl_addr_length > maxlen) |
|
431 - return (-1); |
|
432 - (void) memcpy(addr, buf+phyp->dl_addr_offset, phyp->dl_addr_length); |
|
433 - *addrlen = phyp->dl_addr_length; |
|
434 - return (0); |
|
435 - } |
|
436 - case DL_ERROR_ACK: { |
|
437 - dl_error_ack_t *errp = (dl_error_ack_t *)buf; |
|
438 - |
|
439 - DEBUGMSGTL(("kernel_sunos5:dlpi", "got ERROR ACK\n")); |
|
440 - if (ctlbuf.len < DL_ERROR_ACK_SIZE) |
|
441 - return (-1); |
|
442 - return (errp->dl_errno); |
|
443 - } |
|
444 - default: |
|
445 - DEBUGMSGTL(("kernel_sunos5:dlpi", "got type: %x\n", dlp->dl_primitive)); |
|
446 - return (-1); |
|
447 - } |
|
448 -} |
|
449 - |
|
450 -/* |
|
451 - * Query the interface about it's type. |
|
452 - */ |
|
453 -static int |
|
454 -_dlpi_get_iftype(int fd, unsigned int *iftype) |
|
455 -{ |
|
456 - dl_info_req_t info_req; |
|
457 - union DL_primitives *dlp; |
|
458 - struct strbuf ctlbuf; |
|
459 - char buf[MAX(DL_INFO_ACK_SIZE, DL_ERROR_ACK_SIZE)]; |
|
460 - int flag = 0; |
|
461 - |
|
462 - DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_iftype\n")); |
|
463 - |
|
464 - info_req.dl_primitive = DL_INFO_REQ; |
|
465 - ctlbuf.buf = (char *)&info_req; |
|
466 - ctlbuf.len = DL_INFO_REQ_SIZE; |
|
467 - if (putmsg(fd, &ctlbuf, NULL, 0) < 0) { |
|
468 - DEBUGMSGTL(("kernel_sunos5:dlpi", "putmsg failed: %d\nn", errno)); |
|
469 - return (-1); |
|
470 - } |
|
471 - |
|
472 - ctlbuf.maxlen = sizeof(buf); |
|
473 - ctlbuf.len = 0; |
|
474 - ctlbuf.buf = buf; |
|
475 - if (getmsg(fd, &ctlbuf, NULL, &flag) < 0) { |
|
476 - DEBUGMSGTL(("kernel_sunos5:dlpi", "getmsg failed: %d\n", errno)); |
|
477 - return (-1); |
|
478 - } |
|
479 - |
|
480 - if (ctlbuf.len < sizeof(uint32_t)) |
|
481 - return (-1); |
|
482 - dlp = (union DL_primitives *)buf; |
|
483 - switch (dlp->dl_primitive) { |
|
484 - case DL_INFO_ACK: { |
|
485 - dl_info_ack_t *info = (dl_info_ack_t *)buf; |
|
486 - |
|
487 - if (ctlbuf.len < DL_INFO_ACK_SIZE) |
|
488 - return (-1); |
|
489 - |
|
490 - DEBUGMSGTL(("kernel_sunos5:dlpi", "dl_mac_type: %x\n", |
|
491 - info->dl_mac_type)); |
|
492 - switch (info->dl_mac_type) { |
|
493 - case DL_CSMACD: |
|
494 - case DL_ETHER: |
|
495 - case DL_ETH_CSMA: |
|
496 - *iftype = 6; |
|
497 - break; |
|
498 - case DL_TPB: /* Token Passing Bus */ |
|
499 - *iftype = 8; |
|
500 - break; |
|
501 - case DL_TPR: /* Token Passing Ring */ |
|
502 - *iftype = 9; |
|
503 - break; |
|
504 - case DL_HDLC: |
|
505 - *iftype = 118; |
|
506 - break; |
|
507 - case DL_FDDI: |
|
508 - *iftype = 15; |
|
509 - break; |
|
510 - case DL_FC: /* Fibre channel */ |
|
511 - *iftype = 56; |
|
512 - break; |
|
513 - case DL_ATM: |
|
514 - *iftype = 37; |
|
515 - break; |
|
516 - case DL_X25: |
|
517 - case DL_ISDN: |
|
518 - *iftype = 63; |
|
519 - break; |
|
520 - case DL_HIPPI: |
|
521 - *iftype = 47; |
|
522 - break; |
|
523 -#ifdef DL_IB |
|
524 - case DL_IB: |
|
525 - *iftype = 199; |
|
526 - break; |
|
527 -#endif |
|
528 - case DL_FRAME: /* Frame Relay */ |
|
529 - *iftype = 32; |
|
530 - break; |
|
531 - case DL_LOOP: |
|
532 - *iftype = 24; |
|
533 - break; |
|
534 -#ifdef DL_WIFI |
|
535 - case DL_WIFI: |
|
536 - *iftype = 71; |
|
537 - break; |
|
538 -#endif |
|
539 -#ifdef DL_IPV4 /* then IPv6 is also defined */ |
|
540 - case DL_IPV4: /* IPv4 Tunnel */ |
|
541 - case DL_IPV6: /* IPv6 Tunnel */ |
|
542 - *iftype = 131; |
|
543 - break; |
|
544 -#endif |
|
545 - default: |
|
546 - *iftype = 1; /* Other */ |
|
547 - break; |
|
548 - } |
|
549 - |
|
550 - return (0); |
|
551 - } |
|
552 - case DL_ERROR_ACK: { |
|
553 - dl_error_ack_t *errp = (dl_error_ack_t *)buf; |
|
554 - |
|
555 - DEBUGMSGTL(("kernel_sunos5:dlpi", |
|
556 - "got DL_ERROR_ACK: dlpi %d, error %d\n", errp->dl_errno, |
|
557 - errp->dl_unix_errno)); |
|
558 - |
|
559 - if (ctlbuf.len < DL_ERROR_ACK_SIZE) |
|
560 - return (-1); |
|
561 - return (errp->dl_errno); |
|
562 - } |
|
563 - default: |
|
564 - DEBUGMSGTL(("kernel_sunos5:dlpi", "got type %x\n", dlp->dl_primitive)); |
|
565 - return (-1); |
|
566 - } |
|
567 -} |
|
568 - |
|
569 -static int |
|
570 -_dlpi_attach(int fd, int ppa) |
|
571 -{ |
|
572 - dl_attach_req_t attach_req; |
|
573 - struct strbuf ctlbuf; |
|
574 - union DL_primitives *dlp; |
|
575 - char buf[MAX(DL_OK_ACK_SIZE, DL_ERROR_ACK_SIZE)]; |
|
576 - int flag = 0; |
|
577 - |
|
578 - attach_req.dl_primitive = DL_ATTACH_REQ; |
|
579 - attach_req.dl_ppa = ppa; |
|
580 - ctlbuf.buf = (char *)&attach_req; |
|
581 - ctlbuf.len = DL_ATTACH_REQ_SIZE; |
|
582 - if (putmsg(fd, &ctlbuf, NULL, 0) != 0) |
|
583 - return (-1); |
|
584 - |
|
585 - ctlbuf.buf = buf; |
|
586 - ctlbuf.len = 0; |
|
587 - ctlbuf.maxlen = sizeof(buf); |
|
588 - if (getmsg(fd, &ctlbuf, NULL, &flag) != 0) |
|
589 - return (-1); |
|
590 - |
|
591 - if (ctlbuf.len < sizeof(uint32_t)) |
|
592 - return (-1); |
|
593 - |
|
594 - dlp = (union DL_primitives *)buf; |
|
595 - if (dlp->dl_primitive == DL_OK_ACK && ctlbuf.len >= DL_OK_ACK_SIZE) |
|
596 - return (0); |
|
597 - return (-1); |
|
598 -} |
|
599 - |
|
600 -static int |
|
601 -_dlpi_parse_devname(char *devname, int *ppap) |
|
602 -{ |
|
603 - int ppa = 0; |
|
604 - int m = 1; |
|
605 - int i = strlen(devname) - 1; |
|
606 - |
|
607 - while (i >= 0 && isdigit(devname[i])) { |
|
608 - ppa += m * (devname[i] - '0'); |
|
609 - m *= 10; |
|
610 - i--; |
|
611 - } |
|
612 - |
|
613 - if (m == 1) { |
|
614 - return (-1); |
|
615 - } |
|
616 - *ppap = ppa; |
|
617 - devname[i + 1] = '\0'; |
|
618 - |
|
619 - return (0); |
|
620 -} |
|
621 - |
|
622 -/* |
|
623 * Always TRUE. May be used as a comparison function in getMibstat |
|
624 * to obtain the whole table (GET_FIRST should be used) |
|
625 */ |