Add conversion helpers for netlink addresses
authorStelian Ionescu <sionescu@cddr.org>
Sun, 5 May 2013 01:18:27 +0000 (5 03:18 +0200)
committerStelian Ionescu <sionescu@cddr.org>
Sun, 5 May 2013 01:18:27 +0000 (5 03:18 +0200)
src/sockets/address.lisp
src/sockets/common.lisp

index 6633434..a45796b 100644 (file)
@@ -73,26 +73,34 @@ ADDRESS-NAME reader."))
             (values (parse-un-path path) nil))
       (make-instance 'local-address :name name :abstract abstract))))
 
+(defun sockaddr-nl->sockaddr (snl)
+  (with-foreign-slots ((groups port) snl sockaddr-nl)
+    (values (make-instance 'netlink-address :multicast-groups groups)
+            port)))
+
 (defun sockaddr-storage->sockaddr (ss)
   (with-foreign-slots ((family) ss sockaddr-storage)
     (switch (family :test #'=)
       (af-inet (sockaddr-in->sockaddr ss))
       (af-inet6 (sockaddr-in6->sockaddr ss))
-      (af-local (sockaddr-un->sockaddr ss)))))
+      (af-local (sockaddr-un->sockaddr ss))
+      (af-netlink (sockaddr-nl->sockaddr ss)))))
 
 (defun sockaddr->sockaddr-storage (ss sockaddr &optional (port 0))
   (etypecase sockaddr
     (ipv4-address (make-sockaddr-in ss (address-name sockaddr) port))
     (ipv6-address (make-sockaddr-in6 ss (address-name sockaddr) port))
     (local-address (make-sockaddr-un ss (address-name sockaddr)
-                                     (abstract-address-p sockaddr)))))
+                                     (abstract-address-p sockaddr)))
+    (netlink-address (make-sockaddr-nl ss (multicast-groups sockaddr) port))))
 
 (defun sockaddr-size (ss)
   (with-foreign-slots ((family) ss sockaddr-storage)
     (switch (family :test #'=)
       (af-inet  (isys:sizeof 'sockaddr-in))
       (af-inet6 (isys:sizeof 'sockaddr-in6))
-      (af-local (isys:sizeof 'sockaddr-un)))))
+      (af-local (isys:sizeof 'sockaddr-un))
+      (af-netlink (isys:sizeof 'sockaddr-nl)))))
 
 ;;;; Conversion functions
 
index 3bf3d6a..067c231 100644 (file)
      (make-sockaddr-un ,var ,address ,abstract)
      ,@body))
 
+(defun make-sockaddr-nl (snl multicast-groups &optional (portno 0))
+  (declare (type ub32 multicast-groups)
+           (type ub32 portno))
+  (isys:bzero snl (isys:sizeof 'sockaddr-nl))
+  (with-foreign-slots ((family groups port) snl sockaddr-nl)
+    (setf family af-netlink)
+    (setf groups multicast-groups)
+    (setf port portno))
+  (values snl))
+
+(defmacro with-sockaddr-nl ((var multicast-groups &optional (port 0)) &body body)
+  `(with-foreign-object (,var 'sockaddr-nl)
+     (make-sockaddr-nl ,var ,multicast-groups ,port)
+     ,@body))
+
 (defmacro with-sockaddr-storage ((var) &body body)
   `(with-foreign-object (,var 'sockaddr-storage)
      (isys:bzero ,var (isys:sizeof 'sockaddr-storage))