github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv6/payload_cmsg.go (about) 1 // Copyright 2013 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 5 // +build !nacl,!plan9,!windows 6 7 package ipv6 8 9 import ( 10 "net" 11 "syscall" 12 ) 13 14 // ReadFrom reads a payload of the received IPv6 datagram, from the 15 // endpoint c, copying the payload into b. It returns the number of 16 // bytes copied into b, the control message cm and the source address 17 // src of the received datagram. 18 func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { 19 if !c.ok() { 20 return 0, nil, nil, syscall.EINVAL 21 } 22 oob := newControlMessage(&c.rawOpt) 23 var oobn int 24 switch c := c.PacketConn.(type) { 25 case *net.UDPConn: 26 if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { 27 return 0, nil, nil, err 28 } 29 case *net.IPConn: 30 if n, oobn, _, src, err = c.ReadMsgIP(b, oob); err != nil { 31 return 0, nil, nil, err 32 } 33 default: 34 return 0, nil, nil, errInvalidConnType 35 } 36 if cm, err = parseControlMessage(oob[:oobn]); err != nil { 37 return 0, nil, nil, err 38 } 39 if cm != nil { 40 cm.Src = netAddrToIP16(src) 41 } 42 return 43 } 44 45 // WriteTo writes a payload of the IPv6 datagram, to the destination 46 // address dst through the endpoint c, copying the payload from b. It 47 // returns the number of bytes written. The control message cm allows 48 // the IPv6 header fields and the datagram path to be specified. The 49 // cm may be nil if control of the outgoing datagram is not required. 50 func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { 51 if !c.ok() { 52 return 0, syscall.EINVAL 53 } 54 oob := marshalControlMessage(cm) 55 if dst == nil { 56 return 0, errMissingAddress 57 } 58 switch c := c.PacketConn.(type) { 59 case *net.UDPConn: 60 n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) 61 case *net.IPConn: 62 n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) 63 default: 64 return 0, errInvalidConnType 65 } 66 if err != nil { 67 return 0, err 68 } 69 return 70 }