Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Jul 1998 01:34:43 -0700 (PDT)
From:      Julian Elischer <julian@whistle.com>
To:        Akihiko Hayashi <hayashi@totalware.gifu.gifu.jp>
Cc:        freebsd-stable@FreeBSD.ORG, Enoch Ceshkovsky <Shadey@home.com>, Matt Wilbur <matt@marshotel.coapt.com>
Subject:   Re: Natd/LibAlias/IPDivert problems
Message-ID:  <Pine.BSF.3.95.980706013201.11949F-100000@current1.whistle.com>
In-Reply-To: <199807060821.RAA09806@ns.totalware.gifu.gifu.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
please try the following patch (or get the commits I just did).

Index: ip_divert.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_divert.c,v
retrieving revision 1.1.2.10
diff -c -r1.1.2.10 ip_divert.c
*** ip_divert.c	1998/07/01 01:38:34	1.1.2.10
--- ip_divert.c	1998/07/06 08:28:21
***************
*** 156,174 ****
  	}
  	ip = mtod(m, struct ip *);
  
! 	/* Record divert port */
! #ifndef IPFW_DIVERT_RESTART
! 	divsrc.sin_port = htons(ip_divert_port);
! #else
  	divsrc.sin_port = ip_divert_cookie;
! #endif /* IPFW_DIVERT_RESTART */
  
  	/* Restore packet header fields */
  	ip->ip_len += hlen;
  	HTONS(ip->ip_len);
  	HTONS(ip->ip_off);
  
! 	/* Record receive interface address, if any */
  	divsrc.sin_addr.s_addr = 0;
  	if (hlen) {
  		struct ifaddr *ifa;
--- 156,174 ----
  	}
  	ip = mtod(m, struct ip *);
  
! 	/* Record divert cookie */
  	divsrc.sin_port = ip_divert_cookie;
! 	ip_divert_cookie = 0;
  
  	/* Restore packet header fields */
  	ip->ip_len += hlen;
  	HTONS(ip->ip_len);
  	HTONS(ip->ip_off);
  
! 	/*
! 	 * Record receive interface address, if any 
! 	 * But only for incoming packets.
! 	 */
  	divsrc.sin_addr.s_addr = 0;
  	if (hlen) {
  		struct ifaddr *ifa;
***************
*** 194,199 ****
--- 194,202 ----
  			break;
  		}
  	}
+ 	/*
+ 	 * Record the incoming interface name whenever we have one.
+ 	 */
  	if (m->m_pkthdr.rcvif) {
  		char	name[32];
  		
***************
*** 226,231 ****
--- 229,235 ----
  		if (inp->inp_lport == htons(ip_divert_port))
  			sa = inp->inp_socket;
  	}
