1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* AF_RXRPC local endpoint management
4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/module.h>
11 #include <linux/net.h>
12 #include <linux/skbuff.h>
13 #include <linux/slab.h>
15 #include <net/af_rxrpc.h>
16 #include <generated/utsrelease.h>
17 #include "ar-internal.h"
19 static const char rxrpc_version_string
[65] = "linux-" UTS_RELEASE
" AF_RXRPC";
22 * Reply to a version request
24 static void rxrpc_send_version_request(struct rxrpc_local
*local
,
25 struct rxrpc_host_header
*hdr
,
28 struct rxrpc_wire_header whdr
;
29 struct rxrpc_skb_priv
*sp
= rxrpc_skb(skb
);
30 struct sockaddr_rxrpc srx
;
38 if (rxrpc_extract_addr_from_skb(&srx
, skb
) < 0)
41 msg
.msg_name
= &srx
.transport
;
42 msg
.msg_namelen
= srx
.transport_len
;
43 msg
.msg_control
= NULL
;
44 msg
.msg_controllen
= 0;
47 whdr
.epoch
= htonl(sp
->hdr
.epoch
);
48 whdr
.cid
= htonl(sp
->hdr
.cid
);
49 whdr
.callNumber
= htonl(sp
->hdr
.callNumber
);
52 whdr
.type
= RXRPC_PACKET_TYPE_VERSION
;
53 whdr
.flags
= RXRPC_LAST_PACKET
| (~hdr
->flags
& RXRPC_CLIENT_INITIATED
);
55 whdr
.securityIndex
= 0;
57 whdr
.serviceId
= htons(sp
->hdr
.serviceId
);
59 iov
[0].iov_base
= &whdr
;
60 iov
[0].iov_len
= sizeof(whdr
);
61 iov
[1].iov_base
= (char *)rxrpc_version_string
;
62 iov
[1].iov_len
= sizeof(rxrpc_version_string
);
64 len
= iov
[0].iov_len
+ iov
[1].iov_len
;
66 _proto("Tx VERSION (reply)");
68 ret
= kernel_sendmsg(local
->socket
, &msg
, iov
, 2, len
);
70 trace_rxrpc_tx_fail(local
->debug_id
, 0, ret
,
71 rxrpc_tx_point_version_reply
);
73 trace_rxrpc_tx_packet(local
->debug_id
, &whdr
,
74 rxrpc_tx_point_version_reply
);
80 * Process event packets targetted at a local endpoint.
82 void rxrpc_process_local_events(struct rxrpc_local
*local
)
89 skb
= skb_dequeue(&local
->event_queue
);
91 struct rxrpc_skb_priv
*sp
= rxrpc_skb(skb
);
93 rxrpc_see_skb(skb
, rxrpc_skb_seen
);
94 _debug("{%d},{%u}", local
->debug_id
, sp
->hdr
.type
);
96 switch (sp
->hdr
.type
) {
97 case RXRPC_PACKET_TYPE_VERSION
:
98 if (skb_copy_bits(skb
, sizeof(struct rxrpc_wire_header
),
101 _proto("Rx VERSION { %02x }", v
);
103 rxrpc_send_version_request(local
, &sp
->hdr
, skb
);
107 /* Just ignore anything we don't understand */
111 rxrpc_free_skb(skb
, rxrpc_skb_freed
);