Plan 9 from Bell Labs’s /usr/web/sources/extra/changes/2007/0417

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


/rc/bin/cpurc.local
% cat >/sys/lib/dist/changes/1176827406.0.txt << EOF
• Obvious.
• Russ took out the coop toggle; it's on by default now.
EOF
 [geoff] --rwxrwxr-x M 64 geoff sys 367 Apr 17 12:27 rc/bin/cpurc.local
	/n/sourcesdump/2007/0417/plan9/rc/bin/cpurc.local:3,14 - 
	/n/sourcesdump/2007/0418/plan9/rc/bin/cpurc.local:3,11
	  
	  # used only by upas, as default return domain appended to all unqualified
	  # return addresses, even local ones
	- site=plan9
	+ site=EXAMPLE
	  # replace FILESERVER with the name of your file server
	  # here we start with kfs, your local disk file system
	  fileserver=kfs
	  # replace FACEDOM with the local domain to be used in the faces database
	  facedom=FACEDOM
	- 
	- # turn on cooperative scheduling (assuming it starts off)
	- echo coop > /dev/reboot

/rc/bin/termrc
% cat >/sys/lib/dist/changes/1176831006.0.txt << EOF
Don't start timesync if we already did so in termrc.local
EOF
 [geoff] --rwxrwxr-x M 64 glenda sys 1692 Apr 17 13:27 rc/bin/termrc
	/n/sourcesdump/2007/0417/plan9/rc/bin/termrc:28,34 - 
	/n/sourcesdump/2007/0418/plan9/rc/bin/termrc:28,35
	  if(test -e /net/ipifc/0/ctl)
	  	ndb/dns -rf $NDBFILE
	  
	- aux/timesync $TIMESYNCARGS
	+ if(! ps|grep -s timesync)
	+ 	aux/timesync $TIMESYNCARGS
	  
	  # bind all likely devices (#S was bound in boot)
	  for(i in f t m v L P U '$' Σ κ)

