--- cci/sys/netinet/if_ether.c 2019/07/28 12:24:19 1.1.1.1 +++ cci/sys/netinet/if_ether.c 2019/07/28 12:29:36 1.1.1.2 @@ -15,6 +15,8 @@ #include "../net/if.h" #include "../netinet/in.h" #include "../netinet/if_ether.h" +#include "../tahoeif/if_acereg.h" +#include "../tahoeif/if_enp.h" /* * changes: @@ -26,6 +28,11 @@ * * . add symbolic return code to arpresolve(). See comments in * arpresolve(). + * + * . add test to check if the broadcast message originated from + * the other controllers on the same host. If so, there is no + * need to print out error message that warns about duplicate + * ip address. */ /* @@ -71,7 +78,10 @@ int gotoether; /* force traffic to Ethe u_char etherbroadcastaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; extern struct ifnet loif; - +extern struct ace_softc ace_softc[]; +extern struct enp_softc enp_softc[]; +extern int numace; +extern int numenp; /*------------- debug tools ---------------*/ #ifdef ARPPRINTFS int arpprintfs; @@ -93,7 +103,7 @@ extern struct ifnet loif; * NB: setting oldmap to zero completely disables ARP * (i.e. identical to setting IFF_NOARP with an ioctl). */ -int oldmap = 0xffffff; +/* int oldmap = 1024; we remove this reference for ARP usr */ /* * Attach an ethernet interface to the list "arpcom" where @@ -240,6 +250,14 @@ arpresolve(ac, m, destip, desten) if (lna == INADDR_ANY) { /* broadcast address */ bcopy((caddr_t)etherbroadcastaddr, (caddr_t)desten, sizeof (etherbroadcastaddr)); + + ARPTRACE(printf("\tarpresolve(%s%d)target: %lx, %x.%x.%x.%x.%x.%x\n", + ac->ac_if.if_name, ac->ac_if.if_unit, + destip->s_addr, + desten[0] & 0xff, desten[1] & 0xff, + desten[2] & 0xff, desten[3] & 0xff, + desten[4] & 0xff, desten[5] & 0xff);) + return (ARPRESOLVE_BROADCAST); } ifp = &ac->ac_if; @@ -252,11 +270,19 @@ arpresolve(ac, m, destip, desten) looutput(&loif, m, (struct sockaddr *)&sin); return(ARPRESOLVE_WILLSEND); } - if ((ifp->if_flags & IFF_NOARP) || lna >= oldmap) { + /* if ((ifp->if_flags & IFF_NOARP) || lna >= oldmap) { */ + if (ifp->if_flags & IFF_NOARP) { bcopy((caddr_t)ac->ac_enaddr, (caddr_t)desten, 3); desten[3] = (lna >> 16) & 0x7f; desten[4] = (lna >> 8) & 0xff; desten[5] = lna & 0xff; + ARPTRACE(printf("\tarpresolve2(%s%d)target: %lx, %x.%x.%x.%x.%x.%x\n", + ac->ac_if.if_name, ac->ac_if.if_unit, + destip->s_addr, + desten[0] & 0xff, desten[1] & 0xff, + desten[2] & 0xff, desten[3] & 0xff, + desten[4] & 0xff, desten[5] & 0xff);) + return (ARPRESOLVE_OK); } s = splimp(); @@ -277,6 +303,14 @@ arpresolve(ac, m, destip, desten) if (at->at_flags & ATF_COM) { /* entry IS complete */ bcopy((caddr_t)at->at_enaddr, (caddr_t)desten, 6); splx(s); + + ARPTRACE(printf("\tarpresolve3(%s%d)target: %lx, %x.%x.%x.%x.%x.%x\n", + ac->ac_if.if_name, ac->ac_if.if_unit, + destip->s_addr, + desten[0] & 0xff, desten[1] & 0xff, + desten[2] & 0xff, desten[3] & 0xff, + desten[4] & 0xff, desten[5] & 0xff);) + return (ARPRESOLVE_OK); } /* @@ -334,8 +368,8 @@ arpinput(ac, m) struct mbuf *mhold; struct in_addr isaddr,itaddr,myaddr; - ARPTRACE(printf("arpinput through %s%d (m=%lx)\n", - ac->ac_if.if_name, ac->ac_if.if_unit, m);) + ARPTRACE(printf("arpinput through %s%d (m=%lx, m->m_len=%d)\n", + ac->ac_if.if_name, ac->ac_if.if_unit, m,m->m_len);) if (m->m_len < sizeof *ea) goto out; @@ -354,25 +388,24 @@ arpinput(ac, m) sizeof (ac->ac_enaddr))) goto out; /* it's from me, ignore it. */ - ARPTRACE(printf("\tarpinput (%s%d) sender: %lx, %x.%x.%x.%x.%x.%x, target: %lx, %x.%x.%x.%x.%x.%x\n", + ARPTRACE(printf("\tarpinput (%s%d) sender: %lx, %x.%x.%x.%x.%x.%x, target: %lx\n", ac->ac_if.if_name, ac->ac_if.if_unit, isaddr.s_addr, ea->arp_sha[0] & 0xff, ea->arp_sha[1] & 0xff, ea->arp_sha[2] & 0xff, ea->arp_sha[3] & 0xff, ea->arp_sha[4] & 0xff, ea->arp_sha[5] & 0xff, - itaddr.s_addr, - ea->arp_tha[0] & 0xff, ea->arp_tha[1] & 0xff, - ea->arp_tha[2] & 0xff, ea->arp_tha[3] & 0xff, - ea->arp_tha[4] & 0xff, ea->arp_tha[5] & 0xff);) + itaddr.s_addr );) if (isaddr.s_addr == myaddr.s_addr) { - printf("duplicate IP address!! sent from ethernet address: "); - printf("%x %x %x %x %x %x\n", ea->arp_sha[0], ea->arp_sha[1], - ea->arp_sha[2], ea->arp_sha[3], - ea->arp_sha[4], ea->arp_sha[5]); - if (ntohs(ea->arp_op) == ARPOP_REQUEST) - goto reply; - goto out; + if (!fromme(ea->arp_sha)) { + printf("duplicate IP address!! sent from ethernet address: "); + printf("%x %x %x %x %x %x\n", ea->arp_sha[0], ea->arp_sha[1], + ea->arp_sha[2], ea->arp_sha[3], + ea->arp_sha[4], ea->arp_sha[5]); + if (ntohs(ea->arp_op) == ARPOP_REQUEST) + goto reply; + goto out; + } } ARPTAB_LOOK(at, isaddr.s_addr); if (at) { @@ -493,3 +526,18 @@ struct sockaddr *addr; splx(x); } +fromme(ea) +char *ea; +{ + int i; + + for (i = 0; i < numace; i++) { + if (!bcmp(ea, ace_softc[i].is_addr, 6)) + return(1); + } + for (i = 0; i < numenp; i++) { + if (!bcmp(ea, enp_softc[i].es_enaddr, 6)) + return(1); + } + return(0); +}