aboutsummaryrefslogtreecommitdiffstats
path: root/src/fnet/main.c
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-12-30 20:56:03 +0100
committerLibravatar Kristóf Marussy <kris7topher@gmail.com>2020-01-01 03:40:19 +0100
commitc082d90be6396149404704e127f10ec7c9aa79ad (patch)
tree2301e5c31f352d7d1465dcb7d268cb3c55e4a879 /src/fnet/main.c
parentRun dhclient inside the sandbox (diff)
downloadfirejail-c082d90be6396149404704e127f10ec7c9aa79ad.tar.gz
firejail-c082d90be6396149404704e127f10ec7c9aa79ad.tar.zst
firejail-c082d90be6396149404704e127f10ec7c9aa79ad.zip
Wait for link-local address for DHCPv6
dhclient -6 fails if the interface to be configures has no link-local address. This is especially problematic when only DHCPv6 is used (e.g., --ip=none --ip6=dhcp), because the wait for a DHCPv4 lease is usually ample time for the LL address to become available on the IPv6 link. The LL address must not be tenative. Therefore, this patch implements waiting for a non-tentative link-local address in fnet for DHCPv6 configured interfaces. The command fnet waitll <if> waits for an LL address on the interface <if>. Currently, the maximum waiting time is 30 seconds, and the kernel is polled through rtnetlink every 500 milliseconds. These values seem sufficient for virtual bridged networks, e.g., libvirt NAT networks.
Diffstat (limited to 'src/fnet/main.c')
-rw-r--r--src/fnet/main.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/fnet/main.c b/src/fnet/main.c
index 890f842f6..3ef500b5e 100644
--- a/src/fnet/main.c
+++ b/src/fnet/main.c
@@ -47,6 +47,7 @@ static void usage(void) {
47 printf("\tfnet config mac addr\n"); 47 printf("\tfnet config mac addr\n");
48 printf("\tfnet config ipv6 dev ip\n"); 48 printf("\tfnet config ipv6 dev ip\n");
49 printf("\tfnet ifup dev\n"); 49 printf("\tfnet ifup dev\n");
50 printf("\tfnet waitll dev\n");
50} 51}
51 52
52int main(int argc, char **argv) { 53int main(int argc, char **argv) {
@@ -141,6 +142,9 @@ printf("\n");
141 else if (argc == 5 && strcmp(argv[1], "config") == 0 && strcmp(argv[2], "ipv6") == 0) { 142 else if (argc == 5 && strcmp(argv[1], "config") == 0 && strcmp(argv[2], "ipv6") == 0) {
142 net_if_ip6(argv[3], argv[4]); 143 net_if_ip6(argv[3], argv[4]);
143 } 144 }
145 else if (argc == 3 && strcmp(argv[1], "waitll") == 0) {
146 net_if_waitll(argv[2]);
147 }
144 else { 148 else {
145 fprintf(stderr, "Error fnet: invalid arguments\n"); 149 fprintf(stderr, "Error fnet: invalid arguments\n");
146 return 1; 150 return 1;