OpenVPN
lladdr.c
Go to the documentation of this file.
1/*
2 * Support routine for configuring link layer address
3 */
4
5#ifdef HAVE_CONFIG_H
6#include "config.h"
7#endif
8
9#include "syshead.h"
10#include "error.h"
11#include "misc.h"
12#include "run_command.h"
13#include "lladdr.h"
14#include "proto.h"
15
16#ifdef TARGET_LINUX
17static int
18set_lladdr_linux(openvpn_net_ctx_t *ctx, const char *ifname, const char *lladdr)
19{
20 uint8_t addr[OPENVPN_ETH_ALEN];
21
22 sscanf(lladdr, MAC_FMT, MAC_SCAN_ARG(addr));
23 return (net_addr_ll_set(ctx, ifname, addr) == 0);
24}
25#else /* TARGET_LINUX */
26
27#if defined(TARGET_OPENBSD) || defined(TARGET_FREEBSD) || defined(TARGET_DARWIN)
28#define IFCONFIG_LLADDR_FMT "%s %s lladdr %s"
29#elif defined(TARGET_NETBSD)
30#define IFCONFIG_LLADDR_FMT "%s %s link %s active"
31#endif
32static int
33set_lladdr_ifconfig(const char *ifname, const char *lladdr, const struct env_set *es)
34{
35#ifdef IFCONFIG_LLADDR_FMT
36 struct argv argv = argv_new();
37 argv_printf(&argv, IFCONFIG_LLADDR_FMT, IFCONFIG_PATH, ifname, lladdr);
39 int r = openvpn_execve_check(&argv, es, M_WARN, "ERROR: Unable to set link layer address.");
41 return r;
42#else
43 msg(M_WARN,
44 "Sorry, but I don't know how to configure link layer addresses on this operating system.");
45 return -1;
46#endif
47}
48#endif /* TARGET_LINUX */
49
50int
51set_lladdr(openvpn_net_ctx_t *ctx, const char *ifname, const char *lladdr, const struct env_set *es)
52{
53 if (!ifname || !lladdr)
54 {
55 return -1;
56 }
57
58#if defined(TARGET_LINUX)
59 int r = set_lladdr_linux(ctx, ifname, lladdr);
60#else
61 int r = set_lladdr_ifconfig(ifname, lladdr, es);
62#endif
63
64 if (r > 0)
65 {
66 msg(M_INFO, "TUN/TAP link layer address set to %s", lladdr);
67 }
68
69 return r;
70}
void argv_msg(const msglvl_t msglevel, const struct argv *a)
Write the arguments stored in a struct argv via the msg() command.
Definition argv.c:242
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
Definition argv.c:101
bool argv_printf(struct argv *argres, const char *format,...)
printf() variant which populates a struct argv.
Definition argv.c:438
struct argv argv_new(void)
Allocates a new struct argv and ensures it is initialised.
Definition argv.c:87
#define M_INFO
Definition errlevel.h:54
static int set_lladdr_ifconfig(const char *ifname, const char *lladdr, const struct env_set *es)
Definition lladdr.c:33
int set_lladdr(openvpn_net_ctx_t *ctx, const char *ifname, const char *lladdr, const struct env_set *es)
Definition lladdr.c:51
#define MAC_SCAN_ARG(_mac)
Definition misc.h:228
#define MAC_FMT
Definition misc.h:225
void * openvpn_net_ctx_t
Definition networking.h:38
#define msg(flags,...)
Definition error.h:152
#define M_WARN
Definition error.h:92
#define OPENVPN_ETH_ALEN
Definition proto.h:52
int openvpn_execve_check(const struct argv *a, const struct env_set *es, const unsigned int flags, const char *error_message)
Definition argv.h:35
struct env_set * es