OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / ipv4 / packet_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
7 package ipv4
8
9 import "net"
10
11 func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) {
12         c.rawOpt.RLock()
13         oob := NewControlMessage(c.rawOpt.cflags)
14         c.rawOpt.RUnlock()
15         n, nn, _, src, err := c.ReadMsgIP(b, oob)
16         if err != nil {
17                 return nil, nil, nil, err
18         }
19         var hs []byte
20         if hs, p, err = slicePacket(b[:n]); err != nil {
21                 return nil, nil, nil, err
22         }
23         if h, err = ParseHeader(hs); err != nil {
24                 return nil, nil, nil, err
25         }
26         if nn > 0 {
27                 cm = new(ControlMessage)
28                 if err := cm.Parse(oob[:nn]); err != nil {
29                         return nil, nil, nil, err
30                 }
31         }
32         if src != nil && cm != nil {
33                 cm.Src = src.IP
34         }
35         return
36 }
37
38 func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error {
39         oob := cm.Marshal()
40         wh, err := h.Marshal()
41         if err != nil {
42                 return err
43         }
44         dst := new(net.IPAddr)
45         if cm != nil {
46                 if ip := cm.Dst.To4(); ip != nil {
47                         dst.IP = ip
48                 }
49         }
50         if dst.IP == nil {
51                 dst.IP = h.Dst
52         }
53         wh = append(wh, p...)
54         _, _, err = c.WriteMsgIP(wh, oob, dst)
55         return err
56 }