icmp: make Marshal of MessageBody, ParseMessage work correctly on parameter problem message

The wire format of parameter problem message is slightly different
between ICMPv4 and ICMPv6. We need to distinguish each message's
protocol family for avoiding dropping wrong wire format stuff on the
wire.

This is an API breaking change.

type MessageBody interface, Marshal() ([]byte, error)

is replaced with

type MessageBody interface, Marshal(int) ([]byte, error)

Fixes #9394.

Change-Id: Id692c76f85a2714dd011342e648b31395ca668bf
7 files changed