qeth_l3_sys.c 27 KB

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