⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netlabel_mgmt.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	case NETLBL_NLTYPE_CIPSOV4:		if (!info->attrs[NLBL_MGMT_A_CV4DOI])			goto adddef_failure;		tmp_val = nla_get_u32(info->attrs[NLBL_MGMT_A_CV4DOI]);		/* We should be holding a rcu_read_lock() here while we hold		 * the result but since the entry will always be deleted when		 * the CIPSO DOI is deleted we aren't going to keep the		 * lock. */		rcu_read_lock();		entry->type_def.cipsov4 = cipso_v4_doi_getdef(tmp_val);		if (entry->type_def.cipsov4 == NULL) {			rcu_read_unlock();			goto adddef_failure;		}		ret_val = netlbl_domhsh_add_default(entry, &audit_info);		rcu_read_unlock();		break;	default:		goto adddef_failure;	}	if (ret_val != 0)		goto adddef_failure;	return 0;adddef_failure:	kfree(entry);	return ret_val;}/** * netlbl_mgmt_removedef - Handle a REMOVEDEF message * @skb: the NETLINK buffer * @info: the Generic NETLINK info block * * Description: * Process a user generated REMOVEDEF message and remove the default domain * mapping.  Returns zero on success, negative values on failure. * */static int netlbl_mgmt_removedef(struct sk_buff *skb, struct genl_info *info){	struct netlbl_audit audit_info;	netlbl_netlink_auditinfo(skb, &audit_info);	return netlbl_domhsh_remove_default(&audit_info);}/** * netlbl_mgmt_listdef - Handle a LISTDEF message * @skb: the NETLINK buffer * @info: the Generic NETLINK info block * * Description: * Process a user generated LISTDEF message and dumps the default domain * mapping in a form suitable for use in a kernel generated LISTDEF message. * Returns zero on success, negative values on failure. * */static int netlbl_mgmt_listdef(struct sk_buff *skb, struct genl_info *info){	int ret_val = -ENOMEM;	struct sk_buff *ans_skb = NULL;	void *data;	struct netlbl_dom_map *entry;	ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);	if (ans_skb == NULL)		return -ENOMEM;	data = genlmsg_put_reply(ans_skb, info, &netlbl_mgmt_gnl_family,				 0, NLBL_MGMT_C_LISTDEF);	if (data == NULL)		goto listdef_failure;	rcu_read_lock();	entry = netlbl_domhsh_getentry(NULL);	if (entry == NULL) {		ret_val = -ENOENT;		goto listdef_failure_lock;	}	ret_val = nla_put_u32(ans_skb, NLBL_MGMT_A_PROTOCOL, entry->type);	if (ret_val != 0)		goto listdef_failure_lock;	switch (entry->type) {	case NETLBL_NLTYPE_CIPSOV4:		ret_val = nla_put_u32(ans_skb,				      NLBL_MGMT_A_CV4DOI,				      entry->type_def.cipsov4->doi);		if (ret_val != 0)			goto listdef_failure_lock;		break;	}	rcu_read_unlock();	genlmsg_end(ans_skb, data);	ret_val = genlmsg_reply(ans_skb, info);	if (ret_val != 0)		goto listdef_failure;	return 0;listdef_failure_lock:	rcu_read_unlock();listdef_failure:	kfree_skb(ans_skb);	return ret_val;}/** * netlbl_mgmt_protocols_cb - Write an individual PROTOCOL message response * @skb: the skb to write to * @seq: the NETLINK sequence number * @cb: the NETLINK callback * @protocol: the NetLabel protocol to use in the message * * Description: * This function is to be used in conjunction with netlbl_mgmt_protocols() to * answer a application's PROTOCOLS message.  Returns the size of the message * on success, negative values on failure. * */static int netlbl_mgmt_protocols_cb(struct sk_buff *skb,				    struct netlink_callback *cb,				    u32 protocol){	int ret_val = -ENOMEM;	void *data;	data = genlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq,			   &netlbl_mgmt_gnl_family, NLM_F_MULTI,			   NLBL_MGMT_C_PROTOCOLS);	if (data == NULL)		goto protocols_cb_failure;	ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, protocol);	if (ret_val != 0)		goto protocols_cb_failure;	return genlmsg_end(skb, data);protocols_cb_failure:	genlmsg_cancel(skb, data);	return ret_val;}/** * netlbl_mgmt_protocols - Handle a PROTOCOLS message * @skb: the NETLINK buffer * @cb: the NETLINK callback * * Description: * Process a user generated PROTOCOLS message and respond accordingly. * */static int netlbl_mgmt_protocols(struct sk_buff *skb,				 struct netlink_callback *cb){	u32 protos_sent = cb->args[0];	if (protos_sent == 0) {		if (netlbl_mgmt_protocols_cb(skb,					     cb,					     NETLBL_NLTYPE_UNLABELED) < 0)			goto protocols_return;		protos_sent++;	}	if (protos_sent == 1) {		if (netlbl_mgmt_protocols_cb(skb,					     cb,					     NETLBL_NLTYPE_CIPSOV4) < 0)			goto protocols_return;		protos_sent++;	}protocols_return:	cb->args[0] = protos_sent;	return skb->len;}/** * netlbl_mgmt_version - Handle a VERSION message * @skb: the NETLINK buffer * @info: the Generic NETLINK info block * * Description: * Process a user generated VERSION message and respond accordingly.  Returns * zero on success, negative values on failure. * */static int netlbl_mgmt_version(struct sk_buff *skb, struct genl_info *info){	int ret_val = -ENOMEM;	struct sk_buff *ans_skb = NULL;	void *data;	ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);	if (ans_skb == NULL)		return -ENOMEM;	data = genlmsg_put_reply(ans_skb, info, &netlbl_mgmt_gnl_family,				 0, NLBL_MGMT_C_VERSION);	if (data == NULL)		goto version_failure;	ret_val = nla_put_u32(ans_skb,			      NLBL_MGMT_A_VERSION,			      NETLBL_PROTO_VERSION);	if (ret_val != 0)		goto version_failure;	genlmsg_end(ans_skb, data);	ret_val = genlmsg_reply(ans_skb, info);	if (ret_val != 0)		goto version_failure;	return 0;version_failure:	kfree_skb(ans_skb);	return ret_val;}/* * NetLabel Generic NETLINK Command Definitions */static struct genl_ops netlbl_mgmt_genl_c_add = {	.cmd = NLBL_MGMT_C_ADD,	.flags = GENL_ADMIN_PERM,	.policy = netlbl_mgmt_genl_policy,	.doit = netlbl_mgmt_add,	.dumpit = NULL,};static struct genl_ops netlbl_mgmt_genl_c_remove = {	.cmd = NLBL_MGMT_C_REMOVE,	.flags = GENL_ADMIN_PERM,	.policy = netlbl_mgmt_genl_policy,	.doit = netlbl_mgmt_remove,	.dumpit = NULL,};static struct genl_ops netlbl_mgmt_genl_c_listall = {	.cmd = NLBL_MGMT_C_LISTALL,	.flags = 0,	.policy = netlbl_mgmt_genl_policy,	.doit = NULL,	.dumpit = netlbl_mgmt_listall,};static struct genl_ops netlbl_mgmt_genl_c_adddef = {	.cmd = NLBL_MGMT_C_ADDDEF,	.flags = GENL_ADMIN_PERM,	.policy = netlbl_mgmt_genl_policy,	.doit = netlbl_mgmt_adddef,	.dumpit = NULL,};static struct genl_ops netlbl_mgmt_genl_c_removedef = {	.cmd = NLBL_MGMT_C_REMOVEDEF,	.flags = GENL_ADMIN_PERM,	.policy = netlbl_mgmt_genl_policy,	.doit = netlbl_mgmt_removedef,	.dumpit = NULL,};static struct genl_ops netlbl_mgmt_genl_c_listdef = {	.cmd = NLBL_MGMT_C_LISTDEF,	.flags = 0,	.policy = netlbl_mgmt_genl_policy,	.doit = netlbl_mgmt_listdef,	.dumpit = NULL,};static struct genl_ops netlbl_mgmt_genl_c_protocols = {	.cmd = NLBL_MGMT_C_PROTOCOLS,	.flags = 0,	.policy = netlbl_mgmt_genl_policy,	.doit = NULL,	.dumpit = netlbl_mgmt_protocols,};static struct genl_ops netlbl_mgmt_genl_c_version = {	.cmd = NLBL_MGMT_C_VERSION,	.flags = 0,	.policy = netlbl_mgmt_genl_policy,	.doit = netlbl_mgmt_version,	.dumpit = NULL,};/* * NetLabel Generic NETLINK Protocol Functions *//** * netlbl_mgmt_genl_init - Register the NetLabel management component * * Description: * Register the NetLabel management component with the Generic NETLINK * mechanism.  Returns zero on success, negative values on failure. * */int netlbl_mgmt_genl_init(void){	int ret_val;	ret_val = genl_register_family(&netlbl_mgmt_gnl_family);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_add);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_remove);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_listall);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_adddef);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_removedef);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_listdef);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_protocols);	if (ret_val != 0)		return ret_val;	ret_val = genl_register_ops(&netlbl_mgmt_gnl_family,				    &netlbl_mgmt_genl_c_version);	if (ret_val != 0)		return ret_val;	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -