| // 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 | 
 |  | 
 | import ( | 
 | 	"encoding/binary" | 
 | 	"errors" | 
 | 	"net" | 
 | 	"unsafe" | 
 | ) | 
 |  | 
 | var ( | 
 | 	errMissingAddress           = errors.New("missing address") | 
 | 	errMissingHeader            = errors.New("missing header") | 
 | 	errHeaderTooShort           = errors.New("header too short") | 
 | 	errBufferTooShort           = errors.New("buffer too short") | 
 | 	errInvalidConnType          = errors.New("invalid conn type") | 
 | 	errOpNoSupport              = errors.New("operation not supported") | 
 | 	errNoSuchInterface          = errors.New("no such interface") | 
 | 	errNoSuchMulticastInterface = errors.New("no such multicast interface") | 
 |  | 
 | 	// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. | 
 | 	freebsdVersion uint32 | 
 |  | 
 | 	nativeEndian binary.ByteOrder | 
 | ) | 
 |  | 
 | func init() { | 
 | 	i := uint32(1) | 
 | 	b := (*[4]byte)(unsafe.Pointer(&i)) | 
 | 	if b[0] == 1 { | 
 | 		nativeEndian = binary.LittleEndian | 
 | 	} else { | 
 | 		nativeEndian = binary.BigEndian | 
 | 	} | 
 | } | 
 |  | 
 | func boolint(b bool) int { | 
 | 	if b { | 
 | 		return 1 | 
 | 	} | 
 | 	return 0 | 
 | } | 
 |  | 
 | func netAddrToIP4(a net.Addr) net.IP { | 
 | 	switch v := a.(type) { | 
 | 	case *net.UDPAddr: | 
 | 		if ip := v.IP.To4(); ip != nil { | 
 | 			return ip | 
 | 		} | 
 | 	case *net.IPAddr: | 
 | 		if ip := v.IP.To4(); ip != nil { | 
 | 			return ip | 
 | 		} | 
 | 	} | 
 | 	return nil | 
 | } |