source: mainline/kernel/generic/src/ipc/ops/concttome.c@ 705ca2b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 705ca2b was 6769005, checked in by Jakub Jermar <jakub@…>, 7 years ago

Use user-defined labels instead of phone hashes

This commit changes the way how the async framework maps incomming calls
to connections. Instead of abusing the kernel addresses of attached
phones as identifiers, the IPC_M_CONNECT_TO_ME and IPC_M_CONNECT_ME_TO
messages allow the server to specify an arbitrary label which is
remembered in the connected phone and consequently imprinted on each
call which is routed through this phone.

The async framework uses the address of the connection structure as the
label. This removes the need for a connection hash table because each
incoming call already remembers the connection in its label.

To disambiguate this new label and the other user-defined label used for
answers, the call structure now has the request_label member for the
former and answer_label member for the latter.

This commit also moves the kernel definition of ipc_data_t to abi/ and
removes the uspace redefinition thereof. Finally, when forwarding the
IPC_M_CONNECT_TO_ME call, the phone capability and the kernel object
allocated in request_process are now correctly disposed of.

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * Copyright (c) 2012 Jakub Jermar
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup kernel_generic_ipc
31 * @{
32 */
33/** @file
34 */
35
36#include <ipc/sysipc_ops.h>
37#include <ipc/ipc.h>
38#include <ipc/ipcrsc.h>
39#include <abi/errno.h>
40#include <arch.h>
41
42static int request_process(call_t *call, answerbox_t *box)
43{
44 cap_phone_handle_t phandle = CAP_NIL;
45 kobject_t *pobj = NULL;
46 errno_t rc = phone_alloc(TASK, false, &phandle, &pobj);
47 if (rc == EOK) {
48 /*
49 * Set the sender-assigned label to the new phone.
50 */
51 pobj->phone->label = IPC_GET_ARG5(call->data);
52 }
53 call->priv = (sysarg_t) pobj;
54 IPC_SET_ARG5(call->data, CAP_HANDLE_RAW(phandle));
55 return 0;
56}
57
58static errno_t answer_cleanup(call_t *answer, ipc_data_t *olddata)
59{
60 cap_phone_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(*olddata);
61 kobject_t *pobj = (kobject_t *) answer->priv;
62
63 if (CAP_HANDLE_VALID(phandle)) {
64 kobject_put(pobj);
65 cap_free(TASK, phandle);
66 }
67
68 return EOK;
69}
70
71static errno_t answer_preprocess(call_t *answer, ipc_data_t *olddata)
72{
73 cap_phone_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(*olddata);
74 kobject_t *pobj = (kobject_t *) answer->priv;
75
76 if (IPC_GET_RETVAL(answer->data) != EOK) {
77 /* The connection was not accepted */
78 answer_cleanup(answer, olddata);
79 } else if (CAP_HANDLE_VALID(phandle)) {
80 /*
81 * The connection was accepted
82 */
83
84 /*
85 * We need to create another reference as the one we have now
86 * will be consumed by ipc_phone_connect().
87 */
88 kobject_add_ref(pobj);
89
90 if (ipc_phone_connect(pobj->phone,
91 &answer->sender->answerbox)) {
92 /* Pass the reference to the capability */
93 cap_publish(TASK, phandle, pobj);
94 } else {
95 /* The answerbox is shutting down. */
96 IPC_SET_RETVAL(answer->data, ENOENT);
97 answer_cleanup(answer, olddata);
98 }
99 } else {
100 IPC_SET_RETVAL(answer->data, ELIMIT);
101 }
102
103 return EOK;
104}
105
106sysipc_ops_t ipc_m_connect_to_me_ops = {
107 .request_preprocess = null_request_preprocess,
108 .request_forget = null_request_forget,
109 .request_process = request_process,
110 .answer_cleanup = answer_cleanup,
111 .answer_preprocess = answer_preprocess,
112 .answer_process = null_answer_process,
113};
114
115/** @}
116 */
Note: See TracBrowser for help on using the repository browser.