[pve-devel] [PATCH 1/2] add routed network mode

Dietmar Maurer dietmar at proxmox.com
Tue Aug 27 11:29:17 CEST 2013


---
 Makefile          |    3 ++-
 PVE/QemuServer.pm |   16 +++++++++++++---
 pve-routed        |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 4 deletions(-)
 create mode 100755 pve-routed

diff --git a/Makefile b/Makefile
index 94de359..dea6726 100644
--- a/Makefile
+++ b/Makefile
@@ -60,7 +60,7 @@ qmrestore.1.pod: qmrestore
 vm.conf.5.pod: gen-vmconf-pod.pl PVE/QemuServer.pm 
 	perl -I. ./gen-vmconf-pod.pl >$@
 
-PKGSOURCES=qm qm.1.gz qm.1.pod qmrestore qmrestore.1.pod qmrestore.1.gz qmextract sparsecp vmtar qemu.init.d qmupdate control vm.conf.5.pod vm.conf.5.gz
+PKGSOURCES=qm qm.1.gz qm.1.pod qmrestore qmrestore.1.pod qmrestore.1.gz qmextract sparsecp vmtar qemu.init.d qmupdate control vm.conf.5.pod vm.conf.5.gz pve-bridge pve-routed
 
 .PHONY: install
 install: ${PKGSOURCES}
@@ -79,6 +79,7 @@ install: ${PKGSOURCES}
 	install -D -m 0755 qmupdate ${DESTDIR}${VARLIBDIR}/qmupdate
 	install -D -m 0755 qemu.init.d ${DESTDIR}/etc/init.d/${PACKAGE}
 	install -m 0755 pve-bridge ${DESTDIR}${VARLIBDIR}/pve-bridge
+	install -m 0755 pve-routed ${DESTDIR}${VARLIBDIR}/pve-routed
 	install -s -m 0755 vmtar ${DESTDIR}${LIBDIR}
 	install -s -m 0755 sparsecp ${DESTDIR}${LIBDIR}
 	install -m 0755 qmextract ${DESTDIR}${LIBDIR}
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 4d90484..37817f9 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -1180,7 +1180,9 @@ sub print_netdev_full {
 
     my $vmname = $conf->{name} || "vm$vmid";
 
-    if ($net->{bridge}) {
+    if ($net->{ip}) {
+        return "type=tap,id=$netid,ifname=${ifname},script=/var/lib/qemu-server/pve-routed$vhostparam";
+    } elsif ($net->{bridge}) {
         return "type=tap,id=$netid,ifname=${ifname},script=/var/lib/qemu-server/pve-bridge$vhostparam";
     } else {
         return "type=user,id=$netid,hostname=$vmname";
@@ -1229,6 +1231,8 @@ sub parse_net {
 	    $res->{rate} = $1;
         } elsif ($kvp =~ m/^tag=(\d+)$/) {
             $res->{tag} = $1;
+        } elsif ($kvp =~ m/^ip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) {
+            $res->{ip} = $1;
 	} else {
 	    return undef;
 	}
@@ -1245,9 +1249,15 @@ sub print_net {
 
     my $res = "$net->{model}";
     $res .= "=$net->{macaddr}" if $net->{macaddr};
-    $res .= ",bridge=$net->{bridge}" if $net->{bridge};
+
     $res .= ",rate=$net->{rate}" if $net->{rate};
-    $res .= ",tag=$net->{tag}" if $net->{tag};
+
+    if ($net->{ip}) {
+	$res .= ",ip=$net->{ip}";
+    } else {
+	$res .= ",bridge=$net->{bridge}" if $net->{bridge};
+	$res .= ",tag=$net->{tag}" if $net->{tag};
+    }
 
     return $res;
 }
diff --git a/pve-routed b/pve-routed
new file mode 100755
index 0000000..183dbd2
--- /dev/null
+++ b/pve-routed
@@ -0,0 +1,46 @@
+#!/usr/bin/perl -w
+
+use strict;
+use PVE::QemuServer;
+use PVE::Tools qw(run_command);
+use PVE::Network;
+
+my $iface = shift;
+
+die "no interface specified\n" if !$iface;
+
+die "got strange interface name '$iface'\n" 
+    if $iface !~ m/^tap(\d+)i(\d+)$/;
+
+my $vmid = $1;
+my $netid = "net$2";
+
+my $migratedfrom = $ENV{PVE_MIGRATED_FROM};
+
+my $conf = PVE::QemuServer::load_config($vmid, $migratedfrom);
+
+die "unable to get network config '$netid'\n"
+    if !$conf->{$netid};
+
+my $net = PVE::QemuServer::parse_net($conf->{$netid});
+die "unable to parse network config '$netid'\n" if !$net;
+
+die "missing ip address\n" if !$net->{ip};
+
+sub enable_proxyarp {
+    my ($ifname) = @_;
+
+    PVE::Tools::run_command("echo 1 > /proc/sys/net/ipv4/conf/$ifname/proxy_arp");
+}
+
+PVE::Tools::run_command("ifconfig $iface up");
+enable_proxyarp($iface);
+
+my $external_iface = 'vmbr0'; # fixme: autotetect?
+enable_proxyarp($external_iface);
+
+PVE::Tools::run_command("route add -net $net->{ip} netmask 255.255.255.255 dev $iface");
+
+PVE::Network::tap_rate_limit($iface, $net->{rate}) if $net->{rate};
+
+exit 0;
-- 
1.7.10.4




More information about the pve-devel mailing list