// Create a new NfLog // // McastGroup is that specified in ip[6]tables // IPv6 is a flag to say if it is IPv6 or not // Direction is to monitor the source address or the dest address func NewNfLog(McastGroup int, IpVersion byte, Direction IpDirection, MaskBits int, a *Accounting) *NfLog { h, err := C.nflog_open() if h == nil || err != nil { log.Fatalf("Failed to open NFLOG: %s", nflogError(err)) } if *Verbose { log.Println("Binding nfnetlink_log to AF_INET") } if rc, err := C.nflog_bind_pf(h, C.AF_INET); rc < 0 || err != nil { log.Fatalf("nflog_bind_pf failed: %s", nflogError(err)) } nflog := &NfLog{ h: h, fd: C.nflog_fd(h), McastGroup: McastGroup, IpVersion: IpVersion, Direction: Direction, a: a, quit: make(chan struct{}), packets: (*C.packets)(C.malloc(C.sizeof_packets)), } for i := range nflogs { if nflogs[i] == nil { nflog.index = i nflogs[i] = nflog goto found } } log.Fatal("Too many filters") found: switch IpVersion { case 4: nflog.IpPacket = Ip4Packet case 6: nflog.IpPacket = Ip6Packet default: log.Fatalf("Bad IP version %d", IpVersion) } addrBits := 8 * nflog.IpPacket.AddrLen nflog.UseMask = MaskBits < addrBits nflog.Mask = net.CIDRMask(MaskBits, addrBits) nflog.makeGroup(McastGroup, nflog.IpPacket.HeaderSize) // Start the background process go nflog.Loop() return nflog }
// Create a new NfLog // // McastGroup is that specified in ip[6]tables // IPv6 is a flag to say if it is IPv6 or not // Direction is to monitor the source address or the dest address func NewNfLog(McastGroup int, IpVersion byte, Direction IpDirection, MaskBits int, a *Accounting) *NfLog { h := C.nflog_open() if h == nil { log.Fatalf("Failed to open NFLOG: %s", strerror()) } if *Debug { log.Println("Binding nfnetlink_log to AF_INET") } if C.nflog_bind_pf(h, C.AF_INET) < 0 { log.Fatalf("nflog_bind_pf failed: %s", strerror()) } nflog := &NfLog{ h: h, fd: C.nflog_fd(h), McastGroup: McastGroup, IpVersion: IpVersion, Direction: Direction, a: a, } switch IpVersion { case 4: nflog.IpPacket = Ip4Packet case 6: nflog.IpPacket = Ip6Packet default: log.Fatalf("Bad IP version %d", IpVersion) } addrBits := 8 * nflog.IpPacket.AddrLen nflog.UseMask = MaskBits < addrBits nflog.Mask = net.CIDRMask(MaskBits, addrBits) nflog.makeGroup(McastGroup, nflog.IpPacket.HeaderSize) // Start the background process go nflog.Loop() return nflog }