Начнем с последнего - варианты Вы сами перечислили - один из них - полисинг - Вы его и реализовали. Только немного неправильно - надо дропать пакеты только тогда, когда средняя скорость превышает заданную. Но результаты Вы сами видите. Правильное решение - это организовывать шейпер, т.е. плавное ограничение. Обычно оно выглядит так:
Код
приемник -> буфер FIFO -> передатчик
Из буфера FIFO пакеты передаются с таким расчетом, чтобы не превысить требуемую скорость передачи.
Приемнику при заполнении FIFO говорится о невозможности приема - например, посылкой pause-фрейма.
В поле отправителя pause-фрейма Вы можете поставить любой MAC. Однако, Вам надо обрабатывать pause-фреймы с обеих сторон - минимум - не пропускать их через себя.
Для простоты, кстати, можно перейти на Half-Duplex (с двух сторон) - там проще обрабатывать, не надо разбирать фреймы.
Кстати, а какое Вам ограничение по скорости нужно? Если устроит ряд
Код
128 кбит/с
256 кбит/с
512 кбит/с
1 Мбит/с
2 Мбит/с
4 Мбит/с
8 Мбит/с
нет ограничения
, то можно взять любой свич-мыльницу на RTL8316,8318,8324 и прошить в нем eeprom с ограничением из данного ряда на нужные порты. Дешевле Вы девайс не разработаете
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин