use Net::IP;
-require "sys/ioctl.ph";
use Socket qw(IPPROTO_IP);
use constant IFF_UP => 1;
use constant IFNAMSIZ => 16;
+use constant SIOCGIFFLAGS => 0x8913;
# host network related utility functions
run_command("/sbin/tc qdisc add dev $iface handle ffff: ingress");
run_command("/sbin/tc filter add dev $iface parent ffff: " .
- "protocol all prio 50 u32 match u32 0 0 " .
+ "prio 50 basic " .
"police rate ${rate}bps burst ${burst}b mtu 64kb " .
"drop flowid :1");
my ($iface, $rate) = @_;
my $debug = 0;
- $rate = int($rate*1024*1024);
+ $rate = int($rate*1024*1024) if $rate;
my $burst = 1024*1024;
setup_tc_rate_limit($iface, $rate, $burst, $debug);
};
sub tap_plug {
- my ($iface, $bridge, $tag, $firewall, $trunks) = @_;
+ my ($iface, $bridge, $tag, $firewall, $trunks, $rate) = @_;
#cleanup old port config from any openvswitch bridge
eval {run_command("/usr/bin/ovs-vsctl del-port $iface", outfunc => sub {}, errfunc => sub {}) };
&$ovs_bridge_add_port($bridge, $iface, $tag, undef, $trunks);
}
}
+
+ tap_rate_limit($iface, $rate);
}
sub tap_unplug {
while(defined(my $line = <$fh>)) {
next if $line !~ /^\s*([^:\s]+):/;
my $ifname = $1;
- my $ifreq = pack($STRUCT_IFREQ_SIOCGIFFLAGS, $1, 0);
- if (!defined(ioctl($sock, &SIOCGIFFLAGS, $ifreq))) {
+ my $ifreq = pack($STRUCT_IFREQ_SIOCGIFFLAGS, $ifname, 0);
+ if (!defined(ioctl($sock, SIOCGIFFLAGS, $ifreq))) {
warn "failed to get interface flags for: $ifname\n";
next;
}
my ($name, $flags) = unpack($STRUCT_IFREQ_SIOCGIFFLAGS, $ifreq);
- push @$ifaces, $1 if ($flags & IFF_UP);
+ push @$ifaces, $ifname if ($flags & IFF_UP);
}
close $fh;
close $sock;