[Gd-chatter] r11655 - in trunk/libraries: gui-sniffer network-flow packetizer protocols
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Fri Jan 25 00:37:41 CET 2008
Author: andreas
Date: Fri Jan 25 00:37:40 2008
New Revision: 11655
Modified:
trunk/libraries/gui-sniffer/commands.dylan
trunk/libraries/gui-sniffer/module.dylan
trunk/libraries/network-flow/network-flow.dylan
trunk/libraries/packetizer/fields.dylan
trunk/libraries/packetizer/leaf-frames.dylan
trunk/libraries/packetizer/packetizer.dylan
trunk/libraries/packetizer/protocol-definer-macro.dylan
trunk/libraries/protocols/dns.dylan
trunk/libraries/protocols/protocols-library.dylan
Log:
job: 7299
* Fix <boolean-bit> for good (#f was used as magic value internally)
* Implemented sample "resolve" command for NNV
Modified: trunk/libraries/gui-sniffer/commands.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/commands.dylan (original)
+++ trunk/libraries/gui-sniffer/commands.dylan Fri Jan 25 00:37:40 2008
@@ -195,6 +195,26 @@
apply-filter(context.nnv-context);
end;
+define class <resolve-command> (<basic-command>)
+ constant slot %host-name :: <string>, required-init-keyword: host-name:;
+end;
+
+define command-line resolve => <resolve-command>
+ (summary: "Resolve host name using DNS",
+ documentation: "Resolve a host name to IP address using DNS. Uses hard-coded resolver and query type.")
+ argument host-name :: <string> = "The host to resolve"
+end;
+
+define method do-execute-command (context :: <nnv-context>, command :: <resolve-command>)
+ let host-name = copy-sequence(command.%host-name, end: command.%host-name.size - 1);
+ let stream = context.context-server.server-output-stream;
+ let dns-query = dns-frame(questions: list(dns-question(domainname: as(<domain-name>, host-name))));
+ let query = udp-frame(source-port: 53, destination-port: 53, payload: dns-query);
+ send(context.nnv-context.ip-layer, ipv4-address("141.1.1.1"), query);
+end;
+
+
+
define class <key-bindings-property> (<command-property>)
end;
@@ -217,6 +237,7 @@
documentation: "The set of commands for managing the network.")
command ping;
command dhcp-client;
+ command resolve;
command set-ip-address;
command add-route;
command delete-route;
Modified: trunk/libraries/gui-sniffer/module.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/module.dylan (original)
+++ trunk/libraries/gui-sniffer/module.dylan Fri Jan 25 00:37:40 2008
@@ -55,9 +55,10 @@
use pcap, import: { make-unix-time, <pcap-packet>, decode-unix-time, timestamp };
use prism2, import: { <prism2-frame> };
use ipv4, import: { <ipv4-frame>, <udp-frame>, source-port, destination-port,
- acknowledgement-number, sequence-number, ipv4-address, <ipv4-address> };
+ acknowledgement-number, sequence-number, ipv4-address, <ipv4-address>, udp-frame };
use icmp, import: { <icmp-frame>, icmp-echo-request };
use dhcp, import: { <dhcp-message>, <dhcp-subnet-mask>, <dhcp-router-option>, subnet-mask, addresses, your-ip-address };
+ use dns, import: { dns-frame, dns-question, <domain-name> };
use cidr;
use tcp;
use ipv6;
Modified: trunk/libraries/network-flow/network-flow.dylan
==============================================================================
--- trunk/libraries/network-flow/network-flow.dylan (original)
+++ trunk/libraries/network-flow/network-flow.dylan Fri Jan 25 00:37:40 2008
@@ -276,9 +276,9 @@
node :: <completer>,
frame :: <container-frame>);
for (field in node.template-frame.fields)
- unless (field.getter(frame))
+ if (field.getter(frame) == $unsupplied)
let default-field-value = field.getter(node.template-frame);
- if (default-field-value)
+ if (default-field-value ~== $unsupplied)
field.setter(default-field-value, frame);
elseif (~ field.fixup-function)
signal(make(<undefined-field-error>));
Modified: trunk/libraries/packetizer/fields.dylan
==============================================================================
--- trunk/libraries/packetizer/fields.dylan (original)
+++ trunk/libraries/packetizer/fields.dylan Fri Jan 25 00:37:40 2008
@@ -77,7 +77,7 @@
slot static-start :: <integer-or-unknown> = $unknown-at-compile-time, init-keyword: static-start:;
slot static-length :: <integer-or-unknown> = $unknown-at-compile-time, init-keyword: static-length:;
slot static-end :: <integer-or-unknown> = $unknown-at-compile-time, init-keyword: static-end:;
- slot init-value = #f, init-keyword: init-value:;
+ slot init-value = $unsupplied, init-keyword: init-value:;
slot fixup-function :: false-or(<function>) = #f, init-keyword: fixup:;
constant slot getter, required-init-keyword: getter:;
constant slot setter, required-init-keyword: setter:;
Modified: trunk/libraries/packetizer/leaf-frames.dylan
==============================================================================
--- trunk/libraries/packetizer/leaf-frames.dylan (original)
+++ trunk/libraries/packetizer/leaf-frames.dylan Fri Jan 25 00:37:40 2008
@@ -45,11 +45,12 @@
define method assemble-frame-into-as
(frame-type == <boolean-bit>,
data :: <boolean>,
- packet :: <stretchy-byte-vector-subsequence>) => (end-offset :: <integer>)
+ packet :: <byte-sequence>) => (end-offset :: <integer>)
+ let subseq = subsequence(packet, length: 1);
if (data)
- packet[0] := logior(packet[0], #x80);
+ encode-integer(1, subseq, 1);
else
- packet[0] := logand(packet[0], #x7F)
+ encode-integer(0, subseq, 1);
end;
1;
end;
Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan (original)
+++ trunk/libraries/packetizer/packetizer.dylan Fri Jan 25 00:37:40 2008
@@ -429,7 +429,7 @@
packet :: <stretchy-vector-subsequence>) => (res :: <integer>)
let offset :: <integer> = 0;
for (field in fields(frame))
- unless (field.getter(frame))
+ if (field.getter(frame) == $unsupplied)
if (field.fixup-function)
field.setter(field.fixup-function(frame), frame);
else
Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan (original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan Fri Jan 25 00:37:40 2008
@@ -2,6 +2,12 @@
Author: Andreas Bogk, Hannes Mehnert
Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+define macro unsupplied-or
+ { unsupplied-or(?:expression) }
+ =>
+ { type-union(singleton($unsupplied), ?expression) }
+end;
+
define macro protocol-module-definer
{ protocol-module-definer (?:name; ?super:name; ?fields:*) }
=> { define module ?name
@@ -117,7 +123,7 @@
let args = filter-enums(rest, "$" ## ?name ## "-fields");
let frame = apply(make, decoded-class(?name), args);
for (field in fields(frame))
- if (field.getter(frame) = #f)
+ if (field.getter(frame) = $unsupplied)
field.setter(field.init-value, frame);
end;
end;
@@ -217,16 +223,16 @@
field:
{ variably-typed-field ?:name, ?rest:* }
- => { slot ?name :: false-or(<frame>) = #f,
+ => { slot ?name :: unsupplied-or(<frame>) = $unsupplied,
init-keyword: ?#"name" }
{ repeated field ?:name ?rest:* }
- => { slot ?name :: false-or(<collection>) = #f,
+ => { slot ?name :: unsupplied-or(<collection>) = $unsupplied,
init-keyword: ?#"name" }
{ enum field ?:name \:: ?field-type:name ?rest:* }
- => { slot "%" ## ?name :: false-or(high-level-type(?field-type)) = #f,
+ => { slot "%" ## ?name :: unsupplied-or(high-level-type(?field-type)) = $unsupplied,
init-keyword: ?#"name" }
{ ?attrs:* field ?:name \:: ?field-type:name ?rest:* }
- => { slot ?name :: false-or(high-level-type(?field-type)) = #f,
+ => { slot ?name :: unsupplied-or(high-level-type(?field-type)) = $unsupplied,
init-keyword: ?#"name" }
end;
@@ -254,7 +260,7 @@
?frame-type:name,
?field-index:expression) }
=> { define inline method ?name (mframe :: ?frame-type) => (res)
- if (mframe.cache.?name)
+ if (mframe.cache.?name ~== $unsupplied)
mframe.cache.?name
else
let frame-field = get-frame-field(?field-index, mframe);
Modified: trunk/libraries/protocols/dns.dylan
==============================================================================
--- trunk/libraries/protocols/dns.dylan (original)
+++ trunk/libraries/protocols/dns.dylan Fri Jan 25 00:37:40 2008
@@ -50,7 +50,7 @@
repeated field additional-records :: <dns-resource-record>,
count: frame.additional-count;
end;
-
+/*
define method assemble-frame-into
(frame :: <domain-name>, packet :: <stretchy-byte-vector-subsequence>)
=> (res :: <integer>)
@@ -72,7 +72,7 @@
encode-fragments(frame.fragment);
offset;
end;
-
+*/
define protocol domain-name (container-frame)
summary "%=", curry(as, <string>);
repeated field fragment :: <domain-name-fragment>,
@@ -154,7 +154,7 @@
define protocol dns-question (container-frame)
summary "%= %s", domainname, question-type;
field domainname :: <domain-name>;
- enum field question-type :: <2byte-big-endian-unsigned-integer>,
+ enum field question-type :: <2byte-big-endian-unsigned-integer> = #"A",
mappings: { 1 <=> #"A",
2 <=> #"NS",
5 <=> #"CNAME",
Modified: trunk/libraries/protocols/protocols-library.dylan
==============================================================================
--- trunk/libraries/protocols/protocols-library.dylan (original)
+++ trunk/libraries/protocols/protocols-library.dylan Fri Jan 25 00:37:40 2008
@@ -229,7 +229,7 @@
header-checksum, header-checksum-setter,
options, options-setter;
- export <udp-frame>,
+ export <udp-frame>, udp-frame,
source-port, source-port-setter,
destination-port, destination-port-setter,
payload-size, payload-size-setter,
@@ -337,7 +337,7 @@
use simple-io;
use ipv4, import: { <ipv4-address>, <udp-frame> };
- export <dns-frame>,
+ export <dns-frame>, dns-frame,
identifier, identifier-setter,
query-or-response, query-or-response-setter,
opcode, opcode-setter,
@@ -363,7 +363,7 @@
<label-offset>, offset, offset-setter,
<label>, data-length, data-length-setter, raw-data, raw-data-setter;
- export <dns-question>,
+ export <dns-question>, dns-question,
domainname, domainname-setter,
question-type, question-type-setter,
question-class, question-class-setter;
More information about the chatter
mailing list