[Gd-chatter] r11564 - trunk/libraries/network-interfaces

andreas at gwydiondylan.org andreas at gwydiondylan.org
Wed Dec 19 23:28:28 CET 2007


Author: andreas
Date: Wed Dec 19 23:28:27 2007
New Revision: 11564

Modified:
   trunk/libraries/network-interfaces/raw-interface-library.dylan
   trunk/libraries/network-interfaces/raw-interface.dylan
Log:
job: 7299

Consult sll_hatype to figure out the type of packet received on a raw
socket. This makes sniffing WLAN work... sometimes.


Modified: trunk/libraries/network-interfaces/raw-interface-library.dylan
==============================================================================
--- trunk/libraries/network-interfaces/raw-interface-library.dylan	(original)
+++ trunk/libraries/network-interfaces/raw-interface-library.dylan	Wed Dec 19 23:28:27 2007
@@ -11,7 +11,7 @@
   use collection-extensions;
   use flow;
   use packetizer;
-  use protocols, import: { ethernet };
+  use protocols, import: { ethernet, prism2 };
 
   export network-interfaces;
 end library network-interfaces;
@@ -33,6 +33,7 @@
   use flow;
   use packetizer, import: { parse-frame, assemble-frame, packet };
   use ethernet, import: { <ethernet-frame> };
+  use prism2, import: { <prism2-frame>, <bsd-80211-radio-frame> };
 
   export <ethernet-interface>, interface-name, find-all-devices, device-name,
     running?, running?-setter;

Modified: trunk/libraries/network-interfaces/raw-interface.dylan
==============================================================================
--- trunk/libraries/network-interfaces/raw-interface.dylan	(original)
+++ trunk/libraries/network-interfaces/raw-interface.dylan	Wed Dec 19 23:28:27 2007
@@ -88,22 +88,29 @@
 end;
 
 define method receive (interface :: <interface>)
-  => (buffer)
+  => (buffer, type)
   let buffer = make(<buffer>, size: $ethernet-buffer-size);
   local method unix-receive ()
-          let fd = interface.unix-file-descriptor;
-          let read-bytes =
-            interruptible-system-call(unix-recv-buffer(fd,
-                                                       buffer-offset(buffer, 0),
-                                                       $ethernet-buffer-size,
-                                                       0));
-            if (read-bytes == -1)
-              //Only want to catch $EINTR, but getting mps assertion failures
-              //this is now done via interruptible-system-call macro
-              #f;
-            else
-              subsequence(buffer, end: read-bytes);
-            end if;
+          with-stack-structure (sockaddr :: <sockaddr-ll*>)
+            with-stack-structure (sockaddr-size :: <socklen-t*>)
+              pointer-value(sockaddr-size) := size-of(<sockaddr-ll>);
+              let fd = interface.unix-file-descriptor;
+              let read-bytes =
+                interruptible-system-call(unix-recv-buffer-from(fd,
+                                                                buffer-offset(buffer, 0),
+                                                                $ethernet-buffer-size,
+                                                                0,
+                                                                sockaddr,
+                                                                sockaddr-size));
+                if (read-bytes == -1)
+                  //Only want to catch $EINTR, but getting mps assertion failures
+                  //this is now done via interruptible-system-call macro
+                  #f;
+                else
+                  values(subsequence(buffer, end: read-bytes), sockaddr.sll-hatype);
+                end if;
+              end
+            end
         end method;
   unix-receive();
 end method receive;
@@ -145,9 +152,20 @@
 
 define method toplevel (node :: <ethernet-interface>)
   while(node.running?)
-    let packet = receive(node.unix-interface);
-    let frame = parse-frame(<ethernet-frame>, packet);
-    push-data(node.the-output, frame);
+    let (packet, type-code) = receive(node.unix-interface);
+    let type = select (type-code)
+                 1   => <ethernet-frame>;
+                 801 => <ieee-80211-frame>;
+                 802 => <prism2-frame>;
+                 803 => <bsd-80211-radio-frame>;
+               end;
+    format-out("Type: %=\n", type);
+    block()
+      let frame = parse-frame(type, packet);
+      push-data(node.the-output, frame);
+    exception (e :: <error>)
+      //format-out("Incoming packet broken beyond repair\n");
+    end
   end while;
   int-close(node.unix-interface);
 end;



More information about the chatter mailing list