Ough, it is real BUG. I wonder, why nobody saw it until now.
Alexey Kuznetsov.
linux/net/ipv4/ip_ouptut.c
else if (dev->hard_header)
{
if(dev->hard_header(skb, dev, ETH_P_IP,
NULL, NULL, 0)>0)
skb->arp=1;
}
+ else
+ skb->arp = 1;
/*
* Find where to start putting bytes.