qeth_l3_sys.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  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. qeth_l3_delete_ip(card, addr);
  252. kfree(addr);
  253. }
  254. if (strlen(tmp) == 0) {
  255. /* delete ip address only */
  256. card->options.hsuid[0] = '\0';
  257. if (card->dev)
  258. memcpy(card->dev->perm_addr, card->options.hsuid, 9);
  259. qeth_configure_cq(card, QETH_CQ_DISABLED);
  260. return count;
  261. }
  262. if (qeth_configure_cq(card, QETH_CQ_ENABLED))
  263. return -EPERM;
  264. snprintf(card->options.hsuid, sizeof(card->options.hsuid),
  265. "%-8s", tmp);
  266. ASCEBC(card->options.hsuid, 8);
  267. if (card->dev)
  268. memcpy(card->dev->perm_addr, card->options.hsuid, 9);
  269. addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
  270. if (addr != NULL) {
  271. addr->u.a6.addr.s6_addr32[0] = 0xfe800000;
  272. addr->u.a6.addr.s6_addr32[1] = 0x00000000;
  273. for (i = 8; i < 16; i++)
  274. addr->u.a6.addr.s6_addr[i] = card->options.hsuid[i - 8];
  275. addr->u.a6.pfxlen = 0;
  276. addr->type = QETH_IP_TYPE_NORMAL;
  277. } else
  278. return -ENOMEM;
  279. qeth_l3_add_ip(card, addr);
  280. kfree(addr);
  281. return count;
  282. }
  283. static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
  284. qeth_l3_dev_hsuid_store);
  285. static struct attribute *qeth_l3_device_attrs[] = {
  286. &dev_attr_route4.attr,
  287. &dev_attr_route6.attr,
  288. &dev_attr_fake_broadcast.attr,
  289. &dev_attr_sniffer.attr,
  290. &dev_attr_hsuid.attr,
  291. NULL,
  292. };
  293. static struct attribute_group qeth_l3_device_attr_group = {
  294. .attrs = qeth_l3_device_attrs,
  295. };
  296. static ssize_t qeth_l3_dev_ipato_enable_show(struct device *dev,
  297. struct device_attribute *attr, char *buf)
  298. {
  299. struct qeth_card *card = dev_get_drvdata(dev);
  300. if (!card)
  301. return -EINVAL;
  302. return sprintf(buf, "%i\n", card->ipato.enabled? 1:0);
  303. }
  304. static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
  305. struct device_attribute *attr, const char *buf, size_t count)
  306. {
  307. struct qeth_card *card = dev_get_drvdata(dev);
  308. struct qeth_ipaddr *addr;
  309. int i, rc = 0;
  310. if (!card)
  311. return -EINVAL;
  312. mutex_lock(&card->conf_mutex);
  313. if ((card->state != CARD_STATE_DOWN) &&
  314. (card->state != CARD_STATE_RECOVER)) {
  315. rc = -EPERM;
  316. goto out;
  317. }
  318. if (sysfs_streq(buf, "toggle")) {
  319. card->ipato.enabled = (card->ipato.enabled)? 0 : 1;
  320. } else if (sysfs_streq(buf, "1")) {
  321. card->ipato.enabled = 1;
  322. hash_for_each(card->ip_htable, i, addr, hnode) {
  323. if ((addr->type == QETH_IP_TYPE_NORMAL) &&
  324. qeth_l3_is_addr_covered_by_ipato(card, addr))
  325. addr->set_flags |=
  326. QETH_IPA_SETIP_TAKEOVER_FLAG;
  327. }
  328. } else if (sysfs_streq(buf, "0")) {
  329. card->ipato.enabled = 0;
  330. hash_for_each(card->ip_htable, i, addr, hnode) {
  331. if (addr->set_flags &
  332. QETH_IPA_SETIP_TAKEOVER_FLAG)
  333. addr->set_flags &=
  334. ~QETH_IPA_SETIP_TAKEOVER_FLAG;
  335. }
  336. } else
  337. rc = -EINVAL;
  338. out:
  339. mutex_unlock(&card->conf_mutex);
  340. return rc ? rc : count;
  341. }
  342. static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
  343. qeth_l3_dev_ipato_enable_show,
  344. qeth_l3_dev_ipato_enable_store);
  345. static ssize_t qeth_l3_dev_ipato_invert4_show(struct device *dev,
  346. struct device_attribute *attr, char *buf)
  347. {
  348. struct qeth_card *card = dev_get_drvdata(dev);
  349. if (!card)
  350. return -EINVAL;
  351. return sprintf(buf, "%i\n", card->ipato.invert4? 1:0);
  352. }
  353. static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev,
  354. struct device_attribute *attr,
  355. const char *buf, size_t count)
  356. {
  357. struct qeth_card *card = dev_get_drvdata(dev);
  358. int rc = 0;
  359. if (!card)
  360. return -EINVAL;
  361. mutex_lock(&card->conf_mutex);
  362. if (sysfs_streq(buf, "toggle"))
  363. card->ipato.invert4 = (card->ipato.invert4)? 0 : 1;
  364. else if (sysfs_streq(buf, "1"))
  365. card->ipato.invert4 = 1;
  366. else if (sysfs_streq(buf, "0"))
  367. card->ipato.invert4 = 0;
  368. else
  369. rc = -EINVAL;
  370. mutex_unlock(&card->conf_mutex);
  371. return rc ? rc : count;
  372. }
  373. static QETH_DEVICE_ATTR(ipato_invert4, invert4, 0644,
  374. qeth_l3_dev_ipato_invert4_show,
  375. qeth_l3_dev_ipato_invert4_store);
  376. static ssize_t qeth_l3_dev_ipato_add_show(char *buf, struct qeth_card *card,
  377. enum qeth_prot_versions proto)
  378. {
  379. struct qeth_ipato_entry *ipatoe;
  380. char addr_str[40];
  381. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  382. int i = 0;
  383. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  384. /* add strlen for "/<mask>\n" */
  385. entry_len += (proto == QETH_PROT_IPV4)? 5 : 6;
  386. spin_lock_bh(&card->ip_lock);
  387. list_for_each_entry(ipatoe, &card->ipato.entries, entry) {
  388. if (ipatoe->proto != proto)
  389. continue;
  390. /* String must not be longer than PAGE_SIZE. So we check if
  391. * string length gets near PAGE_SIZE. Then we can savely display
  392. * the next IPv6 address (worst case, compared to IPv4) */
  393. if ((PAGE_SIZE - i) <= entry_len)
  394. break;
  395. qeth_l3_ipaddr_to_string(proto, ipatoe->addr, addr_str);
  396. i += snprintf(buf + i, PAGE_SIZE - i,
  397. "%s/%i\n", addr_str, ipatoe->mask_bits);
  398. }
  399. spin_unlock_bh(&card->ip_lock);
  400. i += snprintf(buf + i, PAGE_SIZE - i, "\n");
  401. return i;
  402. }
  403. static ssize_t qeth_l3_dev_ipato_add4_show(struct device *dev,
  404. struct device_attribute *attr, char *buf)
  405. {
  406. struct qeth_card *card = dev_get_drvdata(dev);
  407. if (!card)
  408. return -EINVAL;
  409. return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV4);
  410. }
  411. static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto,
  412. u8 *addr, int *mask_bits)
  413. {
  414. const char *start, *end;
  415. char *tmp;
  416. char buffer[40] = {0, };
  417. start = buf;
  418. /* get address string */
  419. end = strchr(start, '/');
  420. if (!end || (end - start >= 40)) {
  421. return -EINVAL;
  422. }
  423. strncpy(buffer, start, end - start);
  424. if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) {
  425. return -EINVAL;
  426. }
  427. start = end + 1;
  428. *mask_bits = simple_strtoul(start, &tmp, 10);
  429. if (!strlen(start) ||
  430. (tmp == start) ||
  431. (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) {
  432. return -EINVAL;
  433. }
  434. return 0;
  435. }
  436. static ssize_t qeth_l3_dev_ipato_add_store(const char *buf, size_t count,
  437. struct qeth_card *card, enum qeth_prot_versions proto)
  438. {
  439. struct qeth_ipato_entry *ipatoe;
  440. u8 addr[16];
  441. int mask_bits;
  442. int rc = 0;
  443. mutex_lock(&card->conf_mutex);
  444. rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
  445. if (rc)
  446. goto out;
  447. ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL);
  448. if (!ipatoe) {
  449. rc = -ENOMEM;
  450. goto out;
  451. }
  452. ipatoe->proto = proto;
  453. memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16);
  454. ipatoe->mask_bits = mask_bits;
  455. rc = qeth_l3_add_ipato_entry(card, ipatoe);
  456. if (rc)
  457. kfree(ipatoe);
  458. out:
  459. mutex_unlock(&card->conf_mutex);
  460. return rc ? rc : count;
  461. }
  462. static ssize_t qeth_l3_dev_ipato_add4_store(struct device *dev,
  463. struct device_attribute *attr, const char *buf, size_t count)
  464. {
  465. struct qeth_card *card = dev_get_drvdata(dev);
  466. if (!card)
  467. return -EINVAL;
  468. return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV4);
  469. }
  470. static QETH_DEVICE_ATTR(ipato_add4, add4, 0644,
  471. qeth_l3_dev_ipato_add4_show,
  472. qeth_l3_dev_ipato_add4_store);
  473. static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count,
  474. struct qeth_card *card, enum qeth_prot_versions proto)
  475. {
  476. u8 addr[16];
  477. int mask_bits;
  478. int rc = 0;
  479. mutex_lock(&card->conf_mutex);
  480. rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
  481. if (!rc)
  482. qeth_l3_del_ipato_entry(card, proto, addr, mask_bits);
  483. mutex_unlock(&card->conf_mutex);
  484. return rc ? rc : count;
  485. }
  486. static ssize_t qeth_l3_dev_ipato_del4_store(struct device *dev,
  487. struct device_attribute *attr, const char *buf, size_t count)
  488. {
  489. struct qeth_card *card = dev_get_drvdata(dev);
  490. if (!card)
  491. return -EINVAL;
  492. return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV4);
  493. }
  494. static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,
  495. qeth_l3_dev_ipato_del4_store);
  496. static ssize_t qeth_l3_dev_ipato_invert6_show(struct device *dev,
  497. struct device_attribute *attr, char *buf)
  498. {
  499. struct qeth_card *card = dev_get_drvdata(dev);
  500. if (!card)
  501. return -EINVAL;
  502. return sprintf(buf, "%i\n", card->ipato.invert6? 1:0);
  503. }
  504. static ssize_t qeth_l3_dev_ipato_invert6_store(struct device *dev,
  505. struct device_attribute *attr, const char *buf, size_t count)
  506. {
  507. struct qeth_card *card = dev_get_drvdata(dev);
  508. int rc = 0;
  509. if (!card)
  510. return -EINVAL;
  511. mutex_lock(&card->conf_mutex);
  512. if (sysfs_streq(buf, "toggle"))
  513. card->ipato.invert6 = (card->ipato.invert6)? 0 : 1;
  514. else if (sysfs_streq(buf, "1"))
  515. card->ipato.invert6 = 1;
  516. else if (sysfs_streq(buf, "0"))
  517. card->ipato.invert6 = 0;
  518. else
  519. rc = -EINVAL;
  520. mutex_unlock(&card->conf_mutex);
  521. return rc ? rc : count;
  522. }
  523. static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
  524. qeth_l3_dev_ipato_invert6_show,
  525. qeth_l3_dev_ipato_invert6_store);
  526. static ssize_t qeth_l3_dev_ipato_add6_show(struct device *dev,
  527. struct device_attribute *attr, char *buf)
  528. {
  529. struct qeth_card *card = dev_get_drvdata(dev);
  530. if (!card)
  531. return -EINVAL;
  532. return qeth_l3_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);
  533. }
  534. static ssize_t qeth_l3_dev_ipato_add6_store(struct device *dev,
  535. struct device_attribute *attr, const char *buf, size_t count)
  536. {
  537. struct qeth_card *card = dev_get_drvdata(dev);
  538. if (!card)
  539. return -EINVAL;
  540. return qeth_l3_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);
  541. }
  542. static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
  543. qeth_l3_dev_ipato_add6_show,
  544. qeth_l3_dev_ipato_add6_store);
  545. static ssize_t qeth_l3_dev_ipato_del6_store(struct device *dev,
  546. struct device_attribute *attr, const char *buf, size_t count)
  547. {
  548. struct qeth_card *card = dev_get_drvdata(dev);
  549. if (!card)
  550. return -EINVAL;
  551. return qeth_l3_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);
  552. }
  553. static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,
  554. qeth_l3_dev_ipato_del6_store);
  555. static struct attribute *qeth_ipato_device_attrs[] = {
  556. &dev_attr_ipato_enable.attr,
  557. &dev_attr_ipato_invert4.attr,
  558. &dev_attr_ipato_add4.attr,
  559. &dev_attr_ipato_del4.attr,
  560. &dev_attr_ipato_invert6.attr,
  561. &dev_attr_ipato_add6.attr,
  562. &dev_attr_ipato_del6.attr,
  563. NULL,
  564. };
  565. static struct attribute_group qeth_device_ipato_group = {
  566. .name = "ipa_takeover",
  567. .attrs = qeth_ipato_device_attrs,
  568. };
  569. static ssize_t qeth_l3_dev_vipa_add_show(char *buf, struct qeth_card *card,
  570. enum qeth_prot_versions proto)
  571. {
  572. struct qeth_ipaddr *ipaddr;
  573. struct hlist_node *tmp;
  574. char addr_str[40];
  575. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  576. int i = 0;
  577. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  578. entry_len += 2; /* \n + terminator */
  579. spin_lock_bh(&card->ip_lock);
  580. hash_for_each_safe(card->ip_htable, i, tmp, ipaddr, hnode) {
  581. if (ipaddr->proto != proto)
  582. continue;
  583. if (ipaddr->type != QETH_IP_TYPE_VIPA)
  584. continue;
  585. /* String must not be longer than PAGE_SIZE. So we check if
  586. * string length gets near PAGE_SIZE. Then we can savely display
  587. * the next IPv6 address (worst case, compared to IPv4) */
  588. if ((PAGE_SIZE - i) <= entry_len)
  589. break;
  590. qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
  591. addr_str);
  592. i += snprintf(buf + i, PAGE_SIZE - i, "%s\n", addr_str);
  593. }
  594. spin_unlock_bh(&card->ip_lock);
  595. i += snprintf(buf + i, PAGE_SIZE - i, "\n");
  596. return i;
  597. }
  598. static ssize_t qeth_l3_dev_vipa_add4_show(struct device *dev,
  599. struct device_attribute *attr, char *buf)
  600. {
  601. struct qeth_card *card = dev_get_drvdata(dev);
  602. if (!card)
  603. return -EINVAL;
  604. return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV4);
  605. }
  606. static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto,
  607. u8 *addr)
  608. {
  609. if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
  610. return -EINVAL;
  611. }
  612. return 0;
  613. }
  614. static ssize_t qeth_l3_dev_vipa_add_store(const char *buf, size_t count,
  615. struct qeth_card *card, enum qeth_prot_versions proto)
  616. {
  617. u8 addr[16] = {0, };
  618. int rc;
  619. mutex_lock(&card->conf_mutex);
  620. rc = qeth_l3_parse_vipae(buf, proto, addr);
  621. if (!rc)
  622. rc = qeth_l3_add_vipa(card, proto, addr);
  623. mutex_unlock(&card->conf_mutex);
  624. return rc ? rc : count;
  625. }
  626. static ssize_t qeth_l3_dev_vipa_add4_store(struct device *dev,
  627. struct device_attribute *attr, const char *buf, size_t count)
  628. {
  629. struct qeth_card *card = dev_get_drvdata(dev);
  630. if (!card)
  631. return -EINVAL;
  632. return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);
  633. }
  634. static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,
  635. qeth_l3_dev_vipa_add4_show,
  636. qeth_l3_dev_vipa_add4_store);
  637. static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count,
  638. struct qeth_card *card, enum qeth_prot_versions proto)
  639. {
  640. u8 addr[16];
  641. int rc;
  642. mutex_lock(&card->conf_mutex);
  643. rc = qeth_l3_parse_vipae(buf, proto, addr);
  644. if (!rc)
  645. qeth_l3_del_vipa(card, proto, addr);
  646. mutex_unlock(&card->conf_mutex);
  647. return rc ? rc : count;
  648. }
  649. static ssize_t qeth_l3_dev_vipa_del4_store(struct device *dev,
  650. struct device_attribute *attr, const char *buf, size_t count)
  651. {
  652. struct qeth_card *card = dev_get_drvdata(dev);
  653. if (!card)
  654. return -EINVAL;
  655. return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);
  656. }
  657. static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
  658. qeth_l3_dev_vipa_del4_store);
  659. static ssize_t qeth_l3_dev_vipa_add6_show(struct device *dev,
  660. struct device_attribute *attr, char *buf)
  661. {
  662. struct qeth_card *card = dev_get_drvdata(dev);
  663. if (!card)
  664. return -EINVAL;
  665. return qeth_l3_dev_vipa_add_show(buf, card, QETH_PROT_IPV6);
  666. }
  667. static ssize_t qeth_l3_dev_vipa_add6_store(struct device *dev,
  668. struct device_attribute *attr, const char *buf, size_t count)
  669. {
  670. struct qeth_card *card = dev_get_drvdata(dev);
  671. if (!card)
  672. return -EINVAL;
  673. return qeth_l3_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);
  674. }
  675. static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
  676. qeth_l3_dev_vipa_add6_show,
  677. qeth_l3_dev_vipa_add6_store);
  678. static ssize_t qeth_l3_dev_vipa_del6_store(struct device *dev,
  679. struct device_attribute *attr, const char *buf, size_t count)
  680. {
  681. struct qeth_card *card = dev_get_drvdata(dev);
  682. if (!card)
  683. return -EINVAL;
  684. return qeth_l3_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);
  685. }
  686. static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,
  687. qeth_l3_dev_vipa_del6_store);
  688. static struct attribute *qeth_vipa_device_attrs[] = {
  689. &dev_attr_vipa_add4.attr,
  690. &dev_attr_vipa_del4.attr,
  691. &dev_attr_vipa_add6.attr,
  692. &dev_attr_vipa_del6.attr,
  693. NULL,
  694. };
  695. static struct attribute_group qeth_device_vipa_group = {
  696. .name = "vipa",
  697. .attrs = qeth_vipa_device_attrs,
  698. };
  699. static ssize_t qeth_l3_dev_rxip_add_show(char *buf, struct qeth_card *card,
  700. enum qeth_prot_versions proto)
  701. {
  702. struct qeth_ipaddr *ipaddr;
  703. struct hlist_node *tmp;
  704. char addr_str[40];
  705. int entry_len; /* length of 1 entry string, differs between v4 and v6 */
  706. int i = 0;
  707. entry_len = (proto == QETH_PROT_IPV4)? 12 : 40;
  708. entry_len += 2; /* \n + terminator */
  709. spin_lock_bh(&card->ip_lock);
  710. hash_for_each_safe(card->ip_htable, i, tmp, ipaddr, hnode) {
  711. if (ipaddr->proto != proto)
  712. continue;
  713. if (ipaddr->type != QETH_IP_TYPE_RXIP)
  714. continue;
  715. /* String must not be longer than PAGE_SIZE. So we check if
  716. * string length gets near PAGE_SIZE. Then we can savely display
  717. * the next IPv6 address (worst case, compared to IPv4) */
  718. if ((PAGE_SIZE - i) <= entry_len)
  719. break;
  720. qeth_l3_ipaddr_to_string(proto, (const u8 *)&ipaddr->u,
  721. addr_str);
  722. i += snprintf(buf + i, PAGE_SIZE - i, "%s\n", addr_str);
  723. }
  724. spin_unlock_bh(&card->ip_lock);
  725. i += snprintf(buf + i, PAGE_SIZE - i, "\n");
  726. return i;
  727. }
  728. static ssize_t qeth_l3_dev_rxip_add4_show(struct device *dev,
  729. struct device_attribute *attr, char *buf)
  730. {
  731. struct qeth_card *card = dev_get_drvdata(dev);
  732. if (!card)
  733. return -EINVAL;
  734. return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV4);
  735. }
  736. static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto,
  737. u8 *addr)
  738. {
  739. if (qeth_l3_string_to_ipaddr(buf, proto, addr)) {
  740. return -EINVAL;
  741. }
  742. return 0;
  743. }
  744. static ssize_t qeth_l3_dev_rxip_add_store(const char *buf, size_t count,
  745. struct qeth_card *card, enum qeth_prot_versions proto)
  746. {
  747. u8 addr[16] = {0, };
  748. int rc;
  749. mutex_lock(&card->conf_mutex);
  750. rc = qeth_l3_parse_rxipe(buf, proto, addr);
  751. if (!rc)
  752. rc = qeth_l3_add_rxip(card, proto, addr);
  753. mutex_unlock(&card->conf_mutex);
  754. return rc ? rc : count;
  755. }
  756. static ssize_t qeth_l3_dev_rxip_add4_store(struct device *dev,
  757. struct device_attribute *attr, const char *buf, size_t count)
  758. {
  759. struct qeth_card *card = dev_get_drvdata(dev);
  760. if (!card)
  761. return -EINVAL;
  762. return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);
  763. }
  764. static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,
  765. qeth_l3_dev_rxip_add4_show,
  766. qeth_l3_dev_rxip_add4_store);
  767. static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count,
  768. struct qeth_card *card, enum qeth_prot_versions proto)
  769. {
  770. u8 addr[16];
  771. int rc;
  772. mutex_lock(&card->conf_mutex);
  773. rc = qeth_l3_parse_rxipe(buf, proto, addr);
  774. if (!rc)
  775. qeth_l3_del_rxip(card, proto, addr);
  776. mutex_unlock(&card->conf_mutex);
  777. return rc ? rc : count;
  778. }
  779. static ssize_t qeth_l3_dev_rxip_del4_store(struct device *dev,
  780. struct device_attribute *attr, const char *buf, size_t count)
  781. {
  782. struct qeth_card *card = dev_get_drvdata(dev);
  783. if (!card)
  784. return -EINVAL;
  785. return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);
  786. }
  787. static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
  788. qeth_l3_dev_rxip_del4_store);
  789. static ssize_t qeth_l3_dev_rxip_add6_show(struct device *dev,
  790. struct device_attribute *attr, char *buf)
  791. {
  792. struct qeth_card *card = dev_get_drvdata(dev);
  793. if (!card)
  794. return -EINVAL;
  795. return qeth_l3_dev_rxip_add_show(buf, card, QETH_PROT_IPV6);
  796. }
  797. static ssize_t qeth_l3_dev_rxip_add6_store(struct device *dev,
  798. struct device_attribute *attr, const char *buf, size_t count)
  799. {
  800. struct qeth_card *card = dev_get_drvdata(dev);
  801. if (!card)
  802. return -EINVAL;
  803. return qeth_l3_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);
  804. }
  805. static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
  806. qeth_l3_dev_rxip_add6_show,
  807. qeth_l3_dev_rxip_add6_store);
  808. static ssize_t qeth_l3_dev_rxip_del6_store(struct device *dev,
  809. struct device_attribute *attr, const char *buf, size_t count)
  810. {
  811. struct qeth_card *card = dev_get_drvdata(dev);
  812. if (!card)
  813. return -EINVAL;
  814. return qeth_l3_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);
  815. }
  816. static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,
  817. qeth_l3_dev_rxip_del6_store);
  818. static struct attribute *qeth_rxip_device_attrs[] = {
  819. &dev_attr_rxip_add4.attr,
  820. &dev_attr_rxip_del4.attr,
  821. &dev_attr_rxip_add6.attr,
  822. &dev_attr_rxip_del6.attr,
  823. NULL,
  824. };
  825. static struct attribute_group qeth_device_rxip_group = {
  826. .name = "rxip",
  827. .attrs = qeth_rxip_device_attrs,
  828. };
  829. int qeth_l3_create_device_attributes(struct device *dev)
  830. {
  831. int ret;
  832. ret = sysfs_create_group(&dev->kobj, &qeth_l3_device_attr_group);
  833. if (ret)
  834. return ret;
  835. ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group);
  836. if (ret) {
  837. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  838. return ret;
  839. }
  840. ret = sysfs_create_group(&dev->kobj, &qeth_device_vipa_group);
  841. if (ret) {
  842. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  843. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  844. return ret;
  845. }
  846. ret = sysfs_create_group(&dev->kobj, &qeth_device_rxip_group);
  847. if (ret) {
  848. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  849. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  850. sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
  851. return ret;
  852. }
  853. return 0;
  854. }
  855. void qeth_l3_remove_device_attributes(struct device *dev)
  856. {
  857. sysfs_remove_group(&dev->kobj, &qeth_l3_device_attr_group);
  858. sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
  859. sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
  860. sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group);
  861. }