source: mainline/uspace/lib/c/generic/iplink.c@ 6d1d143

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6d1d143 was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 8 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 6.7 KB
RevLine 
[f834f90d]1/*
2 * Copyright (c) 2012 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libc
30 * @{
31 */
32/**
33 * @file
34 * @brief IP link client stub
35 */
36
37#include <async.h>
38#include <assert.h>
39#include <errno.h>
40#include <inet/iplink.h>
[a2e3ee6]41#include <inet/addr.h>
[f834f90d]42#include <ipc/iplink.h>
43#include <ipc/services.h>
44#include <loc.h>
45#include <stdlib.h>
46
47static void iplink_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
48
[b7fd2a0]49errno_t iplink_open(async_sess_t *sess, iplink_ev_ops_t *ev_ops, void *arg,
[f834f90d]50 iplink_t **riplink)
51{
[77ad86c]52 iplink_t *iplink = calloc(1, sizeof(iplink_t));
[f834f90d]53 if (iplink == NULL)
54 return ENOMEM;
[a35b458]55
[f834f90d]56 iplink->sess = sess;
57 iplink->ev_ops = ev_ops;
[8d48c7e]58 iplink->arg = arg;
[a35b458]59
[f834f90d]60 async_exch_t *exch = async_exchange_begin(sess);
[f9b2cb4c]61
62 port_id_t port;
[b7fd2a0]63 errno_t rc = async_create_callback_port(exch, INTERFACE_IPLINK_CB, 0, 0,
[f9b2cb4c]64 iplink_cb_conn, iplink, &port);
[a35b458]65
[f834f90d]66 async_exchange_end(exch);
[a35b458]67
[f834f90d]68 if (rc != EOK)
69 goto error;
[a35b458]70
[f834f90d]71 *riplink = iplink;
72 return EOK;
[a35b458]73
[f834f90d]74error:
75 if (iplink != NULL)
76 free(iplink);
[a35b458]77
[f834f90d]78 return rc;
79}
80
81void iplink_close(iplink_t *iplink)
82{
83 /* XXX Synchronize with iplink_cb_conn */
84 free(iplink);
85}
86
[b7fd2a0]87errno_t iplink_send(iplink_t *iplink, iplink_sdu_t *sdu)
[f834f90d]88{
89 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]90
[f834f90d]91 ipc_call_t answer;
[a17356fd]92 aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->src,
93 (sysarg_t) sdu->dest, &answer);
[a35b458]94
[b7fd2a0]95 errno_t rc = async_data_write_start(exch, sdu->data, sdu->size);
[a35b458]96
[a17356fd]97 async_exchange_end(exch);
[a35b458]98
[02a09ed]99 if (rc != EOK) {
100 async_forget(req);
101 return rc;
102 }
[a35b458]103
[b7fd2a0]104 errno_t retval;
[a17356fd]105 async_wait_for(req, &retval);
[a35b458]106
[25a179e]107 return retval;
[a17356fd]108}
109
[b7fd2a0]110errno_t iplink_send6(iplink_t *iplink, iplink_sdu6_t *sdu)
[a17356fd]111{
112 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]113
[a17356fd]114 ipc_call_t answer;
115 aid_t req = async_send_0(exch, IPLINK_SEND6, &answer);
[a35b458]116
[b7fd2a0]117 errno_t rc = async_data_write_start(exch, &sdu->dest, sizeof(addr48_t));
[02a09ed]118 if (rc != EOK) {
119 async_exchange_end(exch);
120 async_forget(req);
121 return rc;
122 }
[a35b458]123
[02a09ed]124 rc = async_data_write_start(exch, sdu->data, sdu->size);
[a35b458]125
[f834f90d]126 async_exchange_end(exch);
[a35b458]127
[f834f90d]128 if (rc != EOK) {
[50b581d]129 async_forget(req);
[f834f90d]130 return rc;
131 }
[a35b458]132
[b7fd2a0]133 errno_t retval;
[f834f90d]134 async_wait_for(req, &retval);
[a35b458]135
[25a179e]136 return retval;
[f834f90d]137}
138
[b7fd2a0]139errno_t iplink_get_mtu(iplink_t *iplink, size_t *rmtu)
[f834f90d]140{
141 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]142
[a17356fd]143 sysarg_t mtu;
[b7fd2a0]144 errno_t rc = async_req_0_1(exch, IPLINK_GET_MTU, &mtu);
[a35b458]145
[f834f90d]146 async_exchange_end(exch);
[a35b458]147
[f834f90d]148 if (rc != EOK)
149 return rc;
[a35b458]150
[f834f90d]151 *rmtu = mtu;
152 return EOK;
153}
154
[b7fd2a0]155errno_t iplink_get_mac48(iplink_t *iplink, addr48_t *mac)
[a17356fd]156{
157 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]158
[a17356fd]159 ipc_call_t answer;
160 aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer);
[a35b458]161
[b7fd2a0]162 errno_t rc = async_data_read_start(exch, mac, sizeof(addr48_t));
[a35b458]163
[a17356fd]164 loc_exchange_end(exch);
[a35b458]165
[a17356fd]166 if (rc != EOK) {
167 async_forget(req);
168 return rc;
169 }
[a35b458]170
[b7fd2a0]171 errno_t retval;
[a17356fd]172 async_wait_for(req, &retval);
[a35b458]173
[25a179e]174 return retval;
[a17356fd]175}
176
[b7fd2a0]177errno_t iplink_set_mac48(iplink_t *iplink, addr48_t mac)
[c3b25985]178{
179 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]180
[c3b25985]181 ipc_call_t answer;
182 aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer);
[a35b458]183
[b7fd2a0]184 errno_t rc = async_data_read_start(exch, mac, sizeof(addr48_t));
[a35b458]185
[c3b25985]186 loc_exchange_end(exch);
[a35b458]187
[c3b25985]188 if (rc != EOK) {
189 async_forget(req);
190 return rc;
191 }
[a35b458]192
[b7fd2a0]193 errno_t retval;
[c3b25985]194 async_wait_for(req, &retval);
[a35b458]195
[25a179e]196 return retval;
[c3b25985]197}
198
199
[b7fd2a0]200errno_t iplink_addr_add(iplink_t *iplink, inet_addr_t *addr)
[962f03b]201{
202 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]203
[02a09ed]204 ipc_call_t answer;
205 aid_t req = async_send_0(exch, IPLINK_ADDR_ADD, &answer);
[a35b458]206
[b7fd2a0]207 errno_t rc = async_data_write_start(exch, addr, sizeof(inet_addr_t));
[962f03b]208 async_exchange_end(exch);
[a35b458]209
[02a09ed]210 if (rc != EOK) {
211 async_forget(req);
212 return rc;
213 }
[a35b458]214
[b7fd2a0]215 errno_t retval;
[02a09ed]216 async_wait_for(req, &retval);
[a35b458]217
[25a179e]218 return retval;
[962f03b]219}
220
[b7fd2a0]221errno_t iplink_addr_remove(iplink_t *iplink, inet_addr_t *addr)
[962f03b]222{
223 async_exch_t *exch = async_exchange_begin(iplink->sess);
[a35b458]224
[02a09ed]225 ipc_call_t answer;
226 aid_t req = async_send_0(exch, IPLINK_ADDR_REMOVE, &answer);
[a35b458]227
[b7fd2a0]228 errno_t rc = async_data_write_start(exch, addr, sizeof(inet_addr_t));
[962f03b]229 async_exchange_end(exch);
[a35b458]230
[02a09ed]231 if (rc != EOK) {
232 async_forget(req);
233 return rc;
234 }
[a35b458]235
[b7fd2a0]236 errno_t retval;
[02a09ed]237 async_wait_for(req, &retval);
[a35b458]238
[25a179e]239 return retval;
[962f03b]240}
241
[8d48c7e]242void *iplink_get_userptr(iplink_t *iplink)
243{
244 return iplink->arg;
245}
246
[02a09ed]247static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t iid,
248 ipc_call_t *icall)
[f834f90d]249{
[02a09ed]250 iplink_recv_sdu_t sdu;
[a35b458]251
[417a2ba1]252 ip_ver_t ver = IPC_GET_ARG1(*icall);
[a35b458]253
[b7fd2a0]254 errno_t rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
[02a09ed]255 &sdu.size);
[f834f90d]256 if (rc != EOK) {
[02a09ed]257 async_answer_0(iid, rc);
[f834f90d]258 return;
259 }
[a35b458]260
[417a2ba1]261 rc = iplink->ev_ops->recv(iplink, &sdu, ver);
[ffa8912]262 free(sdu.data);
[02a09ed]263 async_answer_0(iid, rc);
[f834f90d]264}
265
[c3b25985]266static void iplink_ev_change_addr(iplink_t *iplink, ipc_callid_t iid,
267 ipc_call_t *icall)
268{
269 addr48_t *addr;
270 size_t size;
[a35b458]271
[b7fd2a0]272 errno_t rc = async_data_write_accept((void **)&addr, false,
[c3b25985]273 sizeof(addr48_t), sizeof(addr48_t), 0, &size);
274 if (rc != EOK) {
275 async_answer_0(iid, rc);
276 return;
277 }
278
279 rc = iplink->ev_ops->change_addr(iplink, *addr);
280 free(addr);
281 async_answer_0(iid, EOK);
282}
283
[f834f90d]284static void iplink_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
285{
[b5cf742a]286 iplink_t *iplink = (iplink_t *) arg;
[a35b458]287
[f834f90d]288 while (true) {
289 ipc_call_t call;
290 ipc_callid_t callid = async_get_call(&call);
[a35b458]291
[f834f90d]292 if (!IPC_GET_IMETHOD(call)) {
293 /* TODO: Handle hangup */
294 return;
295 }
[a35b458]296
[f834f90d]297 switch (IPC_GET_IMETHOD(call)) {
298 case IPLINK_EV_RECV:
299 iplink_ev_recv(iplink, callid, &call);
300 break;
[c3b25985]301 case IPLINK_EV_CHANGE_ADDR:
302 iplink_ev_change_addr(iplink, callid, &call);
[dc12262]303 break;
[f834f90d]304 default:
305 async_answer_0(callid, ENOTSUP);
306 }
307 }
308}
309
310/** @}
311 */
Note: See TracBrowser for help on using the repository browser.