[Gd-chatter] r10822 - in trunk/libraries/packetizer: . packetizer-test
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Mon Jul 10 23:55:54 CEST 2006
Author: hannes
Date: Mon Jul 10 23:55:52 2006
New Revision: 10822
Modified:
trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan
trunk/libraries/packetizer/packetizer.dylan
trunk/libraries/packetizer/protocol-definer-macro.dylan
Log:
Bug: 7299
*fix parsing of container-frames which get the whole rest as substring, but don't consume all bits
Modified: trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan (original)
+++ trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan Mon Jul 10 23:55:52 2006
@@ -282,6 +282,38 @@
frame-field-checker(2, aframe, 16, 24, 40);
end;
+define protocol b-sub-sub (container-frame)
+ field a :: <unsigned-byte>;
+ field a* :: <raw-frame>,
+ length: frame.a * 8;
+ field b :: <unsigned-byte>;
+end;
+
+define test dyn-length ()
+ let aframe = make(unparsed-class(<b-sub-sub>),
+ packet: as(<byte-vector>, #(#x3, #x0, #x0, #x0, #x42, #x42)));
+ let field-list = fields(aframe);
+ static-checker(field-list[0], 0, 8, 8);
+ static-checker(field-list[1], 8, $unknown-at-compile-time, $unknown-at-compile-time);
+ static-checker(field-list[2], $unknown-at-compile-time, 8, $unknown-at-compile-time);
+ frame-field-checker(0, aframe, 0, 8, 8);
+ frame-field-checker(1, aframe, 8, 24, 32);
+ frame-field-checker(2, aframe, 32, 8, 40);
+end;
+define protocol b-subb (container-frame)
+ //variably-typed-field data,
+ // type-function: <b-sub-sub>;
+ field data :: <b-sub-sub>;
+end;
+
+define test dynamic-length ()
+ let aframe = make(unparsed-class(<b-subb>),
+ packet: as(<byte-vector>, #(#x3, #x0, #x0, #x0, #x42, #x42)));
+ let field-list = fields(aframe);
+ static-checker(field-list[0], 0, $unknown-at-compile-time, $unknown-at-compile-time);
+ frame-field-checker(0, aframe, 0, 40, 40);
+end;
+
define test inheritance-dynamic-length-assemble ()
let frame = make(<b-sub>, type-code: #x42, data: parse-frame(<raw-frame>, as(<byte-vector>, #(#x23, #x42, #x23, #x42))));
let byte-vector = assemble-frame(frame);
@@ -300,6 +332,8 @@
test label-test;
test inheritance-test;
test inheritance-dynamic-length;
+ test dyn-length;
+ test dynamic-length;
end;
define suite packetizer-assemble-suite ()
Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan (original)
+++ trunk/libraries/packetizer/packetizer.dylan Mon Jul 10 23:55:52 2006
@@ -593,7 +593,10 @@
define inline method length (frame-field :: <frame-field>) => (res :: <integer>)
unless (frame-field.%length)
unless (compute-field-length(frame-field))
- value(frame-field); // this has side effects ;)
+ value(frame-field); //XXX: b0rk3n
+ unless (frame-field.%length)
+ frame-field.%length := get-field-size-aux(frame-field.frame, frame-field.field);
+ end;
end;
end;
frame-field.%length;
Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan (original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan Mon Jul 10 23:55:52 2006
@@ -200,8 +200,10 @@
let frame-field = get-frame-field(?field-index, mframe);
let (value, parsed-end) = parse-frame-field(frame-field);
mframe.cache.?name := value;
- frame-field.%end-offset := parsed-end;
- frame-field.%length := parsed-end - frame-field.start-offset;
+ if (parsed-end)
+ frame-field.%end-offset := parsed-end;
+ frame-field.%length := parsed-end - frame-field.start-offset;
+ end;
mframe.cache.?name
end;
end;
@@ -260,11 +262,8 @@
frame-field.field.field-name, start, end-of-field, end-of-field - start, length - bit-offset(start));
end;
end;
- elseif ((~ length) & (frame-field.field.index + 1 ~= field-count(frame-field.frame.object-class)))
- end-of-field := end-offset(get-frame-field(field-count(value.object-class) - 1, value));
else
- //last field in frame
- end-of-field := full-frame-size
+ end-of-field := #f
end;
values(value, end-of-field);
end;
More information about the chatter
mailing list