По скорости ничего не смогу посоветовать, так как мне разгонять стек никогда не приходилось.
Посмотрел на код драйвера: это какой-то ад. 2700 строк там, где и в 270 можно уложиться.
Прикладываю свой драйвер для uIP. Пара пояснений:
- Для приёма статически выделен набор буферов (32 штуки по 256 байт). В lwip принято выделять их динамически из специального пула. Соответственно, код будет несколько сложнее, так как будет учитывать возможность исчерпания памяти. Дело в том, что в lwip принятые пакеты будут сидеть в этих буферах до тех пор, пока приложение, обрабатывающее принятые данные, не освободит эти буферы. Я делал
драйвер для ColdFire, где это как раз реализовано.
- Принятый пакет копируется из вышеупомянутых буферов в единый буфер пакета (есть такой в uIP). В lwip буферы с принятыми данными передаются наверх без копирования (zero-copy receive). Опять же, можете подсмотреть в драйвере для ColdFire.
- Отправка сделана из единого буфера пакета. Если использовать такой подход в lwip, то нужно иметь статически выделенный буфер и перед отправкой копировать туда содержимое пакета из цепочки pbuf. На самом деле можно сделать zero-copy transmit (должно работать быстрее, но это несколько сложнее).
- Драйвер ждёт окончания отправки пакета. При интенсивном обмене так можно потерять кучу процессорного времени. Можно реализовать схему без ожидания, но это несколько сложнее.
- Как всё это хозяйство подружить с ОСью (семафоры и т.д.), я не знаю, так как мне это не было нужно.