diff --git a/unix/linux/types.go b/unix/linux/types.go index 7efe890c..17fbb729 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -3645,6 +3645,8 @@ const ( ETHTOOL_A_TUNNEL_INFO_MAX = C.ETHTOOL_A_TUNNEL_INFO_MAX ) +type EthtoolDrvinfo C.struct_ethtool_drvinfo + type ( HIDRawReportDescriptor C.struct_hidraw_report_descriptor HIDRawDevInfo C.struct_hidraw_devinfo diff --git a/unix/mkpost.go b/unix/mkpost.go index c6b89512..f1a92dd1 100644 --- a/unix/mkpost.go +++ b/unix/mkpost.go @@ -95,6 +95,15 @@ func main() { b = bytes.Replace(b, s, newNames, 1) } + // Convert []int8 to []byte in EthtoolDrvinfo + convertEthtoolDrvinfoNames := regexp.MustCompile(`(Driver|Version|Fw_version|Bus_info|Erom_version|Reserved2)(\s+)\[(\d+)\]u?int8`) + ethtoolDrvinfoTypes := regexp.MustCompile(`type EthtoolDrvinfo struct {[^}]*}`) + ethtoolDrvinfoStructs := ethtoolDrvinfoTypes.FindAll(b, -1) + for _, s := range ethtoolDrvinfoStructs { + newNames := convertEthtoolDrvinfoNames.ReplaceAll(s, []byte("$1$2[$3]byte")) + b = bytes.Replace(b, s, newNames, 1) + } + // Convert []int8 to []byte in ctl_info ioctl interface convertCtlInfoName := regexp.MustCompile(`(Name)(\s+)\[(\d+)\]int8`) ctlInfoType := regexp.MustCompile(`type CtlInfo struct {[^}]*}`) diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index fe37eaf5..c61c963b 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -106,6 +106,31 @@ func IoctlGetRTCTime(fd int) (*RTCTime, error) { return &value, err } +type ifreqEthtool struct { + name [IFNAMSIZ]byte + data unsafe.Pointer +} + +// IoctlGetEthtoolDrvinfo fetches ethtool driver information for the network +// device specified by ifname. +func IoctlGetEthtoolDrvinfo(fd int, ifname string) (*EthtoolDrvinfo, error) { + // Leave room for terminating NULL byte. + if len(ifname) >= IFNAMSIZ { + return nil, EINVAL + } + + value := EthtoolDrvinfo{ + Cmd: ETHTOOL_GDRVINFO, + } + ifreq := ifreqEthtool{ + data: unsafe.Pointer(&value), + } + copy(ifreq.name[:], ifname) + err := ioctl(fd, SIOCETHTOOL, uintptr(unsafe.Pointer(&ifreq))) + runtime.KeepAlive(ifreq) + return &value, err +} + // IoctlGetWatchdogInfo fetches information about a watchdog device from the // Linux watchdog API. For more information, see: // https://www.kernel.org/doc/html/latest/watchdog/watchdog-api.html. diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index c769e73c..3bfc6f73 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -3698,6 +3698,21 @@ const ( ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 ) +type EthtoolDrvinfo struct { + Cmd uint32 + Driver [32]byte + Version [32]byte + Fw_version [32]byte + Bus_info [32]byte + Erom_version [32]byte + Reserved2 [12]byte + N_priv_flags uint32 + N_stats uint32 + Testinfo_len uint32 + Eedump_len uint32 + Regdump_len uint32 +} + type ( HIDRawReportDescriptor struct { Size uint32