diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2016-01-19 15:52:49 +0100 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2016-01-19 18:05:51 +0100 |
commit | a42885e747326dc5bc0836fd0fc47deea12da41e (patch) | |
tree | 7cf39489c7de85679b126cb3e624a0cd1a9c1171 | |
parent | 03e20919a1bebef06bd10a07ea4e881972b83151 (diff) |
network: add macvtap option
-rwxr-xr-x | kvm-wrapper.sh | 31 |
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 } |