Changes in uspace/srv/net/udp/assoc.c [a1a101d:c0f3460] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/assoc.c
ra1a101d rc0f3460 36 36 37 37 #include <adt/list.h> 38 #include < bool.h>38 #include <stdbool.h> 39 39 #include <fibril_synch.h> 40 40 #include <io/log.h> … … 82 82 if (lsock != NULL) 83 83 assoc->ident.local = *lsock; 84 84 85 if (fsock != NULL) 85 86 assoc->ident.foreign = *fsock; … … 200 201 /** Set local socket in association. 201 202 * 202 * @param assoc Association 203 * @param fsock Foreign socket (deeply copied) 203 * @param assoc Association 204 * @param lsock Local socket (deeply copied) 205 * 204 206 */ 205 207 void udp_assoc_set_local(udp_assoc_t *assoc, udp_sock_t *lsock) … … 208 210 fibril_mutex_lock(&assoc->lock); 209 211 assoc->ident.local = *lsock; 212 fibril_mutex_unlock(&assoc->lock); 213 } 214 215 /** Set local port in association. 216 * 217 * @param assoc Association 218 * @param lport Local port 219 * 220 */ 221 void udp_assoc_set_local_port(udp_assoc_t *assoc, uint16_t lport) 222 { 223 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %" PRIu16 ")", assoc, lport); 224 fibril_mutex_lock(&assoc->lock); 225 assoc->ident.local.port = lport; 210 226 fibril_mutex_unlock(&assoc->lock); 211 227 } … … 236 252 sp.foreign = *fsock; 237 253 238 if (sp.foreign.addr.ipv4 == 0 || sp.foreign.port == 0) 254 if ((inet_addr_is_any(&sp.foreign.addr)) || 255 (sp.foreign.port == UDP_PORT_ANY)) 239 256 return EINVAL; 240 257 … … 264 281 265 282 fibril_mutex_lock(&assoc->lock); 266 while (list_empty(&assoc->rcv_queue) ) {283 while (list_empty(&assoc->rcv_queue) && !assoc->reset) { 267 284 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - waiting"); 268 285 fibril_condvar_wait(&assoc->rcv_queue_cv, &assoc->lock); 286 } 287 288 if (assoc->reset) { 289 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - association was reset"); 290 fibril_mutex_unlock(&assoc->lock); 291 return ECONNABORTED; 269 292 } 270 293 … … 308 331 } 309 332 333 /** Reset association. 334 * 335 * This causes any pendingreceive operations to return immediately with 336 * UDP_ERESET. 337 */ 338 void udp_assoc_reset(udp_assoc_t *assoc) 339 { 340 fibril_mutex_lock(&assoc->lock); 341 assoc->reset = true; 342 fibril_condvar_broadcast(&assoc->rcv_queue_cv); 343 fibril_mutex_unlock(&assoc->lock); 344 } 345 310 346 static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp, 311 347 udp_msg_t *msg) … … 336 372 static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt) 337 373 { 338 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_socket_match(sock=(%x,%u), pat=(%x,%u))",339 sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port);340 341 if ( patt->addr.ipv4 != UDP_IPV4_ANY&&342 patt->addr.ipv4 != sock->addr.ipv4)374 log_msg(LOG_DEFAULT, LVL_DEBUG, 375 "udp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port); 376 377 if ((!inet_addr_is_any(&patt->addr)) && 378 (!inet_addr_compare(&patt->addr, &sock->addr))) 343 379 return false; 344 345 if ( patt->port != UDP_PORT_ANY&&346 patt->port != sock->port)380 381 if ((patt->port != UDP_PORT_ANY) && 382 (patt->port != sock->port)) 347 383 return false; 348 384 349 385 log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match"); 350 386 351 387 return true; 352 388 } … … 380 416 { 381 417 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp); 382 418 383 419 fibril_mutex_lock(&assoc_list_lock); 384 420 385 421 list_foreach(assoc_list, link) { 386 422 udp_assoc_t *assoc = list_get_instance(link, udp_assoc_t, link); 387 423 udp_sockpair_t *asp = &assoc->ident; 388 log_msg(LOG_DEFAULT, LVL_DEBUG, "compare with assoc (f:(%x,%u), l:(%x,%u))", 389 asp->foreign.addr.ipv4, asp->foreign.port, 390 asp->local.addr.ipv4, asp->local.port); 391 424 392 425 /* Skip unbound associations */ 393 426 if (asp->local.port == UDP_PORT_ANY) 394 427 continue; 395 428 396 429 if (udp_sockpair_match(sp, asp)) { 397 430 log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc); … … 401 434 } 402 435 } 403 436 404 437 fibril_mutex_unlock(&assoc_list_lock); 405 438 return NULL; 406 439 } 407 440 408 409 441 /** 410 442 * @}
Note:
See TracChangeset
for help on using the changeset viewer.