Changes in uspace/srv/net/tcp/ucall.c [8499160:5441670] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tcp/ucall.c
r8499160 r5441670 1 1 /* 2 * Copyright (c) 201 5Jiri Svoboda2 * Copyright (c) 2011 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 35 35 */ 36 36 37 #include <errno.h>38 37 #include <fibril_synch.h> 39 38 #include <io/log.h> … … 51 50 /** OPEN user call 52 51 * 53 * @param epp Endpoint pair 52 * @param lsock Local socket 53 * @param fsock Foreign socket 54 54 * @param acpass Active/passive 55 55 * @param oflags Open flags … … 65 65 * establishment. 66 66 */ 67 tcp_error_t tcp_uc_open( inet_ep2_t *epp, acpass_t acpass,67 tcp_error_t tcp_uc_open(tcp_sock_t *lsock, tcp_sock_t *fsock, acpass_t acpass, 68 68 tcp_open_flags_t oflags, tcp_conn_t **conn) 69 69 { 70 70 tcp_conn_t *nconn; 71 int rc; 72 73 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %s, %s, %p)", 74 epp, acpass == ap_active ? "active" : "passive", 71 72 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %p, %s, %s, %p)", 73 lsock, fsock, acpass == ap_active ? "active" : "passive", 75 74 oflags == tcp_open_nonblock ? "nonblock" : "none", conn); 76 75 77 nconn = tcp_conn_new(epp); 78 rc = tcp_conn_add(nconn); 79 if (rc != EOK) { 80 tcp_conn_delete(nconn); 81 return TCP_EEXISTS; 82 } 83 76 nconn = tcp_conn_new(lsock, fsock); 77 tcp_conn_add(nconn); 84 78 tcp_conn_lock(nconn); 85 79 … … 194 188 /* Wait for data to become available */ 195 189 while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) { 196 tcp_conn_unlock(conn);197 return TCP_EAGAIN;198 190 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_receive() - wait for data"); 199 191 fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock); … … 258 250 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent"); 259 251 tcp_conn_reset(conn); 252 tcp_conn_remove(conn); 260 253 tcp_conn_unlock(conn); 261 254 return TCP_EOK; … … 301 294 } 302 295 303 void tcp_uc_set_c b(tcp_conn_t *conn, tcp_cb_t *cb, void *arg)304 { 305 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_c b(%p, %p, %p)",296 void tcp_uc_set_cstate_cb(tcp_conn_t *conn, tcp_cstate_cb_t cb, void *arg) 297 { 298 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_ctate_cb(%p, %p, %p)", 306 299 conn, cb, arg); 307 300 308 conn->cb = cb; 309 conn->cb_arg = arg; 310 } 311 312 void *tcp_uc_get_userptr(tcp_conn_t *conn) 313 { 314 return conn->cb_arg; 301 conn->cstate_cb = cb; 302 conn->cstate_cb_arg = arg; 315 303 } 316 304 … … 320 308 321 309 /** Segment arrived */ 322 void tcp_as_segment_arrived( inet_ep2_t *epp, tcp_segment_t *seg)310 void tcp_as_segment_arrived(tcp_sockpair_t *sp, tcp_segment_t *seg) 323 311 { 324 312 tcp_conn_t *conn; … … 326 314 log_msg(LOG_DEFAULT, LVL_DEBUG, 327 315 "tcp_as_segment_arrived(f:(%u), l:(%u))", 328 epp->remote.port, epp->local.port);329 330 conn = tcp_conn_find_ref( epp);316 sp->foreign.port, sp->local.port); 317 318 conn = tcp_conn_find_ref(sp); 331 319 if (conn == NULL) { 332 320 log_msg(LOG_DEFAULT, LVL_WARN, "No connection found."); 333 tcp_unexpected_segment( epp, seg);321 tcp_unexpected_segment(sp, seg); 334 322 return; 335 323 } 336 324 337 tcp_conn_segment_arrived(conn, epp, seg); 325 tcp_conn_lock(conn); 326 327 if (conn->cstate == st_closed) { 328 log_msg(LOG_DEFAULT, LVL_WARN, "Connection is closed."); 329 tcp_unexpected_segment(sp, seg); 330 tcp_conn_unlock(conn); 331 tcp_conn_delref(conn); 332 return; 333 } 334 335 if (inet_addr_is_any(&conn->ident.foreign.addr)) 336 conn->ident.foreign.addr = sp->foreign.addr; 337 338 if (conn->ident.foreign.port == TCP_PORT_ANY) 339 conn->ident.foreign.port = sp->foreign.port; 340 341 if (inet_addr_is_any(&conn->ident.local.addr)) 342 conn->ident.local.addr = sp->local.addr; 343 344 tcp_conn_segment_arrived(conn, seg); 345 346 tcp_conn_unlock(conn); 338 347 tcp_conn_delref(conn); 339 348 }
Note:
See TracChangeset
for help on using the changeset viewer.