Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Apr 1999 14:47:22 -0400 (EDT)
From:      Larry Lile <lile@stdio.com>
To:        ip@mcc.ac.uk
Cc:        current@FreeBSD.ORG
Subject:   Re: Patch to fix [Re: Bad, reliable crash: Julian's "oltr" stuff & ARP]
Message-ID:  <Pine.BSF.4.05.9904141445510.3818-200000@heathers.stdio.com>
In-Reply-To: <Pine.BSF.4.05.9904141308310.3818-200000@heathers.stdio.com>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]

Okay, that one is just a little too strong.  It won't allow
a FreeBSD token-ring station to arp-reply to an ethernet station
on the other side of a "broken" translational bridge.  This one
will.

Larry Lile
lile@stdio.com

On Wed, 14 Apr 1999, Larry Lile wrote:

> 
> The problem Mr. Pallfreeman was seeing are related to how I was
> building the arp-reply based on the sources arp_hrd type.  I never
> expected to see a token-ring arp arrive over an ethernet interface.
> Therefore the arp code was trying to check for and collect the 
> source route that the arp took on its way.  I have modified the
> arp code to go looking for the source-route information only if
> the arp comes from a token-ring station and is received on a 
> token-ring interface.  The arp-reply packet generated is based
> on the type of interface the arp was received on.  I think
> the bridge should have changed the arp_hrd type when it forwarded
> the packet, while it was changing everything else, but I think
> that falls into a religous debate.  Thanks to Mr. Pallfreeman
> for helping me debug this and testing my patch.
> 
> What this means is: you should be able to arp in both directions
> over a token-ring<->ethernet (translational|non-translational) bridge.
> 
> The inherent "brokenness" of translational bridging is left as an
> exercise for the reader :)
> 
> Here's the patch, if someone would be kind enough to commit it.  It
> seems to have resolved Mr. Pallfreeman's issue and doesn't seem to
> break anything else.
> 
> Larry Lile
> lile@stdio.com
> 

[-- Attachment #2 --]
*** if_ether.c.orig	Mon Mar  8 13:22:41 1999
--- if_ether.c	Wed Apr 14 14:43:41 1999
***************
*** 559,566 ****
  		(void)memcpy(LLADDR(sdl), ea->arp_sha, sizeof(ea->arp_sha));
  		sdl->sdl_alen = sizeof(ea->arp_sha);
                  sdl->sdl_rcf = NULL;
! 		/* Save source routing information for Token-ring interfaces, if available */
! 		if (ea->arp_hrd == htons(ARPHRD_IEEE802)) {
  			th = (struct iso88025_header *)m->m_pkthdr.header;
                  	if ((th->iso88025_shost[0] & 0x80) && (((ntohs(th->rcf) & 0x1f00) >> 8) > 2)) {
  				sdl->sdl_rcf = ntohs(th->rcf) & 0x0080 ? 
--- 559,568 ----
  		(void)memcpy(LLADDR(sdl), ea->arp_sha, sizeof(ea->arp_sha));
  		sdl->sdl_alen = sizeof(ea->arp_sha);
                  sdl->sdl_rcf = NULL;
! 		/* If we receive an arp from a token-ring station over a token-ring nic
! 		 * then try to save the source routing info.
! 		 */
! 		if (ac->ac_if.if_type == IFT_ISO88025) {
  			th = (struct iso88025_header *)m->m_pkthdr.header;
                  	if ((th->iso88025_shost[0] & 0x80) && (((ntohs(th->rcf) & 0x1f00) >> 8) > 2)) {
  				sdl->sdl_rcf = ntohs(th->rcf) & 0x0080 ? 
***************
*** 577,582 ****
--- 579,586 ----
  			}
  			th->rcf = sdl->sdl_rcf;
  			
+ 		} else {
+ 			sdl->sdl_rcf = NULL;
  		}
  		if (rt->rt_expire)
  			rt->rt_expire = time_second + arpt_keep;
***************
*** 646,653 ****
  	(void)memcpy(ea->arp_spa, &itaddr, sizeof(ea->arp_spa));
  	ea->arp_op = htons(ARPOP_REPLY);
  	ea->arp_pro = htons(ETHERTYPE_IP); /* let's be sure! */
! 	switch (ntohs(ea->arp_hrd)) {
! 	case ARPHRD_IEEE802:
  		/* Re-arrange the source/dest address */
  		memcpy(th->iso88025_dhost, th->iso88025_shost, sizeof(th->iso88025_dhost));
  		memcpy(th->iso88025_shost, ac->ac_enaddr, sizeof(th->iso88025_shost));
--- 650,657 ----
  	(void)memcpy(ea->arp_spa, &itaddr, sizeof(ea->arp_spa));
  	ea->arp_op = htons(ARPOP_REPLY);
  	ea->arp_pro = htons(ETHERTYPE_IP); /* let's be sure! */
! 	switch (ac->ac_if.if_type) {
! 	case IFT_ISO88025:
  		/* Re-arrange the source/dest address */
  		memcpy(th->iso88025_dhost, th->iso88025_shost, sizeof(th->iso88025_dhost));
  		memcpy(th->iso88025_shost, ac->ac_enaddr, sizeof(th->iso88025_shost));
***************
*** 662,668 ****
  		sa.sa_data[(sizeof(th->iso88025_dhost) * 2)] = 0x10;
  		sa.sa_data[(sizeof(th->iso88025_dhost) * 2) + 1] = 0x40;
  		break;
! 	case ARPHRD_ETHER:
  		eh = (struct ether_header *)sa.sa_data;
  		(void)memcpy(eh->ether_dhost, ea->arp_tha, sizeof(eh->ether_dhost));
  		eh->ether_type = htons(ETHERTYPE_ARP);
--- 666,672 ----
  		sa.sa_data[(sizeof(th->iso88025_dhost) * 2)] = 0x10;
  		sa.sa_data[(sizeof(th->iso88025_dhost) * 2) + 1] = 0x40;
  		break;
! 	case IFT_ETHER:
  		eh = (struct ether_header *)sa.sa_data;
  		(void)memcpy(eh->ether_dhost, ea->arp_tha, sizeof(eh->ether_dhost));
  		eh->ether_type = htons(ETHERTYPE_ARP);

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9904141445510.3818-200000>