OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / ipv6 / payload_cmsg_go1_8.go
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 !go1.9
6 // +build !nacl,!plan9,!windows
7
8 package ipv6
9
10 import "net"
11
12 func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) {
13         c.rawOpt.RLock()
14         oob := NewControlMessage(c.rawOpt.cflags)
15         c.rawOpt.RUnlock()
16         var nn int
17         switch c := c.PacketConn.(type) {
18         case *net.UDPConn:
19                 if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil {
20                         return 0, nil, nil, err
21                 }
22         case *net.IPConn:
23                 if n, nn, _, src, err = c.ReadMsgIP(b, oob); err != nil {
24                         return 0, nil, nil, err
25                 }
26         default:
27                 return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType}
28         }
29         if nn > 0 {
30                 cm = new(ControlMessage)
31                 if err = cm.Parse(oob[:nn]); err != nil {
32                         return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
33                 }
34         }
35         if cm != nil {
36                 cm.Src = netAddrToIP16(src)
37         }
38         return
39 }
40
41 func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) {
42         oob := cm.Marshal()
43         if dst == nil {
44                 return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress}
45         }
46         switch c := c.PacketConn.(type) {
47         case *net.UDPConn:
48                 n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr))
49         case *net.IPConn:
50                 n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr))
51         default:
52                 return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType}
53         }
54         return
55 }