REQUEST_GET_RESOURCE_TS,
REQUEST_GET_RESOURCE_LIST_JSON,
REQUEST_IS_RESOURCE_ATTR_SET,
+ REQUEST_SET_RESOURCE_FLAG,
REQUEST_MAX,
};
"REQUEST_GET_RESOURCE_TS",
"REQUEST_GET_RESOURCE_LIST_JSON",
"REQUEST_IS_RESOURCE_ATTR_SET",
+ "REQUEST_SET_RESOURCE_FLAG",
"REQUEST_MAX",
};
struct resource *create_resource(int resource_type);
void delete_resource(struct resource *resource);
+/* Set flag of the resource to given flag mask */
+int set_resource_flag(struct resource *resource, u_int64_t flag_mask);
+
/* Handle resource control */
int set_resource_control(struct resource *resource, u_int64_t ctrl_id, const void *data);
const char *get_resource_control_name(struct resource *resource, u_int64_t ctrl_id);
#define RESOURCE_TYPE_NONSTANDARD 99
/**
+ * @brief Resource flags
+ */
+#define RESOURCE_FLAG_PRIVATE BIT(0)
+#define RESOURCE_FLAG_PUBLIC BIT(1)
+
+/**
* @brief Define the supported attributes according to resource type
*/
return ret;
}
+static int handle_request_set_resource_flag(struct request_client *client, char *args)
+{
+ struct resource *res;
+ int resource_id, ret;
+ u_int64_t flag_mask;
+
+ if (!client || !args) {
+ _E("Invalid parameter\n");
+ return -ENOENT;
+ }
+
+ /**
+ * Format of REQUEST_SET_RESOURCE_ATTR and REQUEST_UNSET_RESOURCE_ATTR args:
+ * - <RESOURCE_ID>
+ */
+ if (sscanf(args, "%d$%"PRIu64, &resource_id, &flag_mask) < 2) {
+ _E("failed to get resource and flag mask, client(%d)\n",
+ client->socket_fd);
+ return -EINVAL;
+ }
+
+ res = get_resource_by_id(client, resource_id);
+ if (!res) {
+ _E("failed to get resource, client(%d) | res:name(%s)id(%d)\n",
+ client->socket_fd,
+ get_resource_name(res), resource_id);
+ return -EINVAL;
+ }
+
+ ret = set_resource_flag(res, flag_mask);
+ if (ret < 0) {
+ _E("failed to set flag to %lx, client(%d) | res:name(%s)id(%d)\n",
+ flag_mask, client->socket_fd,
+ get_resource_name(res), resource_id);
+ return ret;
+ }
+
+ return 0;
+}
+
static int handle_request_is_resource_attr_supported(struct request_client *client, char *args, bool *supported)
{
struct resource *res;
case REQUEST_UPDATE_RESOURCE:
ret = handle_request_update_resource(client, args);
break;
+ case REQUEST_SET_RESOURCE_FLAG:
+ ret = handle_request_set_resource_flag(client, args);
+ break;
case REQUEST_GET_RESOURCE_COUNT:
{
int32_t value;
#include <util/resource.h>
#include <util/log.h>
+#include <resource-monitor/resource-monitor.h>
+
#define RESOURCE_ATTR_MASK (ULLONG_MAX)
#define BIT64_INDEX(id) (63 - __builtin_clzll(id))
#define RESOURCE_ATTR_INDEX(id) BIT64_INDEX(id)
u_int64_t attr_interest;
u_int64_t attr_supported;
+ u_int64_t flag;
+
int64_t ts_start;
int64_t ts_end;
};
resource->ctrls = driver->ctrls;
resource->num_ctrls = driver->num_ctrls;
+ resource->flag = RESOURCE_FLAG_PRIVATE;
if (driver->ops.create) {
ret = driver->ops.create(resource);
return resource;
}
+int set_resource_flag(struct resource *resource, u_int64_t flag_mask)
+{
+ if (!resource)
+ return -EINVAL;
+
+ resource->flag = flag_mask;
+ return 0;
+}
+
int set_resource_control(struct resource *resource, u_int64_t ctrl_id, const void *data)
{
const struct resource_control *ctrl;
return 0;
}
+#define RESOURCE_FLAG_VISIBILITY_MASK (RESOURCE_FLAG_PRIVATE | RESOURCE_FLAG_PUBLIC)
+#define RESOURCE_ATTR_FLAG_VISIBILITY_MASK (RESOURCE_ATTR_FLAG_PRIVATE | RESOURCE_ATTR_FLAG_PUBLIC)
+
+static inline bool is_resource_attr_visible(struct resource *resource, const struct resource_attribute *attr)
+{
+ u_int64_t res_visibility, attr_visibility;
+
+ res_visibility = resource->flag & RESOURCE_FLAG_VISIBILITY_MASK;
+ attr_visibility = attr->flag & RESOURCE_ATTR_FLAG_VISIBILITY_MASK;
+
+ /* bigger visibility means smaller privilege */
+ if (res_visibility > attr_visibility)
+ return false;
+
+ return true;
+}
+
int set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask)
{
struct resource_attribute_value *attr_value;
goto err;
}
+ if (!is_resource_attr_visible(resource, &resource->attrs[i])) {
+ _E("res:name(%s) does not have enough privilege to read the attr:name(%s)",
+ resource->name, resource->attrs[i].name);
+ ret = -EPERM;
+ goto err;
+ }
+
attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
if (!attr_value) {
_E("failed to get attribute value, res:type(%s) | attr:name(%s)",