Changes in uspace/lib/c/generic/iplink_srv.c [962f03b:02a09ed] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/iplink_srv.c
r962f03b r02a09ed 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_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid, 53 ipc_call_t *icall) 54 { 55 ipc_callid_t callid; 56 size_t size; 57 if (!async_data_write_receive(&callid, &size)) { 58 async_answer_0(callid, EREFUSED); 59 async_answer_0(iid, EREFUSED); 60 return; 61 } 62 63 if (size != sizeof(inet_addr_t)) { 64 async_answer_0(callid, EINVAL); 65 async_answer_0(iid, EINVAL); 66 return; 67 } 68 69 inet_addr_t addr; 70 int rc = async_data_write_finalize(callid, &addr, size); 71 if (rc != EOK) { 72 async_answer_0(callid, (sysarg_t) rc); 73 async_answer_0(iid, (sysarg_t) rc); 74 } 75 61 76 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 77 async_answer_0(iid, (sysarg_t) rc); 78 } 79 80 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t iid, 81 ipc_call_t *icall) 82 { 83 ipc_callid_t callid; 84 size_t size; 85 if (!async_data_write_receive(&callid, &size)) { 86 async_answer_0(callid, EREFUSED); 87 async_answer_0(iid, EREFUSED); 88 return; 89 } 90 91 if (size != sizeof(inet_addr_t)) { 92 async_answer_0(callid, EINVAL); 93 async_answer_0(iid, EINVAL); 94 return; 95 } 96 97 inet_addr_t addr; 98 int rc = async_data_write_finalize(callid, &addr, size); 99 if (rc != EOK) { 100 async_answer_0(callid, (sysarg_t) rc); 101 async_answer_0(iid, (sysarg_t) rc); 102 } 103 73 104 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); 87 if (rc != EOK) { 88 async_answer_0(callid, rc); 89 return; 90 } 91 105 async_answer_0(iid, (sysarg_t) rc); 106 } 107 108 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t iid, 109 ipc_call_t *icall) 110 { 111 iplink_sdu_t sdu; 112 113 ipc_callid_t callid; 114 size_t size; 115 if (!async_data_write_receive(&callid, &size)) { 116 async_answer_0(callid, EREFUSED); 117 async_answer_0(iid, EREFUSED); 118 return; 119 } 120 121 if (size != sizeof(inet_addr_t)) { 122 async_answer_0(callid, EINVAL); 123 async_answer_0(iid, EINVAL); 124 return; 125 } 126 127 int rc = async_data_write_finalize(callid, &sdu.src, size); 128 if (rc != EOK) { 129 async_answer_0(callid, (sysarg_t) rc); 130 async_answer_0(iid, (sysarg_t) rc); 131 } 132 133 if (!async_data_write_receive(&callid, &size)) { 134 async_answer_0(callid, EREFUSED); 135 async_answer_0(iid, EREFUSED); 136 return; 137 } 138 139 if (size != sizeof(inet_addr_t)) { 140 async_answer_0(callid, EINVAL); 141 async_answer_0(iid, EINVAL); 142 return; 143 } 144 145 rc = async_data_write_finalize(callid, &sdu.dest, size); 146 if (rc != EOK) { 147 async_answer_0(callid, (sysarg_t) rc); 148 async_answer_0(iid, (sysarg_t) rc); 149 } 150 151 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 152 &sdu.size); 153 if (rc != EOK) 154 return; 155 92 156 rc = srv->ops->send(srv, &sdu); 93 157 free(sdu.data); 94 async_answer_0( callid, rc);158 async_answer_0(iid, rc); 95 159 } 96 160 … … 108 172 iplink_srv_t *srv = (iplink_srv_t *)arg; 109 173 int rc; 110 174 111 175 fibril_mutex_lock(&srv->lock); 112 176 if (srv->connected) { … … 115 179 return EBUSY; 116 180 } 117 181 118 182 srv->connected = true; 119 183 fibril_mutex_unlock(&srv->lock); 120 184 121 185 /* Accept the connection */ 122 186 async_answer_0(iid, EOK); 123 187 124 188 async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE); 125 189 if (sess == NULL) 126 190 return ENOMEM; 127 191 128 192 srv->client_sess = sess; 129 193 130 194 rc = srv->ops->open(srv); 131 195 if (rc != EOK) 132 196 return rc; 133 197 134 198 while (true) { 135 199 ipc_call_t call; 136 200 ipc_callid_t callid = async_get_call(&call); 137 201 sysarg_t method = IPC_GET_IMETHOD(call); 138 202 139 203 if (!method) { 140 204 /* The other side has hung up */ 205 fibril_mutex_lock(&srv->lock); 206 srv->connected = false; 207 fibril_mutex_unlock(&srv->lock); 141 208 async_answer_0(callid, EOK); 142 209 break; 143 210 } 144 211 145 212 switch (method) { 146 213 case IPLINK_GET_MTU: … … 160 227 } 161 228 } 162 229 163 230 return srv->ops->close(srv); 164 231 } 165 232 166 int iplink_ev_recv(iplink_srv_t *srv, iplink_ srv_sdu_t *sdu)233 int iplink_ev_recv(iplink_srv_t *srv, iplink_recv_sdu_t *sdu, uint16_t af) 167 234 { 168 235 if (srv->client_sess == NULL) 169 236 return EIO; 170 237 171 238 async_exch_t *exch = async_exchange_begin(srv->client_sess); 172 239 173 240 ipc_call_t answer; 174 aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4, 175 sdu->ldest.ipv4, &answer); 241 aid_t req = async_send_1(exch, IPLINK_EV_RECV, (sysarg_t) af, 242 &answer); 243 176 244 int rc = async_data_write_start(exch, sdu->data, sdu->size); 177 245 async_exchange_end(exch); 178 179 if (rc != EOK) { 180 async_ wait_for(req, NULL);246 247 if (rc != EOK) { 248 async_forget(req); 181 249 return rc; 182 250 } 183 251 184 252 sysarg_t retval; 185 253 async_wait_for(req, &retval); 186 254 if (retval != EOK) 187 255 return retval; 188 256 189 257 return EOK; 190 258 }
Note:
See TracChangeset
for help on using the changeset viewer.