aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/ipvs.txt
blob: 1003ad02742f3c9c7f21002450653d5302b72a4a (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
148
149
150
151
152
153
154
155
156
157
158
# Copyright 2018 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.

# IP Virtual Server support.

include <linux/socket.h>
include <uapi/linux/fcntl.h>
include <uapi/linux/netlink.h>
include <uapi/linux/genetlink.h>
include <uapi/linux/ip_vs.h>

resource genl_ipvs_family_id[int16]
type msghdr_nl_ipvs[CMD] msghdr_netlink[netlink_msg_t[genl_ipvs_family_id, genlmsghdr_t[CMD], ip_vs_cmd_policy]]

syz_genetlink_get_family_id$ipvs(name ptr[in, string["IPVS"]]) genl_ipvs_family_id

sendmsg$IPVS_CMD_NEW_SERVICE(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_NEW_SERVICE]], f flags[send_flags])
sendmsg$IPVS_CMD_SET_SERVICE(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_SET_SERVICE]], f flags[send_flags])
sendmsg$IPVS_CMD_DEL_SERVICE(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_DEL_SERVICE]], f flags[send_flags])
sendmsg$IPVS_CMD_GET_SERVICE(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_GET_SERVICE]], f flags[send_flags])
sendmsg$IPVS_CMD_NEW_DEST(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_NEW_DEST]], f flags[send_flags])
sendmsg$IPVS_CMD_SET_DEST(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_SET_DEST]], f flags[send_flags])
sendmsg$IPVS_CMD_DEL_DEST(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_DEL_DEST]], f flags[send_flags])
sendmsg$IPVS_CMD_GET_DEST(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_GET_DEST]], f flags[send_flags])
sendmsg$IPVS_CMD_NEW_DAEMON(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_NEW_DAEMON]], f flags[send_flags])
sendmsg$IPVS_CMD_DEL_DAEMON(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_DEL_DAEMON]], f flags[send_flags])
sendmsg$IPVS_CMD_GET_DAEMON(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_GET_DAEMON]], f flags[send_flags])
sendmsg$IPVS_CMD_SET_CONFIG(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_SET_CONFIG]], f flags[send_flags])
sendmsg$IPVS_CMD_GET_CONFIG(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_GET_CONFIG]], f flags[send_flags])
sendmsg$IPVS_CMD_SET_INFO(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_SET_INFO]], f flags[send_flags])
sendmsg$IPVS_CMD_GET_INFO(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_GET_INFO]], f flags[send_flags])
sendmsg$IPVS_CMD_ZERO(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_ZERO]], f flags[send_flags])
sendmsg$IPVS_CMD_FLUSH(fd sock_nl_generic, msg ptr[in, msghdr_nl_ipvs[IPVS_CMD_FLUSH]], f flags[send_flags])

setsockopt$IP_VS_SO_SET_ADD(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_ADD], val ptr[in, ip_vs_service_user], len len[val])
setsockopt$IP_VS_SO_SET_EDIT(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_EDIT], val ptr[in, ip_vs_service_user], len len[val])
setsockopt$IP_VS_SO_SET_DEL(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_DEL], val ptr[in, ip_vs_service_user], len len[val])
setsockopt$IP_VS_SO_SET_FLUSH(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_FLUSH], val const[0], len const[0])
setsockopt$IP_VS_SO_SET_ADDDEST(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_ADDDEST], val ptr[in, ip_vs_svcdest_user], len len[val])
setsockopt$IP_VS_SO_SET_DELDEST(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_DELDEST], val ptr[in, ip_vs_svcdest_user], len len[val])
setsockopt$IP_VS_SO_SET_EDITDEST(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_EDITDEST], val ptr[in, ip_vs_svcdest_user], len len[val])
setsockopt$IP_VS_SO_SET_TIMEOUT(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_TIMEOUT], val ptr[in, ip_vs_timeout_user], len len[val])
setsockopt$IP_VS_SO_SET_STARTDAEMON(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_STARTDAEMON], val ptr[in, ip_vs_daemon_user], len len[val])
setsockopt$IP_VS_SO_SET_STOPDAEMON(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_STOPDAEMON], val ptr[in, ip_vs_daemon_user], len len[val])
setsockopt$IP_VS_SO_SET_ZERO(fd sock_in, level const[SOL_IP], opt const[IP_VS_SO_SET_ZERO], val ptr[in, ip_vs_service_user], len len[val])

