netip.go 978 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package nnip
  2. import (
  3. "encoding/binary"
  4. "net"
  5. "net/netip"
  6. )
  7. // IpToAddr converts the net.IP to netip.Addr.
  8. // If slice's length is not 4 or 16, IpToAddr returns netip.Addr{}
  9. func IpToAddr(slice net.IP) netip.Addr {
  10. ip := slice
  11. if len(ip) != 4 {
  12. if ip = slice.To4(); ip == nil {
  13. ip = slice
  14. }
  15. }
  16. if addr, ok := netip.AddrFromSlice(ip); ok {
  17. return addr
  18. }
  19. return netip.Addr{}
  20. }
  21. // UnMasked returns p's last IP address.
  22. // If p is invalid, UnMasked returns netip.Addr{}
  23. func UnMasked(p netip.Prefix) netip.Addr {
  24. if !p.IsValid() {
  25. return netip.Addr{}
  26. }
  27. buf := p.Addr().As16()
  28. hi := binary.BigEndian.Uint64(buf[:8])
  29. lo := binary.BigEndian.Uint64(buf[8:])
  30. bits := p.Bits()
  31. if bits <= 32 {
  32. bits += 96
  33. }
  34. hi = hi | ^uint64(0)>>bits
  35. lo = lo | ^(^uint64(0) << (128 - bits))
  36. binary.BigEndian.PutUint64(buf[:8], hi)
  37. binary.BigEndian.PutUint64(buf[8:], lo)
  38. addr := netip.AddrFrom16(buf)
  39. if p.Addr().Is4() {
  40. return addr.Unmap()
  41. }
  42. return addr
  43. }