-$Id: README.hpux,v 1.12 2000/04/29 08:38:35 guy Exp $
+$Id$
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
+5 - HP-UX patches to fix packet capture problems
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
-that it uses.
+(with mirrors in various countries, listed on the Centre's home page;
+you may want to choose a mirror closer to you) has ported versions, in
+both source and binary form, for Ethereal, as well as for the libpcap,
+GLib, GTK+, and zlib libraries that it uses.
The changes they've made appear largely to be compile option changes; if
you've downloaded the source to the latest version of Ethereal (the
-O"; there's a comment "Add -Dhpux_9 if building under 9.X". It may
also build with GCC.
+They currently have libpcap 0.6.2; libpcap 0.6.2, and later versions,
+include changes to properly open network devices when given the name
+reported by the lanscan and ifconfig commands - earlier versions didn't
+do this correctly. Therefore, we strongly suggest you use libpcap 0.6.2
+or later, not libpcap 0.5.2.
+
2 - Building GTK+/GLib with HP's C compiler
By default, HP's C compiler doesn't support "long long int" to provide
3 - nettl support
nettl is used on HP-UX to trace various streams based subsystems. Ethereal
-can read nettl files containing IP frames (NS_LS_IP subsystem) and LAPB
-frames (SX25L2 subsystem).
-It has been tested with files generated on HP-UX 9.04 and 10.20.
+can read nettl files containing raw IP frames (NS_LS_IP, NS_LS_TCP,
+NS_LS_UDP, NS_LS_ICMP subsystems), all ethernet/tokenring/fddi driver
+level frames (such as BTLAN, BASE100, GELAN, IGELAN subsystems) and LAPB
+frames (SX25L2 subsystem). Use "ioscan -kfClan" to see the driver
+names and compare that to /etc/nettlgen.conf to find the nettl subsystem
+name for your particular release.
+
+It has been tested with files generated on HP-UX 9.04, 10.20, and 11.x.
Use the following commands to generate a trace (cf. nettl(1M)):
-# IP capture. 0x30000000 means PDU in and PDU out :
-nettl -tn 0x30000000 -e NS_LS_IP -f tracefile
+# IP capture:
+nettl -tn pduin pduout -e NS_LS_IP -f tracefile
+# Driver level capture. Replace btlan with the name of your interface:
+nettl -tn pduin pduout -e btlan -f tracefile
# X25 capture. You must specify an interface :
-nettl -tn 0x30000000 -e SX25l2 -d /dev/x25_0 -f tracefile
-# stop capture. subsystem is NS_LS_IP or SX25L2 :
+nettl -tn pduin pduout -e SX25l2 -d /dev/x25_0 -f tracefile
+# stop capture. subsystem is NS_LS_IP, btlan, SX25L2 :
nettl -tf -e subsystem
-One may be able to specify "-tn pduin pduout" rather than
-"-tn 0x30000000"; the nettl man page for HP-UX 10.30 implies that it
-should work.
+You may have to use "-tn 0x30000000" instead of "-tn pduin pduout"
+on old versions of 10.20 and 9.04.
-4 - "libpcap" on HP-UX
+4 - libpcap on HP-UX
If you want to use Ethereal to capture packets, you will have to install
-"libpcap"; the INSTALL file for "libpcap" has several comments about
-HP-UX, which you should read if you're going to install and use
-"libpcap" on HP-UX.
+libpcap; binary distributions are, as noted above, available from the
+Software Porting And Archive Centre for HP-UX, as well as source code.
+
+Versions of libpcap prior to 0.6 didn't handle HP-UX as well as 0.6 and
+later versions do. You should install the latest version.
+
+The source code is also available from the official home of libpcap and
+tcpdump, at
+
+ http://www.tcpdump.org/
+
+if you want a version later than the version available from the Software
+Porting And Archive Centre; however, the versions available from
+tcpdump.org might not, for example, include support for building libpcap
+as a shared library.
+
+5 - HP-UX patches to fix packet capture problems
Note that packet-capture programs such as Ethereal/Tethereal or tcpdump
may, on HP-UX, not be able to see packets sent from the machine on which
-they're running. Some articles on Deja.com discussing this are:
+they're running. Make sure you have a recent "LAN Cummulative/DLPI" patch
+installed.
+
+Some articles on groups.google.com discussing this are:
- http://www.deja.com/[ST_rn=ps]/getdoc.xp?AN=558092266
+ http://groups.google.com/groups?selm=82ld3v%2480i%241%40mamenchi.zrz.TU-Berlin.DE
which says:
and
- http://www.deja.com/[ST_rn=ps]/getdoc.xp?AN=586287166
+ http://groups.google.com/groups?selm=88cf4t%24p03%241%40web1.cup.hp.com
which says:
and
- http://www.deja.com/[ST_rn=ps]/getdoc.xp?AN=586494200
+ http://groups.google.com/groups?selm=38AA973E.96BE7DF7%40cc.uit.no
which says:
PHNE_19826, PHNE_20008, PHNE_20735 on the C200 and now I can see the
outbound traffic too. Thanks again.
+(although those patches may not be the ones to install - there may be
+later patches).
+
+And another message to tcpdump-workers@tcpdump.org, from Rick Jones:
+
+ Date: Mon, 29 Apr 2002 15:59:55 -0700
+ From: Rick Jones
+ To: tcpdump-workers@tcpdump.org
+ Subject: Re: [tcpdump-workers] I Can't Capture the Outbound Traffic
+
+ ...
+
+ http://itrc.hp.com/ would be one place to start in a search for the most
+ up-to-date patches for DLPI and the lan driver(s) used on your system (I
+ cannot guess because 9000/800 is too generic - one hs to use the "model"
+ command these days and/or an ioscan command (see manpage) to guess what
+ the drivers (btlan[3456], gelan, etc) might be involved in addition to
+ DLPI.
+
+ Another option is to upgrade to 11i as outbound promiscuous mode support
+ is there in the base OS, no patches required.
+
Another posting:
- http://www.deja.com/[ST_rn=ps]/getdoc.xp?AN=457744130
+ http://groups.google.com/groups?selm=7d6gvn%24b3%241%40ocean.cup.hp.com
indicates that you need to install the optional STREAMS product to do
captures on HP-UX 9.x:
(as per other messages cited here, the ability to see the system's own
outbound traffic did happen).
-Another note, from a mail message to the "ethereal-users" list:
-
- Date: Wed, 22 Dec 1999 09:05:47 -0600 (EST)
- From: Gerald Combs <gerald@zing.org>
- To: Lothar Seitter <lothar.seitter@arcormail.de>
- cc: ethereal-users@zing.org
- Subject: Re: [ethereal-users] permission problem with capturing
-
- On Wed, 22 Dec 1999, Lothar Seitter wrote:
-
- > running 'ethereal' under HP-UX 11 with root permission and
- > /dev/lan0 set to 777, I always get the message:
- > "There are no network interfaces that can be opened.
- > Please to make sure you have sufficient permission to
- > capture packets."
- >
- > I start ethereal with 'etheral -i lan0' and lan0 is definitely
- > the lan interface.
- >
- > What am I missing???
-
- You may need to reference the card's DLPI device directly. We were having
- trouble getting Ethereal to capture on an HP-UX 10.20 machine here. I
- found an article on Deja News that says:
-
- "To access a particular interface, you would say "tcpdump -i /dev/dlpiN"
- where N is the PPA of the interface you wish to use. You get the PPA by
- looking at the output of lanscan. On 10.20, it is the same value as the
- NMID. On 11.X, it is the Card Instance number."
-
- This didn't help in our case, but it might in yours. The full article is
- at http://x34.deja.com/[ST_rn=ps]/getdoc.xp?AN=549366486 .
-
- Another article by the same author mentions that experimental versions of
- libpcap and tcpdump are available at
- ftp://ftp.cup.hp.com/dist/networking/tools/ . The article itself is at
- http://x34.deja.com/[ST_rn=ps]/getdoc.xp?AN=558665378 .
-
-The first of those articles also says:
-
- BTW, before you have to make a follow-up post, you will find that
- unless you have the latest lan common/DLPI/driver patches installed,
- you will _not_ see the system's own outbound traffic.
+Rick Jones reports that HP-UX 11i needs no patches for outbound
+promiscuous mode support.
An additional note, from Jost Martin, for HP-UX 10.20:
/sbin/rc2.d/S350hack_ip_stack pointing to this script.
Now all this is done on every reboot.
+According to Rick Jones, the global promiscuous switch also has to be
+turned on for HP-UX 11.00, but not for 11i - and, in fact, the switch
+doesn't even exist on 11i.
+
Here's the "hack_ip_stack" script:
-----------------------------------Cut Here-------------------------------------
exit $OKAY
-----------------------------------Cut Here-------------------------------------
-
-It appears that a consequence of the fact that HP-UX's DLPI doesn't work
-like Solaris's, in that, on Solaris, to get at the device "hme0", say,
-"libpcap" has to open "/dev/hme" and then tell it to use the 0th
-interface, whilst on HP-UX you have to go through "/dev/dlpi", you won't
-get a list of interfaces in the dialog box for "Capture:Start" - you'll
-have to do through the aforementioned song and dance to find the PPA of
-the interface you want to use, and supply the "dlpiN" name by hand (I
-think you can omit the "/dev/" in both tcpdump and Ethereal).
-
-Here is a patch to "pcap-dlpi.c" in libpcap that, at least on HP-UX
-11.X, allows the name of the network interface, rather than the "dlpiN"
-name, to be specified to tcpdump and Ethereal.
-
-On HP-UX 11.00, the patch allows a network interface to be specified by
-name as an argument to tcpdump, rather than requiring that you specify a
-"dlpiN" name (and it should work equally well with Ethereal).
-
-If you try this code on HP-UX 10.20, and it doesn't let you specify the
-interface by name, please send mail to ethereal-dev@zing.org, so that we
-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);
- }
-