1// Copyright 2012 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package ipv4 6 7import ( 8 "errors" 9 "net" 10 "runtime" 11 12 "golang.org/x/net/internal/socket" 13) 14 15var ( 16 errInvalidConn = errors.New("invalid connection") 17 errMissingAddress = errors.New("missing address") 18 errNilHeader = errors.New("nil header") 19 errHeaderTooShort = errors.New("header too short") 20 errExtHeaderTooShort = errors.New("extension header too short") 21 errInvalidConnType = errors.New("invalid conn type") 22 errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) 23 24 // See https://www.freebsd.org/doc/en/books/porters-handbook/versions.html. 25 freebsdVersion uint32 26 compatFreeBSD32 bool // 386 emulation on amd64 27) 28 29// See golang.org/issue/30899. 30func adjustFreeBSD32(m *socket.Message) { 31 // FreeBSD 12.0-RELEASE is affected by https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236737 32 if 1200086 <= freebsdVersion && freebsdVersion < 1201000 { 33 l := (m.NN + 4 - 1) &^ (4 - 1) 34 if m.NN < l && l <= len(m.OOB) { 35 m.NN = l 36 } 37 } 38} 39 40func boolint(b bool) int { 41 if b { 42 return 1 43 } 44 return 0 45} 46 47func netAddrToIP4(a net.Addr) net.IP { 48 switch v := a.(type) { 49 case *net.UDPAddr: 50 if ip := v.IP.To4(); ip != nil { 51 return ip 52 } 53 case *net.IPAddr: 54 if ip := v.IP.To4(); ip != nil { 55 return ip 56 } 57 } 58 return nil 59} 60 61func opAddr(a net.Addr) net.Addr { 62 switch a.(type) { 63 case *net.TCPAddr: 64 if a == nil { 65 return nil 66 } 67 case *net.UDPAddr: 68 if a == nil { 69 return nil 70 } 71 case *net.IPAddr: 72 if a == nil { 73 return nil 74 } 75 } 76 return a 77} 78