Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение типа hub 
:(
    Опции темы
Mkd
Дата 12.5.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.5.2006

Репутация: нет
Всего: нет



Есть что-то типа драйвера для сетевой карты (библитека функций на Си для Linux: описаны функции инициализации, деинициализации, отправки и приема) . Теперь надо проверить - работают ли они. Для этого надо принять с помощью них пакет из одного места и отправить в другое - написать приложение типа hub на Си. Как это сделать и как сделать так, что бы принимались и отправилялись пакеты именно с помощью моих функций, а не функций драйвера, входящего в Linux? 
PM MAIL   Вверх
GrayCardinal
Дата 13.5.2006, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Mkd, 
Вы хоть сами поняли что спросили ? Скиньте сырцы, может помогу.
 


--------------------
PM MAIL WWW   Вверх
Mkd
Дата 13.5.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bsa
Дата 13.5.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Во-первых, только драйвера могут работать с сетевой картой напрямую. Без них сетевая карта - это лишь набор ресурсов на PCI шине.

Если хочешь заменить стандартный драйвер своим, то ты должен собрать свой как модуль ядра, выгрузить штатный драйвер и загрузить свой. После этого (если kernel panic не случится) ты можешь быть уверенным, что отправка и прием идут с помощью твоих функций. 
PM   Вверх
Mkd
Дата 13.5.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.5.2006

Репутация: нет
Всего: нет



......или может можно проверить работу функций как-нибудь по-другому??? 
PM MAIL   Вверх
bsa
Дата 14.5.2006, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Если драйвер пишешь, то проверить можно, имхо, только боем. 
PM   Вверх
GrayCardinal
Дата 14.5.2006, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



bsa, 
Извините, но насчет того что только драйвера  могут работать с сетевыми карточками напрямую вы немного не правы smile

Mkd, 
Уже легче, однако еще надо уточнять какая у вас архитектура smile Первый вопрос Sysadmin'a - MAC у вас или НЕ MAC ?! smile

Если i386 то можно включить :
(для 2.6-последнего ядра)
iopl ( N )
N - то ли три то ли 0 надо ставить, не знаю, не пробовал. После этого к портам (теоретически, повторюсь, не пробовал) можно из user-space под рутом.

Еще можно mmap - нуть MMIO регистры сетевухи в user-space и получить регистры сетевухи в "void * ptr" (тоже только для i386 архитектуры). Патчик у меня лежит где-то, но я его в интернет выкладывать не собираюсь. Извините. Может другой найдете или свой напишете.

Второй косяк - перевод адресов и выделение области памяти для DMA.
Стандартных средств для перевода адресов не встречал даже. Все "ручками" приходится (это уже малость достало, честно говоря smile ).
Если на сетевухе есть память - по идее должна mmap'иться, и можно спокойно с ней работать. Ежели нет - можно адресное пространство framebuffer видеокарточки использовать под свои нужды (даже девайс есть чтоб ее mmap'ить /dev/fb если не ошибаюсь).

Третий косяк - инициализация. "Нормальные" драйвера придется выгрузить, или подправить чтоб приемные буферы не пользовал. Иначе об приеме придется забыть. Я делал второе, чтоб не заморачиваться на инициализации чипсета.

Еще есть путь - написать свой драйвер, ежели все функции имеются - не должно быть проблемой перенести "это дело" на уровень ядра.  Опять таки вспомню
Linux Device Driver
Там даже "скелет" есть для сетевого драйвера в примерах. Ставите нужные функции инициализации/приема/отправки и все.




 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.