Have the Etherenet and PPP dissectors register themselves, and have
[obnox/wireshark/wip.git] / README.hpux
index 28a22c04b629df472e855a14c4df8dcaa58b3363..51110805d55b6cae5ef1d2ee4b8f578d0dc105bc 100644 (file)
@@ -1,21 +1,21 @@
-$Id: README.hpux,v 1.12 2000/04/29 08:38:35 guy Exp $
+$Id: README.hpux,v 1.13 2000/08/13 07:48:55 guy Exp $
 
 Contents:
 
 1 - Building ethereal
 2 - Building GTK+/GLib with HP's C compiler
 3 - nettl support
-4 - "libpcap" on HP-UX
+4 - libpcap on HP-UX
 
 1 - Building ethereal
 
 The Software Porting And Archive Centre for HP-UX, at
 
-       http://hpux.csc.liv.ac.uk/
+       http://hpux.connect.org.uk/
 
 (and with mirrors in various countries, listed on the Centre's home
 page) has ported versions, in both source and binary form, for Ethereal,
-as well as for the "libpcap", GLib, GTK+, "zlib", and CMU SNMP libraries
+as well as for the libpcap, GLib, GTK+, zlib, and CMU SNMP libraries
 that it uses.
 
 The changes they've made appear largely to be compile option changes; if
@@ -27,6 +27,14 @@ They appear to have used HP-UX's "cc" compiler, with the options "-Ae
 -O"; there's a comment "Add -Dhpux_9 if building under 9.X".  It may
 also build with GCC.
 
+The libpcap library has not been changed to properly open network
+devices when given the name reported by the lanscan and ifconfig
+commands; this means you may have difficulty capturing packets with
+Ethereal on HP-UX.  The "libpcap on HP-UX" item below discusses patches
+to the libpcap source code that should fix this problem, and the process
+you will have to go through to apply those patches and build and install
+a new version of libpcap that includes those patches.
+
 2 - Building GTK+/GLib with HP's C compiler
 
 By default, HP's C compiler doesn't support "long long int" to provide
@@ -359,515 +367,38 @@ know that it didn't work - we'll probably send you debugging patches in
 the hopes of being able to make it work on 10.20 as well.  (It appeared
 to work in some tests done on HP-UX 10.20 systems.)
 
