On Jun 7, 2005, at 4:56 PM, Matthew Luckie wrote:
Agreed. When you use BPF or PCAP to capture packets, for the DTL_NULL case there is a 4-byte offset between where PCAP says the packet starts and where the actual raw IP packet starts. If you want BPF/PCAP to return packets without the 4-byte offset, the associated datalink type is actually called DLT_RAW. Note that the behavior of DLT_NULL is useful in practice, since you can find out what the "ether type" of the packet was per <net/ ethernet.h>:

unless i'm mistaken, the 4 byte field is actually the address family of the packet. so AF_INET, AF_INET6, etc. the ethertype thing is for DLT_EN10MB devices.

If you're trying to write traffic using socket(), sure, you might very well specify AF_INET as the first argument (domain), but the machine doesn't actually put the value of the address family into the link-level header of the packet that goes out across the wire.

I agree that the ethertype thing is supposed to be for ethernet-style devices, but try sending some traffic over lo0, and capture it, and take a look at the first four bytes. Maybe I'm confused, but I remember seeing 0x0800 and 0x86dd, respectively, not 0x2 (AF_INET) or 30 (AF_INET6).

When writing packets, I found that even using SOCK_RAW the kernel would fill in a lot of stuff that I didn't want it to, and instead I needed to talk with BPF directly or use something like libnet to build the packets. I am pretty sure this is why the ISC DHCP software depends on BPF, because it can't generate ARPOP_REQUESTS and so forth using the normal socket mechanisms to query whether an IP addr is in use...?

--
-Chuck

_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to