go.net/ipv4: handle total length field correctly on FreeBSD 10

FreeBSD 10 kernel has changed its incoming IPv4 packet handling
to stop trimming some IPv4 header fields on raw socket IO. This CL
just adapts package's IPv4 header representation to look the same
even on FreeBSD 10 kernel.

For further information:
http://svnweb.freebsd.org/base/head/?view=log&pathrev=226105
http://svnweb.freebsd.org/base/head/?view=log&pathrev=241913
http://svnweb.freebsd.org/base/head/?view=log&pathrev=241923

LGTM=iant
R=golang-codereviews, gobot, dave, iant
CC=golang-codereviews
https://golang.org/cl/53030043
diff --git a/ipv4/header.go b/ipv4/header.go
index e15db01..672f2d3 100644
--- a/ipv4/header.go
+++ b/ipv4/header.go
@@ -121,6 +121,9 @@
 	return b, nil
 }
 
+// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html.
+var freebsdVersion uint32
+
 // ParseHeader parses b as an IPv4 header.
 func ParseHeader(b []byte) (*Header, error) {
 	if len(b) < HeaderLen {
@@ -139,7 +142,9 @@
 		h.FragOff = int(b[posFragOff])<<8 | int(b[posFragOff+1])
 	} else {
 		h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[posTotalLen : posTotalLen+1][0])))
-		h.TotalLen += hdrlen
+		if runtime.GOOS != "freebsd" || freebsdVersion < 1000000 {
+			h.TotalLen += hdrlen
+		}
 		h.FragOff = int(*(*uint16)(unsafe.Pointer(&b[posFragOff : posFragOff+1][0])))
 	}
 	h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13