getsockopt$IP_VS_SO_GET_VERSION(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_VERSION], val ptr[out, array[int8, 64]], len ptr[inout, len[val, int32]])
getsockopt$IP_VS_SO_GET_INFO(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_INFO], val ptr[out, array[int8, IP_VS_GETINFO_SIZE]], len ptr[inout, len[val, int32]])
getsockopt$IP_VS_SO_GET_SERVICES(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_SERVICES], val ptr[out, array[int8]], len ptr[inout, len[val, int32]])
getsockopt$IP_VS_SO_GET_SERVICE(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_SERVICE], val ptr[out, array[int8, IP_VS_SERVICE_ENTRY_SIZE]], len ptr[inout, len[val, int32]])
getsockopt$IP_VS_SO_GET_DESTS(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_DESTS], val ptr[out, array[int8]], len ptr[inout, len[val, int32]])
getsockopt$IP_VS_SO_GET_TIMEOUT(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_TIMEOUT], val ptr[out, array[int8, IP_VS_TIMEOUT_SIZE]], len ptr[inout, len[val, int32]])
getsockopt$IP_VS_SO_GET_DAEMON(fd sock, level const[SOL_IP], opt const[IP_VS_SO_GET_DAEMON], val ptr[out, array[int8, IP_VS_DAEMON_SIZE]], len ptr[inout, len[val, int32]])

ip_vs_cmd_policy [
	IPVS_CMD_ATTR_SERVICE		nlattr[IPVS_CMD_ATTR_SERVICE, array[ip_vs_svc_policy]]
	IPVS_CMD_ATTR_DEST		nlattr[IPVS_CMD_ATTR_DEST, array[ip_vs_dest_policy]]
	IPVS_CMD_ATTR_DAEMON		nlattr[IPVS_CMD_ATTR_DAEMON, array[ip_vs_daemon_policy]]
	IPVS_CMD_ATTR_TIMEOUT_TCP	nlattr[IPVS_CMD_ATTR_TIMEOUT_TCP, int32]
	IPVS_CMD_ATTR_TIMEOUT_TCP_FIN	nlattr[IPVS_CMD_ATTR_TIMEOUT_TCP_FIN, int32]
	IPVS_CMD_ATTR_TIMEOUT_UDP	nlattr[IPVS_CMD_ATTR_TIMEOUT_UDP, int32]
] [varlen]

ip_vs_svc_policy [
	IPVS_SVC_ATTR_AF		nlattr[IPVS_SVC_ATTR_AF, flags[ip_vs_af, int16]]
	IPVS_SVC_ATTR_PROTOCOL		nlattr[IPVS_SVC_ATTR_PROTOCOL, flags[ipv6_types, int16]]
	IPVS_SVC_ATTR_ADDR		nlattr[IPVS_SVC_ATTR_ADDR, nf_inet_addr]
	IPVS_SVC_ATTR_PORT		nlattr[IPVS_SVC_ATTR_PORT, sock_port]
	IPVS_SVC_ATTR_FWMARK		nlattr[IPVS_SVC_ATTR_FWMARK, int32[0:4]]
	IPVS_SVC_ATTR_SCHED_NAME	nlattr[IPVS_SVC_ATTR_SCHED_NAME, string[ipvs_sched_names]]
	IPVS_SVC_ATTR_PE_NAME		nlattr[IPVS_SVC_ATTR_PE_NAME, string[ipvs_pe_names]]
	IPVS_SVC_ATTR_FLAGS		nlattr[IPVS_SVC_ATTR_FLAGS, ip_vs_flags]
	IPVS_SVC_ATTR_TIMEOUT		nlattr[IPVS_SVC_ATTR_TIMEOUT, int32]
	IPVS_SVC_ATTR_NETMASK		nlattr[IPVS_SVC_ATTR_NETMASK, int32[0:128]]
] [varlen]

