Hello everyone.
CONFIGURATION DESCRIPTION:
I have a linux box doing masquerade for two lan''s. Here is a piece of 
mine network config:
eth0 : ISP , one public ip address (DSL modem)
eth1 : lan , private network address fe: 192.168.4.0/24
eth2 : wlan access point performing as lan2wlan bridge , private network 
addes fe. 192.168.67.0/24
This box use 2.6.20 kernel with iptables-1.3.8 and 
iproute-2.6.20-070313. I also use imq hooked as AB.
I have tried to shape eth0''s incoming traffic using imq0 :
===============================start===================================
ifconfig imq0 txqueuelen 30 up
tc qdisc add dev imq0 root handle 1: htb ${root_parm}
#this class have speed corresponding to maximum achieved speed of isp 
connection in particular direction
tc class add dev imq0 parent 1:0 classid 1:1 htb rate ${rate_sum}
ceil ${rate_sum} burst 0kb cburst 0kb ${quantum_sum}
# summarized prio class
tc class add dev imq0 parent 1:1 classid 1:2 htb rate ${rate_prio_sum} 
ceil ${rate_prio_sum} burst 0kb cburst 0kb ${quantum_prio_sum}
#critical prio
tc class add dev imq0 parent 1:2 classid 1:3 htb prio ${prio_crit} rate 
${rate_crit} ceil ${ceil_crit} burst 0kb cburst 0kb ${quantum_crit}
tc filter add dev imq0 parent 1:0 protocol ip prio 0 u32 match mark 3 
0xffff flowid 1:3
#prio voip
tc class add dev imq0 parent 1:2 classid 1:4 htb prio ${prio_voip} rate 
${rate_voip} ceil ${ceil_voip} burst 0kb cburst 0kb ${quantum_voip}
tc filter add dev imq0 parent 1:0 protocol ip prio 1 u32 match mark 4 
0xffff flowid 1:4
#games
tc class add dev imq0 parent 1:2 classid 1:5 htb prio ${prio_ent} rate 
${rate_ent} ceil ${ceil_ent} burst 0kb cburst 0kb ${quantum_ent}
tc filter add dev imq0 parent 1:0 protocol ip prio 2 u32 match mark 5 
0xffff flowid 1:5
# summarized class for generic unclassified traffic
tc class add dev imq0 parent 1:1 classid 1:6 htb rate ${rate_user_sum} 
ceil ${rate_user_sum} burst 0kb cburst 0kb ${quantum_user_sum}
#generic server traffic
tc class add dev imq0 parent 1:6 classid 1:7 htb prio ${prio_srv} rate 
${rate_srv} ceil ${ceil_srv} burst 0kb cburst 0kb ${quantum_srv}
tc filter add dev imq0 parent 1:0 protocol ip prio 4 u32 match ip 
${dev[3]} $server_public_ip flowid 1:7
#default class
tc class add dev imq0 parent 1:6 classid 1:8 htb prio 7 rate 1kbps ceil 
1kbps burst 0kb cburst 0kb quantum 1500
# fe. single user class
tc class add dev imq0 parent 1:6 classid 1:30 htb prio ${prio_user} rate 
${rate_user} ceil ${ceil_user} burst 0kb cburst 0kb ${quantum_user}
tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip 
${dev[3]} 192.168.4.5 flowid 1:30
					
#Each user has his own class for traffic that were not classified for 
#prio classes. Other traffic is probably traffic from "unofficial users 
#so they receive what they deserve :).
#This two functions are responsible for setting up iptables and imq hooking.
skype() 
 
