[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