*BSD News Article 93161


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!news.mel.connect.com.au!munnari.OZ.AU!news.ecn.uoknor.edu!feed1.news.erols.com!cpk-news-hub1.bbnplanet.com!news.bbnplanet.com!worldnet.att.net!europa.clark.net!newsfeed2!newsfeed.internetmci.com!scoop.eco.twg.com!twg.com!usenet
From: Jos Scherders <joss@twg.com>
Newsgroups: comp.unix.bsd.freebsd.misc
Subject: Question about rn_addroute() function.
Date: Tue, 08 Apr 1997 20:31:30 -0700
Organization: Attachmate Corporation
Lines: 57
Message-ID: <334B0D92.1EA9@twg.com>
NNTP-Posting-Host: batcave.twg.com
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Mailer: Mozilla 2.02 (Win16; I)
Xref: euryale.cc.adfa.oz.au comp.unix.bsd.freebsd.misc:38763

Hi all,

I am trying to understand how the BSDI handles IP routing. I have
reasonable idea know but I fail the understand some lines of the
function rn_addroute() (radix.c). This is the code fragment
I am referring too:

		/*
		 * If the mask is not duplicated, we wouldn't
		 * find it among possible duplicate key entries
		 * anyway, so the above test doesn't hurt.
		 *
		 * We sort the masks for a duplicated key the same way 
		 * in a masklist -- most specific to least specific.
		 * This may require the unfortunate nuisance of
                 * relocating
		 * the head of the list.
		 */
		if (tt == saved_tt) {
			struct	radix_node *xx = x;
			/* link in at head of list */
			(tt = treenodes)->rn_dupedkey = t;
			tt->rn_flags = t->rn_flags;
			tt->rn_p = x = t->rn_p;
			t->rn_p = tt;				/* parent 
*/
			if (x->rn_l == t) x->rn_l = tt; else x->rn_r = 
tt;
			saved_tt = tt; x = xx;
		} else {
			(tt = treenodes)->rn_dupedkey = t->rn_dupedkey;
			t->rn_dupedkey = tt;
			tt->rn_p = t;				/* parent 
*/
			if (tt->rn_dupedkey)			/* parent 
*/
				tt->rn_dupedkey->rn_p = tt;	/* parent 
*/
		}
#ifdef RN_DEBUG
		t=tt+1; tt->rn_info = rn_nodenum++; t->rn_info = 
rn_nodenum++;
		tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt;
#endif
		tt->rn_key = (caddr_t) v;
		tt->rn_b = -1;
		tt->rn_flags = RNF_ACTIVE;
	}

I thought the rn_dupedkey pointed to a linked list of nodes containing
the same key. I also thought the masks where stored in a linked list but
the above codes manipulates left/right pointers of a tree node. Can some
explain what is really happening in here ?

Jos.
Jos Scherders
joss@rahul.net