-----------------------------------------------------------------------------
This file contains all typos found in the book "TCP/IP Illustrated, Volume 2"
by Gary R. Wright and W. Richard Stevens, Addison-Wesley, 1995,
ISBN 0-201-63354-X.  (Last updated July 12, 1999)

Note: If you fetched this file using anonymous ftp from ftp.uu.net,
      be aware that a more current copy can probably be found at
      the home page http://www.kohala.com/~rstevens.

See also the "Comments to Readers" at the end of this file.
-----------------------------------------------------------------------------

The following errors are corrected in the Seventh Printing and later
(check the last line on the copyright page to determine the printing).
-----------------------------------------------------------------------------

p.  84:	8th line of text: "if the driver selects a length" should be
	"if the driver does not select a length".

p.  90:	9th line of description for lines 100-116: "ifa_addrlist" should be
	"if_addrlist".

p. 100:	Indented paragraph near middle of page: "(le_softc[0]), le_softc"
	remove the extraneous "le_softc" after the comma.

p. 104:	3rd line beneath Figure 4.12: "M_MCAST is set in the mbuf header"
	should be "M_MCAST is set in the flags variable".

p. 1143: On the index entry for "if_addrlist" change "91" to "90-91".

p. 1144: Delete index entry for "ifa_addrlist".

The following errors are corrected in the Sixth Printing and later (check the
last line on the copyright page to determine the printing).
-----------------------------------------------------------------------------

p.  65:	6th line below Figure 3.3: "such an integer value" should be
	"such as an integer value".

p. 337:	3rd line of 3rd paragraph: "host have" should be "host to have".

p. 339:	3rd line of 3rd paragraph: "(Figure 6.17)" should be "(Figure 6.19)".

p. 341:	1st line of 3rd paragraph: "a Ethernet" should be "an Ethernet".

p. 355:	1st line of Section 12.11: "(Figure 6.17)" should be "(Figure 6.19)".

p. 364:	2nd line of description for lines 419-441: "interfaces arpcom
	structure" should be "interface's arpcom structure".

p. 366:	Figure 12.34: the rightmost structure should be "ip_moptions{}"
	not "in_moptions{}".

p. 376:	2nd line of descriptiron for lines 129-155: "If they do not"
	should be "If it does not".

p. 395:	First line "123-146" should be "123-156".

p. 405:	An error was introduced with the 2nd printing: the final word on
	this page "in" moved to the top of p. 406.  This was fixed in the
	6th printing when p. 406 was reprinted (next errata item).

p. 406:	1st line of last paragraph: "Figure 14.16 illustrates" should be
	"Figure 14.15 illustrates".

p. 477:	4th line from top: "The flow control algorithms" should be "The
	buffering algorithms".

p. 477:	5th line from top: "Sections 16.4 and 16.8" should be "Sections
	16.7 and 16.12".

p. 491:	Immediately before the 3rd paragraph ("Figure 16.22 shows") add
	the unnumbered section heading "sosend Code".

p. 677:	2nd line of bullet 3: "interface route" should be "network route".

p. 680:	Figure 21.4: Description for arpt_prune should be "#seconds between
	checking ARP list (5 * 60)".

p. 680:	Figure 21.4: Description for arpt_keep should be "#seconds ARP
	entry valid once resolved (20 * 60)".

p. 692:	3rd line of description of lines 415-420: "Figure 21.1" should be
	"Figure 21.3".

p. 693:	2nd line from bottom: line numbers in margin should be "433-436".

p. 698:	Caption for Figure 21.24: "arpresolve2" should be "arpresolve".

p. 701:	2nd paragraph above Figure 21.26: "if the entry is not found and
	a new entry should be created" should be "if a new entry should be
	created if the entry is not found".

p. 702:	Indented paragraph at the bottom of the page: delete "comment in the"
	so that it begins "The log message".

p. 706:	3rd line of description for lines 92-105: "1 clock tick" should be
	"1 second".

p. 1077:Last line of 13.3: "Figure 5.16" should be "Figure 5.17".

The following errors are corrected in the Fourth Printing and later (check the
last line on the copyright page to determine the printing).
-----------------------------------------------------------------------------

p. xxii:W. Richard Stevens' home page has moved to
	http://www.kohala.com/~rstevens.

p.   9:	5th line from the bottom: the [Piscitello and Chapin 1994] reference
	is 1993, not 1994.

p.  32:	End of 2nd line from the bottom: "chain mbufs" should be "mbuf chain".

p.  33:	2nd line from top of page: "received packets contains" should be
	"received packets it contains".

p.  52:	Description for MFREE: "On return m's successor" should be "On
	return, the pointer to m's successor".

p.  53:	In the description of m_adj, all three occurrences of "mbuf" should
	be "mbuf chain".

p.  53:	In the function prototype for m_devget(), one more closing paren
	should appear between the "u_int" and the semicolon.

p.  56:	Last line: "on" should be "in".

p.  63:	3rd line of 3rd paragraph: "supports provides" should be "provides".

p.  70:	2nd line from bottom: "is quick solution" should be "is a quick
	solution".

p.  73:	2nd line of indented paragraph: "to call splx before m_free" should be
	"to call splx before m_freem".

p.  87:	2nd line of 2nd paragraph: "pointer into a sockaddr_dl structure to a"
	should be "pointer to a sockaddr_dl structure into a".

p.  90:	2nd line of 1st paragraph: "just after the ifnet structure" should be
	"just after the ifaddr structure".

p.  91:	Caption for Figure 3.39: "ifnet" should be "ifaddr".

p.  95:	6th line from bottom of page: "Figure 3.6" should be "Figure 3.11".

