output.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /* RxRPC packet transmission
  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/net.h>
  13. #include <linux/gfp.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/export.h>
  16. #include <net/sock.h>
  17. #include <net/af_rxrpc.h>
  18. #include "ar-internal.h"
  19. struct rxrpc_pkt_buffer {
  20. struct rxrpc_wire_header whdr;
  21. union {
  22. struct {
  23. struct rxrpc_ackpacket ack;
  24. u8 acks[255];
  25. u8 pad[3];
  26. };
  27. __be32 abort_code;
  28. };
  29. struct rxrpc_ackinfo ackinfo;
  30. };
  31. /*
  32. * Fill out an ACK packet.
  33. */
  34. static size_t rxrpc_fill_out_ack(struct rxrpc_call *call,
  35. struct rxrpc_pkt_buffer *pkt)
  36. {
  37. rxrpc_serial_t serial;
  38. rxrpc_seq_t hard_ack, top, seq;
  39. int ix;
  40. u32 mtu, jmax;
  41. u8 *ackp = pkt->acks;
  42. /* Barrier against rxrpc_input_data(). */
  43. serial = call->ackr_serial;
  44. hard_ack = READ_ONCE(call->rx_hard_ack);
  45. top = smp_load_acquire(&call->rx_top);
  46. pkt->ack.bufferSpace = htons(8);
  47. pkt->ack.maxSkew = htons(call->ackr_skew);
  48. pkt->ack.firstPacket = htonl(hard_ack + 1);
  49. pkt->ack.previousPacket = htonl(call->ackr_prev_seq);
  50. pkt->ack.serial = htonl(serial);
  51. pkt->ack.reason = call->ackr_reason;
  52. pkt->ack.nAcks = top - hard_ack;
  53. if (pkt->ack.reason == RXRPC_ACK_PING)
  54. pkt->whdr.flags |= RXRPC_REQUEST_ACK;
  55. if (after(top, hard_ack)) {
  56. seq = hard_ack + 1;
  57. do {
  58. ix = seq & RXRPC_RXTX_BUFF_MASK;
  59. if (call->rxtx_buffer[ix])
  60. *ackp++ = RXRPC_ACK_TYPE_ACK;
  61. else
  62. *ackp++ = RXRPC_ACK_TYPE_NACK;
  63. seq++;
  64. } while (before_eq(seq, top));
  65. }
  66. mtu = call->conn->params.peer->if_mtu;
  67. mtu -= call->conn->params.peer->hdrsize;
  68. jmax = (call->nr_jumbo_bad > 3) ? 1 : rxrpc_rx_jumbo_max;
  69. pkt->ackinfo.rxMTU = htonl(rxrpc_rx_mtu);
  70. pkt->ackinfo.maxMTU = htonl(mtu);
  71. pkt->ackinfo.rwind = htonl(call->rx_winsize);
  72. pkt->ackinfo.jumbo_max = htonl(jmax);
  73. *ackp++ = 0;
  74. *ackp++ = 0;
  75. *ackp++ = 0;
  76. return top - hard_ack + 3;
  77. }
  78. /*
  79. * Send an ACK or ABORT call packet.
  80. */
  81. int rxrpc_send_call_packet(struct rxrpc_call *call, u8 type)
  82. {
  83. struct rxrpc_connection *conn = NULL;
  84. struct rxrpc_pkt_buffer *pkt;
  85. struct msghdr msg;
  86. struct kvec iov[2];
  87. rxrpc_serial_t serial;
  88. size_t len, n;
  89. bool ping = false;
  90. int ioc, ret;
  91. u32 abort_code;
  92. _enter("%u,%s", call->debug_id, rxrpc_pkts[type]);
  93. spin_lock_bh(&call->lock);
  94. if (call->conn)
  95. conn = rxrpc_get_connection_maybe(call->conn);
  96. spin_unlock_bh(&call->lock);
  97. if (!conn)
  98. return -ECONNRESET;
  99. pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
  100. if (!pkt) {
  101. rxrpc_put_connection(conn);
  102. return -ENOMEM;
  103. }
  104. msg.msg_name = &call->peer->srx.transport;
  105. msg.msg_namelen = call->peer->srx.transport_len;
  106. msg.msg_control = NULL;
  107. msg.msg_controllen = 0;
  108. msg.msg_flags = 0;
  109. pkt->whdr.epoch = htonl(conn->proto.epoch);
  110. pkt->whdr.cid = htonl(call->cid);
  111. pkt->whdr.callNumber = htonl(call->call_id);
  112. pkt->whdr.seq = 0;
  113. pkt->whdr.type = type;
  114. pkt->whdr.flags = conn->out_clientflag;
  115. pkt->whdr.userStatus = 0;
  116. pkt->whdr.securityIndex = call->security_ix;
  117. pkt->whdr._rsvd = 0;
  118. pkt->whdr.serviceId = htons(call->service_id);
  119. iov[0].iov_base = pkt;
  120. iov[0].iov_len = sizeof(pkt->whdr);
  121. len = sizeof(pkt->whdr);
  122. switch (type) {
  123. case RXRPC_PACKET_TYPE_ACK:
  124. spin_lock_bh(&call->lock);
  125. if (!call->ackr_reason) {
  126. spin_unlock_bh(&call->lock);
  127. ret = 0;
  128. goto out;
  129. }
  130. ping = (call->ackr_reason == RXRPC_ACK_PING);
  131. n = rxrpc_fill_out_ack(call, pkt);
  132. call->ackr_reason = 0;
  133. spin_unlock_bh(&call->lock);
  134. iov[0].iov_len += sizeof(pkt->ack) + n;
  135. iov[1].iov_base = &pkt->ackinfo;
  136. iov[1].iov_len = sizeof(pkt->ackinfo);
  137. len += sizeof(pkt->ack) + n + sizeof(pkt->ackinfo);
  138. ioc = 2;
  139. break;
  140. case RXRPC_PACKET_TYPE_ABORT:
  141. abort_code = call->abort_code;
  142. pkt->abort_code = htonl(abort_code);
  143. iov[0].iov_len += sizeof(pkt->abort_code);
  144. len += sizeof(pkt->abort_code);
  145. ioc = 1;
  146. break;
  147. default:
  148. BUG();
  149. ret = -ENOANO;
  150. goto out;
  151. }
  152. serial = atomic_inc_return(&conn->serial);
  153. pkt->whdr.serial = htonl(serial);
  154. switch (type) {
  155. case RXRPC_PACKET_TYPE_ACK:
  156. trace_rxrpc_tx_ack(call, serial,
  157. ntohl(pkt->ack.firstPacket),
  158. ntohl(pkt->ack.serial),
  159. pkt->ack.reason, pkt->ack.nAcks);
  160. break;
  161. }
  162. if (ping) {
  163. call->ackr_ping = serial;
  164. smp_wmb();
  165. /* We need to stick a time in before we send the packet in case
  166. * the reply gets back before kernel_sendmsg() completes - but
  167. * asking UDP to send the packet can take a relatively long
  168. * time, so we update the time after, on the assumption that
  169. * the packet transmission is more likely to happen towards the
  170. * end of the kernel_sendmsg() call.
  171. */
  172. call->ackr_ping_time = ktime_get_real();
  173. set_bit(RXRPC_CALL_PINGING, &call->flags);
  174. trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_ping, serial);
  175. }
  176. ret = kernel_sendmsg(conn->params.local->socket,
  177. &msg, iov, ioc, len);
  178. if (ping)
  179. call->ackr_ping_time = ktime_get_real();
  180. if (ret < 0 && call->state < RXRPC_CALL_COMPLETE) {
  181. switch (type) {
  182. case RXRPC_PACKET_TYPE_ACK:
  183. clear_bit(RXRPC_CALL_PINGING, &call->flags);
  184. rxrpc_propose_ACK(call, pkt->ack.reason,
  185. ntohs(pkt->ack.maxSkew),
  186. ntohl(pkt->ack.serial),
  187. true, true,
  188. rxrpc_propose_ack_retry_tx);
  189. break;
  190. case RXRPC_PACKET_TYPE_ABORT:
  191. break;
  192. }
  193. }
  194. out:
  195. rxrpc_put_connection(conn);
  196. kfree(pkt);
  197. return ret;
  198. }
  199. /*
  200. * send a packet through the transport endpoint
  201. */
  202. int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb)
  203. {
  204. struct rxrpc_connection *conn = call->conn;
  205. struct rxrpc_wire_header whdr;
  206. struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
  207. struct msghdr msg;
  208. struct kvec iov[2];
  209. rxrpc_serial_t serial;
  210. size_t len;
  211. int ret, opt;
  212. _enter(",{%d}", skb->len);
  213. /* Each transmission of a Tx packet needs a new serial number */
  214. serial = atomic_inc_return(&conn->serial);
  215. whdr.epoch = htonl(conn->proto.epoch);
  216. whdr.cid = htonl(call->cid);
  217. whdr.callNumber = htonl(call->call_id);
  218. whdr.seq = htonl(sp->hdr.seq);
  219. whdr.serial = htonl(serial);
  220. whdr.type = RXRPC_PACKET_TYPE_DATA;
  221. whdr.flags = sp->hdr.flags;
  222. whdr.userStatus = 0;
  223. whdr.securityIndex = call->security_ix;
  224. whdr._rsvd = htons(sp->hdr._rsvd);
  225. whdr.serviceId = htons(call->service_id);
  226. iov[0].iov_base = &whdr;
  227. iov[0].iov_len = sizeof(whdr);
  228. iov[1].iov_base = skb->head;
  229. iov[1].iov_len = skb->len;
  230. len = iov[0].iov_len + iov[1].iov_len;
  231. msg.msg_name = &call->peer->srx.transport;
  232. msg.msg_namelen = call->peer->srx.transport_len;
  233. msg.msg_control = NULL;
  234. msg.msg_controllen = 0;
  235. msg.msg_flags = 0;
  236. /* If our RTT cache needs working on, request an ACK. */
  237. if ((call->peer->rtt_usage < 3 && sp->hdr.seq & 1) ||
  238. ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000),
  239. ktime_get_real()))
  240. whdr.flags |= RXRPC_REQUEST_ACK;
  241. if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
  242. static int lose;
  243. if ((lose++ & 7) == 7) {
  244. trace_rxrpc_tx_data(call, sp->hdr.seq, serial,
  245. whdr.flags, true);
  246. rxrpc_lose_skb(skb, rxrpc_skb_tx_lost);
  247. _leave(" = 0 [lose]");
  248. return 0;
  249. }
  250. }
  251. _proto("Tx DATA %%%u { #%u }", serial, sp->hdr.seq);
  252. /* send the packet with the don't fragment bit set if we currently
  253. * think it's small enough */
  254. if (iov[1].iov_len >= call->peer->maxdata)
  255. goto send_fragmentable;
  256. down_read(&conn->params.local->defrag_sem);
  257. /* send the packet by UDP
  258. * - returns -EMSGSIZE if UDP would have to fragment the packet
  259. * to go out of the interface
  260. * - in which case, we'll have processed the ICMP error
  261. * message and update the peer record
  262. */
  263. ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
  264. up_read(&conn->params.local->defrag_sem);
  265. if (ret == -EMSGSIZE)
  266. goto send_fragmentable;
  267. done:
  268. trace_rxrpc_tx_data(call, sp->hdr.seq, serial, whdr.flags, false);
  269. if (ret >= 0) {
  270. ktime_t now = ktime_get_real();
  271. skb->tstamp = now;
  272. smp_wmb();
  273. sp->hdr.serial = serial;
  274. if (whdr.flags & RXRPC_REQUEST_ACK) {
  275. call->peer->rtt_last_req = now;
  276. trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_data, serial);
  277. }
  278. }
  279. _leave(" = %d [%u]", ret, call->peer->maxdata);
  280. return ret;
  281. send_fragmentable:
  282. /* attempt to send this message with fragmentation enabled */
  283. _debug("send fragment");
  284. down_write(&conn->params.local->defrag_sem);
  285. switch (conn->params.local->srx.transport.family) {
  286. case AF_INET:
  287. opt = IP_PMTUDISC_DONT;
  288. ret = kernel_setsockopt(conn->params.local->socket,
  289. SOL_IP, IP_MTU_DISCOVER,
  290. (char *)&opt, sizeof(opt));
  291. if (ret == 0) {
  292. ret = kernel_sendmsg(conn->params.local->socket, &msg,
  293. iov, 2, len);
  294. opt = IP_PMTUDISC_DO;
  295. kernel_setsockopt(conn->params.local->socket, SOL_IP,
  296. IP_MTU_DISCOVER,
  297. (char *)&opt, sizeof(opt));
  298. }
  299. break;
  300. #ifdef CONFIG_AF_RXRPC_IPV6
  301. case AF_INET6:
  302. opt = IPV6_PMTUDISC_DONT;
  303. ret = kernel_setsockopt(conn->params.local->socket,
  304. SOL_IPV6, IPV6_MTU_DISCOVER,
  305. (char *)&opt, sizeof(opt));
  306. if (ret == 0) {
  307. ret = kernel_sendmsg(conn->params.local->socket, &msg,
  308. iov, 1, iov[0].iov_len);
  309. opt = IPV6_PMTUDISC_DO;
  310. kernel_setsockopt(conn->params.local->socket,
  311. SOL_IPV6, IPV6_MTU_DISCOVER,
  312. (char *)&opt, sizeof(opt));
  313. }
  314. break;
  315. #endif
  316. }
  317. up_write(&conn->params.local->defrag_sem);
  318. goto done;
  319. }
  320. /*
  321. * reject packets through the local endpoint
  322. */
  323. void rxrpc_reject_packets(struct rxrpc_local *local)
  324. {
  325. struct sockaddr_rxrpc srx;
  326. struct rxrpc_skb_priv *sp;
  327. struct rxrpc_wire_header whdr;
  328. struct sk_buff *skb;
  329. struct msghdr msg;
  330. struct kvec iov[2];
  331. size_t size;
  332. __be32 code;
  333. _enter("%d", local->debug_id);
  334. iov[0].iov_base = &whdr;
  335. iov[0].iov_len = sizeof(whdr);
  336. iov[1].iov_base = &code;
  337. iov[1].iov_len = sizeof(code);
  338. size = sizeof(whdr) + sizeof(code);
  339. msg.msg_name = &srx.transport;
  340. msg.msg_control = NULL;
  341. msg.msg_controllen = 0;
  342. msg.msg_flags = 0;
  343. memset(&whdr, 0, sizeof(whdr));
  344. whdr.type = RXRPC_PACKET_TYPE_ABORT;
  345. while ((skb = skb_dequeue(&local->reject_queue))) {
  346. rxrpc_see_skb(skb, rxrpc_skb_rx_seen);
  347. sp = rxrpc_skb(skb);
  348. if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) {
  349. msg.msg_namelen = srx.transport_len;
  350. code = htonl(skb->priority);
  351. whdr.epoch = htonl(sp->hdr.epoch);
  352. whdr.cid = htonl(sp->hdr.cid);
  353. whdr.callNumber = htonl(sp->hdr.callNumber);
  354. whdr.serviceId = htons(sp->hdr.serviceId);
  355. whdr.flags = sp->hdr.flags;
  356. whdr.flags ^= RXRPC_CLIENT_INITIATED;
  357. whdr.flags &= RXRPC_CLIENT_INITIATED;
  358. kernel_sendmsg(local->socket, &msg, iov, 2, size);
  359. }
  360. rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
  361. }
  362. _leave("");
  363. }