Changes in uspace/lib/c/generic/iplink_srv.c [4802dd7:417a2ba1] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/iplink_srv.c
r4802dd7 r417a2ba1 34 34 * @brief IP link server stub 35 35 */ 36 36 37 #include <errno.h> 37 38 #include <ipc/iplink.h> 38 39 #include <stdlib.h> 39 40 #include <sys/types.h> 40 41 #include <inet/addr.h> 41 42 #include <inet/iplink_srv.h> 42 43 … … 44 45 ipc_call_t *call) 45 46 { 46 int rc;47 47 size_t mtu; 48 49 rc = srv->ops->get_mtu(srv, &mtu); 48 int rc = srv->ops->get_mtu(srv, &mtu); 50 49 async_answer_1(callid, rc, mtu); 51 50 } 52 51 53 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t callid, 54 ipc_call_t *call) 55 { 56 int rc; 57 iplink_srv_addr_t addr; 58 59 addr.ipv4 = IPC_GET_ARG1(*call); 60 52 static void iplink_get_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid, 53 ipc_call_t *icall) 54 { 55 addr48_t mac; 56 int rc = srv->ops->get_mac48(srv, &mac); 57 if (rc != EOK) { 58 async_answer_0(iid, rc); 59 return; 60 } 61 62 ipc_callid_t callid; 63 size_t size; 64 if (!async_data_read_receive(&callid, &size)) { 65 async_answer_0(callid, EREFUSED); 66 async_answer_0(iid, EREFUSED); 67 return; 68 } 69 70 if (size != sizeof(addr48_t)) { 71 async_answer_0(callid, EINVAL); 72 async_answer_0(iid, EINVAL); 73 return; 74 } 75 76 rc = async_data_read_finalize(callid, &mac, size); 77 if (rc != EOK) 78 async_answer_0(callid, rc); 79 80 async_answer_0(iid, (sysarg_t) rc); 81 } 82 83 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid, 84 ipc_call_t *icall) 85 { 86 ipc_callid_t callid; 87 size_t size; 88 if (!async_data_write_receive(&callid, &size)) { 89 async_answer_0(callid, EREFUSED); 90 async_answer_0(iid, EREFUSED); 91 return; 92 } 93 94 if (size != sizeof(inet_addr_t)) { 95 async_answer_0(callid, EINVAL); 96 async_answer_0(iid, EINVAL); 97 return; 98 } 99 100 inet_addr_t addr; 101 int rc = async_data_write_finalize(callid, &addr, size); 102 if (rc != EOK) { 103 async_answer_0(callid, (sysarg_t) rc); 104 async_answer_0(iid, (sysarg_t) rc); 105 } 106 61 107 rc = srv->ops->addr_add(srv, &addr); 62 async_answer_0(callid, rc); 63 } 64 65 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t callid, 66 ipc_call_t *call) 67 { 68 int rc; 69 iplink_srv_addr_t addr; 70 71 addr.ipv4 = IPC_GET_ARG1(*call); 72 108 async_answer_0(iid, (sysarg_t) rc); 109 } 110 111 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t iid, 112 ipc_call_t *icall) 113 { 114 ipc_callid_t callid; 115 size_t size; 116 if (!async_data_write_receive(&callid, &size)) { 117 async_answer_0(callid, EREFUSED); 118 async_answer_0(iid, EREFUSED); 119 return; 120 } 121 122 if (size != sizeof(inet_addr_t)) { 123 async_answer_0(callid, EINVAL); 124 async_answer_0(iid, EINVAL); 125 return; 126 } 127 128 inet_addr_t addr; 129 int rc = async_data_write_finalize(callid, &addr, size); 130 if (rc != EOK) { 131 async_answer_0(callid, (sysarg_t) rc); 132 async_answer_0(iid, (sysarg_t) rc); 133 } 134 73 135 rc = srv->ops->addr_remove(srv, &addr); 74 async_answer_0( callid,rc);75 } 76 77 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t callid,78 ipc_call_t * call)79 { 80 iplink_s rv_sdu_t sdu;81 int rc;82 83 sdu. lsrc.ipv4 = IPC_GET_ARG1(*call);84 sdu.ldest.ipv4 = IPC_GET_ARG2(*call);85 86 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,&sdu.size);87 if (rc != EOK) { 88 async_answer_0( callid, rc);89 return; 90 } 91 136 async_answer_0(iid, (sysarg_t) rc); 137 } 138 139 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t iid, 140 ipc_call_t *icall) 141 { 142 iplink_sdu_t sdu; 143 144 sdu.src = IPC_GET_ARG1(*icall); 145 sdu.dest = IPC_GET_ARG2(*icall); 146 147 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 148 &sdu.size); 149 if (rc != EOK) { 150 async_answer_0(iid, rc); 151 return; 152 } 153 92 154 rc = srv->ops->send(srv, &sdu); 93 155 free(sdu.data); 94 async_answer_0(callid, rc); 156 async_answer_0(iid, rc); 157 } 158 159 static void iplink_send6_srv(iplink_srv_t *srv, ipc_callid_t iid, 160 ipc_call_t *icall) 161 { 162 iplink_sdu6_t sdu; 163 164 ipc_callid_t callid; 165 size_t size; 166 if (!async_data_write_receive(&callid, &size)) { 167 async_answer_0(callid, EREFUSED); 168 async_answer_0(iid, EREFUSED); 169 return; 170 } 171 172 if (size != sizeof(addr48_t)) { 173 async_answer_0(callid, EINVAL); 174 async_answer_0(iid, EINVAL); 175 return; 176 } 177 178 int rc = async_data_write_finalize(callid, &sdu.dest, size); 179 if (rc != EOK) { 180 async_answer_0(callid, (sysarg_t) rc); 181 async_answer_0(iid, (sysarg_t) rc); 182 } 183 184 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 185 &sdu.size); 186 if (rc != EOK) { 187 async_answer_0(iid, rc); 188 return; 189 } 190 191 rc = srv->ops->send6(srv, &sdu); 192 free(sdu.data); 193 async_answer_0(iid, rc); 95 194 } 96 195 … … 106 205 int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 107 206 { 108 iplink_srv_t *srv = (iplink_srv_t *) arg;207 iplink_srv_t *srv = (iplink_srv_t *) arg; 109 208 int rc; 110 209 111 210 fibril_mutex_lock(&srv->lock); 112 211 if (srv->connected) { … … 115 214 return EBUSY; 116 215 } 117 216 118 217 srv->connected = true; 119 218 fibril_mutex_unlock(&srv->lock); 120 219 121 220 /* Accept the connection */ 122 221 async_answer_0(iid, EOK); 123 222 124 223 async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE); 125 224 if (sess == NULL) 126 225 return ENOMEM; 127 226 128 227 srv->client_sess = sess; 129 228 130 229 rc = srv->ops->open(srv); 131 230 if (rc != EOK) 132 231 return rc; 133 232 134 233 while (true) { 135 234 ipc_call_t call; 136 235 ipc_callid_t callid = async_get_call(&call); 137 236 sysarg_t method = IPC_GET_IMETHOD(call); 138 237 139 238 if (!method) { 140 239 /* The other side has hung up */ 141 240 fibril_mutex_lock(&srv->lock); 142 241 srv->connected = false; 143 242 fibril_mutex_unlock(&srv->lock); 144 243 async_answer_0(callid, EOK); 145 244 break; 146 245 } 147 246 148 247 switch (method) { 149 248 case IPLINK_GET_MTU: 150 249 iplink_get_mtu_srv(srv, callid, &call); 151 250 break; 251 case IPLINK_GET_MAC48: 252 iplink_get_mac48_srv(srv, callid, &call); 253 break; 152 254 case IPLINK_SEND: 153 255 iplink_send_srv(srv, callid, &call); 256 break; 257 case IPLINK_SEND6: 258 iplink_send6_srv(srv, callid, &call); 154 259 break; 155 260 case IPLINK_ADDR_ADD: … … 163 268 } 164 269 } 165 270 166 271 return srv->ops->close(srv); 167 272 } 168 273 169 int iplink_ev_recv(iplink_srv_t *srv, iplink_srv_sdu_t *sdu) 274 /* XXX Version should be part of @a sdu */ 275 int iplink_ev_recv(iplink_srv_t *srv, iplink_recv_sdu_t *sdu, ip_ver_t ver) 170 276 { 171 277 if (srv->client_sess == NULL) 172 278 return EIO; 173 279 174 280 async_exch_t *exch = async_exchange_begin(srv->client_sess); 175 281 176 282 ipc_call_t answer; 177 aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4, 178 sdu->ldest.ipv4, &answer); 283 aid_t req = async_send_1(exch, IPLINK_EV_RECV, (sysarg_t)ver, 284 &answer); 285 179 286 int rc = async_data_write_start(exch, sdu->data, sdu->size); 180 287 async_exchange_end(exch); 181 288 182 289 if (rc != EOK) { 183 290 async_forget(req); 184 291 return rc; 185 292 } 186 293 187 294 sysarg_t retval; 188 295 async_wait_for(req, &retval); 189 296 if (retval != EOK) 190 297 return retval; 191 298 192 299 return EOK; 193 300 }
Note:
See TracChangeset
for help on using the changeset viewer.