[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