# 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. # AF_NETLINK support. include include include resource sock_netlink[sock] type netlink_seq proc[7388453, 8, int32] type netlink_port_id proc[635427835, 4, int32] socket$netlink(domain const[AF_NETLINK], type const[SOCK_RAW], proto flags[netlink_proto]) sock_netlink bind$netlink(fd sock_netlink, addr ptr[in, sockaddr_nl_proc], addrlen len[addr]) connect$netlink(fd sock_netlink, addr ptr[in, sockaddr_nl], addrlen len[addr]) getsockname$netlink(fd sock_netlink, addr ptr[out, sockaddr_nl_unspec], addrlen ptr[inout, len[addr, int32]]) getpeername$netlink(fd sock_netlink, peer ptr[out, sockaddr_nl_unspec], peerlen ptr[inout, len[peer, int32]]) sendmsg$netlink(fd sock_netlink, msg ptr[in, msghdr_netlink], f flags[send_flags]) setsockopt$netlink_NETLINK_ADD_MEMBERSHIP(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_ADD_MEMBERSHIP], arg ptr[in, int32[0:31]], arglen len[arg]) setsockopt$netlink_NETLINK_DROP_MEMBERSHIP(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_DROP_MEMBERSHIP], arg ptr[in, int32[0:31]], arglen len[arg]) setsockopt$netlink_NETLINK_PKTINFO(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_PKTINFO], arg ptr[in, int32], arglen len[arg]) setsockopt$netlink_NETLINK_BROADCAST_ERROR(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_BROADCAST_ERROR], arg ptr[in, int32], arglen len[arg]) setsockopt$netlink_NETLINK_NO_ENOBUFS(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_NO_ENOBUFS], arg ptr[in, int32], arglen len[arg]) setsockopt$netlink_NETLINK_RX_RING(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_RX_RING], arg ptr[in, nl_mmap_req], arglen len[arg]) setsockopt$netlink_NETLINK_TX_RING(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_TX_RING], arg ptr[in, nl_mmap_req], arglen len[arg]) setsockopt$netlink_NETLINK_LISTEN_ALL_NSID(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_LISTEN_ALL_NSID], arg ptr[in, int32], arglen len[arg]) setsockopt$netlink_NETLINK_CAP_ACK(fd sock_netlink, level const[SOL_NETLINK], opt const[NETLINK_CAP_ACK], arg ptr[in, int32], arglen len[arg]) getsockopt$netlink(fd sock_netlink, level const[SOL_NETLINK], opt flags[netlink_sockopts], arg buffer[out], arglen ptr[inout, len[arg, int32]]) netlink_family = AF_NETLINK, AF_UNSPEC, AF_INET, AF_INET6, AF_BRIDGE, AF_MPLS, AF_QIPCRTR, AF_PHONET, RTNL_FAMILY_IPMR, RTNL_FAMILY_IP6MR netlink_proto = NETLINK_ROUTE, NETLINK_UNUSED, NETLINK_USERSOCK, NETLINK_FIREWALL, NETLINK_SOCK_DIAG, NETLINK_NFLOG, NETLINK_XFRM, NETLINK_SELINUX, NETLINK_ISCSI, NETLINK_AUDIT, NETLINK_FIB_LOOKUP, NETLINK_CONNECTOR, NETLINK_NETFILTER, NETLINK_IP6_FW, NETLINK_DNRTMSG, NETLINK_KOBJECT_UEVENT, NETLINK_GENERIC, NETLINK_SCSITRANSPORT, NETLINK_ECRYPTFS, NETLINK_RDMA, NETLINK_CRYPTO, NETLINK_INET_DIAG, NETLINK_SMC netlink_sockopts = NETLINK_ADD_MEMBERSHIP, NETLINK_DROP_MEMBERSHIP, NETLINK_PKTINFO, NETLINK_BROADCAST_ERROR, NETLINK_NO_ENOBUFS, NETLINK_RX_RING, NETLINK_TX_RING, NETLINK_LISTEN_ALL_NSID, NETLINK_LIST_MEMBERSHIPS, NETLINK_CAP_ACK netlink_msg_flags = NLM_F_REQUEST, NLM_F_MULTI, NLM_F_ACK, NLM_F_ECHO, NLM_F_DUMP_INTR, NLM_F_DUMP_FILTERED, NLM_F_ROOT, NLM_F_MATCH, NLM_F_ATOMIC, NLM_F_DUMP, NLM_F_REPLACE, NLM_F_EXCL, NLM_F_CREATE, NLM_F_APPEND netlink_group_bitmap = 0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000 sockaddr_nl [ kern sockaddr_nl_kern proc sockaddr_nl_proc unspec sockaddr_nl_unspec ] sockaddr_nl_send [ kern sockaddr_nl_kern proc sockaddr_nl_proc ] sockaddr_nl_proc { nl_family const[AF_NETLINK, int16] nl_pad const[0, int16] nl_pid netlink_port_id nl_groups flags[netlink_group_bitmap, int32] } sockaddr_nl_kern { nl_family const[AF_NETLINK, int16] nl_pad const[0, int16] nl_pid const[0, int32] nl_groups flags[netlink_group_bitmap, int32] } sockaddr_nl_unspec { nl_family const[AF_UNSPEC, int16] nl_pad const[0, int16] nl_pid const[0, int32] nl_groups const[0, int32] } msghdr_netlink { addr ptr[in, sockaddr_nl_send, opt] addrlen len[addr, int32] vec ptr[in, array[iovec_nl]] vlen len[vec, intptr] ctrl ptr[in, array[cmsghdr_un], opt] ctrllen bytesize[ctrl, intptr] f flags[send_flags, int32] } iovec_nl { data ptr[in, array[netlink_msg]] len bytesize[data, intptr] } netlink_msg { len len[parent, int32] type int16[NLMSG_MIN_TYPE:NLMSG_MAX_TYPE] flags flags[netlink_msg_flags, int16] seq netlink_seq pid netlink_port_id # No body. Generic attribute can represent a random body. attrs array[nl_generic_attr] } [align_4] nl_generic_attr [ generic array[int8] flag nl_generic_attr_flag typed nl_generic_attr_typed nested nl_generic_attr_nested ] [varlen] nl_generic_attr_flag { nla_len len[parent, int16] # NL80211 has 150 attributes. nla_type int16[0:150] } [align_4] nl_generic_attr_typed { nla_len len[parent, int16] nla_type int16[0:150] data nl_generic_attr_data } [align_4] nl_generic_attr_data [ u32 int32 u64 int64 fd fd pid pid uid uid str string binary array[int8] ] [varlen] nl_generic_attr_nested { nla_len len[parent, int16] nla_type int16[0:150] data array[nl_generic_attr_nonested] } [align_4] nl_generic_attr_nonested [ generic array[int8] flag nl_generic_attr_flag typed nl_generic_attr_typed ] [varlen] nl_mmap_req { bsize int32 bnumber int32 fsize int32 fnumber int32 } # Some approximation for protocols for which we don't have precise descriptions. define NLMSG_MAX_TYPE NLMSG_MIN_TYPE + 50 # Removed (if __KERNEL__ defined) in next-20160229 (commit d1b4c689) define NETLINK_RX_RING 6 define NETLINK_TX_RING 7