| # 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 <asm/ioctls.h> |
| include <linux/if_tun.h> |
| include <linux/if_bridge.h> |
| include <linux/net.h> |
| include <linux/net_tstamp.h> |
| include <linux/route.h> |
| include <linux/socket.h> |
| include <uapi/linux/in.h> |
| include <uapi/linux/ethtool.h> |
| include <uapi/linux/if_ether.h> |
| |
| 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, MSG_ZEROCOPY |
| 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], opt] |
| msg_controllen bytesize[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 ptr[out, array[int8], opt] |
| msg_controllen bytesize[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]]) |
| getsockopt$SO_COOKIE(fd sock, level const[SOL_SOCKET], optname const[SO_COOKIE], optval ptr[out, int64], 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, SO_ZEROCOPY |
| sockopt_opt_sock_timeval = SO_RCVTIMEO, SO_SNDTIMEO |
| sockopt_opt_sock_buf = SO_PEERNAME, SO_PEERSEC, SO_GET_FILTER, SO_MEMINFO, SO_PEERGROUPS |
| 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] |
| } |