/sys/src/9/ip/ipv6.h
% cat >/sys/lib/dist/changes/1176838212.0.txt << EOF
• Code cleanup
• Fix up ICMP6
EOF
 [geoff] --rw-rw-r-- M 64 presotto sys 4087 Apr 17 17:06 sys/src/9/ip/ipv6.h
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/ipv6.h:1,4 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.h:1,6
	- #define MIN(a, b) ((a) <= (b) ? (a) : (b))
	+ #ifndef MIN
	+ #define MIN(a, b) ((a) <= (b)? (a): (b))
	+ #endif
	  
	  /* rfc 3513 defines the address prefices */
	  #define isv6mcast(addr)	  ((addr)[0] == 0xff)
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/ipv6.h:6,52 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.h:8,20
	  #define issitelocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0xc0)
	  #define isv6global(addr) (((addr)[0] & 0xe0) == 0x20)
	  
	- #define optexsts(np) (nhgets((np)->ploadlen) > 24)
	- #define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
	+ #define optexsts(np)	(nhgets((np)->ploadlen) > 24)
	+ #define issmcast(addr)	(memcmp((addr), v6solicitednode, 13) == 0)
	  
	  /* from RFC 2460 */
	  
	- typedef struct Ip6hdr     Ip6hdr;
	- typedef struct Opthdr     Opthdr;
	- typedef struct Routinghdr Routinghdr;
	- typedef struct Fraghdr6    Fraghdr6;
	- 
	- struct Ip6hdr {
	- 	uchar vcf[4];       	// version:4, traffic class:8, flow label:20
	- 	uchar ploadlen[2];  	// payload length: packet length - 40
	- 	uchar proto;		// next header type
	- 	uchar ttl;          	// hop limit
	- 	uchar src[IPaddrlen];
	- 	uchar dst[IPaddrlen];
	- };
	- 
	- struct Opthdr {
	- 	uchar nexthdr;
	- 	uchar len;
	- };
	- 
	- struct Routinghdr {
	- 	uchar nexthdr;
	- 	uchar len;
	- 	uchar rtetype;
	- 	uchar segrem;
	- };
	- 
	- struct Fraghdr6 {
	- 	uchar nexthdr;
	- 	uchar res;
	- 	uchar offsetRM[2];	// Offset, Res, M flag
	- 	uchar id[4];
	- };
	- 
	- 
	- enum {			/* Header Types */
	- 	HBH		= 0,	//?
	+ enum {				/* Header Types */
	+ 	HBH		= 0,	/* hop-by-hop multicast routing protocol */
	  	ICMP		= 1,
	  	IGMP		= 2,
	  	GGP		= 3,
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/ipv6.h:71,159 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.h:39,146
	  	Maxhdrtype	= 256,
	  };
	  
	- 
	  enum {
	- 	//	multicast flgs and scop
	+ 	/* multicast flags and scopes */
	  
	- 	well_known_flg				= 0,
	- 	transient_flg				= 1,
	+ 	Well_known_flg	= 0,
	+ 	Transient_flg	= 1,
	  
	- 	node_local_scop 			= 1,
	- 	link_local_scop 			= 2,
	- 	site_local_scop 			= 5,
	- 	org_local_scop				= 8,
	- 	global_scop				= 14,
	+ 	Node_local_scop	= 1,
	+ 	Link_local_scop	= 2,
	+ 	Site_local_scop	= 5,
	+ 	Org_local_scop	= 8,
	+ 	Global_scop	= 14,
	  
	- 	//	various prefix lengths
	+ 	/* various prefix lengths */
	+ 	SOLN_PREF_LEN	= 13,
	  
	- 	SOLN_PREF_LEN				= 13,
	+ 	/* icmpv6 unreach codes */
	+ 	icmp6_no_route		= 0,
	+ 	icmp6_ad_prohib		= 1,
	+ 	icmp6_unassigned	= 2,
	+ 	icmp6_adr_unreach	= 3,
	+ 	icmp6_port_unreach	= 4,
	+ 	icmp6_unkn_code		= 5,
	  
	- 	//	icmpv6 unreach codes
	- 	icmp6_no_route				= 0,
	- 	icmp6_ad_prohib				= 1,
	- 	icmp6_unassigned			= 2,
	- 	icmp6_adr_unreach			= 3,
	- 	icmp6_port_unreach			= 4,
	- 	icmp6_unkn_code				= 5,
	+ 	/* various flags & constants */
	+ 	v6MINTU		= 1280,
	+ 	HOP_LIMIT	= 255,
	+ 	ETHERHDR_LEN	= 14,
	+ 	IPV6HDR_LEN	= 40,
	+ 	IPV4HDR_LEN	= 20,
	  
	- 	// 	various flags & constants
	+ 	/* option types */
	  
	- 	v6MINTU      				= 1280,
	- 	HOP_LIMIT    				= 255,
	- 	ETHERHDR_LEN 				= 14,
	- 	IPV6HDR_LEN  				= 40,
	- 	IPV4HDR_LEN  				= 20,
	+ 	SRC_LLADDR	= 1,
	+ 	TARGET_LLADDR	= 2,
	+ 	PREFIX_INFO	= 3,
	+ 	REDIR_HEADER	= 4,
	+ 	MTU_OPTION	= 5,
	  
	- 	// 	option types
	+ 	SRC_UNSPEC	= 0,
	+ 	SRC_UNI		= 1,
	+ 	TARG_UNI	= 2,
	+ 	TARG_MULTI	= 3,
	  
	- 	SRC_LLADDRESS    			= 1,
	- 	TARGET_LLADDRESS 			= 2,
	- 	PREFIX_INFO      			= 3,
	- 	REDIR_HEADER     			= 4,
	- 	MTU_OPTION       			= 5,
	+ 	t_unitent	= 1,
	+ 	t_uniproxy	= 2,
	+ 	t_unirany	= 3,
	  
	- 	SRC_UNSPEC  				= 0,
	- 	SRC_UNI     				= 1,
	- 	TARG_UNI    				= 2,
	- 	TARG_MULTI  				= 3,
	+ 	/* Router constants (all times in milliseconds) */
	+ 	MAX_INIT_RTR_ADVERT_INTVL = 16000,
	+ 	MAX_INIT_RTR_ADVERTS	= 3,
	+ 	MAX_FINAL_RTR_ADVERTS	= 3,
	+ 	MIN_DELAY_BETWEEN_RAS	= 3000,
	+ 	MAX_RA_DELAY_TIME	= 500,
	  
	- 	t_unitent   				= 1,
	- 	t_uniproxy  				= 2,
	- 	t_unirany   				= 3,
	+ 	/* Host constants */
	+ 	MAX_RTR_SOLICIT_DELAY	= 1000,
	+ 	RTR_SOLICIT_INTVL	= 4000,
	+ 	MAX_RTR_SOLICITS	= 3,
	  
	- 	//	Router constants (all times in milliseconds)
	+ 	/* Node constants */
	+ 	MAX_MULTICAST_SOLICIT	= 3,
	+ 	MAX_UNICAST_SOLICIT	= 3,
	+ 	MAX_ANYCAST_DELAY_TIME	= 1000,
	+ 	MAX_NEIGHBOR_ADVERT	= 3,
	+ 	REACHABLE_TIME		= 30000,
	+ 	RETRANS_TIMER		= 1000,
	+ 	DELAY_FIRST_PROBE_TIME	= 5000,
	+ };
	  
	- 	MAX_INITIAL_RTR_ADVERT_INTERVAL 	= 16000,
	- 	MAX_INITIAL_RTR_ADVERTISEMENTS  	= 3,
	- 	MAX_FINAL_RTR_ADVERTISEMENTS    	= 3,
	- 	MIN_DELAY_BETWEEN_RAS 			= 3000,
	- 	MAX_RA_DELAY_TIME     			= 500,
	+ typedef struct Ip6hdr	Ip6hdr;
	+ typedef struct Opthdr	Opthdr;
	+ typedef struct Routinghdr Routinghdr;
	+ typedef struct Fraghdr6	Fraghdr6;
	  
	- 	//	Host constants
	+ struct	Ip6hdr {
	+ 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */
	+ 	uchar	ploadlen[2];	/* payload length: packet length - 40 */
	+ 	uchar	proto;		/* next header type */
	+ 	uchar	ttl;		/* hop limit */
	+ 	uchar	src[IPaddrlen];
	+ 	uchar	dst[IPaddrlen];
	+ };
	  
	- 	MAX_RTR_SOLICITATION_DELAY 		= 1000,
	- 	RTR_SOLICITATION_INTERVAL  		= 4000,
	- 	MAX_RTR_SOLICITATIONS      		= 3,
	+ struct	Opthdr {
	+ 	uchar	nexthdr;
	+ 	uchar	len;
	+ };
	  
	- 	//	Node constants
	+ struct	Routinghdr {
	+ 	uchar	nexthdr;
	+ 	uchar	len;
	+ 	uchar	rtetype;
	+ 	uchar	segrem;
	+ };
	  
	- 	MAX_MULTICAST_SOLICIT   		= 3,
	- 	MAX_UNICAST_SOLICIT     		= 3,
	- 	MAX_ANYCAST_DELAY_TIME  		= 1000,
	- 	MAX_NEIGHBOR_ADVERTISEMENT 		= 3,
	- 	REACHABLE_TIME 				= 30000,
	- 	RETRANS_TIMER  				= 1000,
	- 	DELAY_FIRST_PROBE_TIME 			= 5000,
	- 
	+ struct	Fraghdr6 {
	+ 	uchar	nexthdr;
	+ 	uchar	res;
	+ 	uchar	offsetRM[2];	/* Offset, Res, M flag */
	+ 	uchar	id[4];
	  };
	  
	- extern void ipv62smcast(uchar *, uchar *);
	- extern void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac);
	- extern void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags);
	- extern void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp);
	- extern void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp);
	- extern void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free);
	- 
	  extern uchar v6allnodesN[IPaddrlen];
	  extern uchar v6allnodesL[IPaddrlen];
	  extern uchar v6allroutersN[IPaddrlen];
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/ipv6.h:183,185 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.h:170,179
	  extern int v6aLpreflen;
	  
	  extern int ReTransTimer;
	+ 
	+ void ipv62smcast(uchar *, uchar *);
	+ void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac);
	+ void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags);
	+ void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp);
	+ void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp);
	+ void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free);
 [geoff] --rw-rw-r-- M 64 presotto sys 17914 Apr 17 17:07 sys/src/9/ip/icmp6.c
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:1,3 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:1,6
	+ /*
	+  * Internet Control Message Protocol for IPv6
	+  */
	  #include "u.h"
	  #include "../port/lib.h"
	  #include "mem.h"
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:7,47 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:10,45
	  #include "ip.h"
	  #include "ipv6.h"
	  
	- typedef struct ICMPpkt ICMPpkt;
	- typedef struct IPICMP IPICMP;
	- typedef struct Ndpkt Ndpkt;
	- typedef struct NdiscC NdiscC;
	+ enum
	+ {
	+ 	InMsgs6,
	+ 	InErrors6,
	+ 	OutMsgs6,
	+ 	CsumErrs6,
	+ 	LenErrs6,
	+ 	HlenErrs6,
	+ 	HoplimErrs6,
	+ 	IcmpCodeErrs6,
	+ 	TargetErrs6,
	+ 	OptlenErrs6,
	+ 	AddrmxpErrs6,
	+ 	RouterAddrErrs6,
	  
	- struct ICMPpkt {
	- 	uchar	type;
	- 	uchar	code;
	- 	uchar	cksum[2];
	- 	uchar	icmpid[2];
	- 	uchar	seq[2];
	+ 	Nstats6,
	  };
	  
	- struct IPICMP {
	- 	Ip6hdr;
	- 	ICMPpkt;
	+ enum {
	+ 	ICMP_USEAD6	= 40,
	  };
	  
	- struct NdiscC
	- {
	- 	IPICMP;
	- 	uchar target[IPaddrlen];
	+ enum {
	+ 	Oflag	= 1<<5,
	+ 	Sflag	= 1<<6,
	+ 	Rflag	= 1<<7,
	  };
	  
	- struct Ndpkt
	- {
	- 	NdiscC;
	- 	uchar otype;
	- 	uchar olen;	// length in units of 8 octets(incl type, code),
	- 				// 1 for IEEE 802 addresses
	- 	uchar lnaddr[6];	// link-layer address
	- };
	- 
	- enum {	
	- 	// ICMPv6 types
	+ enum {
	+ 	/* ICMPv6 types */
	  	EchoReply	= 0,
	  	UnreachableV6	= 1,
	  	PacketTooBigV6	= 2,
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:69,74 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:67,120
	  	Maxtype6	= 137,
	  };
	  
	+ typedef struct ICMPpkt ICMPpkt;
	+ typedef struct IPICMP IPICMP;
	+ typedef struct Ndpkt Ndpkt;
	+ typedef struct NdiscC NdiscC;
	+ 
	+ struct ICMPpkt {
	+ 	uchar	type;
	+ 	uchar	code;
	+ 	uchar	cksum[2];
	+ 	uchar	icmpid[2];
	+ 	uchar	seq[2];
	+ };
	+ 
	+ struct IPICMP {
	+ 	Ip6hdr;
	+ 	ICMPpkt;
	+ };
	+ 
	+ struct NdiscC
	+ {
	+ 	IPICMP;
	+ 	uchar	target[IPaddrlen];
	+ };
	+ 
	+ struct Ndpkt
	+ {
	+ 	NdiscC;
	+ 	uchar	otype;
	+ 	uchar	olen;		/* length in units of 8 octets(incl type, code),
	+ 				 * 1 for IEEE 802 addresses */
	+ 	uchar	lnaddr[6];	/* link-layer address */
	+ };
	+ 
	+ typedef struct Icmppriv6
	+ {
	+ 	ulong	stats[Nstats6];
	+ 
	+ 	/* message counts */
	+ 	ulong	in[Maxtype6+1];
	+ 	ulong	out[Maxtype6+1];
	+ } Icmppriv6;
	+ 
	+ typedef struct Icmpcb6
	+ {
	+ 	QLock;
	+ 	uchar	headers;
	+ } Icmpcb6;
	+ 
	  char *icmpnames6[Maxtype6+1] =
	  {
	  [EchoReply]		"EchoReply",
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:95,118 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:141,146
	  [RedirectV6]		"RedirectV6",
	  };
	  
	- enum
	- {
	- 	InMsgs6,
	- 	InErrors6,
	- 	OutMsgs6,
	- 	CsumErrs6,
	- 	LenErrs6,
	- 	HlenErrs6,
	- 	HoplimErrs6,
	- 	IcmpCodeErrs6,
	- 	TargetErrs6,
	- 	OptlenErrs6,
	- 	AddrmxpErrs6,
	- 	RouterAddrErrs6,
	- 
	- 	Nstats6,
	- };
	- 
	  static char *statnames6[Nstats6] =
	  {
	  [InMsgs6]	"InMsgs",
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:129,149 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:157,162
	  [RouterAddrErrs6]	"RouterAddrErrs",
	  };
	  
	- typedef struct Icmppriv6
	- {
	- 	ulong	stats[Nstats6];
	- 
	- 	/* message counts */
	- 	ulong	in[Maxtype6+1];
	- 	ulong	out[Maxtype6+1];
	- } Icmppriv6;
	- 
	- typedef struct Icmpcb6 
	- {
	- 	QLock;
	- 	uchar headers;
	- } Icmpcb6;
	- 
	  static char *unreachcode[] =
	  {
	  [icmp6_no_route]	"no route to destination",
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:154,177 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:167,172
	  [icmp6_unkn_code]	"icmp unreachable: unknown code",
	  };
	  
	- enum {
	- 	ICMP_USEAD6	= 40,
	- };
	- 
	- enum {
	- 	Oflag	= 1<<5,
	- 	Sflag	= 1<<6,
	- 	Rflag	= 1<<7,
	- };
	- 
	- enum {
	- 	slladd	= 1,
	- 	tlladd	= 2,
	- 	prfinfo	= 3,
	- 	redhdr	= 4,
	- 	mtuopt	= 5,
	- };
	- 
	  static void icmpkick6(void *x, Block *bp);
	  
	  static void
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:186,195 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:181,190
	  {
	  	IPICMP *p = (IPICMP *)(bp->rp);
	  
	- 	hnputl(p->vcf, 0);  // borrow IP header as pseudoheader
	+ 	hnputl(p->vcf, 0);  	/* borrow IP header as pseudoheader */
	  	hnputs(p->ploadlen, blocklen(bp)-IPV6HDR_LEN);
	  	p->proto = 0;
	- 	p->ttl = ICMPv6;	// ttl gets set later
	+ 	p->ttl = ICMPv6;	/* ttl gets set later */
	  	hnputs(p->cksum, 0);
	  	hnputs(p->cksum, ptclcsum(bp, 0, blocklen(bp)));
	  	p->proto = ICMPv6;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:198,204 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:193,200
	  static Block *
	  newIPICMP(int packetlen)
	  {
	- 	Block	*nbp;
	+ 	Block *nbp;
	+ 
	  	nbp = allocb(packetlen);
	  	nbp->wp += packetlen;
	  	memset(nbp->rp, 0, packetlen);
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:208,224 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:204,219
	  void
	  icmpadvise6(Proto *icmp, Block *bp, char *msg)
	  {
	- 	Conv	**c, *s;
	- 	IPICMP	*p;
	- 	ushort	recid;
	+ 	ushort recid;
	+ 	Conv **c, *s;
	+ 	IPICMP *p;
	  
	- 	p = (IPICMP *) bp->rp;
	+ 	p = (IPICMP *)bp->rp;
	  	recid = nhgets(p->icmpid);
	  
	  	for(c = icmp->conv; *c; c++) {
	  		s = *c;
	- 		if(s->lport == recid)
	- 		if(ipcmp(s->raddr, p->dst) == 0){
	+ 		if(s->lport == recid && ipcmp(s->raddr, p->dst) == 0){
	  			qhangup(s->rq, msg);
	  			qhangup(s->wq, msg);
	  			break;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:230,238 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:225,233
	  static void
	  icmpkick6(void *x, Block *bp)
	  {
	+ 	uchar laddr[IPaddrlen], raddr[IPaddrlen];
	  	Conv *c = x;
	  	IPICMP *p;
	- 	uchar laddr[IPaddrlen], raddr[IPaddrlen];
	  	Icmppriv6 *ipriv = c->p->priv;
	  	Icmpcb6 *icb = (Icmpcb6*)c->ptcl;
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:268,274 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:263,269
	  
	  	set_cksum(bp);
	  	p->vcf[0] = 0x06 << 4;
	- 	if(p->type <= Maxtype6)	
	+ 	if(p->type <= Maxtype6)
	  		ipriv->out[p->type]++;
	  	ipoput6(c->p->f, bp, 0, c->ttl, c->tos, nil);
	  }
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:279,290 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:274,282
	  	Icmpcb6 *icb;
	  
	  	icb = (Icmpcb6*) c->ptcl;
	- 
	- 	if(argc==1) {
	- 		if(strcmp(argv[0], "headers")==0) {
	- 			icb->headers = 6;
	- 			return nil;
	- 		}
	+ 	if(argc==1 && strcmp(argv[0], "headers")==0) {
	+ 		icb->headers = 6;
	+ 		return nil;
	  	}
	  	return "unknown control request";
	  }
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:292,307 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:284,298
	  static void
	  goticmpkt6(Proto *icmp, Block *bp, int muxkey)
	  {
	+ 	ushort	recid;
	+ 	uchar 	*addr;
	  	Conv	**c, *s;
	  	IPICMP	*p = (IPICMP *)bp->rp;
	- 	ushort	recid; 
	- 	uchar 	*addr;
	  
	  	if(muxkey == 0) {
	  		recid = nhgets(p->icmpid);
	  		addr = p->src;
	- 	}
	- 	else {
	+ 	} else {
	  		recid = muxkey;
	  		addr = p->dst;
	  	}
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:322,329 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:313,320
	  static Block *
	  mkechoreply6(Block *bp)
	  {
	+ 	uchar addr[IPaddrlen];
	  	IPICMP *p = (IPICMP *)(bp->rp);
	- 	uchar	addr[IPaddrlen];
	  
	  	ipmove(addr, p->src);
	  	ipmove(p->src, p->dst);
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:335,361 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:326,349
	  
	  /*
	   * sends out an ICMPv6 neighbor solicitation
	-  * 	suni == SRC_UNSPEC or SRC_UNI, 
	+  * 	suni == SRC_UNSPEC or SRC_UNI,
	   *	tuni == TARG_MULTI => multicast for address resolution,
	   * 	and tuni == TARG_UNI => neighbor reachability.
	   */
	- 
	  extern void
	  icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac)
	  {
	- 	Block	*nbp;
	+ 	Block *nbp;
	  	Ndpkt *np;
	  	Proto *icmp = f->t2p[ICMPv6];
	  	Icmppriv6 *ipriv = icmp->priv;
	  
	- 
	  	nbp = newIPICMP(sizeof(Ndpkt));
	  	np = (Ndpkt*) nbp->rp;
	  
	- 
	- 	if(suni == SRC_UNSPEC) 
	+ 	if(suni == SRC_UNSPEC)
	  		memmove(np->src, v6Unspecified, IPaddrlen);
	- 	else 
	+ 	else
	  		memmove(np->src, src, IPaddrlen);
	  
	  	if(tuni == TARG_UNI)
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:367,383 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:355,368
	  	np->code = 0;
	  	memmove(np->target, targ, IPaddrlen);
	  	if(suni != SRC_UNSPEC) {
	- 		np->otype = SRC_LLADDRESS;
	- 		np->olen = 1;	/* 1+1+6 = 8 = 1 8-octet */
	+ 		np->otype = SRC_LLADDR;
	+ 		np->olen = 1;		/* 1+1+6 = 8 = 1 8-octet */
	  		memmove(np->lnaddr, mac, sizeof(np->lnaddr));
	- 	}
	- 	else {
	- 		int r = sizeof(Ndpkt)-sizeof(NdiscC);
	- 		nbp->wp -= r;
	- 	}
	+ 	} else
	+ 		nbp->wp -= sizeof(Ndpkt) - sizeof(NdiscC);
	  
	  	set_cksum(nbp);
	- 	np = (Ndpkt*) nbp->rp;
	+ 	np = (Ndpkt*)nbp->rp;
	  	np->ttl = HOP_LIMIT;
	  	np->vcf[0] = 0x06 << 4;
	  	ipriv->out[NbrSolicit]++;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:391,403 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:376,388
	  extern void
	  icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags)
	  {
	- 	Block	*nbp;
	+ 	Block *nbp;
	  	Ndpkt *np;
	  	Proto *icmp = f->t2p[ICMPv6];
	  	Icmppriv6 *ipriv = icmp->priv;
	  
	  	nbp = newIPICMP(sizeof(Ndpkt));
	- 	np = (Ndpkt*) nbp->rp;
	+ 	np = (Ndpkt*)nbp->rp;
	  
	  	memmove(np->src, src, IPaddrlen);
	  	memmove(np->dst, dst, IPaddrlen);
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:407,414 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:392,399
	  	np->icmpid[0] = flags;
	  	memmove(np->target, targ, IPaddrlen);
	  
	- 	np->otype = TARGET_LLADDRESS;
	- 	np->olen = 1;	
	+ 	np->otype = TARGET_LLADDR;
	+ 	np->olen = 1;
	  	memmove(np->lnaddr, mac, sizeof(np->lnaddr));
	  
	  	set_cksum(nbp);
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:423,452 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:408,438
	  extern void
	  icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free)
	  {
	- 	Block *nbp;
	- 	IPICMP *np;
	- 	Ip6hdr	*p;
	  	int osz = BLEN(bp);
	  	int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
	- 	Proto	*icmp = f->t2p[ICMPv6];
	+ 	Block *nbp;
	+ 	IPICMP *np;
	+ 	Ip6hdr *p;
	+ 	Proto *icmp = f->t2p[ICMPv6];
	  	Icmppriv6 *ipriv = icmp->priv;
	  
	- 	p = (Ip6hdr *) bp->rp;
	+ 	p = (Ip6hdr *)bp->rp;
	  
	- 	if(isv6mcast(p->src)) 
	+ 	if(isv6mcast(p->src))
	  		goto clean;
	  
	  	nbp = newIPICMP(sz);
	- 	np = (IPICMP *) nbp->rp;
	+ 	np = (IPICMP *)nbp->rp;
	  
	  	rlock(ifc);
	- 	if(ipv6anylocal(ifc, np->src)) {
	- 		netlog(f, Logicmp, "send icmphostunr -> s%I d%I\n", p->src, p->dst);
	- 	}
	+ 	if(ipv6anylocal(ifc, np->src))
	+ 		netlog(f, Logicmp, "send icmphostunr -> s%I d%I\n",
	+ 			p->src, p->dst);
	  	else {
	- 		netlog(f, Logicmp, "icmphostunr fail -> s%I d%I\n", p->src, p->dst);
	+ 		netlog(f, Logicmp, "icmphostunr fail -> s%I d%I\n",
	+ 			p->src, p->dst);
	  		freeblist(nbp);
	- 		if(free) 
	+ 		if(free)
	  			goto clean;
	  		else
	  			return;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:476,502 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:462,489
	  extern void
	  icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp)
	  {
	- 	Block *nbp;
	- 	IPICMP *np;
	- 	Ip6hdr	*p;
	  	int osz = BLEN(bp);
	  	int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
	- 	Proto	*icmp = f->t2p[ICMPv6];
	+ 	Block *nbp;
	+ 	IPICMP *np;
	+ 	Ip6hdr *p;
	+ 	Proto *icmp = f->t2p[ICMPv6];
	  	Icmppriv6 *ipriv = icmp->priv;
	  
	- 	p = (Ip6hdr *) bp->rp;
	+ 	p = (Ip6hdr *)bp->rp;
	  
	- 	if(isv6mcast(p->src)) 
	+ 	if(isv6mcast(p->src))
	  		return;
	  
	  	nbp = newIPICMP(sz);
	  	np = (IPICMP *) nbp->rp;
	  
	- 	if(ipv6anylocal(ifc, np->src)) {
	- 		netlog(f, Logicmp, "send icmpttlexceeded6 -> s%I d%I\n", p->src, p->dst);
	- 	}
	+ 	if(ipv6anylocal(ifc, np->src))
	+ 		netlog(f, Logicmp, "send icmpttlexceeded6 -> s%I d%I\n",
	+ 			p->src, p->dst);
	  	else {
	- 		netlog(f, Logicmp, "icmpttlexceeded6 fail -> s%I d%I\n", p->src, p->dst);
	+ 		netlog(f, Logicmp, "icmpttlexceeded6 fail -> s%I d%I\n",
	+ 			p->src, p->dst);
	  		return;
	  	}
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:514,540 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:501,528
	  extern void
	  icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp)
	  {
	- 	Block *nbp;
	- 	IPICMP *np;
	- 	Ip6hdr	*p;
	  	int osz = BLEN(bp);
	  	int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
	- 	Proto	*icmp = f->t2p[ICMPv6];
	+ 	Block *nbp;
	+ 	IPICMP *np;
	+ 	Ip6hdr *p;
	+ 	Proto *icmp = f->t2p[ICMPv6];
	  	Icmppriv6 *ipriv = icmp->priv;
	  
	- 	p = (Ip6hdr *) bp->rp;
	+ 	p = (Ip6hdr *)bp->rp;
	  
	- 	if(isv6mcast(p->src)) 
	+ 	if(isv6mcast(p->src))
	  		return;
	  
	  	nbp = newIPICMP(sz);
	- 	np = (IPICMP *) nbp->rp;
	+ 	np = (IPICMP *)nbp->rp;
	  
	- 	if(ipv6anylocal(ifc, np->src)) {
	- 		netlog(f, Logicmp, "send icmppkttoobig6 -> s%I d%I\n", p->src, p->dst);
	- 	}
	+ 	if(ipv6anylocal(ifc, np->src))
	+ 		netlog(f, Logicmp, "send icmppkttoobig6 -> s%I d%I\n",
	+ 			p->src, p->dst);
	  	else {
	- 		netlog(f, Logicmp, "icmppkttoobig6 fail -> s%I d%I\n", p->src, p->dst);
	+ 		netlog(f, Logicmp, "icmppkttoobig6 fail -> s%I d%I\n",
	+ 			p->src, p->dst);
	  		return;
	  	}
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:554,565 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:542,554
	   * RFC 2461, pages 39-40, pages 57-58.
	   */
	  static int
	- valid(Proto *icmp, Ipifc *ifc, Block *bp, Icmppriv6 *ipriv) {
	- 	int 	sz, osz, unsp, n, ttl, iplen;
	- 	int 	pktsz = BLEN(bp);
	- 	uchar	*packet = bp->rp;
	- 	IPICMP	*p = (IPICMP *) packet;
	- 	Ndpkt	*np;
	+ valid(Proto *icmp, Ipifc *ifc, Block *bp, Icmppriv6 *ipriv)
	+ {
	+ 	int sz, osz, unsp, n, ttl, iplen;
	+ 	int pktsz = BLEN(bp);
	+ 	uchar *packet = bp->rp;
	+ 	IPICMP *p = (IPICMP *) packet;
	+ 	Ndpkt *np;
	  
	  	USED(ifc);
	  	n = blocklen(bp);
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:576,584 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:565,573
	  		goto err;
	  	}
	  
	- 	// Rather than construct explicit pseudoheader, overwrite IPv6 header
	+ 	/* Rather than construct explicit pseudoheader, overwrite IPv6 header */
	  	if(p->proto != ICMPv6) {
	- 		// This code assumes no extension headers!!!
	+ 		/* This code assumes no extension headers!!! */
	  		netlog(icmp->f, Logicmp, "icmp error: extension header\n");
	  		goto err;
	  	}
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:595,613 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:584,599
	  	p->ttl = ttl;
	  
	  	/* additional tests for some pkt types */
	- 	if( (p->type == NbrSolicit) ||
	- 		(p->type == NbrAdvert) ||
	- 		(p->type == RouterAdvert) ||
	- 		(p->type == RouterSolicit) ||
	- 		(p->type == RedirectV6) ) {
	- 
	+ 	if (p->type == NbrSolicit   || p->type == NbrAdvert ||
	+ 	    p->type == RouterAdvert || p->type == RouterSolicit ||
	+ 	    p->type == RedirectV6) {
	  		if(p->ttl != HOP_LIMIT) {
	- 			ipriv->stats[HoplimErrs6]++; 
	- 			goto err; 
	+ 			ipriv->stats[HoplimErrs6]++;
	+ 			goto err;
	  		}
	  		if(p->code != 0) {
	- 			ipriv->stats[IcmpCodeErrs6]++; 
	- 			goto err; 
	+ 			ipriv->stats[IcmpCodeErrs6]++;
	+ 			goto err;
	  		}
	  
	  		switch (p->type) {
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:615,687 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:601,671
	  		case NbrAdvert:
	  			np = (Ndpkt*) p;
	  			if(isv6mcast(np->target)) {
	- 				ipriv->stats[TargetErrs6]++; 
	- 				goto err; 
	+ 				ipriv->stats[TargetErrs6]++;
	+ 				goto err;
	  			}
	- 			if(optexsts(np) && (np->olen == 0)) {
	- 				ipriv->stats[OptlenErrs6]++; 
	- 				goto err; 
	+ 			if(optexsts(np) && np->olen == 0) {
	+ 				ipriv->stats[OptlenErrs6]++;
	+ 				goto err;
	  			}
	- 		
	- 			if(p->type == NbrSolicit) {
	- 				if(ipcmp(np->src, v6Unspecified) == 0) { 
	- 					if(!issmcast(np->dst) || optexsts(np))  {
	- 						ipriv->stats[AddrmxpErrs6]++; 
	+ 
	+ 			if(p->type == NbrSolicit)
	+ 				if(ipcmp(np->src, v6Unspecified) == 0)
	+ 					if(!issmcast(np->dst) || optexsts(np)) {
	+ 						ipriv->stats[AddrmxpErrs6]++;
	  						goto err;
	  					}
	+ 
	+ 			if(p->type == NbrAdvert)
	+ 				if(isv6mcast(np->dst) &&
	+ 				    (nhgets(np->icmpid) & Sflag)){
	+ 					ipriv->stats[AddrmxpErrs6]++;
	+ 					goto err;
	  				}
	- 			}
	- 		
	- 			if(p->type == NbrAdvert) {
	- 				if((isv6mcast(np->dst))&&(nhgets(np->icmpid) & Sflag)){
	- 					ipriv->stats[AddrmxpErrs6]++; 
	- 					goto err; 
	- 				}
	- 			}
	  			break;
	- 	
	+ 
	  		case RouterAdvert:
	  			if(pktsz - sizeof(Ip6hdr) < 16) {
	- 				ipriv->stats[HlenErrs6]++; 
	- 				goto err; 
	+ 				ipriv->stats[HlenErrs6]++;
	+ 				goto err;
	  			}
	  			if(!islinklocal(p->src)) {
	- 				ipriv->stats[RouterAddrErrs6]++; 
	- 				goto err; 
	+ 				ipriv->stats[RouterAddrErrs6]++;
	+ 				goto err;
	  			}
	  			sz = sizeof(IPICMP) + 8;
	- 			while ((sz+1) < pktsz) {
	- 				osz = *(packet+sz+1);
	+ 			while (sz+1 < pktsz) {
	+ 				osz = packet[sz+1];
	  				if(osz <= 0) {
	- 					ipriv->stats[OptlenErrs6]++; 
	- 					goto err; 
	- 				}	
	+ 					ipriv->stats[OptlenErrs6]++;
	+ 					goto err;
	+ 				}
	  				sz += 8*osz;
	  			}
	  			break;
	- 	
	+ 
	  		case RouterSolicit:
	  			if(pktsz - sizeof(Ip6hdr) < 8) {
	- 				ipriv->stats[HlenErrs6]++; 
	- 				goto err; 
	+ 				ipriv->stats[HlenErrs6]++;
	+ 				goto err;
	  			}
	  			unsp = (ipcmp(p->src, v6Unspecified) == 0);
	  			sz = sizeof(IPICMP) + 8;
	- 			while ((sz+1) < pktsz) {
	- 				osz = *(packet+sz+1);
	- 				if((osz <= 0) ||
	- 					(unsp && (*(packet+sz) == slladd)) ) {
	- 					ipriv->stats[OptlenErrs6]++; 
	- 					goto err; 
	+ 			while (sz+1 < pktsz) {
	+ 				osz = packet[sz+1];
	+ 				if(osz <= 0 ||
	+ 				    (unsp && packet[sz] == SRC_LLADDR)) {
	+ 					ipriv->stats[OptlenErrs6]++;
	+ 					goto err;
	  				}
	  				sz += 8*osz;
	  			}
	  			break;
	- 	
	+ 
	  		case RedirectV6:
	- 			//to be filled in
	+ 			/* to be filled in */
	  			break;
	- 	
	+ 
	  		default:
	  			goto err;
	  		}
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:690,696 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:674,680
	  	return 1;
	  
	  err:
	- 	ipriv->stats[InErrors6]++; 
	+ 	ipriv->stats[InErrors6]++;
	  	return 0;
	  }
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:706,718 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:690,701
	  		return t_uniproxy;
	  	}
	  
	- 	for(lifc = ifc->lifc; lifc; lifc = lifc->next) {
	+ 	for(lifc = ifc->lifc; lifc; lifc = lifc->next)
	  		if(ipcmp(lifc->local, target) == 0) {
	- 			t = (lifc->tentative) ? t_unitent : t_unirany; 
	+ 			t = (lifc->tentative) ? t_unitent : t_unirany;
	  			runlock(ifc);
	  			return t;
	  		}
	- 	}
	  
	  	runlock(ifc);
	  	return 0;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:721,745 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:704,725
	  static void
	  icmpiput6(Proto *icmp, Ipifc *ipifc, Block *bp)
	  {
	- 	uchar	*packet = bp->rp;
	- 	IPICMP	*p = (IPICMP *)packet;
	- 	Icmppriv6 *ipriv = icmp->priv;
	- 	Block	*r;
	- 	Proto	*pr;
	- 	char	*msg, m2[128];
	- 	Ndpkt* np;
	+ 	int refresh = 1;
	+ 	char *msg, m2[128];
	  	uchar pktflags;
	+ 	uchar *packet = bp->rp;
	  	uchar lsrc[IPaddrlen];
	- 	int refresh = 1;
	+ 	Block *r;
	+ 	IPICMP *p = (IPICMP *)packet;
	+ 	Icmppriv6 *ipriv = icmp->priv;
	  	Iplifc *lifc;
	+ 	Ndpkt* np;
	+ 	Proto *pr;
	  
	- 	if(!valid(icmp, ipifc, bp, ipriv)) 
	+ 	if(!valid(icmp, ipifc, bp, ipriv) || p->type > Maxtype6)
	  		goto raise;
	  
	- 	if(p->type <= Maxtype6)
	- 		ipriv->in[p->type]++;
	- 	else
	- 		goto raise;
	+ 	ipriv->in[p->type]++;
	  
	  	switch(p->type) {
	  	case EchoRequestV6:
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:793,803 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:773,784
	  
	  	case RouterAdvert:
	  	case RouterSolicit:
	- 		/* using lsrc as a temp, munge hdr for goticmp6 
	- 		memmove(lsrc, p->src, IPaddrlen);
	- 		memmove(p->src, p->dst, IPaddrlen);
	- 		memmove(p->dst, lsrc, IPaddrlen); */
	- 
	+ 		/* using lsrc as a temp, munge hdr for goticmp6 */
	+ 		if (0) {
	+ 			memmove(lsrc, p->src, IPaddrlen);
	+ 			memmove(p->src, p->dst, IPaddrlen);
	+ 			memmove(p->dst, lsrc, IPaddrlen);
	+ 		}
	  		goticmpkt6(icmp, bp, p->type);
	  		break;
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:809,824 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:790,806
	  			pktflags |= Oflag;
	  			/* fall through */
	  
	- 		case t_uniproxy: 
	+ 		case t_uniproxy:
	  			if(ipcmp(np->src, v6Unspecified) != 0) {
	- 				arpenter(icmp->f, V6, np->src, np->lnaddr, 8*np->olen-2, 0);
	+ 				arpenter(icmp->f, V6, np->src, np->lnaddr,
	+ 					8*np->olen-2, 0);
	  				pktflags |= Sflag;
	  			}
	- 			if(ipv6local(ipifc, lsrc)) {
	- 				icmpna(icmp->f, lsrc, 
	- 				   (ipcmp(np->src, v6Unspecified)==0)?v6allnodesL:np->src,
	- 				   np->target, ipifc->mac, pktflags); 
	- 			}
	+ 			if(ipv6local(ipifc, lsrc))
	+ 				icmpna(icmp->f, lsrc,
	+ 					(ipcmp(np->src, v6Unspecified) == 0?
	+ 						v6allnodesL: np->src),
	+ 					np->target, ipifc->mac, pktflags);
	  			else
	  				freeblist(bp);
	  			break;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:826,856 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:808,837
	  		case t_unitent:
	  			/* not clear what needs to be done. send up
	  			 * an icmp mesg saying don't use this address? */
	- 
	  		default:
	  			freeblist(bp);
	  		}
	- 
	  		break;
	  
	  	case NbrAdvert:
	  		np = (Ndpkt*) p;
	  
	- 		/* if the target address matches one of the local interface 
	- 		 * address and the local interface address has tentative bit set, 
	- 		 * then insert into ARP table. this is so the duplication address 
	- 		 * detection part of ipconfig can discover duplication through 
	- 		 * the arp table
	+ 		/*
	+ 		 * if the target address matches one of the local interface
	+ 		 * addresses and the local interface address has tentative bit
	+ 		 * set, insert into ARP table. this is so the duplicate address
	+ 		 * detection part of ipconfig can discover duplication through
	+ 		 * the arp table.
	  		 */
	  		lifc = iplocalonifc(ipifc, np->target);
	  		if(lifc && lifc->tentative)
	  			refresh = 0;
	- 		arpenter(icmp->f, V6, np->target, np->lnaddr, 8*np->olen-2, refresh);
	+ 		arpenter(icmp->f, V6, np->target, np->lnaddr, 8*np->olen-2,
	+ 			refresh);
	  		freeblist(bp);
	  		break;
	  
	  	case PacketTooBigV6:
	- 
	  	default:
	  		goticmpkt6(icmp, bp, 0);
	  		break;
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:859,865 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:840,845
	  
	  raise:
	  	freeblist(bp);
	- 
	  }
	  
	  int
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:874,891 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:854,872
	  	e = p+len;
	  	for(i = 0; i < Nstats6; i++)
	  		p = seprint(p, e, "%s: %lud\n", statnames6[i], priv->stats[i]);
	- 	for(i = 0; i <= Maxtype6; i++){
	+ 	for(i = 0; i <= Maxtype6; i++)
	  		if(icmpnames6[i])
	- 			p = seprint(p, e, "%s: %lud %lud\n", icmpnames6[i], priv->in[i], priv->out[i]);
	+ 			p = seprint(p, e, "%s: %lud %lud\n", icmpnames6[i],
	+ 				priv->in[i], priv->out[i]);
	  /*		else
	- 			p = seprint(p, e, "%d: %lud %lud\n", i, priv->in[i], priv->out[i]);
	- */
	- 	}
	+ 			p = seprint(p, e, "%d: %lud %lud\n", i, priv->in[i],
	+ 				priv->out[i]);
	+  */
	  	return p - buf;
	  }
	  
	  
	- // need to import from icmp.c
	+ /* import from icmp.c */
	  extern int	icmpstate(Conv *c, char *state, int n);
	  extern char*	icmpannounce(Conv *c, char **argv, int argc);
	  extern char*	icmpconnect(Conv *c, char **argv, int argc);
	/n/sourcesdump/2007/0417/plan9/sys/src/9/ip/icmp6.c:914,917 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:895,897
	  
	  	Fsproto(fs, icmp6);
	  }
	- 
 [geoff] --rw-rw-r-- M 64 presotto sys 4087 Apr 17 17:06 sys/src/9/ip/ipv6.h

/sys/src/cmd/ndb/dnresolve.c
% cat >/sys/lib/dist/changes/1176838212.1.txt << EOF
• Add better comments
• Disable code that was good in theory, but not in practice
• Reduce timeout from 60s to 30s
EOF
 [geoff] --rw-rw-r-- M 64 glenda sys 30062 Apr 17 15:19 sys/src/cmd/ndb/dnresolve.c
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/ndb/dnresolve.c:540,546 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/ndb/dnresolve.c:540,549
	  		else if (readn(fd, lenbuf, 2) != 2) {
	  			dnslog("readnet: short read of tcp size from %I",
	  				qp->tcpip);
	- 			/* probably a time-out; demote the ns */
	+ 			/*
	+ 			 * probably a time-out; demote the ns.
	+ 			 * actually, the problem may be the query, not the ns.
	+ 			 */
	  			addslug(qp->tcpip);
	  		} else {
	  			len = lenbuf[0]<<8 | lenbuf[1];
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/ndb/dnresolve.c:1028,1040 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/ndb/dnresolve.c:1031,1043
	  	}
	  	procsetname("recursive query for %s %s", qp->dp->name,
	  		rrname(qp->type, buf, sizeof buf));
	- 	qunlock(&qp->dp->querylck);
	+ //	qunlock(&qp->dp->querylck);
	  
	  	queryinit(&nquery, qp->dp, qp->type, qp->req);
	  	nquery.nsrp = tp;
	  	rv = netquery(&nquery, depth+1);
	  
	- 	qlock(&qp->dp->querylck);
	+ //	qlock(&qp->dp->querylck);
	  	rrfreelist(tp);
	  	memset(&nquery, 0, sizeof nquery); /* prevent accidents */
	  	return rv;
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/ndb/dnresolve.c:1246,1253 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/ndb/dnresolve.c:1249,1256
	  	}
	  	if(fd >= 0) {
	  		qp->req->aborttime = time(nil) + (patient? Maxreqtm: Maxreqtm/2);
	- 		/* tune; was (patient? 15: 10) */
	  		qp->udpfd = fd;
	+ 		/* tune; was (patient? 15: 10) */
	  		rv = netquery1(qp, depth, ibuf, obuf, (patient? 10: 5), inns);
	  		close(fd);
	  	} else
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/ndb/dnresolve.c:1277,1289 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/ndb/dnresolve.c:1280,1299
	  	 */
	  
	  	/* don't lock before call to slave so only children can block */
	- 	lock = qp->req->isslave != 0;
	- 	if(lock) {
	+ 	if (0)
	+ 		lock = qp->req->isslave != 0;
	+ 	if(0 && lock) {
	  		procsetname("query lock wait for %s", qp->dp->name);
	- 		/* don't make concurrent queries for this name */
	+ 		/*
	+ 		 * don't make concurrent queries for this name.
	+ 		 *
	+ 		 * this seemed like a good idea, to avoid swamping
	+ 		 * an overloaded ns, but in practice, dns processes
	+ 		 * pile up quickly and dns becomes unresponsive for a while.
	+ 		 */
	  		qlock(&qp->dp->querylck);
	- 		procsetname("netquery: %s", qp->dp->name);
	  	}
	+ 	procsetname("netquery: %s", qp->dp->name);
	  
	  	/* prepare server RR's for incremental lookup */
	  	for(rp = qp->nsrp; rp; rp = rp->next)
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/ndb/dnresolve.c:1323,1331 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/ndb/dnresolve.c:1333,1340
	  //	if (rv == 0)		/* could ask /net.alt/dns directly */
	  //		askoutdns(qp->dp, qp->type);
	  
	- 	if(lock) {
	+ 	if(0 && lock)
	  		qunlock(&qp->dp->querylck);
	- 	}
	  	return rv;
	  }
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/ndb/dnresolve.c:1339,1345 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/ndb/dnresolve.c:1348,1354
	  
	  	memset(&req, 0, sizeof req);
	  	req.isslave = 1;
	- 	req.aborttime = now + Maxreqtm*2;	/* be patient */
	+ 	req.aborttime = now + Maxreqtm;
	  	queryinit(&query, dnlookup(root, Cin, 1), Tns, &req);
	  	query.nsrp = dblookup(root, Cin, Tns, 0, 0);
	  	rv = netquery(&query, 0);

/sys/src/cmd/upas/smtp/mxdial.c
% cat >/sys/lib/dist/changes/1176838212.2.txt << EOF
• Style cleanup
• Alarm if we can't resolve within 60s.
EOF
 [geoff] --rw-rw-r-- M 64 glenda sys 6567 Apr 17 15:19 sys/src/cmd/upas/smtp/mxdial.c
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:79,85 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:79,85
	  	}
	  
	  	/* refuse to honor loopback addresses given by dns */
	- 	for(i = 0; i < nmx; i++){
	+ 	for(i = 0; i < nmx; i++)
	  		if(strcmp(mx[i].ip, "127.0.0.1") == 0){
	  			if(debug)
	  				fprint(2, "mxlookup returns loopback\n");
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:86,92 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:86,91
	  			werrstr("illegal: domain lists 127.0.0.1 as mail server");
	  			return -1;
	  		}
	- 	}
	  
	  	/* sort by preference */
	  	if(nmx > 1)
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:123,131 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:122,130
	  	/* just in case we find no domain name */
	  	strcpy(domain, ds->host);
	  
	- 	if(ds->netdir){
	+ 	if(ds->netdir)
	  		n = mxlookup1(ds, domain);
	- 	} else {
	+ 	else {
	  		ds->netdir = "/net";
	  		n = mxlookup1(ds, domain);
	  		if(n == 0) {
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:140,149 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:139,148
	  static int
	  mxlookup1(DS *ds, char *domain)
	  {
	- 	char buf[1024];
	- 	char dnsname[Maxstring];
	- 	char *fields[4];
	  	int i, n, fd, nmx;
	+ 	long oalarm;
	+ 	char buf[1024], dnsname[Maxstring];
	+ 	char *fields[4];
	  
	  	snprint(dnsname, sizeof dnsname, "%s/dns", ds->netdir);
	  
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:152,161 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:151,167
	  		return 0;
	  
	  	nmx = 0;
	- 	snprint(buf, sizeof(buf), "%s mx", ds->host);
	+ 	snprint(buf, sizeof buf, "%s mx", ds->host);
	  	if(debug)
	  		fprint(2, "sending %s '%s'\n", dnsname, buf);
	+ 	/*
	+ 	 * don't hang indefinitely in the write to /net/dns.
	+ 	 */
	+ 	atnotify(timeout, 1);
	+ 	oalarm = alarm(60*1000);
	  	n = write(fd, buf, strlen(buf));
	+ 	alarm(oalarm);
	+ 	atnotify(timeout, 0);
	  	if(n < 0){
	  		rerrstr(buf, sizeof buf);
	  		if(debug)
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:170,176 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:176,182
	  		 *  get any mx entries
	  		 */
	  		seek(fd, 0, 0);
	- 		while(nmx < Nmx && (n = read(fd, buf, sizeof(buf)-1)) > 0){
	+ 		while(nmx < Nmx && (n = read(fd, buf, sizeof buf-1)) > 0){
	  			buf[n] = 0;
	  			if(debug)
	  				fprint(2, "dns mx: %s\n", buf);
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:227,233 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:233,239
	  		mx[i] = mx[nmx];
	  		i--;
	  	}
	- 	return nmx;		
	+ 	return nmx;
	  }
	  
	  static int
	/n/sourcesdump/2007/0417/plan9/sys/src/cmd/upas/smtp/mxdial.c:291,297 - 
	/n/sourcesdump/2007/0418/plan9/sys/src/cmd/upas/smtp/mxdial.c:297,303
	  		return;
	  	}
	  
	- 	snprint(buf, sizeof(buf), "!ipinfo %s", ds->host+1);	// +1 to skip $
	+ 	snprint(buf, sizeof buf, "!ipinfo %s", ds->host+1);	// +1 to skip $
	  	if(write(fd, buf, strlen(buf)) <= 0){
	  		if(debug)
	  			fprint(2, "write %s: %r\n", cs);


Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.