# 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.

include <linux/net.h>
include <uapi/linux/tipc.h>
include <net/tipc/core.h>

resource sock_tipc[sock]

type tipc_instance int32[0:4]
type tipc_node_addr int32[0:4]
type tipc_port int32[20000:20004]

socket$tipc(domain const[AF_TIPC], type flags[tipc_socket_types], proto const[0]) sock_tipc
socketpair$tipc(domain const[AF_TIPC], type flags[tipc_socket_types], proto const[0], fds ptr[out, tipc_pair])
bind$tipc(fd sock_tipc, addr ptr[in, sockaddr_tipc, opt], addrlen len[addr])
connect$tipc(fd sock_tipc, addr ptr[in, sockaddr_tipc], addrlen len[addr])
accept4$tipc(fd sock_tipc, peer ptr[out, sockaddr_tipc, opt], peerlen ptr[inout, len[peer, int32]], flags flags[accept_flags]) sock_tipc
getsockname$tipc(fd sock_tipc, addr ptr[out, sockaddr_tipc], addrlen ptr[inout, len[addr, int32]])
getpeername$tipc(fd sock_tipc, peer ptr[out, sockaddr_tipc], peerlen ptr[inout, len[peer, int32]])
sendmsg$tipc(fd sock_tipc, msg ptr[in, msghdr_tipc], f flags[send_flags])

ioctl$SIOCGETLINKNAME(fd sock_tipc, cmd const[SIOCGETLINKNAME], arg ptr[in, tipc_sioc_ln_req])
ioctl$SIOCGETNODEID(fd sock_tipc, cmd const[SIOCGETNODEID], arg ptr[in, tipc_sioc_nodeid_req])

setsockopt$TIPC_IMPORTANCE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_IMPORTANCE], val ptr[in, int32], len bytesize[val])
setsockopt$TIPC_SRC_DROPPABLE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_SRC_DROPPABLE], val ptr[in, int32], len bytesize[val])
setsockopt$TIPC_DEST_DROPPABLE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_DEST_DROPPABLE], val ptr[in, int32], len bytesize[val])
setsockopt$TIPC_CONN_TIMEOUT(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_CONN_TIMEOUT], val ptr[in, int32], len bytesize[val])
setsockopt$TIPC_MCAST_BROADCAST(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_MCAST_BROADCAST])
setsockopt$TIPC_MCAST_REPLICAST(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_MCAST_REPLICAST])
setsockopt$TIPC_GROUP_LEAVE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_GROUP_LEAVE])
setsockopt$TIPC_GROUP_JOIN(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_GROUP_JOIN], val ptr[in, tipc_group_req], len bytesize[val])

getsockopt$TIPC_IMPORTANCE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_IMPORTANCE], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])
getsockopt$TIPC_SRC_DROPPABLE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_SRC_DROPPABLE], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])
getsockopt$TIPC_DEST_DROPPABLE(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_DEST_DROPPABLE], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])
getsockopt$TIPC_CONN_TIMEOUT(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_CONN_TIMEOUT], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])
getsockopt$TIPC_NODE_RECVQ_DEPTH(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_NODE_RECVQ_DEPTH], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])
getsockopt$TIPC_SOCK_RECVQ_DEPTH(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_SOCK_RECVQ_DEPTH], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])
getsockopt$TIPC_GROUP_JOIN(fd sock_tipc, level const[SOL_TIPC], opt const[TIPC_GROUP_JOIN], val ptr[out, int32], len ptr[inout, bytesize[val, int32]])

tipc_socket_types = SOCK_DGRAM, SOCK_SEQPACKET, SOCK_DGRAM
tipc_service_type = TIPC_NODE_STATE, TIPC_TOP_SRV, TIPC_LINK_STATE, TIPC_SERVICE_TYPE0, TIPC_SERVICE_TYPE1, TIPC_SERVICE_TYPE2, TIPC_SERVICE_TYPE3
define TIPC_SERVICE_TYPE0	TIPC_RESERVED_TYPES + 0
define TIPC_SERVICE_TYPE1	TIPC_RESERVED_TYPES + 1
define TIPC_SERVICE_TYPE2	TIPC_RESERVED_TYPES + 2
define TIPC_SERVICE_TYPE3	TIPC_RESERVED_TYPES + 3

tipc_pair {
	fd0	sock_tipc
	fd1	sock_tipc
}

sockaddr_tipc [
	nameseq	sockaddr_tipc_t[TIPC_ADDR_NAMESEQ, tipc_service_range]
	name	sockaddr_tipc_t[TIPC_ADDR_NAME, tipc_address_name]
	id	sockaddr_tipc_t[TIPC_ADDR_ID, tipc_socket_addr]
]

type sockaddr_tipc_t[TYP, DATA] {
	family		const[AF_TIPC, int16]
	addrtype	const[TYP, int8]
	scope		flags[tipc_scope, int8]
	addr		DATA
}

msghdr_tipc {
	msg_name	ptr[in, sockaddr_tipc, 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[int8], opt]
	msg_controllen	bytesize[msg_control, intptr]
	msg_flags	flags[send_flags, int32]
}

tipc_address_name {
	name	tipc_service_addr
	domain	tipc_node_addr
}

tipc_socket_addr {
	ref	tipc_port
	node	tipc_node_addr
}

tipc_service_addr {
	type		flags[tipc_service_type, int32]
	instance	tipc_instance
}

tipc_service_range {
	type	flags[tipc_service_type, int32]
	lower	tipc_instance
	upper	tipc_instance
}

tipc_sioc_ln_req {
	peer		tipc_node_addr
	bearer_id	int32[0:MAX_BEARERS]
	linkname	array[const[0, int8], TIPC_MAX_LINK_NAME]
}

tipc_sioc_nodeid_req {
	peer		tipc_node_addr
	linkname	array[const[0, int8], TIPC_NODEID_LEN]
}

tipc_group_req {
	type		int32[TIPC_SERVICE_TYPE0:TIPC_SERVICE_TYPE3]
	instance	tipc_instance
	scope		flags[tipc_scope, int32]
	flags		const[0, int32]
}
