On (01/29/16 19:23), Eric Dumazet wrote: > BTW, even a memcpy(&key_addrs->v4addrs, &iph->saddr, 8) could crash, as > the compiler can certainly assume src and dst are 4 bytes aligned, and > could use word accesses when inlining memcpy() even on Sparc. > > Apparently the compiler used by Sowmini is gentle.
One more subtlety that I missed until now.. eth_get_headlen passes in flow_keys_buf_dissector (NOT flow_keys_dissector!) So FLOW_DISSECTOR_KEY_IPV4_ADDRS is not set, and this helps to dodge the unaligned iph->saddr access. But as others have pointed out, much of this code is brittle because it's accessing the data before the driver has had a chance to align things. The page_offset initialization of NET_IP_ALIGN, with all its weaknesses, at least matches (in principle) the prescription used for the xmit path. --Sowmini