[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