Re: rtentry and rtrequest
- From: Yar Tikhiy <yar@xxxxxxxxxxxxxxxx>
- Date: Thu, 19 Apr 2007 13:38:47 +0400
On Thu, Apr 19, 2007 at 06:54:23PM +1000, Alan Garfield wrote:
On Thu, 2007-04-19 at 11:35 +0400, Yar Tikhiy wrote:
... and I get these ARP errors.
----
jnet0: <JNet Ethernet System Interface> port 0xa8,0xae-0xaf irq 19 on
acpi0
jnet0: Ethernet address: 00:09:3d:00:00:03
jnet0: jnet_start_locked() called.
jnet0: m == 0.
jnet0: RTM_ADD.
arplookup 169.254.101.2 failed: could not allocate llinfo
arpresolve: can't allocate route for 169.254.101.2
----
... whenever I try and send anything.
Did you set the maximum lengths for the output queue and the driver
queue in the attach function?
----
// Configure the structure for the device
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
// Function pointers
ifp->if_start = jnet_start;
ifp->if_ioctl = jnet_ioctl;
ifp->if_watchdog = jnet_watchdog;
ifp->if_init = jnet_init;
// Interface specifics
ifp->if_flags = IFF_SIMPLEX;
Try setting those flags to
IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST
I have no direct evidence, but ARP may have trouble operating on
an interface w/o IFF_BROADCAST, as it utilizes broadcasts. Essentially,
IFF_BROADCAST just means that the interface has a broadcast address,
but there may be some indirect consequences via the routing table.
Anyway, an Ethernet interface ought to have IFF_BROADCAST set on
it because it's a broadcast interface.
IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
IFQ_SET_READY(&ifp->if_snd);
ifp->if_timer = MAX_TIMEOUT;
// Set our fake MAC address
bcopy(localMac, sc->enaddr, 6);
Just a style note: the 6 should be ETHER_ADDR_LEN. We prefer
ETHER_ADDR_LEN to sizeof(...) because sizeof returns size_t, while
an int is sometimes needed. (int and size_t have different width
on 64-bit architectures.) ETHER_ADDR_LEN expands to the constant
6, which gets the correct type provided that the function has been
prototyped.
// Attach the ethernet interface
ether_ifattach(ifp, sc->enaddr);
// Reset the mtu
ifp->if_mtu = JNET_MTU;
----
I think so. :)
I beginning to think the ARP issue is a symptom not the cause. The cause
may well be something is wrong with my initialisation of the output
queue and my handling of the de-queueing packets. I've looked at many
if_* drivers sources and they all seem very similar to what I've already
done.
Please try fixing the interface flags.
Could you also show output from "ifconfig jnetX" and "netstat -rn"
after the interface has been configured (i.e., had IP assigned)?
P.S. Was the name "jnet" inherited from the Linux driver?
--
Yar
_______________________________________________
freebsd-net@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscribe@xxxxxxxxxxx"
- Follow-Ups:
- Re: rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- References:
- rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- From: Alan Garfield
- rtentry and rtrequest
- Prev by Date: Re: rtentry and rtrequest
- Next by Date: Re: rtentry and rtrequest
- Previous by thread: Re: rtentry and rtrequest
- Next by thread: Re: rtentry and rtrequest
- Index(es):
Relevant Pages
|