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