#!/usr/bin/perl
# $Id: replclass,v 1.7 2001/02/25 09:11:28 stes Exp $

$IPLOG=$ENV{'IPLOG'};

$i=0;
$dev=$ARGV[$i++];
$classhandle=$ARGV[$i++];
$parenthandle=$ARGV[$i++];
$class=$ARGV[$i++];
$rate=$ARGV[$i++];
$allot=$ARGV[$i++];
$weight=$ARGV[$i++];
$prio=$ARGV[$i++];
$maxburst=$ARGV[$i++];
$avpkt=$ARGV[$i++];
$bounded=$ARGV[$i++];
$isolated=$ARGV[$i++];

($handle)=split(/:/,$parenthandle);

open(PIPE,"tc class show dev $dev |");
while (<PIPE>) {
  if (/cbq $handle:/) {
    if (/rate ([\d\w]+)/) {
      $bandwidth=$1;
    }
  }
}
close(PIPE);

if ("$classhandle" eq 'none') {
  $cmd="tc class add dev $dev";
} else {
  $cmd="tc class replace dev $dev classid $classhandle";
}

$cmd="$cmd parent $parenthandle $class bandwidth $bandwidth rate $rate allot $allot weight $weight prio $prio maxburst $maxburst avpkt $avpkt";

if ("$bounded" eq "YES") {
  $cmd="$cmd bounded";
}

if ("$isolated" eq "YES") {
  $cmd="$cmd isolated";
}

system("$cmd") if "x$cmd" ne "x";
system("echo \"$cmd\" >> $IPLOG");

if ("$classhandle" eq 'none') {
  open(PIPE,"tc class show dev $dev |");
  while (<PIPE>) {
    if (/class cbq $handle/) {
      ($c1,$c2,$classhandle) = split(/ /);
    }
  }
  close(PIPE);
}

$h="0x$classhandle";
$h=~s/://;

# why $handle: and not parenthandle ? parenthandle doesn't seem to work
$cmd="tc filter replace dev $dev protocol ip parent $handle: prio 1 handle $h fw classid $classhandle";

system("$cmd") if "x$cmd" ne "x";
system("echo \"$cmd\" >> $IPLOG");

