OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / ipv4 / payload_cmsg_go1_8.go
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
5 // +build !go1.9
6 // +build !nacl,!plan9,!windows
7
8 package ipv4
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                 nb := make([]byte, maxHeaderLen+len(b))
24                 if n, nn, _, src, err = c.ReadMsgIP(nb, oob); err != nil {
25                         return 0, nil, nil, err
26                 }
27                 hdrlen := int(nb[0]&0x0f) << 2
28                 copy(b, nb[hdrlen:])
29                 n -= hdrlen
30         default:
31                 return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType}
32         }
33         if nn > 0 {
34                 cm = new(ControlMessage)
35                 if err = cm.Parse(oob[:nn]); err != nil {
36                         return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
37                 }
38         }
39         if cm != nil {
40                 cm.Src = netAddrToIP4(src)
41         }
42         return
43 }
44
45 func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) {
46         oob := cm.Marshal()
47         if dst == nil {
48                 return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress}
49         }
50         switch c := c.PacketConn.(type) {
51         case *net.UDPConn:
52                 n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr))
53         case *net.IPConn:
54                 n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr))
55         default:
56                 return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType}
57         }
58         return
59 }