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