On Tue, Dec 24, 2002 at 09:58:19PM +0100, Aurelien Nephtali wrote: > Hi, > > I think I've found a bug in the BPF stack (if I can call it a stack :p). > According to the bpf man, packets can be written directly through a bpf file > descriptor. But writing IP packets using write() doesn't seem to work, the > "ip_len" field of the ip header isn't sent in host byte order so the packet is > discarded by the remote host since the len of the packet doesn't match the > length of the data captured... > BSD is known to have a strange behaviour with the "ip_len" field, returning > EINVAL when this field is htons()'ized and passed to functions like write(), > send(), etc... and of course, writing of a BPF fd using write() doesn't > break this "rule". :/ > > But, strangely, as writing with write() doesn't work, writing with writev() > seems to work (?!). That's why "dhclient" works fine _EVEN_ if it htons() > "ip_len" field of his IP packets! > > Attached are two patches, one against bpf.c (kernel) and the other against > packet.c (dhclient). > These patches are ugly and you can (at least you are encouraged to :p) modify > them or tell me what is good or not with them. They're only here to try to > illustrate what I'm trying to explain :) > > For the BPF patch, I don't know if the test > if (dst.sa_family == AF_UNSPEC) > is correct ... but it seems to work and I wonder why sa_family isn't AF_INET... > > BTW, -STABLE/-RELEASE is also *affected* and I think the patch for bpf.c can > also be applied against -STABLE, I've checked, bpf.c from -STABLE and the one > from -CURRENT are the same. > > Hope I was clear even if my english isn't as good as it should be :) > I plan to put this into a PR but I want some comments to be sure that's not > a "desired" feature. > > -- Aurelien
Hum ... the previous patch against bpf.c was the result of multiple test, thus it was _VERY_ ugly with useless lines of code... now the new one is cleaner :) (it's just aesthetic modifications but ... better for the eyes :p) -- Aurelien
msg49296/pgp00000.pgp
Description: PGP signature