aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/socket_netlink.txt
blob: 195b459365251bac7e11e0dd49020963dbd39daf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# 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 <linux/net.h>
include <uapi/linux/netlink.h>
include <uapi/linux/rtnetlink.h>

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