1 /*
2 * Support routine for configuring link layer address
3 */
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #elif defined(_MSC_VER)
8 #include "config-msvc.h"
9 #endif
10
11 #include "syshead.h"
12 #include "error.h"
13 #include "misc.h"
14 #include "run_command.h"
15 #include "lladdr.h"
16
17 int
set_lladdr(openvpn_net_ctx_t * ctx,const char * ifname,const char * lladdr,const struct env_set * es)18 set_lladdr(openvpn_net_ctx_t *ctx, const char *ifname, const char *lladdr,
19 const struct env_set *es)
20 {
21 int r;
22
23 if (!ifname || !lladdr)
24 {
25 return -1;
26 }
27
28 #if defined(TARGET_LINUX)
29 uint8_t addr[ETH_ALEN];
30
31 sscanf(lladdr, MAC_FMT, MAC_SCAN_ARG(addr));
32 r = (net_addr_ll_set(ctx, ifname, addr) == 0);
33 #else /* if defined(TARGET_LINUX) */
34 struct argv argv = argv_new();
35 #if defined(TARGET_SOLARIS)
36 argv_printf(&argv,
37 "%s %s ether %s",
38 IFCONFIG_PATH,
39 ifname, lladdr);
40 #elif defined(TARGET_OPENBSD)
41 argv_printf(&argv,
42 "%s %s lladdr %s",
43 IFCONFIG_PATH,
44 ifname, lladdr);
45 #elif defined(TARGET_DARWIN)
46 argv_printf(&argv,
47 "%s %s lladdr %s",
48 IFCONFIG_PATH,
49 ifname, lladdr);
50 #elif defined(TARGET_FREEBSD)
51 argv_printf(&argv,
52 "%s %s ether %s",
53 IFCONFIG_PATH,
54 ifname, lladdr);
55 #else /* if defined(TARGET_SOLARIS) */
56 msg(M_WARN, "Sorry, but I don't know how to configure link layer addresses on this operating system.");
57 return -1;
58 #endif /* if defined(TARGET_SOLARIS) */
59 argv_msg(M_INFO, &argv);
60 r = openvpn_execve_check(&argv, es, M_WARN, "ERROR: Unable to set link layer address.");
61 argv_free(&argv);
62 #endif /* if defined(TARGET_LINUX) */
63
64 if (r)
65 {
66 msg(M_INFO, "TUN/TAP link layer address set to %s", lladdr);
67 }
68
69 return r;
70 }
71