50
51
assert(inetping_sess == NULL);
52
53
inetping_ev_ops = ev_ops;
54
55
rc = loc_service_get_id(SERVICE_NAME_INETPING, &inetping_svc,
55
56
IPC_FLAG_BLOCKING);
59
60
inetping_sess = loc_service_connect(EXCHANGE_SERIALIZE, inetping_svc,
60
61
IPC_FLAG_BLOCKING);
61
62
if (inetping_sess == NULL)
64
65
async_exch_t *exch = async_exchange_begin(inetping_sess);
66
67
rc = async_connect_to_me(exch, 0, 0, 0, inetping_cb_conn, NULL);
67
68
async_exchange_end(exch);
70
71
async_hangup(inetping_sess);
71
72
inetping_sess = NULL;
78
79
int inetping_send(inetping_sdu_t *sdu)
80
81
async_exch_t *exch = async_exchange_begin(inetping_sess);
83
aid_t req = async_send_3(exch, INETPING_SEND, (sysarg_t) sdu->src,
84
(sysarg_t) sdu->dest, sdu->seq_no, &answer);
85
sysarg_t retval = async_data_write_start(exch, sdu->data, sdu->size);
84
aid_t req = async_send_1(exch, INETPING_SEND, sdu->seq_no, &answer);
86
int rc = async_data_write_start(exch, &sdu->src, sizeof(sdu->src));
88
async_exchange_end(exch);
93
rc = async_data_write_start(exch, &sdu->dest, sizeof(sdu->dest));
95
async_exchange_end(exch);
100
rc = async_data_write_start(exch, sdu->data, sdu->size);
87
102
async_exchange_end(exch);
90
105
async_forget(req);
94
110
async_wait_for(req, &retval);
98
int inetping_get_srcaddr(uint32_t remote, uint32_t *local)
115
int inetping_get_srcaddr(const inet_addr_t *remote, inet_addr_t *local)
100
117
async_exch_t *exch = async_exchange_begin(inetping_sess);
103
int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, (sysarg_t) remote,
120
aid_t req = async_send_0(exch, INETPING_GET_SRCADDR, &answer);
122
int rc = async_data_write_start(exch, remote, sizeof(*remote));
124
async_exchange_end(exch);
129
ipc_call_t answer_local;
130
aid_t req_local = async_data_read(exch, local, sizeof(*local),
106
133
async_exchange_end(exch);
111
*local = (uint32_t) local_addr;
135
sysarg_t retval_local;
136
async_wait_for(req_local, &retval_local);
138
if (retval_local != EOK) {
140
return (int) retval_local;
144
async_wait_for(req, &retval);
115
static void inetping_ev_recv(ipc_callid_t callid, ipc_call_t *call)
149
static void inetping_ev_recv(ipc_callid_t iid, ipc_call_t *icall)
117
151
inetping_sdu_t sdu;
119
sdu.src = IPC_GET_ARG1(*call);
120
sdu.dest = IPC_GET_ARG2(*call);
121
sdu.seq_no = IPC_GET_ARG3(*call);
123
int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
125
async_answer_0(callid, rc);
153
sdu.seq_no = IPC_GET_ARG1(*icall);
157
if (!async_data_write_receive(&callid, &size)) {
158
async_answer_0(callid, EREFUSED);
159
async_answer_0(iid, EREFUSED);
163
if (size != sizeof(sdu.src)) {
164
async_answer_0(callid, EINVAL);
165
async_answer_0(iid, EINVAL);
169
int rc = async_data_write_finalize(callid, &sdu.src, size);
171
async_answer_0(callid, rc);
172
async_answer_0(iid, rc);
176
if (!async_data_write_receive(&callid, &size)) {
177
async_answer_0(callid, EREFUSED);
178
async_answer_0(iid, EREFUSED);
182
if (size != sizeof(sdu.dest)) {
183
async_answer_0(callid, EINVAL);
184
async_answer_0(iid, EINVAL);
188
rc = async_data_write_finalize(callid, &sdu.dest, size);
190
async_answer_0(callid, rc);
191
async_answer_0(iid, rc);
195
rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
197
async_answer_0(iid, rc);
129
201
rc = inetping_ev_ops->recv(&sdu);
131
async_answer_0(callid, rc);
203
async_answer_0(iid, rc);
134
206
static void inetping_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)