]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/perl -w | |
2 | ||
3 | use strict; | |
4 | use PVE::QemuServer; | |
5 | use PVE::Tools qw(run_command); | |
6 | ||
7 | my $iface = shift; | |
8 | ||
9 | die "no interface specified\n" if !$iface; | |
10 | ||
11 | die "got strange interface name '$iface'\n" | |
12 | if $iface !~ m/^tap(\d+)i(\d+)$/; | |
13 | ||
14 | my $vmid = $1; | |
15 | my $netid = "net$2"; | |
16 | ||
17 | my $conf = PVE::QemuServer::load_config ($vmid); | |
18 | ||
19 | die "unable to get network config '$netid'\n" | |
20 | if !$conf->{$netid}; | |
21 | ||
22 | my $net = PVE::QemuServer::parse_net($conf->{$netid}); | |
23 | die "unable to parse network config '$netid'\n" if !$net; | |
24 | ||
25 | my $bridge = $net->{bridge}; | |
26 | die "unable to get bridge setting\n" if !$bridge; | |
27 | ||
28 | system ("/sbin/ifconfig $iface 0.0.0.0 promisc up") == 0 || | |
29 | die "interface activation failed\n"; | |
30 | ||
31 | if ($net->{rate}) { | |
32 | ||
33 | my $rate = int($net->{rate}*1024*1024); | |
34 | my $burst = 1024*1024; | |
35 | ||
36 | system("/sbin/tc qdisc del dev $iface ingres >/dev/null 2>&1"); | |
37 | system("/sbin/tc qdisc del dev $iface root >/dev/null 2>&1"); | |
38 | ||
39 | run_command("/sbin/tc qdisc add dev $iface handle ffff: ingress"); | |
40 | ||
41 | # this does not work wit virtio - don't know why | |
42 | #run_command("/sbin/tc filter add dev $iface parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${rate}bps burst ${burst}b drop flowid :1"); | |
43 | # so we use avrate instead | |
44 | run_command("/sbin/tc filter add dev $iface parent ffff: " . | |
45 | "protocol ip prio 50 estimator 1sec 8sec " . | |
46 | "u32 match ip src 0.0.0.0/0 police avrate ${rate}bps drop flowid :1"); | |
47 | ||
48 | # tbf does not work for unknown reason | |
49 | #$TC qdisc add dev $DEV root tbf rate $RATE latency 100ms burst $BURST | |
50 | # so we use htb instead | |
51 | run_command("/sbin/tc qdisc add dev $iface root handle 1: htb default 1"); | |
52 | run_command("/sbin/tc class add dev $iface parent 1: classid 1:1 " . | |
53 | "htb rate ${rate}bps burst ${burst}b"); | |
54 | ||
55 | # enable this to debug tc | |
56 | if (0) { | |
57 | print "DEBUG tc settings\n"; | |
58 | system("/sbin/tc qdisc ls dev $iface"); | |
59 | system("/sbin/tc class ls dev $iface"); | |
60 | system("/sbin/tc filter ls dev $iface parent ffff:"); | |
61 | } | |
62 | ||
63 | } | |
64 | ||
65 | system ("/usr/sbin/brctl addif $bridge $iface") == 0 || | |
66 | die "can't add interface to bridge\n"; | |
67 | ||
68 | exit 0; |