From b2cae3951f390ebd0e75cf5a7c668b4f90eb81ce Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Mon, 6 May 2013 22:09:08 +0200 Subject: Implement buffer-length option, and export the interface setting/getting procedures as well as the procedure to retrieve the buffer length. Switch to c-pointer and use LOCATION to get pointers from scheme objects. --- bpf-interface.scm | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/bpf-interface.scm b/bpf-interface.scm index 49046b0..5a3be0c 100644 --- a/bpf-interface.scm +++ b/bpf-interface.scm @@ -4,7 +4,7 @@ ;;; Copyright (c) 2013 by Peter Bex, see file COPYING.BSD ;;; (module bpf-interface - (bpf-open bpf-close bpf? bpf-interface-set! bpf-interface) + (bpf-open bpf-close bpf? bpf-buffer-length bpf-interface bpf-interface-set!) (import chicken scheme foreign) @@ -31,7 +31,7 @@ (define ioctl1 (foreign-lambda* int (((c-pointer int) err) (int fd) - (unsigned-long req) (scheme-pointer val1)) + (unsigned-long req) (c-pointer val1)) "int res = ioctl(fd, req, val1);" "*err = errno;" "return(res);")) @@ -77,6 +77,9 @@ (e (exn i/o file) (lp (fx+ i 1) fn e)))) (bpf (make-bpf fd))) (set-finalizer! bpf bpf-close) + ;; Length _must_ be set before interface is assigned + (when buffer-length + (bpf-buffer-length-set! bpf buffer-length)) (bpf-interface-set! bpf interface) bpf))))) @@ -86,6 +89,15 @@ (bpf-fd-set! bpf #f)) (void)) +;; Returns the *actual* size that was set, the requested size is too big +;; Remember, this can only be done *before* setting the interface. +;; Oddly enough, the interface can be switched afterwards, so there's +;; no way to set a new interface *and* buffer-length... +(define (bpf-buffer-length-set! bpf requested-length) + (let-location ((new-length int requested-length)) + (ioctl (bpf-fd bpf) (foreign-value "BIOCSBLEN" int) (location new-length)) + new-length)) + (define interface-name-maximum-length (foreign-value "IF_NAMESIZE" int)) (define (bpf-interface-set! bpf interface) @@ -99,13 +111,18 @@ "char *ifname = ((struct ifreq *)i)->ifr_name;" "strncpy(ifname, s, len);" "ifname[len] = '\\0';") ifreq interface len) - (ioctl (bpf-fd bpf) (foreign-value "BIOCSETIF" int) ifreq) + (ioctl (bpf-fd bpf) (foreign-value "BIOCSETIF" int) (location ifreq)) (void))) (define (bpf-interface bpf) (let ((ifreq (make-blob (foreign-value "sizeof(struct ifreq)" int)))) - (ioctl (bpf-fd bpf) (foreign-value "BIOCGETIF" int) ifreq) + (ioctl (bpf-fd bpf) (foreign-value "BIOCGETIF" int) (location ifreq)) ((foreign-lambda* c-string ((scheme-pointer i)) "C_return(((struct ifreq *)i)->ifr_name);") ifreq))) +(define (bpf-buffer-length bpf) + (let-location ((length int)) + (ioctl (bpf-fd bpf) (foreign-value "BIOCGBLEN" int) (location length)) + length)) + ) -- cgit v1.2.3