package syscall
import (
)
func (, int) *SockFilter {
return &SockFilter{Code: uint16(), K: uint32()}
}
func (, , , int) *SockFilter {
return &SockFilter{Code: uint16(), Jt: uint8(), Jf: uint8(), K: uint32()}
}
func (, int) (int, error) {
var SockaddrLinklayer
, := Socket(AF_PACKET, SOCK_RAW, )
if != nil {
return 0,
}
:= (*[2]byte)(unsafe.Pointer(&.Protocol))
[0] = byte( >> 8)
[1] = byte()
.Ifindex =
= Bind(, &)
if != nil {
Close()
return 0,
}
return , nil
}
type iflags struct {
name [IFNAMSIZ]byte
flags uint16
}
func ( string, bool) error {
, := cloexecSocket(AF_INET, SOCK_DGRAM, 0)
if != nil {
return
}
defer Close()
var iflags
copy(.name[:], []byte())
, , := Syscall(SYS_IOCTL, uintptr(), SIOCGIFFLAGS, uintptr(unsafe.Pointer(&)))
if != 0 {
return Errno()
}
if {
.flags |= uint16(IFF_PROMISC)
} else {
.flags &^= uint16(IFF_PROMISC)
}
_, _, = Syscall(SYS_IOCTL, uintptr(), SIOCSIFFLAGS, uintptr(unsafe.Pointer(&)))
if != 0 {
return Errno()
}
return nil
}
func ( int, []SockFilter) error {
var SockFprog
.Len = uint16(len())
.Filter = (*SockFilter)(unsafe.Pointer(&[0]))
return setsockopt(, SOL_SOCKET, SO_ATTACH_FILTER, unsafe.Pointer(&), unsafe.Sizeof())
}
func ( int) error {
var int
return setsockopt(, SOL_SOCKET, SO_DETACH_FILTER, unsafe.Pointer(&), unsafe.Sizeof())
}