Merge branch 'ipv6_ndisc'
authorDavid S. Miller <davem@davemloft.net>
Mon, 21 Jan 2013 18:50:10 +0000 (13:50 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Jan 2013 18:50:10 +0000 (13:50 -0500)
commit9acefd17cba1a018163d00b5b5e463db8e3761ab
treea9b0846968a4df192ec7cb890b5a929c67b61a9d
parent7373470202a3c98e1a338bf1acf51247cd100868
parent4d5c152e8694b57094e320060be4621dee5779dd
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 <davem@davemloft.net>