1) если только один юзверь забивает канал, тогда отдать его полностью
2) если начинают несколько качать, разделить жестко канал между всеми
пробовал такое:
#----------------------------------------------------
# configure bandwidth and weights (dynamic shaping)#
#----------------------------------------------------
#upload
ipfw pipe 1 config bw 640Kbit/s queue 40 gred 0.002/10/30/0.1
ipfw queue 1 config mask src-ip 0xffffffff pipe 1 queue 5 gred 0.002/10/30/0.1
#download
ipfw pipe 3 config bw 640Kbit/s queue 40 gred 0.002/10/30/0.1
ipfw queue 2 config mask dst-ip 0xffffffff pipe 3 queue 5 gred 0.002/10/30/0.1
#---------------------------------------------------------------
# assign each client its bandwidth priority (dynamic shaping) #
#---------------------------------------------------------------
#upload
ipfw add 100 queue 1 ip from 192.168.0.0/24 to any out via fxp0
#download
ipfw add 120 queue 2 ip from any to 192.168.0.0/24 in via fxp0
Результат плачевный. Даже если несколько юзверей открывают по одному соединению и качают, у всех скорость скачет сказочно. То есть не стоит ровно на определенной отметке. Еще хуже если юзвери открывают разное количество соединений, в смысле один качает через Internet Explorer, т.е. в одно соединение, а другой, например, запустил eDonkey и качает от 50 пиров одновременно. Так вот второй, который с eDonkey, практически отбирает весь канал у первого.
Задумал написать демона на Perl который бы следил за изменением счетчиков в IPFW и соответственно конфигурировал бы "на лету" DUMMYNET на жесткое разделение канала для каждого юзверя. Т.е. если счетчик по какому-либо IP адрессу не меняется, увеличить bw пайпов остальных юзверей и уменьшить до 1 KByte/s у данного юзверя.
Жесткое разделение это в смысле:
#----------------------------------------------------------------
# configure bandwidth for each user (hard limits on each user) #
#----------------------------------------------------------------
#upload
ipfw pipe 2 config bw 128Kbit/s queue 30 gred 0.002/10/30/0.1
#download
ipfw pipe 4 config bw 128Kbit/s queue 30 gred 0.002/10/30/0.1
#----------------------------------------------------------------
# assign each user its bandwidth (hard limits) #
#----------------------------------------------------------------
#upload
ipfw add 101 pipe 2 ip from 192.168.0.1 to any out via fxp0
#download
ipfw add 121 pipe 4 ip from any to 192.168.0.1 in via fxp0
Как вариант, очень просто можно было бы раздавать Инет через PPTP, на сервере поставить MPD и использовать set iface up-script и set iface down-script для запуска скрипта который игрался бы с bw и pipes. Только проблема в том что у меня не получается заставить работать нормально MPD. Здесь подробнее.
Думаю что извращятся никогда не поздно, надо сначала выяснить если возможно этого добиться простой настройкой pipes и queues?

