qeth_l3_sys.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. /*
  2. * Copyright IBM Corp. 2007
  3. * Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
  4. * Frank Pavlic <fpavlic@de.ibm.com>,
  5. * Thomas Spatzier <tspat@de.ibm.com>,
  6. * Frank Blaschka <frank.blaschka@de.ibm.com>
  7. */
  8. #include <linux/slab.h>
  9. #include <asm/ebcdic.h>
  10. #include <linux/hashtable.h>
  11. #include "qeth_l3.h"
  12. #define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \
  13. struct device_attribute dev_attr_##_id = __ATTR(_name, _mode, _show, _store)
  14. static ssize_t qeth_l3_dev_route_show(struct qeth_card *card,
  15. struct qeth_routing_info *route, char *buf)
  16. {
  17. switch (route->type) {
  18. case PRIMARY_ROUTER:
  19. return sprintf(buf, "%s\n", "primary router");
  20. case SECONDARY_ROUTER:
  21. return sprintf(buf, "%s\n", "secondary router");
  22. case MULTICAST_ROUTER:
  23. if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
  24. return sprintf(buf, "%s\n", "multicast router+");
  25. else
  26. return sprintf(buf, "%s\n", "multicast router");
  27. case PRIMARY_CONNECTOR:
  28. if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
  29. return sprintf(buf, "%s\n", "primary connector+");
  30. else
  31. return sprintf(buf, "%s\n", "primary connector");
  32. case SECONDARY_CONNECTOR:
  33. if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
  34. return sprintf(buf, "%s\n", "secondary connector+");
  35. else
  36. return sprintf(buf, "%s\n", "secondary connector");
  37. default:
  38. return sprintf(buf, "%s\n", "no");
  39. }
  40. }
  41. static ssize_t qeth_l3_dev_route4_show(struct device *dev,
  42. struct device_attribute *attr, char *buf)
  43. {
  44. struct qeth_card *card = dev_get_drvdata(dev);
  45. if (!card)
  46. return -EINVAL;
  47. return qeth_l3_dev_route_show(card, &card->options.route4, buf);
  48. }
  49. static ssize_t qeth_l3_dev_route_store(struct qeth_card *card,
  50. struct qeth_routing_info *route, enum qeth_prot_versions prot,
  51. const char *buf, size_t count)
  52. {
  53. enum qeth_routing_types old_route_type = route->type;
  54. int rc = 0;
  55. mutex_lock(&card->conf_mutex);
  56. if (sysfs_streq(buf, "no_router")) {
  57. route->type = NO_ROUTER;
  58. } else if (sysfs_streq(buf, "primary_connector")) {
  59. route->type = PRIMARY_CONNECTOR;
  60. } else if (sysfs_streq(buf, "secondary_connector")) {
  61. route->type = SECONDARY_CONNECTOR;
  62. } else if (sysfs_streq(buf, "primary_router")) {
  63. route->type = PRIMARY_ROUTER;
  64. } else if (sysfs_streq(buf, "secondary_router")) {
  65. route->type = SECONDARY_ROUTER;
  66. } else if (sysfs_streq(buf, "multicast_router")) {
  67. route->type = MULTICAST_ROUTER;
  68. } else {
  69. rc = -EINVAL;
  70. goto out;
  71. }
  72. if (qeth_card_hw_is_reachable(card) &&
  73. (old_route_type != route->type)) {
  74. if (prot == QETH_PROT_IPV4)
  75. rc = qeth_l3_setrouting_v4(card);
  76. else if (prot == QETH_PROT_IPV6)
  77. rc = qeth_l3_setrouting_v6(card);
  78. }
  79. out:
  80. if (rc)
  81. route->type = old_route_type;
  82. mutex_unlock(&card->conf_mutex);
  83. return rc ? rc : count;
  84. }
  85. static ssize_t qeth_l3_dev_route4_store(struct device *dev,
  86. struct device_attribute *attr, const char *buf, size_t count)
  87. {
  88. struct qeth_card *card = dev_get_drvdata(dev);
  89. if (!card)
  90. return -EINVAL;
  91. return qeth_l3_dev_route_store(card, &card->options.route4,
  92. QETH_PROT_IPV4, buf, count);
  93. }
  94. static DEVICE_ATTR(route4, 0644, qeth_l3_dev_route4_show,
  95. qeth_l3_dev_route4_store);
  96. static ssize_t qeth_l3_dev_route6_show(struct device *dev,
  97. struct device_attribute *attr, char *buf)
  98. {
  99. struct qeth_card *card = dev_get_drvdata(dev);
  100. if (!card)
  101. return -EINVAL;
  102. return qeth_l3_dev_route_show(card, &card->options.route6, buf);
  103. }
  104. static ssize_t qeth_l3_dev_route6_store(struct device *dev,
  105. struct device_attribute *attr, const char *buf, size_t count)
  106. {
  107. struct qeth_card *card = dev_get_drvdata(dev);
  108. if (!card)
  109. return -EINVAL;
  110. return qeth_l3_dev_route_store(card, &card->options.route6,
  111. QETH_PROT_IPV6, buf, count);
  112. }
  113. static DEVICE_ATTR(route6, 0644, qeth_l3_dev_route6_show,
  114. qeth_l3_dev_route6_store);
  115. static ssize_t qeth_l3_dev_fake_broadcast_show(struct device *dev,
  116. struct device_attribute *attr, char *buf)
  117. {
  118. struct qeth_card *card = dev_get_drvdata(dev);
  119. if (!card)
  120. return -EINVAL;
  121. return sprintf(buf, "%i\n", card->options.fake_broadcast? 1:0);
  122. }
  123. static ssize_t qeth_l3_dev_fake_broadcast_store(struct device *dev,
  124. struct device_attribute *attr, const char *buf, size_t count)
  125. {
  126. struct qeth_card *card = dev_get_drvdata(dev);
  127. char *tmp;
  128. int i, rc = 0;
  129. if (!card)
  130. return -EINVAL;
  131. mutex_lock(&card->conf_mutex);
  132. if ((card->state != CARD_STATE_DOWN) &&
  133. (card->state != CARD_STATE_RECOVER)) {
  134. rc = -EPERM;
  135. goto out;
  136. }
  137. i = simple_strtoul(buf, &tmp, 16);
  138. if ((i == 0) || (i == 1))
  139. card->options.fake_broadcast = i;
  140. else
  141. rc = -EINVAL;
  142. out:
  143. mutex_unlock(&card->conf_mutex);
  144. return rc ? rc : count;
  145. }
  146. static DEVICE_ATTR(fake_broadcast, 0644, qeth_l3_dev_fake_broadcast_show,
  147. qeth_l3_dev_fake_broadcast_store);
  148. static ssize_t qeth_l3_dev_sniffer_show(struct device *dev,
  149. struct device_attribute *attr, char *buf)
  150. {
  151. struct qeth_card *card = dev_get_drvdata(dev);
  152. if (!card)
  153. return -EINVAL;
  154. return sprintf(buf, "%i\n", card->options.sniffer ? 1 : 0);
  155. }
  156. static ssize_t qeth_l3_dev_sniffer_store(struct device *dev,
  157. struct device_attribute *attr, const char *buf, size_t count)
  158. {
  159. struct qeth_card *card = dev_get_drvdata(dev);
  160. int rc = 0;
  161. unsigned long i;
  162. if (!card)
  163. return -EINVAL;
  164. if (card->info.type != QETH_CARD_TYPE_IQD)
  165. return -EPERM;
  166. if (card->options.cq == QETH_CQ_ENABLED)
  167. return -EPERM;
  168. mutex_lock(&card->conf_mutex);
  169. if ((card->state != CARD_STATE_DOWN) &&
  170. (card->state != CARD_STATE_RECOVER)) {
  171. rc = -EPERM;
  172. goto out;
  173. }
  174. rc = kstrtoul(buf, 16, &i);
  175. if (rc) {
  176. rc = -EINVAL;
  177. goto out;
  178. }
  179. switch (i) {
  180. case 0:
  181. card->options.sniffer = i;
  182. break;
  183. case 1:
  184. qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd);
  185. if (card->ssqd.qdioac2 & QETH_SNIFF_AVAIL) {
  186. card->options.sniffer = i;
  187. if (card->qdio.init_pool.buf_count !=
  188. QETH_IN_BUF_COUNT_MAX)
  189. qeth_realloc_buffer_pool(card,
  190. QETH_IN_BUF_COUNT_MAX);
  191. } else
  192. rc = -EPERM;
  193. break;
  194. default:
  195. rc = -EINVAL;
  196. }
  197. out:
  198. mutex_unlock(&card->conf_mutex);
  199. return rc ? rc : count;
  200. }
  201. static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show,
  202. qeth_l3_dev_sniffer_store);
  203. static ssize_t qeth_l3_dev_hsuid_show(struct device *dev,
  204. struct device_attribute *attr, char *buf)
  205. {
  206. struct qeth_card *card = dev_get_drvdata(dev);
  207. char tmp_hsuid[9];
  208. if (!card)
  209. return -EINVAL;
  210. if (card->info.type != QETH_CARD_TYPE_IQD)
  211. return -EPERM;
  212. memcpy(tmp_hsuid, card->options.hsuid, sizeof(tmp_hsuid));
  213. EBCASC(tmp_hsuid, 8);
  214. return sprintf(buf, "%s\n", tmp_hsuid);
  215. }
  216. static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
  217. struct device_attribute *attr, const char *buf, size_t count)
  218. {
  219. struct qeth_card *card = dev_get_drvdata(dev);
  220. struct qeth_ipaddr *addr;
  221. char *tmp;
  222. int i;
  223. if (!card)
  224. return -EINVAL;
  225. if (card->info.type != QETH_CARD_TYPE_IQD)
  226. return -EPERM;
  227. if (card->state != CARD_STATE_DOWN &&
  228. card->state != CARD_STATE_RECOVER)
  229. return -EPERM;
  230. if (card->options.sniffer)
  231. return -EPERM;
  232. if (card->options.cq == QETH_CQ_NOTAVAILABLE)
  233. return -EPERM;
  234. tmp = strsep((char **)&buf, "\n");
  235. if (strlen(tmp) > 8)
  236. return -EINVAL;
  237. if (card->options.hsuid[0]) {
  238. /* delete old ip address */
  239. addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
  240. if (!addr)
  241. return -ENOMEM;
  242. addr->u.a6.addr.s6_addr32[0] = cpu_to_be32(0xfe800000);
  243. addr->u.a6.addr.s6_addr32[1] = 0x00000000;
  244. for (i = 8; i < 16; i++)
  245. addr->u.a6.addr.s6_addr[i] =
  246. card->options.hsuid[i - 8];
  247. addr->u.a6.pfxlen = 0;
  248. addr->type = QETH_IP_TYPE_NORMAL;
  249. spin_lock_bh(&card->ip_lock);
  250. qeth_l3_delete_ip(card, addr);
  251. spin_unlock_bh(&card->ip_lock);
  252. kfree(addr);
  253. }
  254. if (strlen(tmp) == 0) {
  255. /* delete ip address only */
  256. card->options.hsuid[0] = '\0';
  257. if (card->dev)
  258. memcpy(card->dev->perm_addr, card->options.hsuid, 9);
  259. qeth_configure_cq(card, QETH_CQ_DISABLED);
  260. return count;
  261. }
  262. if (qeth_configure_cq(card, QETH_CQ_ENABLED))
  263. return -EPERM;
  264. snprintf(card->options.hsuid, sizeof(card->options.hsuid),
  265. "%-8s", tmp);
  266. ASCEBC(card->options.hsuid, 8);
  267. if (card->dev)
  268. memcpy(card->dev->perm_addr, card->options.hsuid, 9);
  269. addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
  270. if (addr != NULL) {
  271. addr->u.a6.addr.s6_addr32[0] = cpu_to_be32(0xfe800000);
  272. addr->u.a6.addr.s6_addr32[1] = 0x00000000;
  273. for (i = 8; i < 16; i++)
  274. addr->u.a6.addr.s6_addr[i] = card->options.hsuid[i - 8];
  275. addr->u.a6.pfxlen = 0;
  276. addr->type = QETH_IP_TYPE_NORMAL;
  277. } else
  278. return -ENOMEM;
  279. spin_lock_bh(&card->ip_lock);
  280. qeth_l3_add_ip(card, addr);
  281. spin_unlock_bh(&card->ip_lock);
  282. kfree(addr);
  283. return count;
  284. }
  285. static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
  286. qeth_l3_dev_hsuid_store);
  287. static struct attribute *qeth_l3_device_attrs[] = {
  288. &dev_attr_route4.attr,
  289. &dev_attr_route6.attr,
  290. &dev_attr_fake_broadcast.attr,
  291. &dev_attr_sniffer.attr,
  292. &dev_attr_hsuid.attr,
  293. NULL,
  294. };
  295. static const struct attribute_group qeth_l3_device_attr_group = {
  296. .attrs = qeth_l3_device_attrs,
  297. };
  298. static ssize_t qeth_l3_dev_ipato_enable_show(struct device *dev,
  299. struct device_attribute *attr, char *buf)
  300. {
  301. struct qeth_card *card = dev_get_drvdata(dev);
  302. if (!card)
  303. return -EINVAL;
  304. return sprintf(buf, "%i\n", card->ipato.enabled? 1:0);
  305. }
  306. static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
  307. struct device_attribute *attr, const char *buf, size_t count)
  308. {
  309. struct qeth_card *card = dev_get_drvdata(dev);
  310. struct qeth_ipaddr *addr;
  311. int i, rc = 0;
  312. if (!card)
  313. return -EINVAL;
  314. mutex_lock(&card->conf_mutex);
  315. if ((card->state != CARD_STATE_DOWN) &&
  316. (card->state != CARD_STATE_RECOVER)) {
  317. rc = -EPERM;
  318. goto out;
  319. }
  320. if (sysfs_streq(buf, "toggle")) {
  321. card->ipato.enabled = (card->ipato.enabled)? 0 : 1;
  322. } else if (sysfs_streq(buf, "1")) {
  323. card->ipato.enabled = 1;
  324. hash_for_each(card->ip_htable, i, addr, hnode) {
  325. if ((addr->type == QETH_IP_TYPE_NORMAL) &&
  326. qeth_l3_is_addr_covered_by_ipato(card, addr))
  327. addr->set_flags |=
  328. QETH_IPA_SETIP_TAKEOVER_FLAG;
  329. }
  330. } else if (sysfs_streq(buf, "0")) {
  331. card->ipato.enabled = 0;
  332. hash_for_each(card->ip_htable, i, addr, hnode) {
  333. if (addr->set_flags &
  334. QETH_IPA_SETIP_TAKEOVER_FLAG)
  335. addr->set_flags &=
  336. ~QETH_IPA_SETIP_TAKEOVER_FLAG;
  337. }
  338. } else
  339. rc = -EINVAL;
  340. out:
  341. mutex_unlock(&card->conf_mutex);
  342. return rc ? rc : count;
  343. }
  344. static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
  345. qeth_l3_dev_ipato_enable_show,
  346. qeth_l3_dev_ipato_enable_store);
  347. static ssize_t qeth_l3_dev_ipato_invert4_show(struct device *dev,
  348. struct device_attribute *attr, char *buf)
  349. {
  350. struct qeth_card *card = dev_get_drvdata(dev);
  351. if (!card)
  352. return -EINVAL;
  353. return sprintf(buf, "%i\n", card->ipato.invert4? 1:0);
  354. }
  355. static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev,
  356. struct device_attribute *attr,
  357. const char *buf, size_t count)
  358. {
  359. struct qeth_card *card = dev_get_drvdata(dev);
  360. int rc = 0;
  361. if (!card)
  362. return -EINVAL;
  363. mutex_lock(&card->conf_mutex);
  364. if (sysfs_streq(buf, "toggle"))
  365. card->ipato.invert4 = (card->ipato.invert4)? 0 : 1;
  366. else if (sysfs_streq(buf, "1"))
  367. card->ipato.invert4 = 1;
  368. else if (sysfs_streq(buf, "0"))
  369. card->ipato.invert4 = 0;
  370. else
  371. rc = -EINVAL;
  372. mutex_unlock(&card->conf_mutex);
  373. return rc ? rc : count;
  374. }
  375. static QETH_DEVICE_ATTR(ipato_invert4, invert4, 0644,
  376. qeth_l3_dev_ipato_invert4_show,
  377. qeth_l3_dev_ipato_invert4_store);
  378. static ssize_t qeth_l3_dev_ipato_add_show(char *buf, struct qeth_card *card,
  379. enum qeth_prot_versions proto)
  380. {
  381. struct qeth_ipato_entry *ipatoe;
  382. char addr_str[40];
  383. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  384. int i = 0;
  385. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  386. /* add strlen for "/<mask>\n" */
  387. entry_len += (proto == QETH_PROT_IPV4)? 5 : 6;
  388. spin_lock_bh(&card->ip_lock);
  389. list_for_each_entry(ipatoe, &card->ipato.entries, entry) {
  390. if (ipatoe->proto != proto)
  391. continue;
  392. /* String must not be longer than PAGE_SIZE. So we check if
  393. * string length gets near PAGE_SIZE. Then we can savely display
  394. * the next IPv6 address (worst case, compared to IPv4) */
  395. if ((PAGE_SIZE - i) <= entry_len)
  396. break;
  397. qeth_l3_ipaddr_to_string(proto, ipatoe->addr, addr_str);
  398. i += snprintf(buf + i, PAGE_SIZE - i,
  399. "%s/%i\n", addr_str, ipatoe->mask_bits);
  400. }
  401. spin_unlock_bh(&card->ip_lock);
  402. i += snprintf(buf + i, PAGE_SIZE - i, "\n");
  403. return i;
  404. }
  405. static ssize_t qeth_l3_dev_ipato_add4_show(struct device *dev,
  406. struct device_attribute *attr, char *buf)
  407. {
  408. struct qeth_card *card = dev_get_drvdata(dev);
  409. if (!card)
  410. return -EINVAL;
  411. return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV4);
  412. }
  413. static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto,
  414. u8 *addr, int *mask_bits)
  415. {
  416. const char *start, *end;
  417. char *tmp;
  418. char buffer[40] = {0, };
  419. start = buf;
  420. /* get address string */
  421. end = strchr(start, '/');
  422. if (!end || (end - start >= 40)) {
  423. return -EINVAL;
  424. }
  425. strncpy(buffer, start, end - start);
  426. if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) {
  427. return -EINVAL;
  428. }
  429. start = end + 1;
  430. *mask_bits = simple_strtoul(start, &tmp, 10);
  431. if (!strlen(start) ||
  432. (tmp == start) ||
  433. (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) {
  434. return -EINVAL;
  435. }
  436. return 0;
  437. }
  438. static ssize_t qeth_l3_dev_ipato_add_store(const char *buf, size_t count,
  439. struct qeth_card *card, enum qeth_prot_versions proto)
  440. {
  441. struct qeth_ipato_entry *ipatoe;
  442. u8 addr[16];
  443. int mask_bits;
  444. int rc = 0;
  445. mutex_lock(&card->conf_mutex);
  446. rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
  447. if (rc)
  448. goto out;
  449. ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL);
  450. if (!ipatoe) {
  451. rc = -ENOMEM;
  452. goto out;
  453. }
  454. ipatoe->proto = proto;
  455. memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16);
  456. ipatoe->mask_bits = mask_bits;
  457. rc = qeth_l3_add_ipato_entry(card, ipatoe);
  458. if (rc)
  459. kfree(ipatoe);
  460. out:
  461. mutex_unlock(&card->conf_mutex);
  462. return rc ? rc : count;
  463. }
  464. static ssize_t qeth_l3_dev_ipato_add4_store(struct device *dev,
  465. struct device_attribute *attr, const char *buf, size_t count)
  466. {
  467. struct qeth_card *card = dev_get_drvdata(dev);
  468. if (!card)
  469. return -EINVAL;
  470. return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV4);
  471. }
  472. static QETH_DEVICE_ATTR(ipato_add4, add4, 0644,
  473. qeth_l3_dev_ipato_add4_show,
  474. qeth_l3_dev_ipato_add4_store);
  475. static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count,
  476. struct qeth_card *card, enum qeth_prot_versions proto)
  477. {
  478. u8 addr[16];
  479. int mask_bits;
  480. int rc = 0;
  481. mutex_lock(&card->conf_mutex);
  482. rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
  483. if (!rc)
  484. qeth_l3_del_ipato_entry(card, proto, addr, mask_bits);
  485. mutex_unlock(&card->conf_mutex);
  486. return rc ? rc : count;
  487. }
  488. static ssize_t qeth_l3_dev_ipato_del4_store(struct device *dev,
  489. struct device_attribute *attr, const char *buf, size_t count)
  490. {
  491. struct qeth_card *card = dev_get_drvdata(dev);
  492. if (!card)
  493. return -EINVAL;
  494. return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV4);
  495. }
  496. static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,
  497. qeth_l3_dev_ipato_del4_store);
  498. static ssize_t qeth_l3_dev_ipato_invert6_show(struct device *dev,
  499. struct device_attribute *attr, char *buf)
  500. {
  501. struct qeth_card *card = dev_get_drvdata(dev);
  502. if (!card)
  503. return -EINVAL;
  504. return sprintf(buf, "%i\n", card->ipato.invert6? 1:0);
  505. }
  506. static ssize_t qeth_l3_dev_ipato_invert6_store(struct device *dev,
  507. struct device_attribute *attr, const char *buf, size_t count)
  508. {
  509. struct qeth_card *card = dev_get_drvdata(dev);
  510. int rc = 0;
  511. if (!card)
  512. return -EINVAL;
  513. mutex_lock(&card->conf_mutex);
  514. if (sysfs_streq(buf, "toggle"))
  515. card->ipato.invert6 = (card->ipato.invert6)? 0 : 1;
  516. else if (sysfs_streq(buf, "1"))
  517. card->ipato.invert6 = 1;
  518. else if (sysfs_streq(buf, "0"))
  519. card->ipato.invert6 = 0;
  520. else
  521. rc = -EINVAL;
  522. mutex_unlock(&card->conf_mutex);
  523. return rc ? rc : count;
  524. }
  525. static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
  526. qeth_l3_dev_ipato_invert6_show,
  527. qeth_l3_dev_ipato_invert6_store);
  528. static ssize_t qeth_l3_dev_ipato_add6_show(struct device *dev,
  529. struct device_attribute *attr, char *buf)
  530. {
  531. struct qeth_card *card = dev_get_drvdata(dev);
  532. if (!card)
  533. return -EINVAL;
  534. return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);
  535. }
  536. static ssize_t qeth_l3_dev_ipato_add6_store(struct device *dev,
  537. struct device_attribute *attr, const char *buf, size_t count)
  538. {
  539. struct qeth_card *card = dev_get_drvdata(dev);
  540. if (!card)
  541. return -EINVAL;
  542. return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);
  543. }
  544. static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
  545. qeth_l3_dev_ipato_add6_show,
  546. qeth_l3_dev_ipato_add6_store);
  547. static ssize_t qeth_l3_dev_ipato_del6_store(struct device *dev,
  548. struct device_attribute *attr, const char *buf, size_t count)
  549. {
  550. struct qeth_card *card = dev_get_drvdata(dev);
  551. if (!card)
  552. return -EINVAL;
  553. return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);
  554. }
  555. static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,
  556. qeth_l3_dev_ipato_del6_store);
  557. static struct attribute *qeth_ipato_device_attrs[] = {
  558. &dev_attr_ipato_enable.attr,
  559. &dev_attr_ipato_invert4.attr,
  560. &dev_attr_ipato_add4.attr,
  561. &dev_attr_ipato_del4.attr,
  562. &dev_attr_ipato_invert6.attr,
  563. &dev_attr_ipato_add6.attr,
  564. &dev_attr_ipato_del6.attr,
  565. NULL,
  566. };
  567. static const struct attribute_group qeth_device_ipato_group = {
  568. .name = "ipa_takeover",
  569. .attrs = qeth_ipato_device_attrs,
  570. };
  571. static ssize_t qeth_l3_dev_vipa_add_show(char *buf, struct qeth_card *card,
  572. enum qeth_prot_versions proto)
  573. {
  574. struct qeth_ipaddr *ipaddr;
  575. char addr_str[40];
  576. int str_len = 0;
  577. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  578. int i;
  579. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  580. entry_len += 2; /* \n + terminator */
  581. spin_lock_bh(&card->ip_lock);
  582. hash_for_each(card->ip_htable, i, ipaddr, hnode) {
  583. if (ipaddr->proto != proto)
  584. continue;
  585. if (ipaddr->type != QETH_IP_TYPE_VIPA)
  586. continue;
  587. /* String must not be longer than PAGE_SIZE. So we check if
  588. * string length gets near PAGE_SIZE. Then we can savely display
  589. * the next IPv6 address (worst case, compared to IPv4) */
  590. if ((PAGE_SIZE - str_len) <= entry_len)
  591. break;
  592. qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
  593. addr_str);
  594. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "%s\n",
  595. addr_str);
  596. }
  597. spin_unlock_bh(&card->ip_lock);
  598. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "\n");
  599. return str_len;
  600. }
  601. static ssize_t qeth_l3_dev_vipa_add4_show(struct device *dev,
  602. struct device_attribute *attr, char *buf)
  603. {
  604. struct qeth_card *card = dev_get_drvdata(dev);
  605. if (!card)
  606. return -EINVAL;
  607. return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV4);
  608. }
  609. static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto,
  610. u8 *addr)
  611. {
  612. if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
  613. return -EINVAL;
  614. }
  615. return 0;
  616. }
  617. static ssize_t qeth_l3_dev_vipa_add_store(const char *buf, size_t count,
  618. struct qeth_card *card, enum qeth_prot_versions proto)
  619. {
  620. u8 addr[16] = {0, };
  621. int rc;
  622. mutex_lock(&card->conf_mutex);
  623. rc = qeth_l3_parse_vipae(buf, proto, addr);
  624. if (!rc)
  625. rc = qeth_l3_add_vipa(card, proto, addr);
  626. mutex_unlock(&card->conf_mutex);
  627. return rc ? rc : count;
  628. }
  629. static ssize_t qeth_l3_dev_vipa_add4_store(struct device *dev,
  630. struct device_attribute *attr, const char *buf, size_t count)
  631. {
  632. struct qeth_card *card = dev_get_drvdata(dev);
  633. if (!card)
  634. return -EINVAL;
  635. return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);
  636. }
  637. static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,
  638. qeth_l3_dev_vipa_add4_show,
  639. qeth_l3_dev_vipa_add4_store);
  640. static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count,
  641. struct qeth_card *card, enum qeth_prot_versions proto)
  642. {
  643. u8 addr[16];
  644. int rc;
  645. mutex_lock(&card->conf_mutex);
  646. rc = qeth_l3_parse_vipae(buf, proto, addr);
  647. if (!rc)
  648. qeth_l3_del_vipa(card, proto, addr);
  649. mutex_unlock(&card->conf_mutex);
  650. return rc ? rc : count;
  651. }
  652. static ssize_t qeth_l3_dev_vipa_del4_store(struct device *dev,
  653. struct device_attribute *attr, const char *buf, size_t count)
  654. {
  655. struct qeth_card *card = dev_get_drvdata(dev);
  656. if (!card)
  657. return -EINVAL;
  658. return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);
  659. }
  660. static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
  661. qeth_l3_dev_vipa_del4_store);
  662. static ssize_t qeth_l3_dev_vipa_add6_show(struct device *dev,
  663. struct device_attribute *attr, char *buf)
  664. {
  665. struct qeth_card *card = dev_get_drvdata(dev);
  666. if (!card)
  667. return -EINVAL;
  668. return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV6);
  669. }
  670. static ssize_t qeth_l3_dev_vipa_add6_store(struct device *dev,
  671. struct device_attribute *attr, const char *buf, size_t count)
  672. {
  673. struct qeth_card *card = dev_get_drvdata(dev);
  674. if (!card)
  675. return -EINVAL;
  676. return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);
  677. }
  678. static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
  679. qeth_l3_dev_vipa_add6_show,
  680. qeth_l3_dev_vipa_add6_store);
  681. static ssize_t qeth_l3_dev_vipa_del6_store(struct device *dev,
  682. struct device_attribute *attr, const char *buf, size_t count)
  683. {
  684. struct qeth_card *card = dev_get_drvdata(dev);
  685. if (!card)
  686. return -EINVAL;
  687. return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);
  688. }
  689. static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,
  690. qeth_l3_dev_vipa_del6_store);
  691. static struct attribute *qeth_vipa_device_attrs[] = {
  692. &dev_attr_vipa_add4.attr,
  693. &dev_attr_vipa_del4.attr,
  694. &dev_attr_vipa_add6.attr,
  695. &dev_attr_vipa_del6.attr,
  696. NULL,
  697. };
  698. static const struct attribute_group qeth_device_vipa_group = {
  699. .name = "vipa",
  700. .attrs = qeth_vipa_device_attrs,
  701. };
  702. static ssize_t qeth_l3_dev_rxip_add_show(char *buf, struct qeth_card *card,
  703. enum qeth_prot_versions proto)
  704. {
  705. struct qeth_ipaddr *ipaddr;
  706. char addr_str[40];
  707. int str_len = 0;
  708. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  709. int i;
  710. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  711. entry_len += 2; /* \n + terminator */
  712. spin_lock_bh(&card->ip_lock);
  713. hash_for_each(card->ip_htable, i, ipaddr, hnode) {
  714. if (ipaddr->proto != proto)
  715. continue;
  716. if (ipaddr->type != QETH_IP_TYPE_RXIP)
  717. continue;
  718. /* String must not be longer than PAGE_SIZE. So we check if
  719. * string length gets near PAGE_SIZE. Then we can savely display
  720. * the next IPv6 address (worst case, compared to IPv4) */
  721. if ((PAGE_SIZE - str_len) <= entry_len)
  722. break;
  723. qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
  724. addr_str);
  725. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "%s\n",
  726. addr_str);
  727. }
  728. spin_unlock_bh(&card->ip_lock);
  729. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "\n");
  730. return str_len;
  731. }
  732. static ssize_t qeth_l3_dev_rxip_add4_show(struct device *dev,
  733. struct device_attribute *attr, char *buf)
  734. {
  735. struct qeth_card *card = dev_get_drvdata(dev);
  736. if (!card)
  737. return -EINVAL;
  738. return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV4);
  739. }
  740. static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto,
  741. u8 *addr)
  742. {
  743. __be32 ipv4_addr;
  744. struct in6_addr ipv6_addr;
  745. if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
  746. return -EINVAL;
  747. }
  748. if (proto == QETH_PROT_IPV4) {
  749. memcpy(&ipv4_addr, addr, sizeof(ipv4_addr));
  750. if (ipv4_is_multicast(ipv4_addr)) {
  751. QETH_DBF_MESSAGE(2, "multicast rxip not supported.\n");
  752. return -EINVAL;
  753. }
  754. } else if (proto == QETH_PROT_IPV6) {
  755. memcpy(&ipv6_addr, addr, sizeof(ipv6_addr));
  756. if (ipv6_addr_is_multicast(&ipv6_addr)) {
  757. QETH_DBF_MESSAGE(2, "multicast rxip not supported.\n");
  758. return -EINVAL;
  759. }
  760. }
  761. return 0;
  762. }
  763. static ssize_t qeth_l3_dev_rxip_add_store(const char *buf, size_t count,
  764. struct qeth_card *card, enum qeth_prot_versions proto)
  765. {
  766. u8 addr[16] = {0, };
  767. int rc;
  768. mutex_lock(&card->conf_mutex);
  769. rc = qeth_l3_parse_rxipe(buf, proto, addr);
  770. if (!rc)
  771. rc = qeth_l3_add_rxip(card, proto, addr);
  772. mutex_unlock(&card->conf_mutex);
  773. return rc ? rc : count;
  774. }
  775. static ssize_t qeth_l3_dev_rxip_add4_store(struct device *dev,
  776. struct device_attribute *attr, const char *buf, size_t count)
  777. {
  778. struct qeth_card *card = dev_get_drvdata(dev);
  779. if (!card)
  780. return -EINVAL;
  781. return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);
  782. }
  783. static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,
  784. qeth_l3_dev_rxip_add4_show,
  785. qeth_l3_dev_rxip_add4_store);
  786. static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count,
  787. struct qeth_card *card, enum qeth_prot_versions proto)
  788. {
  789. u8 addr[16];
  790. int rc;
  791. mutex_lock(&card->conf_mutex);
  792. rc = qeth_l3_parse_rxipe(buf, proto, addr);
  793. if (!rc)
  794. qeth_l3_del_rxip(card, proto, addr);
  795. mutex_unlock(&card->conf_mutex);
  796. return rc ? rc : count;
  797. }
  798. static ssize_t qeth_l3_dev_rxip_del4_store(struct device *dev,
  799. struct device_attribute *attr, const char *buf, size_t count)
  800. {
  801. struct qeth_card *card = dev_get_drvdata(dev);
  802. if (!card)
  803. return -EINVAL;
  804. return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);
  805. }
  806. static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
  807. qeth_l3_dev_rxip_del4_store);
  808. static ssize_t qeth_l3_dev_rxip_add6_show(struct device *dev,
  809. struct device_attribute *attr, char *buf)
  810. {
  811. struct qeth_card *card = dev_get_drvdata(dev);
  812. if (!card)
  813. return -EINVAL;
  814. return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV6);
  815. }
  816. static ssize_t qeth_l3_dev_rxip_add6_store(struct device *dev,
  817. struct device_attribute *attr, const char *buf, size_t count)
  818. {
  819. struct qeth_card *card = dev_get_drvdata(dev);
  820. if (!card)
  821. return -EINVAL;
  822. return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);
  823. }
  824. static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
  825. qeth_l3_dev_rxip_add6_show,
  826. qeth_l3_dev_rxip_add6_store);
  827. static ssize_t qeth_l3_dev_rxip_del6_store(struct device *dev,
  828. struct device_attribute *attr, const char *buf, size_t count)
  829. {
  830. struct qeth_card *card = dev_get_drvdata(dev);
  831. if (!card)
  832. return -EINVAL;
  833. return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);
  834. }
  835. static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,
  836. qeth_l3_dev_rxip_del6_store);
  837. static struct attribute *qeth_rxip_device_attrs[] = {
  838. &dev_attr_rxip_add4.attr,
  839. &dev_attr_rxip_del4.attr,
  840. &dev_attr_rxip_add6.attr,
  841. &dev_attr_rxip_del6.attr,
  842. NULL,
  843. };
  844. static const struct attribute_group qeth_device_rxip_group = {
  845. .name = "rxip",
  846. .attrs = qeth_rxip_device_attrs,
  847. };
  848. int qeth_l3_create_device_attributes(struct device *dev)
  849. {
  850. int ret;
  851. ret = sysfs_create_group(&dev->kobj, &qeth_l3_device_attr_group);
  852. if (ret)
  853. return ret;
  854. ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group);
  855. if (ret) {
  856. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  857. return ret;
  858. }
  859. ret = sysfs_create_group(&dev->kobj, &qeth_device_vipa_group);
  860. if (ret) {
  861. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  862. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  863. return ret;
  864. }
  865. ret = sysfs_create_group(&dev->kobj, &qeth_device_rxip_group);
  866. if (ret) {
  867. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  868. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  869. sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
  870. return ret;
  871. }
  872. return 0;
  873. }
  874. void qeth_l3_remove_device_attributes(struct device *dev)
  875. {
  876. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  877. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  878. sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
  879. sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group);
  880. }
  881. const struct attribute_group *qeth_l3_attr_groups[] = {
  882. &qeth_device_attr_group,
  883. &qeth_device_blkt_group,
  884. /* l3 specific, see l3_{create,remove}_device_attributes(): */
  885. &qeth_l3_device_attr_group,
  886. &qeth_device_ipato_group,
  887. &qeth_device_vipa_group,
  888. &qeth_device_rxip_group,
  889. NULL,
  890. };