# Network utilities (radio process)
type netmgrd, domain;
type netmgrd_exec, exec_type, file_type;

# Started by init
init_daemon_domain(netmgrd)

permissive_or_unconfined(netmgrd)

# Starts as (root,radio) changes to (radio,radio)
allow netmgrd self:capability { setuid setgid net_admin net_raw };
dontaudit netmgrd self:capability fsetid;

# Support modprobe??
dontaudit netmgrd self:capability sys_module;

allow netmgrd self:udp_socket { create ioctl };
allow netmgrd self:netlink_socket create_socket_perms;
allow netmgrd self:netlink_route_socket { create_socket_perms nlmsg_write nlmsg_read };

# Talk to qmuxd (qmux_radio)
qmux_socket(netmgrd)

# Tries to access /data/data_test/ with toolbox. The data_test
# directory doesn't exist so deny access.
dontaudit netmgrd shell_exec:file rx_file_perms;
dontaudit netmgrd system_file:file execute_no_trans;

# Talk to init over the property socket
unix_socket_connect(netmgrd, property, init)
# Set net.rmnet0.* values
allow netmgrd radio_prop:property_service set;

# Access to /proc/sys/net/*
allow netmgrd proc_net:file write;
