Skip to content

Commit 9fbc5b3

Browse files
committed
tunspace: more robust uplink handling, and direct interface support
1 parent ee60f28 commit 9fbc5b3

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

packages/tunspace/tunspace.defaults

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package 'tunspace'
77
config tunspace "tunspace"
88
option uplink_netns "uplink"
99
option uplink_ifname "br-wan"
10+
option uplink_mode "bridge"
1011
option maintenance_interval 15
1112
option debug 0
1213

packages/tunspace/tunspace.uc

+27-21
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ function load_config(name) {
4040
"debug": int(ts.debug) != 0,
4141
"uplink_netns": ""+ts.uplink_netns,
4242
"uplink_ifname": ""+ts.uplink_ifname,
43+
"uplink_mode": ""+ts.uplink_mode,
4344
"maintenance_interval": int(ts.maintenance_interval),
4445
"wireguard_servers": {},
4546
"wireguard_interfaces": {},
@@ -393,32 +394,37 @@ function wireguard_maintenance(st, cfg) {
393394
}
394395

395396
// TODO: ts_uplink interface leaks into default namespace when uplink namespace is deleted
396-
function uplink_maintenance(nsid, netns, ifname) {
397+
function uplink_maintenance(nsid, netns, ifname, mode) {
397398
let netnsifname = UPLINK_NETNS_IFNAME;
398399

400+
if (interface_exists(netnsifname)) {
401+
// the uplink interface will sometimes leak out of the namespace on shutdown
402+
shell_command("ip link set "+netnsifname+" netns "+netns);
403+
}
404+
399405
if (interface_exists_netns(netnsifname, netns)) {
400-
// try dhcp for 5 seconds
401-
shell_command("ip netns exec "+netns+" udhcpc -f -n -q -A 5 -i "+netnsifname+" -s /usr/share/tunspace/udhcpc.script 2>&1 | grep 'ip addr add'");
406+
shell_command("ip -n "+netns+" link set "+netnsifname+" up");
407+
} else if (!interface_exists(ifname)) {
408+
log(sprintf("missing uplink interface %s", ifname));
409+
return false;
410+
} else if (mode == "direct") {
411+
// move uplink interface directly:
412+
shell_command("ip link set dev "+ifname+" netns "+netns);
413+
shell_command("ip -n "+netns+" link set "+ifname+" name "+netnsifname);
414+
shell_command("ip -n "+netns+" link set "+netnsifname+" up");
415+
} else if (mode == "bridge") {
416+
// or create a macvlan bridge:
417+
shell_command("ip link add "+netnsifname+" link "+ifname+" type macvlan mode bridge");
418+
shell_command("ip link set dev "+netnsifname+" netns "+netns);
419+
shell_command("ip -n "+netns+" link set up "+netnsifname+"");
402420
} else {
403-
if (!interface_exists(ifname)) {
404-
log(sprintf("missing uplink interface %s", ifname));
405-
return false;
406-
} else {
407-
// move uplink interface directly:
408-
// shell_command("ip link set dev "+ifname+" netns "+netns);
409-
// shell_command("ip -n "+netns+" link set "+ifname+" up");
410-
// shell_command("ip -n "+netns+" link set "+ifname+" name "+netnsifname);
411-
412-
// or create a macvlan bridge:
413-
shell_command("ip link add "+netnsifname+" link "+ifname+" type macvlan mode bridge");
414-
shell_command("ip link set dev "+netnsifname+" netns "+netns);
415-
shell_command("ip -n "+netns+" link set up "+netnsifname+"");
416-
417-
// try dhcp for 5 seconds
418-
shell_command("ip netns exec "+netns+" udhcpc -f -n -q -A 5 -i "+netnsifname+" -s /usr/share/tunspace/udhcpc.script 2>&1 | grep 'ip addr add'");
419-
}
421+
log(sprintf("uplink mode must be 'bridge' or 'direct', got '%s'", mode));
422+
return false;
420423
}
421424

425+
// try dhcp for 5 seconds
426+
shell_command("ip netns exec "+netns+" udhcpc -f -n -q -A 5 -i "+netnsifname+" -s /usr/share/tunspace/udhcpc.script 2>&1 | grep 'ip addr add'");
427+
422428
return true;
423429
}
424430

@@ -444,7 +450,7 @@ function boot(st, cfg) {
444450
function tick(st, cfg) {
445451
debug("tick");
446452

447-
if (!uplink_maintenance(st.nsid, cfg.uplink_netns, cfg.uplink_ifname)) {
453+
if (!uplink_maintenance(st.nsid, cfg.uplink_netns, cfg.uplink_ifname, cfg.uplink_mode)) {
448454
log("uplink maintenance failed");
449455
}
450456
wireguard_maintenance(st, cfg);

0 commit comments

Comments
 (0)