/* saddr == NULL means use device source address. daddr == NULL means leave destination address (eg unresolved arp).  */
static int fwnet_header_create(struct sk_buff *skb, struct net_device *net, unsigned short type, const void *daddr, const void *saddr, unsigned len)
/* saddr == NULL means use device source address. daddr == NULL means leave destination address (eg unresolved arp).  */
static int fwnet_header_create(struct sk_buff *skb, struct net_device *net, unsigned short type, const void *daddr, const void *saddr, unsigned len)
{
	struct fwnet_header *h;
	h = (struct fwnet_header *)skb_push(skb, sizeof(*h));
	put_unaligned_be16(type, &h->h_proto);
	if (net->flags & (IFF_LOOPBACK | IFF_NOARP)) {
		memset(h->h_dest, 0, net->addr_len);
		return net->hard_header_len;
	}
	if (daddr) {
		memcpy(h->h_dest, daddr, net->addr_len);
		return net->hard_header_len;
	}
	return -net->hard_header_len;
}