Changes in uspace/lib/c/generic/inet.c [d8b47eca:bd8bfc5a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/inet.c
rd8b47eca rbd8bfc5a 30 30 #include <assert.h> 31 31 #include <errno.h> 32 #include <net/socket_codes.h>33 32 #include <inet/inet.h> 34 33 #include <ipc/inet.h> … … 45 44 { 46 45 async_exch_t *exch = async_exchange_begin(inet_sess); 47 46 48 47 ipc_call_t answer; 49 48 aid_t req = async_send_0(exch, INET_CALLBACK_CREATE, &answer); 50 49 int rc = async_connect_to_me(exch, 0, 0, 0, inet_cb_conn, NULL); 51 50 async_exchange_end(exch); 52 51 53 52 if (rc != EOK) 54 53 return rc; 55 54 56 55 sysarg_t retval; 57 56 async_wait_for(req, &retval); 58 59 return retval; 57 if (retval != EOK) 58 return retval; 59 60 return EOK; 60 61 } 61 62 62 63 static int inet_set_proto(uint8_t protocol) 63 64 { 65 int rc; 66 64 67 async_exch_t *exch = async_exchange_begin(inet_sess); 65 intrc = async_req_1_0(exch, INET_SET_PROTO, protocol);68 rc = async_req_1_0(exch, INET_SET_PROTO, protocol); 66 69 async_exchange_end(exch); 67 70 68 71 return rc; 69 72 } … … 77 80 assert(inet_ev_ops == NULL); 78 81 assert(inet_protocol == 0); 79 82 80 83 rc = loc_service_get_id(SERVICE_NAME_INET, &inet_svc, 81 84 IPC_FLAG_BLOCKING); 82 85 if (rc != EOK) 83 86 return ENOENT; 84 87 85 88 inet_sess = loc_service_connect(EXCHANGE_SERIALIZE, inet_svc, 86 89 IPC_FLAG_BLOCKING); 87 90 if (inet_sess == NULL) 88 91 return ENOENT; 89 92 90 93 if (inet_set_proto(protocol) != EOK) { 91 94 async_hangup(inet_sess); … … 93 96 return EIO; 94 97 } 95 98 96 99 if (inet_callback_create() != EOK) { 97 100 async_hangup(inet_sess); … … 99 102 return EIO; 100 103 } 101 104 102 105 inet_protocol = protocol; 103 106 inet_ev_ops = ev_ops; … … 109 112 { 110 113 async_exch_t *exch = async_exchange_begin(inet_sess); 111 114 112 115 ipc_call_t answer; 113 aid_t req = async_send_3(exch, INET_SEND, dgram->tos, ttl, df, 114 &answer); 115 116 int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t)); 116 aid_t req = async_send_5(exch, INET_SEND, dgram->src.ipv4, 117 dgram->dest.ipv4, dgram->tos, ttl, df, &answer); 118 int rc = async_data_write_start(exch, dgram->data, dgram->size); 119 async_exchange_end(exch); 120 117 121 if (rc != EOK) { 118 async_exchange_end(exch); 119 async_forget(req); 122 async_wait_for(req, NULL); 120 123 return rc; 121 124 } 122 123 rc = async_data_write_start(exch, &dgram->dest, sizeof(inet_addr_t)); 124 if (rc != EOK) { 125 async_exchange_end(exch); 126 async_forget(req); 127 return rc; 128 } 129 130 rc = async_data_write_start(exch, dgram->data, dgram->size); 131 132 async_exchange_end(exch); 133 134 if (rc != EOK) { 135 async_forget(req); 136 return rc; 137 } 138 125 139 126 sysarg_t retval; 140 127 async_wait_for(req, &retval); 141 142 return (int) retval; 128 if (retval != EOK) 129 return retval; 130 131 return EOK; 143 132 } 144 133 145 134 int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local) 146 135 { 136 sysarg_t local_addr; 147 137 async_exch_t *exch = async_exchange_begin(inet_sess); 148 149 ipc_call_t answer; 150 aid_t req = async_send_1(exch, INET_GET_SRCADDR, tos, &answer); 151 152 int rc = async_data_write_start(exch, remote, sizeof(inet_addr_t)); 153 if (rc != EOK) { 154 async_exchange_end(exch); 155 async_forget(req); 138 139 int rc = async_req_2_1(exch, INET_GET_SRCADDR, remote->ipv4, 140 tos, &local_addr); 141 async_exchange_end(exch); 142 143 if (rc != EOK) 156 144 return rc; 157 } 158 159 rc = async_data_read_start(exch, local, sizeof(inet_addr_t)); 160 161 async_exchange_end(exch); 162 163 if (rc != EOK) { 164 async_forget(req); 165 return rc; 166 } 167 168 sysarg_t retval; 169 async_wait_for(req, &retval); 170 171 return (int) retval; 145 146 local->ipv4 = local_addr; 147 return EOK; 172 148 } 173 149 174 static void inet_ev_recv(ipc_callid_t iid, ipc_call_t *icall)150 static void inet_ev_recv(ipc_callid_t callid, ipc_call_t *call) 175 151 { 152 int rc; 176 153 inet_dgram_t dgram; 177 178 dgram. tos = IPC_GET_ARG1(*icall);179 180 ipc_callid_t callid;181 size_t size; 182 if (!async_data_write_receive(&callid, &size)) {183 async_answer_0(callid, EINVAL);184 async_answer_0( iid, EINVAL);154 155 dgram.src.ipv4 = IPC_GET_ARG1(*call); 156 dgram.dest.ipv4 = IPC_GET_ARG2(*call); 157 dgram.tos = IPC_GET_ARG3(*call); 158 159 rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size); 160 if (rc != EOK) { 161 async_answer_0(callid, rc); 185 162 return; 186 163 } 187 188 if (size != sizeof(inet_addr_t)) { 189 async_answer_0(callid, EINVAL); 190 async_answer_0(iid, EINVAL); 191 return; 192 } 193 194 int rc = async_data_write_finalize(callid, &dgram.src, size); 195 if (rc != EOK) { 196 async_answer_0(callid, rc); 197 async_answer_0(iid, rc); 198 return; 199 } 200 201 if (!async_data_write_receive(&callid, &size)) { 202 async_answer_0(callid, EINVAL); 203 async_answer_0(iid, EINVAL); 204 return; 205 } 206 207 if (size != sizeof(inet_addr_t)) { 208 async_answer_0(callid, EINVAL); 209 async_answer_0(iid, EINVAL); 210 return; 211 } 212 213 rc = async_data_write_finalize(callid, &dgram.dest, size); 214 if (rc != EOK) { 215 async_answer_0(callid, rc); 216 async_answer_0(iid, rc); 217 return; 218 } 219 220 rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size); 221 if (rc != EOK) { 222 async_answer_0(iid, rc); 223 return; 224 } 225 164 226 165 rc = inet_ev_ops->recv(&dgram); 227 async_answer_0( iid, rc);166 async_answer_0(callid, rc); 228 167 } 229 168 … … 233 172 ipc_call_t call; 234 173 ipc_callid_t callid = async_get_call(&call); 235 174 236 175 if (!IPC_GET_IMETHOD(call)) { 237 176 /* TODO: Handle hangup */ 238 177 return; 239 178 } 240 179 241 180 switch (IPC_GET_IMETHOD(call)) { 242 181 case INET_EV_RECV:
Note:
See TracChangeset
for help on using the changeset viewer.