ip_vs_daemon_policy [
	IPVS_DAEMON_ATTR_STATE		nlattr[IPVS_DAEMON_ATTR_STATE, flags[ipvs_daemon_states, int32]]
	IPVS_DAEMON_ATTR_MCAST_IFN	nlattr[IPVS_DAEMON_ATTR_MCAST_IFN, devname]
	IPVS_DAEMON_ATTR_SYNC_ID	nlattr[IPVS_DAEMON_ATTR_SYNC_ID, int32[0:4]]
	IPVS_DAEMON_ATTR_SYNC_MAXLEN	nlattr[IPVS_DAEMON_ATTR_SYNC_MAXLEN, int16]
	IPVS_DAEMON_ATTR_MCAST_GROUP	nlattr[IPVS_DAEMON_ATTR_MCAST_GROUP, ipv4_addr]
	IPVS_DAEMON_ATTR_MCAST_GROUP6	nlattr[IPVS_DAEMON_ATTR_MCAST_GROUP6, ipv6_addr]
	IPVS_DAEMON_ATTR_MCAST_PORT	nlattr[IPVS_DAEMON_ATTR_MCAST_PORT, sock_port]
	IPVS_DAEMON_ATTR_MCAST_TTL	nlattr[IPVS_DAEMON_ATTR_MCAST_TTL, int8]
] [varlen]

ip_vs_dest_policy [
	IPVS_DEST_ATTR_ADDR		nlattr[IPVS_DEST_ATTR_ADDR, nf_inet_addr]
	IPVS_DEST_ATTR_PORT		nlattr[IPVS_DEST_ATTR_PORT, sock_port]
	IPVS_DEST_ATTR_FWD_METHOD	nlattr[IPVS_DEST_ATTR_FWD_METHOD, flags[ipvs_fwd_methods, int16]]
	IPVS_DEST_ATTR_WEIGHT		nlattr[IPVS_DEST_ATTR_WEIGHT, int32]
	IPVS_DEST_ATTR_U_THRESH		nlattr[IPVS_DEST_ATTR_U_THRESH, int32]
	IPVS_DEST_ATTR_L_THRESH		nlattr[IPVS_DEST_ATTR_L_THRESH, int32]
	IPVS_DEST_ATTR_ACTIVE_CONNS	nlattr[IPVS_DEST_ATTR_ACTIVE_CONNS, int32]
	IPVS_DEST_ATTR_INACT_CONNS	nlattr[IPVS_DEST_ATTR_INACT_CONNS, int32]
	IPVS_DEST_ATTR_PERSIST_CONNS	nlattr[IPVS_DEST_ATTR_PERSIST_CONNS, int32]
	IPVS_DEST_ATTR_ADDR_FAMILY	nlattr[IPVS_DEST_ATTR_ADDR_FAMILY, flags[ip_vs_af, int16]]
] [varlen]

ip_vs_flags {
	flags	flags[ip_vs_flags, int32]
	mask	flags[ip_vs_flags, int32]
}

ip_vs_service_user {
	protocol	flags[ipv6_types, int16]
	addr		ipv4_addr
	port		sock_port
	fwmark		int32[0:4]
	sched_name	string[ipvs_sched_names, IP_VS_SCHEDNAME_MAXLEN]
	flags		flags[ip_vs_flags, int32]
	timeout		int32
	netmask		int32be[0:128]
}

ip_vs_dest_user {
	addr		ipv4_addr
	port		sock_port
	conn_flags	flags[ipvs_conn_flags, int32]
	weight		int32
	u_threshold	int32
	l_threshold	int32
}

ip_vs_svcdest_user {
	s	ip_vs_service_user
	d	ip_vs_dest_user
}

