![]() |
|
Модераторы: xvr |
![]()
|
|
| Mkd |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 12.5.2006 Репутация: нет Всего: нет |
Есть что-то типа драйвера для сетевой карты (библитека функций на Си для Linux: описаны функции инициализации, деинициализации, отправки и приема) . Теперь надо проверить - работают ли они. Для этого надо принять с помощью них пакет из одного места и отправить в другое - написать приложение типа hub на Си. Как это сделать и как сделать так, что бы принимались и отправилялись пакеты именно с помощью моих функций, а не функций драйвера, входящего в Linux?
|
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Mkd,
Вы хоть сами поняли что спросили ? Скиньте сырцы, может помогу. |
|||
|
||||
| Mkd |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 12.5.2006 Репутация: нет Всего: нет |
карта rtl8139
Отправка: static void rtl_transmit(struct nic *nic, const char *destaddr, unsigned int type, unsigned int len, const char *data) { unsigned int status, to, nstype; unsigned long txstatus; memcpy(tx_buffer, destaddr, ETH_ALEN); memcpy(tx_buffer + ETH_ALEN, nic->node_addr, ETH_ALEN); nstype = htons(type); memcpy(tx_buffer + 2 * ETH_ALEN, (char*)&nstype, 2); memcpy(tx_buffer + ETH_HLEN, data, len); len += ETH_HLEN; #ifdefDEBUG_TX printf("sending %d bytes ethtype %x\n", len, type); #endif while (len < ETH_ZLEN) { tx_buffer[len++] = '\0'; } outl((unsigned long)tx_buffer, ioaddr + TxAddr0 + cur_tx*4); outl(((TX_FIFO_THRESH<<11) & 0x003f0000) | len, ioaddr + TxStatus0 + cur_tx*4); to = currticks() + RTL_TIMEOUT; do { status = inw(ioaddr + IntrStatus); outw(status & (TxOK | TxErr | PCIErr), ioaddr + IntrStatus); if ((status & (TxOK | TxErr | PCIErr)) != 0) break; } while (currticks() < to); txstatus = inl(ioaddr+ TxStatus0 + cur_tx*4); if (status & TxOK) { cur_tx = (cur_tx + 1) % NUM_TX_DESC; } else { rtl_reset(nic); } } Прием: static int rtl_poll(struct nic *nic) { unsigned int status; unsigned int ring_offs; unsigned int rx_size, rx_status; if (inb(ioaddr + ChipCmd) & RxBufEmpty) { return 0; } status = inw(ioaddr + IntrStatus); outw(status & ~(RxFIFOOver | RxOverflow | RxOK), ioaddr + IntrStatus); ring_offs = cur_rx % RX_BUF_LEN; rx_status = *(unsigned int*)(rx_ring + ring_offs); rx_size = rx_status >> 16; rx_status &= 0xffff; if ((rx_status & (RxBadSymbol|RxRunt|RxTooLong|RxCRCErr|RxBadAlign)) || (rx_size < ETH_ZLEN) || (rx_size > ETH_FRAME_LEN + 4)) { printf("rx error %x\n", rx_status); rtl_reset(nic); return 0; } nic->packetlen = rx_size - 4; if (ring_offs+4+rx_size-4 > RX_BUF_LEN) { int semi_count = RX_BUF_LEN - ring_offs - 4; memcpy(nic->packet, rx_ring + ring_offs + 4, semi_count); memcpy(nic->packet+semi_count, rx_ring, rx_size-4-semi_count); } else { memcpy(nic->packet, rx_ring + ring_offs + 4, nic->packetlen); } cur_rx = (cur_rx + rx_size + 4 + 3) & ~3; outw(cur_rx - 16, ioaddr + RxBufPtr); outw(status & (RxFIFOOver | RxOverflow | RxOK), ioaddr + IntrStatus); return 1; описание всех переменных тоже есть Это сообщение отредактировал(а) Mkd - 13.5.2006, 20:37 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Во-первых, только драйвера могут работать с сетевой картой напрямую. Без них сетевая карта - это лишь набор ресурсов на PCI шине.
Если хочешь заменить стандартный драйвер своим, то ты должен собрать свой как модуль ядра, выгрузить штатный драйвер и загрузить свой. После этого (если kernel panic не случится) ты можешь быть уверенным, что отправка и прием идут с помощью твоих функций. |
|||
|
||||
| Mkd |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 12.5.2006 Репутация: нет Всего: нет |
......или может можно проверить работу функций как-нибудь по-другому???
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Если драйвер пишешь, то проверить можно, имхо, только боем.
|
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
bsa,
Извините, но насчет того что только драйвера могут работать с сетевыми карточками напрямую вы немного не правы Mkd, Уже легче, однако еще надо уточнять какая у вас архитектура Если i386 то можно включить : (для 2.6-последнего ядра) iopl ( N ) N - то ли три то ли 0 надо ставить, не знаю, не пробовал. После этого к портам (теоретически, повторюсь, не пробовал) можно из user-space под рутом. Еще можно mmap - нуть MMIO регистры сетевухи в user-space и получить регистры сетевухи в "void * ptr" (тоже только для i386 архитектуры). Патчик у меня лежит где-то, но я его в интернет выкладывать не собираюсь. Извините. Может другой найдете или свой напишете. Второй косяк - перевод адресов и выделение области памяти для DMA. Стандартных средств для перевода адресов не встречал даже. Все "ручками" приходится (это уже малость достало, честно говоря Если на сетевухе есть память - по идее должна mmap'иться, и можно спокойно с ней работать. Ежели нет - можно адресное пространство framebuffer видеокарточки использовать под свои нужды (даже девайс есть чтоб ее mmap'ить /dev/fb если не ошибаюсь). Третий косяк - инициализация. "Нормальные" драйвера придется выгрузить, или подправить чтоб приемные буферы не пользовал. Иначе об приеме придется забыть. Я делал второе, чтоб не заморачиваться на инициализации чипсета. Еще есть путь - написать свой драйвер, ежели все функции имеются - не должно быть проблемой перенести "это дело" на уровень ядра. Опять таки вспомню Linux Device Driver Там даже "скелет" есть для сетевого драйвера в примерах. Ставите нужные функции инициализации/приема/отправки и все. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |