Give some README.<os> files RCS IDs; the other ones already have them.
[obnox/wireshark/wip.git] / README.hpux
1 $Id: README.hpux,v 1.9 2000/02/19 22:00:24 guy Exp $
2
3 Contents:
4
5 1 - Building ethereal
6 2 - nettl support
7 3 - "libpcap" on HP-UX
8
9 1 - Building ethereal
10
11 The Software Porting And Archive Centre for HP-UX, at
12
13         http://hpux.csc.liv.ac.uk/
14
15 (and with mirrors in various countries, listed on the Centre's home
16 page) has ported versions, in both source and binary form, for Ethereal,
17 as well as for the "libpcap", GLib, GTK+, "zlib", and CMU SNMP libraries
18 that it uses.
19
20 The changes they've made appear largely to be compile option changes; if
21 you've downloaded the source to the latest version of Ethereal (the
22 version on the Centre's site may not necessarily be the latest version),
23 it should be able to compile, perhaps with those changes.
24
25 They appear to have used HP-UX's "cc" compiler, with the options "-Ae
26 -O"; there's a comment "Add -Dhpux_9 if building under 9.X".  It may
27 also build with GCC.
28
29 2 - nettl support
30
31 nettl is used on HP-UX to trace various streams based subsystems.  Ethereal
32 can read nettl files containing IP frames (NS_LS_IP subsystem) and LAPB
33 frames (SX25L2 subsystem).
34 It has been tested with files generated on HP-UX 9.04 and 10.20.
35
36 Use the following commands to generate a trace (cf. nettl(1M)):
37
38 # IP capture. 0x30000000 means PDU in and PDU out :
39 nettl -tn 0x30000000 -e NS_LS_IP -f tracefile
40 # X25 capture. You must specify an interface :
41 nettl -tn 0x30000000 -e SX25l2 -d /dev/x25_0 -f tracefile
42 # stop capture. subsystem is NS_LS_IP or SX25L2 :
43 nettl -tf -e subsystem
44
45 One may be able to specify "-tn pduin pduout" rather than
46 "-tn 0x30000000"; the nettl man page for HP-UX 10.30 implies that it
47 should work.
48
49 3 - "libpcap" on HP-UX
50
51 If you want to use Ethereal to capture packets, you will have to install
52 "libpcap"; the INSTALL file for "libpcap" has several comments about
53 HP-UX, which you should read if you're going to install and use
54 "libpcap" on HP-UX.
55
56 Another note, from a mail message to the "ethereal-users" list:
57
58   Date: Wed, 22 Dec 1999 09:05:47 -0600 (EST)
59   From: Gerald Combs <gerald@zing.org>
60   To: Lothar Seitter <lothar.seitter@arcormail.de>
61   cc: ethereal-users@zing.org
62   Subject: Re: [ethereal-users] permission problem with capturing
63
64   On Wed, 22 Dec 1999, Lothar Seitter wrote:
65
66   > running 'ethereal' under HP-UX 11 with root permission and
67   > /dev/lan0 set to 777, I always get the message:
68   > "There are no network interfaces that can be opened.
69   > Please to make sure you have sufficient permission to 
70   > capture packets."
71   > 
72   > I start ethereal with 'etheral -i lan0' and lan0 is definitely
73   > the lan interface.
74   > 
75   > What am I missing???
76
77   You may need to reference the card's DLPI device directly.  We were having
78   trouble getting Ethereal to capture on an HP-UX 10.20 machine here.  I
79   found an article on Deja News that says:
80
81   "To access a particular interface, you would say "tcpdump -i /dev/dlpiN"
82   where N is the PPA of the interface you wish to use. You get the PPA by
83   looking at the output of lanscan. On 10.20, it is the same value as the
84   NMID. On 11.X, it is the Card Instance number."
85
86   This didn't help in our case, but it might in yours.  The full article is
87   at http://x34.deja.com/[ST_rn=ps]/getdoc.xp?AN=549366486 .
88
89   Another article by the same author mentions that experimental versions of
90   libpcap and tcpdump are available at
91   ftp://ftp.cup.hp.com/dist/networking/tools/ .  The article itself is at
92   http://x34.deja.com/[ST_rn=ps]/getdoc.xp?AN=558665378 .
93
94 The first of those articles also says:
95
96   BTW, before you have to make a follow-up post, you will find that
97   unless you have the latest lan common/DLPI/driver patches installed,
98   you will _not_ see the system's own outbound traffic.
99
100 It appears that a consequence of the fact that HP-UX's DLPI doesn't work
101 like Solaris's, in that, on Solaris, to get at the device "hme0", say,
102 "libpcap" has to open "/dev/hme" and then tell it to use the 0th
103 interface, whilst on HP-UX you have to go through "/dev/dlpi", you won't
104 get a list of interfaces in the dialog box for "Capture:Start" - you'll
105 have to do through the aforementioned song and dance to find the PPA of
106 the interface you want to use, and supply the "dlpiN" name by hand (I
107 think you can omit the "/dev/" in both tcpdump and Ethereal).
108
109 Here is a patch to "pcap-dlpi.c" in libpcap that, at least on HP-UX
110 11.X, allows the name of the network interface, rather than the "dlpiN"
111 name, to be specified to tcpdump and Ethereal.  It has not been tried on
112 HP-UX 10.20; it fixes one bug that could have caused the code in vanilla
113 libpcap not to correctly find the PPA for an interface on HP-UX 10.20,
114 but HP-UX 10.20's DLPI doesn't supply, in the data returned by a
115 DL_HP_PPA_REQ request, network interface names, so, on systems without
116 the network interface names in that data, the code continues to check
117 the major device number.
118
119 On HP-UX 11.00, the patch allows a network interface to be specified by
120 name as an argument to tcpdump, rather than requiring that you specify a
121 "dlpiN" name (and it should work equally well with Ethereal).
122
123 If you try this code on HP-UX 10.20, and it doesn't let you specify the
124 interface by name, please send mail to ethereal-dev@zing.org, so that we
125 know that it didn't work - we'll probably send you debugging patches in
126 the hopes of being able to make it work on 10.20 as well.
127
128 Here's the patch (to vanilla libpcap 0.4; it patches "configure",
129 "aclocal.m4", and "configure.in", to make the configure script check
130 whether your version of HP-UX supplies the interface names in the reply
131 to a DL_HP_PPA_REQ request, and "pcap-dlpi.c"):
132
133 *** ../libpcap-0.4/configure    Sat Jul 25 12:41:51 1998
134 --- configure   Fri Jan 14 00:40:04 2000
135 ***************
136 *** 1702,1709 ****
137   
138       fi
139   
140   echo $ac_n "checking if unaligned accesses fail""... $ac_c" 1>&6
141 ! echo "configure:1707: checking if unaligned accesses fail" >&5
142       if eval "test \"`echo '$''{'ac_cv_lbl_unaligned_fail'+set}'`\" = set"; then
143     echo $ac_n "(cached) $ac_c" 1>&6
144   else
145 --- 1702,1745 ----
146   
147       fi
148   
149 + echo $ac_n "checking if dl_hp_ppa_info_t struct has dl_module_id_1 member""... $ac_c" 1>&6
150 + echo "configure:1707: checking if dl_hp_ppa_info_t struct has dl_module_id_1 member" >&5
151 +     if eval "test \"`echo '$''{'ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1'+set}'`\" = set"; then
152 +   echo $ac_n "(cached) $ac_c" 1>&6
153 + else
154 +   cat > conftest.$ac_ext <<EOF
155 + #line 1712 "configure"
156 + #include "confdefs.h"
157
158 + #     include <sys/types.h>
159 + #     include <sys/dlpi.h>
160 + #     include <sys/dlpi_ext.h>
161 + int main() {
162 + u_int i = sizeof(((dl_hp_ppa_info_t *)0)->dl_module_id_1)
163 + ; return 0; }
164 + EOF
165 + if { (eval echo configure:1722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
166 +   rm -rf conftest*
167 +   ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=yes
168 + else
169 +   echo "configure: failed program was:" >&5
170 +   cat conftest.$ac_ext >&5
171 +   rm -rf conftest*
172 +   ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=no
173 + fi
174 + rm -f conftest*
175 + fi
176
177 +     echo "$ac_t""$ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1" 1>&6
178 +     if test $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1 = yes ; then
179 +           cat >> confdefs.h <<\EOF
180 + #define HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 1
181 + EOF
182
183 +     fi
184
185   echo $ac_n "checking if unaligned accesses fail""... $ac_c" 1>&6
186 ! echo "configure:1743: checking if unaligned accesses fail" >&5
187       if eval "test \"`echo '$''{'ac_cv_lbl_unaligned_fail'+set}'`\" = set"; then
188     echo $ac_n "(cached) $ac_c" 1>&6
189   else
190 ***************
191 *** 1799,1805 ****
192   # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
193   # ./install, which can be erroneously created by make from ./install.sh.
194   echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
195 ! echo "configure:1803: checking for a BSD compatible install" >&5
196   if test -z "$INSTALL"; then
197   if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
198     echo $ac_n "(cached) $ac_c" 1>&6
199 --- 1835,1841 ----
200   # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
201   # ./install, which can be erroneously created by make from ./install.sh.
202   echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
203 ! echo "configure:1839: checking for a BSD compatible install" >&5
204   if test -z "$INSTALL"; then
205   if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
206     echo $ac_n "(cached) $ac_c" 1>&6
207
208
209 *** ../libpcap-0.4/aclocal.m4   Fri Jun 12 03:45:15 1998
210 --- aclocal.m4  Tue Jan  4 21:02:13 2000
211 ***************
212 *** 415,420 ****
213 --- 415,454 ----
214       fi])
215   
216   dnl
217 + dnl Checks to see if the dl_hp_ppa_info_t struct has the HP-UX 11.00
218 + dnl dl_module_id_1 member
219 + dnl
220 + dnl usage:
221 + dnl
222 + dnl   AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1
223 + dnl
224 + dnl results:
225 + dnl
226 + dnl   HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 (defined)
227 + dnl
228 + dnl NOTE: any compile failure means we conclude that it doesn't have
229 + dnl that member, so if we don't have DLPI, don't have a <sys/dlpi_ext.h>
230 + dnl header, or have one that doesn't declare a dl_hp_ppa_info_t type,
231 + dnl we conclude it doesn't have that member (which is OK, as either we
232 + dnl won't be using code that would use that member, or we wouldn't
233 + dnl compile in any case).
234 + dnl
235 + AC_DEFUN(AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1,
236 +     [AC_MSG_CHECKING(if dl_hp_ppa_info_t struct has dl_module_id_1 member)
237 +     AC_CACHE_VAL(ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1,
238 +       AC_TRY_COMPILE([
239 + #     include <sys/types.h>
240 + #     include <sys/dlpi.h>
241 + #     include <sys/dlpi_ext.h>],
242 +       [u_int i = sizeof(((dl_hp_ppa_info_t *)0)->dl_module_id_1)],
243 +       ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=yes,
244 +       ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=no))
245 +     AC_MSG_RESULT($ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1)
246 +     if test $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1 = yes ; then
247 +           AC_DEFINE(HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1)
248 +     fi])
249
250 + dnl
251   dnl Checks to see if -R is used
252   dnl
253   dnl usage:
254
255
256 *** ../libpcap-0.4/configure.in Sun Jul 27 22:16:22 1997
257 --- configure.in        Tue Jan  4 21:02:13 2000
258 ***************
259 *** 154,159 ****
260 --- 154,161 ----
261   
262   AC_LBL_SOCKADDR_SA_LEN
263   
264 + AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1
265
266   AC_LBL_UNALIGNED_ACCESS
267   
268   if test "${srcdir}" = "." ; then
269
270 *** ../libpcap-0.4/pcap-dlpi.c  Wed Oct 15 21:59:34 1997
271 --- pcap-dlpi.c Tue Jan  4 21:02:13 2000
272 ***************
273 *** 246,255 ****
274         }
275         memset(p, 0, sizeof(*p));
276   
277         /*
278 !       ** Determine device and ppa
279         */
280 !       cp = strpbrk(device, "0123456789");
281         if (cp == NULL) {
282                 sprintf(ebuf, "%s missing unit number", device);
283                 goto bad;
284 --- 246,266 ----
285         }
286         memset(p, 0, sizeof(*p));
287   
288 + #ifdef HAVE_DEV_DLPI
289         /*
290 !       ** Remove any "/dev/" on the front of the device.
291         */
292 !       cp = strrchr(device, '/');
293 !       if (cp == NULL)
294 !               cp = device;
295 !       else
296 !               cp++;
297 !       strcpy(dname, cp);
298
299 !       /*
300 !        * Split the name into a device type and a unit number.
301 !        */
302 !       cp = strpbrk(dname, "0123456789");
303         if (cp == NULL) {
304                 sprintf(ebuf, "%s missing unit number", device);
305                 goto bad;
306 ***************
307 *** 259,281 ****
308                 sprintf(ebuf, "%s bad unit number", device);
309                 goto bad;
310         }
311   
312 !       if (*device == '/')
313 !               strcpy(dname, device);
314 !       else
315 !               sprintf(dname, "%s/%s", PCAP_DEV_PREFIX, device);
316 ! #ifdef HAVE_DEV_DLPI
317 !       /* Map network device to /dev/dlpi unit */
318         cp = "/dev/dlpi";
319         if ((p->fd = open(cp, O_RDWR)) < 0) {
320                 sprintf(ebuf, "%s: %s", cp, pcap_strerror(errno));
321                 goto bad;
322         }
323 !       /* Map network interface to /dev/dlpi unit */
324         ppa = get_dlpi_ppa(p->fd, dname, ppa, ebuf);
325         if (ppa < 0)
326                 goto bad;
327   #else
328         /* Try device without unit number */
329         strcpy(dname2, dname);
330         cp = strchr(dname, *cp);
331 --- 270,331 ----
332                 sprintf(ebuf, "%s bad unit number", device);
333                 goto bad;
334         }
335 +       *cp = '\0';
336   
337 !       /*
338 !        * Use "/dev/dlpi" as the device.
339 !        *
340 !        * XXX - HP's DLPI Programmer's Guide for HP-UX 11.00 says that
341 !        * the "dl_mjr_num" field is for the "major number of interface
342 !        * driver"; that's the major of "/dev/dlpi" on the system on
343 !        * which I tried this, but there may be DLPI devices that
344 !        * use a different driver, in which case we may need to
345 !        * search "/dev" for the appropriate device with that major
346 !        * device number, rather than hardwiring "/dev/dlpi".
347 !        *
348 !        * I'm assuming that the code that was used for HP-UX 10.x
349 !        * is valid, and therefore that, in 10.x, DLPIable devices have
350 !        * "/dev" entries corresponding to them and that their
351 !        * major device number is what appears in the "dl_hp_ppa_info_t"
352 !        * structure for that device.  We can search by name in 11.x
353 !        * (and we may have to, as it's not clear that DLPIable devices
354 !        * will have those sorts of "/dev" entries), but we can't in
355 !        * 10.x, as 10.x doesn't have the "dl_module_id_1" and
356 !        * "dl_module_id_2" members in the "dl_hp_ppa_info_t" structure.
357 !        */
358         cp = "/dev/dlpi";
359         if ((p->fd = open(cp, O_RDWR)) < 0) {
360                 sprintf(ebuf, "%s: %s", cp, pcap_strerror(errno));
361                 goto bad;
362         }
363
364 !       /*
365 !        * Get a table of all PPAs for that device, and search that
366 !        * table for the specified device type name and unit number.
367 !        */
368         ppa = get_dlpi_ppa(p->fd, dname, ppa, ebuf);
369         if (ppa < 0)
370                 goto bad;
371   #else
372 +       /*
373 +       ** Determine device and ppa
374 +       */
375 +       cp = strpbrk(device, "0123456789");
376 +       if (cp == NULL) {
377 +               sprintf(ebuf, "%s missing unit number", device);
378 +               goto bad;
379 +       }
380 +       ppa = strtol(cp, &eos, 10);
381 +       if (*eos != '\0') {
382 +               sprintf(ebuf, "%s bad unit number", device);
383 +               goto bad;
384 +       }
385
386 +       if (*device == '/')
387 +               strcpy(dname, device);
388 +       else
389 +               sprintf(dname, "%s/%s", PCAP_DEV_PREFIX, device);
390
391         /* Try device without unit number */
392         strcpy(dname2, dname);
393         cp = strchr(dname, *cp);
394 ***************
395 *** 391,397 ****
396                 break;
397   
398         default:
399 !               sprintf(ebuf, "unknown mac type 0x%lu", infop->dl_mac_type);
400                 goto bad;
401         }
402   
403 --- 441,448 ----
404                 break;
405   
406         default:
407 !               sprintf(ebuf, "unknown mac type 0x%lu",
408 !                   (unsigned long)infop->dl_mac_type);
409                 goto bad;
410         }
411   
412 ***************
413 *** 709,715 ****
414   
415   #ifdef DL_HP_PPA_ACK_OBS
416   /*
417 !  * Under HP-UX 10, we can ask for the ppa
418    */
419   
420   
421 --- 760,766 ----
422   
423   #ifdef DL_HP_PPA_ACK_OBS
424   /*
425 !  * Under HP-UX 10 and HP-UX 11, we can ask for the ppa
426    */
427   
428   
429 ***************
430 *** 719,736 ****
431       register char *ebuf)
432   {
433         register dl_hp_ppa_ack_t *ap;
434 !       register dl_hp_ppa_info_t *ip;
435         register int i;
436         register u_long majdev;
437 -       dl_hp_ppa_req_t req;
438         struct stat statbuf;
439         bpf_u_int32 buf[MAXDLBUF];
440   
441 !       if (stat(device, &statbuf) < 0) {
442 !               sprintf(ebuf, "stat: %s: %s", device, pcap_strerror(errno));
443                 return (-1);
444         }
445         majdev = major(statbuf.st_rdev);
446   
447         memset((char *)&req, 0, sizeof(req));
448         req.dl_primitive = DL_HP_PPA_REQ;
449 --- 770,800 ----
450       register char *ebuf)
451   {
452         register dl_hp_ppa_ack_t *ap;
453 !       register dl_hp_ppa_info_t *ipstart, *ip;
454         register int i;
455 + #ifndef HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1
456 +       char dname[100];
457         register u_long majdev;
458         struct stat statbuf;
459 + #endif
460 +       dl_hp_ppa_req_t req;
461         bpf_u_int32 buf[MAXDLBUF];
462   
463 ! #ifndef HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1
464 !       /*
465 !        * HP-UX 10 doesn't put the interface name in the
466 !        * "dl_hp_ppa_info_t" structure, so we have to
467 !        * try to get the major device number for the device
468 !        * corresponding to the device and unit name provided to
469 !        * us, and search for the entry with that major device number.
470 !        */
471 !       sprintf(dname, "/dev/%s%d", device, unit);
472 !       if (stat(dname, &statbuf) < 0) {
473 !               sprintf(ebuf, "stat: %s: %s", dname, pcap_strerror(errno));
474                 return (-1);
475         }
476         majdev = major(statbuf.st_rdev);
477 + #endif
478   
479         memset((char *)&req, 0, sizeof(req));
480         req.dl_primitive = DL_HP_PPA_REQ;
481 ***************
482 *** 741,760 ****
483                 return (-1);
484   
485         ap = (dl_hp_ppa_ack_t *)buf;
486 !       ip = (dl_hp_ppa_info_t *)((u_char *)ap + ap->dl_offset);
487   
488           for(i = 0; i < ap->dl_count; i++) {
489 !                 if (ip->dl_mjr_num == majdev && ip->dl_instance_num == unit)
490                           break;
491   
492 !                 ip = (dl_hp_ppa_info_t *)((u_char *)ip + ip->dl_next_offset);
493           }
494           if (i == ap->dl_count) {
495 !                 sprintf(ebuf, "can't find PPA for %s", device);
496                 return (-1);
497           }
498           if (ip->dl_hdw_state == HDW_DEAD) {
499 !                 sprintf(ebuf, "%s: hardware state: DOWN\n", device);
500                 return (-1);
501           }
502           return ((int)ip->dl_ppa);
503 --- 805,831 ----
504                 return (-1);
505   
506         ap = (dl_hp_ppa_ack_t *)buf;
507 !       ipstart = (dl_hp_ppa_info_t *)((u_char *)ap + ap->dl_offset);
508 !       ip = ipstart;
509   
510           for(i = 0; i < ap->dl_count; i++) {
511 ! #ifdef HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1
512 !               if ((strcmp(ip->dl_module_id_1, device) == 0 ||
513 !                    strcmp(ip->dl_module_id_2, device) == 0) &&
514 ! #else
515 !                 if (ip->dl_mjr_num == majdev &&
516 ! #endif
517 !                   ip->dl_instance_num == unit)
518                           break;
519   
520 !                 ip = (dl_hp_ppa_info_t *)((u_char *)ipstart + ip->dl_next_offset);
521           }
522           if (i == ap->dl_count) {
523 !                 sprintf(ebuf, "can't find PPA for %s%d", device, unit);
524                 return (-1);
525           }
526           if (ip->dl_hdw_state == HDW_DEAD) {
527 !                 sprintf(ebuf, "%s%d: hardware state: DOWN\n", device, unit);
528                 return (-1);
529           }
530           return ((int)ip->dl_ppa);
531 ***************
532 *** 783,789 ****
533         register int kd;
534         void *addr;
535         struct ifnet ifnet;
536 !       char if_name[sizeof(ifnet.if_name)], tifname[32];
537   
538         cp = strrchr(ifname, '/');
539         if (cp != NULL)
540 --- 854,860 ----
541         register int kd;
542         void *addr;
543         struct ifnet ifnet;
544 !       char if_name[sizeof(ifnet.if_name) + 1];
545   
546         cp = strrchr(ifname, '/');
547         if (cp != NULL)
548 ***************
549 *** 811,823 ****
550                 if (dlpi_kread(kd, (off_t)addr,
551                     &ifnet, sizeof(ifnet), ebuf) < 0 ||
552                     dlpi_kread(kd, (off_t)ifnet.if_name,
553 !                   if_name, sizeof(if_name), ebuf) < 0) {
554                         (void)close(kd);
555                         return (-1);
556                 }
557 !               sprintf(tifname, "%.*s%d",
558 !                   (int)sizeof(if_name), if_name, ifnet.if_unit);
559 !               if (strcmp(tifname, ifname) == 0)
560                         return (ifnet.if_index);
561         }
562   
563 --- 882,893 ----
564                 if (dlpi_kread(kd, (off_t)addr,
565                     &ifnet, sizeof(ifnet), ebuf) < 0 ||
566                     dlpi_kread(kd, (off_t)ifnet.if_name,
567 !                   if_name, sizeof(ifnet.if_name), ebuf) < 0) {
568                         (void)close(kd);
569                         return (-1);
570                 }
571 !               if_name[sizeof(ifnet.if_name)] = '\0';
572 !               if (strcmp(if_name, ifname) == 0 && ifnet.if_unit == unit)
573                         return (ifnet.if_index);
574         }
575   
576
577