Вы ограничиваете свой максимальный размер сообщения max_burst (который вначале назначается для tbf- >acity) - поскольку токены tbf-> никогда не превышают этого значения, большие сообщения никогда не будут отправляться из-за этой проверки:
if(bytes <= tbf->tokens) {
tbf->tokens -= bytes;
} else {
return -1;
}
Таким образом, код действительно устанавливает жесткое ограничение для пакета, равное max_burst - поэтому вам следует фрагментировать свои сообщения, если вы хотите этот размер пакета.
Предполагая, что это единственное место в коде, куда вы можете вставить ограничитель, вы можете получить лучший результат, если замените вышеуказанную часть на:
if(tbf->tokens > 0) {
tbf->tokens -= bytes;
} else {
return -1;
}
Семантика будет немного отличаться, но в среднем в течение длительного периода времени она должна приблизительно соответствовать ожидаемой вами скорости. Конечно, если вы отправляете 125 КБ в одном сообщении по каналу 1 Гбит / с, вряд ли можно говорить о скорости 900 Кбит / с - это будет полный пакет пакетов в 1 Гбит / с, и они должны быть где-то в очереди в случае, если есть каналы с более низкой скоростью - следовательно будьте готовы потерять некоторые пакеты в этом случае.
Но, в зависимости от вашего приложения и протокола транспортной сети, который вы используете (TCP / UDP / SCTP / ...?), Вы можете переместить код формирования вниз по стеку - поскольку пакеты в сети обычно являются только в любом случае, максимум 1500 байт (включая различные заголовки сетевых / транспортных протоколов)
Одной вещью, которая может быть интересна для тестирования, является http://www.linuxfoundation.org/en/Net:Netem - если ваша цель состоит в том, чтобы заняться ссылками с меньшей емкостью. Или возьмите пару старых маршрутизаторов с последовательными портами 1 Мбит / с, подключенными друг к другу.