+sub iface_delete($) {
+ my ($iface) = @_;
+ run_command(['/sbin/ip', 'link', 'delete', 'dev', $iface], noerr => 1)
+ == 0 or die "failed to delete interface '$iface'\n";
+}
+
+sub iface_create($$@) {
+ my ($iface, $type, @args) = @_;
+ run_command(['/sbin/ip', 'link', 'add', $iface, 'type', $type, @args], noerr => 1)
+ == 0 or die "failed to create interface '$iface'\n";
+}
+
+sub iface_set($@) {
+ my ($iface, @opts) = @_;
+ run_command(['/sbin/ip', 'link', 'set', $iface, @opts], noerr => 1)
+ == 0 or die "failed to set interface options for '$iface' (".join(' ', @opts).")\n";
+}
+
+# helper for nicer error messages:
+sub iface_set_master($$) {
+ my ($iface, $master) = @_;
+ if (defined($master)) {
+ eval { iface_set($iface, 'master', $master) };
+ die "can't enslave '$iface' to '$master'\n" if $@;
+ } else {
+ eval { iface_set($iface, 'nomaster') };
+ die "can't unenslave '$iface'\n" if $@;
+ }
+}
+