Changeset 7943c43 in mainline for uspace/srv/net/tl/tcp/ucall.c
- Timestamp:
- 2012-01-16T22:45:38Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 32817cc, 3fe58d3c
- Parents:
- 9117ef9b (diff), 3ea725e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/ucall.c
r9117ef9b r7943c43 53 53 * @param fsock Foreign socket 54 54 * @param acpass Active/passive 55 * @param oflags Open flags 55 56 * @param conn Connection 56 57 * … … 65 66 */ 66 67 tcp_error_t tcp_uc_open(tcp_sock_t *lsock, tcp_sock_t *fsock, acpass_t acpass, 67 tcp_ conn_t **conn)68 tcp_open_flags_t oflags, tcp_conn_t **conn) 68 69 { 69 70 tcp_conn_t *nconn; 70 71 71 log_msg(LVL_DEBUG, "tcp_uc_open(%p, %p, %s, % p)",72 log_msg(LVL_DEBUG, "tcp_uc_open(%p, %p, %s, %s, %p)", 72 73 lsock, fsock, acpass == ap_active ? "active" : "passive", 73 conn);74 oflags == tcp_open_nonblock ? "nonblock" : "none", conn); 74 75 75 76 nconn = tcp_conn_new(lsock, fsock); … … 81 82 } 82 83 84 if (oflags == tcp_open_nonblock) { 85 *conn = nconn; 86 return TCP_EOK; 87 } 88 83 89 /* Wait for connection to be established or reset */ 84 90 log_msg(LVL_DEBUG, "tcp_uc_open: Wait for connection."); 85 fibril_mutex_lock(&nconn-> cstate_lock);91 fibril_mutex_lock(&nconn->lock); 86 92 while (nconn->cstate == st_listen || 87 93 nconn->cstate == st_syn_sent || 88 94 nconn->cstate == st_syn_received) { 89 fibril_condvar_wait(&nconn->cstate_cv, &nconn-> cstate_lock);95 fibril_condvar_wait(&nconn->cstate_cv, &nconn->lock); 90 96 } 91 97 … … 93 99 log_msg(LVL_DEBUG, "tcp_uc_open: Connection was reset."); 94 100 assert(nconn->cstate == st_closed); 95 fibril_mutex_unlock(&nconn-> cstate_lock);101 fibril_mutex_unlock(&nconn->lock); 96 102 return TCP_ERESET; 97 103 } 98 104 99 fibril_mutex_unlock(&nconn-> cstate_lock);105 fibril_mutex_unlock(&nconn->lock); 100 106 log_msg(LVL_DEBUG, "tcp_uc_open: Connection was established."); 101 107 102 108 *conn = nconn; 109 log_msg(LVL_DEBUG, "tcp_uc_open -> %p", nconn); 103 110 return TCP_EOK; 104 111 } … … 113 120 log_msg(LVL_DEBUG, "%s: tcp_uc_send()", conn->name); 114 121 115 if (conn->cstate == st_closed) 122 fibril_mutex_lock(&conn->lock); 123 124 if (conn->cstate == st_closed) { 125 fibril_mutex_unlock(&conn->lock); 116 126 return TCP_ENOTEXIST; 127 } 117 128 118 129 if (conn->cstate == st_listen) { … … 121 132 } 122 133 123 if (conn->snd_buf_fin) 134 135 if (conn->snd_buf_fin) { 136 fibril_mutex_unlock(&conn->lock); 124 137 return TCP_ECLOSING; 138 } 125 139 126 140 while (size > 0) { 127 141 buf_free = conn->snd_buf_size - conn->snd_buf_used; 128 while (buf_free == 0 && !conn->reset) 129 tcp_tqueue_new_data(conn); 130 131 if (conn->reset) 142 while (buf_free == 0 && !conn->reset) { 143 log_msg(LVL_DEBUG, "%s: buf_free == 0, waiting.", 144 conn->name); 145 fibril_condvar_wait(&conn->snd_buf_cv, &conn->lock); 146 buf_free = conn->snd_buf_size - conn->snd_buf_used; 147 } 148 149 if (conn->reset) { 150 fibril_mutex_unlock(&conn->lock); 132 151 return TCP_ERESET; 152 } 133 153 134 154 xfer_size = min(size, buf_free); … … 139 159 conn->snd_buf_used += xfer_size; 140 160 size -= xfer_size; 161 162 tcp_tqueue_new_data(conn); 141 163 } 142 164 143 165 tcp_tqueue_new_data(conn); 166 fibril_mutex_unlock(&conn->lock); 144 167 145 168 return TCP_EOK; … … 154 177 log_msg(LVL_DEBUG, "%s: tcp_uc_receive()", conn->name); 155 178 156 if (conn->cstate == st_closed) 179 fibril_mutex_lock(&conn->lock); 180 181 if (conn->cstate == st_closed) { 182 fibril_mutex_unlock(&conn->lock); 157 183 return TCP_ENOTEXIST; 158 159 fibril_mutex_lock(&conn->rcv_buf_lock); 184 } 160 185 161 186 /* Wait for data to become available */ 162 187 while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) { 163 188 log_msg(LVL_DEBUG, "tcp_uc_receive() - wait for data"); 164 fibril_condvar_wait(&conn->rcv_buf_cv, &conn-> rcv_buf_lock);189 fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock); 165 190 } 166 191 167 192 if (conn->rcv_buf_used == 0) { 168 fibril_mutex_unlock(&conn->rcv_buf_lock);169 170 193 *rcvd = 0; 171 194 *xflags = 0; … … 173 196 if (conn->rcv_buf_fin) { 174 197 /* End of data, peer closed connection */ 198 fibril_mutex_unlock(&conn->lock); 175 199 return TCP_ECLOSING; 176 200 } else { 177 201 /* Connection was reset */ 178 202 assert(conn->reset); 203 fibril_mutex_unlock(&conn->lock); 179 204 return TCP_ERESET; 180 205 } … … 192 217 conn->rcv_wnd += xfer_size; 193 218 194 fibril_mutex_unlock(&conn->rcv_buf_lock);195 196 219 /* TODO */ 197 220 *xflags = 0; … … 203 226 conn->name, xfer_size); 204 227 228 fibril_mutex_unlock(&conn->lock); 229 205 230 return TCP_EOK; 206 231 } … … 211 236 log_msg(LVL_DEBUG, "%s: tcp_uc_close()", conn->name); 212 237 213 if (conn->cstate == st_closed) 238 fibril_mutex_lock(&conn->lock); 239 240 if (conn->cstate == st_closed) { 241 fibril_mutex_unlock(&conn->lock); 214 242 return TCP_ENOTEXIST; 215 216 if (conn->snd_buf_fin) 243 } 244 245 if (conn->snd_buf_fin) { 246 fibril_mutex_unlock(&conn->lock); 217 247 return TCP_ECLOSING; 248 } 218 249 219 250 conn->snd_buf_fin = true; 220 251 tcp_tqueue_new_data(conn); 221 252 253 fibril_mutex_unlock(&conn->lock); 222 254 return TCP_EOK; 223 255 } … … 233 265 { 234 266 log_msg(LVL_DEBUG, "tcp_uc_status()"); 235 } 236 267 cstatus->cstate = conn->cstate; 268 } 269 270 /** Delete connection user call. 271 * 272 * (Not in spec.) Inform TCP that the user is done with this connection 273 * and will not make any further calls/references to it. TCP can deallocate 274 * the connection from now on. 275 */ 276 void tcp_uc_delete(tcp_conn_t *conn) 277 { 278 log_msg(LVL_DEBUG, "tcp_uc_delete()"); 279 tcp_conn_delete(conn); 280 } 281 282 void tcp_uc_set_cstate_cb(tcp_conn_t *conn, tcp_cstate_cb_t cb, void *arg) 283 { 284 log_msg(LVL_DEBUG, "tcp_uc_set_ctate_cb(%p, %p, %p)", 285 conn, cb, arg); 286 287 conn->cstate_cb = cb; 288 conn->cstate_cb_arg = arg; 289 } 237 290 238 291 /* … … 249 302 sp->local.addr.ipv4, sp->local.port); 250 303 251 conn = tcp_conn_find(sp); 252 if (conn != NULL && conn->cstate != st_closed) { 253 if (conn->ident.foreign.addr.ipv4 == TCP_IPV4_ANY) 254 conn->ident.foreign.addr.ipv4 = sp->foreign.addr.ipv4; 255 if (conn->ident.foreign.port == TCP_PORT_ANY) 256 conn->ident.foreign.port = sp->foreign.port; 257 if (conn->ident.local.addr.ipv4 == TCP_IPV4_ANY) 258 conn->ident.local.addr.ipv4 = sp->local.addr.ipv4; 259 260 tcp_conn_segment_arrived(conn, seg); 261 } else { 262 if (conn == NULL) 263 log_msg(LVL_WARN, "No connection found."); 264 else 265 log_msg(LVL_WARN, "Connection is closed."); 304 conn = tcp_conn_find_ref(sp); 305 if (conn == NULL) { 306 log_msg(LVL_WARN, "No connection found."); 266 307 tcp_unexpected_segment(sp, seg); 267 } 308 return; 309 } 310 311 fibril_mutex_lock(&conn->lock); 312 313 if (conn->cstate == st_closed) { 314 log_msg(LVL_WARN, "Connection is closed."); 315 tcp_unexpected_segment(sp, seg); 316 fibril_mutex_unlock(&conn->lock); 317 tcp_conn_delref(conn); 318 return; 319 } 320 321 if (conn->ident.foreign.addr.ipv4 == TCP_IPV4_ANY) 322 conn->ident.foreign.addr.ipv4 = sp->foreign.addr.ipv4; 323 if (conn->ident.foreign.port == TCP_PORT_ANY) 324 conn->ident.foreign.port = sp->foreign.port; 325 if (conn->ident.local.addr.ipv4 == TCP_IPV4_ANY) 326 conn->ident.local.addr.ipv4 = sp->local.addr.ipv4; 327 328 tcp_conn_segment_arrived(conn, seg); 329 330 fibril_mutex_unlock(&conn->lock); 331 tcp_conn_delref(conn); 268 332 } 269 333
Note:
See TracChangeset
for help on using the changeset viewer.