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

📄 config.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	return tipc_cfg_reply_none();}static struct sk_buff *cfg_set_max_ports(void){	u32 value;	if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))		return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);	value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));	if (value == tipc_max_ports)		return tipc_cfg_reply_none();	if (value != delimit(value, 127, 65535))		return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE						   " (max ports must be 127-65535)");	if (tipc_mode != TIPC_NOT_RUNNING)		return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED			" (cannot change max ports while TIPC is active)");	tipc_max_ports = value;	return tipc_cfg_reply_none();}static struct sk_buff *cfg_set_max_zones(void){	u32 value;	if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))		return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);	value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));	if (value == tipc_max_zones)		return tipc_cfg_reply_none();	if (value != delimit(value, 1, 255))		return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE						   " (max zones must be 1-255)");	if (tipc_mode == TIPC_NET_MODE)		return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED			" (cannot change max zones once TIPC has joined a network)");	tipc_max_zones = value;	return tipc_cfg_reply_none();}static struct sk_buff *cfg_set_max_clusters(void){	u32 value;	if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))		return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);	value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));	if (value != delimit(value, 1, 1))		return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE						   " (max clusters fixed at 1)");	return tipc_cfg_reply_none();}static struct sk_buff *cfg_set_max_nodes(void){	u32 value;	if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))		return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);	value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));	if (value == tipc_max_nodes)		return tipc_cfg_reply_none();	if (value != delimit(value, 8, 2047))		return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE						   " (max nodes must be 8-2047)");	if (tipc_mode == TIPC_NET_MODE)		return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED			" (cannot change max nodes once TIPC has joined a network)");	tipc_max_nodes = value;	return tipc_cfg_reply_none();}static struct sk_buff *cfg_set_max_slaves(void){	u32 value;	if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))		return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);	value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));	if (value != 0)		return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED						   " (max secondary nodes fixed at 0)");	return tipc_cfg_reply_none();}static struct sk_buff *cfg_set_netid(void){	u32 value;	if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))		return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);	value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));	if (value == tipc_net_id)		return tipc_cfg_reply_none();	if (value != delimit(value, 1, 9999))		return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE						   " (network id must be 1-9999)");	if (tipc_mode == TIPC_NET_MODE)		return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED			" (cannot change network id once TIPC has joined a network)");	tipc_net_id = value;	return tipc_cfg_reply_none();}struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area,				int request_space, int reply_headroom){	struct sk_buff *rep_tlv_buf;	spin_lock_bh(&config_lock);	/* Save request and reply details in a well-known location */	req_tlv_area = request_area;	req_tlv_space = request_space;	rep_headroom = reply_headroom;	/* Check command authorization */	if (likely(orig_node == tipc_own_addr)) {		/* command is permitted */	} else if (cmd >= 0x8000) {		rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED							  " (cannot be done remotely)");		goto exit;	} else if (!tipc_remote_management) {		rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NO_REMOTE);		goto exit;	}	else if (cmd >= 0x4000) {		u32 domain = 0;		if ((tipc_nametbl_translate(TIPC_ZM_SRV, 0, &domain) == 0) ||		    (domain != orig_node)) {			rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_ZONE_MSTR);			goto exit;		}	}	/* Call appropriate processing routine */	switch (cmd) {	case TIPC_CMD_NOOP:		rep_tlv_buf = tipc_cfg_reply_none();		break;	case TIPC_CMD_GET_NODES:		rep_tlv_buf = tipc_node_get_nodes(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_GET_LINKS:		rep_tlv_buf = tipc_node_get_links(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_SHOW_LINK_STATS:		rep_tlv_buf = tipc_link_cmd_show_stats(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_RESET_LINK_STATS:		rep_tlv_buf = tipc_link_cmd_reset_stats(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_SHOW_NAME_TABLE:		rep_tlv_buf = tipc_nametbl_get(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_GET_BEARER_NAMES:		rep_tlv_buf = tipc_bearer_get_names();		break;	case TIPC_CMD_GET_MEDIA_NAMES:		rep_tlv_buf = tipc_media_get_names();		break;	case TIPC_CMD_SHOW_PORTS:		rep_tlv_buf = tipc_port_get_ports();		break;#if 0	case TIPC_CMD_SHOW_PORT_STATS:		rep_tlv_buf = port_show_stats(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_RESET_PORT_STATS:		rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED);		break;#endif	case TIPC_CMD_SET_LOG_SIZE:		rep_tlv_buf = tipc_log_resize(req_tlv_area, req_tlv_space);		break;	case TIPC_CMD_DUMP_LOG:		rep_tlv_buf = tipc_log_dump();		break;	case TIPC_CMD_SET_LINK_TOL:	case TIPC_CMD_SET_LINK_PRI:	case TIPC_CMD_SET_LINK_WINDOW:		rep_tlv_buf = tipc_link_cmd_config(req_tlv_area, req_tlv_space, cmd);		break;	case TIPC_CMD_ENABLE_BEARER:		rep_tlv_buf = cfg_enable_bearer();		break;	case TIPC_CMD_DISABLE_BEARER:		rep_tlv_buf = cfg_disable_bearer();		break;	case TIPC_CMD_SET_NODE_ADDR:		rep_tlv_buf = cfg_set_own_addr();		break;	case TIPC_CMD_SET_REMOTE_MNG:		rep_tlv_buf = cfg_set_remote_mng();		break;	case TIPC_CMD_SET_MAX_PORTS:		rep_tlv_buf = cfg_set_max_ports();		break;	case TIPC_CMD_SET_MAX_PUBL:		rep_tlv_buf = cfg_set_max_publications();		break;	case TIPC_CMD_SET_MAX_SUBSCR:		rep_tlv_buf = cfg_set_max_subscriptions();		break;	case TIPC_CMD_SET_MAX_ZONES:		rep_tlv_buf = cfg_set_max_zones();		break;	case TIPC_CMD_SET_MAX_CLUSTERS:		rep_tlv_buf = cfg_set_max_clusters();		break;	case TIPC_CMD_SET_MAX_NODES:		rep_tlv_buf = cfg_set_max_nodes();		break;	case TIPC_CMD_SET_MAX_SLAVES:		rep_tlv_buf = cfg_set_max_slaves();		break;	case TIPC_CMD_SET_NETID:		rep_tlv_buf = cfg_set_netid();		break;	case TIPC_CMD_GET_REMOTE_MNG:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_remote_management);		break;	case TIPC_CMD_GET_MAX_PORTS:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_ports);		break;	case TIPC_CMD_GET_MAX_PUBL:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_publications);		break;	case TIPC_CMD_GET_MAX_SUBSCR:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_subscriptions);		break;	case TIPC_CMD_GET_MAX_ZONES:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_zones);		break;	case TIPC_CMD_GET_MAX_CLUSTERS:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_clusters);		break;	case TIPC_CMD_GET_MAX_NODES:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_nodes);		break;	case TIPC_CMD_GET_MAX_SLAVES:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_slaves);		break;	case TIPC_CMD_GET_NETID:		rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_net_id);		break;	default:		rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED							  " (unknown command)");		break;	}	/* Return reply buffer */exit:	spin_unlock_bh(&config_lock);	return rep_tlv_buf;}static void cfg_named_msg_event(void *userdata,				u32 port_ref,				struct sk_buff **buf,				const unchar *msg,				u32 size,				u32 importance,				struct tipc_portid const *orig,				struct tipc_name_seq const *dest){	struct tipc_cfg_msg_hdr *req_hdr;	struct tipc_cfg_msg_hdr *rep_hdr;	struct sk_buff *rep_buf;	/* Validate configuration message header (ignore invalid message) */	req_hdr = (struct tipc_cfg_msg_hdr *)msg;	if ((size < sizeof(*req_hdr)) ||	    (size != TCM_ALIGN(ntohl(req_hdr->tcm_len))) ||	    (ntohs(req_hdr->tcm_flags) != TCM_F_REQUEST)) {		warn("Invalid configuration message discarded\n");		return;	}	/* Generate reply for request (if can't, return request) */	rep_buf = tipc_cfg_do_cmd(orig->node,				  ntohs(req_hdr->tcm_type),				  msg + sizeof(*req_hdr),				  size - sizeof(*req_hdr),				  BUF_HEADROOM + MAX_H_SIZE + sizeof(*rep_hdr));	if (rep_buf) {		skb_push(rep_buf, sizeof(*rep_hdr));		rep_hdr = (struct tipc_cfg_msg_hdr *)rep_buf->data;		memcpy(rep_hdr, req_hdr, sizeof(*rep_hdr));		rep_hdr->tcm_len = htonl(rep_buf->len);		rep_hdr->tcm_flags &= htons(~TCM_F_REQUEST);	} else {		rep_buf = *buf;		*buf = NULL;	}	/* NEED TO ADD CODE TO HANDLE FAILED SEND (SUCH AS CONGESTION) */	tipc_send_buf2port(port_ref, orig, rep_buf, rep_buf->len);}int tipc_cfg_init(void){	struct tipc_name_seq seq;	int res;	memset(&mng, 0, sizeof(mng));	INIT_LIST_HEAD(&mng.link_subscribers);	res = tipc_attach(&mng.user_ref, NULL, NULL);	if (res)		goto failed;	res = tipc_createport(mng.user_ref, NULL, TIPC_CRITICAL_IMPORTANCE,			      NULL, NULL, NULL,			      NULL, cfg_named_msg_event, NULL,			      NULL, &mng.port_ref);	if (res)		goto failed;	seq.type = TIPC_CFG_SRV;	seq.lower = seq.upper = tipc_own_addr;	res = tipc_nametbl_publish_rsv(mng.port_ref, TIPC_ZONE_SCOPE, &seq);	if (res)		goto failed;	return 0;failed:	err("Unable to create configuration service\n");	tipc_detach(mng.user_ref);	mng.user_ref = 0;	return res;}void tipc_cfg_stop(void){	if (mng.user_ref) {		tipc_detach(mng.user_ref);		mng.user_ref = 0;	}}

⌨️ 快捷键说明

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