qeth_l3_sys.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  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. if (card->state == CARD_STATE_DOWN)
  213. return -EPERM;
  214. memcpy(tmp_hsuid, card->options.hsuid, sizeof(tmp_hsuid));
  215. EBCASC(tmp_hsuid, 8);
  216. return sprintf(buf, "%s\n", tmp_hsuid);
  217. }
  218. static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
  219. struct device_attribute *attr, const char *buf, size_t count)
  220. {
  221. struct qeth_card *card = dev_get_drvdata(dev);
  222. struct qeth_ipaddr *addr;
  223. char *tmp;
  224. int i;
  225. if (!card)
  226. return -EINVAL;
  227. if (card->info.type != QETH_CARD_TYPE_IQD)
  228. return -EPERM;
  229. if (card->state != CARD_STATE_DOWN &&
  230. card->state != CARD_STATE_RECOVER)
  231. return -EPERM;
  232. if (card->options.sniffer)
  233. return -EPERM;
  234. if (card->options.cq == QETH_CQ_NOTAVAILABLE)
  235. return -EPERM;
  236. tmp = strsep((char **)&buf, "\n");
  237. if (strlen(tmp) > 8)
  238. return -EINVAL;
  239. if (card->options.hsuid[0]) {
  240. /* delete old ip address */
  241. addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
  242. if (!addr)
  243. return -ENOMEM;
  244. addr->u.a6.addr.s6_addr32[0] = 0xfe800000;
  245. addr->u.a6.addr.s6_addr32[1] = 0x00000000;
  246. for (i = 8; i < 16; i++)
  247. addr->u.a6.addr.s6_addr[i] =
  248. card->options.hsuid[i - 8];
  249. addr->u.a6.pfxlen = 0;
  250. addr->type = QETH_IP_TYPE_NORMAL;
  251. spin_lock_bh(&card->ip_lock);
  252. qeth_l3_delete_ip(card, addr);
  253. spin_unlock_bh(&card->ip_lock);
  254. kfree(addr);
  255. }
  256. if (strlen(tmp) == 0) {
  257. /* delete ip address only */
  258. card->options.hsuid[0] = '\0';
  259. if (card->dev)
  260. memcpy(card->dev->perm_addr, card->options.hsuid, 9);
  261. qeth_configure_cq(card, QETH_CQ_DISABLED);
  262. return count;
  263. }
  264. if (qeth_configure_cq(card, QETH_CQ_ENABLED))
  265. return -EPERM;
  266. snprintf(card->options.hsuid, sizeof(card->options.hsuid),
  267. "%-8s", tmp);
  268. ASCEBC(card->options.hsuid, 8);
  269. if (card->dev)
  270. memcpy(card->dev->perm_addr, card->options.hsuid, 9);
  271. addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
  272. if (addr != NULL) {
  273. addr->u.a6.addr.s6_addr32[0] = 0xfe800000;
  274. addr->u.a6.addr.s6_addr32[1] = 0x00000000;
  275. for (i = 8; i < 16; i++)
  276. addr->u.a6.addr.s6_addr[i] = card->options.hsuid[i - 8];
  277. addr->u.a6.pfxlen = 0;
  278. addr->type = QETH_IP_TYPE_NORMAL;
  279. } else
  280. return -ENOMEM;
  281. spin_lock_bh(&card->ip_lock);
  282. qeth_l3_add_ip(card, addr);
  283. spin_unlock_bh(&card->ip_lock);
  284. kfree(addr);
  285. return count;
  286. }
  287. static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
  288. qeth_l3_dev_hsuid_store);
  289. static struct attribute *qeth_l3_device_attrs[] = {
  290. &dev_attr_route4.attr,
  291. &dev_attr_route6.attr,
  292. &dev_attr_fake_broadcast.attr,
  293. &dev_attr_sniffer.attr,
  294. &dev_attr_hsuid.attr,
  295. NULL,
  296. };
  297. static struct attribute_group qeth_l3_device_attr_group = {
  298. .attrs = qeth_l3_device_attrs,
  299. };
  300. static ssize_t qeth_l3_dev_ipato_enable_show(struct device *dev,
  301. struct device_attribute *attr, char *buf)
  302. {
  303. struct qeth_card *card = dev_get_drvdata(dev);
  304. if (!card)
  305. return -EINVAL;
  306. return sprintf(buf, "%i\n", card->ipato.enabled? 1:0);
  307. }
  308. static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
  309. struct device_attribute *attr, const char *buf, size_t count)
  310. {
  311. struct qeth_card *card = dev_get_drvdata(dev);
  312. bool enable;
  313. int rc = 0;
  314. if (!card)
  315. return -EINVAL;
  316. mutex_lock(&card->conf_mutex);
  317. if ((card->state != CARD_STATE_DOWN) &&
  318. (card->state != CARD_STATE_RECOVER)) {
  319. rc = -EPERM;
  320. goto out;
  321. }
  322. if (sysfs_streq(buf, "toggle")) {
  323. enable = !card->ipato.enabled;
  324. } else if (kstrtobool(buf, &enable)) {
  325. rc = -EINVAL;
  326. goto out;
  327. }
  328. if (card->ipato.enabled != enable) {
  329. card->ipato.enabled = enable;
  330. spin_lock_bh(&card->ip_lock);
  331. qeth_l3_update_ipato(card);
  332. spin_unlock_bh(&card->ip_lock);
  333. }
  334. out:
  335. mutex_unlock(&card->conf_mutex);
  336. return rc ? rc : count;
  337. }
  338. static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
  339. qeth_l3_dev_ipato_enable_show,
  340. qeth_l3_dev_ipato_enable_store);
  341. static ssize_t qeth_l3_dev_ipato_invert4_show(struct device *dev,
  342. struct device_attribute *attr, char *buf)
  343. {
  344. struct qeth_card *card = dev_get_drvdata(dev);
  345. if (!card)
  346. return -EINVAL;
  347. return sprintf(buf, "%i\n", card->ipato.invert4? 1:0);
  348. }
  349. static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev,
  350. struct device_attribute *attr,
  351. const char *buf, size_t count)
  352. {
  353. struct qeth_card *card = dev_get_drvdata(dev);
  354. bool invert;
  355. int rc = 0;
  356. if (!card)
  357. return -EINVAL;
  358. mutex_lock(&card->conf_mutex);
  359. if (sysfs_streq(buf, "toggle")) {
  360. invert = !card->ipato.invert4;
  361. } else if (kstrtobool(buf, &invert)) {
  362. rc = -EINVAL;
  363. goto out;
  364. }
  365. if (card->ipato.invert4 != invert) {
  366. card->ipato.invert4 = invert;
  367. spin_lock_bh(&card->ip_lock);
  368. qeth_l3_update_ipato(card);
  369. spin_unlock_bh(&card->ip_lock);
  370. }
  371. out:
  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. bool invert;
  511. int rc = 0;
  512. if (!card)
  513. return -EINVAL;
  514. mutex_lock(&card->conf_mutex);
  515. if (sysfs_streq(buf, "toggle")) {
  516. invert = !card->ipato.invert6;
  517. } else if (kstrtobool(buf, &invert)) {
  518. rc = -EINVAL;
  519. goto out;
  520. }
  521. if (card->ipato.invert6 != invert) {
  522. card->ipato.invert6 = invert;
  523. spin_lock_bh(&card->ip_lock);
  524. qeth_l3_update_ipato(card);
  525. spin_unlock_bh(&card->ip_lock);
  526. }
  527. out:
  528. mutex_unlock(&card->conf_mutex);
  529. return rc ? rc : count;
  530. }
  531. static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
  532. qeth_l3_dev_ipato_invert6_show,
  533. qeth_l3_dev_ipato_invert6_store);
  534. static ssize_t qeth_l3_dev_ipato_add6_show(struct device *dev,
  535. struct device_attribute *attr, char *buf)
  536. {
  537. struct qeth_card *card = dev_get_drvdata(dev);
  538. if (!card)
  539. return -EINVAL;
  540. return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);
  541. }
  542. static ssize_t qeth_l3_dev_ipato_add6_store(struct device *dev,
  543. struct device_attribute *attr, const char *buf, size_t count)
  544. {
  545. struct qeth_card *card = dev_get_drvdata(dev);
  546. if (!card)
  547. return -EINVAL;
  548. return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);
  549. }
  550. static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
  551. qeth_l3_dev_ipato_add6_show,
  552. qeth_l3_dev_ipato_add6_store);
  553. static ssize_t qeth_l3_dev_ipato_del6_store(struct device *dev,
  554. struct device_attribute *attr, const char *buf, size_t count)
  555. {
  556. struct qeth_card *card = dev_get_drvdata(dev);
  557. if (!card)
  558. return -EINVAL;
  559. return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);
  560. }
  561. static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,
  562. qeth_l3_dev_ipato_del6_store);
  563. static struct attribute *qeth_ipato_device_attrs[] = {
  564. &dev_attr_ipato_enable.attr,
  565. &dev_attr_ipato_invert4.attr,
  566. &dev_attr_ipato_add4.attr,
  567. &dev_attr_ipato_del4.attr,
  568. &dev_attr_ipato_invert6.attr,
  569. &dev_attr_ipato_add6.attr,
  570. &dev_attr_ipato_del6.attr,
  571. NULL,
  572. };
  573. static struct attribute_group qeth_device_ipato_group = {
  574. .name = "ipa_takeover",
  575. .attrs = qeth_ipato_device_attrs,
  576. };
  577. static ssize_t qeth_l3_dev_vipa_add_show(char *buf, struct qeth_card *card,
  578. enum qeth_prot_versions proto)
  579. {
  580. struct qeth_ipaddr *ipaddr;
  581. char addr_str[40];
  582. int str_len = 0;
  583. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  584. int i;
  585. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  586. entry_len += 2; /* \n + terminator */
  587. spin_lock_bh(&card->ip_lock);
  588. hash_for_each(card->ip_htable, i, ipaddr, hnode) {
  589. if (ipaddr->proto != proto)
  590. continue;
  591. if (ipaddr->type != QETH_IP_TYPE_VIPA)
  592. continue;
  593. /* String must not be longer than PAGE_SIZE. So we check if
  594. * string length gets near PAGE_SIZE. Then we can savely display
  595. * the next IPv6 address (worst case, compared to IPv4) */
  596. if ((PAGE_SIZE - str_len) <= entry_len)
  597. break;
  598. qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
  599. addr_str);
  600. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "%s\n",
  601. addr_str);
  602. }
  603. spin_unlock_bh(&card->ip_lock);
  604. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "\n");
  605. return str_len;
  606. }
  607. static ssize_t qeth_l3_dev_vipa_add4_show(struct device *dev,
  608. struct device_attribute *attr, char *buf)
  609. {
  610. struct qeth_card *card = dev_get_drvdata(dev);
  611. if (!card)
  612. return -EINVAL;
  613. return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV4);
  614. }
  615. static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto,
  616. u8 *addr)
  617. {
  618. if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
  619. return -EINVAL;
  620. }
  621. return 0;
  622. }
  623. static ssize_t qeth_l3_dev_vipa_add_store(const char *buf, size_t count,
  624. struct qeth_card *card, enum qeth_prot_versions proto)
  625. {
  626. u8 addr[16] = {0, };
  627. int rc;
  628. mutex_lock(&card->conf_mutex);
  629. rc = qeth_l3_parse_vipae(buf, proto, addr);
  630. if (!rc)
  631. rc = qeth_l3_add_vipa(card, proto, addr);
  632. mutex_unlock(&card->conf_mutex);
  633. return rc ? rc : count;
  634. }
  635. static ssize_t qeth_l3_dev_vipa_add4_store(struct device *dev,
  636. struct device_attribute *attr, const char *buf, size_t count)
  637. {
  638. struct qeth_card *card = dev_get_drvdata(dev);
  639. if (!card)
  640. return -EINVAL;
  641. return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);
  642. }
  643. static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,
  644. qeth_l3_dev_vipa_add4_show,
  645. qeth_l3_dev_vipa_add4_store);
  646. static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count,
  647. struct qeth_card *card, enum qeth_prot_versions proto)
  648. {
  649. u8 addr[16];
  650. int rc;
  651. mutex_lock(&card->conf_mutex);
  652. rc = qeth_l3_parse_vipae(buf, proto, addr);
  653. if (!rc)
  654. qeth_l3_del_vipa(card, proto, addr);
  655. mutex_unlock(&card->conf_mutex);
  656. return rc ? rc : count;
  657. }
  658. static ssize_t qeth_l3_dev_vipa_del4_store(struct device *dev,
  659. struct device_attribute *attr, const char *buf, size_t count)
  660. {
  661. struct qeth_card *card = dev_get_drvdata(dev);
  662. if (!card)
  663. return -EINVAL;
  664. return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);
  665. }
  666. static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
  667. qeth_l3_dev_vipa_del4_store);
  668. static ssize_t qeth_l3_dev_vipa_add6_show(struct device *dev,
  669. struct device_attribute *attr, char *buf)
  670. {
  671. struct qeth_card *card = dev_get_drvdata(dev);
  672. if (!card)
  673. return -EINVAL;
  674. return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV6);
  675. }
  676. static ssize_t qeth_l3_dev_vipa_add6_store(struct device *dev,
  677. struct device_attribute *attr, const char *buf, size_t count)
  678. {
  679. struct qeth_card *card = dev_get_drvdata(dev);
  680. if (!card)
  681. return -EINVAL;
  682. return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);
  683. }
  684. static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
  685. qeth_l3_dev_vipa_add6_show,
  686. qeth_l3_dev_vipa_add6_store);
  687. static ssize_t qeth_l3_dev_vipa_del6_store(struct device *dev,
  688. struct device_attribute *attr, const char *buf, size_t count)
  689. {
  690. struct qeth_card *card = dev_get_drvdata(dev);
  691. if (!card)
  692. return -EINVAL;
  693. return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);
  694. }
  695. static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,
  696. qeth_l3_dev_vipa_del6_store);
  697. static struct attribute *qeth_vipa_device_attrs[] = {
  698. &dev_attr_vipa_add4.attr,
  699. &dev_attr_vipa_del4.attr,
  700. &dev_attr_vipa_add6.attr,
  701. &dev_attr_vipa_del6.attr,
  702. NULL,
  703. };
  704. static struct attribute_group qeth_device_vipa_group = {
  705. .name = "vipa",
  706. .attrs = qeth_vipa_device_attrs,
  707. };
  708. static ssize_t qeth_l3_dev_rxip_add_show(char *buf, struct qeth_card *card,
  709. enum qeth_prot_versions proto)
  710. {
  711. struct qeth_ipaddr *ipaddr;
  712. char addr_str[40];
  713. int str_len = 0;
  714. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  715. int i;
  716. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  717. entry_len += 2; /* \n + terminator */
  718. spin_lock_bh(&card->ip_lock);
  719. hash_for_each(card->ip_htable, i, ipaddr, hnode) {
  720. if (ipaddr->proto != proto)
  721. continue;
  722. if (ipaddr->type != QETH_IP_TYPE_RXIP)
  723. continue;
  724. /* String must not be longer than PAGE_SIZE. So we check if
  725. * string length gets near PAGE_SIZE. Then we can savely display
  726. * the next IPv6 address (worst case, compared to IPv4) */
  727. if ((PAGE_SIZE - str_len) <= entry_len)
  728. break;
  729. qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
  730. addr_str);
  731. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "%s\n",
  732. addr_str);
  733. }
  734. spin_unlock_bh(&card->ip_lock);
  735. str_len += snprintf(buf + str_len, PAGE_SIZE - str_len, "\n");
  736. return str_len;
  737. }
  738. static ssize_t qeth_l3_dev_rxip_add4_show(struct device *dev,
  739. struct device_attribute *attr, char *buf)
  740. {
  741. struct qeth_card *card = dev_get_drvdata(dev);
  742. if (!card)
  743. return -EINVAL;
  744. return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV4);
  745. }
  746. static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto,
  747. u8 *addr)
  748. {
  749. if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
  750. return -EINVAL;
  751. }
  752. return 0;
  753. }
  754. static ssize_t qeth_l3_dev_rxip_add_store(const char *buf, size_t count,
  755. struct qeth_card *card, enum qeth_prot_versions proto)
  756. {
  757. u8 addr[16] = {0, };
  758. int rc;
  759. mutex_lock(&card->conf_mutex);
  760. rc = qeth_l3_parse_rxipe(buf, proto, addr);
  761. if (!rc)
  762. rc = qeth_l3_add_rxip(card, proto, addr);
  763. mutex_unlock(&card->conf_mutex);
  764. return rc ? rc : count;
  765. }
  766. static ssize_t qeth_l3_dev_rxip_add4_store(struct device *dev,
  767. struct device_attribute *attr, const char *buf, size_t count)
  768. {
  769. struct qeth_card *card = dev_get_drvdata(dev);
  770. if (!card)
  771. return -EINVAL;
  772. return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);
  773. }
  774. static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,
  775. qeth_l3_dev_rxip_add4_show,
  776. qeth_l3_dev_rxip_add4_store);
  777. static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count,
  778. struct qeth_card *card, enum qeth_prot_versions proto)
  779. {
  780. u8 addr[16];
  781. int rc;
  782. mutex_lock(&card->conf_mutex);
  783. rc = qeth_l3_parse_rxipe(buf, proto, addr);
  784. if (!rc)
  785. qeth_l3_del_rxip(card, proto, addr);
  786. mutex_unlock(&card->conf_mutex);
  787. return rc ? rc : count;
  788. }
  789. static ssize_t qeth_l3_dev_rxip_del4_store(struct device *dev,
  790. struct device_attribute *attr, const char *buf, size_t count)
  791. {
  792. struct qeth_card *card = dev_get_drvdata(dev);
  793. if (!card)
  794. return -EINVAL;
  795. return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);
  796. }
  797. static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
  798. qeth_l3_dev_rxip_del4_store);
  799. static ssize_t qeth_l3_dev_rxip_add6_show(struct device *dev,
  800. struct device_attribute *attr, char *buf)
  801. {
  802. struct qeth_card *card = dev_get_drvdata(dev);
  803. if (!card)
  804. return -EINVAL;
  805. return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV6);
  806. }
  807. static ssize_t qeth_l3_dev_rxip_add6_store(struct device *dev,
  808. struct device_attribute *attr, const char *buf, size_t count)
  809. {
  810. struct qeth_card *card = dev_get_drvdata(dev);
  811. if (!card)
  812. return -EINVAL;
  813. return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);
  814. }
  815. static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
  816. qeth_l3_dev_rxip_add6_show,
  817. qeth_l3_dev_rxip_add6_store);
  818. static ssize_t qeth_l3_dev_rxip_del6_store(struct device *dev,
  819. struct device_attribute *attr, const char *buf, size_t count)
  820. {
  821. struct qeth_card *card = dev_get_drvdata(dev);
  822. if (!card)
  823. return -EINVAL;
  824. return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);
  825. }
  826. static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,
  827. qeth_l3_dev_rxip_del6_store);
  828. static struct attribute *qeth_rxip_device_attrs[] = {
  829. &dev_attr_rxip_add4.attr,
  830. &dev_attr_rxip_del4.attr,
  831. &dev_attr_rxip_add6.attr,
  832. &dev_attr_rxip_del6.attr,
  833. NULL,
  834. };
  835. static struct attribute_group qeth_device_rxip_group = {
  836. .name = "rxip",
  837. .attrs = qeth_rxip_device_attrs,
  838. };
  839. int qeth_l3_create_device_attributes(struct device *dev)
  840. {
  841. int ret;
  842. ret = sysfs_create_group(&dev->kobj, &qeth_l3_device_attr_group);
  843. if (ret)
  844. return ret;
  845. ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group);
  846. if (ret) {
  847. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  848. return ret;
  849. }
  850. ret = sysfs_create_group(&dev->kobj, &qeth_device_vipa_group);
  851. if (ret) {
  852. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  853. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  854. return ret;
  855. }
  856. ret = sysfs_create_group(&dev->kobj, &qeth_device_rxip_group);
  857. if (ret) {
  858. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  859. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  860. sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
  861. return ret;
  862. }
  863. return 0;
  864. }
  865. void qeth_l3_remove_device_attributes(struct device *dev)
  866. {
  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. sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group);
  871. }