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