unix: add ifreq and ifreqData helpers for Linux

ifreq is difficult to use in Go due to the union field in particular. This
situation is made worse due to the need to comply with Go's unsafe.Pointer
rules. This CL generates the raw ifreq type and also adds an ifreqData type
of the same size which is specialized for use with unsafe.Pointer.

We also replace the existing ifreqEthtool (which was not padded to the correct
size) with the new APIs and add a test to verify that IoctlGetEthtoolDrvinfo
functions properly by checking the name of the driver for each network interface.

Future uses of ifreq in package unix can expand upon this type with additional
getter and setter methods to deal with the unsafe casts to and from the union
byte array. We may also consider exporting ifreq and ifreqData if necessary.

Change-Id: Ibf73a10e774b4336815c674bb867bbb7ec1b9c71
Reviewed-on: https://go-review.googlesource.com/c/sys/+/340369
Run-TryBot: Matt Layher <mdlayher@gmail.com>
Trust: Matt Layher <mdlayher@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
Matt Layher
2021-08-06 18:45:41 +00:00
parent 0f9fa26af8
commit e5e7981a10
19 changed files with 170 additions and 17 deletions
+8
View File
@@ -14,6 +14,14 @@ import (
"unsafe"
)
func Test_ifreqSize(t *testing.T) {
// Ensure ifreq (generated) and ifreqData (hand-written due to
// unsafe.Pointer field) are identical in size.
if want, got := unsafe.Sizeof(ifreq{}), unsafe.Sizeof(ifreqData{}); want != got {
t.Fatalf("unexpected ifreq size: got: %d, want: %d", got, want)
}
}
func makeProto(proto int) *int {
return &proto
}