Errata

Understanding Linux Network Internals

Errata for Understanding Linux Network Internals

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released.

The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.

Color Key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted by Date submitted
Printed Page 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.

Anonymous   
Printed Page *
*

Hi,

This is a wonderful book. I want to read more detailed code. So I need
to know it's kernel version. However, it seems that this book doesn't
mention the exact kernel version.Would you help? Thanks!

Tony

Tony.He  Sep 07, 2021 
Printed Page 11
2nd paragraph

To say "When no optional block is required, placeholder is just a pointer to the end of the structure" is not entirely accurate. It is certainly true for a variety of structures, however it is only true when previous data causes your placeholder be aligned to the same alignment as the structure. Case in point:

struct abc {
int age;
char whatever;
char placeholder[0];
};

in this case, placeholder[0] certainly does not point to the end of the structure. This is because the compiler may align struct abc to keep age on an architecture specific alignment (perhaps a multiple of 4 for example). Here you could actually think of placeholder taking up 3 bytes if the structure alignment were 4. I've seen others make similar mistakes. It is not correct to think that the offsetof the placeholder field is equal to the sizeof the structure, UNLESS you guarantee that placeholder is aligned properly. You can do that with an align attribute (gcc). For a more compiler independent solution, using a more strongly aligned datatype for placeholder might suffice (perhaps double placeholder[0]).

Anonymous  Feb 22, 2012 
Printed Page 18
The code snippet on the top of the page


do {
do_something(&job_done);
if (job_done)
return;
while ( jiffies - start_time < 1);

should be

do {
do_something(&job_done);
if (job_done)
return;
}
while ( jiffies - start_time < 1000);

since 'jiffies' and 'start_time' are both measured in tick and there are 1000 ticks per second(for i386).

Anonymous  Oct 05, 2021 
Printed Page 36
Below figure 2-6

Maybe a mistake, maybe not.

I could be wrong here, but I suspect that the real reason for the skb_reserve(skb,2) is to keep the IP header aligned on a 4 byte boundary rather than a 16 byte boundary. 4 byte alignment makes sense as the IP, TCP and UDP header fields are all aligned on 32 bit boundaries to optimize access by 32 bit processors. A 16 byte alignment would be harder to explain unless the cache line size of the processor happened to be 16 bytes, in which case the code to do this would be over in the arch directory someplace.

Jeffrey Haran  Aug 27, 2009 
Printed Page 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"

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 40
the last line

In "between skb->start and skb->end", skb->start should be skb->head

Anonymous   
Printed Page 51
3rd paragraph

This means 50% of the possible addresses are multicast....

An example i captured by the wireshark is listed

Destination: IPv4mcast_00:00:58 (01:00:5e:00:00:58)

As it shows, the MAC multicast address is NOT 50%

augustine  Jun 23, 2010 
Printed Page 62
line 22

ctl_data should be ctl_table

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 121
4

In last text paragraph on the page, the symbol "dev->name" has been broken with a line break.

Anonymous  Dec 11, 2008 
Printed Page 126 - 1
*(126 - 1) should be 126*(126 - 1).

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 204
First line of Tasklet Processing

"low-latency" should be "low-priority".
"high-latency" should be "high-priority"

Anonymous   
Printed Page 238
last paragraph

Since net_rx_action represents
should be
Since netif_receive_skb represents

Anonymous   
Printed Page 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.)

Anonymous   
Printed Page 285
Last paragraph, line 4

PF_SOCKETS should be PF_PACKET.

Anonymous   
Printed Page 289
Bullet 3, line 1

AF_LLC should be PF_LLC to conform with the subsequent text.

Anonymous   
Printed Page 291
Table 13-4

The AppleTalk Address Resolution Protocol and IPX have the same 24-bit OUI.
00:00:00 belongs to Xerox.

Anonymous   
Printed Page 301
Figure 14-2

"IE, one instead of eye" should be "1F" in 8 places.

Anonymous   
Printed Page 302
Last paragraph

The book say this about Figure 14-4(b) "Host B transmits a frame addressed to Host A. Both Host A and the bridge receive the frame."

I think the bridge will not receive the frame, because the switch of LAN 1 has already learned the port of host A (as stated in Figure 14-4(a)). So the switch of LAN1 will not forward the frame to the port of the bridge. Therefore, only host A receives the frame.

Hui Kang  May 13, 2014 
Printed Page 307
Line 1

Delete "hosts located in".

Anonymous   
Printed Page 309
Line 3.

"states" should be "nodes".

Anonymous   
Printed Page 321
Bridge ID

Append "See Figure 15-7(a)."

Anonymous   
Printed Page 322
Figure 15-7(b)

