1 /* AF_RXRPC local endpoint management
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
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.
12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 #include <linux/module.h>
15 #include <linux/net.h>
16 #include <linux/skbuff.h>
17 #include <linux/slab.h>
19 #include <net/af_rxrpc.h>
20 #include <generated/utsrelease.h>
21 #include "ar-internal.h"
23 static const char rxrpc_version_string
[65] = "linux-" UTS_RELEASE
" AF_RXRPC";
26 * Reply to a version request
28 static void rxrpc_send_version_request(struct rxrpc_local
*local
,
29 struct rxrpc_host_header
*hdr
,
32 struct rxrpc_wire_header whdr
;
33 struct rxrpc_skb_priv
*sp
= rxrpc_skb(skb
);
34 struct sockaddr_rxrpc srx
;
42 if (rxrpc_extract_addr_from_skb(&srx
, skb
) < 0)
45 msg
.msg_name
= &srx
.transport
;
46 msg
.msg_namelen
= srx
.transport_len
;
47 msg
.msg_control
= NULL
;
48 msg
.msg_controllen
= 0;
51 whdr
.epoch
= htonl(sp
->hdr
.epoch
);
52 whdr
.cid
= htonl(sp
->hdr
.cid
);
53 whdr
.callNumber
= htonl(sp
->hdr
.callNumber
);
56 whdr
.type
= RXRPC_PACKET_TYPE_VERSION
;
57 whdr
.flags
= RXRPC_LAST_PACKET
| (~hdr
->flags
& RXRPC_CLIENT_INITIATED
);
59 whdr
.securityIndex
= 0;
61 whdr
.serviceId
= htons(sp
->hdr
.serviceId
);
63 iov
[0].iov_base
= &whdr
;
64 iov
[0].iov_len
= sizeof(whdr
);
65 iov
[1].iov_base
= (char *)rxrpc_version_string
;
66 iov
[1].iov_len
= sizeof(rxrpc_version_string
);
68 len
= iov
[0].iov_len
+ iov
[1].iov_len
;
70 _proto("Tx VERSION (reply)");
72 ret
= kernel_sendmsg(local
->socket
, &msg
, iov
, 2, len
);
74 trace_rxrpc_tx_fail(local
->debug_id
, 0, ret
,
75 rxrpc_tx_point_version_reply
);
77 trace_rxrpc_tx_packet(local
->debug_id
, &whdr
,
78 rxrpc_tx_point_version_reply
);
84 * Process event packets targetted at a local endpoint.
86 void rxrpc_process_local_events(struct rxrpc_local
*local
)
93 skb
= skb_dequeue(&local
->event_queue
);
95 struct rxrpc_skb_priv
*sp
= rxrpc_skb(skb
);
97 rxrpc_see_skb(skb
, rxrpc_skb_rx_seen
);
98 _debug("{%d},{%u}", local
->debug_id
, sp
->hdr
.type
);
100 switch (sp
->hdr
.type
) {
101 case RXRPC_PACKET_TYPE_VERSION
:
102 if (skb_copy_bits(skb
, sizeof(struct rxrpc_wire_header
),
105 _proto("Rx VERSION { %02x }", v
);
107 rxrpc_send_version_request(local
, &sp
->hdr
, skb
);
111 /* Just ignore anything we don't understand */
115 rxrpc_free_skb(skb
, rxrpc_skb_rx_freed
);