util.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package xt
  2. import (
  3. "fmt"
  4. "net"
  5. "github.com/google/nftables/alignedbuff"
  6. "golang.org/x/sys/unix"
  7. )
  8. func bool32(ab *alignedbuff.AlignedBuff) (bool, error) {
  9. v, err := ab.Uint32()
  10. if err != nil {
  11. return false, err
  12. }
  13. if v != 0 {
  14. return true, nil
  15. }
  16. return false, nil
  17. }
  18. func putBool32(ab *alignedbuff.AlignedBuff, b bool) {
  19. if b {
  20. ab.PutUint32(1)
  21. return
  22. }
  23. ab.PutUint32(0)
  24. }
  25. func iPv46(ab *alignedbuff.AlignedBuff, fam TableFamily) (net.IP, error) {
  26. ip, err := ab.BytesAligned32(16)
  27. if err != nil {
  28. return nil, err
  29. }
  30. switch fam {
  31. case unix.NFPROTO_IPV4:
  32. return net.IP(ip[:4]), nil
  33. case unix.NFPROTO_IPV6:
  34. return net.IP(ip), nil
  35. default:
  36. return nil, fmt.Errorf("unmarshal IP: unsupported table family %d", fam)
  37. }
  38. }
  39. func iPv46Mask(ab *alignedbuff.AlignedBuff, fam TableFamily) (net.IPMask, error) {
  40. v, err := iPv46(ab, fam)
  41. return net.IPMask(v), err
  42. }
  43. func putIPv46(ab *alignedbuff.AlignedBuff, fam TableFamily, ip net.IP) error {
  44. switch fam {
  45. case unix.NFPROTO_IPV4:
  46. ab.PutBytesAligned32(ip.To4(), 16)
  47. case unix.NFPROTO_IPV6:
  48. ab.PutBytesAligned32(ip.To16(), 16)
  49. default:
  50. return fmt.Errorf("marshal IP: unsupported table family %d", fam)
  51. }
  52. return nil
  53. }
  54. func putIPv46Mask(ab *alignedbuff.AlignedBuff, fam TableFamily, mask net.IPMask) error {
  55. return putIPv46(ab, fam, net.IP(mask))
  56. }