"Port ID" should be "Port number" in two places.

Anonymous   
Printed Page 322
Bullet 2

Add a footnote that MAC addresses can be cloned, so they are not necessarily unique.

Anonymous   
Printed Page 325
Last line before Priority Vector

"ticks (1/256th of second)" should be "1/256th of a second".

Anonymous   
Printed Page 327
Line 2 of last paragraph

Figure 15-9 refers to DT, but does not define it.

Anonymous   
Printed Page 327
Third line from the bottom

Delete "ticks".

Anonymous   
Printed Page 332
Second to last paragraph

"Bridge ID BR3 < Bridge ID BR4" should be "Bridge ID BR2 < Bridge ID BR3"

Anonymous   
Printed Page 332
Line 1, last paragraph

BR4 should be BR3.

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 334
Line 4 of first full paragraph

"than BR2's" should be "than BR3's".

Anonymous   
Printed Page 340
Last line of last paragraph before Topology Changes

BR2 should be BR1.

Anonymous   
Printed Page 347
Three bullets and preceding line.

Delete; all three are shown in the figure.

Anonymous   
Printed Page 358
Figure 16-4

eth2 should be eth0.

Anonymous   
Printed Page 360
Initialization of Bridging Code, paragraph 1, line 2.

br_uninit should be br_deinit.

Anonymous   
Printed Page 383
line 3

"bridge device" should be "STP".

Anonymous   
Printed Page 400
designated_cost line 2

16 should be 15 in two places.

Anonymous   
Printed Page 420
Figure 18-9

IPa should be IP1a in 6 places.

Anonymous   
Printed Page 421
Figure 18-10

The "4" to calculate OFFSET should read "8".

Anonymous   
Printed Page 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.)

Anonymous   
Printed Page 424
ID lines 3-4.

The reference should be to the section "Selecting the IP Header's ID Field".

Anonymous   
Printed Page 428
Line 3.

151.41.21.194 should be 151.41.221.194

Anonymous   
Printed Page 440
in_device structure, paragraph 2, line 1

in_dev should be in_device.

Anonymous   
Printed Page 442
CHECKSUM_UNNECESSARY, lines 1-2.

"L4 header and checksum" should be "L4 header and payload".

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 491
skb_is_nonlinear

non-null should be non-zero

Anonymous   
Printed Page 495
*hdrlen line 5

Encapsulation Security Payload
should be
Encapsulating Security Payload

Anonymous   
Printed Page 499
Paragraph 2, line 3.

fraghdrlen should be maxfraglen.

Anonymous   
Printed Page 508
Line 1.

dst_input should be dst_output.

Anonymous   
Printed Page 523
Figure 22-1

128 should be 228 in 3 places.
384 should be 484.

Anonymous   
Printed Page 540
Paragraph 3, line 4.

MF should be DF.

Anonymous   
Printed Page 556
Figure 23-3

ip_options is defined in net/inet_sock.h

Anonymous   
Printed Page 557
unsigned char _data[0]

_data should be __data.

Anonymous   
Printed Page 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."

Anonymous   
Printed Page 558
struct ipq **pprev

"head" should be "previous element".

Anonymous   
Printed Page 559
int meat, line 2.

"the packet has been conpletely received" should be "there are no gaps in the
received fragments".

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 573
Paragraph 2, line 2.

"hash" should be "protocol".

Anonymous   
Printed Page 580
Bullet 2, line 1.

"destination" should be "remote".

Anonymous   
Printed Page 580
Last paragraph, lines 9-10.

Interchange REQUEST and REPLY.

Anonymous   
Printed Page 582
Figure 24-8.

The Source and Destination addresses each should be 4 words.

Anonymous   
Printed Page 606
Figure 25-9(b).

Switch the labels on the exits of <Routing lookup>.
The Failure exit on <Lock> should go to (End).
The other two Failure exits and the Dropped exit should go to [Unlock].

Anonymous   
Printed Page 614
Bullet 2, line 3

Delete "non-" in "non-zero"

Anonymous   
Printed Page 617
Second #define

(ICMP_MIB_MAX + 1) should be (__ICMP_MIB_MAX + 1).

Anonymous   
Printed Page 619
Line beginning "ICMP_MIB_INXXX"

Interchange ICMP_MIB_INXXX and ICMP_MIB_OUTXXX.

Anonymous   
Printed Page 623
Lines 1-2.

Interchange "two" and "three".
Interchange "IP" and "Ethernet".

Anonymous   
PDF Page 644
2nd paragraph

Thus, a solicitation reply sent to a broadcast destination address
should be
Thus, a solicitation request sent to a broadcast destination address

Anonymous  Jul 30, 2023 
Printed Page 647
1st paragraph

