2
* Copyright (c) 2012 Jiri Svoboda
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
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.
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.
34
* @brief IP link server stub
37
#include <ipc/iplink.h>
39
#include <sys/types.h>
41
#include <inet/iplink_srv.h>
43
static void iplink_get_mtu_srv(iplink_srv_t *srv, ipc_callid_t callid,
49
rc = srv->ops->get_mtu(srv, &mtu);
50
async_answer_1(callid, rc, mtu);
53
static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t callid,
57
iplink_srv_addr_t addr;
59
addr.ipv4 = IPC_GET_ARG1(*call);
61
rc = srv->ops->addr_add(srv, &addr);
62
async_answer_0(callid, rc);
65
static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t callid,
69
iplink_srv_addr_t addr;
71
addr.ipv4 = IPC_GET_ARG1(*call);
73
rc = srv->ops->addr_remove(srv, &addr);
74
async_answer_0(callid, rc);
77
static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t callid,
83
sdu.lsrc.ipv4 = IPC_GET_ARG1(*call);
84
sdu.ldest.ipv4 = IPC_GET_ARG2(*call);
86
rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
88
async_answer_0(callid, rc);
92
rc = srv->ops->send(srv, &sdu);
94
async_answer_0(callid, rc);
97
void iplink_srv_init(iplink_srv_t *srv)
99
fibril_mutex_initialize(&srv->lock);
100
srv->connected = false;
103
srv->client_sess = NULL;
106
int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
108
iplink_srv_t *srv = (iplink_srv_t *)arg;
111
fibril_mutex_lock(&srv->lock);
112
if (srv->connected) {
113
fibril_mutex_unlock(&srv->lock);
114
async_answer_0(iid, EBUSY);
118
srv->connected = true;
119
fibril_mutex_unlock(&srv->lock);
121
/* Accept the connection */
122
async_answer_0(iid, EOK);
124
async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE);
128
srv->client_sess = sess;
130
rc = srv->ops->open(srv);
136
ipc_callid_t callid = async_get_call(&call);
137
sysarg_t method = IPC_GET_IMETHOD(call);
140
/* The other side has hung up */
141
async_answer_0(callid, EOK);
147
iplink_get_mtu_srv(srv, callid, &call);
150
iplink_send_srv(srv, callid, &call);
152
case IPLINK_ADDR_ADD:
153
iplink_addr_add_srv(srv, callid, &call);
155
case IPLINK_ADDR_REMOVE:
156
iplink_addr_remove_srv(srv, callid, &call);
159
async_answer_0(callid, EINVAL);
163
return srv->ops->close(srv);
166
int iplink_ev_recv(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
168
if (srv->client_sess == NULL)
171
async_exch_t *exch = async_exchange_begin(srv->client_sess);
174
aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4,
175
sdu->ldest.ipv4, &answer);
176
int rc = async_data_write_start(exch, sdu->data, sdu->size);
177
async_exchange_end(exch);
185
async_wait_for(req, &retval);