qeth_l3_sys.c 26 KB

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