ip_vs_timeout_user {
	tcp_timeout	int32
	tcp_fin_timeout	int32
	udp_timeout	int32
}

ip_vs_daemon_user {
	state		flags[ipvs_daemon_states, int32]
	mcast_ifn	devname
	syncid		int32[0:4]
}

openat$ipvs(fd const[AT_FDCWD], file ptr[in, string[ipvs_proc_files]], flags const[O_RDWR], mode const[0]) fd

ipvs_proc_files = "/proc/sys/net/ipv4/vs/sync_qlen_max", "/proc/sys/net/ipv4/vs/sync_refresh_period", "/proc/sys/net/ipv4/vs/sync_retries", "/proc/sys/net/ipv4/vs/sync_sock_size", "/proc/sys/net/ipv4/vs/sync_threshold", "/proc/sys/net/ipv4/vs/sync_version", "/proc/sys/net/ipv4/vs/am_droprate", "/proc/sys/net/ipv4/vs/amemthresh", "/proc/sys/net/ipv4/vs/backup_only", "/proc/sys/net/ipv4/vs/cache_bypass", "/proc/sys/net/ipv4/vs/conn_reuse_mode", "/proc/sys/net/ipv4/vs/conntrack", "/proc/sys/net/ipv4/vs/drop_entry", "/proc/sys/net/ipv4/vs/drop_packet", "/proc/sys/net/ipv4/vs/expire_nodest_conn", "/proc/sys/net/ipv4/vs/expire_quiescent_template", "/proc/sys/net/ipv4/vs/ignore_tunneled", "/proc/sys/net/ipv4/vs/lblc_expiration", "/proc/sys/net/ipv4/vs/lblcr_expiration", "/proc/sys/net/ipv4/vs/nat_icmp_send", "/proc/sys/net/ipv4/vs/pmtu_disc", "/proc/sys/net/ipv4/vs/schedule_icmp", "/proc/sys/net/ipv4/vs/secure_tcp", "/proc/sys/net/ipv4/vs/sloppy_sctp", "/proc/sys/net/ipv4/vs/sloppy_tcp", "/proc/sys/net/ipv4/vs/snat_reroute", "/proc/sys/net/ipv4/vs/sync_persist_mode", "/proc/sys/net/ipv4/vs/sync_ports"

ip_vs_af = AF_INET, AF_INET6
ipvs_sched_names = "none", "dh", "fo", "lblc", "lblcr", "lc", "nq", "ovf", "rr", "sed", "sh", "wlc", "wrr"
ipvs_pe_names = "sip"
ipvs_daemon_states = IP_VS_STATE_NONE, IP_VS_STATE_MASTER, IP_VS_STATE_BACKUP
ip_vs_flags = IP_VS_SVC_F_PERSISTENT, IP_VS_SVC_F_HASHED, IP_VS_SVC_F_ONEPACKET, IP_VS_SVC_F_SCHED1, IP_VS_SVC_F_SCHED2, IP_VS_SVC_F_SCHED3
ipvs_fwd_methods = IP_VS_CONN_F_MASQ, IP_VS_CONN_F_LOCALNODE, IP_VS_CONN_F_TUNNEL, IP_VS_CONN_F_DROUTE, IP_VS_CONN_F_BYPASS
ipvs_conn_flags = IP_VS_CONN_F_MASQ, IP_VS_CONN_F_LOCALNODE, IP_VS_CONN_F_TUNNEL, IP_VS_CONN_F_DROUTE, IP_VS_CONN_F_BYPASS, IP_VS_CONN_F_ONE_PACKET, IP_VS_CONN_F_NFCT

define IP_VS_GETINFO_SIZE	sizeof(struct ip_vs_getinfo)
define IP_VS_SERVICE_ENTRY_SIZE	sizeof(struct ip_vs_service_entry)
define IP_VS_TIMEOUT_SIZE	sizeof(struct ip_vs_timeout_user)
define IP_VS_DAEMON_SIZE	2 * sizeof(struct ip_vs_daemon_user)