summaryrefslogtreecommitdiff
path: root/net/openvpn
diff options
context:
space:
mode:
authortnn <tnn@pkgsrc.org>2007-07-01 15:40:05 +0000
committertnn <tnn@pkgsrc.org>2007-07-01 15:40:05 +0000
commitf23875c078ec94e87568d045f7cb5bb7c345ddd2 (patch)
tree107dba26f433dfe3fc40b8d4b20ae29819138ff3 /net/openvpn
parent499eb3f4629c9b583c7e0d4c24d444101ebe9d3e (diff)
downloadpkgsrc-f23875c078ec94e87568d045f7cb5bb7c345ddd2.tar.gz
Merge Solaris tap support patch for OpenVPN by "Kazuyoshi".
Diffstat (limited to 'net/openvpn')
-rw-r--r--net/openvpn/distinfo4
-rw-r--r--net/openvpn/patches/patch-ac201
2 files changed, 199 insertions, 6 deletions
diff --git a/net/openvpn/distinfo b/net/openvpn/distinfo
index deea37d639a..d20cbac6d6a 100644
--- a/net/openvpn/distinfo
+++ b/net/openvpn/distinfo
@@ -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 --git a/net/openvpn/patches/patch-ac b/net/openvpn/patches/patch-ac
index 1932f104499..b2cdd0db676 100644
--- a/net/openvpn/patches/patch-ac
+++ b/net/openvpn/patches/patch-ac
@@ -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 @@ $NetBSD: patch-ac,v 1.4 2007/02/20 09:40:49 sborrill Exp $
{
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;