[Gd-chatter] r11391 - trunk/libraries/interfaces

andreas at gwydiondylan.org andreas at gwydiondylan.org
Wed Jun 6 01:23:38 CEST 2007


Author: andreas
Date: Wed Jun  6 01:23:37 2007
New Revision: 11391

Modified:
   trunk/libraries/interfaces/interfaces.dylan
   trunk/libraries/interfaces/module.dylan
Log:
Job: 7299
add find-all-devices method


Modified: trunk/libraries/interfaces/interfaces.dylan
==============================================================================
--- trunk/libraries/interfaces/interfaces.dylan	(original)
+++ trunk/libraries/interfaces/interfaces.dylan	Wed Jun  6 01:23:37 2007
@@ -45,6 +45,10 @@
    end if;
 end method initialize;
 
+define method int-close (int :: <interface>)
+  close(int.unix-file-descriptor);
+end;
+
 define method up (interface :: <interface>)
  => ()
   with-stack-structure (ifreq :: <ifreq*>)
@@ -64,6 +68,25 @@
   end with-stack-structure;
 end method;
 
+define method find-all-devices () => (res :: <collection>)
+  let packet-socket = socket($PF-PACKET, $SOCK-RAW, htons($ETH-P-ALL));
+  let res = make(<stretchy-vector>);
+  with-stack-structure (ifreq :: <ifreq*>)
+    for (i from 0 below 256)
+      ifreq.ifr-ifindex := i;
+      if (ioctl(packet-socket, $SIOCGIFNAME, ifreq) >= 0)
+        add!(res, ifreq.ifr-name);
+      end;
+    end;
+  end;
+  close(packet-socket);
+  res;
+end;
+
+define method device-name (a :: <string>) => (res :: <string>)
+  a;
+end;
+
 define method receive (interface :: <interface>)
   => (buffer)
   let buffer = make(<buffer>, size: $ethernet-buffer-size);
@@ -105,6 +128,7 @@
 define class <ethernet-interface> (<filter>)
   slot unix-interface :: <interface>;
   slot interface-name :: <string>, required-init-keyword: name:;
+  slot running? :: <boolean> = #t;
 end;
 
 define method initialize (node :: <ethernet-interface>,
@@ -120,9 +144,10 @@
 end;
 
 define method toplevel (node :: <ethernet-interface>)
-  while(#t)
+  while(node.running?)
     let packet = receive(node.unix-interface);
     let frame = parse-frame(<ethernet-frame>, packet);
     push-data(node.the-output, frame);
   end while;
+  int-close(node.unix-interface);
 end;

Modified: trunk/libraries/interfaces/module.dylan
==============================================================================
--- trunk/libraries/interfaces/module.dylan	(original)
+++ trunk/libraries/interfaces/module.dylan	Wed Jun  6 01:23:37 2007
@@ -20,5 +20,6 @@
   use packetizer, import: { parse-frame, assemble-frame, packet };
   use ethernet, import: { <ethernet-frame> };
 
-  export <ethernet-interface>, interface-name;
+  export <ethernet-interface>, interface-name, find-all-devices, device-name,
+    running?, running?-setter;
 end module interfaces;



More information about the chatter mailing list