0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/net.h>
0011 #include <linux/gfp.h>
0012 #include <linux/skbuff.h>
0013 #include <linux/export.h>
0014 #include <net/sock.h>
0015 #include <net/af_rxrpc.h>
0016 #include "ar-internal.h"
0017
0018 struct rxrpc_ack_buffer {
0019 struct rxrpc_wire_header whdr;
0020 struct rxrpc_ackpacket ack;
0021 u8 acks[255];
0022 u8 pad[3];
0023 struct rxrpc_ackinfo ackinfo;
0024 };
0025
0026 struct rxrpc_abort_buffer {
0027 struct rxrpc_wire_header whdr;
0028 __be32 abort_code;
0029 };
0030
0031 static const char rxrpc_keepalive_string[] = "";
0032
0033
0034
0035
0036 static void rxrpc_tx_backoff(struct rxrpc_call *call, int ret)
0037 {
0038 if (ret < 0) {
0039 u16 tx_backoff = READ_ONCE(call->tx_backoff);
0040
0041 if (tx_backoff < HZ)
0042 WRITE_ONCE(call->tx_backoff, tx_backoff + 1);
0043 } else {
0044 WRITE_ONCE(call->tx_backoff, 0);
0045 }
0046 }
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 static void rxrpc_set_keepalive(struct rxrpc_call *call)
0057 {
0058 unsigned long now = jiffies, keepalive_at = call->next_rx_timo / 6;
0059
0060 keepalive_at += now;
0061 WRITE_ONCE(call->keepalive_at, keepalive_at);
0062 rxrpc_reduce_call_timer(call, keepalive_at, now,
0063 rxrpc_timer_set_for_keepalive);
0064 }
0065
0066
0067
0068
0069 static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
0070 struct rxrpc_call *call,
0071 struct rxrpc_ack_buffer *pkt,
0072 rxrpc_seq_t *_hard_ack,
0073 rxrpc_seq_t *_top,
0074 u8 reason)
0075 {
0076 rxrpc_serial_t serial;
0077 unsigned int tmp;
0078 rxrpc_seq_t hard_ack, top, seq;
0079 int ix;
0080 u32 mtu, jmax;
0081 u8 *ackp = pkt->acks;
0082
0083 tmp = atomic_xchg(&call->ackr_nr_unacked, 0);
0084 tmp |= atomic_xchg(&call->ackr_nr_consumed, 0);
0085 if (!tmp && (reason == RXRPC_ACK_DELAY ||
0086 reason == RXRPC_ACK_IDLE))
0087 return 0;
0088
0089
0090 serial = call->ackr_serial;
0091 hard_ack = READ_ONCE(call->rx_hard_ack);
0092 top = smp_load_acquire(&call->rx_top);
0093 *_hard_ack = hard_ack;
0094 *_top = top;
0095
0096 pkt->ack.bufferSpace = htons(8);
0097 pkt->ack.maxSkew = htons(0);
0098 pkt->ack.firstPacket = htonl(hard_ack + 1);
0099 pkt->ack.previousPacket = htonl(call->ackr_highest_seq);
0100 pkt->ack.serial = htonl(serial);
0101 pkt->ack.reason = reason;
0102 pkt->ack.nAcks = top - hard_ack;
0103
0104 if (reason == RXRPC_ACK_PING)
0105 pkt->whdr.flags |= RXRPC_REQUEST_ACK;
0106
0107 if (after(top, hard_ack)) {
0108 seq = hard_ack + 1;
0109 do {
0110 ix = seq & RXRPC_RXTX_BUFF_MASK;
0111 if (call->rxtx_buffer[ix])
0112 *ackp++ = RXRPC_ACK_TYPE_ACK;
0113 else
0114 *ackp++ = RXRPC_ACK_TYPE_NACK;
0115 seq++;
0116 } while (before_eq(seq, top));
0117 }
0118
0119 mtu = conn->params.peer->if_mtu;
0120 mtu -= conn->params.peer->hdrsize;
0121 jmax = (call->nr_jumbo_bad > 3) ? 1 : rxrpc_rx_jumbo_max;
0122 pkt->ackinfo.rxMTU = htonl(rxrpc_rx_mtu);
0123 pkt->ackinfo.maxMTU = htonl(mtu);
0124 pkt->ackinfo.rwind = htonl(call->rx_winsize);
0125 pkt->ackinfo.jumbo_max = htonl(jmax);
0126
0127 *ackp++ = 0;
0128 *ackp++ = 0;
0129 *ackp++ = 0;
0130 return top - hard_ack + 3;
0131 }
0132
0133
0134
0135
0136 static int rxrpc_begin_rtt_probe(struct rxrpc_call *call, rxrpc_serial_t serial,
0137 enum rxrpc_rtt_tx_trace why)
0138 {
0139 unsigned long avail = call->rtt_avail;
0140 int rtt_slot = 9;
0141
0142 if (!(avail & RXRPC_CALL_RTT_AVAIL_MASK))
0143 goto no_slot;
0144
0145 rtt_slot = __ffs(avail & RXRPC_CALL_RTT_AVAIL_MASK);
0146 if (!test_and_clear_bit(rtt_slot, &call->rtt_avail))
0147 goto no_slot;
0148
0149 call->rtt_serial[rtt_slot] = serial;
0150 call->rtt_sent_at[rtt_slot] = ktime_get_real();
0151 smp_wmb();
0152 set_bit(rtt_slot + RXRPC_CALL_RTT_PEND_SHIFT, &call->rtt_avail);
0153
0154 trace_rxrpc_rtt_tx(call, why, rtt_slot, serial);
0155 return rtt_slot;
0156
0157 no_slot:
0158 trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_no_slot, rtt_slot, serial);
0159 return -1;
0160 }
0161
0162
0163
0164
0165 static void rxrpc_cancel_rtt_probe(struct rxrpc_call *call,
0166 rxrpc_serial_t serial, int rtt_slot)
0167 {
0168 if (rtt_slot != -1) {
0169 clear_bit(rtt_slot + RXRPC_CALL_RTT_PEND_SHIFT, &call->rtt_avail);
0170 smp_wmb();
0171 set_bit(rtt_slot, &call->rtt_avail);
0172 trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_cancel, rtt_slot, serial);
0173 }
0174 }
0175
0176
0177
0178
0179 int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
0180 rxrpc_serial_t *_serial)
0181 {
0182 struct rxrpc_connection *conn;
0183 struct rxrpc_ack_buffer *pkt;
0184 struct msghdr msg;
0185 struct kvec iov[2];
0186 rxrpc_serial_t serial;
0187 rxrpc_seq_t hard_ack, top;
0188 size_t len, n;
0189 int ret, rtt_slot = -1;
0190 u8 reason;
0191
0192 if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
0193 return -ECONNRESET;
0194
0195 pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
0196 if (!pkt)
0197 return -ENOMEM;
0198
0199 conn = call->conn;
0200
0201 msg.msg_name = &call->peer->srx.transport;
0202 msg.msg_namelen = call->peer->srx.transport_len;
0203 msg.msg_control = NULL;
0204 msg.msg_controllen = 0;
0205 msg.msg_flags = 0;
0206
0207 pkt->whdr.epoch = htonl(conn->proto.epoch);
0208 pkt->whdr.cid = htonl(call->cid);
0209 pkt->whdr.callNumber = htonl(call->call_id);
0210 pkt->whdr.seq = 0;
0211 pkt->whdr.type = RXRPC_PACKET_TYPE_ACK;
0212 pkt->whdr.flags = RXRPC_SLOW_START_OK | conn->out_clientflag;
0213 pkt->whdr.userStatus = 0;
0214 pkt->whdr.securityIndex = call->security_ix;
0215 pkt->whdr._rsvd = 0;
0216 pkt->whdr.serviceId = htons(call->service_id);
0217
0218 spin_lock_bh(&call->lock);
0219 if (ping) {
0220 reason = RXRPC_ACK_PING;
0221 } else {
0222 reason = call->ackr_reason;
0223 if (!call->ackr_reason) {
0224 spin_unlock_bh(&call->lock);
0225 ret = 0;
0226 goto out;
0227 }
0228 call->ackr_reason = 0;
0229 }
0230 n = rxrpc_fill_out_ack(conn, call, pkt, &hard_ack, &top, reason);
0231
0232 spin_unlock_bh(&call->lock);
0233 if (n == 0) {
0234 kfree(pkt);
0235 return 0;
0236 }
0237
0238 iov[0].iov_base = pkt;
0239 iov[0].iov_len = sizeof(pkt->whdr) + sizeof(pkt->ack) + n;
0240 iov[1].iov_base = &pkt->ackinfo;
0241 iov[1].iov_len = sizeof(pkt->ackinfo);
0242 len = iov[0].iov_len + iov[1].iov_len;
0243
0244 serial = atomic_inc_return(&conn->serial);
0245 pkt->whdr.serial = htonl(serial);
0246 trace_rxrpc_tx_ack(call->debug_id, serial,
0247 ntohl(pkt->ack.firstPacket),
0248 ntohl(pkt->ack.serial),
0249 pkt->ack.reason, pkt->ack.nAcks);
0250 if (_serial)
0251 *_serial = serial;
0252
0253 if (ping)
0254 rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping);
0255
0256 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
0257 conn->params.peer->last_tx_at = ktime_get_seconds();
0258 if (ret < 0)
0259 trace_rxrpc_tx_fail(call->debug_id, serial, ret,
0260 rxrpc_tx_point_call_ack);
0261 else
0262 trace_rxrpc_tx_packet(call->debug_id, &pkt->whdr,
0263 rxrpc_tx_point_call_ack);
0264 rxrpc_tx_backoff(call, ret);
0265
0266 if (call->state < RXRPC_CALL_COMPLETE) {
0267 if (ret < 0) {
0268 rxrpc_cancel_rtt_probe(call, serial, rtt_slot);
0269 rxrpc_propose_ACK(call, pkt->ack.reason,
0270 ntohl(pkt->ack.serial),
0271 false, true,
0272 rxrpc_propose_ack_retry_tx);
0273 }
0274
0275 rxrpc_set_keepalive(call);
0276 }
0277
0278 out:
0279 kfree(pkt);
0280 return ret;
0281 }
0282
0283
0284
0285
0286 int rxrpc_send_abort_packet(struct rxrpc_call *call)
0287 {
0288 struct rxrpc_connection *conn;
0289 struct rxrpc_abort_buffer pkt;
0290 struct msghdr msg;
0291 struct kvec iov[1];
0292 rxrpc_serial_t serial;
0293 int ret;
0294
0295
0296
0297
0298
0299
0300
0301 if (rxrpc_is_client_call(call) &&
0302 test_bit(RXRPC_CALL_TX_LAST, &call->flags))
0303 return 0;
0304
0305 if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
0306 return -ECONNRESET;
0307
0308 conn = call->conn;
0309
0310 msg.msg_name = &call->peer->srx.transport;
0311 msg.msg_namelen = call->peer->srx.transport_len;
0312 msg.msg_control = NULL;
0313 msg.msg_controllen = 0;
0314 msg.msg_flags = 0;
0315
0316 pkt.whdr.epoch = htonl(conn->proto.epoch);
0317 pkt.whdr.cid = htonl(call->cid);
0318 pkt.whdr.callNumber = htonl(call->call_id);
0319 pkt.whdr.seq = 0;
0320 pkt.whdr.type = RXRPC_PACKET_TYPE_ABORT;
0321 pkt.whdr.flags = conn->out_clientflag;
0322 pkt.whdr.userStatus = 0;
0323 pkt.whdr.securityIndex = call->security_ix;
0324 pkt.whdr._rsvd = 0;
0325 pkt.whdr.serviceId = htons(call->service_id);
0326 pkt.abort_code = htonl(call->abort_code);
0327
0328 iov[0].iov_base = &pkt;
0329 iov[0].iov_len = sizeof(pkt);
0330
0331 serial = atomic_inc_return(&conn->serial);
0332 pkt.whdr.serial = htonl(serial);
0333
0334 ret = kernel_sendmsg(conn->params.local->socket,
0335 &msg, iov, 1, sizeof(pkt));
0336 conn->params.peer->last_tx_at = ktime_get_seconds();
0337 if (ret < 0)
0338 trace_rxrpc_tx_fail(call->debug_id, serial, ret,
0339 rxrpc_tx_point_call_abort);
0340 else
0341 trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr,
0342 rxrpc_tx_point_call_abort);
0343 rxrpc_tx_backoff(call, ret);
0344 return ret;
0345 }
0346
0347
0348
0349
0350 int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
0351 bool retrans)
0352 {
0353 struct rxrpc_connection *conn = call->conn;
0354 struct rxrpc_wire_header whdr;
0355 struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
0356 struct msghdr msg;
0357 struct kvec iov[2];
0358 rxrpc_serial_t serial;
0359 size_t len;
0360 int ret, rtt_slot = -1;
0361
0362 _enter(",{%d}", skb->len);
0363
0364 if (hlist_unhashed(&call->error_link)) {
0365 spin_lock_bh(&call->peer->lock);
0366 hlist_add_head_rcu(&call->error_link, &call->peer->error_targets);
0367 spin_unlock_bh(&call->peer->lock);
0368 }
0369
0370
0371 serial = atomic_inc_return(&conn->serial);
0372
0373 whdr.epoch = htonl(conn->proto.epoch);
0374 whdr.cid = htonl(call->cid);
0375 whdr.callNumber = htonl(call->call_id);
0376 whdr.seq = htonl(sp->hdr.seq);
0377 whdr.serial = htonl(serial);
0378 whdr.type = RXRPC_PACKET_TYPE_DATA;
0379 whdr.flags = sp->hdr.flags;
0380 whdr.userStatus = 0;
0381 whdr.securityIndex = call->security_ix;
0382 whdr._rsvd = htons(sp->hdr._rsvd);
0383 whdr.serviceId = htons(call->service_id);
0384
0385 if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags) &&
0386 sp->hdr.seq == 1)
0387 whdr.userStatus = RXRPC_USERSTATUS_SERVICE_UPGRADE;
0388
0389 iov[0].iov_base = &whdr;
0390 iov[0].iov_len = sizeof(whdr);
0391 iov[1].iov_base = skb->head;
0392 iov[1].iov_len = skb->len;
0393 len = iov[0].iov_len + iov[1].iov_len;
0394
0395 msg.msg_name = &call->peer->srx.transport;
0396 msg.msg_namelen = call->peer->srx.transport_len;
0397 msg.msg_control = NULL;
0398 msg.msg_controllen = 0;
0399 msg.msg_flags = 0;
0400
0401
0402
0403
0404
0405
0406
0407
0408 if ((!(sp->hdr.flags & RXRPC_LAST_PACKET) ||
0409 rxrpc_to_server(sp)
0410 ) &&
0411 (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events) ||
0412 retrans ||
0413 call->cong_mode == RXRPC_CALL_SLOW_START ||
0414 (call->peer->rtt_count < 3 && sp->hdr.seq & 1) ||
0415 ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000),
0416 ktime_get_real())))
0417 whdr.flags |= RXRPC_REQUEST_ACK;
0418
0419 if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
0420 static int lose;
0421 if ((lose++ & 7) == 7) {
0422 ret = 0;
0423 trace_rxrpc_tx_data(call, sp->hdr.seq, serial,
0424 whdr.flags, retrans, true);
0425 goto done;
0426 }
0427 }
0428
0429 trace_rxrpc_tx_data(call, sp->hdr.seq, serial, whdr.flags, retrans,
0430 false);
0431
0432
0433
0434 if (iov[1].iov_len >= call->peer->maxdata)
0435 goto send_fragmentable;
0436
0437 down_read(&conn->params.local->defrag_sem);
0438
0439 sp->hdr.serial = serial;
0440 smp_wmb();
0441 skb->tstamp = ktime_get_real();
0442 if (whdr.flags & RXRPC_REQUEST_ACK)
0443 rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_data);
0444
0445
0446
0447
0448
0449
0450
0451 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
0452 conn->params.peer->last_tx_at = ktime_get_seconds();
0453
0454 up_read(&conn->params.local->defrag_sem);
0455 if (ret < 0) {
0456 rxrpc_cancel_rtt_probe(call, serial, rtt_slot);
0457 trace_rxrpc_tx_fail(call->debug_id, serial, ret,
0458 rxrpc_tx_point_call_data_nofrag);
0459 } else {
0460 trace_rxrpc_tx_packet(call->debug_id, &whdr,
0461 rxrpc_tx_point_call_data_nofrag);
0462 }
0463
0464 rxrpc_tx_backoff(call, ret);
0465 if (ret == -EMSGSIZE)
0466 goto send_fragmentable;
0467
0468 done:
0469 if (ret >= 0) {
0470 if (whdr.flags & RXRPC_REQUEST_ACK) {
0471 call->peer->rtt_last_req = skb->tstamp;
0472 if (call->peer->rtt_count > 1) {
0473 unsigned long nowj = jiffies, ack_lost_at;
0474
0475 ack_lost_at = rxrpc_get_rto_backoff(call->peer, false);
0476 ack_lost_at += nowj;
0477 WRITE_ONCE(call->ack_lost_at, ack_lost_at);
0478 rxrpc_reduce_call_timer(call, ack_lost_at, nowj,
0479 rxrpc_timer_set_for_lost_ack);
0480 }
0481 }
0482
0483 if (sp->hdr.seq == 1 &&
0484 !test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER,
0485 &call->flags)) {
0486 unsigned long nowj = jiffies, expect_rx_by;
0487
0488 expect_rx_by = nowj + call->next_rx_timo;
0489 WRITE_ONCE(call->expect_rx_by, expect_rx_by);
0490 rxrpc_reduce_call_timer(call, expect_rx_by, nowj,
0491 rxrpc_timer_set_for_normal);
0492 }
0493
0494 rxrpc_set_keepalive(call);
0495 } else {
0496
0497
0498
0499
0500
0501 if (!test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER, &call->flags))
0502 rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
0503 RX_USER_ABORT, ret);
0504 }
0505
0506 _leave(" = %d [%u]", ret, call->peer->maxdata);
0507 return ret;
0508
0509 send_fragmentable:
0510
0511 _debug("send fragment");
0512
0513 down_write(&conn->params.local->defrag_sem);
0514
0515 sp->hdr.serial = serial;
0516 smp_wmb();
0517 skb->tstamp = ktime_get_real();
0518 if (whdr.flags & RXRPC_REQUEST_ACK)
0519 rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_data);
0520
0521 switch (conn->params.local->srx.transport.family) {
0522 case AF_INET6:
0523 case AF_INET:
0524 ip_sock_set_mtu_discover(conn->params.local->socket->sk,
0525 IP_PMTUDISC_DONT);
0526 ret = kernel_sendmsg(conn->params.local->socket, &msg,
0527 iov, 2, len);
0528 conn->params.peer->last_tx_at = ktime_get_seconds();
0529
0530 ip_sock_set_mtu_discover(conn->params.local->socket->sk,
0531 IP_PMTUDISC_DO);
0532 break;
0533
0534 default:
0535 BUG();
0536 }
0537
0538 if (ret < 0) {
0539 rxrpc_cancel_rtt_probe(call, serial, rtt_slot);
0540 trace_rxrpc_tx_fail(call->debug_id, serial, ret,
0541 rxrpc_tx_point_call_data_frag);
0542 } else {
0543 trace_rxrpc_tx_packet(call->debug_id, &whdr,
0544 rxrpc_tx_point_call_data_frag);
0545 }
0546 rxrpc_tx_backoff(call, ret);
0547
0548 up_write(&conn->params.local->defrag_sem);
0549 goto done;
0550 }
0551
0552
0553
0554
0555 void rxrpc_reject_packets(struct rxrpc_local *local)
0556 {
0557 struct sockaddr_rxrpc srx;
0558 struct rxrpc_skb_priv *sp;
0559 struct rxrpc_wire_header whdr;
0560 struct sk_buff *skb;
0561 struct msghdr msg;
0562 struct kvec iov[2];
0563 size_t size;
0564 __be32 code;
0565 int ret, ioc;
0566
0567 _enter("%d", local->debug_id);
0568
0569 iov[0].iov_base = &whdr;
0570 iov[0].iov_len = sizeof(whdr);
0571 iov[1].iov_base = &code;
0572 iov[1].iov_len = sizeof(code);
0573
0574 msg.msg_name = &srx.transport;
0575 msg.msg_control = NULL;
0576 msg.msg_controllen = 0;
0577 msg.msg_flags = 0;
0578
0579 memset(&whdr, 0, sizeof(whdr));
0580
0581 while ((skb = skb_dequeue(&local->reject_queue))) {
0582 rxrpc_see_skb(skb, rxrpc_skb_seen);
0583 sp = rxrpc_skb(skb);
0584
0585 switch (skb->mark) {
0586 case RXRPC_SKB_MARK_REJECT_BUSY:
0587 whdr.type = RXRPC_PACKET_TYPE_BUSY;
0588 size = sizeof(whdr);
0589 ioc = 1;
0590 break;
0591 case RXRPC_SKB_MARK_REJECT_ABORT:
0592 whdr.type = RXRPC_PACKET_TYPE_ABORT;
0593 code = htonl(skb->priority);
0594 size = sizeof(whdr) + sizeof(code);
0595 ioc = 2;
0596 break;
0597 default:
0598 rxrpc_free_skb(skb, rxrpc_skb_freed);
0599 continue;
0600 }
0601
0602 if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) {
0603 msg.msg_namelen = srx.transport_len;
0604
0605 whdr.epoch = htonl(sp->hdr.epoch);
0606 whdr.cid = htonl(sp->hdr.cid);
0607 whdr.callNumber = htonl(sp->hdr.callNumber);
0608 whdr.serviceId = htons(sp->hdr.serviceId);
0609 whdr.flags = sp->hdr.flags;
0610 whdr.flags ^= RXRPC_CLIENT_INITIATED;
0611 whdr.flags &= RXRPC_CLIENT_INITIATED;
0612
0613 ret = kernel_sendmsg(local->socket, &msg,
0614 iov, ioc, size);
0615 if (ret < 0)
0616 trace_rxrpc_tx_fail(local->debug_id, 0, ret,
0617 rxrpc_tx_point_reject);
0618 else
0619 trace_rxrpc_tx_packet(local->debug_id, &whdr,
0620 rxrpc_tx_point_reject);
0621 }
0622
0623 rxrpc_free_skb(skb, rxrpc_skb_freed);
0624 }
0625
0626 _leave("");
0627 }
0628
0629
0630
0631
0632 void rxrpc_send_keepalive(struct rxrpc_peer *peer)
0633 {
0634 struct rxrpc_wire_header whdr;
0635 struct msghdr msg;
0636 struct kvec iov[2];
0637 size_t len;
0638 int ret;
0639
0640 _enter("");
0641
0642 msg.msg_name = &peer->srx.transport;
0643 msg.msg_namelen = peer->srx.transport_len;
0644 msg.msg_control = NULL;
0645 msg.msg_controllen = 0;
0646 msg.msg_flags = 0;
0647
0648 whdr.epoch = htonl(peer->local->rxnet->epoch);
0649 whdr.cid = 0;
0650 whdr.callNumber = 0;
0651 whdr.seq = 0;
0652 whdr.serial = 0;
0653 whdr.type = RXRPC_PACKET_TYPE_VERSION;
0654 whdr.flags = RXRPC_LAST_PACKET;
0655 whdr.userStatus = 0;
0656 whdr.securityIndex = 0;
0657 whdr._rsvd = 0;
0658 whdr.serviceId = 0;
0659
0660 iov[0].iov_base = &whdr;
0661 iov[0].iov_len = sizeof(whdr);
0662 iov[1].iov_base = (char *)rxrpc_keepalive_string;
0663 iov[1].iov_len = sizeof(rxrpc_keepalive_string);
0664
0665 len = iov[0].iov_len + iov[1].iov_len;
0666
0667 _proto("Tx VERSION (keepalive)");
0668
0669 ret = kernel_sendmsg(peer->local->socket, &msg, iov, 2, len);
0670 if (ret < 0)
0671 trace_rxrpc_tx_fail(peer->debug_id, 0, ret,
0672 rxrpc_tx_point_version_keepalive);
0673 else
0674 trace_rxrpc_tx_packet(peer->debug_id, &whdr,
0675 rxrpc_tx_point_version_keepalive);
0676
0677 peer->last_tx_at = ktime_get_seconds();
0678 _leave("");
0679 }