diff options
Diffstat (limited to 'README.hpux')
-rw-r--r-- | README.hpux | 563 |
1 files changed, 47 insertions, 516 deletions
diff --git a/README.hpux b/README.hpux index 28a22c04b6..51110805d5 100644 --- a/README.hpux +++ b/README.hpux @@ -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. |