pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/net/openvpn Merge Solaris tap support patch for OpenVP...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/e4a88517be2c
branches:  trunk
changeset: 530559:e4a88517be2c
user:      tnn <tnn%pkgsrc.org@localhost>
date:      Sun Jul 01 15:40:05 2007 +0000

description:
Merge Solaris tap support patch for OpenVPN by "Kazuyoshi".

diffstat:

 net/openvpn/distinfo         |    4 +-
 net/openvpn/patches/patch-ac |  201 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 199 insertions(+), 6 deletions(-)

diffs (229 lines):

diff -r 70b034f24d84 -r e4a88517be2c net/openvpn/distinfo
--- a/net/openvpn/distinfo      Sun Jul 01 12:38:37 2007 +0000
+++ b/net/openvpn/distinfo      Sun Jul 01 15:40:05 2007 +0000
@@ -1,10 +1,10 @@
-$NetBSD: distinfo,v 1.12 2007/06/21 21:44:42 jlam Exp $
+$NetBSD: distinfo,v 1.13 2007/07/01 15:40:05 tnn Exp $
 
 SHA1 (openvpn-2.1_rc4.tar.gz) = 4a22e23e497b7f5269628b1f430207c700cd6ebf
 RMD160 (openvpn-2.1_rc4.tar.gz) = d9843c2fb6fda64b5cf9474f42b36068bb4cd845
 Size (openvpn-2.1_rc4.tar.gz) = 803125 bytes
 SHA1 (patch-ab) = d26cdc9166a8813860f31cb5b11bc5b3643b8aa5
-SHA1 (patch-ac) = 2fe382042522d46f1f6fba5a3e07992b7d701460
+SHA1 (patch-ac) = efbc3f00d2391a0b66fa88296359e3e0189b4cee
 SHA1 (patch-ad) = 69f5fff5105131dc05ab38a1a717e1b363f88c1c
 SHA1 (patch-ae) = 66f7d62588d465daa6195ee550bdad4ac2879db7
 SHA1 (patch-af) = b30791372a097e02250515ec57a62b0a4fde2cdd
diff -r 70b034f24d84 -r e4a88517be2c net/openvpn/patches/patch-ac
--- a/net/openvpn/patches/patch-ac      Sun Jul 01 12:38:37 2007 +0000
+++ b/net/openvpn/patches/patch-ac      Sun Jul 01 15:40:05 2007 +0000
@@ -1,8 +1,30 @@
-$NetBSD: patch-ac,v 1.4 2007/02/20 09:40:49 sborrill Exp $
+$NetBSD: patch-ac,v 1.5 2007/07/01 15:40:06 tnn Exp $
 
