policy_module(linuxptp, 1.0.0)


########################################
#
# Declarations
#

type timemaster_t;
type timemaster_exec_t;
init_daemon_domain(timemaster_t, timemaster_exec_t)

type timemaster_var_run_t;
files_pid_file(timemaster_var_run_t)

type timemaster_tmpfs_t;
files_tmpfs_file(timemaster_tmpfs_t)

type timemaster_unit_file_t;
systemd_unit_file(timemaster_unit_file_t)

type phc2sys_t;
type phc2sys_exec_t;
init_daemon_domain(phc2sys_t, phc2sys_exec_t)

type phc2sys_unit_file_t;
systemd_unit_file(phc2sys_unit_file_t)

type ptp4l_t;
type ptp4l_exec_t;
init_daemon_domain(ptp4l_t, ptp4l_exec_t)

type ptp4l_unit_file_t;
systemd_unit_file(ptp4l_unit_file_t)

########################################
#
# timemaster local policy
#

allow timemaster_t self:process { signal_perms setcap};
allow timemaster_t self:fifo_file rw_fifo_file_perms;
allow timemaster_t self:capability { setuid sys_time kill setgid };
allow timemaster_t self:unix_stream_socket create_stream_socket_perms;
allow timemaster_t self:shm create_shm_perms;
allow timemaster_t self:udp_socket create_socket_perms;

allow timemaster_t ptp4l_t:process signal;
allow timemaster_t phc2sys_t:process signal;

allow timemaster_t ptp4l_t:shm rw_shm_perms;

manage_dirs_pattern(timemaster_t, timemaster_var_run_t, timemaster_var_run_t)
manage_files_pattern(timemaster_t, timemaster_var_run_t, timemaster_var_run_t)
manage_sock_files_pattern(timemaster_t, timemaster_var_run_t, timemaster_var_run_t)
files_pid_filetrans(timemaster_t, timemaster_var_run_t, { dir file sock_file })

manage_dirs_pattern(timemaster_t, timemaster_tmpfs_t, timemaster_tmpfs_t)
manage_files_pattern(timemaster_t, timemaster_tmpfs_t, timemaster_tmpfs_t)
fs_tmpfs_filetrans(timemaster_t, timemaster_tmpfs_t, { dir file })

kernel_read_network_state(timemaster_t)

auth_use_nsswitch(timemaster_t)

corenet_udp_bind_generic_node(timemaster_t)
corenet_udp_bind_ntp_port(timemaster_t)

dev_read_urand(timemaster_t)

logging_send_syslog_msg(timemaster_t)

sysnet_read_config(timemaster_t)

optional_policy(`
	ntp_domtrans(timemaster_t)
    ntp_signal(timemaster_t)
')

optional_policy(`
	chronyd_domtrans(timemaster_t)
	chronyd_rw_shm(timemaster_t)
')

optional_policy(`
	gpsd_rw_shm(timemaster_t)
')


optional_policy(`
	chronyd_signal(timemaster_t)
')


optional_policy(`
	linuxptp_domtrans_ptp4l(timemaster_t)
')

optional_policy(`
	linuxptp_domtrans_phc2sys(timemaster_t)
')

########################################
#
# phc2sys local policy
#

allow phc2sys_t self:capability sys_time;
allow phc2sys_t self:fifo_file rw_fifo_file_perms;
allow phc2sys_t self:unix_stream_socket create_stream_socket_perms;
allow phc2sys_t self:shm create_shm_perms;
allow phc2sys_t self:udp_socket create_socket_perms;

allow phc2sys_t ptp4l_t:unix_dgram_socket sendto;

allow phc2sys_t timemaster_t:shm rw_shm_perms;

manage_dirs_pattern(phc2sys_t, timemaster_var_run_t, timemaster_var_run_t)
manage_files_pattern(phc2sys_t, timemaster_var_run_t, timemaster_var_run_t)
manage_sock_files_pattern(phc2sys_t, timemaster_var_run_t, timemaster_var_run_t)
files_pid_filetrans(phc2sys_t, timemaster_var_run_t, { dir file sock_file })

manage_dirs_pattern(phc2sys_t, timemaster_tmpfs_t, timemaster_tmpfs_t)
manage_files_pattern(phc2sys_t, timemaster_tmpfs_t, timemaster_tmpfs_t)
fs_tmpfs_filetrans(phc2sys_t, timemaster_tmpfs_t, { dir file })

dev_rw_realtime_clock(phc2sys_t)

logging_send_syslog_msg(phc2sys_t)

optional_policy(`
	chronyd_rw_shm(phc2sys_t)
')

optional_policy(`
	gpsd_rw_shm(phc2sys_t)
')

optional_policy(`
	ntp_rw_shm(phc2sys_t)
')

optional_policy(`
	ptp4l_rw_shm(phc2sys_t)
')

########################################
#
# ptp4l local policy
#

allow ptp4l_t self:fifo_file rw_fifo_file_perms;
allow ptp4l_t self:packet_socket create_socket_perms;
allow ptp4l_t self:unix_stream_socket create_stream_socket_perms;
allow ptp4l_t self:shm create_shm_perms;
allow ptp4l_t self:udp_socket create_socket_perms;
allow ptp4l_t self:capability { net_admin net_raw sys_time };
allow ptp4l_t self:capability2 { bpf wake_alarm };
allow ptp4l_t self:netlink_route_socket rw_netlink_socket_perms;

allow ptp4l_t phc2sys_t:unix_dgram_socket sendto;

manage_dirs_pattern(ptp4l_t, timemaster_var_run_t, timemaster_var_run_t)
manage_files_pattern(ptp4l_t, timemaster_var_run_t, timemaster_var_run_t)
manage_sock_files_pattern(ptp4l_t, timemaster_var_run_t, timemaster_var_run_t)
files_pid_filetrans(ptp4l_t, timemaster_var_run_t, { dir file sock_file })

manage_dirs_pattern(ptp4l_t, timemaster_tmpfs_t, timemaster_tmpfs_t)
manage_files_pattern(ptp4l_t, timemaster_tmpfs_t, timemaster_tmpfs_t)
fs_tmpfs_filetrans(ptp4l_t, timemaster_tmpfs_t, { dir file })

corenet_udp_bind_generic_node(ptp4l_t)
corenet_udp_bind_reserved_port(ptp4l_t)

kernel_read_network_state(ptp4l_t)

dev_rw_realtime_clock(ptp4l_t)

files_write_generic_pid_sockets(ptp4l_t)

logging_send_syslog_msg(ptp4l_t)

userdom_dgram_send(ptp4l_t)

optional_policy(`
	chronyd_rw_shm(ptp4l_t)
')

optional_policy(`
	gpsd_rw_shm(ptp4l_t)
')