+ 	ip_divert_port = 0;
  	if (sa) {
  		if (sbappendaddr(&sa->so_rcv, (struct sockaddr *)&divsrc,
  				m, (struct mbuf *)0) == 0)
***************
*** 267,277 ****
  
  	/* Loopback avoidance */
  	if (sin) {
- #ifndef IPFW_DIVERT_RESTART
- 		ip_divert_cookie = ntohs(sin->sin_port);
- #else
  		ip_divert_cookie = sin->sin_port;
- #endif /* IPFW_DIVERT_RESTART */
  	} else {
  		ip_divert_cookie = 0;
  	}
--- 271,277 ----
Index: ip_fw.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_fw.c,v
retrieving revision 1.51.2.15
diff -c -r1.51.2.15 ip_fw.c
*** ip_fw.c	1998/07/01 01:38:35	1.51.2.15
--- ip_fw.c	1998/07/06 08:28:24
***************
*** 399,407 ****
  #ifdef	IPFW_DIVERT_RESTART
  	u_int16_t skipto = *cookie;
  #else
! 	u_int16_t ignport = *cookie;
  #endif
  
  	/*
  	 * Go down the chain, looking for enlightment
  	 * #ifdef IPFW_DIVERT_RESTART
--- 399,408 ----
  #ifdef	IPFW_DIVERT_RESTART
  	u_int16_t skipto = *cookie;
  #else
! 	u_int16_t ignport = ntohs(*cookie);
  #endif
  
+ 	*cookie = 0;
  	/*
  	 * Go down the chain, looking for enlightment
  	 * #ifdef IPFW_DIVERT_RESTART
***************
*** 601,607 ****
  #ifdef IPFW_DIVERT_RESTART
  			*cookie = f->fw_number;
  #else
! 			*cookie = f->fw_divert_port;
  #endif /* IPFW_DIVERT_RESTART */
  			return(f->fw_divert_port);
  		case IP_FW_F_TEE:
--- 602,608 ----
  #ifdef IPFW_DIVERT_RESTART
  			*cookie = f->fw_number;
  #else
! 			*cookie = htons(f->fw_divert_port);
  #endif /* IPFW_DIVERT_RESTART */
  			return(f->fw_divert_port);
  		case IP_FW_F_TEE:
Index: ip_input.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.50.2.16
diff -c -r1.50.2.16 ip_input.c
*** ip_input.c	1998/07/01 01:38:36	1.50.2.16
--- ip_input.c	1998/07/06 08:28:30
***************
*** 332,349 ****
  
  #ifdef COMPAT_IPFW
  	if (ip_fw_chk_ptr) {
- #ifdef IPDIVERT
  		u_short port;
  
  		port = (*ip_fw_chk_ptr)(&ip, hlen, NULL, &ip_divert_cookie, &m);
  		if (port) {			/* Divert packet */
  			frag_divert_port = port;
  			goto ours;
  		}
  #else
- 		u_int16_t	dummy	= 0;
  		/* If ipfw says divert, we have to just drop packet */
! 		if ((*ip_fw_chk_ptr)(&ip, hlen, NULL, &dummy, &m)) {
  			m_freem(m);
  			m = NULL;
  		}
--- 332,350 ----
  
  #ifdef COMPAT_IPFW
  	if (ip_fw_chk_ptr) {
  		u_short port;
  
+ #ifdef IPDIVERT
  		port = (*ip_fw_chk_ptr)(&ip, hlen, NULL, &ip_divert_cookie, &m);
  		if (port) {			/* Divert packet */
  			frag_divert_port = port;
  			goto ours;
  		}
  #else
  		/* If ipfw says divert, we have to just drop packet */
! 		/* use port as a dummy argument */
! 		port = 0;
! 		if ((*ip_fw_chk_ptr)(&ip, hlen, NULL, &port, &m)) {
  			m_freem(m);
  			m = NULL;
  		}
***************
*** 552,557 ****
--- 553,560 ----
  #ifdef IPDIVERT
  	/*
  	 * Divert reassembled packets to the divert protocol if required
+ 	 * If divert port is null then cookie should be too,
+ 	 * so we shouldn't need to clear them here. Assume ip_divert does so.
  	 */
  	if (frag_divert_port) {
  		ipstat.ips_delivered++;
***************
*** 566,577 ****
  		ipstat.ips_noproto++;
  		goto bad;
  	}
- 
- 	/* Don't let packets divert themselves */
- 	if (ip->ip_p == IPPROTO_DIVERT) {
- 		ipstat.ips_noproto++;
- 		goto bad;
- 	}
  #endif
  
  	/*
--- 569,574 ----
***************
*** 704,715 ****
  	/*
  	 * Any fragment diverting causes the whole packet to divert
  	 */
! 	if (frag_divert_port != 0) {
! 		fp->ipq_divert = frag_divert_port;
  #ifdef IPFW_DIVERT_RESTART
! 		fp->ipq_div_cookie = ip_divert_cookie;
  #endif /* IPFW_DIVERT_RESTART */
- 	}
  	frag_divert_port = 0;
  	ip_divert_cookie = 0;
  #endif
--- 701,710 ----
  	/*
  	 * Any fragment diverting causes the whole packet to divert
  	 */
! 	fp->ipq_divert = frag_divert_port;
  #ifdef IPFW_DIVERT_RESTART
! 	fp->ipq_div_cookie = ip_divert_cookie;
  #endif /* IPFW_DIVERT_RESTART */
  	frag_divert_port = 0;
  	ip_divert_cookie = 0;
  #endif
***************
*** 790,795 ****
--- 785,794 ----
  	return ((struct ip *)ip);
  
  dropfrag:
+ #ifdef IPDIVERT
+ 	frag_divert_port = 0;
+ 	ip_divert_cookie = 0;
+ #endif
  	ipstat.ips_fragdropped++;
  	m_freem(m);
  	return (0);


On Mon, 6 Jul 1998, Akihiko Hayashi wrote:

> At 3:59 PM +0900 7/6/98, Julian Elischer wrote:
> > can you try find the exact set of checkins that produce the instability?
> >
> > the effected files will be:
> >
> > ip_input.c
> > ip_output.c
> > ip_divert.c
> > ip_fw.c
> >
> 
> I get diff $Id of sys/netinet/*
> 
> 98062?-stable revision:
> in.h: $Id: in.h,v 1.22.2.4 1998/02/25 02:34:30 julian Exp $
> ip_divert.c: $Id: ip_divert.c,v 1.1.2.9 1998/06/12 03:02:08 julian Exp $
> ip_fw.c: $Id: ip_fw.c,v 1.51.2.14 1998/06/05 21:38:07 julian Exp $
> ip_input.c: $Id: ip_input.c,v 1.50.2.15 1998/06/05 21:38:09 julian Exp $
> ip_mroute.c: $Id: ip_mroute.c,v 1.34.2.2 1997/07/19 20:09:09 fenner Exp $
> ip_output.c: $Id: ip_output.c,v 1.44.2.8 1998/06/05 21:38:11 julian Exp $
> ip_var.h: $Id: ip_var.h,v 1.24.2.4 1998/06/05 21:38:12 julian Exp $
> 
> lastest-stable revision (in my cvs repository):
> in.h: $Id: in.h,v 1.22.2.5 1998/07/01 01:38:33 julian Exp $
> ip_divert.c: $Id: ip_divert.c,v 1.1.2.10 1998/07/01 01:38:34 julian Exp $
> ip_fw.c: $Id: ip_fw.c,v 1.51.2.15 1998/07/01 01:38:35 julian Exp $
> ip_input.c: $Id: ip_input.c,v 1.50.2.16 1998/07/01 01:38:36 julian Exp $
> ip_mroute.c: $Id: ip_mroute.c,v 1.34.2.3 1998/07/03 07:48:14 jkh Exp $
> ip_output.c: $Id: ip_output.c,v 1.44.2.9 1998/07/01 01:38:37 julian Exp $
> ip_var.h: $Id: ip_var.h,v 1.24.2.5 1998/07/01 01:38:38 julian Exp $
> 
> I found this problem at July 2, then I think that this problem is
> caused by:
> ----- from cvs-all-digest  -----
> > Date: Tue, 30 Jun 1998 18:38:41 -0700 (PDT)
> > From: Julian Elischer <julian@FreeBSD.ORG>
> > Subject: cvs commit: src/sys/netinet in.h ip_divert.c ip_fw.c ip_input.c
> >ip_output.c ip_var.h
> >
> > julian      1998/06/30 18:38:40 PDT
> >
> >   Modified files:        (Branch: RELENG_2_2)
> >     sys/netinet          in.h ip_divert.c ip_fw.c ip_input.c
> >                          ip_output.c ip_var.h
> >   Log:
> >   MFC: merge in some minor cleanups for IP divert
> >
> >   Revision  Changes    Path
> >   1.22.2.5  +3 -2      src/sys/netinet/in.h
> >   1.1.2.10  +10 -29    src/sys/netinet/ip_divert.c
> >   1.51.2.15 +25 -26    src/sys/netinet/ip_fw.c
> >   1.50.2.16 +8 -13     src/sys/netinet/ip_input.c
> >   1.44.2.9  +3 -3      src/sys/netinet/ip_output.c
> >   1.24.2.5  +2 -8      src/sys/netinet/ip_var.h
> ----- from cvs-all-digest  -----
> 
> 
> > >
> > > I backed /usr/src/sys/netinet/* to 98062?, and rebuild kernel,
> > > this problem is not appeared.
> >
> >
> > If you can tell me what '?' is it would help..
> >
> 
> may be 980627... it is not exactly. but, between 98062? and latest-stable,
> revision number is increased only one.
> 
> 
> ----
> hayashi@totalware.gifu.gifu.jp
> 
> 
> 



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message



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