---- tun.c.orig 2006-10-15 23:30:20.000000000 +0100
-+++ tun.c      2007-02-12 10:52:42.000000000 +0000
-@@ -945,7 +945,37 @@
+--- tun.c.orig 2007-04-25 23:38:46.000000000 +0200
++++ tun.c
+@@ -68,6 +68,7 @@ static const char *netsh_get_id (const c
+ 
+ #ifdef TARGET_SOLARIS
+ static void solaris_error_close (struct tuntap *tt, const struct env_set *es, const char *actual);
++#include <stropts.h>
+ #endif
+ 
+ bool
+@@ -659,7 +660,12 @@ do_ifconfig (struct tuntap *tt,
+                           );
+       }
+       else
+-      no_tap_ifconfig ();
++      openvpn_snprintf (command_line, sizeof (command_line),
++                        IFCONFIG_PATH " %s %s netmask %s broadcast + up",
++                        actual,
++                        ifconfig_local,
++                        ifconfig_remote_netmask
++                        );
+ 
+       msg (M_INFO, "%s", command_line);
+       if (!system_check (command_line, es, 0, "Solaris ifconfig phase-2 failed"))
+@@ -945,7 +951,37 @@ open_tun_generic (const char *dev, const
          if (dynamic && !has_digit((unsigned char *)dev))
            {
              int i;
@@ -41,3 +63,174 @@
                {
                  openvpn_snprintf (tunname, sizeof (tunname),
                                    "/dev/%s%d", dev, i);
+@@ -1255,13 +1291,16 @@ read_tun (struct tuntap* tt, uint8_t *bu
+ void
+ open_tun (const char *dev, const char *dev_type, const char *dev_node, bool ipv6, struct tuntap *tt)
+ {
+-  int if_fd, muxid, ppa = -1;
+-  struct ifreq ifr;
++  int if_fd, ip_muxid, arp_muxid, arp_fd, ppa = -1;
++  struct lifreq ifr;
+   const char *ptr;
+-  const char *ip_node;
++  const char *ip_node, *arp_node;
+   const char *dev_tuntap_type;
+   int link_type;
+   bool is_tun;
++  struct strioctl strioc_if, strioc_ppa;
++
++  memset(&ifr, 0x0, sizeof(ifr));
+ 
+   ipv6_support (ipv6, false, tt);
+ 
+@@ -1282,9 +1321,10 @@ open_tun (const char *dev, const char *d
+     }
+   else if (tt->type == DEV_TYPE_TAP)
+     {
+-      ip_node = "/dev/ip";
++      ip_node = "/dev/udp";
+       if (!dev_node)
+       dev_node = "/dev/tap";
++      arp_node = dev_node;
+       dev_tuntap_type = "tap";
+       link_type = I_PLINK; /* was: I_LINK */
+       is_tun = false;
+@@ -1311,7 +1351,11 @@ open_tun (const char *dev, const char *d
+     msg (M_ERR, "Can't open %s", dev_node);
+ 
+   /* Assign a new PPA and get its unit number. */
+-  if ((ppa = ioctl (tt->fd, TUNNEWPPA, ppa)) < 0)
++  strioc_ppa.ic_cmd = TUNNEWPPA;
++  strioc_ppa.ic_timout = 0;
++  strioc_ppa.ic_len = sizeof(ppa);
++  strioc_ppa.ic_dp = (char *)&ppa;
++  if ((ppa = ioctl (tt->fd, I_STR, &strioc_ppa)) < 0)
+     msg (M_ERR, "Can't assign new interface");
+ 
+   if ((if_fd = open (dev_node, O_RDWR, 0)) < 0)
+@@ -1320,27 +1364,81 @@ open_tun (const char *dev, const char *d
+   if (ioctl (if_fd, I_PUSH, "ip") < 0)
+     msg (M_ERR, "Can't push IP module");
+ 
+-  /* Assign ppa according to the unit number returned by tun device */
+-  if (ioctl (if_fd, IF_UNITSEL, (char *) &ppa) < 0)
+-    msg (M_ERR, "Can't set PPA %d", ppa);
+-
+-  if ((muxid = ioctl (tt->ip_fd, link_type, if_fd)) < 0)
+-    msg (M_ERR, "Can't link %s device to IP", dev_tuntap_type);
+-
+-  close (if_fd);
++  if (tt->type == DEV_TYPE_TUN) 
++    {
++      /* Assign ppa according to the unit number returned by tun device */
++      if (ioctl (if_fd, IF_UNITSEL, (char *) &ppa) < 0)
++      msg (M_ERR, "Can't set PPA %d", ppa);
++    }
+ 
+   tt->actual_name = (char *) malloc (32);
+   check_malloc_return (tt->actual_name);
+ 
+   openvpn_snprintf (tt->actual_name, 32, "%s%d", dev_tuntap_type, ppa);
+ 
+-  CLEAR (ifr);
+-  strncpynt (ifr.ifr_name, tt->actual_name, sizeof (ifr.ifr_name));
+-  ifr.ifr_ip_muxid = muxid;
++  if (tt->type == DEV_TYPE_TAP) 
++    {
++      if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
++      msg (M_ERR, "Can't get flags\n");
++      strncpynt (ifr.lifr_name, tt->actual_name, sizeof (ifr.lifr_name));          
++      ifr.lifr_ppa = ppa;
++      /* Assign ppa according to the unit number returned by tun device */          
++      if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
++      msg (M_ERR, "Can't set PPA %d", ppa);              
++      if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
++      msg (M_ERR, "Can't get flags\n");
++      /* Push arp module to if_fd */
++      if (ioctl (if_fd, I_PUSH, "arp") < 0)
++      msg (M_ERR, "Can't push ARP module");
++
++      /* Push arp module to ip_fd */
++      if (ioctl (tt->ip_fd, I_POP, NULL) < 0)
++      msg (M_ERR, "I_POP failed\n");  
++      if (ioctl (tt->ip_fd, I_PUSH, "arp") < 0) 
++      msg (M_ERR, "Can't push ARP module\n");
++
++      /* Open arp_fd */
++      if ((arp_fd = open (arp_node, O_RDWR, 0)) < 0)
++      msg (M_ERR, "Can't open %s\n", arp_node);
++      /* Push arp module to arp_fd */          
++      if (ioctl (arp_fd, I_PUSH, "arp") < 0)
++      msg (M_ERR, "Can't push ARP module\n");
++
++      /* Set ifname to arp */
++      strioc_if.ic_cmd = SIOCSLIFNAME;
++      strioc_if.ic_timout = 0;
++      strioc_if.ic_len = sizeof(ifr);
++      strioc_if.ic_dp = (char *)&ifr;
++      if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
++      msg (M_ERR, "Can't set ifname to arp\n");
++      }
++    }
++  
++  if ((ip_muxid = ioctl (tt->ip_fd, link_type, if_fd)) < 0)
++    msg (M_ERR, "Can't link %s device to IP", dev_tuntap_type);
++
++  if (tt->type == DEV_TYPE_TAP) {
++    if ((arp_muxid = ioctl (tt->ip_fd, link_type, arp_fd)) < 0)
++      msg (M_ERR, "Can't link %s device to ARP", dev_tuntap_type);
++    close (arp_fd);
++  }
+ 
+-  if (ioctl (tt->ip_fd, SIOCSIFMUXID, &ifr) < 0)
++  close (if_fd);
++
++  CLEAR (ifr);
++  strncpynt (ifr.lifr_name, tt->actual_name, sizeof (ifr.lifr_name));
++  ifr.lifr_ip_muxid  = ip_muxid;
++  if (tt->type == DEV_TYPE_TAP) {
++    ifr.lifr_arp_muxid = arp_muxid;
++  }
++  
++  if (ioctl (tt->ip_fd, SIOCSLIFMUXID, &ifr) < 0)
+     {
+-      ioctl (tt->ip_fd, I_PUNLINK, muxid);
++      if (tt->type == DEV_TYPE_TAP) 
++        {
++        ioctl (tt->ip_fd, I_PUNLINK , arp_muxid);
++        }
++      ioctl (tt->ip_fd, I_PUNLINK, ip_muxid);
+       msg (M_ERR, "Can't set multiplexor id");
+     }
+ 
+@@ -1358,18 +1456,24 @@ solaris_close_tun (struct tuntap *tt)
+     {
+       if (tt->ip_fd >= 0)
+       {
+-        struct ifreq ifr;
++        struct lifreq ifr;
+         CLEAR (ifr);
+-        strncpynt (ifr.ifr_name, tt->actual_name, sizeof (ifr.ifr_name));
++        strncpynt (ifr.lifr_name, tt->actual_name, sizeof (ifr.lifr_name));
+ 
+-        if (ioctl (tt->ip_fd, SIOCGIFFLAGS, &ifr) < 0)
++        if (ioctl (tt->ip_fd, SIOCGLIFFLAGS, &ifr) < 0)
+           msg (M_WARN | M_ERRNO, "Can't get iface flags");
+ 
+-        if (ioctl (tt->ip_fd, SIOCGIFMUXID, &ifr) < 0)
++        if (ioctl (tt->ip_fd, SIOCGLIFMUXID, &ifr) < 0)
+           msg (M_WARN | M_ERRNO, "Can't get multiplexor id");
+ 
+-        if (ioctl (tt->ip_fd, I_PUNLINK, ifr.ifr_ip_muxid) < 0)
+-          msg (M_WARN | M_ERRNO, "Can't unlink interface");
++        if (tt->type == DEV_TYPE_TAP)
++            {
++            if (ioctl (tt->ip_fd, I_PUNLINK, ifr.lifr_arp_muxid) < 0)
++              msg (M_WARN | M_ERRNO, "Can't unlink interface(arp)");
++          }
++
++        if (ioctl (tt->ip_fd, I_PUNLINK, ifr.lifr_ip_muxid) < 0)
++          msg (M_WARN | M_ERRNO, "Can't unlink interface(ip)");
+ 
+         close (tt->ip_fd);
+         tt->ip_fd = -1;



Home | Main Index | Thread Index | Old Index