Understanding Linux Network Internals by Christian Benvenuti The unconfirmed error reports are from readers. They have not yet been approved or disproved by the author or editor and represent solely the opinion of the reader. Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem ?page-number?: reader question or request for clarification This page was updated May 23, 2008. UNCONFIRMED errors and comments from readers: {xvi} top of page; "I could work on my image processing projects at home on an i286/486 computer without having to compete with other students for access to the few Sun stations available at the university labs." Linux doesn't run on a i286 -- it starts at a i386. {38} 2nd-to-last paragraph; In the sentence "skb_pull removes a block of data from the head of the buffer by moving the head pointer forward", the "head pointer" should be "data pointer" [40] First line after Figure 2-9; In the sentence "The skb_clone routine can be used to check the cloned status of an skb buffer", the "skb_clone" should be "skb_cloned". skb_clone was already described prior to Figure 2-9, and it will make a "copy," not check the existing skb to see if it was cloned. {40} the last line; In "between skb->start and skb->end", skb->start should be skb->head {62} line 22; ctl_data should be ctl_table {76} Figure 4-1; Network E is not shown in the figure, but the text (last sentence on page 75 and continues on page 76) talks about Network E in figure 4-1. {139} 3rd paragraph; This paragraph says that dev_alloc_name is called by alloc_netdev. However, this function is called by register_netdev. The problem with this is that the name member of the allocated netdev is still a format string after the call to alloc_netdev and cannot be used to properly identify the device. {204} First line of Tasklet Processing; "low-latency" should be "low-priority". "high-latency" should be "high-priority" [238] last paragraph; Since net_rx_action represents should be Since netif_receive_skb represents (268) Paragraph 5; For consistency with Figure 13-2 and the rest of the text, AF_PACKET should probably be PF_PACKET in 3 places. (You might also consider adding an explanation of the relationship between the two names.) (285) Last paragraph, line 4; PF_SOCKETS should be PF_PACKET. (289) Bullet 3, line 1; AF_LLC should be PF_LLC to conform with the subsequent text. {291} Table 13-4; The AppleTalk Address Resolution Protocol and IPX have the same 24-bit OUI. 00:00:00 belongs to Xerox. {301} Figure 14-2; "IE, one instead of eye" should be "1F" in 8 places. {307} Line 1; Delete "hosts located in". {309} Line 3.; "states" should be "nodes". (321) Bridge ID; Append "See Figure 15-7(a)." {322} Figure 15-7(b); "Port ID" should be "Port number" in two places. {322} Bullet 2; Add a footnote that MAC addresses can be cloned, so they are not necessarily unique. [325] Last line before Priority Vector; "ticks (1/256th of second)" should be "1/256th of a second". {327} Line 2 of last paragraph; Figure 15-9 refers to DT, but does not define it. [327] Third line from the bottom; Delete "ticks". {332} Second to last paragraph; "Bridge ID BR3 < Bridge ID BR4" should be "Bridge ID BR2 < Bridge ID BR3" {332} Line 1, last paragraph; BR4 should be BR3. {333} Figure 15-13(a); There are two BR4s; the right middle one should be BR3. In the BPDU from BR4 to BR3, the Cost should be 110. {334} Line 4 of first full paragraph; "than BR2's" should be "than BR3's". {340} Last line of last paragraph before Topology Changes; BR2 should be BR1. (347) Three bullets and preceding line.; Delete; all three are shown in the figure. {358} Figure 16-4; eth2 should be eth0. {360} Initialization of Bridging Code, paragraph 1, line 2.; br_uninit should be br_deinit. {383} line 3; "bridge device" should be "STP". (400) designated_cost line 2; 16 should be 15 in two places. (420) Figure 18-9; IPa should be IP1a in 6 places. [421] Figure 18-10; The "4" to calculate OFFSET should read "8". [421] Figure 18-10; The OFFSETs should be i*(MTU/8), i = 0..5 (And the MF and OFFSET should be under the IP header.) (424) ID lines 3-4.; The reference should be to the section "Selecting the IP Header's ID Field". (428) Line 3.; 151.41.21.194 should be 151.41.221.194 {440} in_device structure, paragraph 2, line 1; in_dev should be in_device. {442} CHECKSUM_UNNECESSARY, lines 1-2.; "L4 header and checksum" should be "L4 header and payload". [448] Last paragraph; The explaination applies to the code that follows, which is not shown. The first check is that the size of the L3 data is not less than the size of the IP packet as recorded in the IP header. The second check is that the size of the L3 data is not less than the size of the IP header as recorded in the IP header. [449] Last paragraph; If len is greater than the minimum L2 payload size, then there is no L2 padding, so the L4 checksum computed in hardware does not include L2 padding. (491) skb_is_nonlinear; non-null should be non-zero (495) *hdrlen line 5; Encapsulation Security Payload should be Encapsulating Security Payload {499} Paragraph 2, line 3.; fraghdrlen should be maxfraglen. {508} Line 1.; dst_input should be dst_output. {523} Figure 22-1; 128 should be 228 in 3 places. 384 should be 484. (540) Paragraph 3, line 4.; MF should be DF. {556} Figure 23-3; ip_options is defined in net/inet_sock.h (557) unsigned char _data[0]; _data should be __data. {557} unsigned char _data[0], last line of first paragraph; Should be replaced with something like "declaring an array that will be defined by an immediately succeeding declaration." {558} struct ipq **pprev; "head" should be "previous element". {559} int meat, line 2.; "the packet has been conpletely received" should be "there are no gaps in the received fragments". (565) Table 23-3.; The column headings: "/proc filename" should be "Name", "Associated kernel variable" should be "Description". Add "Functions" at the top of the first column. {573} Paragraph 2, line 2.; "hash" should be "protocol". (580) Bullet 2, line 1.; "destination" should be "remote". (580) Last paragraph, lines 9-10.; Interchange REQUEST and REPLY. (582) Figure 24-8.; The Source and Destination addresses each should be 4 words. (606) Figure 25-9(b).; Switch the labels on the exits of . The Failure exit on should go to (End). The other two Failure exits and the Dropped exit should go to [Unlock]. {614} Bullet 2, line 3:; Delete "non-" in "non-zero" (617) Second #define; (ICMP_MIB_MAX + 1) should be (__ICMP_MIB_MAX + 1). (619) Line beginning "ICMP_MIB_INXXX"; Interchange ICMP_MIB_INXXX and ICMP_MIB_OUTXXX. (623) Lines 1-2.; Interchange "two" and "three". Interchange "IP" and "Ethernet". {650} Indented paragraph 2, line 3.; "NUD_STALE" should be "NUD_DELAY or NUD_PROBE". (658) Figure 27-4.; The transition from NUD_STALE to NUD_REACHABLE should be reversed. Figure 26-13 doesn't show a transition from NUD_REACHABLE to NUD_DELAY. {659} Line 1 of paragraph 2 from the bottom.; Figure 26-13 does not show a transition from NUD_REACHABLE to NUD_DELAY. (672) Lines 3-4 of first regular paragraph.; "and global statistics" should be "and to update global statistics". {673} Paragraph 2, line 4.; "one half" should be "twice". {673} Paragraph 2, line 5.; Delete "a little faster than usual". (675) Line 1.; "eliminating" should be "reclaiming". (675) Asynchronous cleanup, line 1.; "remove" should be "reclaim". (675) Regular paragraph 3, line 3.; "deleting" should be "reclaiming". (692) Interaction Between Neighboring Protocols and L3 Transmission Function, paragraph 2, line 1.; "input skb buffer, ip_finish_output2," should be "ip_finish_output2 input skb buffer". (697) Figue 27-13(a), label on (6).; The ethernet address should be 00:20:ED:78:1E:12. {710} Figure 28-6; arp_announce should be arp_ignore in 4 places. (714) Figure 28-9; Host B eth0 should be 10.0.0.5/24. {727} Initial Common Processing, line 2.; "broadcast" should be "loopback". (730) Figure 28-17; The "Yes" and "No" edges out of "ARP filter or ARP ignore?" should be swapped. NUD_STATE should be NUD_STALE. {738} Line 4 of last paragraph; (126 - 1)*(126 - 1) should be 126*(126 - 1). (739) Line 1.; /24 should be /25. (740) Figure 28-21.; The labels "Host D" and "Host E" have been cut off. (741) Last line of paragraph 3; "eth1 and eth2" should be "eth0 and eth1". (751) Table 29-1.; NLM_F should be NLM_F_DUMP in two places. {763} int key_len, line 2.; 8 should be 16 (780) Varieties of Routing Configurations, paragraph 2, line 2; Rn should be RTn. [783] Last line.; Delete the parenthetical remark. (784) Table 30-1; "192.255.255.255" should read "191.255.255.255" "11111" should read "11110" (784) Table 30-2; To be consistent, "65,535" should read "65,536" [784] Table 30-3, line 3.; "192.168.0.0./16" should be "192.168.0.0/24 to 192.168.255.0/24" (787) Figure 30-6.; The LINK box should include all the hosts on the 10.0.1.0/24 subnet. (790) Figure 30-7(a,b).; The host 10.0.0.200 should be labeled "A" {793} Output of second ip address list command, line 4.; "brd 192.168.1.255" should be "brd 192.168.1.127" (818) Figure 31-7; In the Routes, delete "from" in two places. {824} Second sentence in the first paragraph after the three bullet points; The sentence reads "The hosts of subnet 10.0.0.0/24 and 10.0.0.2/24 ...". The second subnet should be 10.0.2.0/24, not 10.0.0.2/24. (834) struct rt_cache_stat, line 2; "counters" should be "statistics" (839) Paragraph 2, line 5; fib_scope should be nh_scope (856) NETDEV_UP, line 3.; "IP" should be "IP address" [869] Figure 33-3.(a) caption; ip_route_input_key should be ip_route_input [869] 3rd paragraph; figure 33-3(b) In case of a Miss, ip_route_output_slow() should be called and not ip_route_input_slow (877) Figure 33-4.; network=0.10 should be network=10.0 in 4 places (878) Round-Robin Algorithm, paragraph 1, last line.; "the one" should be "one" (882) Figure 33-7(b); "input/output/child" should be "child/input/output" (890) Line 5 from the bottom.; "how" should be "when" (900) Figure 34-1; fib_tables should be labeled. fx_divisor should be fz_divisor. *nh_hash should be nh_hash in 4 places. *nh_parent should be nh_parent in 4 places. (901) Second line before Dynamic resizing of per-netmask hash tables.; "right" should be "left" (908) Figure 34-3(b).; "Create new fib_info instance" should be "Create new fib_node instance" (916) Semantic Matching on Subsidiary Criteria, paragraph 2, line 2.; fib_info should be fib_node (921) Table 35-3, Description of dst_discard_out.; "input" should be "output" (922) Bullet 2, line 3..; ip_rt_error should be ip_rt_bug (922) Initialization of Function Pointers for Egress Traffic, bullet 1, line 3..; ip_rt_error should be ip_rt_bug (922) Bullet 3, sentence 2.; States that there is no need to initialize dst->output, but Figure 35-3 on p. 921 shows it initialized to ip_rt_bug in this case. (932) Figure 35-7; The top "Return -ENOBUFF" should be "Return -EINVAL" (934) Figure 35-8(b).; "KEY: Set Dest IP = Source IP" should be KEY: Set Source IP = Dest IP" (935) Search Key Initialization, line 1.; ip_route_input should be ip_route_output (938) Figure 35-10.; ip_rev should be ip_rcv (944) Line 2 from the bottom.; "priority" should be "preference" (945) Line 2.; "priority" should be "preference" (945) Paragraph 1.; Append "In fact, preferences are between 0 and 0x7FFF." (957) Change Notifications, paragraph 1, last line.; RTGRM_IPV4_ROUTE should be RTMGRP_IPV4_ROUTE (970) fz_order, line 1.; fz_hashmask should be fz_mask (971) fn_key; su32 should be u32 (971) fa_state, FA_S_ACCESSED.; line 2: fib_node should be fib_info line 4: fib_node should be fib_alias (972) fib_clntref, line 1.; fib_node should be fib_alias (978) Last line.; "table's" should be "table" (981) next, line 1.; "table's" should be "table" (987) Table 36-13.; "fib_rules_detach/fib_rules_attach" should be "fib_rules_attach/fib_rules_detach" "__ip_route_output_key ip_route_output_flow" should be "__ip_route_output_key/ip_route_output_flow" (987) Table 36-13, rtmsg_fib, line 1.; "on" should be "to"