summaryrefslogtreecommitdiff
path: root/openbsd-compat
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2017-10-23 05:08:00 +0000
committerDamien Miller <djm@mindrot.org>2017-10-23 16:14:30 +1100
commitb7548b12a6b2b4abf4d057192c353147e0abba08 (patch)
treedc76477cd371b6197ba840c3a178bfbcf6d7baba /openbsd-compat
parent887669ef032d63cf07f53cada216fa8a0c9a7d72 (diff)
upstream commit
Expose devices allocated for tun/tap forwarding. At the client, the device may be obtained from a new %T expansion for LocalCommand. At the server, the allocated devices will be listed in a SSH_TUNNEL variable exposed to the environment of any user sessions started after the tunnel forwarding was established. ok markus Upstream-ID: e61e53f8ae80566e9ddc0d67a5df5bdf2f3c9f9e
Diffstat (limited to 'openbsd-compat')
-rw-r--r--openbsd-compat/port-tun.c16
-rw-r--r--openbsd-compat/port-tun.h2
2 files changed, 15 insertions, 3 deletions
diff --git a/openbsd-compat/port-tun.c b/openbsd-compat/port-tun.c
index 7579c6084..0e75c911d 100644
--- a/openbsd-compat/port-tun.c
+++ b/openbsd-compat/port-tun.c
@@ -56,12 +56,15 @@
56#include <linux/if_tun.h> 56#include <linux/if_tun.h>
57 57
58int 58int
59sys_tun_open(int tun, int mode) 59sys_tun_open(int tun, int mode, char **ifname)
60{ 60{
61 struct ifreq ifr; 61 struct ifreq ifr;
62 int fd = -1; 62 int fd = -1;
63 const char *name = NULL; 63 const char *name = NULL;
64 64
65 if (ifname != NULL)
66 *ifname = NULL;
67
65 if ((fd = open("/dev/net/tun", O_RDWR)) == -1) { 68 if ((fd = open("/dev/net/tun", O_RDWR)) == -1) {
66 debug("%s: failed to open tunnel control interface: %s", 69 debug("%s: failed to open tunnel control interface: %s",
67 __func__, strerror(errno)); 70 __func__, strerror(errno));
@@ -99,6 +102,9 @@ sys_tun_open(int tun, int mode)
99 else 102 else
100 debug("%s: %s mode %d fd %d", __func__, ifr.ifr_name, mode, fd); 103 debug("%s: %s mode %d fd %d", __func__, ifr.ifr_name, mode, fd);
101 104
105 if (ifname != NULL && (*ifname = strdup(ifr.ifr_name)))
106 goto failed;
107
102 return (fd); 108 return (fd);
103 109
104 failed: 110 failed:
@@ -116,13 +122,16 @@ sys_tun_open(int tun, int mode)
116#endif 122#endif
117 123
118int 124int
119sys_tun_open(int tun, int mode) 125sys_tun_open(int tun, int mode, char **ifname)
120{ 126{
121 struct ifreq ifr; 127 struct ifreq ifr;
122 char name[100]; 128 char name[100];
123 int fd = -1, sock, flag; 129 int fd = -1, sock, flag;
124 const char *tunbase = "tun"; 130 const char *tunbase = "tun";
125 131
132 if (ifname != NULL)
133 *ifname = NULL;
134
126 if (mode == SSH_TUNMODE_ETHERNET) { 135 if (mode == SSH_TUNMODE_ETHERNET) {
127#ifdef SSH_TUN_NO_L2 136#ifdef SSH_TUN_NO_L2
128 debug("%s: no layer 2 tunnelling support", __func__); 137 debug("%s: no layer 2 tunnelling support", __func__);
@@ -180,6 +189,9 @@ sys_tun_open(int tun, int mode)
180 goto failed; 189 goto failed;
181 } 190 }
182 191
192 if (ifname != NULL && (*ifname = strdup(ifr.ifr_name)))
193 goto failed;
194
183 close(sock); 195 close(sock);
184 return (fd); 196 return (fd);
185 197
diff --git a/openbsd-compat/port-tun.h b/openbsd-compat/port-tun.h
index 103514370..926bc93e1 100644
--- a/openbsd-compat/port-tun.h
+++ b/openbsd-compat/port-tun.h
@@ -22,7 +22,7 @@ struct ssh;
22 22
23#if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD) 23#if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD)
24# define CUSTOM_SYS_TUN_OPEN 24# define CUSTOM_SYS_TUN_OPEN
25int sys_tun_open(int, int); 25int sys_tun_open(int, int, char **);
26#endif 26#endif
27 27
28#if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF) 28#if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF)