Re: rtentry and rtrequest



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"



Relevant Pages

  • Re: rtentry and rtrequest
    ... an interface w/o IFF_BROADCAST, as it utilizes broadcasts. ... IFF_BROADCAST just means that the interface has a broadcast address, ... jnet0: jnet_start_lockedcalled. ...
    (freebsd-net)
  • Re: rtentry and rtrequest
    ... queue and my handling of the de-queueing packets. ... Please try fixing the interface flags. ... Note that jnet0 has no broadcast address. ...
    (freebsd-net)
  • Re: Help! "Martian" (packet) invasion via FiOS cablemodem
    ... The wording in "TCP/IP Blueprints" suggests that broadcast packet ... interface internal to cable modem, it's a device talking _to_ it. ... from Verizon or the Internet). ... If the packets annoy you, use iptables to quietly drop (all from ...
    (comp.os.linux.networking)
  • Re: Different behavior of pinging INADDR_BROADCAST?
    ... interface that is specified via its broadcast address. ... taking "local hardware network" to be the specific interface that is to be ... And a patch for 'ping' should be applied ...
    (freebsd-net)
  • Re: Do UDP broadcasts work in FreeBSD?
    ... sending a UDP packet to 255.255.255.255 will actually cause a packet with that destination to be generated from all network interfaces which are "UP". ... On FreeBSD, IIRC, the behavior you get is that it will send to the local network broadcast address for each interface using the network broadcast address. ...
    (freebsd-questions)