header.go (1498B)
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 }