65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package xt
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/google/nftables/alignedbuff"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func bool32(ab *alignedbuff.AlignedBuff) (bool, error) {
|
|
v, err := ab.Uint32()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if v != 0 {
|
|
return true, nil
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func putBool32(ab *alignedbuff.AlignedBuff, b bool) {
|
|
if b {
|
|
ab.PutUint32(1)
|
|
return
|
|
}
|
|
ab.PutUint32(0)
|
|
}
|
|
|
|
func iPv46(ab *alignedbuff.AlignedBuff, fam TableFamily) (net.IP, error) {
|
|
ip, err := ab.BytesAligned32(16)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
switch fam {
|
|
case unix.NFPROTO_IPV4:
|
|
return net.IP(ip[:4]), nil
|
|
case unix.NFPROTO_IPV6:
|
|
return net.IP(ip), nil
|
|
default:
|
|
return nil, fmt.Errorf("unmarshal IP: unsupported table family %d", fam)
|
|
}
|
|
}
|
|
|
|
func iPv46Mask(ab *alignedbuff.AlignedBuff, fam TableFamily) (net.IPMask, error) {
|
|
v, err := iPv46(ab, fam)
|
|
return net.IPMask(v), err
|
|
}
|
|
|
|
func putIPv46(ab *alignedbuff.AlignedBuff, fam TableFamily, ip net.IP) error {
|
|
switch fam {
|
|
case unix.NFPROTO_IPV4:
|
|
ab.PutBytesAligned32(ip.To4(), 16)
|
|
case unix.NFPROTO_IPV6:
|
|
ab.PutBytesAligned32(ip.To16(), 16)
|
|
default:
|
|
return fmt.Errorf("marshal IP: unsupported table family %d", fam)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func putIPv46Mask(ab *alignedbuff.AlignedBuff, fam TableFamily, mask net.IPMask) error {
|
|
return putIPv46(ab, fam, net.IP(mask))
|
|
}
|