conn_event.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. /* connection-level event handling
  2. *
  3. * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  12. #include <linux/module.h>
  13. #include <linux/net.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/errqueue.h>
  16. #include <linux/udp.h>
  17. #include <linux/in.h>
  18. #include <linux/in6.h>
  19. #include <linux/icmp.h>
  20. #include <net/sock.h>
  21. #include <net/af_rxrpc.h>
  22. #include <net/ip.h>
  23. #include "ar-internal.h"
  24. /*
  25. * pass a connection-level abort onto all calls on that connection
  26. */
  27. static void rxrpc_abort_calls(struct rxrpc_connection *conn, int state,
  28. u32 abort_code)
  29. {
  30. struct rxrpc_call *call;
  31. int i;
  32. _enter("{%d},%x", conn->debug_id, abort_code);
  33. spin_lock(&conn->channel_lock);
  34. for (i = 0; i < RXRPC_MAXCALLS; i++) {
  35. call = rcu_dereference_protected(
  36. conn->channels[i].call,
  37. lockdep_is_held(&conn->channel_lock));
  38. write_lock_bh(&call->state_lock);
  39. if (call->state <= RXRPC_CALL_COMPLETE) {
  40. call->state = state;
  41. if (state == RXRPC_CALL_LOCALLY_ABORTED) {
  42. call->local_abort = conn->local_abort;
  43. set_bit(RXRPC_CALL_EV_CONN_ABORT, &call->events);
  44. } else {
  45. call->remote_abort = conn->remote_abort;
  46. set_bit(RXRPC_CALL_EV_RCVD_ABORT, &call->events);
  47. }
  48. rxrpc_queue_call(call);
  49. }
  50. write_unlock_bh(&call->state_lock);
  51. }
  52. spin_unlock(&conn->channel_lock);
  53. _leave("");
  54. }
  55. /*
  56. * generate a connection-level abort
  57. */
  58. static int rxrpc_abort_connection(struct rxrpc_connection *conn,
  59. u32 error, u32 abort_code)
  60. {
  61. struct rxrpc_wire_header whdr;
  62. struct msghdr msg;
  63. struct kvec iov[2];
  64. __be32 word;
  65. size_t len;
  66. u32 serial;
  67. int ret;
  68. _enter("%d,,%u,%u", conn->debug_id, error, abort_code);
  69. /* generate a connection-level abort */
  70. spin_lock_bh(&conn->state_lock);
  71. if (conn->state < RXRPC_CONN_REMOTELY_ABORTED) {
  72. conn->state = RXRPC_CONN_LOCALLY_ABORTED;
  73. conn->error = error;
  74. spin_unlock_bh(&conn->state_lock);
  75. } else {
  76. spin_unlock_bh(&conn->state_lock);
  77. _leave(" = 0 [already dead]");
  78. return 0;
  79. }
  80. rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, abort_code);
  81. msg.msg_name = &conn->params.peer->srx.transport;
  82. msg.msg_namelen = conn->params.peer->srx.transport_len;
  83. msg.msg_control = NULL;
  84. msg.msg_controllen = 0;
  85. msg.msg_flags = 0;
  86. whdr.epoch = htonl(conn->proto.epoch);
  87. whdr.cid = htonl(conn->proto.cid);
  88. whdr.callNumber = 0;
  89. whdr.seq = 0;
  90. whdr.type = RXRPC_PACKET_TYPE_ABORT;
  91. whdr.flags = conn->out_clientflag;
  92. whdr.userStatus = 0;
  93. whdr.securityIndex = conn->security_ix;
  94. whdr._rsvd = 0;
  95. whdr.serviceId = htons(conn->params.service_id);
  96. word = htonl(conn->local_abort);
  97. iov[0].iov_base = &whdr;
  98. iov[0].iov_len = sizeof(whdr);
  99. iov[1].iov_base = &word;
  100. iov[1].iov_len = sizeof(word);
  101. len = iov[0].iov_len + iov[1].iov_len;
  102. serial = atomic_inc_return(&conn->serial);
  103. whdr.serial = htonl(serial);
  104. _proto("Tx CONN ABORT %%%u { %d }", serial, conn->local_abort);
  105. ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
  106. if (ret < 0) {
  107. _debug("sendmsg failed: %d", ret);
  108. return -EAGAIN;
  109. }
  110. _leave(" = 0");
  111. return 0;
  112. }
  113. /*
  114. * mark a call as being on a now-secured channel
  115. * - must be called with softirqs disabled
  116. */
  117. static void rxrpc_call_is_secure(struct rxrpc_call *call)
  118. {
  119. _enter("%p", call);
  120. if (call) {
  121. read_lock(&call->state_lock);
  122. if (call->state < RXRPC_CALL_COMPLETE &&
  123. !test_and_set_bit(RXRPC_CALL_EV_SECURED, &call->events))
  124. rxrpc_queue_call(call);
  125. read_unlock(&call->state_lock);
  126. }
  127. }
  128. /*
  129. * connection-level Rx packet processor
  130. */
  131. static int rxrpc_process_event(struct rxrpc_connection *conn,
  132. struct sk_buff *skb,
  133. u32 *_abort_code)
  134. {
  135. struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
  136. __be32 wtmp;
  137. u32 abort_code;
  138. int loop, ret;
  139. if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
  140. kleave(" = -ECONNABORTED [%u]", conn->state);
  141. return -ECONNABORTED;
  142. }
  143. _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial);
  144. switch (sp->hdr.type) {
  145. case RXRPC_PACKET_TYPE_ABORT:
  146. if (skb_copy_bits(skb, 0, &wtmp, sizeof(wtmp)) < 0)
  147. return -EPROTO;
  148. abort_code = ntohl(wtmp);
  149. _proto("Rx ABORT %%%u { ac=%d }", sp->hdr.serial, abort_code);
  150. conn->state = RXRPC_CONN_REMOTELY_ABORTED;
  151. rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED,
  152. abort_code);
  153. return -ECONNABORTED;
  154. case RXRPC_PACKET_TYPE_CHALLENGE:
  155. return conn->security->respond_to_challenge(conn, skb,
  156. _abort_code);
  157. case RXRPC_PACKET_TYPE_RESPONSE:
  158. ret = conn->security->verify_response(conn, skb, _abort_code);
  159. if (ret < 0)
  160. return ret;
  161. ret = conn->security->init_connection_security(conn);
  162. if (ret < 0)
  163. return ret;
  164. ret = conn->security->prime_packet_security(conn);
  165. if (ret < 0)
  166. return ret;
  167. spin_lock(&conn->channel_lock);
  168. spin_lock(&conn->state_lock);
  169. if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) {
  170. conn->state = RXRPC_CONN_SERVICE;
  171. for (loop = 0; loop < RXRPC_MAXCALLS; loop++)
  172. rxrpc_call_is_secure(
  173. rcu_dereference_protected(
  174. conn->channels[loop].call,
  175. lockdep_is_held(&conn->channel_lock)));
  176. }
  177. spin_unlock(&conn->state_lock);
  178. spin_unlock(&conn->channel_lock);
  179. return 0;
  180. default:
  181. _leave(" = -EPROTO [%u]", sp->hdr.type);
  182. return -EPROTO;
  183. }
  184. }
  185. /*
  186. * set up security and issue a challenge
  187. */
  188. static void rxrpc_secure_connection(struct rxrpc_connection *conn)
  189. {
  190. u32 abort_code;
  191. int ret;
  192. _enter("{%d}", conn->debug_id);
  193. ASSERT(conn->security_ix != 0);
  194. if (!conn->params.key) {
  195. _debug("set up security");
  196. ret = rxrpc_init_server_conn_security(conn);
  197. switch (ret) {
  198. case 0:
  199. break;
  200. case -ENOENT:
  201. abort_code = RX_CALL_DEAD;
  202. goto abort;
  203. default:
  204. abort_code = RXKADNOAUTH;
  205. goto abort;
  206. }
  207. }
  208. if (conn->security->issue_challenge(conn) < 0) {
  209. abort_code = RX_CALL_DEAD;
  210. ret = -ENOMEM;
  211. goto abort;
  212. }
  213. _leave("");
  214. return;
  215. abort:
  216. _debug("abort %d, %d", ret, abort_code);
  217. rxrpc_abort_connection(conn, -ret, abort_code);
  218. _leave(" [aborted]");
  219. }
  220. /*
  221. * connection-level event processor
  222. */
  223. void rxrpc_process_connection(struct work_struct *work)
  224. {
  225. struct rxrpc_connection *conn =
  226. container_of(work, struct rxrpc_connection, processor);
  227. struct sk_buff *skb;
  228. u32 abort_code = RX_PROTOCOL_ERROR;
  229. int ret;
  230. _enter("{%d}", conn->debug_id);
  231. if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events))
  232. rxrpc_secure_connection(conn);
  233. /* go through the conn-level event packets, releasing the ref on this
  234. * connection that each one has when we've finished with it */
  235. while ((skb = skb_dequeue(&conn->rx_queue))) {
  236. ret = rxrpc_process_event(conn, skb, &abort_code);
  237. switch (ret) {
  238. case -EPROTO:
  239. case -EKEYEXPIRED:
  240. case -EKEYREJECTED:
  241. goto protocol_error;
  242. case -EAGAIN:
  243. goto requeue_and_leave;
  244. case -ECONNABORTED:
  245. default:
  246. rxrpc_free_skb(skb);
  247. break;
  248. }
  249. }
  250. out:
  251. rxrpc_put_connection(conn);
  252. _leave("");
  253. return;
  254. requeue_and_leave:
  255. skb_queue_head(&conn->rx_queue, skb);
  256. goto out;
  257. protocol_error:
  258. if (rxrpc_abort_connection(conn, -ret, abort_code) < 0)
  259. goto requeue_and_leave;
  260. rxrpc_free_skb(skb);
  261. _leave(" [EPROTO]");
  262. goto out;
  263. }
  264. /*
  265. * put a packet up for transport-level abort
  266. */
  267. void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
  268. {
  269. CHECK_SLAB_OKAY(&local->usage);
  270. skb_queue_tail(&local->reject_queue, skb);
  271. rxrpc_queue_local(local);
  272. }
  273. /*
  274. * reject packets through the local endpoint
  275. */
  276. void rxrpc_reject_packets(struct rxrpc_local *local)
  277. {
  278. union {
  279. struct sockaddr sa;
  280. struct sockaddr_in sin;
  281. } sa;
  282. struct rxrpc_skb_priv *sp;
  283. struct rxrpc_wire_header whdr;
  284. struct sk_buff *skb;
  285. struct msghdr msg;
  286. struct kvec iov[2];
  287. size_t size;
  288. __be32 code;
  289. _enter("%d", local->debug_id);
  290. iov[0].iov_base = &whdr;
  291. iov[0].iov_len = sizeof(whdr);
  292. iov[1].iov_base = &code;
  293. iov[1].iov_len = sizeof(code);
  294. size = sizeof(whdr) + sizeof(code);
  295. msg.msg_name = &sa;
  296. msg.msg_control = NULL;
  297. msg.msg_controllen = 0;
  298. msg.msg_flags = 0;
  299. memset(&sa, 0, sizeof(sa));
  300. sa.sa.sa_family = local->srx.transport.family;
  301. switch (sa.sa.sa_family) {
  302. case AF_INET:
  303. msg.msg_namelen = sizeof(sa.sin);
  304. break;
  305. default:
  306. msg.msg_namelen = 0;
  307. break;
  308. }
  309. memset(&whdr, 0, sizeof(whdr));
  310. whdr.type = RXRPC_PACKET_TYPE_ABORT;
  311. while ((skb = skb_dequeue(&local->reject_queue))) {
  312. sp = rxrpc_skb(skb);
  313. switch (sa.sa.sa_family) {
  314. case AF_INET:
  315. sa.sin.sin_port = udp_hdr(skb)->source;
  316. sa.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
  317. code = htonl(skb->priority);
  318. whdr.epoch = htonl(sp->hdr.epoch);
  319. whdr.cid = htonl(sp->hdr.cid);
  320. whdr.callNumber = htonl(sp->hdr.callNumber);
  321. whdr.serviceId = htons(sp->hdr.serviceId);
  322. whdr.flags = sp->hdr.flags;
  323. whdr.flags ^= RXRPC_CLIENT_INITIATED;
  324. whdr.flags &= RXRPC_CLIENT_INITIATED;
  325. kernel_sendmsg(local->socket, &msg, iov, 2, size);
  326. break;
  327. default:
  328. break;
  329. }
  330. rxrpc_free_skb(skb);
  331. }
  332. _leave("");
  333. }