[Gd-chatter] r10921 - trunk/libraries/layer
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Fri Oct 6 23:11:48 CEST 2006
Author: hannes
Date: Fri Oct 6 23:11:47 2006
New Revision: 10921
Modified:
trunk/libraries/layer/tcp.dylan
Log:
Bug: 7299
*more fixes
Modified: trunk/libraries/layer/tcp.dylan
==============================================================================
--- trunk/libraries/layer/tcp.dylan (original)
+++ trunk/libraries/layer/tcp.dylan Fri Oct 6 23:11:47 2006
@@ -98,8 +98,8 @@
#key ack, fin, rst, syn, urg, psh, data)
let payload = make(<stretchy-byte-vector-subsequence>);
if (data & instance?(conn.state, <established>))
- for (i from 0 below min(conn.tcp-window-size, conn.send-buffer.size))
- payload[i] := pop(conn.send-buffer);
+ for (i from 0 below min(conn.tcp-window-size, data.size))
+ payload[i] := data[i];
end;
end;
let tcp-frame = make(<tcp-frame>,
@@ -153,37 +153,46 @@
write-element(tcp-connection, as(<byte>, data));
end;
+define method write (tcp-connection :: <tcp-connection>, data :: <string>)
+ write(tcp-connection, map-as(<vector>, curry(as, <byte>), data));
+end;
+
define method write (tcp-connection :: <tcp-connection>, data :: <sequence>)
do(curry(write-element, tcp-connection), data);
- send-via-tcp(tcp-connection, data: #t, ack: #t);
+ send-via-tcp(tcp-connection, data: data, ack: #t);
end;
define method process-data (connection :: <tcp-connection>, packet :: <tcp-frame>)
- if (packet.syn = 1)
- connection.tcp-acknowledgement-number := $transform-from-bv(packet.sequence-number) + 1;
- if (packet.ack = 1)
- syn-ack-received(connection);
+ if ((connection.tcp-acknowledgement-number = 0) | ($transform-from-bv(packet.sequence-number) = connection.tcp-acknowledgement-number))
+ if (packet.syn = 1)
+ connection.tcp-acknowledgement-number := $transform-from-bv(packet.sequence-number) + 1;
+ if (packet.ack = 1)
+ syn-ack-received(connection);
+ else
+ syn-received(connection);
+ end;
+ elseif (packet.fin = 1)
+ connection.tcp-acknowledgement-number := connection.tcp-acknowledgement-number + 1;
+ if (packet.ack = 1)
+ fin-ack-received(connection);
+ else
+ fin-received(connection);
+ end;
+ elseif (packet.ack = 1)
+ connection.tcp-window-size := packet.window;
+ for (i from connection.tcp-sequence-number - connection.send-buffer.size below $transform-from-bv(packet.acknowledgement-number))
+ pop(connection.send-buffer);
+ end;
+ connection.tcp-acknowledgement-number := connection.tcp-acknowledgement-number + byte-offset(frame-size(packet.payload));
+ ack-received(connection);
+ elseif (packet.rst = 1)
+ rst-received(connection);
else
- syn-received(connection);
+ format-out("Unknown flag combination\n");
end;
- elseif (packet.fin = 1)
- connection.tcp-acknowledgement-number := connection.tcp-acknowledgement-number + 1;
- if (packet.ack = 1)
- fin-ack-received(connection);
- else
- fin-received(connection);
+ if (instance?(connection.state, <established>))
+ do(curry(push-last, connection.receive-buffer), packet.payload.data)
end;
- elseif (packet.ack = 1)
- connection.tcp-window-size := packet.window;
- connection.tcp-acknowledgement-number := connection.tcp-acknowledgement-number + byte-offset(frame-size(packet.payload));
- ack-received(connection);
- elseif (packet.rst = 1)
- rst-received(connection);
- else
- format-out("Unknown flag combination\n");
- end;
- if (instance?(connection.state, <established>))
- do(curry(push-last, connection.receive-buffer), packet.payload.data)
end;
end;
More information about the chatter
mailing list