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