lapb_iface.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * LAPB release 002
  4. *
  5. * This code REQUIRES 2.1.15 or higher/ NET3.038
  6. *
  7. * History
  8. * LAPB 001 Jonathan Naylor Started Coding
  9. * LAPB 002 Jonathan Naylor New timer architecture.
  10. * 2000-10-29 Henner Eisen lapb_data_indication() return status.
  11. */
  12. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  13. #include <linux/module.h>
  14. #include <linux/errno.h>
  15. #include <linux/types.h>
  16. #include <linux/socket.h>
  17. #include <linux/in.h>
  18. #include <linux/kernel.h>
  19. #include <linux/jiffies.h>
  20. #include <linux/timer.h>
  21. #include <linux/string.h>
  22. #include <linux/sockios.h>
  23. #include <linux/net.h>
  24. #include <linux/inet.h>
  25. #include <linux/if_arp.h>
  26. #include <linux/skbuff.h>
  27. #include <linux/slab.h>
  28. #include <net/sock.h>
  29. #include <linux/uaccess.h>
  30. #include <linux/fcntl.h>
  31. #include <linux/mm.h>
  32. #include <linux/interrupt.h>
  33. #include <linux/stat.h>
  34. #include <linux/init.h>
  35. #include <net/lapb.h>
  36. static LIST_HEAD(lapb_list);
  37. static DEFINE_RWLOCK(lapb_list_lock);
  38. /*
  39. * Free an allocated lapb control block.
  40. */
  41. static void lapb_free_cb(struct lapb_cb *lapb)
  42. {
  43. kfree(lapb);
  44. }
  45. static __inline__ void lapb_hold(struct lapb_cb *lapb)
  46. {
  47. refcount_inc(&lapb->refcnt);
  48. }
  49. static __inline__ void lapb_put(struct lapb_cb *lapb)
  50. {
  51. if (refcount_dec_and_test(&lapb->refcnt))
  52. lapb_free_cb(lapb);
  53. }
  54. /*
  55. * Socket removal during an interrupt is now safe.
  56. */
  57. static void __lapb_remove_cb(struct lapb_cb *lapb)
  58. {
  59. if (lapb->node.next) {
  60. list_del(&lapb->node);
  61. lapb_put(lapb);
  62. }
  63. }
  64. /*
  65. * Add a socket to the bound sockets list.
  66. */
  67. static void __lapb_insert_cb(struct lapb_cb *lapb)
  68. {
  69. list_add(&lapb->node, &lapb_list);
  70. lapb_hold(lapb);
  71. }
  72. static struct lapb_cb *__lapb_devtostruct(struct net_device *dev)
  73. {
  74. struct lapb_cb *lapb, *use = NULL;
  75. list_for_each_entry(lapb, &lapb_list, node) {
  76. if (lapb->dev == dev) {
  77. use = lapb;
  78. break;
  79. }
  80. }
  81. if (use)
  82. lapb_hold(use);
  83. return use;
  84. }
  85. static struct lapb_cb *lapb_devtostruct(struct net_device *dev)
  86. {
  87. struct lapb_cb *rc;
  88. read_lock_bh(&lapb_list_lock);
  89. rc = __lapb_devtostruct(dev);
  90. read_unlock_bh(&lapb_list_lock);
  91. return rc;
  92. }
  93. /*
  94. * Create an empty LAPB control block.
  95. */
  96. static struct lapb_cb *lapb_create_cb(void)
  97. {
  98. struct lapb_cb *lapb = kzalloc(sizeof(*lapb), GFP_ATOMIC);
  99. if (!lapb)
  100. goto out;
  101. skb_queue_head_init(&lapb->write_queue);
  102. skb_queue_head_init(&lapb->ack_queue);
  103. timer_setup(&lapb->t1timer, NULL, 0);
  104. timer_setup(&lapb->t2timer, NULL, 0);
  105. lapb->t1timer_running = false;
  106. lapb->t2timer_running = false;
  107. lapb->t1 = LAPB_DEFAULT_T1;
  108. lapb->t2 = LAPB_DEFAULT_T2;
  109. lapb->n2 = LAPB_DEFAULT_N2;
  110. lapb->mode = LAPB_DEFAULT_MODE;
  111. lapb->window = LAPB_DEFAULT_WINDOW;
  112. lapb->state = LAPB_STATE_0;
  113. spin_lock_init(&lapb->lock);
  114. refcount_set(&lapb->refcnt, 1);
  115. out:
  116. return lapb;
  117. }
  118. int lapb_register(struct net_device *dev,
  119. const struct lapb_register_struct *callbacks)
  120. {
  121. struct lapb_cb *lapb;
  122. int rc = LAPB_BADTOKEN;
  123. write_lock_bh(&lapb_list_lock);
  124. lapb = __lapb_devtostruct(dev);
  125. if (lapb) {
  126. lapb_put(lapb);
  127. goto out;
  128. }
  129. lapb = lapb_create_cb();
  130. rc = LAPB_NOMEM;
  131. if (!lapb)
  132. goto out;
  133. lapb->dev = dev;
  134. lapb->callbacks = callbacks;
  135. __lapb_insert_cb(lapb);
  136. lapb_start_t1timer(lapb);
  137. rc = LAPB_OK;
  138. out:
  139. write_unlock_bh(&lapb_list_lock);
  140. return rc;
  141. }
  142. EXPORT_SYMBOL(lapb_register);
  143. int lapb_unregister(struct net_device *dev)
  144. {
  145. struct lapb_cb *lapb;
  146. int rc = LAPB_BADTOKEN;
  147. write_lock_bh(&lapb_list_lock);
  148. lapb = __lapb_devtostruct(dev);
  149. if (!lapb)
  150. goto out;
  151. lapb_put(lapb);
  152. /* Wait for other refs to "lapb" to drop */
  153. while (refcount_read(&lapb->refcnt) > 2)
  154. usleep_range(1, 10);
  155. spin_lock_bh(&lapb->lock);
  156. lapb_stop_t1timer(lapb);
  157. lapb_stop_t2timer(lapb);
  158. lapb_clear_queues(lapb);
  159. spin_unlock_bh(&lapb->lock);
  160. /* Wait for running timers to stop */
  161. del_timer_sync(&lapb->t1timer);
  162. del_timer_sync(&lapb->t2timer);
  163. __lapb_remove_cb(lapb);
  164. lapb_put(lapb);
  165. rc = LAPB_OK;
  166. out:
  167. write_unlock_bh(&lapb_list_lock);
  168. return rc;
  169. }
  170. EXPORT_SYMBOL(lapb_unregister);
  171. int lapb_getparms(struct net_device *dev, struct lapb_parms_struct *parms)
  172. {
  173. int rc = LAPB_BADTOKEN;
  174. struct lapb_cb *lapb = lapb_devtostruct(dev);
  175. if (!lapb)
  176. goto out;
  177. spin_lock_bh(&lapb->lock);
  178. parms->t1 = lapb->t1 / HZ;
  179. parms->t2 = lapb->t2 / HZ;
  180. parms->n2 = lapb->n2;
  181. parms->n2count = lapb->n2count;
  182. parms->state = lapb->state;
  183. parms->window = lapb->window;
  184. parms->mode = lapb->mode;
  185. if (!timer_pending(&lapb->t1timer))
  186. parms->t1timer = 0;
  187. else
  188. parms->t1timer = (lapb->t1timer.expires - jiffies) / HZ;
  189. if (!timer_pending(&lapb->t2timer))
  190. parms->t2timer = 0;
  191. else
  192. parms->t2timer = (lapb->t2timer.expires - jiffies) / HZ;
  193. spin_unlock_bh(&lapb->lock);
  194. lapb_put(lapb);
  195. rc = LAPB_OK;
  196. out:
  197. return rc;
  198. }
  199. EXPORT_SYMBOL(lapb_getparms);
  200. int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms)
  201. {
  202. int rc = LAPB_BADTOKEN;
  203. struct lapb_cb *lapb = lapb_devtostruct(dev);
  204. if (!lapb)
  205. goto out;
  206. spin_lock_bh(&lapb->lock);
  207. rc = LAPB_INVALUE;
  208. if (parms->t1 < 1 || parms->t2 < 1 || parms->n2 < 1)
  209. goto out_put;
  210. if (lapb->state == LAPB_STATE_0) {
  211. if (parms->mode & LAPB_EXTENDED) {
  212. if (parms->window < 1 || parms->window > 127)
  213. goto out_put;
  214. } else {
  215. if (parms->window < 1 || parms->window > 7)
  216. goto out_put;
  217. }
  218. lapb->mode = parms->mode;
  219. lapb->window = parms->window;
  220. }
  221. lapb->t1 = parms->t1 * HZ;
  222. lapb->t2 = parms->t2 * HZ;
  223. lapb->n2 = parms->n2;
  224. rc = LAPB_OK;
  225. out_put:
  226. spin_unlock_bh(&lapb->lock);
  227. lapb_put(lapb);
  228. out:
  229. return rc;
  230. }
  231. EXPORT_SYMBOL(lapb_setparms);
  232. int lapb_connect_request(struct net_device *dev)
  233. {
  234. struct lapb_cb *lapb = lapb_devtostruct(dev);
  235. int rc = LAPB_BADTOKEN;
  236. if (!lapb)
  237. goto out;
  238. spin_lock_bh(&lapb->lock);
  239. rc = LAPB_OK;
  240. if (lapb->state == LAPB_STATE_1)
  241. goto out_put;
  242. rc = LAPB_CONNECTED;
  243. if (lapb->state == LAPB_STATE_3 || lapb->state == LAPB_STATE_4)
  244. goto out_put;
  245. lapb_establish_data_link(lapb);
  246. lapb_dbg(0, "(%p) S0 -> S1\n", lapb->dev);
  247. lapb->state = LAPB_STATE_1;
  248. rc = LAPB_OK;
  249. out_put:
  250. spin_unlock_bh(&lapb->lock);
  251. lapb_put(lapb);
  252. out:
  253. return rc;
  254. }
  255. EXPORT_SYMBOL(lapb_connect_request);
  256. static int __lapb_disconnect_request(struct lapb_cb *lapb)
  257. {
  258. switch (lapb->state) {
  259. case LAPB_STATE_0:
  260. return LAPB_NOTCONNECTED;
  261. case LAPB_STATE_1:
  262. lapb_dbg(1, "(%p) S1 TX DISC(1)\n", lapb->dev);
  263. lapb_dbg(0, "(%p) S1 -> S0\n", lapb->dev);
  264. lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND);
  265. lapb->state = LAPB_STATE_0;
  266. lapb_start_t1timer(lapb);
  267. return LAPB_NOTCONNECTED;
  268. case LAPB_STATE_2:
  269. return LAPB_OK;
  270. }
  271. lapb_clear_queues(lapb);
  272. lapb->n2count = 0;
  273. lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND);
  274. lapb_start_t1timer(lapb);
  275. lapb_stop_t2timer(lapb);
  276. lapb->state = LAPB_STATE_2;
  277. lapb_dbg(1, "(%p) S3 DISC(1)\n", lapb->dev);
  278. lapb_dbg(0, "(%p) S3 -> S2\n", lapb->dev);
  279. return LAPB_OK;
  280. }
  281. int lapb_disconnect_request(struct net_device *dev)
  282. {
  283. struct lapb_cb *lapb = lapb_devtostruct(dev);
  284. int rc = LAPB_BADTOKEN;
  285. if (!lapb)
  286. goto out;
  287. spin_lock_bh(&lapb->lock);
  288. rc = __lapb_disconnect_request(lapb);
  289. spin_unlock_bh(&lapb->lock);
  290. lapb_put(lapb);
  291. out:
  292. return rc;
  293. }
  294. EXPORT_SYMBOL(lapb_disconnect_request);
  295. int lapb_data_request(struct net_device *dev, struct sk_buff *skb)
  296. {
  297. struct lapb_cb *lapb = lapb_devtostruct(dev);
  298. int rc = LAPB_BADTOKEN;
  299. if (!lapb)
  300. goto out;
  301. spin_lock_bh(&lapb->lock);
  302. rc = LAPB_NOTCONNECTED;
  303. if (lapb->state != LAPB_STATE_3 && lapb->state != LAPB_STATE_4)
  304. goto out_put;
  305. skb_queue_tail(&lapb->write_queue, skb);
  306. lapb_kick(lapb);
  307. rc = LAPB_OK;
  308. out_put:
  309. spin_unlock_bh(&lapb->lock);
  310. lapb_put(lapb);
  311. out:
  312. return rc;
  313. }
  314. EXPORT_SYMBOL(lapb_data_request);
  315. int lapb_data_received(struct net_device *dev, struct sk_buff *skb)
  316. {
  317. struct lapb_cb *lapb = lapb_devtostruct(dev);
  318. int rc = LAPB_BADTOKEN;
  319. if (lapb) {
  320. spin_lock_bh(&lapb->lock);
  321. lapb_data_input(lapb, skb);
  322. spin_unlock_bh(&lapb->lock);
  323. lapb_put(lapb);
  324. rc = LAPB_OK;
  325. }
  326. return rc;
  327. }
  328. EXPORT_SYMBOL(lapb_data_received);
  329. void lapb_connect_confirmation(struct lapb_cb *lapb, int reason)
  330. {
  331. if (lapb->callbacks->connect_confirmation)
  332. lapb->callbacks->connect_confirmation(lapb->dev, reason);
  333. }
  334. void lapb_connect_indication(struct lapb_cb *lapb, int reason)
  335. {
  336. if (lapb->callbacks->connect_indication)
  337. lapb->callbacks->connect_indication(lapb->dev, reason);
  338. }
  339. void lapb_disconnect_confirmation(struct lapb_cb *lapb, int reason)
  340. {
  341. if (lapb->callbacks->disconnect_confirmation)
  342. lapb->callbacks->disconnect_confirmation(lapb->dev, reason);
  343. }
  344. void lapb_disconnect_indication(struct lapb_cb *lapb, int reason)
  345. {
  346. if (lapb->callbacks->disconnect_indication)
  347. lapb->callbacks->disconnect_indication(lapb->dev, reason);
  348. }
  349. int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *skb)
  350. {
  351. if (lapb->callbacks->data_indication)
  352. return lapb->callbacks->data_indication(lapb->dev, skb);
  353. kfree_skb(skb);
  354. return NET_RX_SUCCESS; /* For now; must be != NET_RX_DROP */
  355. }
  356. int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *skb)
  357. {
  358. int used = 0;
  359. if (lapb->callbacks->data_transmit) {
  360. lapb->callbacks->data_transmit(lapb->dev, skb);
  361. used = 1;
  362. }
  363. return used;
  364. }
  365. /* Handle device status changes. */
  366. static int lapb_device_event(struct notifier_block *this, unsigned long event,
  367. void *ptr)
  368. {
  369. struct net_device *dev = netdev_notifier_info_to_dev(ptr);
  370. struct lapb_cb *lapb;
  371. if (!net_eq(dev_net(dev), &init_net))
  372. return NOTIFY_DONE;
  373. if (dev->type != ARPHRD_X25)
  374. return NOTIFY_DONE;
  375. lapb = lapb_devtostruct(dev);
  376. if (!lapb)
  377. return NOTIFY_DONE;
  378. spin_lock_bh(&lapb->lock);
  379. switch (event) {
  380. case NETDEV_UP:
  381. lapb_dbg(0, "(%p) Interface up: %s\n", dev, dev->name);
  382. if (netif_carrier_ok(dev)) {
  383. lapb_dbg(0, "(%p): Carrier is already up: %s\n", dev,
  384. dev->name);
  385. if (lapb->mode & LAPB_DCE) {
  386. lapb_start_t1timer(lapb);
  387. } else {
  388. if (lapb->state == LAPB_STATE_0) {
  389. lapb->state = LAPB_STATE_1;
  390. lapb_establish_data_link(lapb);
  391. }
  392. }
  393. }
  394. break;
  395. case NETDEV_GOING_DOWN:
  396. if (netif_carrier_ok(dev))
  397. __lapb_disconnect_request(lapb);
  398. break;
  399. case NETDEV_DOWN:
  400. lapb_dbg(0, "(%p) Interface down: %s\n", dev, dev->name);
  401. lapb_dbg(0, "(%p) S%d -> S0\n", dev, lapb->state);
  402. lapb_clear_queues(lapb);
  403. lapb->state = LAPB_STATE_0;
  404. lapb->n2count = 0;
  405. lapb_stop_t1timer(lapb);
  406. lapb_stop_t2timer(lapb);
  407. break;
  408. case NETDEV_CHANGE:
  409. if (netif_carrier_ok(dev)) {
  410. lapb_dbg(0, "(%p): Carrier detected: %s\n", dev,
  411. dev->name);
  412. if (lapb->mode & LAPB_DCE) {
  413. lapb_start_t1timer(lapb);
  414. } else {
  415. if (lapb->state == LAPB_STATE_0) {
  416. lapb->state = LAPB_STATE_1;
  417. lapb_establish_data_link(lapb);
  418. }
  419. }
  420. } else {
  421. lapb_dbg(0, "(%p) Carrier lost: %s\n", dev, dev->name);
  422. lapb_dbg(0, "(%p) S%d -> S0\n", dev, lapb->state);
  423. lapb_clear_queues(lapb);
  424. lapb->state = LAPB_STATE_0;
  425. lapb->n2count = 0;
  426. lapb_stop_t1timer(lapb);
  427. lapb_stop_t2timer(lapb);
  428. }
  429. break;
  430. }
  431. spin_unlock_bh(&lapb->lock);
  432. lapb_put(lapb);
  433. return NOTIFY_DONE;
  434. }
  435. static struct notifier_block lapb_dev_notifier = {
  436. .notifier_call = lapb_device_event,
  437. };
  438. static int __init lapb_init(void)
  439. {
  440. return register_netdevice_notifier(&lapb_dev_notifier);
  441. }
  442. static void __exit lapb_exit(void)
  443. {
  444. WARN_ON(!list_empty(&lapb_list));
  445. unregister_netdevice_notifier(&lapb_dev_notifier);
  446. }
  447. MODULE_AUTHOR("Jonathan Naylor <[email protected]>");
  448. MODULE_DESCRIPTION("The X.25 Link Access Procedure B link layer protocol");
  449. MODULE_LICENSE("GPL");
  450. module_init(lapb_init);
  451. module_exit(lapb_exit);