Thomas Glanzmann <sithglan <at> stud.uni-erlangen.de> writes:

> Could you please send me a patch for this.

Sure. I'm sorry I didn't include one in the initial post.
Below is a patch against version 1.41 of tun.c. Apart from
replacing openbsd with freebsd, it is just a straight copy 
of the corresponding functions (write_tun and read_tun) for 
OpenBSD from earlier in the file.

Nathanael

--- v1.41/tun.c   Sat Feb 21 16:40:01 2004
+++ tun.c   Sat Feb 21 16:47:55 2004
@@ -1308,38 +1308,47 @@
 int
 write_tun (struct tuntap* tt, uint8_t *buf, int len)
 {
-  struct iovec iv[2];
-  u_int32_t type;
-  struct ip *iph;
-
-  iph = (struct ip *)buf;
-
-  if(tt->ipv6 && iph->ip_v == 6)
-     type = htonl(AF_INET6);
-   else
-     type = htonl(AF_INET);
-
-  iv[0].iov_base = &type;
-  iv[0].iov_len = sizeof (type);
-  iv[1].iov_base = buf;
-  iv[1].iov_len = len;
-
-  return freebsd_modify_read_write_return (writev (tt->fd, iv, 2));
+  if (tt->type == DEV_TYPE_TUN)
+    {
+      u_int32_t type;
+      struct iovec iv[2];
+      struct ip *iph;
+
+      iph = (struct ip *) buf;
+
+      if (tt->ipv6 && iph->ip_v == 6)
+        type = htonl (AF_INET6);
+      else 
+        type = htonl (AF_INET);
+
+      iv[0].iov_base = &type;
+      iv[0].iov_len = sizeof (type);
+      iv[1].iov_base = buf;
+      iv[1].iov_len = len;
+
+      return freebsd_modify_read_write_return (writev (tt->fd, iv, 2));
+    }
+  else
+    return write (tt->fd, buf, len);
 }

 int
 read_tun (struct tuntap* tt, uint8_t *buf, int len)
 {
-  u_int32_t type;
-  struct iovec iv[2];
-
-  iv[0].iov_base = &type;
-  iv[0].iov_len = sizeof (type);
-  iv[1].iov_base = buf;
-  iv[1].iov_len = len;
-
-
-  return freebsd_modify_read_write_return (readv (tt->fd, iv, 2));
+  if (tt->type == DEV_TYPE_TUN)
+    {
+      u_int32_t type;
+      struct iovec iv[2];
+
+      iv[0].iov_base = &type;
+      iv[0].iov_len = sizeof (type);
+      iv[1].iov_base = buf;
+      iv[1].iov_len = len;
+
+      return freebsd_modify_read_write_return (readv (tt->fd, iv, 2));
+    }
+  else
+    return read (tt->fd, buf, len);
 }

 #elif defined(WIN32)




Reply via email to