[Click] [PATCH] EtherAddress needs packing

Harald Schiöberg harald at net.t-labs.tu-berlin.de
Wed Feb 18 14:14:10 EST 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Eddie Kohler wrote:
> Hi Harald,
> 
> On which machine is sizeof(EtherAddress) not 6?  Just curious what
> problem this is solving.
> 

this is the compiler:
armeb-linux-g++ -pipe -march=armv5te -mtune=xscale -funit-at-a-time -O2 -g3

The elements of "uint16_t[3] _data" seem to end up 32-bit aligned.

here is a bit more detail:

test config at the bottom of the mail (basically a
ICMPPingResponder/ARPResponder duo)

this is the result when pinging the host:

01:10:28.822327 00:40:48:b2:3a:c7 > 00:d0:12:09:89:42, ethertype IPv4
(0x0800), length 98: 172.17.2.12 > 172.17.2.203: ICMP echo request, id
31529, seq 1, length 64
01:10:28.823319 00:d0:12:09:89:42 > 48:b2:12:09:3a:c7, ethertype IPv4
(0x0800), length 98: 172.17.2.203 > 172.17.2.12: ICMP echo reply, id
31529, seq 1, length 64

note the src-mac of the echo req. and the dst-mac of the reply, you see
that the reply contains bytes [3][4][garbage][garbage[5][6] of the mac
address.

It all seems to break in arptable.hh:188:

 *eth = it->_eth;

(*eth points to the dst_mac field in the packet, "it->_eth" is the
EtherAddress that was just looked up in the table)

but that's rather hard to tell since the bug only occurs at -O2 which
means this piece of code is inlined, and giving a hard time to the
debugger.

- ---snip click configuration ---
ControlSocket(TCP, 9200);
AddressInfo(eth0 172.17.2.203/24);

elementclass IPDevice {

$device |
        td :: Queue -> ToDevice($device);

        FromDevice($device, SNIFFER true) ->

        cl :: Classifier(12/0806 20/0001, 12/0806 20/0002, 3/ffffff,
12/0800 30/AC1102CB);
        cl[1] -> [1]aq :: ARPQuerier($device, $device)  -> td;

        input[0] -> [0] aq;

        cl[0] -> ARPResponder($device:ip $device) -> td;

        cl[2] -> [1]output;

        cl[3] -> Strip(14) -> CheckIPHeader -> IPPrint (ip-in) -> [0]output;
        input[1] -> td;
}

wired_if :: IPDevice (eth0);

wired_if[0] -> ICMPPingResponder -> SetIPChecksum -> [0]wired_if ;

Idle -> [1]wired_if[1] ->  Discard;

- --
Harald Schiöberg
Technische Universität Berlin | T-Laboratories | FG INET
www: http://www.net.t-labs.tu-berlin.de
Phone: +49-(0)30-8353-58476 | Fax: +49-(0)391 534 783 47
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFJnF4Cy8wrZ9OvkU0RAnb0AKCOTzPuuMhuopEiY1V2cDDbKMjbGQCgtp4B
SrMDutFwIwDSiNo/dIxihAY=
=TvH8
-----END PGP SIGNATURE-----



More information about the click mailing list