Возникла задача из старого шейпера генерировать новый но с хешами, для этого парсю старый с которого выбираю IP и скорость абонента:
| Код | while ($line=<F>) { if ($line=~ /rate\s(\d+bit)\sceil\s(\d+bit)\sprio\s\d\squantum\s(\d+)/) { push (@array_r,"$1"); push (@array_c,"$2"); push (@array_q,"$3"); } elsif ($line=~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s)/) { $ip=$1; chop($ip); push (@array_i, "$ip"); } }
|
трудность состоит в том что у нас 4 сети /16, правила нужно создавать для сетей /24. В цыкле для /16 это выглядит так:
| Код | print OFIL <<EOF; #################################################################################### # init hash filters 10.30.0.0/16$ret $tc filter add dev $dev parent 12: prio 3 handle 3: protocol ip u32 divisor 256$ret $tc filter add dev $dev parent 12: prio 3 handle 4: protocol ip u32 divisor 256$ret $tc filter add dev $dev protocol ip parent 12: prio 3 u32 match ip $DIRECT 10.30.0.0/16 hashkey mask 0x0000ff00 at $p $tc filter add dev $dev protocol ip parent 12: prio 3 u32 match ip $DIRECT 10.30.0.0/16 hashkey mask 0x000000ff at $p EOF for ($ind=0; $ind<=$#array_i; $ind++) { $array_i[$ind]=~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; my $c1=$1; my $c2=$2; my $c3=$3; my $c4=$4; my $hex_c3 = sprintf "%x",$c3; my $hex_c4 = sprintf "%x",$c4; my $qh = $qhandle++; my $sqh = sprintf("%04x", $qh); if ($1==10) { if ($2==30) { printf OFIL "$tc class add dev $dev parent 12: classid 12:$sqh htb rate $array_c[$ind] ceil $array_c[$ind] qu printf OFIL "$tc qdisc add dev $dev parent 12:$sqh handle $sqh: sfq perturb 5$ret\n"; printf OFIL "$tc filter add dev $dev protocol ip parent 12: prio 7 u32 ht 3:$hex_c3: ht 4:$hex_c4: match ip $ printf OFIL "\n"; } } } printf OFIL "$tc filter add dev $dev protocol ip parent 12:0 prio 4 u32 match ip $DIRECT 10.30.0.0/16 flowid 1:3$ret
|
Но нужно сделать также только для каждой сети /24 в этой сети /16. С перлом знаком неделю.... Что подскажете?
|