OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / ipv6 / header.go
1 // Copyright 2014 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 package ipv6
6
7 import (
8         "encoding/binary"
9         "fmt"
10         "net"
11 )
12
13 const (
14         Version   = 6  // protocol version
15         HeaderLen = 40 // header length
16 )
17
18 // A Header represents an IPv6 base header.
19 type Header struct {
20         Version      int    // protocol version
21         TrafficClass int    // traffic class
22         FlowLabel    int    // flow label
23         PayloadLen   int    // payload length
24         NextHeader   int    // next header
25         HopLimit     int    // hop limit
26         Src          net.IP // source address
27         Dst          net.IP // destination address
28 }
29
30 func (h *Header) String() string {
31         if h == nil {
32                 return "<nil>"
33         }
34         return fmt.Sprintf("ver=%d tclass=%#x flowlbl=%#x payloadlen=%d nxthdr=%d hoplim=%d src=%v dst=%v", h.Version, h.TrafficClass, h.FlowLabel, h.PayloadLen, h.NextHeader, h.HopLimit, h.Src, h.Dst)
35 }
36
37 // ParseHeader parses b as an IPv6 base header.
38 func ParseHeader(b []byte) (*Header, error) {
39         if len(b) < HeaderLen {
40                 return nil, errHeaderTooShort
41         }
42         h := &Header{
43                 Version:      int(b[0]) >> 4,
44                 TrafficClass: int(b[0]&0x0f)<<4 | int(b[1])>>4,
45                 FlowLabel:    int(b[1]&0x0f)<<16 | int(b[2])<<8 | int(b[3]),
46                 PayloadLen:   int(binary.BigEndian.Uint16(b[4:6])),
47                 NextHeader:   int(b[6]),
48                 HopLimit:     int(b[7]),
49         }
50         h.Src = make(net.IP, net.IPv6len)
51         copy(h.Src, b[8:24])
52         h.Dst = make(net.IP, net.IPv6len)
53         copy(h.Dst, b[24:40])
54         return h, nil
55 }