code: func (i *IAAddr) UnmarshalBinary(p []byte) error {
  	b := buffer.New(p)
  	if b.Len() < 24 {
  		return io.ErrUnexpectedEOF
  	}
  
  	i.IP = make(net.IP, net.IPv6len)
  	copy(i.IP, b.Consume(net.IPv6len))
  
  	i.PreferredLifetime = time.Duration(b.Read32()) * time.Second
  	i.ValidLifetime = time.Duration(b.Read32()) * time.Second
  
  	// Preferred lifetime must always be less than valid lifetime.
  	if i.PreferredLifetime > i.ValidLifetime {
  		return ErrInvalidLifetimes
  	}
  
  	return (&i.Options).UnmarshalBinary(b.Remaining())
  }
docs: // UnmarshalBinary unmarshals a raw byte slice into a IAAddr.
  //
  // If the byte slice does not contain enough data to form a valid IAAddr,
  // io.ErrUnexpectedEOF is returned.  If the preferred lifetime value in the
  // byte slice is less than the valid lifetime, ErrInvalidLifetimes is returned.