Changeset b5cf742a in mainline for uspace/lib/c/generic/iplink_srv.c
- Timestamp:
- 2013-06-28T16:22:42Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- edf0d27
- Parents:
- e52b4b5
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/iplink_srv.c
re52b4b5 rb5cf742a 44 44 ipc_call_t *call) 45 45 { 46 int rc;47 46 size_t mtu; 48 49 rc = srv->ops->get_mtu(srv, &mtu); 47 int rc = srv->ops->get_mtu(srv, &mtu); 50 48 async_answer_1(callid, rc, mtu); 51 49 } … … 70 68 iplink_srv_sdu_t sdu; 71 69 int rc; 72 70 73 71 sdu.lsrc = IPC_GET_ARG1(*call); 74 72 sdu.ldest = IPC_GET_ARG2(*call); 75 73 76 74 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 77 75 if (rc != EOK) { … … 79 77 return; 80 78 } 81 79 82 80 rc = srv->ops->send(srv, &sdu); 83 81 free(sdu.data); … … 98 96 iplink_srv_t *srv = (iplink_srv_t *)arg; 99 97 int rc; 100 98 101 99 fibril_mutex_lock(&srv->lock); 102 100 if (srv->connected) { … … 105 103 return EBUSY; 106 104 } 107 105 108 106 srv->connected = true; 109 107 fibril_mutex_unlock(&srv->lock); 110 108 111 109 /* Accept the connection */ 112 110 async_answer_0(iid, EOK); 113 111 114 112 async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE); 115 113 if (sess == NULL) 116 114 return ENOMEM; 117 115 118 116 srv->client_sess = sess; 119 117 120 118 rc = srv->ops->open(srv); 121 119 if (rc != EOK) 122 120 return rc; 123 121 124 122 while (true) { 125 123 ipc_call_t call; 126 124 ipc_callid_t callid = async_get_call(&call); 127 125 sysarg_t method = IPC_GET_IMETHOD(call); 128 126 129 127 if (!method) { 130 128 /* The other side has hung up */ … … 135 133 break; 136 134 } 137 135 138 136 switch (method) { 139 137 case IPLINK_GET_MTU: … … 153 151 } 154 152 } 155 153 156 154 return srv->ops->close(srv); 157 155 } … … 161 159 if (srv->client_sess == NULL) 162 160 return EIO; 163 161 164 162 async_exch_t *exch = async_exchange_begin(srv->client_sess); 165 163 166 164 ipc_call_t answer; 167 165 aid_t req = async_send_2(exch, IPLINK_EV_RECV, (sysarg_t) sdu->lsrc, … … 169 167 int rc = async_data_write_start(exch, sdu->data, sdu->size); 170 168 async_exchange_end(exch); 171 169 172 170 if (rc != EOK) { 173 171 async_forget(req); 174 172 return rc; 175 173 } 176 174 177 175 sysarg_t retval; 178 176 async_wait_for(req, &retval); 179 177 if (retval != EOK) 180 178 return retval; 181 179 182 180 return EOK; 183 181 }
Note:
See TracChangeset
for help on using the changeset viewer.