[Linux] Доступ к Receive Status Register чипа RTL8139
покажи чтоль это чудо
/* read size+status of next frame from DMA ring buffer */
rx_status = le32_to_cpu (*(u32 *) (rx_ring + ring_offset;
оно?
drivers/net/8139too.c:1971 (rtl8139_rx)
Вопрос, можно ли добраться до этого rx_status'а,
не переписывая сам драйвер, из свой программы.
Как, допустим, к остальным регистрам через обычные
функции доступа к IO-памяти.
Я уточнял, что имеется ввиду.
> Вопрос, можно ли добраться до этого rx_status'а,
> не переписывая сам драйвер, из свой программы.
> Как, допустим, к остальным регистрам через обычные
> функции доступа к IO-памяти.
Что хочется получить в результате?
rx_status привязан к конкретному пакету, причём нетрудно заметить,
что статус обрабатывается и битый пакет дальше драйвера не уйдёт.
Так что если цель - более подробный сбор статистики,
чем реализовано в ядре, то нужно ковырять драйвер.
Если цель - знать значение для последнего полученного пакета,
тоже самое: положение регистра определяется локальными
переменными в драйвере.
чтобы он выдавал каким-то образом не только содержимое
пакета, но и этот самый rx_status. Правда, не хотелось бы
сразу прибегать к столь радикальным действиям.
Но если "более высокоуровневых" методов добраться до
этого регистра нет, то выбирать, получается, не из чего.
Каким образом выдавал? Через сокет что ли? Не существует стандартного интерфейса для того, что ты хочешь.
Через pcap-функции ведь нельзя получить
содержимое rx_status?
Нельзя. Зачем тебе это нужно, если драйвер всё равно отбрасывает битые пакеты?
Будь то неправильная CRC или еще что.
А в статусе все это прописано.
Можно вести всякую статистику в драйвере. Но вот отдавать это программе, которая работает с сетью - нереальный изврат.
легко дописывается драйвер, а нужная инфа выкидывается в /proc...
Всем высказавшимся большое спасибо.
Оставить комментарий
viostar
Собственно требуется найти низкоуровневый (или другой) доступ крегистру статуса принимаемого eth-пакета. Как сказано
в фирменном Realtek'овском листе, этот, так называемый
регистр, находится не в IO пространстве карты (как, скажем,
статус отправляемого пакета а в "Rx packet header".
То есть вроде как перед самим пакетом в FIFO карты RTL8139.
Дело в том, что именно регистр статуса содержит все флаги,
по которым можно судить о "качестве" принятого пакета.
Другие регистры полной информации не дают.
Буду очень признателен любым сведениям относительно
доступа к указанному регистру из-под стандартного линуксового C\C++.
PS Не для себя стараюсь, а усиления зенитно-ракетного щита страны ради.