go.net/ipv4: new package

Package ipv4 implements IP-level socket options for the Internet
Protocol version 4. It also provides raw IP socket access methods
including IPv4 header manipulation.

Fixes golang/go#3684.
Fixes golang/go#3820.

This CL requires CL 6426047;
net: add read, write message methods to IPConn, UDPConn

R=rsc, dave, alex.brainman
CC=gobot, golang-dev
https://golang.org/cl/6482044
diff --git a/ipv4/header_test.go b/ipv4/header_test.go
new file mode 100644
index 0000000..0ac02ed
--- /dev/null
+++ b/ipv4/header_test.go
@@ -0,0 +1,99 @@
+// Copyright 2012 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv4_test
+
+import (
+	"bytes"
+	"code.google.com/p/go.net/ipv4"
+	"net"
+	"reflect"
+	"runtime"
+	"testing"
+)
+
+var (
+	wireHeaderFromKernel = [ipv4.HeaderLen]byte{
+		0x45, 0x01, 0xbe, 0xef,
+		0xca, 0xfe, 0x05, 0xdc,
+		0xff, 0x01, 0xde, 0xad,
+		172, 16, 254, 254,
+		192, 168, 0, 1,
+	}
+	wireHeaderToKernel = [ipv4.HeaderLen]byte{
+		0x45, 0x01, 0xbe, 0xef,
+		0xca, 0xfe, 0x05, 0xdc,
+		0xff, 0x01, 0xde, 0xad,
+		172, 16, 254, 254,
+		192, 168, 0, 1,
+	}
+	wireHeaderFromTradBSDKernel = [ipv4.HeaderLen]byte{
+		0x45, 0x01, 0xdb, 0xbe,
+		0xca, 0xfe, 0xdc, 0x05,
+		0xff, 0x01, 0xde, 0xad,
+		172, 16, 254, 254,
+		192, 168, 0, 1,
+	}
+	wireHeaderToTradBSDKernel = [ipv4.HeaderLen]byte{
+		0x45, 0x01, 0xef, 0xbe,
+		0xca, 0xfe, 0xdc, 0x05,
+		0xff, 0x01, 0xde, 0xad,
+		172, 16, 254, 254,
+		192, 168, 0, 1,
+	}
+	// TODO(mikio): Add platform dependent wire header formats when
+	// we support new platforms.
+)
+
+func testHeader() *ipv4.Header {
+	h := &ipv4.Header{}
+	h.Version = ipv4.Version
+	h.Len = ipv4.HeaderLen
+	h.TOS = 1
+	h.TotalLen = 0xbeef
+	h.ID = 0xcafe
+	h.FragOff = 1500
+	h.TTL = 255
+	h.Protocol = 1
+	h.Checksum = 0xdead
+	h.Src = net.IPv4(172, 16, 254, 254)
+	h.Dst = net.IPv4(192, 168, 0, 1)
+	return h
+}
+
+func TestMarshalHeader(t *testing.T) {
+	th := testHeader()
+	b, err := th.Marshal()
+	if err != nil {
+		t.Fatalf("ipv4.Header.Marshal failed: %v", err)
+	}
+	var wh []byte
+	switch runtime.GOOS {
+	case "linux", "openbsd":
+		wh = wireHeaderToKernel[:]
+	default:
+		wh = wireHeaderToTradBSDKernel[:]
+	}
+	if !bytes.Equal(b, wh) {
+		t.Fatalf("ipv4.Header.Marshal failed: %#v not equal %#v", b, wh)
+	}
+}
+
+func TestParseHeader(t *testing.T) {
+	var wh []byte
+	switch runtime.GOOS {
+	case "linux", "openbsd":
+		wh = wireHeaderFromKernel[:]
+	default:
+		wh = wireHeaderFromTradBSDKernel[:]
+	}
+	h, err := ipv4.ParseHeader(wh)
+	if err != nil {
+		t.Fatalf("ipv4.ParseHeader failed: %v", err)
+	}
+	th := testHeader()
+	if !reflect.DeepEqual(h, th) {
+		t.Fatalf("ipv4.ParseHeader failed: %#v not equal %#v", h, th)
+	}
+}