From 3e9a981b8ddba4cb37815d4ebf2171df73c5255b Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 6 Mar 2019 09:51:10 +0100 Subject: [PATCH] unix: add functions to get/set tpacket socket options Add GetsockoptTpacketStats and GetsockoptTpacketStatsV3 to get tpacket statistics (for TPACKET_V2 and TPACKET_V3). Add SetsockoptTpacketReq and SetsockoptTpacketReq3 to set up tpacket v2/v3 ring buffers. Change-Id: Ic2870be22be7d74141f682e515a682df28e1c814 Reviewed-on: https://go-review.googlesource.com/c/sys/+/165558 Reviewed-by: Ian Lance Taylor --- unix/linux/types.go | 3 +++ unix/syscall_linux.go | 22 ++++++++++++++++++++++ unix/ztypes_linux_386.go | 3 +++ unix/ztypes_linux_amd64.go | 3 +++ unix/ztypes_linux_arm.go | 3 +++ unix/ztypes_linux_arm64.go | 3 +++ unix/ztypes_linux_mips.go | 3 +++ unix/ztypes_linux_mips64.go | 3 +++ unix/ztypes_linux_mips64le.go | 3 +++ unix/ztypes_linux_mipsle.go | 3 +++ unix/ztypes_linux_ppc64.go | 3 +++ unix/ztypes_linux_ppc64le.go | 3 +++ unix/ztypes_linux_riscv64.go | 3 +++ unix/ztypes_linux_s390x.go | 3 +++ unix/ztypes_linux_sparc64.go | 3 +++ 15 files changed, 64 insertions(+) diff --git a/unix/linux/types.go b/unix/linux/types.go index a1828ad2..d157d25b 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -1115,6 +1115,9 @@ const ( SizeofTpacketHdr = C.sizeof_struct_tpacket_hdr SizeofTpacket2Hdr = C.sizeof_struct_tpacket2_hdr SizeofTpacket3Hdr = C.sizeof_struct_tpacket3_hdr + + SizeofTpacketStats = C.sizeof_struct_tpacket_stats + SizeofTpacketStatsV3 = C.sizeof_struct_tpacket_stats_v3 ) // netfilter diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index 6f03b862..fea1fb33 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -1004,6 +1004,20 @@ func GetsockoptString(fd, level, opt int) (string, error) { return string(buf[:vallen-1]), nil } +func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) { + var value TpacketStats + vallen := _Socklen(SizeofTpacketStats) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptTpacketStatsV3(fd, level, opt int) (*TpacketStatsV3, error) { + var value TpacketStatsV3 + vallen := _Socklen(SizeofTpacketStatsV3) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) } @@ -1022,6 +1036,14 @@ func SetsockoptCanRawFilter(fd, level, opt int, filter []CanFilter) error { return setsockopt(fd, level, opt, p, uintptr(len(filter)*SizeofCanFilter)) } +func SetsockoptTpacketReq(fd, level, opt int, tp *TpacketReq) error { + return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp)) +} + +func SetsockoptTpacketReq3(fd, level, opt int, tp *TpacketReq3) error { + return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp)) +} + // Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) // KeyctlInt calls keyctl commands in which each argument is an int. diff --git a/unix/ztypes_linux_386.go b/unix/ztypes_linux_386.go index 25a3be6e..06f21451 100644 --- a/unix/ztypes_linux_386.go +++ b/unix/ztypes_linux_386.go @@ -1428,6 +1428,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_amd64.go b/unix/ztypes_linux_amd64.go index 9f6b9759..a862e653 100644 --- a/unix/ztypes_linux_amd64.go +++ b/unix/ztypes_linux_amd64.go @@ -1440,6 +1440,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_arm.go b/unix/ztypes_linux_arm.go index c944db21..bf04f7bd 100644 --- a/unix/ztypes_linux_arm.go +++ b/unix/ztypes_linux_arm.go @@ -1418,6 +1418,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_arm64.go b/unix/ztypes_linux_arm64.go index e6f4bade..e67eed85 100644 --- a/unix/ztypes_linux_arm64.go +++ b/unix/ztypes_linux_arm64.go @@ -1419,6 +1419,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_mips.go b/unix/ztypes_linux_mips.go index 205d1c5c..d781d071 100644 --- a/unix/ztypes_linux_mips.go +++ b/unix/ztypes_linux_mips.go @@ -1424,6 +1424,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_mips64.go b/unix/ztypes_linux_mips64.go index d055d441..39f0c2cf 100644 --- a/unix/ztypes_linux_mips64.go +++ b/unix/ztypes_linux_mips64.go @@ -1421,6 +1421,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_mips64le.go b/unix/ztypes_linux_mips64le.go index cb6a1f7a..2b38197b 100644 --- a/unix/ztypes_linux_mips64le.go +++ b/unix/ztypes_linux_mips64le.go @@ -1421,6 +1421,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_mipsle.go b/unix/ztypes_linux_mipsle.go index 93cd4a4a..8c082e49 100644 --- a/unix/ztypes_linux_mipsle.go +++ b/unix/ztypes_linux_mipsle.go @@ -1424,6 +1424,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_ppc64.go b/unix/ztypes_linux_ppc64.go index a502c8e7..9b8d1fe8 100644 --- a/unix/ztypes_linux_ppc64.go +++ b/unix/ztypes_linux_ppc64.go @@ -1429,6 +1429,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_ppc64le.go b/unix/ztypes_linux_ppc64le.go index fd7582fb..67291efa 100644 --- a/unix/ztypes_linux_ppc64le.go +++ b/unix/ztypes_linux_ppc64le.go @@ -1429,6 +1429,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_riscv64.go b/unix/ztypes_linux_riscv64.go index 56e5a720..991ca1c3 100644 --- a/unix/ztypes_linux_riscv64.go +++ b/unix/ztypes_linux_riscv64.go @@ -1446,6 +1446,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_s390x.go b/unix/ztypes_linux_s390x.go index c3a1cbd5..552c2a0b 100644 --- a/unix/ztypes_linux_s390x.go +++ b/unix/ztypes_linux_s390x.go @@ -1443,6 +1443,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( diff --git a/unix/ztypes_linux_sparc64.go b/unix/ztypes_linux_sparc64.go index 75021e7f..6942c11e 100644 --- a/unix/ztypes_linux_sparc64.go +++ b/unix/ztypes_linux_sparc64.go @@ -1424,6 +1424,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const (