-Here's the patch (to vanilla libpcap 0.4; it patches "aclocal.m4",
-"configure", and "configure.in", to make the configure script check
-whether your version of HP-UX supplies the interface names in the reply
-to a DL_HP_PPA_REQ request, and patches "pcap-dlpi.c"):
-
-diff -c ../libpcap-0.4/aclocal.m4 ./aclocal.m4
-*** ../libpcap-0.4/aclocal.m4  Fri Jun 12 03:45:15 1998
---- ./aclocal.m4       Tue Jan  4 21:02:13 2000
-***************
-*** 415,420 ****
---- 415,454 ----
-      fi])
-  
-  dnl
-+ dnl Checks to see if the dl_hp_ppa_info_t struct has the HP-UX 11.00
-+ dnl dl_module_id_1 member
-+ dnl
-+ dnl usage:
-+ dnl
-+ dnl  AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1
-+ dnl
-+ dnl results:
-+ dnl
-+ dnl  HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 (defined)
-+ dnl
-+ dnl NOTE: any compile failure means we conclude that it doesn't have
-+ dnl that member, so if we don't have DLPI, don't have a <sys/dlpi_ext.h>
-+ dnl header, or have one that doesn't declare a dl_hp_ppa_info_t type,
-+ dnl we conclude it doesn't have that member (which is OK, as either we
-+ dnl won't be using code that would use that member, or we wouldn't
-+ dnl compile in any case).
-+ dnl
-+ AC_DEFUN(AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1,
-+     [AC_MSG_CHECKING(if dl_hp_ppa_info_t struct has dl_module_id_1 member)
-+     AC_CACHE_VAL(ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1,
-+      AC_TRY_COMPILE([
-+ #    include <sys/types.h>
-+ #    include <sys/dlpi.h>
-+ #    include <sys/dlpi_ext.h>],
-+      [u_int i = sizeof(((dl_hp_ppa_info_t *)0)->dl_module_id_1)],
-+      ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=yes,
-+      ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=no))
-+     AC_MSG_RESULT($ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1)
-+     if test $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1 = yes ; then
-+          AC_DEFINE(HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1)
-+     fi])
-+ 
-+ dnl
-  dnl Checks to see if -R is used
-  dnl
-  dnl usage:
-Common subdirectories: ../libpcap-0.4/bpf and ./bpf
-
-diff -c ../libpcap-0.4/configure ./configure
-*** ../libpcap-0.4/configure   Sat Jul 25 12:41:51 1998
---- ./configure        Fri Jan 14 00:40:04 2000
-***************
-*** 1702,1709 ****
-  
-      fi
-  
-  echo $ac_n "checking if unaligned accesses fail""... $ac_c" 1>&6
-! echo "configure:1707: checking if unaligned accesses fail" >&5
-      if eval "test \"`echo '$''{'ac_cv_lbl_unaligned_fail'+set}'`\" = set"; then
-    echo $ac_n "(cached) $ac_c" 1>&6
-  else
---- 1702,1745 ----
-  
-      fi
-  
-+ echo $ac_n "checking if dl_hp_ppa_info_t struct has dl_module_id_1 member""... $ac_c" 1>&6
-+ echo "configure:1707: checking if dl_hp_ppa_info_t struct has dl_module_id_1 member" >&5
-+     if eval "test \"`echo '$''{'ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1'+set}'`\" = set"; then
-+   echo $ac_n "(cached) $ac_c" 1>&6
-+ else
-+   cat > conftest.$ac_ext <<EOF
-+ #line 1712 "configure"
-+ #include "confdefs.h"
-+ 
-+ #    include <sys/types.h>
-+ #    include <sys/dlpi.h>
-+ #    include <sys/dlpi_ext.h>
-+ int main() {
-+ u_int i = sizeof(((dl_hp_ppa_info_t *)0)->dl_module_id_1)
-+ ; return 0; }
-+ EOF
-+ if { (eval echo configure:1722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-+   rm -rf conftest*
-+   ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=yes
-+ else
-+   echo "configure: failed program was:" >&5
-+   cat conftest.$ac_ext >&5
-+   rm -rf conftest*
-+   ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=no
-+ fi
-+ rm -f conftest*
-+ fi
-+ 
-+     echo "$ac_t""$ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1" 1>&6
-+     if test $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1 = yes ; then
-+          cat >> confdefs.h <<\EOF
-+ #define HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 1
-+ EOF
-+ 
-+     fi
-+ 
-  echo $ac_n "checking if unaligned accesses fail""... $ac_c" 1>&6
-! echo "configure:1743: checking if unaligned accesses fail" >&5
-      if eval "test \"`echo '$''{'ac_cv_lbl_unaligned_fail'+set}'`\" = set"; then
-    echo $ac_n "(cached) $ac_c" 1>&6
-  else
-***************
-*** 1799,1805 ****
-  # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-  # ./install, which can be erroneously created by make from ./install.sh.
-  echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-! echo "configure:1803: checking for a BSD compatible install" >&5
-  if test -z "$INSTALL"; then
-  if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-    echo $ac_n "(cached) $ac_c" 1>&6
---- 1835,1841 ----
-  # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-  # ./install, which can be erroneously created by make from ./install.sh.
-  echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-! echo "configure:1839: checking for a BSD compatible install" >&5
-  if test -z "$INSTALL"; then
-  if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-    echo $ac_n "(cached) $ac_c" 1>&6
-
-diff -c ../libpcap-0.4/configure.in ./configure.in
-*** ../libpcap-0.4/configure.in        Sun Jul 27 22:16:22 1997
---- ./configure.in     Tue Jan  4 21:02:13 2000
-***************
-*** 154,159 ****
---- 154,161 ----
-  
-  AC_LBL_SOCKADDR_SA_LEN
-  
-+ AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1
-+ 
-  AC_LBL_UNALIGNED_ACCESS
-  
-  if test "${srcdir}" = "." ; then
-
-diff -c ../libpcap-0.4/pcap-dlpi.c ./pcap-dlpi.c
-*** ../libpcap-0.4/pcap-dlpi.c Wed Oct 15 21:59:34 1997
---- ./pcap-dlpi.c      Wed Apr 26 21:32:33 2000
-***************
-*** 246,255 ****
-       }
-       memset(p, 0, sizeof(*p));
-  
-       /*
-!      ** Determine device and ppa
-       */
-!      cp = strpbrk(device, "0123456789");
-       if (cp == NULL) {
-               sprintf(ebuf, "%s missing unit number", device);
-               goto bad;
---- 246,266 ----
-       }
-       memset(p, 0, sizeof(*p));
-  
-+ #ifdef HAVE_DEV_DLPI
-       /*
-!      ** Remove any "/dev/" on the front of the device.
-       */
-!      cp = strrchr(device, '/');
-!      if (cp == NULL)
-!              cp = device;
-!      else
-!              cp++;
-!      strcpy(dname, cp);
-! 
-!      /*
-!       * Split the name into a device type and a unit number.
-!       */
-!      cp = strpbrk(dname, "0123456789");
-       if (cp == NULL) {
-               sprintf(ebuf, "%s missing unit number", device);
-               goto bad;
-***************
-*** 259,281 ****
-               sprintf(ebuf, "%s bad unit number", device);
-               goto bad;
-       }
-  
-!      if (*device == '/')
-!              strcpy(dname, device);
-!      else
-!              sprintf(dname, "%s/%s", PCAP_DEV_PREFIX, device);
-! #ifdef HAVE_DEV_DLPI
-!      /* Map network device to /dev/dlpi unit */
-       cp = "/dev/dlpi";
-       if ((p->fd = open(cp, O_RDWR)) < 0) {
-               sprintf(ebuf, "%s: %s", cp, pcap_strerror(errno));
-               goto bad;
-       }
-!      /* Map network interface to /dev/dlpi unit */
-       ppa = get_dlpi_ppa(p->fd, dname, ppa, ebuf);
-       if (ppa < 0)
-               goto bad;
-  #else
-       /* Try device without unit number */
-       strcpy(dname2, dname);
-       cp = strchr(dname, *cp);
---- 270,321 ----
-               sprintf(ebuf, "%s bad unit number", device);
-               goto bad;
-       }
-+      *cp = '\0';
-  
-!      /*
-!       * Use "/dev/dlpi" as the device.
-!       *
-!       * XXX - HP's DLPI Programmer's Guide for HP-UX 11.00 says that
-!       * the "dl_mjr_num" field is for the "major number of interface
-!       * driver"; that's the major of "/dev/dlpi" on the system on
-!       * which I tried this, but there may be DLPI devices that
-!       * use a different driver, in which case we may need to
-!       * search "/dev" for the appropriate device with that major
-!       * device number, rather than hardwiring "/dev/dlpi".
-!       */
-       cp = "/dev/dlpi";
-       if ((p->fd = open(cp, O_RDWR)) < 0) {
-               sprintf(ebuf, "%s: %s", cp, pcap_strerror(errno));
-               goto bad;
-       }
-! 
-!      /*
-!       * Get a table of all PPAs for that device, and search that
-!       * table for the specified device type name and unit number.
-!       */
-       ppa = get_dlpi_ppa(p->fd, dname, ppa, ebuf);
-       if (ppa < 0)
-               goto bad;
-  #else
-+      /*
-+      ** Determine device and ppa
-+      */
-+      cp = strpbrk(device, "0123456789");
-+      if (cp == NULL) {
-+              sprintf(ebuf, "%s missing unit number", device);
-+              goto bad;
-+      }
-+      ppa = strtol(cp, &eos, 10);
-+      if (*eos != '\0') {
-+              sprintf(ebuf, "%s bad unit number", device);
-+              goto bad;
-+      }
-+ 
-+      if (*device == '/')
-+              strcpy(dname, device);
-+      else
-+              sprintf(dname, "%s/%s", PCAP_DEV_PREFIX, device);
-+ 
-       /* Try device without unit number */
-       strcpy(dname2, dname);
-       cp = strchr(dname, *cp);
-***************
-*** 391,397 ****
-               break;
-  
-       default:
-!              sprintf(ebuf, "unknown mac type 0x%lu", infop->dl_mac_type);
-               goto bad;
-       }
-  
---- 431,438 ----
-               break;
-  
-       default:
-!              sprintf(ebuf, "unknown mac type 0x%lu",
-!                  (unsigned long)infop->dl_mac_type);
-               goto bad;
-       }
-  
-***************
-*** 709,737 ****
-  
-  #ifdef DL_HP_PPA_ACK_OBS
-  /*
-!  * Under HP-UX 10, we can ask for the ppa
-   */
-  
-  
-! /* Determine ppa number that specifies ifname */
-  static int
-  get_dlpi_ppa(register int fd, register const char *device, register int unit,
-      register char *ebuf)
-  {
-       register dl_hp_ppa_ack_t *ap;
-!      register dl_hp_ppa_info_t *ip;
-       register int i;
-       register u_long majdev;
--      dl_hp_ppa_req_t req;
-       struct stat statbuf;
-       bpf_u_int32 buf[MAXDLBUF];
-  
--      if (stat(device, &statbuf) < 0) {
--              sprintf(ebuf, "stat: %s: %s", device, pcap_strerror(errno));
--              return (-1);
--      }
--      majdev = major(statbuf.st_rdev);
-- 
-       memset((char *)&req, 0, sizeof(req));
-       req.dl_primitive = DL_HP_PPA_REQ;
-  
---- 750,806 ----
-  
-  #ifdef DL_HP_PPA_ACK_OBS
-  /*
-!  * Under HP-UX 10 and HP-UX 11, we can ask for the ppa
-   */
-  
-  
-! /*
-!  * Determine ppa number that specifies ifname.
-!  *
-!  * If the "dl_hp_ppa_info_t" doesn't have a "dl_module_id_1" member,
-!  * the code that's used here is the old code for HP-UX 10.x.
-!  *
-!  * However, HP-UX 10.20, at least, appears to have such a member
-!  * in its "dl_hp_ppa_info_t" structure, so the new code is used.
-!  * The new code didn't work on an old 10.20 system on which Rick
-!  * Jones of HP tried it, but with later patches installed, it
-!  * worked - it appears that the older system had those members but
-!  * didn't put anything in them, so, if the search by name fails, we
-!  * do the old search.
-!  *
-!  * Rick suggests that making sure your system is "up on the latest
-!  * lancommon/DLPI/driver patches" is probably a good idea; it'd fix
-!  * that problem, as well as allowing libpcap to see packets sent
-!  * from the system on which the libpcap application is being run.
-!  * (On 10.20, in addition to getting the latest patches, you need
-!  * to turn the kernel "lanc_outbound_promisc_flag" flag on with ADB;
-!  * a posting to "comp.sys.hp.hpux" at
-!  *
-!  *   http://www.deja.com/[ST_rn=ps]/getdoc.xp?AN=558092266
-!  *
-!  * says that, to see the machine's outgoing traffic, you'd need to
-!  * apply the right patches to your system, and also set that variable
-!  * with:
-!  
-! echo 'lanc_outbound_promisc_flag/W1' | /usr/bin/adb -w /stand/vmunix /dev/kmem
-! 
-!  * which could be put in, for example, "/sbin/init.d/lan".
-!  *
-!  * Setting the variable is not necessary on HP-UX 11.x.
-!  */
-  static int
-  get_dlpi_ppa(register int fd, register const char *device, register int unit,
-      register char *ebuf)
-  {
-       register dl_hp_ppa_ack_t *ap;
-!      register dl_hp_ppa_info_t *ipstart, *ip;
-       register int i;
-+      char dname[100];
-       register u_long majdev;
-       struct stat statbuf;
-+      dl_hp_ppa_req_t req;
-       bpf_u_int32 buf[MAXDLBUF];
-  
-       memset((char *)&req, 0, sizeof(req));
-       req.dl_primitive = DL_HP_PPA_REQ;
-  
-***************
-*** 741,760 ****
-               return (-1);
-  
-       ap = (dl_hp_ppa_ack_t *)buf;
-!      ip = (dl_hp_ppa_info_t *)((u_char *)ap + ap->dl_offset);
-  
-!         for(i = 0; i < ap->dl_count; i++) {
-!                 if (ip->dl_mjr_num == majdev && ip->dl_instance_num == unit)
-!                         break;
-  
-!                 ip = (dl_hp_ppa_info_t *)((u_char *)ip + ip->dl_next_offset);
-!         }
-          if (i == ap->dl_count) {
-!                 sprintf(ebuf, "can't find PPA for %s", device);
-               return (-1);
-          }
-          if (ip->dl_hdw_state == HDW_DEAD) {
-!                 sprintf(ebuf, "%s: hardware state: DOWN\n", device);
-               return (-1);
-          }
-          return ((int)ip->dl_ppa);
---- 810,887 ----
-               return (-1);
-  
-       ap = (dl_hp_ppa_ack_t *)buf;
-!      ipstart = (dl_hp_ppa_info_t *)((u_char *)ap + ap->dl_offset);
-!      ip = ipstart;
-  
-! #ifdef HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1
-!      /*
-!       * The "dl_hp_ppa_info_t" structure has a "dl_module_id_1"
-!       * member that should, in theory, contain the part of the
-!       * name for the device that comes before the unit number,
-!       * and should also have a "dl_module_id_2" member that may
-!       * contain an alternate name (e.g., I think Ethernet devices
-!       * have both "lan", for "lanN", and "snap", for "snapN", with
-!       * the former being for Ethernet packets and the latter being
-!       * for 802.3/802.2 packets).
-!       *
-!       * Search for the device that has the specified name and
-!       * instance number.
-!       */
-!      for (i = 0; i < ap->dl_count; i++) {
-!              if ((strcmp(ip->dl_module_id_1, device) == 0 ||
-!                   strcmp(ip->dl_module_id_2, device) == 0) &&
-!                  ip->dl_instance_num == unit)
-!                      break;
-  
-!              ip = (dl_hp_ppa_info_t *)((u_char *)ipstart + ip->dl_next_offset);
-!      }
-! #else
-!      /*
-!       * We don't have that member, so the search is impossible; make it
-!       * look as if the search failed.
-!       */
-!      i = ap->dl_count;
-! #endif
-! 
-!      if (i == ap->dl_count) {
-!              /*
-!               * Well, we didn't, or can't, find the device by name.
-!               *
-!               * HP-UX 10.20, whilst it has "dl_module_id_1" and
-!               * "dl_module_id_2" fields in the "dl_hp_ppa_info_t",
-!               * doesn't seem to fill them in unless the system is
-!               * at a reasonably up-to-date patch level.
-!               *
-!               * Older HP-UX 10.x systems might not have those fields
-!               * at all.
-!               *
-!               * Therefore, we'll search for the entry with the major
-!               * device number of a device with the name "/dev/<dev><unit>",
-!               * if such a device exists, as the old code did.
-!               */
-!              sprintf(dname, "/dev/%s%d", device, unit);
-!              if (stat(dname, &statbuf) < 0) {
-!                      sprintf(ebuf, "stat: %s: %s", dname, pcap_strerror(errno));
-!                      return (-1);
-!              }
-!              majdev = major(statbuf.st_rdev);
-! 
-!              ip = ipstart;
-! 
-!              for (i = 0; i < ap->dl_count; i++) {
-!                      if (ip->dl_mjr_num == majdev &&
-!                          ip->dl_instance_num == unit)
-!                              break;
-! 
-!                      ip = (dl_hp_ppa_info_t *)((u_char *)ipstart + ip->dl_next_offset);
-!              }
-!      }
-          if (i == ap->dl_count) {
-!                 sprintf(ebuf, "can't find PPA for %s%d", device, unit);
-               return (-1);
-          }
-          if (ip->dl_hdw_state == HDW_DEAD) {
-!                 sprintf(ebuf, "%s%d: hardware state: DOWN\n", device, unit);
-               return (-1);
-          }
-          return ((int)ip->dl_ppa);
-***************
-*** 783,789 ****
-       register int kd;
-       void *addr;
-       struct ifnet ifnet;
-!      char if_name[sizeof(ifnet.if_name)], tifname[32];
-  
-       cp = strrchr(ifname, '/');
-       if (cp != NULL)
---- 910,916 ----
-       register int kd;
-       void *addr;
-       struct ifnet ifnet;
-!      char if_name[sizeof(ifnet.if_name) + 1];
-  
-       cp = strrchr(ifname, '/');
-       if (cp != NULL)
-***************
-*** 811,823 ****
-               if (dlpi_kread(kd, (off_t)addr,
-                   &ifnet, sizeof(ifnet), ebuf) < 0 ||
-                   dlpi_kread(kd, (off_t)ifnet.if_name,
-!                  if_name, sizeof(if_name), ebuf) < 0) {
-                       (void)close(kd);
-                       return (-1);
-               }
-!              sprintf(tifname, "%.*s%d",
-!                  (int)sizeof(if_name), if_name, ifnet.if_unit);
-!              if (strcmp(tifname, ifname) == 0)
-                       return (ifnet.if_index);
-       }
-  
---- 938,949 ----
-               if (dlpi_kread(kd, (off_t)addr,
-                   &ifnet, sizeof(ifnet), ebuf) < 0 ||
-                   dlpi_kread(kd, (off_t)ifnet.if_name,
-!                  if_name, sizeof(ifnet.if_name), ebuf) < 0) {
-                       (void)close(kd);
-                       return (-1);
-               }
-!              if_name[sizeof(ifnet.if_name)] = '\0';
-!              if (strcmp(if_name, ifname) == 0 && ifnet.if_unit == unit)
-                       return (ifnet.if_index);
-       }
-  
+To use this patch, you will need the source to libpcap; if you don't
+already have it, it is available from the Software Porting And Archive
+Centre for HP-UX (see above for its URL).  Search for "libpcap" in the
+"Package Search" box.
+
+The patch would be applied with the "patch" program; if you don't
+already have it, it is also available from the Software Porting And
+Archive Centre for HP-UX.  Search for "patch" in the "Package Search" -
+it will find many packages; look for the one in the "Sysadmin" category
+with the description "Applies diffs to files to reproduce new versions".
+
+If you have downloaded the source to libpcap 0.4 from the Porting and
+Archive Centre, the patch to use is in the file
+
+       libpcap-0.4.HPUX.HPUXPAC.patch
+
+If you have downloaded the source to libpcap 0.4 from the Lawrence
+Berkeley Laboratory Web site, the patch to use is in the file
+
+       libpcap-0.4.HPUX.LBL.patch
+
+If you have downloaded the source to libpcap 0.5 from the tcpdump.org
+Web site, the patch to use is in the file
+
+       libpcap-0.5.HPUX.tcpdump.org.patch
+
+Note that the versions from Lawrence Berkeley Laboratory and tcpdump.org
+will probably not compile on HP-UX with HP's ANSI C compiler, and will
+not build and install a shared library, so patching, building, and
+installing those versions will require that you have GCC installed, and
+that you download the source to Ethereal and build it from source.
+
+You should apply only the patch file appropriate to the particular
+version of libpcap source that you have downloaded; attempting to apply
+a different patch file will probably cause errors.