diff options
author | Tobias Brunner <tobias@strongswan.org> | 2013-06-16 20:05:08 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2013-06-21 17:03:21 +0200 |
commit | 66aaabf34238aa3ddcbb328b370e2d5abae566b4 (patch) | |
tree | f8b73ebf6d1820b5771f2ff1dfb0faace6b32233 /src/libstrongswan/networking/tun_device.c | |
parent | 34b0ad0653d911c9ba8d89e65377bbf68c63c781 (diff) | |
download | strongswan-66aaabf34238aa3ddcbb328b370e2d5abae566b4.tar.bz2 strongswan-66aaabf34238aa3ddcbb328b370e2d5abae566b4.tar.xz |
tun-device: Packets sent over utun devices on Mac OS X have the protocol family prepended
Diffstat (limited to 'src/libstrongswan/networking/tun_device.c')
-rw-r--r-- | src/libstrongswan/networking/tun_device.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/libstrongswan/networking/tun_device.c b/src/libstrongswan/networking/tun_device.c index 00de2eddf..af7e57140 100644 --- a/src/libstrongswan/networking/tun_device.c +++ b/src/libstrongswan/networking/tun_device.c @@ -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; } |