p.  97:	Figure 4.5, the counter if_imcasts really counts "#packets received
	as multicasts or broadcasts".

p. 115:	Figure 4.21: the ellipses for the functions sltioctl, loioctl, and
	slioctl should not be shaded, as they are not described in Chapter 4.

p. 130:	For sl_close in Figure 5.7 "sl_softc structures" should be
	"sl_softc structure".

p. 131:	Indented note: "In Net/3 sc_ttyp and t_sc ..." should have the
	word "respectively" added to the end of the sentence.

p. 136:	Second sentence describing lines 637-649: "the pointers are
	advanced" should be "the pointer is advanced".

p. 146:	Second line of third paragraph: "causes slstart to fall out of the
	inner while loop".  Change "inner" to "middle".

p. 151:	Line 75 of the program contains an extraneous "a".

p. 152:	First line describing code lines 69-83: "constructs the BPF loopback
	packet" should be "constructs the BPF loopback packet header".

p. 153:	Last line of Section 5.5: "their destination address" should be
	"their destination address family".

p. 166:	The code description line numbers "192-206" near the bottom of the
	page should be "192-201".

p. 168:	The code description line numbers near the bottom of the page:
	"353-357" should be "353-359" and "358-374" should be "360-374".

p. 189:	6th line from bottom: "PRxxx" should be "PR_xxx".

p. 193:	Last sentence that begins on the previous page ("The") and continues
	on this page should read: "The offset of an IP address from the
	beginning of a sockaddr_in structure is 32 bits and the size of
	the structure is 16 bytes (Figure 18.27)."

p. 194:	Last line: "lists" should be "list".

p. 202:	Figure 7.25: The two labels "ICMPCTL_MASKREPL" and "UDPCTL_CHECKSUM"
	should be interchanged.

p. 207:	2nd line of "Statistics": "Figure 8.4 shows some sample output" should
	reference Figure 8.5.

p. 211:	Figure 8.8: "ip_cksum" should be "ip_sum".

p. 216:	In the description for code lines 161-177, both occurrences of "mbuf"
	should be "mbuf chain".

p. 219:	Figure 8.14: the Ethernet address for "ia_broadaddr" should be
	140.252.13.63, not 140.252.13.224.

p. 220:	First line describing code lines 325-332: "The protocol specified in
	the datagram is mapped by ip_p with the ip_protox array" should be
	"The protocol specified in the datagram (ip_p) is mapped with the
	ip_protox array".

p. 221:	Indented paragraph halfway down page: "addresses" should be "address".

p. 229:	Caption for Figure 8.23: "flag" should be "flags".

p. 235:	The reference "[Mano 1982]" at the end of the 5th paragraph should
	be dated 1993.

p. 239:	Last line of Section 8.7: change "./sys/vax/vax/in_cksum.c" to
	"sys/vax/in_cksum.c".

p. 243:	First line of PRCO_GETOPT processing: "Figure 8.32" should be
	"Figure 8.33".

p. 253:	Following the sentence that ends below Figure 9.10 ("is recorded")
	add the following sentence: "(The INA and SA macros are defined in
	Figure 9.15.)".

p. 258:	Last line of text: "route route" should be "source route".

p. 259:	Line numbers on final code description should be "784-790".

p. 260:	Add line numbers "791-804" to the code description (the last 4 lines
	of the page).

p. 265:	4th line from the top: "ip_forward where they are merged" should be
	"ip_output where they are merged".

p. 265:	3rd line from the bottom: "ip_dooptions does not expect" should be
	"ip_output does not expect".

p. 269:	Line 564 of the code should begin with "int".

p. 271:	Near bottom of page, two occurrences of "SRR" should be "SSRR".

p. 283:	2nd last line of page: "mtod macros" should be "dtom macro".

