Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Apr 2007 15:38:42 +0400
From:      Yar Tikhiy <yar@comp.chem.msu.su>
To:        Alan Garfield <alan@fromorbit.com>
Cc:        freebsd-net@freebsd.org
Subject:   Re: rtentry and rtrequest
Message-ID:  <20070419113842.GE60301@comp.chem.msu.su>
In-Reply-To: <1176976273.4177.17.camel@hiro.auspc.com.au>
References:  <1176861009.4426.21.camel@hiro.auspc.com.au> <20070418120622.GF40826@comp.chem.msu.su> <1176947814.4175.39.camel@hiro.auspc.com.au> <20070419073525.GA60301@comp.chem.msu.su> <1176972863.4177.7.camel@hiro.auspc.com.au> <20070419093847.GC60301@comp.chem.msu.su> <1176976273.4177.17.camel@hiro.auspc.com.au>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Apr 19, 2007 at 07:51:13PM +1000, Alan Garfield wrote:
[...]
> 
> > > 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)?
> 
> ----
> [alan@twofish jnet_pci]$ ifconfig
> bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>         options=1b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING>
>         inet 192.168.1.42 netmask 0xffffff00 broadcast 192.168.1.255
>         ether 00:09:3d:13:21:6a
>         media: Ethernet autoselect (1000baseTX <full-duplex>)
>         status: active
> bge1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
>         options=1b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING>
>         ether 00:09:3d:13:21:6b
>         media: Ethernet autoselect (1000baseTX <full-duplex>)
>         status: active
> lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
>         inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
>         inet6 ::1 prefixlen 128 
>         inet 127.0.0.1 netmask 0xff000000 
> jnet0: flags=845<UP,DEBUG,RUNNING,SIMPLEX> mtu 241
>         inet 169.254.101.3 netmask 0xffff0000 
>         ether 00:09:3d:00:00:03

Note that jnet0 has no broadcast address.  That should be wrong for
an Ethernet interface.  (Honestly, I'm still uncertain whether it is
legal at all for an interface to have none of the following flags:
BROADCAST, POINTOPOINT, LOOPBACK.)

> ----
> [alan@twofish jnet_pci]$ netstat -rn
> Routing tables
> 
> Internet:
> Destination        Gateway            Flags    Refs      Use  Netif
> Expire
> default            192.168.1.1        UGS         0      192   bge0
> 127.0.0.1          127.0.0.1          UH          0        0    lo0
> 169.254            link#4             UC          0        0  jnet0
^^^^^^^^^
This record is there.  Good...  Note the C (cloning) flag.
Individual ARP records will be "cloned" from this one via
the rtresolve mechanism.

> 192.168.1          link#1             UC          0        0   bge0
> 192.168.1.1        00:17:95:ba:b8:a6  UHLW        2        0   bge0
> 37
> 192.168.1.8        00:04:76:3b:0a:57  UHLW        1       45   bge0
> 1199
> 192.168.1.99       00:15:58:2d:85:c7  UHLW        2    12188   bge0
> 1172
> 
> Internet6:
> Destination                       Gateway                       Flags
> Netif Expire
> ::1                               ::1                           UHL
> lo0
> fe80::%lo0/64                     fe80::1%lo0                   U
> lo0
> fe80::1%lo0                       link#3                        UHL
> lo0
> ff01:3::/32                       fe80::1%lo0                   UC
> lo0
> ff02::%lo0/32                     fe80::1%lo0                   UC
> lo0
> ----
> 
> 
> I think I've made a little break through! I've removed :-
> 
> ----
>         case SIOCSIFADDR: 
>                 ifp->if_flags |= IFF_UP;
>                 ifa = (struct ifaddr *)data;
>                 if (ifa != 0)
>                         ifa->ifa_rtrequest = jnet_rtrequest;
>                 break;
> ----
> 
> .... and now it seems like I'm actually getting mbuf's and no more 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: jnet_start_locked() called.
> jnet0: mbuf len: 42.
> jnet0: packets buffered, but tx idle.
> jnet0: TX called
> jnet0: m == 0.
> jnet0: jnet_start_locked() called.
> jnet0: packets buffered, but tx idle.
> jnet0: TX called
> jnet0: mbuf len: 42.
> jnet0: packets buffered, but tx idle.
> jnet0: TX called
> jnet0: m == 0.
> ----
> 
> So what did I do?!? Was my rtrequest function stuffing everything up,
> all it did was set the rt MTU and return.

In fact, you were overriding the normal ARP's arp_rtrequest() handler
for the addresses.  Grep /sys/netinet/if_ether.c for ifa_rtrequest.
See also rtentry(9) (again, search for ifa_rtrequest).  That's why nothing
worked.

> My tx just consumes the packets at the moment, I've not written the
> buffer writing code yet. I'll do that now and see if packets move. :)
> 
> > P.S. Was the name "jnet" inherited from the Linux driver?
> 
> Yeah it's what the Linux driver is called. Can be something else, got a
> better name? :)

Perhaps just "jn"?  Some utilities still have trouble with long
interface names[1], and they are a drag to type in. :-)  So I'd
rather keep the name as short as possible.

-- 
Yar



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070419113842.GE60301>