Thanks both, it's making more sense now. One thing I'm still unclear about: why does struct ethtool_usrip4_spechave the ip_ver field? The struct can't be extended to cover ipv6, because the address fields aren't big enough. So what's it for?
Also, would it be appropriate to use struct in6_addr for IPv6 addresses, or should I use __be32[4]? -Ed