On Jun 30, 2010, at 3:10 PM, Darren Reed wrote:
> Linux has defined a large number of values for dummy ARP
> header types (<net/if_arp.h>) that are not present in the
> official IANA listing. See the hardware type table here:
>
> http://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml
>
> and compare it with the list found in pcap-linux.c.
>
> One of my current goals is to get pcap-linux.c to compile
> and function on Solaris using PF_PACKET in Solaris and
> after internal discussion, we're not entirely keen on
> defining all of the extra symbols found on Linux given
> that they have no actual basis.
>
> The attached diff introduces complimentary #ifdef's for
> all of the Linux extras, of which there is already some
> present. This should also make pcap-linux.c friendlier
> to all Linuxes.
The patch adds backup definitions for:
ARPHRD_PPP
ARPHRD_CSLIP
ARPHRD_SLIP6
ARPHRD_CSLIP6
ARPHRD_ADAPT
ARPHRD_SLIP
ARPHRD_LOCALTLK
All of those are defined by the if_arp.h in the 2.0 kernel, so the only Linuxes
to which the patch would make pcap-linux.c friendlier are
1) Linux 1.x kernels, which I don't think we even try to support;
2) Linux kernels that have gratuitiously removed ARPHRD_ definitions,
which I'm not inclined to try to support.
If the goal is to, for some reason, support PF_PACKET in Solaris (given that we
already support both DLPI and Solaris's BPF, I'm not sure why PF_PACKET support
is useful, but...), I'd be inclined to, instead, just wrap the cases in
question with an #ifdef for the case label - if Solaris isn't going to return
ARPHRD_PPP (even for PPP devices?), there's no point in checking for it.
Going back to the 2.0 kernel, of the
> btw, the above table also suggests that the Linux
> handling of type 15, frame relay, is incorrect.
Unfortunately, there's no guarantee that, for a given ARPHRD_ type (whether
it's an IANA-assigned ARP type or a dummy), if you try to capture "raw" packets
(PF_PACKET/SOCK_RAW), you will get any link-layer header, much less a
link-layer header appropriate to the link-layer type. That's not the case for
ARPHRD_PPP, or at least wasn't the case a while ago, which is why ARPHRD_PPP
gets captured in cooked mode (PF_PACKET/SOCK_DGRAM) - that means that you get a
link-layer type value, which you don't get with PF_PACKET/SOCK_RAW.
That's why there's the comment
/*
* XXX - should some of those be mapped to DLT_LINUX_SLL
* instead? Should we just map all of them to DLT_LINUX_SLL?
*/
in the cases for ARPHRD_RAWHDLC and ARPHRD_DLCI. The current handling of
ARPHRD_DLCI (and ARPHRD_FRAD) comes from a patch submitted by Krzysztof Halasa
back in 2003; when I asked him about it, he replied
> Guy Harris <[email protected]> writes:
>
>> Do ARPHRD_DLCI devices supply a useful link-layer header (from which the
>> protocol running atop Frame Relay can be determined), or not?
>
> No. It's a virtual device and FR headers are added/removed by underlying
> physical device code.
so, for better or worse, it sounds as if ARPHRD_DLCI should be mapped either to
DLT_RAW (i.e., all packets are IP, and the packet data begins with an IP
header) or DLT_LINUX_SLL (i.e., not all packets are IP, so capture in cooked
mode and put the cooked-mode header on the packets).
Perhaps they shouldn't have used 15 as the ARPHRD_ value for that, but that's
water over the bridge; some parts of the Linux kernel use some of the ARPHRD_
values as ARP hardware types, but it's probably best, when dealing with
PF_PACKET sockets, to think of them as link-layer header types, some of which
happen to have the same values as the ARP hardware types for the corresponding
link layer.-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.