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

📄 qeth_sys.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
}static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,			qeth_dev_ipato_del4_store);#ifdef CONFIG_QETH_IPV6static ssize_tqeth_dev_ipato_invert6_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	if (qeth_check_layer2(card))		return -EPERM;	return sprintf(buf, "%i\n", card->ipato.invert6? 1:0);}static ssize_tqeth_dev_ipato_invert6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	char *tmp;	if (!card)		return -EINVAL;	if (qeth_check_layer2(card))		return -EPERM;	tmp = strsep((char **) &buf, "\n");	if (!strcmp(tmp, "toggle")){		card->ipato.invert6 = (card->ipato.invert6)? 0 : 1;	} else if (!strcmp(tmp, "1")){		card->ipato.invert6 = 1;	} else if (!strcmp(tmp, "0")){		card->ipato.invert6 = 0;	} else {		PRINT_WARN("ipato_invert6: write 0, 1 or 'toggle' to "			   "this file\n");		return -EINVAL;	}	return count;}static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,			qeth_dev_ipato_invert6_show,			qeth_dev_ipato_invert6_store);static ssize_tqeth_dev_ipato_add6_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);}static ssize_tqeth_dev_ipato_add6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);}static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,			qeth_dev_ipato_add6_show,			qeth_dev_ipato_add6_store);static ssize_tqeth_dev_ipato_del6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);}static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,			qeth_dev_ipato_del6_store);#endif /* CONFIG_QETH_IPV6 */static struct device_attribute * qeth_ipato_device_attrs[] = {	&dev_attr_ipato_enable,	&dev_attr_ipato_invert4,	&dev_attr_ipato_add4,	&dev_attr_ipato_del4,#ifdef CONFIG_QETH_IPV6	&dev_attr_ipato_invert6,	&dev_attr_ipato_add6,	&dev_attr_ipato_del6,#endif	NULL,};static struct attribute_group qeth_device_ipato_group = {	.name = "ipa_takeover",	.attrs = (struct attribute **)qeth_ipato_device_attrs,};static inline ssize_tqeth_dev_vipa_add_show(char *buf, struct qeth_card *card,			enum qeth_prot_versions proto){	struct qeth_ipaddr *ipaddr;	char addr_str[40];	int entry_len; /* length of 1 entry string, differs between v4 and v6 */	unsigned long flags;	int i = 0;	if (qeth_check_layer2(card))		return -EPERM;	entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;	entry_len += 2; /* \n + terminator */	spin_lock_irqsave(&card->ip_lock, flags);	list_for_each_entry(ipaddr, &card->ip_list, entry){		if (ipaddr->proto != proto)			continue;		if (ipaddr->type != QETH_IP_TYPE_VIPA)			continue;		/* String must not be longer than PAGE_SIZE. So we check if		 * string length gets near PAGE_SIZE. Then we can savely display		 * the next IPv6 address (worst case, compared to IPv4) */		if ((PAGE_SIZE - i) <= entry_len)			break;		qeth_ipaddr_to_string(proto, (const u8 *)&ipaddr->u, addr_str);		i += snprintf(buf + i, PAGE_SIZE - i, "%s\n", addr_str);	}	spin_unlock_irqrestore(&card->ip_lock, flags);	i += snprintf(buf + i, PAGE_SIZE - i, "\n");	return i;}static ssize_tqeth_dev_vipa_add4_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_vipa_add_show(buf, card, QETH_PROT_IPV4);}static inline intqeth_parse_vipae(const char* buf, enum qeth_prot_versions proto,		 u8 *addr){	if (qeth_string_to_ipaddr(buf, proto, addr)){		PRINT_WARN("Invalid IP address format!\n");		return -EINVAL;	}	return 0;}static inline ssize_tqeth_dev_vipa_add_store(const char *buf, size_t count,			 struct qeth_card *card, enum qeth_prot_versions proto){	u8 addr[16] = {0, };	int rc;	if (qeth_check_layer2(card))		return -EPERM;	if ((rc = qeth_parse_vipae(buf, proto, addr)))		return rc;	if ((rc = qeth_add_vipa(card, proto, addr)))		return rc;	return count;}static ssize_tqeth_dev_vipa_add4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);}static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,			qeth_dev_vipa_add4_show,			qeth_dev_vipa_add4_store);static inline ssize_tqeth_dev_vipa_del_store(const char *buf, size_t count,			 struct qeth_card *card, enum qeth_prot_versions proto){	u8 addr[16];	int rc;	if (qeth_check_layer2(card))		return -EPERM;	if ((rc = qeth_parse_vipae(buf, proto, addr)))		return rc;	qeth_del_vipa(card, proto, addr);	return count;}static ssize_tqeth_dev_vipa_del4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);}static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,			qeth_dev_vipa_del4_store);#ifdef CONFIG_QETH_IPV6static ssize_tqeth_dev_vipa_add6_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_vipa_add_show(buf, card, QETH_PROT_IPV6);}static ssize_tqeth_dev_vipa_add6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);}static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,			qeth_dev_vipa_add6_show,			qeth_dev_vipa_add6_store);static ssize_tqeth_dev_vipa_del6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	if (qeth_check_layer2(card))		return -EPERM;	return qeth_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);}static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,			qeth_dev_vipa_del6_store);#endif /* CONFIG_QETH_IPV6 */static struct device_attribute * qeth_vipa_device_attrs[] = {	&dev_attr_vipa_add4,	&dev_attr_vipa_del4,#ifdef CONFIG_QETH_IPV6	&dev_attr_vipa_add6,	&dev_attr_vipa_del6,#endif	NULL,};static struct attribute_group qeth_device_vipa_group = {	.name = "vipa",	.attrs = (struct attribute **)qeth_vipa_device_attrs,};static inline ssize_tqeth_dev_rxip_add_show(char *buf, struct qeth_card *card,		       enum qeth_prot_versions proto){	struct qeth_ipaddr *ipaddr;	char addr_str[40];	int entry_len; /* length of 1 entry string, differs between v4 and v6 */	unsigned long flags;	int i = 0;	if (qeth_check_layer2(card))		return -EPERM;	entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;	entry_len += 2; /* \n + terminator */	spin_lock_irqsave(&card->ip_lock, flags);	list_for_each_entry(ipaddr, &card->ip_list, entry){		if (ipaddr->proto != proto)			continue;		if (ipaddr->type != QETH_IP_TYPE_RXIP)			continue;		/* String must not be longer than PAGE_SIZE. So we check if		 * string length gets near PAGE_SIZE. Then we can savely display		 * the next IPv6 address (worst case, compared to IPv4) */		if ((PAGE_SIZE - i) <= entry_len)			break;		qeth_ipaddr_to_string(proto, (const u8 *)&ipaddr->u, addr_str);		i += snprintf(buf + i, PAGE_SIZE - i, "%s\n", addr_str);	}	spin_unlock_irqrestore(&card->ip_lock, flags);	i += snprintf(buf + i, PAGE_SIZE - i, "\n");	return i;}static ssize_tqeth_dev_rxip_add4_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_rxip_add_show(buf, card, QETH_PROT_IPV4);}static inline intqeth_parse_rxipe(const char* buf, enum qeth_prot_versions proto,		 u8 *addr){	if (qeth_string_to_ipaddr(buf, proto, addr)){		PRINT_WARN("Invalid IP address format!\n");		return -EINVAL;	}	return 0;}static inline ssize_tqeth_dev_rxip_add_store(const char *buf, size_t count,			struct qeth_card *card, enum qeth_prot_versions proto){	u8 addr[16] = {0, };	int rc;	if (qeth_check_layer2(card))		return -EPERM;	if ((rc = qeth_parse_rxipe(buf, proto, addr)))		return rc;	if ((rc = qeth_add_rxip(card, proto, addr)))		return rc;	return count;}static ssize_tqeth_dev_rxip_add4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);}static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,			qeth_dev_rxip_add4_show,			qeth_dev_rxip_add4_store);static inline ssize_tqeth_dev_rxip_del_store(const char *buf, size_t count,			struct qeth_card *card, enum qeth_prot_versions proto){	u8 addr[16];	int rc;	if (qeth_check_layer2(card))		return -EPERM;	if ((rc = qeth_parse_rxipe(buf, proto, addr)))		return rc;	qeth_del_rxip(card, proto, addr);	return count;}static ssize_tqeth_dev_rxip_del4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);}static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,			qeth_dev_rxip_del4_store);#ifdef CONFIG_QETH_IPV6static ssize_tqeth_dev_rxip_add6_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_rxip_add_show(buf, card, QETH_PROT_IPV6);}static ssize_tqeth_dev_rxip_add6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);}static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,			qeth_dev_rxip_add6_show,			qeth_dev_rxip_add6_store);static ssize_tqeth_dev_rxip_del6_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return qeth_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);}static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,			qeth_dev_rxip_del6_store);#endif /* CONFIG_QETH_IPV6 */static struct device_attribute * qeth_rxip_device_attrs[] = {	&dev_attr_rxip_add4,	&dev_attr_rxip_del4,#ifdef CONFIG_QETH_IPV6	&dev_attr_rxip_add6,	&dev_attr_rxip_del6,#endif	NULL,};static struct attribute_group qeth_device_rxip_group = {	.name = "rxip",	.attrs = (struct attribute **)qeth_rxip_device_attrs,};intqeth_create_device_attributes(struct device *dev){	int ret;	struct qeth_card *card = dev->driver_data;	if (card->info.type == QETH_CARD_TYPE_OSN)		return sysfs_create_group(&dev->kobj,					  &qeth_osn_device_attr_group);   		if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group)))		return ret;	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group))){		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);		return ret;	}	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_vipa_group))){		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);		sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);		return ret;	}	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_rxip_group))){		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);		sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);		sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);	}	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group)))		return ret;	return ret;}voidqeth_remove_device_attributes(struct device *dev){	struct qeth_card *card = dev->driver_data;	if (card->info.type == QETH_CARD_TYPE_OSN)		return sysfs_remove_group(&dev->kobj,					  &qeth_osn_device_attr_group);		      	sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);	sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);	sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);	sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group);	sysfs_remove_group(&dev->kobj, &qeth_device_blkt_group);}/**********************//* DRIVER ATTRIBUTES  *//**********************/static ssize_tqeth_driver_group_store(struct device_driver *ddrv, const char *buf,			size_t count){	const char *start, *end;	char bus_ids[3][BUS_ID_SIZE], *argv[3];	int i;	int err;	start = buf;	for (i = 0; i < 3; i++) {		static const char delim[] = { ',', ',', '\n' };		int len;		if (!(end = strchr(start, delim[i])))			return -EINVAL;		len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start);		strncpy(bus_ids[i], start, len);		bus_ids[i][len] = '\0';		start = end + 1;		argv[i] = bus_ids[i];	}	err = ccwgroup_create(qeth_root_dev, qeth_ccwgroup_driver.driver_id,			&qeth_ccw_driver, 3, argv);	if (err)		return err;	else		return count;}static DRIVER_ATTR(group, 0200, 0, qeth_driver_group_store);static ssize_tqeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf,				size_t count){	int rc;	int signum;	char *tmp, *tmp2;	tmp = strsep((char **) &buf, "\n");	if (!strncmp(tmp, "unregister", 10)){		if ((rc = qeth_notifier_unregister(current)))			return rc;		return count;	}	signum = simple_strtoul(tmp, &tmp2, 10);	if ((signum < 0) || (signum > 32)){		PRINT_WARN("Signal number %d is out of range\n", signum);		return -EINVAL;	}	if ((rc = qeth_notifier_register(current, signum)))		return rc;	return count;}static DRIVER_ATTR(notifier_register, 0200, 0,		   qeth_driver_notifier_register_store);intqeth_create_driver_attributes(void){	int rc;	if ((rc = driver_create_file(&qeth_ccwgroup_driver.driver,				     &driver_attr_group)))		return rc;	return driver_create_file(&qeth_ccwgroup_driver.driver,				  &driver_attr_notifier_register);}voidqeth_remove_driver_attributes(void){	driver_remove_file(&qeth_ccwgroup_driver.driver,			&driver_attr_group);	driver_remove_file(&qeth_ccwgroup_driver.driver,			&driver_attr_notifier_register);}

⌨️ 快捷键说明

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