|
|
  |
FPGA - Ethernet - PC, Как лучше организовать? |
|
|
|
Aug 11 2011, 09:19
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(gosu-art @ Aug 11 2011, 13:06)  Я имел в виду что если ARP ответа не будет, то компутер (если уже нет этого адреса в ARP таблице) не пошлет ICMP пакет! Угу Цитата Смотрю... ARP запросы не доходят до меня, какие то левые идут не с моим IP. ставлю брейк пойнт в ф-ции send_arp_reply. ничего...  Возможно MAC адрес вашей платы уже лежит в кэше ARP. Очистите его (arp -d *) и сделайте ping.
|
|
|
|
|
Aug 11 2011, 10:41
|

Частый гость
 
Группа: Свой
Сообщений: 136
Регистрация: 19-10-10
Из: Киев
Пользователь №: 60 262

|
Цитата(bark @ Aug 11 2011, 13:01)  ещё учтите что если свич какой-нить умный, то после включения железяки или изменения её параметров (как правило МАС) некоторое время (обновление ARP таблиц от 2 до 10 минут) свитч может не пропускать нормально пакеты. если свитч сильно умный, то у него может быть своя таблица маршрутизации и пакеты с устройства МАС которого не в его базе разрешенных адресов, вообще никуда лететь не будут. У меня МАС от Igor Mochor + самописный стек с UDP уровнем+самый простой свитч D-Link пол года полет нормальный.
|
|
|
|
|
Aug 11 2011, 10:46
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
При пинге компьютер не получает ARP ответа... А железяка не получает ARP запроса Хотя получает, но от других адресов. И в функцию он благополучно заходит! Но ответ не посылает т.к. IPшники da и ta не те вообще... Собственно ф-ция обработки ARP запроса Код unsigned char process_arp_packet(unsigned char *buf) { arp_pkt_xp arp_pkt = (arp_pkt_xp )(buf + sizeof(ether_hdr_t)); if (arp_pkt->opcode[1] != ARP_OPCODE_REQ_1) { if (arp_pkt->opcode[1] == ARP_OPCODE_REPLY_1) { if (!memcmp(my_ip, arp_pkt->ip_sa, IP_ADDR_LEN)) { //printf("IP conflict with MAC"); //printf("%02x:%02x:%02x:%02x:%02x:%02x",arp_pkt->mac_sa[0],arp_pkt->mac_sa[1],arp_pkt->mac_sa[2],arp_pkt->mac_sa[3],arp_pkt->mac_sa[4],arp_pkt->mac_sa[5]); } } return ERR; }
if (memcmp(my_ip, arp_pkt->ip_ta, IP_ADDR_LEN)) { return ERR; } return send_arp_reply(buf); } UPD: у меня этот стоит!
|
|
|
|
|
Aug 11 2011, 11:41
|

Частый гость
 
Группа: Свой
Сообщений: 136
Регистрация: 19-10-10
Из: Киев
Пользователь №: 60 262

|
Цитата(bark @ Aug 11 2011, 15:21)  artix и? не понял суть поста. вот с этим свичем http://www.dlink.ru/ru/products/2/26_b.html пару часов пропарился, когда мне врулили кабель обжатый Машина-Машина, а не Машина-Свитч : пинг как и все остальное не пролезало к остальным устройствам  Цитата(gosu-art @ Aug 11 2011, 14:46)  При пинге компьютер не получает ARP ответа... А железяка не получает ARP запроса Хотя получает, но от других адресов. И в функцию он благополучно заходит! Но ответ не посылает т.к. IPшники da и ta не те вообще... Собственно ф-ция обработки ARP запроса Код unsigned char process_arp_packet(unsigned char *buf) { arp_pkt_xp arp_pkt = (arp_pkt_xp )(buf + sizeof(ether_hdr_t)); if (arp_pkt->opcode[1] != ARP_OPCODE_REQ_1) { if (arp_pkt->opcode[1] == ARP_OPCODE_REPLY_1) { if (!memcmp(my_ip, arp_pkt->ip_sa, IP_ADDR_LEN)) { //printf("IP conflict with MAC"); //printf("%02x:%02x:%02x:%02x:%02x:%02x",arp_pkt->mac_sa[0],arp_pkt->mac_sa[1],arp_pkt->mac_sa[2],arp_pkt->mac_sa[3],arp_pkt->mac_sa[4],arp_pkt->mac_sa[5]); } } return ERR; }
if (memcmp(my_ip, arp_pkt->ip_ta, IP_ADDR_LEN)) { return ERR; } return send_arp_reply(buf); } UPD: у меня этот стоит! не силен в С но я чего то не наблюдаю где вы тут указываете свой МАС в пакете который возвращаете в качестве ответа  там есть пример формирования ARP http://ru.wikipedia.org/wiki/ARP
Сообщение отредактировал artix - Aug 11 2011, 11:42
|
|
|
|
|
Aug 11 2011, 11:48
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
2 bark сниффером я и смотрю! ARP от компа идут, к компу ответы - нет=>нет ping'а. МАС не нулевой стоит! А он увидел нуль по пингуемому адресу=> по этому аресу никого нет (физически). Вопрос: А как перевести железяку на другую подсеть? 2 artix Цитата unsigned char send_arp_reply(unsigned char *buf) { /* Modify the packet in place */
arp_pkt_xp arp_pkt = (arp_pkt_xp )(buf + sizeof(ether_hdr_t)); eth_hdr_xp eth_hdr = (eth_hdr_xp ) buf;
memcpy(eth_hdr->da, eth_hdr->sa, ETH_ADDR_LEN); memcpy(eth_hdr->sa, my_mac, ETH_ADDR_LEN); arp_pkt->opcode[1] = ARP_OPCODE_REPLY_1; memcpy(arp_pkt->mac_ta, arp_pkt->mac_sa, ETH_ADDR_LEN); memcpy(arp_pkt->ip_ta, arp_pkt->ip_sa, IP_ADDR_LEN); memcpy(arp_pkt->mac_sa, my_mac, ETH_ADDR_LEN); memcpy(arp_pkt->ip_sa, my_ip, IP_ADDR_LEN); num_pkt_tx++; // MSS_MAC_tx_packet(buf,42, MSS_MAC_BLOCKING); MSS_MAC_tx_packet(buf,42,1);
return OK; } Вот ф-ция ответа!
|
|
|
|
|
Aug 12 2011, 04:40
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
Утром пришел сегодня на работу, включил и вот....
Поменял только IP на 192,168,1,110 (маска 255,255,240,0) все работает! Почему вчера не получалось!? может потому, что пока машин в сети мало? UPD: поработало и хватит! опять все заткнулось  Че то видать в сети нехорошее включается...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|