code: func (rm *RelayMessage) UnmarshalBinary(p []byte) error {
  	b := buffer.New(p)
  	// RelayMessage must contain at least message type, hop-count, link-address and peer-address
  	if b.Len() < 34 {
  		return io.ErrUnexpectedEOF
  	}
  
  	rm.MessageType = dhcp6.MessageType(b.Read8())
  	rm.HopCount = b.Read8()
  
  	rm.LinkAddress = make(net.IP, net.IPv6len)
  	copy(rm.LinkAddress, b.Consume(net.IPv6len))
  
  	rm.PeerAddress = make(net.IP, net.IPv6len)
  	copy(rm.PeerAddress, b.Consume(net.IPv6len))
  
  	if err := (&rm.Options).UnmarshalBinary(b.Remaining()); err != nil {
  		// Invalid options means an invalid RelayMessage
  		return dhcp6.ErrInvalidPacket
  	}
  	return nil
  }
docs: // UnmarshalBinary unmarshals a raw byte slice into a RelayMessage.
  //
  // If the byte slice does not contain enough data to form a valid RelayMessage,
  // ErrInvalidPacket is returned.