[Gd-chatter] r11453 - trunk/libraries/protocols
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Sat Sep 15 20:50:33 CEST 2007
Author: hannes
Date: Sat Sep 15 20:50:32 2007
New Revision: 11453
Modified:
trunk/libraries/protocols/dns.dylan
trunk/libraries/protocols/tcp.dylan
Log:
Job: 7299
some cleanup in tcp (line break)
implement assemble-frame-into for dns (not yet tested)
Modified: trunk/libraries/protocols/dns.dylan
==============================================================================
--- trunk/libraries/protocols/dns.dylan (original)
+++ trunk/libraries/protocols/dns.dylan Sat Sep 15 20:50:32 2007
@@ -2,7 +2,20 @@
Author: Andreas Bogk, Hannes Mehnert
Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
-define protocol dns-frame (container-frame)
+define abstract class <container-frame-with-metadata> (<container-frame>)
+ constant slot index-table :: <table> = make(<table>);
+ constant slot symbol-table :: <string-table> = make(<string-table>);
+end;
+
+define abstract class <decoded-container-frame-with-metadata>
+ (<container-frame-with-metadata>, <decoded-container-frame>)
+end;
+
+define abstract class <unparsed-container-frame-with-metadata>
+ (<container-frame-with-metadata>, <unparsed-container-frame>)
+end;
+
+define protocol dns-frame (container-frame-with-metadata)
over <udp-frame> 53;
summary "DNS ID=%=, %= questions, %= answers",
identifier, question-count, answer-count;
@@ -33,6 +46,28 @@
count: frame.additional-count;
end;
+define method assemble-frame-into
+ (frame :: <domain-name>, packet :: <stretchy-byte-vector-subsequence>)
+ => (res :: <integer>)
+ //assumption: frame.parent.parent is the <dns-frame>!
+ let name-table = frame.parent.parent.symbol-table;
+ let offset = 0;
+ local method encode-fragments (frags :: <collection>) => (res :: <integer>)
+ let strings = map(curry(as, <string>), frags);
+ let name = reduce1(method(a, b) concatenate(a, ".", b) end, strings);
+ let offset = element(name-table, name, default: #f);
+ if (offset)
+ assemble-frame-into(make(<label-offset>, offset: offset), packet);
+ else
+ name-table[name] := packet.start-index + offset;
+ offset := offset + assemble-frame-into(frags[0], packet);
+ encode-fragments(subsequence(frags, start: 1));
+ end;
+ end;
+ encode-fragments(frame.fragment);
+ offset;
+end;
+
define protocol domain-name (container-frame)
summary "%s", curry(as, <string>);
repeated field fragment :: <domain-name-fragment>,
Modified: trunk/libraries/protocols/tcp.dylan
==============================================================================
--- trunk/libraries/protocols/tcp.dylan (original)
+++ trunk/libraries/protocols/tcp.dylan Sat Sep 15 20:50:32 2007
@@ -11,7 +11,9 @@
field sequence-number :: <big-endian-unsigned-integer-4byte>;
field acknowledgement-number :: <big-endian-unsigned-integer-4byte>;
field data-offset :: <4bit-unsigned-integer>,
- fixup: ceiling/(20 + byte-offset(reduce(method(x, y) frame-size(y) + x end, 0, frame.options-and-padding)), 4);
+ fixup: ceiling/(20 + byte-offset(reduce(method(x, y)
+ frame-size(y) + x
+ end, 0, frame.options-and-padding)), 4);
field reserved :: <6bit-unsigned-integer> = 0;
field urg :: <1bit-unsigned-integer> = 0;
field ack :: <1bit-unsigned-integer> = 0;
@@ -22,7 +24,8 @@
field window :: <2byte-big-endian-unsigned-integer> = 0;
field checksum :: <2byte-big-endian-unsigned-integer> = 0;
field urgent-pointer :: <2byte-big-endian-unsigned-integer> = 0;
- repeated field options-and-padding :: <tcp-option>, reached-end?: instance?(frame, <end-of-option>);
+ repeated field options-and-padding :: <tcp-option>,
+ reached-end?: instance?(frame, <end-of-option>);
field payload :: <raw-frame> = make(<raw-frame>, data: make(<stretchy-byte-vector-subsequence>)),
start: frame.data-offset * 4 * 8;
end;
More information about the chatter
mailing list