p. 292:	Last line of final indented paragraph: swap order of "ip_deq" and
	"ip_enq" (so they are in the same order as "insque and "remque".

p. 292:	3rd line from bottom: "after reassembly" should be "during reassembly".

p. 298:	5th line from bottom, remove parens around "(Figure 2.13)".

p. 309:	Figure 11.12, last line: replace second column of "0" with
	"icmp_sysctl" and replace third column of "not used by ICMP"
	with "modify ICMP parameters".

p. 310:	Second line beneath Figure 11.13: "(Figure 10.11)" should be
	"(Figure 8.15)".

p. 312:	Second to last line of indented paragraph: "packet instead of"
	should be "packet, instead of".

p. 312:	Line above Figure 11.16: "several constants" should be "several
	constants and a macro".

p. 312:	Figure 11.16: caption: "Constants" should be "Constants and a macro".

p. 314:	Figure 11.17: the three fields labelled "len" should be "code".

p. 314:	Figure 11.17: the three descriptions "IP header from bad packet"
	should be "IP header and data from bad packet".

p. 314:	Figure 11.17: the length of the final field "8 bytes" should be
	"at least 28 bytes".

p. 319:	Figure 11.24, caption: "address request" should be "address mask
	request".

p. 321:	Second line: "the code at reflect (Figure 11.21) reverses" should
	be "the code at reflect (Figure 11.21) calls icmp_reflect, which
	reverses".

p. 323: Third line from bottom: "statement at raw (Figure 11.15)" should
	be "statement at raw".

p. 324:	Figure 11.29: the box labelled "ICMP input processing" should be
	"ICMP request processing" and the label beneath should be changed
	from "(Figure 11.15)" to "(Figure 11.21)".

p. 324:	4th line from the bottom of the page: "The length in bytes of
	the original IP packet" should be "The length in bytes of the
	original IP header".

p. 350:	1st line of 3rd paragraph below Figure 12.18: "A multicast datagram
	that start with", "start" should be "starts".

p. 473:	Description for lines 115-119: should be: "If the socket is on a
	connection queue (so_head is nonnull), soqremque is called to remove
	the socket.  An attempt is made to remove the socket from the
	incomplete connection queue and if this fails, then from the
	completed connection queue.  One of the removals must succeed,
	or the kernel panics, since so_head was nonnull."

p. 478:	Figure 16.6: definitions of sorwakeup and sowwakeup: "events on sb"
	should be "events on so".

p. 478:	Figure 16.7, definition of sbspace: add parens: should be
	min((sb_hiwat - sb_cc), (sb_mbmax - sb_mbcnt)).

p. 479:	Figure 16.7: definitions of sbappend and sbinsertoob: add the
	sentence "Call sbcompress".

p. 483:	"307-319" should be "307-321" and "320-334" should be "322-334".

p. 493:	"395-414" should be "397-413".

p. 494:	Description for lines 312-313: 3rd line: "if some data has been
	received" should be "if some data has been sent".

p. 500:	5th line from top of page: "pointer to the protosw array" should
	be "pointer in the protosw array".

p. 500:	2nd paragraph of "Performance considerations", 2nd line: "to a
	sending" should be "to sending".

p. 515:	2nd and 3rd lines from the top: "(sb_cc < uio_resid) and MSG_DONTWAIT
	is not set," should be "(sb_cc < uio_resid and MSG_DONTWAIT is not
	set),".

p. 515:	10th line from the top: the test "(uio_resid <= sb_hiwat)" should
	be a "greater-than" test, not less-than-or-equal-to.

p. 516:	4th line of text: "before a data arrives" should be "before any
	data arrives".

p. 531:	Description of lines 41-44: "sl_pid" should be "si_pid".
	Also, both occurrences of "sl_flags" should be "si_flags".

p. 538:	Figure 17.1: "pr_ctloutout" should be "pr_ctloutput".

p. 539:	Description of lines 565-597: line 2: "from process" should be
	"from the process".

p. 544:	Description of lines 831-840: 3rd line: "Sections 16.7 and 16.11"
	should be "Sections 16.7 and 16.12".

p. 546:	Description of lines 856-871: 3rd line: "mbuf pointed to by mp"
	should be "mbuf pointed to by *mp".

p. 548:	Paragraph above Figure 17.14: "The third and last part" should be
	"The fourth and last part".

p. 548:	Description of lines 907-917: "copied into var" should be "copied
	into val".

p. 552:	"186-194" should be "186-209".

p. 554:	Indented paragraph: "As we described in Chapter 19" should be
	"As we describe in Chapter 19".

p. 559:	Last line of second bullet: "a interface" should be "an interface".

p. 562:	Second indented paragraph, add the sentence: "These are actually
	binary radix tries with one-way branching removed."

p. 566:	3rd line of first example: "A network mask" should be "A network
	match".

p. 566:	3rd line, 3rd paragraph of first example: "Another search is made
	started" should be "Another search is made starting".

p. 567:	Caption of Figure 18.7 should refer to Figure 18.4, not Figure 18.6.

p. 575:	Last word of indented paragraph should be "structure" not
	"structures".

p. 576:	Description for RNF_ROOT in Figure 18.20 should be "node is in the
	radix_node_head structure".

p. 579:	4th line from top: "so_dst" should be "ro_dst".

p. 582:	Figure 18.28: the 4th field in the first sockaddr_dl{} pointed to
	by the first ifaddr{} should be "6", not "18".

p. 582:	Figure 18.28: the rt_gwroute points to an rtentry{}, not a
	radix_node{} (although the latter is the first member of the former).

p. 582:	Figure 18.28: the second member of the second ifaddr{} should be
	named "ifa_broadaddr" not "ifa_brdaddr".

p. 583:	Figure 18.29: the comment for rn_inithead() should be
	"dom_rtattach() function" not "dom_attach() function".

p. 595:	2nd line in description of lines 197-210: "linked list of radix_node"
	should be "lined list of radix_mask".

p. 604:	end of 2nd last line on page: "process control block" should be
	"protocol control block".

p. 629:	4th line of description of lines 588-591: "rti_info array named
	info" should be "rti_info array in info".

p. 632:	4th line of Section 19.13: "has an argument to a walkarg structure"
	should be "has as an argument a pointer to a walkarg structure".

p. 640:	End of 5th line from top: "The third pointer" should be "The
	third argument".

p. 644:	Exercise 19.2: "with the command" should be "with a command".

p. 852:	2nd line of description for lines 62-68: "a segment has not been
	received from the other end in one round-trip time" should be "a
	segment has not been received from the other end in one RTO".

p. 872:	Figure 26.23 should really start with line 222 (the label "send",
	which is shown in Figure 26.1).

p. 881:	The caption for Figure 26.31 should be: "tcp_output function:
	update sequence number, initialize retransmit timer."

p. 971:	5th line from bottom: "been been" should be "been".

p. 1070: Last line: "notices that the IP header length" should be "notices
	 that the length in the IP header".

p. 1073: Answer for Exercise 10.3: "(204 + 20)" should be "(216 + 20)".

p. 1079: Answer for Exercise 18.1: 2nd paragraph: "same bit in the routing
	 table mask is 1" should be "same bit in the routing table mask is 0".

p. 1099: 4th bullet: "ip_cksum" should be "in_cksum".

p. 1105: 3rd bullet, second line: "maximum MTU" should be "MTU".

p. 1105: 6th bullet, second line: "minimum path MTU" should be "path MTU".

p. 1106: 7th bullet, first line: "an link-layer" should be "a link-layer".
	 Next line of this bullet: "messages that arrive" should be
	 "messages in response to packets that arrived".

p. 1106: 8th bullet: "an noninitial" should be "a noninitial".

p. 1106: 9th bullet, first line: "an datagram" should be "a datagram".

p. 1107: 2nd bullet, second line: "No" should be "Partially".

p. 1122: 3rd bullet of "Receiving ICMP Messages from IP", 3rd line: "these
	 ICMP error" should be "these ICMP errors".

p. 1130: [Partridge 1993] is available from
	    http://www.kohala.com/~rstevens/vanj.93sep07.txt

p. 1143: Add page 309 to the list for icmp_sysctl.

p. 1146: Add page 1099 to the list for in_cksum.

p. 1148: Delete the index entry for ip_cksum.

p. 1149: Add page 211 to the list for ip_sum.

p. 1160: Add page 579 to the list for ro_dst.

p. 1163: Create a new entry for si_flags, with page 531.

p. 1163: Add page 531 to the list for si_pid.

p. 1164: Delete the entry for sl_flags.

p. 1164: Delete the entry for sl_pid.

p. 1165: Delete the entry for so_dst.

The following errors are corrected in the Third Printing and later (check the
last line on the copyright page to determine the printing).
-----------------------------------------------------------------------------

front right end paper: Add "ifqueue   71"

p. xvii: Section 28.6 should be titled "Initiation of Passive Open, Completion
	 of Active Open".

p. xxii: Add the authors' home page addresses:
	 	http://www.connix.com/~gwright
	 	http://www.noao.edu/~rstevens

p.  96:	Figure 4.3: net/if_ether.h should be netinet/if_ether.h.

p.  98:	First bullet beneath Figure 4.6: denominator of 23,234,729 should be
	29,234,729 (the same value as in the Figure).

p. 168:	5th line from bottom: "in_control saves the previous address" should
	be "in_ifinit saves the previous address".

p. 171:	2nd line of text: "in_control copies" should be "in_ifinit copies".

p. 171:	6th line of text: "in_control returns" should be "in_ifinit returns".

p. 195:	Figure 7.16: add "raw" to the single entry for "routesw[]:".

p. 289:	Figure 10.17: the ending offset for the third fragment for ip_id=5
	should be 815, not 814.

p. 323:	end of 4th line: "(Section 7.3)" should be "(Section 7.7)".

p. 340:	Figure 12.2: net/if_ether.h should be netinet/if_ether.h.

p. 366:	Figure 12.34: last entry in in_moptions{} structure should be
	"membership[19]" not "membership[20]".

p. 407:	Figure 14.15: "viftable:" should be "viftable[]:".

p. 420:	Figure 14.29: "mrttable:" should be "mrttable[]:".

p. 425:	2nd line beneath Figure 14.36: replace "dotted arrows" with
	"dashed arrows".

p. 442:	Add an entry for sodisconnect to Figure 15.9, between socantrcvmore
	and soisdisconnecting:

		sodisconnect	Issue the PRU_DISCONNECT request.

				int  sodisconnect(struct socket *so);

p. 464:	Figure 15.30: in keeping with the style of the book, the "kern/"
	in "kern/uipc_socket2.c" should be removed from the horizontal rules.

p. 560:	Figure 18.1: the subnet address of the Ethernet should be 140.252.13.32,
	not 140.252.13.0.

p. 560:	Last character of last line on page should be a period, not a comma.

p. 582:	Figure 18.28: in the inpcb{} at the upper right the first byte of the
	IP address should be "80", not "08".

p. 582:	Figure 18.28: in the three sockaddr_in{} at the bottom right, the IP
	address of the top one (pointed to by the ifa_addr pointer of the
	ifaddr{}) should end in .35, not .33.  Siimilarly the final hex byte
	beneath it should be 23, not 21.

p. 743:	Figure 22.32: in the line up and to the left from "icmp_input" the 
	comma should be removed from "time exceeded" and placed on "source
	quench".

p. 749:	Sentence above Figure 22.36: "has expired for the third time in a row
	for a given connection" should be "has expired four or more times in
	a row for a given connection (Figure 25.26)".

p. 780:	Second line of item 2: "the destination address for the reply"
	should be "the source address for the reply".

p. 798:	Figure 24.4: tcps_accepts should be described as "#SYNs received in
	LISTEN state".

p. 798:	Figure 24.4: tcps_connects should be described as "#connections
	established actively or passively".

p. 828:	(This and next three typos are caused by Figures 25.15 and 25.16
	being numbered out-of-order-of-appearance.)
	Line above "Connection-establishment timer expires after 75 seconds"
	should reference Figure 25.16, not Figure 25.15.

p. 828:	Line above Figure 25.16 should be "Figure 25.15 shows these two timers".

p. 828:	Figure 25.16 should be numbered 25.15.

p. 829:	Figure 25.15 should be numbered 25.16.

p. 830:	7th line from bottom: 14339 should be 14399.

p. 830:	First line of final paragraph should reference Figure 25.16, not
	Figure 15.15.

p. 852:	3rd line of Section 26.2: "Is an ACK is": remove extraneous "is".

p. 892:	Description for 5th entry in Figure 27.1 should reference Figure 25.15
	instead of Figure 25.16.

p. 897:	The code description labeled "307-309" should be labeled "307-311".
	The final sentence of this description ("The socket is marked ...")
	should be replaced with "soisdisconnected marks the socket as
	disconnected."

p. 897:	The code description labeled "310-318" should be labeled "312-318".

p. 917:	(This and the next three typos are caused by Figures 27.27 and 27.26
	being numbered out-of-order-of-appearance.)
	Line following Figure 27.25: "Figure 27.26 shows the main body"
	should be "Figure 27.27 shows the main body".

p. 917:	First line beneath "Sample Output" heading: "Figure 27.27 shows the
	first four lines" should begin "Figure 27.26".

p. 917:	Figure 27.27 should be numbered 27.26.

p. 918:	Figure 27.26 should be numbered 27.27.

p. 942:	Section 28.6 should be titled "Initiation of Passive Open, Completion
	of Active Open".  Similarly the subtitle 4 lines down should be
	"Initiation of Passive Open".

p. 946:	End of 2nd line from top: "Fig-ure 28.28 is executed" should reference
	Figure 28.29.

p. 948:	In the heading for the sentence describing line 559:
	"connection-establishment timer" should be "retransmission timer".
	Change the sentence below the heading accordingly.

p. 957: (This and the next three typos are caused by Figures 28.28 and 28.29
	being numbered out-of-order-of-appearance.)
	Halfway down the page: "The next piece of code, shown in Figure 28.28"
	should reference Figure 28.29.

p. 957:	Line above Figure 28.29: For example, in Figure 28.29" should
	reference Figure 28.28.

p. 957:	Figure 28.29 should be numbered 28.28.

p. 958:	Figure 28.28 should be numbered 28.29.

p. 979:	Delete page 118 from the index entry for FIN_WAIT_1.
	Add page 118 to the index entry for FIN_WAIT_2 (980418).

p. 992:	Last word of first line of Section 29.11: "dropaterack" should be
	"dropafterack".

p. 1012:Last line of description for lines 155-158 should reference
	Figure 25.15, not Figure 25.16.

p. 1036:Figure 31.14: the label "bpf_dtab:" above the array should be
	"bpf_dtab[]:" since it's accessed as an array.

p. 1037:Figure 31.15: same fix as for Figure 31.14.

p. 1060:First line of text: "at least one IP interface must be configured,":
	delete "IP".

p. 1085:Last line of solution for Exercise 25.6 should reference Figure 25.16,
	not Figure 25.15.

p. 1089:2nd line from top: "as checked for in Figure 28.28" should reference
	Figure 28.29.

p. 1117:1st bullet under "TCP Options": "Yes:" should be "Yes."

p. 1118:3rd bullet: "Yes:" should be "Yes."

p. 1119:Line above "Retransmissions": "Yes, as shown in Figure 28.28" should
	reference Figure 28.29.

p. 1119:2nd line below "Retransmissions": "Yes:" should be "Yes."

p. 1119:5th bullet below "Retransmissions": Figure 25.16 should be Figure 25.15.

p. 1119:6th bullet below "Retransmissions": Figure 25.16 should be Figure 25.15.

p. 1121:4th bullet under "Connection Failures": "No:" should be "No."

p. 1121:6th bullet under "Connection Failures": Figure 25.16 should be
	Figure 25.15.

p. 1121:7th bullet under "Connection Failures": Figure 25.16 should be
	Figure 25.15.

p. 1121:3rd bullet under "Keepalive Probes": "Yes:" should be "Yes."

p. 1126:[Braden 1993] is available from:
	http://www.kohala.com/~rstevens/tcplw-extensions.txt

p. 1126:[Comer and Lin 1994] is available from:
	ftp://gwen.cs.purdue.edu/pub/lin/TCP.atm.ps.Z

p. 1128:The URL for the [Jacobson 1993] overheads has moved from the papers/
	directory to the talks/ directory.

p. 1134:After "AIX" add the entry "alias, IP address, 174-177".

p. 1137:Remove page 948 from the entry for "connection-establishment timer".

p. 1141:Add the entry "template, 885" under "header".

p. 1145:Add page 71 to the entry for "ifqueue, structure".

p. 1154:Above "National Optical Astronomy Observatory" add the entry "Nagle
	algorithm, 858-859".

p. 1159:Add page 948 to the entry for "retransmission timer".

p. 1166:Add page 442 to the entry for sodisconnect and delete page 897
	from this entry.

p. 1166:Add page 897 to the entry for soisdisconnected.

back right end paper: Add "sodisconnect   442"
                      Add "TCP_REXMTVAL   840"

The following errors are corrected in the Second Printing and later (check the
last line on the copyright page to determine the printing).
-----------------------------------------------------------------------------

p.   i: (The unnumbered title page with the Addison-Wesley logo and locations
	at the bottom.)  The order of the author's names is reversed.

p.  xx:	The running headers at the top of the page are missing from all the
	pages in the Preface (xx, xxi, xxii).

p.  31:	Last sentence on page should be "an example of this type of mbuf"
	(add the word "of").

p.  34:	For clarity the following indented paragraph should be added to the
	bottom of the page: "The difference in the placement of the protocol
	headers in the first mbuf for the UDP and TCP examples is caused by
	UDP calling M_PREPEND (Figure 23.15 and Exercise 23.1) while TCP
	calls MGETHDR (Figure 26.25)."

p.  43:	6th line from bottom should be "which allocate and release" (the "a"
	should be "and").

p.  53:	Figure 2.20: third line of description for m_copym: "chain start at"
	should be "chain starting at".

p.  54:	2nd paragraph of bullet 3: "We encounter this with the interface
	queues" should be "We encounter this with the interface queues
	(Figure 3.13)" for added clarification.

p.  67:	Title for Figure 3.6 should be: "ifnet structure: implementation
	information."

p. 110:	3rd line describing lines 142-146: "bcopy duplicates the entire
	header": "entire header" should be "destination address".

p. 111:	First line should be "room for 14 bytes" (the "4" should be "14).

p. 152:	Figure 5.29: the leftmost mbuf should be labeled "m0", not "mo".

p. 164:	3rd line should be "where most of the processing occurs" (add the word
	"of").

p. 170:	Code line 393: remove one "may".

p. 191:	Next to last line should start with "Figure 7.14", not "Figure 7.13".

p. 193:	In the indented paragraph below Figure 7.14, replace "rip_input"
	with "rip_init".

p. 207:	Add an entry to Figure 8.3 for "ipforward_rt", a "struct route" that
	contains a "cache of most recent forwarded route".

p. 220:	Second line of Section 8.5: "ip_output calls the function ip_forward"
	should be "ipintr calls the function ip_forward".

p. 226:	In the description of lines 941-954, add the following sentence
	right after "in the route ipforward_rt.": "The IP_ALLOWBROADCAST
	flag allows the packet being forwarded to be a directed broadcast
	to a local network."

p. 228:	Final sentence of first paragraph of Section 8.6: replace "Chapter 32"
	with "Chapter 20" and replace "protocol-independent socket layer calls"
	with "protocol-independent routing sockets call".

p. 229:	Figure 8.23: add another line to the table:
	    IP_RAWOUTPUT  Packet contains preconstructed IP header

p. 239:	In the two function prototypes for getsockopt() and setsockopt(),
	the 4th argument (optval) should be a "const void *" for setsockopt(),
	and just a "void *" for getsockopt().

p. 241:	The comment in the 2nd shaded area in Figure 8.31 references
	PRCO_SETOPT, which should be PRCO_GETOPT.

p. 245:	The description for lines 996-1008 should read: The switch statement
	selects the appropriate call to sysctl_int, which accesses or modifies
	ipforwarding, ipsendredirects, or ip_defttl.  EOPNOTSUPP is returned
	for unrecognized options.

p. 261:	Figure 9.20: the parenthetical note next to srcopt[0] should be
	"IPOPT_LSRR or IPOPT_SSRR" (which correspond to the two values
	shown, 131 and 137).

p. 262:	7th line from the bottom should be "(ipt_flg equals 1 or 3)"
	(the "2" should be a "3").

p. 271:	4th line from bottom should be "will be removed and" (add the "be").

p. 273:	Exercise 9.3: in final sentence "source routes" should be "source
	route".

p. 279:	Code description for lines 285-290 should be: "Copy the IP header
	and IP options from the original packet into the new packet.  The
	former is copied with a structure assignment.  ip_optcopy ...".

p. 283:	2nd sentence of Section 10.5 should be "In Figure 8.15 we omitted"
	(not Figure 8.25).

p. 288:	The null "prev" pointer in the top ipq{} should be a pointer to the
	end of the list, and the null "next" pointer in the bottom ipq{}
	should be a pointer to the start of the list.  It's a circular list.

p. 292:	In Figure 10.20 the prototype for remque should be "void *node"
	and not "void *prev".

p. 295:	Code line 401 should end with a closing paren and an opening brace.

p. 324:	Section 11.11 should begin "The icmp_error function" (not icmp_output).

p. 324:	3rd line of Section 11.11: replace the comma after "datagram" with a
	period, and change "is is" to "is".

p. 342:	5th line of Section 12.4 should read "datagrams that pass through the
	hardware filter" (add "that").

p. 352:	Line 862: replace "no need to keep the mbuf" with "no need to
	keep the structure".

p. 353:	First line: "Discard mbuf if defaults are OK" should be "Discard
	structure if defaults are OK".

p. 356:	In Figure 12.25 replace the reference to "loioctl" with "leioctl".

p. 405:	2nd line from bottom of page: "protcol" should be "protocol".

p. 412:	In the description for lines 327-332 replace "and the new group is
	stored in the lookup cache" with "and if the cache already contains
	the new group, the cache is marked as valid."

p. 417:	Delete one of the two consecutive commas on the first line of the
	fourth paragraph.

p. 430:	Figure 14.42: in the mbuf containing the tunnel options, the IP
	header and tunnel options are placed at the end of this mbuf,
	not at the beginning (line 672 on p. 431).

p. 431:	4th line from the top should be "Figure 14.42 shows how tunnel_send
	prepares a packet" (change 14.43 to 14.42).

p. 437:	Figure 15.5 should be labeled 15.4.  The one text reference on this
	page to Figure 15.5 (on the line above the figure) should be to
	Figure 15.4.  The reference on this page to Figure 15.5 (4th line of
	first paragraph of Section 15.3) should be to Figure 15.4 (see next
	typo).

p. 438:	Figure 15.4 should be labeled 15.5.  Text references on p. 437 to both
	15.4 and 15.5 should be swapped.

p. 438:	In the comment for so_options near the top of the page, change
	"see Figure 15.5" to "see Figure 15.4".

p. 440:	2nd line of 2nd paragraph describing lines 48-64: delete extra "is"
	in "is is".

p. 452:	Last line: "pointed to by bind's third argument" should be "pointed
	to by bind's second argument".

p. 456:	Second line of Section 15.10: the comma after "is" should be after
	the next word "unavailable".

p. 469:	Half way down page: PR_SHUTDOWN should be PRU_SHUTDOWN.

p. 476:	In Figure 16.2, "sbmax" should be "sb_max".

p. 480:	In Figure 16.8 the references to PR_SEND and PR_SENDOOB should be to
	PRU_SEND and PRU_SENDOOB.

p. 486:	In Figure 16.19 the caption for "uio_resid" should be "n0 + n1 + n2".

p. 492:	The indentation of the shaded box following line 396 should be moved
	to the left one tab stop, as it's executed after the "if" on line 343.

p. 501:	In Figure 16.28 the references to PR_RECV and PR_RECVOOB should be to
	PRU_RCVD and PRU_RCVOOB.

p. 509:	Figure 16.36: the terms so_snd and so_rcv should be in the Courier
	font, not CourierBold.

p. 510:	Figure 16.37: the terms so_snd and so_rcv should be in the Courier
	font, not CourierBold.

p. 510:	In the description for lines 439-446, change the three sentences
	beginning with "Either uio or mp0 is null" to the following:
	If mp0 points to an mbuf pointer, soreceive transfers the
	receive buffer data to an mbuf chain pointed to by *mp0.
	In this case, the uio structure is used only for the count
	in uio_resid.  If mp0 is null, soreceive copies the data
	into buffers described by the uio structure.

p. 520:	2nd to last line should start with "Figure 16.49", not "Figure 16.48".

p. 525:	Header for code lines 419-438 should be "Setup timeout value"
	(delete redundant "up").

p. 528:	2nd paragraph describing lines 497-500: delete "allocated on the stack"
	since the array is static.

p. 529:	4th line from the bottom: "returns 0" should be "soo_select returns 0".

p. 543:	Caption for Figure 17.8: "Bsosetopt" should be "sosetopt".

p. 544:	Reword "So there is an error if" to be "So EDOM should be returned if"
	(for added clarity).

p. 544:	Before the description of lines 831-840 add the line "but see Exercise
	17.3 for more discussion".

p. 552:	Change last sentence of first paragraph from "It returns the FNONBLOCK
	flag to its original setting" to "It clears the FNONBLOCK flag, but
	should instead restore the flag to its original setting."

p. 557:	Add Exercise 17.3: "There is a problem with the suggested code used
	to test the timeval structure in Figure 17.9 since tv->tv_sec * hz
	may cause an overflow.  Suggest a change to the code to solve this
	problem."

p. 565:	Caption for Figure 18.6: replace the reference to Figure 18.6 at the
	end with "Figure 18.4".

p. 581:	Last sentence of Section 18.6: change "and the two ifaddr structures
	are each contained" to "and the second ifaddr structure is contained".

p. 605:	2nd line of description for lines 105-115: "route is usable" should be
	"route is not usable".

p. 658:	One quarter of the way down, all the text beginning with "This
	confusing piece of code", the three cases that follow, and the line
	beginning with "Basically, if the process" can all be simplified to:

		First, any bits to be initialized (rtm_inits) are unlocked.
		Any bits that are both initialized (rtm_inits) and locked
		(rtm_rmx.rmx_locks) are locked.

p. 664:	First line describing lines 82-107: change "most previous" to
	"most recently seen".

p. 703:	2nd line of page: change "which we describe in the next section" to
	"which we describe in Section 21.13".

p. 725:	After the 4 cases, insert "In cases 2, 3, and 4 in_pcbbind calls
	in_pcblookup".

p. 825:	Caption for Figure 25.10 should begin "tcp_timers", not "tcp_slowtimo".

p. 827:	Caption for Figure 25.13 should begin "tcp_timers", not "tcp_slowtimo".

p. 829:	Caption for Figure 25.15 should begin "tcp_timers", not "tcp_slowtimo".

p. 842:	Sentence above Figure 25.26 should be "The first half of the
	retransmission timeout case is shown in Figure 25.26".

p. 842:	Caption for Figure 25.26 should begin "tcp_timers", not "tcp_slowtimo".

p. 845:	Caption for Figure 25.27 should begin "tcp_timers", not "tcp_slowtimo".

p. 870:	One-third of the way down the page: "Scenario 5 in Figure 26.20" should
	be "Scenario 5 in Figure 26.19".

p. 906:	10 lines from bottom: change "(as shown in the left half of Figure
	2.14)" to "(recall the left half of Figure 2.14)".

p. 924:	11th line from bottom: "simultaneous open complete" should be
	"passive open or simultaneous open complete".

p. 933:	4th line of description of lines 340-346 refers to "opt", which should
	be "optp".

p. 954:	Two lines above Figure 28.24, remove the extraneous comma following
	"Figure 28.24".

p. 1007:Delete final sentence of Introduction, since the RFC 1122 requirements
	are in Appendix C.

p. 1055:Add a note after the descriptions for lines 70-75: "Lines 71 and 74
	both contain the same bug: the test for equality should be a test
	for inequality."

p. 1068:Second paragraph: "speed normally gives way to clarity" should be
	"clarity normally gives way to speed".

p. 1068:Third line from bottom: "source ode" should be "source code".

p. 1070:The "type" field in the answer to Exercise 3.5 should be in a smaller
	point size to fit within its box.

p. 1074:In the listed answer for 10.4, "average number fragments" should be
	"average number of fragments".

p. 1074:The answers for 10.4 and 10.5 are really for 10.5 and 10.6.

p. 1112:13th line from top: "No:" should be "No." (replace colon with period).

p. 1112:Halfway down the page concerning "TOS in the routing table entry":
	change "in the next chapter" to "in chapter 21".

p. 1127:The URL for [Jacobson 1988b] should be
	ftp://ftp.ee.lbl.gov/papers/congavoid.ps.Z.

p. 1135:The entry for "Auerbach, K." should also reference page 300.

p. 1143:Delete the index entry for icmp_output.

p. 1148:Add page 226 to the entry for IP_ALLOWBROADCAST.

p. 1148:Add page 245 to the entry for ip_defttl.

p. 1149:Add page 207 to the entry for ipforward_rt.

p. 1149:Add page 245 to the entry for ipforwarding.

p. 1150:Add page 245 to the entry for ipsendredirects.

p. 1151:Add page 356 to the entry for leioctl.

p. 1151:Delete the entry for loictl.

p. 1151:Delete page 356 and add page 362 to the entry for loioctl.

p. 1156:Delete the entries for PR_RECV, PR_RECVOOB, PR_SEND, PR_SENDOOB,
	and PR_SHUTDOWN.

p. 1157:Add page number 501 to the entries for PRU_RCVD and PRU_RCVOOB.

p. 1157:Add page number 480 to the entries for PRU_SEND and PRU_SENDOOB.

p. 1162:Add page 476 to the entry for sb_max.

p. 1163:Delete the entry for sbmax.

p. 1164:Add page 297 to the entry for Sklower, K.

-----------------------------------------------------------------------------
The following are Comments to the Reader, they are not typos to be fixed.

p.   5: If you type in the example program, be aware that some systems
	(notably SunOS 4) do not allow the 5th argument to recvfrom()
	to be a null pointer and return EFAULT.  Notice that Net/3 code
	has no problem with this (lines 511-528 of Figure 16.31).

p. 111:	Code lines 183-184 present a race condition.  Since the priority
	was just dropped it's possible that the packet was placed on the
	queue, the hardware interrupted, the driver took the mbuf chain and
	sent it and freed it, causing the m->m_flags to reference undefined
	memory.  All that happens in this case, however, is that the counter
	if_omcasts is off by one.

p. 214:	Lines 155, 167, and 171 contain a bug: ip->ip_len should be cast to
	a (u_short), otherwise IP packets larger than 32767 bytes are
	incorrectly handled.  (Notice that IP input correctly reassembles
	IP datagrams > 32767, this bug just prevents any one fragment from
	being > 32767.)

p. 261: There are reported bugs in the 4.4BSD networking code dealing with
	the timestamp option.  I have not had time to follow them through in
	detail, and given how infrequently this code is used, it probably
	affects very few, if any, packets.  Here are the reported bugs:

	Figure 9.23: ptr=4, ptr=8, etc. are all off by one, and should be
	ptr=5, ptr=9, etc.

	Figure 9.24: lines 679, 689-690, 702-703: these occurences of
	"if (ptr + size > len)" should all be "if (ptr - 1 + size > len)".

	Figure 9.24: line 677: "if (ipt->ipt_len < 5)" should be
	"if (ipt->ipt_len < 5 || ipt->ipt_ptr < 5)".

p. 284:	There is a bug in the reassembly code on page 284: the 2nd argument
	to m_pullup() on line 281 should be "hlen" instead of
	"sizeof (struct ip))", to account for any possible IP options.

p. 390:	The code to calculate the checksum on line 245 is wrong: it calculates
	the checksum using the entire IP header.  Lines 240-245 should be
	replaced with

		m->m_data += sizeof(struct ip);
		m->m_len -= sizeof(struct ip);
		igmp = mtod(m, struct igmp *);
		igmp->igmp_type = IGMP_HOST_MEMBERSHIP_REPORT;
		igmp->igmp_code = 0;
		igmp->igmp_group = inm->inm_addr;
		igmp->igmp_cksum = 0;
		igmp->igmp_cksum = in_cksum(m, IGMP_MINLEN);
		m->m_data -= sizeof(struct ip);
		m->m_len += sizeof(struct ip);

p. 413:	The call to splx(s) on line 325 should be removed.

p. 484:	A benign bug is that the two >= on page 484, lines 322-323 should
	be >.

p. 502:	Same benign bug (lines 448-449) as on p. 484.

p. 769:	The function ip_stripoptions that's referenced is not shown in the book.

p. 770:	Lines 94, 95, and 99 contain a bug: in all three lines ip->ip_len must
	be cast to (u_short).  Failure to do so prevents UDP from accepting an
	IP datagram whose length exceeds 32767.

p. 925:	The function ip_stripoptions that's referenced is not shown in the book.

p. 927:	Line 208 contains a bug: the value on the right side of the assignment
	must be cast to (u_short) or TCP is unable to accept an IP datagram
	whose length exceeds 32767.

p. 958:	Line 715 should be "iss = tp->snd_nxt + TCP_ISSINCR" (replace rcv_nxt
	with snd_nxt).

p. 1079:Answer to Exercise 18.2: BSD systems actually allocate memory in
	chunks whose size is a power of 2.  So each routing table entry
	really requires 256 bytes.  This takes the total to just over
	5 megabytes.

p. 1090:Answer to Exercise 29.5: While this solution does fix the observed
	suboptimal behavior, it also appears to introduce a serious bug:
	the retransmission of FINs during a simultaneous close no longer
	works, which could cause connections to hang.

p. 1122:The function ip_stripoptions that's referenced is not shown in the book.

All readers should be made aware of the paper "Performance Problems in
BSD4.4 TCP", which was made available after the publication of Volume 2.
It is available from

	ftp://ftp.cs.arizona.edu/xkernel/Papers/tcp_problems.ps

Another paper has been made available that adds to the information provided
in [Jacobson 1993] and [Partridge 1993]:

	Jacobson, V., "Design Changes to the Kernel Network Architecture
		for 4.4BSD," 4.4BSD Class, Berkeley, Calif., May 1992,
		ftp://ftp.ee.lbl.gov/talks/vj-nkarch.ps.Z