1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#include "qos_common.h"
16#include <cstdio>
17#include <cstdlib>
18#include <unistd.h>
19#include <sys/ioctl.h>
20#include <fcntl.h>
21#include "rme_log_domain.h"
22
23#undef LOG_TAG
24#define LOG_TAG "qos_manager"
25
26constexpr unsigned int AF_QOS_DELEGATED = 0x0001;
27
28namespace OHOS {
29namespace QosCommon {
30
31static int TrivalOpenAuthCtrlNode(void)
32{
33    char fileName[] = "/dev/auth_ctrl";
34    int fd = open(fileName, O_RDWR);
35    return fd;
36}
37
38int AuthEnable(int pid, unsigned int flag, unsigned int status)
39{
40    struct AuthCtrlData data;
41    int fd;
42    int ret;
43
44    fd = TrivalOpenAuthCtrlNode();
45    if (fd < 0) {
46        RME_LOGE("thread %{public}d belong to user %{public}d open auth node failed\n", gettid(), getuid());
47        return fd;
48    }
49
50    data.pid = pid;
51    data.rtgFlag = flag;
52    data.qosFlag = AF_QOS_DELEGATED;
53    data.status = status;
54    data.type = AUTH_ENABLE;
55
56    ret = ioctl(fd, BASIC_AUTH_CTRL_OPERATION, &data);
57    if (ret < 0) {
58        RME_LOGE("auth enable failed for pid %{public}d with status %{public}u\n", pid, status);
59    }
60    close(fd);
61    return ret;
62}
63
64int AuthPause(int pid)
65{
66    struct AuthCtrlData data;
67    int fd;
68    int ret;
69
70    fd = TrivalOpenAuthCtrlNode();
71    if (fd < 0) {
72        RME_LOGE("thread %{public}d belong to user %{public}d open auth node failed\n", gettid(), getuid());
73        return fd;
74    }
75
76    data.pid = pid;
77    data.rtgFlag = 0;
78    data.qosFlag = AF_QOS_DELEGATED;
79    data.status = AUTH_STATUS_BACKGROUND;
80    data.type = AUTH_SWITCH;
81
82    ret = ioctl(fd, BASIC_AUTH_CTRL_OPERATION, &data);
83    if (ret < 0) {
84        RME_LOGE("auth pause failed for pid %{public}d\n", pid);
85    }
86    close(fd);
87    return ret;
88}
89
90int AuthDelete(int pid)
91{
92    struct AuthCtrlData data;
93    int fd;
94    int ret;
95
96    fd = TrivalOpenAuthCtrlNode();
97    if (fd < 0) {
98        RME_LOGE("thread %{public}d belong to user %{public}d open auth node failed\n", gettid(), getuid());
99        return fd;
100    }
101
102    data.pid = pid;
103    data.type = AUTH_DELETE;
104
105    ret = ioctl(fd, BASIC_AUTH_CTRL_OPERATION, &data);
106    if (ret < 0) {
107        RME_LOGE("auth delete failed for pid %{public}d\n", pid);
108    }
109    close(fd);
110    return ret;
111}
112
113} // namespace QosCommon
114} // namespace OHOS