From: David S. Miller Date: Mon, 21 Jan 2013 18:50:10 +0000 (-0500) Subject: Merge branch 'ipv6_ndisc' X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=9acefd17cba1a018163d00b5b5e463db8e3761ab;p=openwrt%2Fstaging%2Fblogic.git Merge branch 'ipv6_ndisc' YOSHIFUJI Hideaki says: ==================== This series of changes basically clean up NDISC logic, especially on sender side. We originally do For NS/NA/RS: 1) build temporary ICMPv6 header 2) ndisc_build_skb() with temporary ICMPv6 header and rather criptic arguments. - Calculate total length and allocate sk_buff - Build IPv6 header. - copy ICMPv6 header, additional data and ND options. - Fill-in ICMPv6 checksum. Here, structures defined for message format was not used at all, it is difficult to understand what is being sent, and it was not generic. 3) __ndisc_send() - Allocate temporary dst. - Send it. Several issues: - We could not defer decision if we should/can send some ND option. - It is hard to see the packet format at a glance. - ICMPv6 header was built as temporary variable, and then copied to the buffer. - Some code path for Redirect was not shared. With these patches, we do: 1) Calculate (or estimate) message length and option length. 2) Allocate skb (via new ndisc_skb_alloc()). 3) Fill-in ICMPv6 message directly using compound literals. 4) Fill-in ICMPv6 checksum 5) Build IPv6 header (including length) 6) Send the packet (via ndisc_send_skb()). - allocate temporary dst and send it. - We can defer calculating real length of the packet. For example, we can give up filling some option at when filling in. - Message is built directly without temporary buffer. - Structures defined for message format is easier to understand what is being built. - NS/NA/RS/Redirect share same logic. - Reduced code/data size: text data bss dec hex filename 265407 14133 3488 283028 45194 old/net/ipv6/ipv6.o 264955 14109 3488 282552 44fb8 new/net/ipv6/ipv6.o ==================== Signed-off-by: David S. Miller --- 9acefd17cba1a018163d00b5b5e463db8e3761ab