[Click] [PATCH]: real tcp for click

Harald Schiöberg harald at net.t-labs.tu-berlin.de
Tue Jul 8 11:47:14 EDT 2008


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

Hi all,

I started to port the BSD-tcp stack to click. (4.4BSD-lite)

you can fetch my tree from
 git clone http://www.net.t-labs.tu-berlin.de/~harald/git/click

(build with --enable-local)

It is at a very early stage!

This is the intended mode of operation (with UDP as an example):


     *Statefull Side*                       *Stateless Side*

FromDev ->               |0         1| -> TCPtoUDP -> Checksum -> ToDev
                         | TCPSpeaker|
ToDev   <- Checksums <-  |0         1| <- UDPtoTCP <-           FromDev


TCPSpeaker accepts all incoming tcp-connections, does the handshakes,
reorders and retransmits the packets on the statefull side
It outputs in-order data-only packets.

Same is true on the reverse direction:
It accepts in-order data-only packets (seq-nr and flags are ignored)
It establishes a connection and transmits the data, caring for
congestion control, rec-windows ...


Current status (probably incomplete list):
* Seems to work on first glance.
* Seems to handle delay/loss ok.
* Seems to handle windows ok.
* MSS support mostly broken (fixed hard at 1400 bytes)
* Window scaling works
* Timestamp works
* SACK not implemented/not planned.
* drops packets silently if flooded from stateless side.
* No read-handlers for the statistics yet.
* documentation is non-existent
* compiles with zillions of warnings
* Can only handle one connection at a time, but prepared for more.
* lots of stupid variable names need refactoring
* lots of noisy debug output that cannot be switched off

I have several question on how to fix some of these points, I'll send a
separate mail.

here is my example test script:

**snip tcptest.click**

tun0 :: KernelTun (10.0.0.1/24);
tun0q :: Queue -> tun0;
ip_out_0 :: SetIPChecksum ( ) -> tun0q;

tun1 :: KernelTun (10.0.1.1/24) ;

tcps1:: TCPSpeaker(FLAGS 257);

tun0
    -> Queue
    -> DelayUnqueue(1000ms)
//    -> RandomSample(DROP 0.02)
    -> IPPrint(to[0], PAYLOAD ASCII)
    -> tcps1 ;


tcps1[0]
//    -> IPPrint(from[0], PAYLOAD ASCII )
    -> IPPrint(from[0])
    -> SetTCPChecksum ()
    -> Queue
    -> DelayUnqueue(1000ms)
//    -> RandomSample(DROP 0.02)
    -> ip_out_0;

tcps1[1]
    -> IPPrint(direct-from[1])
    -> TCPtoUDP ()
    -> StoreIPAddress(10.0.1.2, 12)
    -> StoreIPAddress(10.0.1.1, 16)
    -> SetUDPChecksum()
    -> SetIPChecksum()
    -> IPPrint(from[1])
    -> tun1 ;
**snip**

with this config, run in two seperate shells:

version a: (tcp establishes connection)
nc 10.0.0.2 5000
nc -l -u -p 5000

version b: (udp starts connection)
nc 10.0.1.2 5000
nc -l -p 5000

type something in the first shell (the one without -l :)
then type something on either side :)

- -
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

iD8DBQFIc4wBJgyxs71kcx4RAkD7AKCX1MOCaV+rfXvtbEMWOPNAIsFrNgCg44Y+
Tg80Z1HMeF/mL9nTUy9yCFQ=
=c+aI
-----END PGP SIGNATURE-----



More information about the click mailing list