NUD_IN_TIMER should include NUD_REACHABLE too.

Anonymous  Sep 18, 2009 
Printed Page 650
Indented paragraph 2, line 3.

"NUD_STALE" should be "NUD_DELAY or NUD_PROBE".

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 659
Line 1 of paragraph 2 from the bottom.

Figure 26-13 does not show a transition from NUD_REACHABLE to NUD_DELAY.

Anonymous   
Printed Page 670
3rd paragraph

The follow sentences are incorrect:

Whenever a packet is sent out, the associated sk_buff buffer holds a
reference to a neighbour structure. so neighbour->refcnt is
incremented to make sure that the transmission can complete without
problems. Once the packet has been transmitted, the count is
decremented again.


A sk_buff buffer does not hold a direct reference to a neighbour
strucure. It refers to a neighbour indirectly via its dst.

Anonymous  Sep 18, 2009 
Printed Page 672
Lines 3-4 of first regular paragraph.

"and global statistics" should be "and to update global statistics".

Anonymous   
Printed Page 673
Paragraph 2, line 4.

"one half" should be "twice".

Anonymous   
Printed Page 673
Paragraph 2, line 5.

Delete "a little faster than usual".

Anonymous   
Printed Page 675
Line 1.

"eliminating" should be "reclaiming".

Anonymous   
Printed Page 675
Asynchronous cleanup, line 1.

"remove" should be "reclaim".

Anonymous   
Printed Page 675
Regular paragraph 3, line 3.

"deleting" should be "reclaiming".

Anonymous   
Printed Page 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".

Anonymous   
Printed Page 697
Figue 27-13(a), label on (6).

The ethernet address should be 00:20:ED:78:1E:12.

Anonymous   
Printed Page 700
Figure 28-1

Swap eth souce addr and eth dest addr in Figure 28-1. The same error
occurs in Figure 27-1 and 27-10 too.

Anonymous  Sep 21, 2009 
Printed Page 710
Figure 28-6

arp_announce should be arp_ignore in 4 places.

Anonymous   
Printed Page 714
Figure 28-9

Host B eth0 should be 10.0.0.5/24.

Anonymous   
Printed Page 727
Initial Common Processing, line 2.

"broadcast" should be "loopback".

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 738
Line 4 of last paragraph

Anonymous   
Printed Page 739
Line 1.

/24 should be /25.

Anonymous   
Printed Page 740
Figure 28-21.

The labels "Host D" and "Host E" have been cut off.

Anonymous   
Printed Page 741
Last line of paragraph 3

"eth1 and eth2" should be "eth0 and eth1".

Anonymous   
Printed Page 751
Table 29-1.

NLM_F should be NLM_F_DUMP in two places.

Anonymous   
Printed Page 763
int key_len, line 2.

8 should be 16

Anonymous   
Printed Page 780
Varieties of Routing Configurations, paragraph 2, line 2

Rn should be RTn.

Anonymous   
Printed Page 783
Last line.

Delete the parenthetical remark.

Anonymous   
Printed Page 784
Table 30-1

"192.255.255.255" should read "191.255.255.255"
"11111" should read "11110"

Anonymous   
Printed Page 784
Table 30-2

To be consistent, "65,535" should read "65,536"

Anonymous   
Printed Page 784
Table 30-3, line 3.

"192.168.0.0./16" should be "192.168.0.0/24 to 192.168.255.0/24"

Anonymous   
Printed Page 784
Table 30-1

The class B network: last address is shown as "192.255.255.255.". It should be 191.255.255.255.

Fengliang Hu  Nov 17, 2010 
Printed Page 787
Figure 30-6.

The LINK box should include all the hosts on the 10.0.1.0/24 subnet.

Anonymous   
Printed Page 790
Figure 30-7(a,b).

The host 10.0.0.200 should be labeled "A"

Anonymous   
Printed Page 793
Output of second ip address list command, line 4.

"brd 192.168.1.255" should be "brd 192.168.1.127"

Anonymous   
Printed Page 805
Table 31-2

Table 31-2, "RT1" should be changed to "Routing Table 1".
Similarly, in Table 31-2, "RT2" should be changed to "Routing Table 2".

In Figure 31-1, there are routers called "RT1" and "RT2". So re-using the same term "RT1" and "RT2" could confuse the readers.

Feng  Nov 18, 2010 
Printed Page 818
Figure 31-7

In the Routes, delete "from" in two places.

Anonymous   
Printed, PDF, ePub Page 820
1st paragraph (continued from 819)

The paragraph lists BIRD as a project that is "no longer maintained". This is not accurate, as the project is, as of March 2018, still active and maintained.

Anonymous  Mar 08, 2018 
Printed Page 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.

