@@ -40,6 +40,7 @@ function load_config(name) {
40
40
"debug" : int(ts .debug ) != 0 ,
41
41
"uplink_netns" : "" +ts .uplink_netns ,
42
42
"uplink_ifname" : "" +ts .uplink_ifname ,
43
+ "uplink_mode" : "" +ts .uplink_mode ,
43
44
"maintenance_interval" : int(ts .maintenance_interval ),
44
45
"wireguard_servers" : {},
45
46
"wireguard_interfaces" : {},
@@ -393,32 +394,37 @@ function wireguard_maintenance(st, cfg) {
393
394
}
394
395
395
396
// 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 ) {
397
398
let netnsifname = UPLINK_NETNS_IFNAME ;
398
399
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
+
399
405
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 +"" );
402
420
} 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 ;
420
423
}
421
424
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
+
422
428
return true ;
423
429
}
424
430
@@ -444,7 +450,7 @@ function boot(st, cfg) {
444
450
function tick (st , cfg ) {
445
451
debug ("tick" );
446
452
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 )) {
448
454
log ("uplink maintenance failed" );
449
455
}
450
456
wireguard_maintenance (st , cfg );
0 commit comments