{
#Nasty workaround for skype 
 
if [ ! -r /tmp/1 -o ! -r /tmp/2 ] ; then	
touch /tmp/1 /tmp/2 
 
find /etc/l7-protocols/protocols/ -type f -name *pat |cut -d/ -f5 | cut 
-d. -f1 >/tmp/1 
sed 
''/skype*/d;/finger*/d;/biff*/d;/whois*/d;/tsp*/d;/ntp*/d;/unknown*/d;/sip*/d;/h232*/d;/teamspeak*/d;/ventrilo*/d;/ssh*/d;/jabber*/d;/aim*/d;/msnmessenger*/d;/yahoo*/d;/qq*/d;/battlefield1942/d;/battlefield2/d;/counterstrike-source*/d;/dayofdefeat-source*/d;/doom3*/d;/halflife2-deathmatch*/d;/mohaa*/d;/quake-halflife*/d;/quake1*/d;/worldofwarcraft*/d''
/tmp/1 > /tmp/2
fi
i=`cat /tmp/2|wc -l` 
 
j=1 
 
iptables -t mangle -N ${dev[2]}_SKYPE 
 
iptables -t mangle -A ${dev[2]}_SKYPE -p tcp --sport 1:1024 -j RETURN 
 
iptables -t mangle -A ${dev[2]}_SKYPE -p udp --sport 1:1024 -j RETURN 
 
iptables -t mangle -A ${dev[2]}_SKYPE -p tcp --dport 1:1024 -j RETURN 
 
iptables -t mangle -A ${dev[2]}_SKYPE -p udp --dport 1:1024 -j RETURN 
 
while [ ${j} -le ${i} ]; do
iptables -t mangle -A ${dev[2]}_SKYPE -m layer7 --l7proto `sed -n ${j}p 
/tmp/2` -j RETURN 
j=$(($j+1)) 
 
done
iptables -t mangle -A ${dev[2]}_SKYPE -m layer7 --l7proto skypetoskype 
-j ${dev[2]}_CON_VOIP
iptables -t mangle -A ${dev[2]}_SKYPE -m layer7 --l7proto skypeout -j 
${dev[2]}_CON_VOIP>/dev/null 1>/dev/null 2>/dev/null 3>/dev/null
4>/dev/null
iptables -t mangle -A ${dev[2]}_SKYPE -j RETURN 
}
ipt_int()
{
iptables -t mangle -N ${dev[2]}_CHECK
iptables -t mangle -N ${dev[2]}_IMQ
iptables -t mangle -N ${dev[2]}_PRIO
if [[ ${dev[0]} =~ ''imq0'' ]] ; then
iptables -t mangle -A ${dev[2]}_PRIO -j MARK --set-mark 3
elif [[ ${dev[0]} =~ ''eth0'' ]] ; then
iptables -t mangle -A ${dev[2]}_PRIO -j CLASSIFY --set-class 1:3
else
exit 1
fi
iptables -t mangle -A ${dev[2]}_PRIO -j ${dev[2]}_IMQ
iptables -t mangle -N ${dev[2]}_CON_PRIO
if [[ ${dev[0]} =~ ''imq0'' ]] ; then
iptables -t mangle -A ${dev[2]}_CON_PRIO -j MARK --set-mark 3
elif [[ ${dev[0]} =~ ''eth0'' ]] ; then
iptables -t mangle -A ${dev[2]}_CON_PRIO -j CLASSIFY --set-class 1:3
else
exit 1
fi
iptables -t mangle -A ${dev[2]}_CON_PRIO -j CONNMARK --save-mark
iptables -t mangle -A ${dev[2]}_CON_PRIO -j ${dev[2]}_IMQ
iptables -t mangle -N ${dev[2]}_CON_VOIP
if [[ ${dev[0]} =~ ''imq0'' ]] ; then
iptables -t mangle -A ${dev[2]}_CON_VOIP -j MARK --set-mark 4
elif [[ ${dev[0]} =~ ''eth0'' ]] ; then
iptables -t mangle -A ${dev[2]}_CON_VOIP -j CLASSIFY --set-class 1:4
else
echo coś nie tak w ''ip_int()''
exit 1
fi
iptables -t mangle -A ${dev[2]}_CON_VOIP -j CONNMARK --save-mark
iptables -t mangle -A ${dev[2]}_CON_VOIP -j ${dev[2]}_IMQ
iptables -t mangle -N ${dev[2]}_CON_GRY
if [[ ${dev[0]} =~ ''imq0'' ]] ; then
iptables -t mangle -A ${dev[2]}_CON_GRY -j MARK --set-mark 5
elif [[ ${dev[0]} =~ ''eth0'' ]] ; then
iptables -t mangle -A ${dev[2]}_CON_GRY -j CLASSIFY --set-class 1:5
else
exit 1
fi
iptables -t mangle -A ${dev[2]}_CON_GRY -j CONNMARK --save-mark
iptables -t mangle -A ${dev[2]}_CON_GRY -j ${dev[2]}_IMQ
iptables -t mangle -N ${dev[2]}_GRY
if [[ ${dev[0]} =~ ''imq0'' ]] ; then
iptables -t mangle -A ${dev[2]}_GRY -j MARK --set-mark 5
elif [[ ${dev[0]} =~ ''eth0'' ]] ; then
iptables -t mangle -A ${dev[2]}_GRY -j CLASSIFY --set-class 1:5
else
exit 1
fi
iptables -t mangle -A ${dev[2]}_GRY -j ${dev[2]}_IMQ
iptables -t mangle -A ${dev[2]}_CHECK -m length --length 1:64 -p tcp 
--tcp-flags SYN,FIN,ACK ACK -j ${dev[2]}_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p tcp --tcp-flags SYN,ACK,FIN SYN 
-j ${dev[2]}_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p tcp --tcp-flags SYN,ACK,FIN 
SYN,ACK -j ${dev[2]}_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p tcp --tcp-flags SYN,ACK,FIN 
FIN,ACK -j ${dev[2]}_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p icmp --icmp-type echo-request 
-j ${dev[2]}_GRY
iptables -t mangle -A ${dev[2]}_CHECK -p icmp --icmp-type echo-reply -j 
${dev[2]}_GRY
iptables -t mangle -A ${dev[2]}_CHECK -j CONNMARK --restore-mark
iptables -t mangle -A ${dev[2]}_CHECK -m mark ! --mark 0 -j ${dev[2]}_IMQ
iptables -t mangle -A ${dev[2]}_CHECK -p tcp -m multiport --ports 
22,53,65522 -j ${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p udp -m multiport --ports 
22,53,65522 -j ${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p tcp -m iprange 
--${dev[4]}-range 217.17.41.80-217.17.41.95 -m multiport 
--${dev[6]}ports 8074,443 -j ${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -p tcp -m iprange 
--${dev[4]}-range 217.17.45.128-217.17.45.159 -m multiport 
--${dev[6]}ports 8074,443 -j ${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto ssh -j 
${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto sip -j 
${dev[2]}_CON_VOIP
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto h323 -j 
${dev[2]}_CON_VOIP
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto teamspeak -j 
${dev[2]}_CON_VOIP
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto ventrilo -j 
${dev[2]}_CON_VOIP
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto jabber -j 
${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto aim -j 
${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto msnmessenger 
-j ${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto yahoo -j 
${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto qq -j 
${dev[2]}_CON_PRIO
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto 
battlefield1942 -j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto battlefield2 
-j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto 
counterstrike-source -j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto 
dayofdefeat-source -j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto doom3 -j 
${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto 
halflife2-deathmatch -j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto mohaa -j 
${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto quake-halflife 
-j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto quake1 -j 
${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -m layer7 --l7proto 
worldofwarcraft -j ${dev[2]}_CON_GRY
	
skype
	
iptables -t mangle -A ${dev[2]}_CHECK -j ${dev[2]}_SKYPE
iptables -t mangle -A ${dev[2]}_CHECK -p tcp -m multiport --ports 
27000:27030,28960 -j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -p udp -m multiport --ports 
27000:27030,27901,27960,28960,28960,28960,14567,16567 -j ${dev[2]}_CON_GRY
iptables -t mangle -A ${dev[2]}_CHECK -j ${dev[2]}_IMQ
	
iptables -t mangle -N ${dev[2]}_KONIEC
iptables -t mangle -A ${dev[2]}_KONIEC -j RETURN
	
if [[ ${dev[0]} =~ ''imq(.*)'' ]] ; then
export numdev=${BASH_REMATCH[1]}
iptables -t mangle -A ${dev[2]}_IMQ -j IMQ --todev ${numdev}
fi
iptables -t mangle -A ${dev[2]}_IMQ -j ${dev[2]}_KONIEC
if [[ ${dev[2]} =~ ''DL'' ]] ; then
iptables -t mangle -I ${dev[7]} -i ${dev[1]} -j ${dev[2]}_CHECK
elif [[ ${dev[2]} =~ ''UL'' ]] ; then
iptables -t mangle -I ${dev[7]} -o ${dev[1]} -j ${dev[2]}_CHECK
else
exit 1
fi
}
# Before invoking any function i setup correct data to dev vector:
#example
export dev=(imq0 eth0 DL dst src d s PREROUTING)
===============================stop==================================
I know that my script is really complex one. Check this simplified 
diagram to understand general idea:
-----|
P    |
R    |
E   R|
     O|		           /=YES=>[prio]=><imq/end>
O   U|		          ||
R   T|=>(?mark!=0?)=NO=>(?prio?)=NO=>(?valid
user?)=NO=>[def]=><imq/end>
     I|	    ||				||
P   N|	     \=YES=><imq/end>		 \=YES=>[user]=><imq/end>
O   G|
S    |
T    |
-----|
[] - classifying for proper class (mark or u32)
<imq/end> - packet travels to imq or leaves PRE,POSTROUTING
QUESTIONS AND PROBLEM DESCRIPTION:
1.Main problem.
It seems that classes on imq0 that should shape incoming traffic from 
internet do not recognizes marks. Fw match don''t work. U32 match works 
except matching marks. The only classes that receive traffic on imq0 are 
server class and user classes. Similar problem occurred on eth0(upload) 
but I managed to solve this problem by using -j CLASSIFY instead -j 
MARK. When I tried to fix this problem I have learned that this may be 
caused by the way tc and iptables are works together.I am sure that 
marks are set and IMQ target works (non zero iptables/ifconfig counters) 
. I think that it is possible for u32 matches to classify traffic before 
any mark is set. Unfortunately kptd is out of date so it is not certain 
to me. Would somebody explain me why fwmark do not work on imq0 ?
2.
I have found that when i try to ping from host in lan to host in 
internet every fifth icmp packet has significantly higher delay. F.e. 
four packets goes trough with delay approx 15ms but next packet have 
delay up to 100ms ! I suppose that it may be caused by to big txqueuelen 
so i decreased it from 1000 to 30 on all interfaces without any problems 
with lesser bandwidth or packet looses. Could somebody advice proper 
value for txqueuelen if it was a good idea to change it.
I have 1Mbit/256kbit DSL modem.
3.
Is it a good idea to set proper ToS value for a outbound traffic that 
was classified as prio ?? Would it give any decrease in delays ??
I hope I will find someone helpful and also very tolerant for mine poor 
English ... Posting on LTARC is the only way to solve mine problems....
Bartek
----------------------------------------------------------------------
Bedac w WC czytala wiadomosci.
>>> http://link.interia.pl/f1b71