(Blah blah blah wrong From: address bounce blah blah blah fool the duplicate message detector into not bouncing this retransmission from the right address blah blah blah.)

On Sep 6, 2005, at 1:45 AM, fanci wrote:

So, libpcap is passing "0" for the "sap" parameter to invoke a DLPI_BIND_REQ. The user has no way to specify this parameter. Yet this parameter is significant.

It shouldn't be significant on Solaris. If it is, that's a bug - probably a driver bug.

A DLPI tutorial article (found at http://sunsite.bilkent.edu.tr/pub/ sun-info/sun-faq/Docs/snit-to-dlpi.txt) explains the "sap" parameter as follows:

And the Solaris 10 GLD(7) man page explains the DLIOCRAW ioctl, which libpcap does, as follows:

The DLIOCRAW ioctl function is used by some DLPI applications, most notably the snoop(1M) command. The DLIOCRAW command puts the stream into a raw mode, which, upon receive, causes the the full MAC-level packet to be sent upstream in an M_DATA message instead of it being transformed into the DL_UNITDATA_IND form normally used for reporting incoming packets. Packet SAP filtering is still performed on streams that are in raw mode; if a stream user wants to receive all incoming packets it must also select the appropriate promiscuous modes. After successfully selecting raw mode, the application is also allowed to send fully formatted packets to the driver as M_DATA messages for transmission. DLIOCRAW takes no arguments. Once enabled, the stream remains in this mode until closed.

and the DLPI tutorial says of DLIOCRAW:

One feature which is not included in the USL DLPI Version 2 specification but is frequently necessary for several types of applications is "raw" mode. Support for this mode has been added to SunOS 5.x. The user enables raw mode by issuing the DLIOCRAW ioctl, which is defined in the version of dlpi.h shipped with SunOS 5.x. After this, "raw" Ethernet frames which include the 14-byte Ethernet header may be sent downstream in M_DATA type messages, and all received frames will be sent upstream with Ethernet header included in M_DATA type messages.

If, in any driver, the SAP parameter has any effect whatsoever on the Ethernet type field of a frame being transmitted in DLIOCRAW mode, I'd say that driver had a bug. In DLIOCRAW mode, the driver should just take the packet supplied to it and transmit it, without modifying anything in the packet, *including* any part of the MAC header (i.e., it shouldn't modify the destination address, the source address, or the type/length field).

Whatever the cause, after I hard-coded 88-8e for the sap parameter, recompiled libpcap, and relinked my program, everything worked. tcpdump displays 88-8e in the etherneet-type field, rather than the previous 00-00.

You should complain to Broadcom about this.

Your workaround (setting the SAP) works for applications that send *only* packets with the specified Ethernet type; however, libpcap's pcap_inject() and pcap_sendpacket() routines are intended to support sending arbitrary packets, regardless of Ethernet type, and the workaround won't work for them.

Conclusion: libpcap might consider adding some method to enable the user specify the SAP field upon construction of a pcap_t.

An option to let a link-layer packet type be specified would provide a workaround for this problem, and might also allow libpcap to use the native OS's non-BPF-style mechanisms, if present, to filter out packets of protocols the application isn't interested in; those mechanisms might be more efficient. As such, I'll consider adding such a mechanism in the next major release of libpcap.

However, as noted, there are applications where such a feature wouldn't help, so, even with such an option, broken drivers such as the Broadcom one still need to be fixed.

At least, the libpcap manpage should inform the developer about its default parameter 0 for dlpi-sap,

Or, rather, it should note that there might be OSes, and drivers, that don't support sending raw link-layer packets, and cite that as an example.


-
This is the tcpdump-workers list.
Visit https://lists.sandelman.ca/ to unsubscribe.

Reply via email to