# 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_INET and AF_INET6: ICMP support

include <linux/icmp.h>
include <linux/icmpv6.h>

resource sock_icmp[sock_in]

socket$inet_icmp(domain const[AF_INET], type const[SOCK_DGRAM], proto const[IPPROTO_ICMP]) sock_icmp
socket$inet_icmp_raw(domain const[AF_INET], type const[SOCK_RAW], proto const[IPPROTO_ICMP]) sock_icmp
socketpair$inet_icmp(domain const[AF_INET], type const[SOCK_DGRAM], proto const[IPPROTO_ICMP], fds ptr[out, icmp_pair])
socketpair$inet_icmp_raw(domain const[AF_INET], type const[SOCK_RAW], proto const[IPPROTO_ICMP], fds ptr[out, icmp_pair])

icmp_pair {
	f0	sock_icmp
	f1	sock_icmp
}

resource sock_icmp6[sock_in6]

socket$inet6_icmp(domain const[AF_INET6], type const[SOCK_DGRAM], proto const[IPPROTO_ICMPV6]) sock_icmp6
socket$inet6_icmp_raw(domain const[AF_INET6], type const[SOCK_RAW], proto const[IPPROTO_ICMPV6]) sock_icmp6
socketpair$inet6_icmp(domain const[AF_INET6], type const[SOCK_DGRAM], proto const[IPPROTO_ICMPV6], fds ptr[out, icmp6_pair])
socketpair$inet6_icmp_raw(domain const[AF_INET6], type const[SOCK_RAW], proto const[IPPROTO_ICMPV6], fds ptr[out, icmp6_pair])

icmp6_pair {
	f0	sock_icmp6
	f1	sock_icmp6
}

setsockopt$inet_icmp_ICMP_FILTER(fd sock_icmp, level const[IPPROTO_ICMP], optname const[ICMP_FILTER], optval ptr[in, icmp_filter], optlen len[optval])
setsockopt$inet6_icmp_ICMP_FILTER(fd sock_icmp6, level const[IPPROTO_ICMP], optname const[ICMP_FILTER], optval ptr[in, icmp_filter], optlen len[optval])

icmp_filter {
	data	int32
}