* Added --route-metric option to set a default route metric
for --route (Roy Marples).
-
+
+* Added --lladdr option to specify the link layer (MAC) address
+ for the tap interface on non-Windows platforms (Roy Marples).
+
2006.04.12 -- Version 2.1-beta13
* Code added in 2.1-beta7 and 2.0.6-rc1 to extend byte counters
fragment.c fragment.h \
gremlin.c gremlin.h \
helper.c helper.h \
+ lladdr.c lladdr.h \
init.c init.h \
integer.h \
interval.c interval.h \
#include "gremlin.h"
#include "pkcs11.h"
#include "ps.h"
+#include "lladdr.h"
#include "memdbg.h"
"options --mktun or --rmtun should only be used together with --dev");
tuncfg (options->dev, options->dev_type, options->dev_node,
options->tun_ipv6, options->persist_mode);
+ if (options->persist_mode && options->lladdr)
+ set_lladdr(options->dev, options->lladdr, NULL);
return true;
}
#endif
open_tun (c->options.dev, c->options.dev_type, c->options.dev_node,
c->options.tun_ipv6, c->c1.tuntap);
+ /* set the hardware address */
+ if (c->options.lladdr)
+ set_lladdr(c->c1.tuntap->actual_name, c->options.lladdr, c->c2.es);
+
/* do ifconfig */
if (!c->options.ifconfig_noexec
&& ifconfig_order () == IFCONFIG_AFTER_TUN_OPEN)
--- /dev/null
+/*
+ * Support routine for configuring link layer address
+ */
+
+#ifdef WIN32
+#include "config-win32.h"
+#else
+#include "config.h"
+#endif
+
+#include "syshead.h"
+#include "error.h"
+#include "misc.h"
+
+int set_lladdr(const char *ifname, const char *lladdr,
+ const struct env_set *es)
+{
+ char cmd[256];
+
+ if (!ifname || !lladdr)
+ return -1;
+
+#if defined(TARGET_LINUX)
+#ifdef CONFIG_FEATURE_IPROUTE
+ openvpn_snprintf (cmd, sizeof (cmd),
+ IPROUTE_PATH " link set addr %s dev %s",
+ lladdr, ifname);
+#else
+ openvpn_snprintf (cmd, sizeof (cmd),
+ IFCONFIG_PATH " %s hw ether %s",
+ ifname, lladdr);
+#endif
+#elif defined(TARGET_SOLARIS)
+ openvpn_snprintf (cmd, sizeof (cmd),
+ IFCONFIG_PATH " %s ether %s",
+ ifname, lladdr);
+#elif defined(TARGET_OPENBSD)
+ openvpn_snprintf (cmd, sizeof (cmd),
+ IFCONFIG_PATH " %s lladdr %s",
+ ifname, lladdr);
+#elif defined(TARGET_DARWIN)
+ openvpn_snprintf (cmd, sizeof (cmd),
+ IFCONFIG_PATH " %s lladdr %s",
+ ifname, lladdr);
+#elif defined(TARGET_FREEBSD)
+ openvpn_snprintf (cmd, sizeof (cmd),
+ IFCONFIG_PATH " %s ether %s",
+ ifname, lladdr);
+#else
+ msg (M_WARN, "Sorry, but I don't know how to configure link layer addresses on this operating system.");
+ return -1;
+#endif
+
+ int r = system_check (cmd, es, M_WARN, "ERROR: Unable to set link layer address.");
+ if (r)
+ msg (M_INFO, "TUN/TAP link layer address set to %s", lladdr);
+ return r;
+}
--- /dev/null
+/*
+ * Support routine for configuring link layer address
+ */
+
+#include "misc.h"
+
+int set_lladdr(const char *ifname, const char *lladdr,
+ const struct env_set *es);
integer.h \
interval.h \
list.h \
+ lladdr.h \
lzo.h \
manage.h \
mbuf.h \
init.o \
interval.o \
list.o \
+ lladdr.o \
lzo.o \
manage.o \
mbuf.o \
[\ \fB\-\-dev\fR\ \fItunX\ |\ tapX\fR\ ]
[\ \fB\-\-dev\-type\fR\ \fIdevice\-type\fR\ ]
[\ \fB\-\-dev\-node\fR\ \fInode\fR\ ]
+[\ \fB\-\-lladdr\fR\ \fIaddress\fR\ ]
.in -4
.ti +4
.hy
adapters and will show both the network
connections control panel name and the GUID for
each TAP-Win32 adapter.
+.TP
+.B --lladdr address
+Specify the link layer address, more commonly known as the MAC address.
+Only applied to TAP devices.
.\"*********************************************************
.TP
.B --ifconfig l rn
" does not begin with \"tun\" or \"tap\".\n"
"--dev-node node : Explicitly set the device node rather than using\n"
" /dev/net/tun, /dev/tun, /dev/tap, etc.\n"
+ "--lladdr hw : Set the link layer address of the tap device.\n"
"--topology t : Set --dev tun topology: 'net30', 'p2p', or 'subnet'.\n"
"--tun-ipv6 : Build tun link capable of forwarding IPv6 traffic.\n"
"--ifconfig l rn : TUN: configure device to use IP address l as a local\n"
SHOW_STR (dev);
SHOW_STR (dev_type);
SHOW_STR (dev_node);
+ SHOW_STR (lladdr);
SHOW_INT (topology);
SHOW_BOOL (tun_ipv6);
SHOW_STR (ifconfig_local);
if (options->inetd == INETD_NOWAIT && dev != DEV_TYPE_TAP)
msg (M_USAGE, "--inetd nowait only makes sense in --dev tap mode");
+
+ if (options->lladdr && dev != DEV_TYPE_TAP)
+ msg (M_USAGE, "--lladdr can only be used in --dev tap mode");
+
/*
* In forking TCP server mode, you don't need to ifconfig
* the tap device (the assumption is that it will be bridged).
VERIFY_PERMISSION (OPT_P_GENERAL);
options->dev_node = p[1];
}
+ else if (streq (p[0], "lladdr") && p[1])
+ {
+ VERIFY_PERMISSION (OPT_P_UP);
+ options->lladdr = p[1];
+ }
else if (streq (p[0], "topology") && p[1])
{
VERIFY_PERMISSION (OPT_P_UP);
const char *dev;
const char *dev_type;
const char *dev_node;
+ const char *lladdr;
int topology; /* one of the TOP_x values from proto.h */
const char *ifconfig_local;
const char *ifconfig_remote_netmask;