qeth_l3_sys.c 27 KB

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