summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2016-01-19 15:52:49 +0100
committerDominique Martinet <asmadeus@codewreck.org>2016-01-19 18:05:51 +0100
commita42885e747326dc5bc0836fd0fc47deea12da41e (patch)
tree7cf39489c7de85679b126cb3e624a0cd1a9c1171
parent03e20919a1bebef06bd10a07ea4e881972b83151 (diff)
network: add macvtap option
-rwxr-xr-xkvm-wrapper.sh31
1 files changed, 25 insertions, 6 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh
index f864661..1dc15aa 100755
--- a/kvm-wrapper.sh
+++ b/kvm-wrapper.sh
@@ -676,22 +676,41 @@ function kvm_start_vm ()
[[ -z "${KVM_BR[@]:0:1}" ]] && fail_exit "No KVM_BR defined"
[[ -z "${KVM_IF[@]:0:1}" ]] && fail_exit "No KVM_IF defined"
for i in ${!KVM_MACADDR[@]}; do
+ local TAPDEV
+
KVM_BR[$i]="${KVM_BR[i]:-${KVM_BR[@]:0:1}}"
KVM_IF[$i]="${KVM_IF[i]:-${KVM_IF[@]:0:1}}"
KVM_NET_OPT[$i]="${KVM_NET_OPT[i]-${KVM_NET_OPT[@]:0:1}}"
KVM_NET_MTU[$i]="${KVM_NET_MTU[i]-${KVM_NET_MTU[@]:0:1}}"
- local TAPDEV
# tapdev can only be 15 chars long, if VM_NAME is too long keep start + last 2 chars
# and pray for no collision...
[[ $(( ${#VM_NAME} + ${#i} )) -le 10 ]] && \
TAPDEV=tap-${VM_NAME:0:$((10-${#i}))}-${i} || \
TAPDEV=tap-${VM_NAME:0:$((8-${#i}))}${VM_NAME:(-2)}-${i}
- KVM_NET+="-netdev type=tap,id=guest${i},ifname=${TAPDEV},script=no,downscript=no${KVM_NET_OPT[i]} -device ${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]} "
- ip tuntap add dev $TAPDEV mode tap ${KVM_USER+user $KVM_USER}
- ip link set $TAPDEV ${KVM_NET_MTU[$i]:+mtu ${KVM_NET_MTU[$i]}} up
- brctl addif ${KVM_BR[i]} $TAPDEV
- CLEANUP+=("ip tuntap del dev $TAPDEV mode tap")
+
+ if [[ -n "$KVM_MACVTAP" ]]; then
+ local TAPFILE
+ local TAPFD
+
+ ip link add link ${KVM_BR[i]} name $TAPDEV address ${KVM_MACADDR[i]} type macvtap mode bridge
+ ip link set $TAPDEV ${KVM_NET_MTU[$i]:+mtu ${KVM_NET_MTU[$i]}} up
+
+ [[ -e "/sys/class/net/$TAPDEV/ifindex" ]] || fail_exit "Could not create interface $TAPDEV"
+ TAPFILE=/dev/tap$(cat "/sys/class/net/$TAPDEV/ifindex")
+ exec {TAPFD}<>${TAPFILE}
+
+ CLEANUP+=("exec ${TAPFD}<>-")
+ CLEANUP+=("ip link del $TAPDEV")
+ KVM_NET+="-netdev type=tap,id=guest${i},fd=${TAPFD}${KVM_NET_OPT[i]} -device ${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]} "
+ else
+ ip tuntap add dev $TAPDEV mode tap ${KVM_USER+user $KVM_USER}
+ ip link set $TAPDEV ${KVM_NET_MTU[$i]:+mtu ${KVM_NET_MTU[$i]}} up
+ brctl addif ${KVM_BR[i]} $TAPDEV
+
+ CLEANUP+=("ip tuntap del dev $TAPDEV mode tap")
+ KVM_NET+="-netdev type=tap,id=guest${i},ifname=${TAPDEV},script=no,downscript=no${KVM_NET_OPT[i]} -device ${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]} "
+ fi
done
}