Anonymous   
Printed Page 834
struct rt_cache_stat, line 2

"counters" should be "statistics"

Anonymous   
Printed Page 839
Paragraph 2, line 5

fib_scope should be nh_scope

Anonymous   
Printed Page 842
4th paragraph

Regarding the explanation of the macros "change_nexthops, for_nexthops, endfor_nexthops", the description

"Note that for each macro there are two versions: one used when there is Policy Routing support in the kernel and one when there is no Policy routing. The second one is optimized by ....".

In Linux routing, Policy routing refers to multiple routing tables. I believe that the author refers to Multipath support. Also I checked the Linux source code, the macros are defined differently like

"#ifdef CONFIG_IP_ROUTE_MULTIPATH" ...

I believe that the text incorrectly referred to Policy Routing. It should be Multipath support instead.

Feng  Nov 22, 2010 
Printed Page 856
NETDEV_UP, line 3.

"IP" should be "IP address"

Anonymous   
Printed Page 862
3rd paragraph


"
rt_hash_mask
rt_hash_log

The size (number of buckets) of the hash table rt_hash_table, and the base two logarithm of that number....
"

The description of rt_hash_log is accurate. However, rt_hash_mask is not described accurately. It is the size (number of buckets) of the hash table - 1. And the size (number of buckets) is guaranteed to be the power of 2. That's why rt_hash_mask is all 1s and named "mask".

Feng  Nov 23, 2010 
Printed Page 869
Figure 33-3.(a) caption

ip_route_input_key should be ip_route_input

Anonymous   
Printed Page 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

Anonymous   
Printed Page 877
Figure 33-4.

network=0.10 should be network=10.0 in 4 places

Anonymous   
Printed Page 878
Round-Robin Algorithm, paragraph 1, last line.

"the one" should be "one"

Anonymous   
Printed Page 882
Figure 33-7(b)

"input/output/child" should be "child/input/output"

Anonymous   
Printed Page 890
Line 5 from the bottom.

"how" should be "when"

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 901
Second line before Dynamic resizing of per-netmask hash tables.

"right" should be "left"

Anonymous   
Printed Page 908
Figure 34-3(b).

"Create new fib_info instance" should be "Create new fib_node instance"

Anonymous   
Printed Page 916
Semantic Matching on Subsidiary Criteria, paragraph 2, line 2.

fib_info should be fib_node

Anonymous   
Printed Page 921
Table 35-3, Description of dst_discard_out.

"input" should be "output"

Anonymous   
Printed Page 921
Figure 35-3

"ip_local_driver" was referenced twice in the figure. It should be changed to "ip_local_deliver".

Feng  Nov 29, 2010 
Printed Page 922
Bullet 2, line 3..

ip_rt_error should be ip_rt_bug

Anonymous   
Printed Page 922
Initialization of Function Pointers for Egress Traffic, bullet 1, line 3..

ip_rt_error should be ip_rt_bug

Anonymous   
Printed Page 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.

Anonymous   
Printed Page 932
Figure 35-7

The top "Return -ENOBUFF" should be "Return -EINVAL"

Anonymous   
Printed Page 934
Figure 35-8(b).

"KEY: Set Dest IP = Source IP" should be KEY: Set Source IP = Dest IP"

Anonymous   
Printed Page 935
Search Key Initialization, line 1.

ip_route_input should be ip_route_output

Anonymous   
Printed Page 938
Figure 35-10.

ip_rev should be ip_rcv

Anonymous   
Printed Page 944
Line 2 from the bottom.

"priority" should be "preference"

Anonymous   
Printed Page 945
Line 2.

"priority" should be "preference"

Anonymous   
Printed Page 945
Paragraph 1.

Append "In fact, preferences are between 0 and 0x7FFF."

Anonymous   
Printed Page 957
Change Notifications, paragraph 1, last line.

RTGRM_IPV4_ROUTE should be RTMGRP_IPV4_ROUTE

Anonymous   
Printed Page 970
fz_order, line 1.

fz_hashmask should be fz_mask

Anonymous   
Printed Page 971
fn_key

su32 should be u32

Anonymous   
Printed Page 971
fa_state, FA_S_ACCESSED.

line 2: fib_node should be fib_info
line 4: fib_node should be fib_alias

Anonymous   
Printed Page 972
fib_clntref, line 1.

fib_node should be fib_alias

Anonymous   
Printed Page 978
Last line.

"table's" should be "table"

Anonymous   
Printed Page 981
next, line 1.

"table's" should be "table"

Anonymous   
Printed Page 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"

Anonymous   
Printed Page 987
Table 36-13, rtmsg_fib, line 1.

"on" should be "to"

Anonymous