1 /*
2  * Copyright (c) 2022 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 
16 #ifndef QOS_INTERFACE_H
17 #define QOS_INTERFACE_H
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /*
24  * generic
25  */
26 constexpr int SYSTEM_UID = 1000;
27 constexpr int ROOT_UID = 0;
28 constexpr int NR_QOS = 7;
29 constexpr unsigned int SET_RTG_ENABLE = 1;
30 constexpr unsigned int QOS_CTRL_IPC_MAGIC = 0xCC;
31 constexpr unsigned int AUTH_CTRL_IPC_MAGIC = 0xCD;
32 constexpr unsigned int RTG_SCHED_IPC_MAGIC = 0xAB;
33 
34 constexpr unsigned int AF_QOS_ALL = 0x0003;
35 constexpr unsigned int AF_QOS_DELEGATED = 0x0001;
36 
37 /*
38  * auth_ctrl
39  */
40 struct AuthCtrlData {
41     unsigned int pid;
42     unsigned int type;
43     unsigned int rtgUaFlag;
44     unsigned int qosUaFlag;
45     unsigned int status;
46 #ifdef QOS_EXT_ENABLE
47     bool enhanceStatus;
48 #endif
49 };
50 
51 enum class AuthManipulateType {
52     AUTH_ENABLE = 1,
53     AUTH_DELETE,
54     AUTH_GET,
55     AUTH_SWITCH,
56     AUTH_MAX_NR,
57 };
58 
59 enum class AuthStatus {
60     AUTH_STATUS_DEFAULT = 1,
61     AUTH_STATUS_SYSTEM_SERVER = 2,
62     AUTH_STATUS_FOREGROUND = 3,
63     AUTH_STATUS_BACKGROUND = 4,
64     AUTH_STATUS_FOCUS = 5,
65     AUTH_STATUS_DEAD,
66 };
67 
68 enum AuthCtrlCmdid {
69     BASIC_AUTH_CTRL = 1,
70 #ifdef QOS_EXT_ENABLE
71     ENHANCE_AUTH_CTRL = 2,
72 #endif
73     AUTH_CTRL_MAX_NR
74 };
75 
76 #define BASIC_AUTH_CTRL_OPERATION \
77     _IOWR(AUTH_CTRL_IPC_MAGIC, BASIC_AUTH_CTRL, struct AuthCtrlData)
78 
79 #ifdef QOS_EXT_ENABLE
80 #define ENHANCE_AUTH_CTRL_OPERATION \
81     _IOWR(AUTH_CTRL_IPC_MAGIC, ENHANCE_AUTH_CTRL, struct AuthCtrlData)
82 #endif
83 
84 /*
85  * qos ctrl
86  */
87 enum class QosManipulateType {
88     QOS_APPLY = 1,
89     QOS_LEAVE,
90     QOS_GET,
91     QOS_MAX_NR,
92 };
93 
94 struct QosCtrlData {
95     int pid;
96     unsigned int type;
97     unsigned int level;
98     int qos;
99 #ifdef QOS_EXT_ENABLE
100     int qos;
101     int staticQos;
102     int dynamicQos;
103     bool tagSchedEnable = true;
104 #endif
105 };
106 
107 struct QosPolicyData {
108     int nice;
109     int latencyNice;
110     int uclampMin;
111     int uclampMax;
112     int rtSchedPriority;
113     int policy;
114 };
115 
116 enum SchedPolicy {
117     SCHED_POLICY_OTHER = 0,
118     SCHED_POLICY_FIFO = 1,
119     SCHED_POLICY_RR = 2,
120     SCHED_POLICY_RT_EX = 0xFF,
121 };
122 
123 enum QosPolicyType {
124     QOS_POLICY_DEFAULT = 1,
125     QOS_POLICY_SYSTEM_SERVER = 2,
126     QOS_POLICY_FRONT = 3,
127     QOS_POLICY_BACK = 4,
128     QOS_POLICY_FOCUS = 5,
129     QOS_POLICY_MAX_NR,
130 };
131 
132 #define QOS_FLAG_NICE               0X01
133 #define QOS_FLAG_LATENCY_NICE       0X02
134 #define QOS_FLAG_UCLAMP             0x04
135 #define QOS_FLAG_RT                 0x08
136 
137 #define QOS_FLAG_ALL    (QOS_FLAG_NICE          | \
138             QOS_FLAG_LATENCY_NICE       | \
139             QOS_FLAG_UCLAMP     | \
140             QOS_FLAG_RT)
141 
142 #define SCHED_RESET_ON_FORK         0x40000000
143 
144 struct QosPolicyDatas {
145     int policyType;
146     unsigned int policyFlag;
147     struct QosPolicyData policys[NR_QOS];
148 };
149 
150 enum QosCtrlCmdid {
151     QOS_CTRL = 1,
152     QOS_POLICY = 2,
153     QOS_CTRL_MAX_NR
154 };
155 
156 #define QOS_CTRL_BASIC_OPERATION \
157     _IOWR(QOS_CTRL_IPC_MAGIC, QOS_CTRL, struct QosCtrlData)
158 #define QOS_CTRL_POLICY_OPERATION \
159     _IOWR(QOS_CTRL_IPC_MAGIC, QOS_POLICY, struct QosPolicyDatas)
160 
161 /*
162  * RTG
163  */
164 #define AF_RTG_ALL          0x1fff
165 #define AF_RTG_DELEGATED    0x1fff
166 
167 struct RtgEnableData {
168     int enable;
169     int len;
170     char *data;
171 };
172 
173 #define CMD_ID_SET_ENABLE \
174     _IOWR(RTG_SCHED_IPC_MAGIC, SET_RTG_ENABLE, struct RtgEnableData)
175 
176 /*
177  * interface
178  */
179 int EnableRtg(bool flag);
180 int AuthEnable(unsigned int pid, unsigned int uaFlag, unsigned int status);
181 int AuthPause(unsigned int pid);
182 int AuthDelete(unsigned int pid);
183 int AuthGet(unsigned int pid);
184 int AuthSwitch(unsigned int pid, unsigned int rtgFlag, unsigned int qosFlag, unsigned int status);
185 int AuthEnhance(unsigned int pid, bool enhanceStatus);
186 int QosApply(unsigned int level);
187 int QosApplyForOther(unsigned int level, int tid);
188 int QosLeave(void);
189 int QosLeaveForOther(int tid);
190 int QosPolicySet(const struct QosPolicyDatas *policyDatas);
191 int QosGet(int &level);
192 int QosGetForOther(int tid, int &level);
193 
194 #ifdef __cplusplus
195 }
196 #endif
197 #endif /* OQS_INTERFACE_H */
198