tun-device: Packets sent over utun devices on Mac OS X have the protocol family prepended
authorTobias Brunner <tobias@strongswan.org>
Sun, 16 Jun 2013 18:05:08 +0000 (20:05 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 21 Jun 2013 15:03:21 +0000 (17:03 +0200)
src/libstrongswan/networking/tun_device.c

index 00de2ed..af7e571 100644 (file)
@@ -225,6 +225,12 @@ METHOD(tun_device_t, write_packet, bool,
 {
        ssize_t s;
 
+#ifdef __APPLE__
+       /* UTUN's expect the packets to be prepended by a 32-bit protocol number
+        * instead of parsing the packet again, we assume IPv4 for now */
+       u_int32_t proto = htonl(AF_INET);
+       packet = chunk_cata("cc", chunk_from_thing(proto), packet);
+#endif
        s = write(this->tunfd, packet.ptr, packet.len);
        if (s < 0)
        {
@@ -271,6 +277,11 @@ METHOD(tun_device_t, read_packet, bool,
                return FALSE;
        }
        packet->len = len;
+#ifdef __APPLE__
+       /* UTUN's prepend packets with a 32-bit protocol number */
+       packet->len -= sizeof(u_int32_t);
+       memmove(packet->ptr, packet->ptr + sizeof(u_int32_t), packet->len);
+#endif
        return TRUE;
 }