Hello sir, I send target's output log file. This is after I chnged coding. I also send Etherreal file from host. I am sorry I don't know how to change text. Are they suitable for your request ? Masahiro Ariga ----- Original Message ----- From: "Alok Singh" To: "ariga masahiro" Cc: Sent: Tuesday, October 23, 2007 5:27 PM Subject: RE: [ECOS] What functions should I call in ethernet drv ? Ariga, Can you send us the dump of IP packet also (not ARP) on your system? We want to make sure that you are seeing the problem only with Arp packet. Send 64 bytes starting with Ethernet header. -Alok -----Original Message----- From: ecos-discuss-owner@ecos.sourceware.org [mailto:ecos-discuss-owner@ecos.sourceware.org] On Behalf Of ariga masahiro Sent: Tuesday, October 23, 2007 1:53 PM To: Gary Thomas Cc: ecos-discuss@ecos.sourceware.org Subject: Re: [ECOS] What functions should I call in ethernet drv ? Hello Gary and others, I have learned ARP operation. I've got "TCP/IP illustrated vol2" by W.Richard Stevens. I have traced to ARP interpreting point. First I breaked lan91cxx_recv() when received ARP packet, and next breaked if_ethersubr.c's ether_input(ifp, eh, m) function. And I traced into ether_demux(). ether_demux(ifp, eh, m) 594: switch (ether_type) { 595: #ifdef INET 596: case ETHERTYPE_IP: 597: if (ipflow_fastforward(m)) 598: return; 599: schednetisr(NETISR_IP); 600: inq = &ipintrq; 601: break; 602: 603: case ETHERTYPE_ARP: 604: if (ifp->if_flags & IFF_NOARP) { 605: /* Discard packet if ARP is disabled on interface */ 606: m_freem(m); 607: return; 608: } 609: schednetisr(NETISR_ARP); 610: inq = &arpintrq; 611: break; and I found ether_type==0x0608,so couldn't recognize ARP. I concluded entering data in little Endian is wrong, so as a makeshift I amended source next. First I concocted get_data_byte(struct eth_drv_sc *sc) to get data exchangedly like I previously sent the coding. And I alse concocted in cyg_uint16 get_data_short like below to echange data. 1079: cyg_uint16 get_data_short(struct eth_drv_sc *sc) 1080: { 1081: cyg_uint16 val; 1082: 1083: val = get_data_byte(sc); 1084: //val |= get_data_byte(sc)<<8; val = val<<8 | get_data_byte(sc); --I concocted to reverse data. 1085: 1086: return CYG_LE16_TO_CPU(val); 1087: } I know it's bad coding but as I said this is a makeshift and I expect your best amended source.(on condition I was right) Anyway I could continue debugging. After that I confirmed that following interrrupt, it entered in if_ether.c's arpintr(). Then I traced into in_arpinput(m), and according to the book,here send ARP-reply. My expectancy reached high. But alas,in in_arpinput(m) didn't go to the point of sending packet. The reason was, in first part of coding, 529: in_arpinput(m) 530: struct mbuf *m; 531: { 532: register struct ether_arp *ea; 533: register struct arpcom *ac = (struct arpcom *)m->m_pkthdr.rcvif; 534: struct ether_header *eh; 535: struct iso88025_header *th = (struct iso88025_header *)0; 536: register struct llinfo_arp *la = 0; 537: register struct rtentry *rt; 538: struct in_ifaddr *ia, *maybe_ia = 0; 539: struct sockaddr_dl *sdl; 540: struct sockaddr sa; 541: struct in_addr isaddr, itaddr, myaddr; 542: int op, rif_len; 543: 544: if (m->m_len < sizeof(struct ether_arp) && 545: (m = m_pullup(m, sizeof(struct ether_arp))) == NULL) { 546: log(LOG_ERR, "in_arp: runt packet -- m_pullup failed\n"); 547: return; 548: } 549: 550: ea = mtod(m, struct ether_arp *); 551: op = ntohs(ea->arp_op); 552: (void)memcpy(&isaddr, ea->arp_spa, sizeof (isaddr)); 553: (void)memcpy(&itaddr, ea->arp_tpa, sizeof (itaddr)); 554: for (ia = in_ifaddrhead.tqh_first; ia; ia = ia->ia_link.tqe_next) { 555: /* 556: * For a bridge, we want to check the address irrespective 557: * of the receive interface. (This will change slightly 558: * when we have clusters of interfaces). 559: */ 560: #ifdef BRIDGE 561: #define BRIDGE_TEST (do_bridge) 562: #else 563: #define BRIDGE_TEST (0) /* cc will optimise the test away */ 564: #endif 565: if ((BRIDGE_TEST) || (ia->ia_ifp == &ac->ac_if)) { 566: maybe_ia = ia; 567: if ((itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) || 568: (isaddr.s_addr == ia->ia_addr.sin_addr.s_addr)) { 569: break; 570: } 571: } 572: } 573: if (maybe_ia == 0) { 574: m_freem(m); 575: return; 576: } 577: myaddr = ia ? ia->ia_addr.sin_addr : maybe_ia->ia_addr.sin_addr; --ia,ยช00 at 554 line,there was nothing in_ifaddrhead.tqh_first, and at 577, ia became 00000000. Here,Gary, I sincerely ask your opinion. The trouble is there is nothing in in_ifaddrhead.tqh_first, do you have any idea what caused this mishappening ? I expect your any hints whatever. Thanks in advance. Masahiro Ariga -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss