From 18e96021edb8f4de80626d7f50240964e37d570e Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 13 Sep 2017 15:34:21 +0200 Subject: sys: move linux descriptions to sys/linux --- sys/linux/socket.txt | 871 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 871 insertions(+) create mode 100644 sys/linux/socket.txt (limited to 'sys/linux/socket.txt') diff --git a/sys/linux/socket.txt b/sys/linux/socket.txt new file mode 100644 index 000000000..f5423c7ac --- /dev/null +++ b/sys/linux/socket.txt @@ -0,0 +1,871 @@ +# Copyright 2017 syzkaller project authors. All rights reserved. +# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +# TODO: due to autobind a socket can bind to port 0, that will result in a random port which is not reproducible + +include +include +include +include +include +include +include +include +include +include + +resource sock[fd] + +# TODO: describe socketcall syscall + +socket(domain flags[socket_domain], type flags[socket_type], proto int8) sock +socketpair(domain flags[socket_domain], type flags[socket_type], proto int8, fds ptr[out, pipefd]) +bind(fd sock, addr ptr[in, sockaddr_storage], addrlen len[addr]) +connect(fd sock, addr ptr[in, sockaddr_storage], addrlen len[addr]) +accept(fd sock, peer ptr[out, sockaddr_storage, opt], peerlen ptr[inout, len[peer, int32]]) sock +accept4(fd sock, peer ptr[out, sockaddr_storage, opt], peerlen ptr[inout, len[peer, int32]], flags flags[accept_flags]) sock +sendto(fd sock, buf buffer[in], len len[buf], f flags[send_flags], addr ptr[in, sockaddr_storage, opt], addrlen len[addr]) +recvfrom(fd sock, buf buffer[out], len len[buf], f flags[recv_flags], addr ptr[in, sockaddr_storage, opt], addrlen len[addr]) +getsockname(fd sock, addr ptr[out, sockaddr_storage], addrlen ptr[inout, len[addr, int32]]) +getpeername(fd sock, peer ptr[out, sockaddr_storage], peerlen ptr[inout, len[peer, int32]]) + +sendmsg(fd sock, msg ptr[in, send_msghdr], f flags[send_flags]) +sendmmsg(fd sock, mmsg ptr[in, array[send_mmsghdr]], vlen len[mmsg], f flags[send_flags]) +recvmsg(fd sock, msg ptr[in, recv_msghdr], f flags[recv_flags]) +recvmmsg(fd sock, mmsg ptr[in, array[recv_mmsghdr]], vlen len[mmsg], f flags[recv_flags], timeout ptr[in, timespec, opt]) + +listen(fd sock, backlog int32) +shutdown(fd sock, how flags[shutdown_flags]) + +getsockopt(fd sock, level int32, optname int32, optval buffer[out], optlen ptr[inout, len[optval, int32]]) +setsockopt(fd sock, level int32, optname int32, optval buffer[in], optlen len[optval]) + +socket_domain = AF_UNIX, AF_INET, AF_INET6, AF_IPX, AF_NETLINK, AF_X25, AF_AX25, AF_ATMPVC, AF_APPLETALK, AF_PACKET +socket_type = SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, SOCK_DCCP, SOCK_PACKET, SOCK_NONBLOCK, SOCK_CLOEXEC +accept_flags = SOCK_NONBLOCK, SOCK_CLOEXEC +shutdown_flags = SHUT_RD, SHUT_WR +send_flags = MSG_CONFIRM, MSG_DONTROUTE, MSG_DONTWAIT, MSG_EOR, MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PROBE, MSG_BATCH, MSG_FASTOPEN +recv_flags = MSG_CMSG_CLOEXEC, MSG_DONTWAIT, MSG_ERRQUEUE, MSG_OOB, MSG_PEEK, MSG_TRUNC, MSG_WAITALL, MSG_WAITFORONE +cmsg_levels = SOL_SOCKET, IPPROTO_ICMP, SOL_IP, SOL_TCP, SOL_UDP, SOL_IPV6, SOL_ICMPV6, SOL_SCTP, SOL_UDPLITE, SOL_RAW, SOL_IPX, SOL_AX25, SOL_ATALK, SOL_NETROM, SOL_ROSE, SOL_DECNET, SOL_PACKET, SOL_ATM, SOL_AAL, SOL_IRDA, SOL_NETBEUI, SOL_LLC, SOL_DCCP, SOL_NETLINK, SOL_TIPC, SOL_RXRPC, SOL_PPPOL2TP, SOL_BLUETOOTH, SOL_PNPIPE, SOL_RDS, SOL_IUCV, SOL_CAIF, SOL_ALG, SOL_NFC, SOL_KCM + +# This sockaddr type corresponds to the struct sockaddr and is 16 bytes or less. +sockaddr [ +# AF_UNIX sockaddr in bigger than 16 bytes + in sockaddr_in + ax25 sockaddr_ax25 + ipx sockaddr_ipx +# TODO: AF_APPLETALK +# AF_NETROM sockaddr is the same as AF_AX25 +# TODO: AF_BRIDGE +# TODO: AF_ATMPVC +# TODO: AF_X25 +# AF_INET6 sockaddr is bigger than 16 bytes +# TODO: AF_ROSE +# TODO: AF_DECnet + nl sockaddr_nl +# AF_PACKET sockaddr is bigger than 16 bytes +# TODO: AF_ATMSVC +# TODO: AF_RDS +# TODO: AF_IRDA +# TODO: AF_PPPOX + llc sockaddr_llc +# TODO: AF_IB +# TODO: AF_MPLS +# TODO: AF_CAN +# TODO: AF_TIPC + sco sockaddr_sco + l2 sockaddr_l2 + hci sockaddr_hci + rc sockaddr_rc +# TODO: AF_IUCV +# TODO: AF_RXRPC +# TODO: AF_ISDN +# TODO: AF_PHONET +# TODO: AF_IEEE802154 +# TODO: AF_CAIF +# AF_ALG sockaddr is bigger than 16 bytes + nfc sockaddr_nfc +# TODO: AF_VSOCK +# TODO: AF_QIPCRTR + ethernet sockaddr_ethernet + generic sockaddr_generic +] + +# This sockaddr type corresponds to the sockaddr_storage type and is 128 bytes size. +sockaddr_storage [ + un sockaddr_un + in sockaddr_in + ax25 sockaddr_ax25 + ipx sockaddr_ipx +# TODO: AF_APPLETALK +# AF_NETROM sockaddr is the same as AF_AX25 +# TODO: AF_BRIDGE +# TODO: AF_ATMPVC +# TODO: AF_X25 + in6 sockaddr_in6 +# TODO: AF_ROSE +# TODO: AF_DECnet + nl sockaddr_nl + ll sockaddr_ll +# TODO: AF_ATMSVC +# TODO: AF_RDS +# TODO: AF_IRDA +# TODO: AF_PPPOX + llc sockaddr_llc +# TODO: AF_IB +# TODO: AF_MPLS +# TODO: AF_CAN +# TODO: AF_TIPC + sco sockaddr_sco + l2 sockaddr_l2 + hci sockaddr_hci + rc sockaddr_rc +# TODO: AF_IUCV +# TODO: AF_RXRPC +# TODO: AF_ISDN +# TODO: AF_PHONET +# TODO: AF_IEEE802154 +# TODO: AF_CAIF + alg sockaddr_alg + nfc sockaddr_nfc + nfc_llcp sockaddr_nfc_llcp +# TODO: AF_VSOCK +# TODO: AF_QIPCRTR + ethernet sockaddr_ethernet + generic sockaddr_storage_generic +] [varlen] + +sockaddr_generic { + sa_family flags[socket_domain, int16] + sa_data array[int8, 14] +} + +sockaddr_storage_generic { + sa_family flags[socket_domain, int16] + sa_data array[int8, 126] +} + +send_msghdr { + msg_name ptr[in, sockaddr_storage, opt] + msg_namelen len[msg_name, int32] + msg_iov ptr[in, array[iovec_in]] + msg_iovlen len[msg_iov, intptr] + msg_control ptr[in, array[cmsghdr]] + msg_controllen len[msg_control, intptr] + msg_flags flags[send_flags, int32] +} + +send_mmsghdr { + msg_hdr send_msghdr + msg_len int32 +} + +recv_msghdr { + msg_name ptr[out, sockaddr_storage, opt] + msg_namelen len[msg_name, int32] + msg_iov ptr[in, array[iovec_out]] + msg_iovlen len[msg_iov, intptr] + msg_control buffer[out] + msg_controllen len[msg_control, intptr] + msg_flags int32 +} + +recv_mmsghdr { + msg_hdr recv_msghdr + msg_len int32 +} + +cmsghdr { + cmsg_len len[parent, intptr] + cmsg_level flags[cmsg_levels, int32] + cmsg_type int32 + data array[int8] +} [align_ptr] + +# Socket options + +# http://lxr.free-electrons.com/source/include/uapi/asm-generic/socket.h + +setsockopt$sock_void(fd sock, level const[SOL_SOCKET], optname flags[sockopt_opt_sock_void], optval const[0], optlen const[0]) +getsockopt$sock_int(fd sock, level const[SOL_SOCKET], optname flags[sockopt_opt_sock_int], optval ptr[out, int32], optlen ptr[inout, len[optval, int32]]) +setsockopt$sock_int(fd sock, level const[SOL_SOCKET], optname flags[sockopt_opt_sock_int], optval ptr[in, int32], optlen len[optval]) +setsockopt$sock_str(fd sock, level const[SOL_SOCKET], optname const[SO_BINDTODEVICE], optval ptr[in, string], optlen len[optval]) +getsockopt$sock_linger(fd sock, level const[SOL_SOCKET], optname const[SO_LINGER], optval ptr[out, linger], optlen ptr[inout, len[optval, int32]]) +setsockopt$sock_linger(fd sock, level const[SOL_SOCKET], optname const[SO_LINGER], optval ptr[in, linger], optlen len[optval]) +getsockopt$sock_cred(fd sock, level const[SOL_SOCKET], optname const[SO_PEERCRED], optval ptr[out, ucred], optlen ptr[inout, len[optval, int32]]) +setsockopt$sock_cred(fd sock, level const[SOL_SOCKET], optname const[SO_PEERCRED], optval ptr[in, ucred], optlen len[optval]) +getsockopt$sock_timeval(fd sock, level const[SOL_SOCKET], optname flags[sockopt_opt_sock_timeval], optval ptr[out, timeval], optlen ptr[inout, len[optval, int32]]) +setsockopt$sock_timeval(fd sock, level const[SOL_SOCKET], optname flags[sockopt_opt_sock_timeval], optval ptr[in, timeval], optlen len[optval]) +setsockopt$sock_attach_bpf(fd sock, level const[SOL_SOCKET], optname const[SO_ATTACH_BPF], optval ptr[in, fd_bpf_prog], optlen len[optval]) +setsockopt$SO_TIMESTAMPING(fd sock, level const[SOL_SOCKET], optname const[SO_TIMESTAMPING], optval ptr[in, flags[sockopt_so_timestamping, int32]], optlen len[optval]) +getsockopt$SO_TIMESTAMPING(fd sock, level const[SOL_SOCKET], optname const[SO_TIMESTAMPING], optval ptr[out, int32], optlen ptr[inout, len[optval, int32]]) +setsockopt$SO_ATTACH_FILTER(fd sock, level const[SOL_SOCKET], optname const[SO_ATTACH_FILTER], optval ptr[in, sock_fprog], optlen len[optval]) +setsockopt$SO_BINDTODEVICE(fd sock, level const[SOL_SOCKET], optname const[SO_BINDTODEVICE], optval ptr[in, devname], optlen len[optval]) +getsockopt$SO_BINDTODEVICE(fd sock, level const[SOL_SOCKET], optname const[SO_BINDTODEVICE], optval ptr[out, devname], optlen len[optval]) +getsockopt$SO_PEERCRED(fd sock, level const[SOL_SOCKET], optname const[SO_PEERCRED], optval ptr[out, ucred], optlen len[optval]) +getsockopt$sock_buf(fd sock, level const[SOL_SOCKET], optname flags[sockopt_opt_sock_buf], optval buffer[out], optlen ptr[inout, len[optval, int32]]) + +sockopt_opt_sock_void = SO_DETACH_FILTER, SO_MARK +sockopt_opt_sock_int = SO_ACCEPTCONN, SO_BROADCAST, SO_DEBUG, SO_DOMAIN, SO_ERROR, SO_DONTROUTE, SO_KEEPALIVE, SO_PEEK_OFF, SO_PRIORITY, SO_PROTOCOL, SO_RCVBUF, SO_RCVBUFFORCE, SO_RCVLOWAT, SO_SNDLOWAT, SO_REUSEADDR, SO_SNDBUF, SO_SNDBUFFORCE, SO_TIMESTAMP, SO_TYPE, SO_REUSEPORT, SO_OOBINLINE, SO_NO_CHECK, SO_PASSCRED, SO_TIMESTAMPNS, SO_LOCK_FILTER, SO_PASSSEC, SO_RXQ_OVFL, SO_WIFI_STATUS, SO_NOFCS, SO_SELECT_ERR_QUEUE, SO_BUSY_POLL, SO_MAX_PACING_RATE +sockopt_opt_sock_timeval = SO_RCVTIMEO, SO_SNDTIMEO +sockopt_opt_sock_buf = SO_PEERNAME, SO_PEERSEC, SO_GET_FILTER +sockopt_so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE, SOF_TIMESTAMPING_TX_SOFTWARE, SOF_TIMESTAMPING_RX_HARDWARE, SOF_TIMESTAMPING_RX_SOFTWARE, SOF_TIMESTAMPING_SOFTWARE, SOF_TIMESTAMPING_SYS_HARDWARE, SOF_TIMESTAMPING_RAW_HARDWARE, SOF_TIMESTAMPING_OPT_ID, SOF_TIMESTAMPING_TX_SCHED, SOF_TIMESTAMPING_TX_ACK, SOF_TIMESTAMPING_OPT_CMSG, SOF_TIMESTAMPING_OPT_TSONLY + +# Socket ioctls + +# Since some socket ioctls are forwarded to the network device, adding device ioctls here as well. + +# http://lxr.free-electrons.com/source/include/uapi/linux/sockios.h + +# http://lxr.free-electrons.com/source/include/uapi/asm-generic/sockios.h + +# TODO: SIOCADDRT, SIOCDELRT, SIOCRTMSG + +ioctl$sock_SIOCETHTOOL(fd sock, cmd const[SIOCETHTOOL], arg ptr[inout, ifreq_SIOCETHTOOL]) + +# TODO: SIOCDRARP, SIOCGRARP, SIOCSRARP +# TODO: SIOCGIFVLAN, SIOCSIFVLAN +# TODO: SIOCGSTAMP, SIOCGSTAMPNS + +ioctl$sock_SIOCOUTQ(fd sock, cmd const[SIOCOUTQ], arg ptr[out, int32]) +ioctl$sock_SIOCINQ(fd sock, cmd const[SIOCINQ], arg ptr[out, int32]) + +ioctl$sock_SIOCGIFCONF(fd sock, cmd const[SIOCGIFNAME], arg ptr[inout, ifconf]) + +ifreq_ioctls = SIOCGIFNAME, SIOCSIFLINK, SIOCGIFFLAGS, SIOCSIFFLAGS, SIOCGIFADDR, SIOCSIFADDR, SIOCGIFDSTADDR, SIOCSIFDSTADDR, SIOCGIFBRDADDR, SIOCSIFBRDADDR, SIOCGIFNETMASK, SIOCSIFNETMASK, SIOCGIFMETRIC, SIOCSIFMETRIC, SIOCGIFMEM, SIOCSIFMEM, SIOCGIFMTU, SIOCSIFMTU, SIOCSIFNAME, SIOCSIFHWADDR, SIOCGIFENCAP, SIOCSIFENCAP, SIOCGIFHWADDR, SIOCGIFSLAVE, SIOCSIFSLAVE, SIOCADDMULTI, SIOCDELMULTI, SIOCGIFINDEX, SIOCSIFPFLAGS, SIOCGIFPFLAGS, SIOCDIFADDR, SIOCSIFHWBROADCAST, SIOCGIFCOUNT, SIOCGIFTXQLEN, SIOCSIFTXQLEN, SIOCETHTOOL, SIOCGMIIPHY, SIOCGMIIREG, SIOCSMIIREG, SIOCWANDEV, SIOCGIFMAP, SIOCSIFMAP, SIOCBONDENSLAVE, SIOCBONDRELEASE, SIOCBONDSETHWADDR, SIOCBONDSLAVEINFOQUERY, SIOCBONDINFOQUERY, SIOCBONDCHANGEACTIVE, SIOCBRADDIF, SIOCBRDELIF, SIOCSHWTSTAMP, SIOCGHWTSTAMP + +ioctl$sock_ifreq(fd sock, cmd flags[ifreq_ioctls], arg ptr[inout, ifreq]) + +ioctl$sock_SIOCGIFINDEX(fd sock, cmd const[SIOCGIFINDEX], arg ptr[inout, ifreq_SIOCGIFINDEX]) + +ioctl$sock_SIOCGIFBR(fd sock, cmd const[SIOCGIFBR], arg ptr[inout, brctl_arg]) +ioctl$sock_SIOCSIFBR(fd sock, cmd const[SIOCGIFBR], arg ptr[inout, brctl_arg]) + +ioctl$sock_SIOCOUTQNSD(fd sock, cmd const[SIOCOUTQNSD], arg ptr[out, int32]) + +ioctl$sock_SIOCGSKNS(fd sock, cmd const[SIOCGSKNS], arg ptr[inout, int32]) + +ioctl$sock_SIOCADDDLCI(fd sock, cmd const[SIOCADDDLCI], arg ptr[inout, dlci_add]) +ioctl$sock_SIOCDELDLCI(fd sock, cmd const[SIOCDELDLCI], arg ptr[in, dlci_add]) + +ioctl$sock_SIOCBRADDBR(fd sock, cmd const[SIOCBRADDBR], arg ptr[in, devname]) +ioctl$sock_SIOCBRDELBR(fd sock, cmd const[SIOCBRDELBR], arg ptr[in, devname]) + +define SIOCDEVPRIVATE_BEG (SIOCDEVPRIVATE) +define SIOCDEVPRIVATE_END (SIOCDEVPRIVATE + 15) + +define SIOCPROTOPRIVATE_BEG (SIOCPROTOPRIVATE) +define SIOCPROTOPRIVATE_END (SIOCPROTOPRIVATE + 15) + +ioctl$sock_netdev_private(fd sock, cmd int16[SIOCDEVPRIVATE_BEG:SIOCDEVPRIVATE_END], arg ptr[in, array[int8]]) +ioctl$sock_proto_private(fd sock, cmd int16[SIOCPROTOPRIVATE_BEG:SIOCPROTOPRIVATE_END], arg ptr[in, array[int8]]) + +ioctl$sock_FIOSETOWN(fd sock, cmd const[FIOSETOWN], arg ptr[in, pid]) +ioctl$sock_SIOCSPGRP(fd sock, cmd const[SIOCSPGRP], arg ptr[in, pid]) + +ioctl$sock_FIOGETOWN(fd sock, cmd const[FIOGETOWN], arg ptr[out, pid]) +ioctl$sock_SIOCGPGRP(fd sock, cmd const[SIOCGPGRP], arg ptr[out, pid]) + +resource ifindex[int32] + +ifreq_SIOCGIFINDEX { + ifr_ifrn devname + ifr_ifru ifindex + pad array[const[0, int8], 20] +} [packed] + +ifreq_SIOCETHTOOL { + ifr_ifrn devname + ifr_ifru ptr[inout, ethtool_cmd_u] + pad array[const[0, int8], 16] +} [packed] + +ifreq { + ifr_ifrn devname + ifr_ifru ifr_ifru +} + +syzn_devname { + s const[115, int8] + y const[121, int8] + z const[122, int8] + N proc[48, 1, int8] + z0 const[0, int8] +} + +# We could add "eth0" to this list as well, but this will affect the connection between fuzzer and manager and produce lots of "no output" crashes. +devnames = "lo", "tunl0", "gre0", "gretap0", "ip_vti0", "ip6_vti0", "sit0", "ip6tnl0", "ip6gre0", "bond0", "dummy0", "eql", "ifb0", "ipddp0", "yam0", "bcsf0", "bcsh0", "teql0", "nr0", "rose0", "irlan0", "bpq0" + +devname [ + generic array[int8, IFNAMSIZ] + common string[devnames, IFNAMSIZ] + syzn syzn_devname +] + +ifr_ifru [ + ifru_addrs sockaddr + ifru_flags flags[ifru_flags, int16] + ifru_ivalue int32 + ifru_mtu int32 + ifru_map ifmap + ifru_names devname + ifru_data ptr[in, array[int8, 32]] + ifru_settings if_settings +] + +ifru_flags = IFF_TUN, IFF_TAP, IFF_NO_PI, IFF_ONE_QUEUE, IFF_VNET_HDR, IFF_TUN_EXCL, IFF_MULTI_QUEUE, IFF_ATTACH_QUEUE, IFF_DETACH_QUEUE, IFF_PERSIST, IFF_NOFILTER + +ifmap { + mem_start int64 + mem_end int64 + base_addr int16 + irq int8 + dma int8 + port int8 +} + +if_settings { + type int32 + size int32 + ifs_ifsu ifs_ifsu +} + +ifs_ifsu [ + raw_hdlc ptr[in, raw_hdlc_proto] + cisco ptr[in, cisco_proto] + fr ptr[in, fr_proto] + fr_pvc ptr[in, fr_proto_pvc] + fr_pvc_info ptr[in, fr_proto_pvc_info] + sync ptr[in, sync_serial_settings] + te1 ptr[in, te1_settings] +] + +raw_hdlc_proto { + encode int16 + parity int16 +} + +cisco_proto { + val int32 + timeout int32 +} + +fr_proto { + t391 int32 + t392 int32 + n391 int32 + n392 int32 + n393 int32 + lmi int16 + dce int16 +} + +fr_proto_pvc { + dlcl int32 +} + +fr_proto_pvc_info { + dlci int32 + master devname +} + +sync_serial_settings { + rate int32 + type int32 + loop int16 +} + +te1_settings { + rate int32 + type int32 + loop int16 + slot int32 +} + +ifconf [ + buf ifconf_buf + req ifconf_req +] + +ifconf_buf { + ifc_len len[ifcu_buf, int32] + ifcu_buf ptr[inout, array[int8], opt] +} + +ifconf_req { + ifc_len len[ifcu_req, int32] + ifcu_req ptr[inout, ifreq, opt] +} + +brctl_cmds = BRCTL_GET_VERSION, BRCTL_GET_BRIDGES, BRCTL_ADD_BRIDGE, BRCTL_DEL_BRIDGE + +brctl_arg [ + get brctl_arg_get + add_del brctl_arg_add_del + generic brctl_arg_generic +] + +brctl_arg_get { + cmd const[BRCTL_GET_BRIDGES, int64] + buf ptr[out, array[int8]] + indices int64 +} + +brctl_arg_add_del { + cmd const[BRCTL_ADD_BRIDGE, int64] + devname ptr[in, devname] + pad int64 +} + +brctl_arg_generic { + a0 int64 + a1 int64 + a2 int64 +} + +dlci_add { + devname devname + dlci int16 +} + +# ETHTOOL declaration part +# http://elixir.free-electrons.com/linux/latest/source/include/uapi/linux/ethtool.h + +ethtool_cmd_flags = ETHTOOL_GSET, ETHTOOL_SSET, ETHTOOL_GDRVINFO, ETHTOOL_GREGS, ETHTOOL_GWOL, ETHTOOL_SWOL, ETHTOOL_GMSGLVL, ETHTOOL_SMSGLVL, ETHTOOL_NWAY_RST, ETHTOOL_GLINK, ETHTOOL_GEEPROM, ETHTOOL_SEEPROM, ETHTOOL_GCOALESCE, ETHTOOL_SCOALESCE, ETHTOOL_GRINGPARAM, ETHTOOL_SRINGPARAM, ETHTOOL_GPAUSEPARAM, ETHTOOL_SPAUSEPARAM, ETHTOOL_GRXCSUM, ETHTOOL_SRXCSUM, ETHTOOL_GTXCSUM, ETHTOOL_STXCSUM, ETHTOOL_GSG, ETHTOOL_SSG, ETHTOOL_TEST, ETHTOOL_GSTRINGS, ETHTOOL_PHYS_ID, ETHTOOL_GSTATS, ETHTOOL_GTSO, ETHTOOL_STSO, ETHTOOL_GPERMADDR, ETHTOOL_GUFO, ETHTOOL_SUFO, ETHTOOL_GGSO, ETHTOOL_SGSO, ETHTOOL_GFLAGS, ETHTOOL_SFLAGS, ETHTOOL_GPFLAGS, ETHTOOL_SPFLAGS, ETHTOOL_GRXFH, ETHTOOL_SRXFH, ETHTOOL_GGRO, ETHTOOL_SGRO, ETHTOOL_GRXRINGS, ETHTOOL_GRXCLSRLCNT, ETHTOOL_GRXCLSRULE, ETHTOOL_GRXCLSRLALL, ETHTOOL_SRXCLSRLDEL, ETHTOOL_SRXCLSRLINS, ETHTOOL_FLASHDEV, ETHTOOL_RESET, ETHTOOL_SRXNTUPLE, ETHTOOL_GRXNTUPLE, ETHTOOL_GSSET_INFO, ETHTOOL_GRXFHINDIR, ETHTOOL_SRXFHINDIR, ETHTOOL_GFEATURES, ETHTOOL_SFEATURES, ETHTOOL_GCHANNELS, ETHTOOL_SCHANNELS, ETHTOOL_SET_DUMP, ETHTOOL_GET_DUMP_FLAG, ETHTOOL_GET_DUMP_DATA, ETHTOOL_GET_TS_INFO, ETHTOOL_GMODULEINFO, ETHTOOL_GMODULEEEPROM, ETHTOOL_GEEE, ETHTOOL_SEEE, ETHTOOL_GRSSH, ETHTOOL_SRSSH, ETHTOOL_GTUNABLE, ETHTOOL_STUNABLE, ETHTOOL_GPHYSTATS, ETHTOOL_PERQUEUE, ETHTOOL_GLINKSETTINGS, ETHTOOL_SLINKSETTINGS, ETHTOOL_PHY_GTUNABLE, ETHTOOL_PHY_STUNABLE + +ethtool_cmd_u [ + ethtool_cmd ethtool_cmd + ethtool_drvinfo ethtool_drvinfo + ethtool_wolinfo ethtool_wolinfo + ethtool_regs ethtool_regs + ethtool_eeprom ethtool_eeprom + ethtool_eee ethtool_eee + ethtool_modinfo ethtool_modinfo + ethtool_coalesce ethtool_coalesce + ethtool_ringparam ethtool_ringparam + ethtool_channels ethtool_channels + ethtool_pauseparam ethtool_pauseparam + ethtool_gstrings ethtool_gstrings + ethtool_sset_info ethtool_sset_info + ethtool_test ethtool_test + ethtool_stats ethtool_stats + ethtool_perm_addr ethtool_perm_addr + ethtool_rxnfc ethtool_rxnfc + ethtool_rxfh_indir ethtool_rxfh_indir + ethtool_rxfh ethtool_rxfh + ethtool_rx_ntuple ethtool_rx_ntuple + ethtool_flash ethtool_flash + ethtool_dump ethtool_dump + ethtool_gfeatures ethtool_gfeatures + ethtool_sfeatures ethtool_sfeatures + ethtool_ts_info ethtool_ts_info + ethtool_per_queue_op ethtool_per_queue_op + ethtool_link_settings ethtool_link_settings +] [varlen] + +ethtool_cmd { + cmd flags[ethtool_cmd_flags, int32] + supported int32 + advertising int32 + speed int16 + duplex int8 + port int8 + phy_address int8 + transceiver int8 + autoneg int8 + mdio_support int8 + maxtxpkt int32 + maxrxpkt int32 + speed_hi int16 + eth_tp_mdix int8 + eth_tp_mdix_ctrl int8 + lp_advertising int32 + reserved array[int32, 2] +} + +ethtool_drvinfo { + cmd const[ETHTOOL_GDRVINFO, int32] + driver array[int8, 32] + version array[int8, 32] + fw_version array[int8, ETHTOOL_FWVERS_LEN] + bus_info array[int8, ETHTOOL_BUSINFO_LEN] + erom_version array[int8, ETHTOOL_EROMVERS_LEN] + reserved2 array[int8, 12] + n_priv_flags int32 + n_stats int32 + testinfo_len int32 + eedump_len int32 + regdump_len int32 +} + +ethtool_wolinfo_cmd_flags = ETHTOOL_GWOL, ETHTOOL_SWOL + +ethtool_wolinfo { + cmd flags[ethtool_wolinfo_cmd_flags, int32] + supported int32 + wolopts int32 + sopass array[int8, SOPASS_MAX] +} + +ethtool_regs { + cmd const[ETHTOOL_GREGS, int32] + version int32 + len len[data, int32] + data array[int8] +} + +ethtool_eeprom_cmd_flags = ETHTOOL_GEEPROM, ETHTOOL_GMODULEEEPROM, ETHTOOL_SEEPROM + +ethtool_eeprom { + cmd flags[ethtool_eeprom_cmd_flags, int32] + magic int32 + offset int32 + len len[data, int32] + data array[int8] +} + +ethtool_eee_cmd_flags = ETHTOOL_GEEE, ETHTOOL_SEEE + +ethtool_eee { + cmd flags[ethtool_eee_cmd_flags, int32] + supported int32 + advertised int32 + lp_advertised int32 + eee_active int32 + eee_enabled int32 + tx_lpi_enabled int32 + tx_lpi_timer int32 + reserved array[int32, 2] +} + +ethtool_modinfo { + cmd const[ETHTOOL_GMODULEINFO, int32] + type int32 + eeprom_len int32 + reserved array[int8, 8] +} + +ethtool_coalesce_cmd_flags = ETHTOOL_GCOALESCE, ETHTOOL_SCOALESCE + +ethtool_coalesce { + cmd flags[ethtool_coalesce_cmd_flags, int32] + rx_coalesce_usecs int32 + rx_max_coalesced_frames int32 + rx_coalesce_usecs_irq int32 + rx_max_coalesced_frames_irq int32 + tx_coalesce_usecs int32 + tx_max_coalesced_frames int32 + tx_coalesce_usecs_irq int32 + tx_max_coalesced_frames_irq int32 + stats_block_coalesce_usecs int32 + use_adaptive_rx_coalesce int32 + use_adaptive_tx_coalesce int32 + pkt_rate_low int32 + rx_coalesce_usecs_low int32 + rx_max_coalesced_frames_low int32 + tx_coalesce_usecs_low int32 + tx_max_coalesced_frames_low int32 + pkt_rate_high int32 + rx_coalesce_usecs_high int32 + rx_max_coalesced_frames_high int32 + tx_coalesce_usecs_high int32 + tx_max_coalesced_frames_high int32 + rate_sample_interval int32 +} + +ethtool_ringparam_cmd_flags = ETHTOOL_GRINGPARAM, ETHTOOL_SRINGPARAM + +ethtool_ringparam { + cmd flags[ethtool_ringparam_cmd_flags, int32] + rx_max_pending int32 + rx_mini_max_pending int32 + rx_jumbo_max_pending int32 + tx_max_pending int32 + rx_pending int32 + rx_mini_pending int32 + rx_jumbo_pending int32 + tx_pending int32 +} + +ethtool_channels_cmd_flags = ETHTOOL_GCHANNELS, ETHTOOL_SCHANNELS + +ethtool_channels { + cmd flags[ethtool_channels_cmd_flags, int32] + max_rx int32 + max_tx int32 + max_other int32 + max_combined int32 + rx_count int32 + tx_count int32 + other_count int32 + combined_count int32 +} + +ethtool_pauseparam_cmd_flags = ETHTOOL_GPAUSEPARAM, ETHTOOL_SPAUSEPARAM + +ethtool_pauseparam { + cmd flags[ethtool_pauseparam_cmd_flags, int32] + autoneg int32 + rx_pause int32 + tx_pause int32 +} + +ethtool_gstrings { + cmd const[ETHTOOL_GSTRINGS, int32] + string_set int32 + len len[data, int32] + data array[int8] +} + +ethtool_sset_info { + cmd const[ETHTOOL_GSSET_INFO, int32] + reserved int32 + sset_mask int64 + data array[int32] +} + +ethtool_test { + cmd const[ETHTOOL_TEST, int32] + flags int32 + reserved int32 + len len[data, int32] + data array[int64] +} + +ethtool_stats { + cmd const[ETHTOOL_GSTATS, int32] + n_stats len[data, int32] + data array[int64] +} + +ethtool_perm_addr { + cmd const[ETHTOOL_GPERMADDR, int32] + size len[data, int32] + data array[int8] +} + +# http://elixir.free-electrons.com/linux/latest/source/include/uapi/linux/ethtool.h#L1565 +traffic_flow_types = TCP_V4_FLOW, UDP_V4_FLOW, SCTP_V4_FLOW, AH_ESP_V4_FLOW, TCP_V6_FLOW, UDP_V6_FLOW, SCTP_V6_FLOW, AH_ESP_V6_FLOW, AH_V4_FLOW, ESP_V4_FLOW, AH_V6_FLOW, ESP_V6_FLOW, IPV4_USER_FLOW, IP_USER_FLOW, IPV6_USER_FLOW, IPV4_FLOW, IPV6_FLOW, ETHER_FLOW + +ethtool_rxnfc_cmd_flags = ETHTOOL_GRXFH, ETHTOOL_SRXFH, ETHTOOL_GRXRINGS, ETHTOOL_GRXCLSRLCNT, ETHTOOL_GRXCLSRULE, ETHTOOL_GRXCLSRLALL, ETHTOOL_SRXCLSRLDEL, ETHTOOL_SRXCLSRLINS + +ethtool_rxnfc { + cmd flags[ethtool_rxnfc_cmd_flags, int32] + flow_type flags[traffic_flow_types, int32] + data int64 + fs ethtool_rx_flow_spec + rule_cnt len[rule_locs, int32] + rule_locs array[int32] +} + +ethtool_rx_flow_spec { + flow_type flags[traffic_flow_types, int32] + h_u ethtool_flow_union + h_ext ethtool_flow_ext + m_u ethtool_flow_union + m_ext ethtool_flow_ext + ring_cookie int64 + location int32 +} + +ethtool_flow_union [ + tcp_ip4_spec ethtool_tcpip4_spec + udp_ip4_spec ethtool_tcpip4_spec + sctp_ip4_spec ethtool_tcpip4_spec + ah_ip4_spec ethtool_ah_espip4_spec + esp_ip4_spec ethtool_ah_espip4_spec + usr_ip4_spec ethtool_usrip4_spec + tcp_ip6_spec ethtool_tcpip6_spec + udp_ip6_spec ethtool_tcpip6_spec + sctp_ip6_spec ethtool_tcpip6_spec + ah_ip6_spec ethtool_ah_espip6_spec + esp_ip6_spec ethtool_ah_espip6_spec + usr_ip6_spec ethtool_usrip6_spec + ether_spec ethhdr + hdata array[int8, 52] +] + +ethtool_flow_ext { + padding array[int8, 2] + h_dest mac_addr + vlan_etype int16be + vlan_tci int16be + data array[int32be, 2] +} + +ethtool_tcpip4_spec { + ip4src ipv4_addr + ip4dst ipv4_addr + psrc proc[20000, 4, int16be] + pdst proc[20000, 4, int16be] + tos int8 +} + +ethtool_ah_espip4_spec { + ip4src ipv4_addr + ip4dst ipv4_addr + spi int32be + tos int8 +} + +ethtool_usrip4_spec { + ip4src ipv4_addr + ip4dst ipv4_addr + l4_4_bytes int32be + tos int8 + ip_ver const[ETH_RX_NFC_IP4, int8] + proto int8 +} + +ethtool_tcpip6_spec { + ip6src ipv6_addr + ip6dst ipv6_addr + psrc proc[20000, 4, int16be] + pdst proc[20000, 4, int16be] + tclass int8 +} + +ethtool_ah_espip6_spec { + ip6src ipv6_addr + ip6dst ipv6_addr + spi int32be + tclass int8 +} + +ethtool_usrip6_spec { + ip6src ipv6_addr + ip6dst ipv6_addr + l4_4_bytes int32be + tclass int8 + l4_proto int8 +} + +ethhdr { + h_dest mac_addr + h_source mac_addr + h_proto int16be +} [packed] + +ethtool_rxfh_indir_flags = ETHTOOL_GRXFHINDIR, ETHTOOL_SRXFHINDIR + +ethtool_rxfh_indir { + cmd flags[ethtool_rxfh_indir_flags, int32] + size len[ring_index, int32] + ring_index array[int32] +} + +ethtool_rxfh_cmd_flags = ETHTOOL_GRSSH, ETHTOOL_SRSSH + +ethtool_rxfh { + cmd flags[ethtool_rxfh_cmd_flags, int32] + rss_context int32 + indir_size int32 + key_size int32 + hfunc int8 + rsvd8 array[int8, 3] + rsvd32 int32 + rss_config array[int32] +} + +ethtool_rx_ntuple { + cmd const[ETHTOOL_SRXNTUPLE, int32] + fs ethtool_rx_ntuple_flow_spec +} + +ethtool_rx_ntuple_flow_spec_action_flags = ETHTOOL_RXNTUPLE_ACTION_DROP, ETHTOOL_RXNTUPLE_ACTION_CLEAR + +ethtool_rx_ntuple_flow_spec { + flow_type flags[traffic_flow_types, int32] + h_u ethtool_rx_ntuple_flow_spec_union + m_u ethtool_rx_ntuple_flow_spec_union + vlan_tag int16 + vlan_tag_mask int16 + data int64 + data_mask int64 + action flags[ethtool_rx_ntuple_flow_spec_action_flags, int32] +} + +ethtool_rx_ntuple_flow_spec_union [ + tcp_ip4_spec ethtool_tcpip4_spec + udp_ip4_spec ethtool_tcpip4_spec + sctp_ip4_spec ethtool_tcpip4_spec + ah_ip4_spec ethtool_ah_espip4_spec + esp_ip4_spec ethtool_ah_espip4_spec + usr_ip4_spec ethtool_usrip4_spec + ether_spec ethhdr + hdata array[int8, 72] +] + +ethtool_flash { + cmd const[ETHTOOL_FLASHDEV, int32] + region int32 + data array[int8, ETHTOOL_FLASH_MAX_FILENAME] +} + +ethtool_dump_cmd_flags = ETHTOOL_GET_DUMP_FLAG, ETHTOOL_GET_DUMP_DATA, ETHTOOL_SET_DUMP + +ethtool_dump { + cmd flags[ethtool_dump_cmd_flags, int32] + version int32 + flag int32 + len len[data, int32] + data array[int8] +} + +ethtool_gfeatures { + cmd const[ETHTOOL_GFEATURES, int32] + size len[features, int32] + features array[ethtool_get_features_block] +} + +ethtool_get_features_block { + available int32 + requested int32 + active int32 + never_changed int32 +} + +ethtool_sfeatures { + cmd const[ETHTOOL_SFEATURES, int32] + size len[features, int32] + features array[ethtool_set_features_block] +} + +ethtool_set_features_block { + valid int32 + requested int32 +} + +ethtool_ts_info { + cmd const[ETHTOOL_GET_TS_INFO, int32] + so_timestamping int32 + phc_index int32 + tx_types int32 + tx_reserved array[int32, 3] + rx_filters int32 + rx_reserved array[int32, 3] +} + +ethtool_per_queue_op { + cmd const[ETHTOOL_PERQUEUE, int32] + sub_command int32 + queue_mask array[int32, MAX_NUM_QUEUE] + data array[int8] +} + +ethtool_link_settings_cmd_flags = ETHTOOL_GLINKSETTINGS, ETHTOOL_SLINKSETTINGS + +ethtool_link_settings { + cmd flags[ethtool_link_settings_cmd_flags, int32] + speed int32 + duplex int8 + port int8 + phy_address int8 + autoneg int8 + mdio_support int8 + eth_tp_mdix int8 + eth_tp_mdix_ctrl int8 + link_mode_masks_nwords int8 + reserved array[int32, 8] + link_mode_masks array[int32] +} -- cgit mrf-deployment