Changeset 048cd69 in mainline for uspace/srv/net/udp
- Timestamp:
- 2015-06-07T15:41:04Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 204ba47
- Parents:
- 4d11204 (diff), c3f7d37 (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. - Location:
- uspace/srv/net/udp
- Files:
-
- 1 added
- 3 deleted
- 9 edited
- 1 moved
-
Makefile (modified) (2 diffs)
-
assoc.c (modified) (17 diffs)
-
assoc.h (modified) (2 diffs)
-
msg.c (modified) (1 diff)
-
pdu.c (modified) (8 diffs)
-
pdu.h (modified) (3 diffs)
-
service.c (added)
-
service.h (moved) (moved from uspace/srv/net/udp/sock.h ) (2 diffs)
-
sock.c (deleted)
-
ucall.c (deleted)
-
ucall.h (deleted)
-
udp.c (modified) (3 diffs)
-
udp_inet.c (modified) (3 diffs)
-
udp_type.h (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/Makefile
r4d11204 r048cd69 28 28 29 29 USPACE_PREFIX = ../../.. 30 LIBS = $(LIBNET_PREFIX)/libnet.a 31 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include 30 31 LIBS = \ 32 $(LIBNETTL_PREFIX)/libnettl.a 33 34 EXTRA_CFLAGS += \ 35 -I$(LIBNETTL_PREFIX)/include 36 32 37 BINARY = udp 33 38 … … 35 40 assoc.c \ 36 41 msg.c \ 37 sock.c \38 42 pdu.c \ 39 ucall.c \43 service.c \ 40 44 udp.c \ 41 45 udp_inet.c -
uspace/srv/net/udp/assoc.c
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 37 37 #include <adt/list.h> 38 #include <errno.h> 38 39 #include <stdbool.h> 39 40 #include <fibril_synch.h> 41 #include <inet/endpoint.h> 40 42 #include <io/log.h> 43 #include <nettl/amap.h> 41 44 #include <stdlib.h> 42 45 … … 44 47 #include "msg.h" 45 48 #include "pdu.h" 46 #include "ucall.h"47 49 #include "udp_inet.h" 48 50 #include "udp_type.h" 49 51 50 LIST_INITIALIZE(assoc_list); 51 FIBRIL_MUTEX_INITIALIZE(assoc_list_lock); 52 53 static udp_assoc_t *udp_assoc_find_ref(udp_sockpair_t *); 54 static int udp_assoc_queue_msg(udp_assoc_t *, udp_sockpair_t *, udp_msg_t *); 55 static bool udp_socket_match(udp_sock_t *, udp_sock_t *); 56 static bool udp_sockpair_match(udp_sockpair_t *, udp_sockpair_t *); 52 static LIST_INITIALIZE(assoc_list); 53 static FIBRIL_MUTEX_INITIALIZE(assoc_list_lock); 54 static amap_t *amap; 55 56 static udp_assoc_t *udp_assoc_find_ref(inet_ep2_t *); 57 static int udp_assoc_queue_msg(udp_assoc_t *, inet_ep2_t *, udp_msg_t *); 58 59 /** Initialize associations. */ 60 int udp_assocs_init(void) 61 { 62 int rc; 63 64 rc = amap_create(&amap); 65 if (rc != EOK) { 66 assert(rc == ENOMEM); 67 return ENOMEM; 68 } 69 70 return EOK; 71 } 57 72 58 73 /** Create new association structure. 59 74 * 60 * @param lsock Local socket (will be deeply copied) 61 * @param fsock Foreign socket (will be deeply copied) 75 * @param epp Endpoint pair (will be copied) 76 * @param cb Callbacks 77 * @param cb_arg Callback argument 62 78 * @return New association or NULL 63 79 */ 64 udp_assoc_t *udp_assoc_new( udp_sock_t *lsock, udp_sock_t *fsock)80 udp_assoc_t *udp_assoc_new(inet_ep2_t *epp, udp_assoc_cb_t *cb, void *cb_arg) 65 81 { 66 82 udp_assoc_t *assoc = NULL; … … 80 96 fibril_condvar_initialize(&assoc->rcv_queue_cv); 81 97 82 if (lsock != NULL) 83 assoc->ident.local = *lsock; 84 85 if (fsock != NULL) 86 assoc->ident.foreign = *fsock; 87 98 if (epp != NULL) 99 assoc->ident = *epp; 100 101 assoc->cb = cb; 102 assoc->cb_arg = cb_arg; 88 103 return assoc; 89 104 error: … … 166 181 * Add association to the association map. 167 182 */ 168 void udp_assoc_add(udp_assoc_t *assoc) 169 { 183 int udp_assoc_add(udp_assoc_t *assoc) 184 { 185 inet_ep2_t aepp; 186 int rc; 187 170 188 udp_assoc_addref(assoc); 171 189 fibril_mutex_lock(&assoc_list_lock); 190 191 rc = amap_insert(amap, &assoc->ident, assoc, af_allow_system, &aepp); 192 if (rc != EOK) { 193 udp_assoc_delref(assoc); 194 fibril_mutex_unlock(&assoc_list_lock); 195 return rc; 196 } 197 198 assoc->ident = aepp; 172 199 list_append(&assoc->link, &assoc_list); 173 200 fibril_mutex_unlock(&assoc_list_lock); 201 202 return EOK; 174 203 } 175 204 … … 181 210 { 182 211 fibril_mutex_lock(&assoc_list_lock); 212 amap_remove(amap, &assoc->ident); 183 213 list_remove(&assoc->link); 184 214 fibril_mutex_unlock(&assoc_list_lock); … … 196 226 assoc, iplink); 197 227 fibril_mutex_lock(&assoc->lock); 198 assoc->ident. iplink = iplink;228 assoc->ident.local_link = iplink; 199 229 fibril_mutex_unlock(&assoc->lock); 200 230 } 201 231 202 /** Set foreign socket in association.203 *204 * @param assoc Association205 * @param fsock Foreign socket (deeply copied)206 */207 void udp_assoc_set_foreign(udp_assoc_t *assoc, udp_sock_t *fsock)208 {209 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_foreign(%p, %p)", assoc, fsock);210 fibril_mutex_lock(&assoc->lock);211 assoc->ident.foreign = *fsock;212 fibril_mutex_unlock(&assoc->lock);213 }214 215 /** Set local socket in association.216 *217 * @param assoc Association218 * @param lsock Local socket (deeply copied)219 *220 */221 void udp_assoc_set_local(udp_assoc_t *assoc, udp_sock_t *lsock)222 {223 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %p)", assoc, lsock);224 fibril_mutex_lock(&assoc->lock);225 assoc->ident.local = *lsock;226 fibril_mutex_unlock(&assoc->lock);227 }228 229 /** Set local port in association.230 *231 * @param assoc Association232 * @param lport Local port233 *234 */235 void udp_assoc_set_local_port(udp_assoc_t *assoc, uint16_t lport)236 {237 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %" PRIu16 ")", assoc, lport);238 fibril_mutex_lock(&assoc->lock);239 assoc->ident.local.port = lport;240 fibril_mutex_unlock(&assoc->lock);241 }242 243 232 /** Send message to association. 244 233 * 245 234 * @param assoc Association 246 * @param fsock Foreign socket or NULL not to override @a assoc235 * @param remote Remote endpoint or NULL not to override @a assoc 247 236 * @param msg Message 248 237 * 249 238 * @return EOK on success 250 * EINVAL if foreign socket is not set239 * EINVAL if remote endpoint is not set 251 240 * ENOMEM if out of resources 252 241 * EIO if no route to destination exists 253 242 */ 254 int udp_assoc_send(udp_assoc_t *assoc, udp_sock_t *fsock, udp_msg_t *msg)243 int udp_assoc_send(udp_assoc_t *assoc, inet_ep_t *remote, udp_msg_t *msg) 255 244 { 256 245 udp_pdu_t *pdu; 257 udp_sockpair_t sp;246 inet_ep2_t epp; 258 247 int rc; 259 248 260 249 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send(%p, %p, %p)", 261 assoc, fsock, msg); 262 263 /* @a fsock can be used to override the foreign socket */ 264 sp = assoc->ident; 265 if (fsock != NULL) 266 sp.foreign = *fsock; 267 268 if ((inet_addr_is_any(&sp.foreign.addr)) || 269 (sp.foreign.port == UDP_PORT_ANY)) 250 assoc, remote, msg); 251 252 /* @a remote can be used to override the remote endpoint */ 253 epp = assoc->ident; 254 if (remote != NULL) 255 epp.remote = *remote; 256 257 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - check addr any"); 258 259 if ((inet_addr_is_any(&epp.remote.addr)) || 260 (epp.remote.port == inet_port_any)) 270 261 return EINVAL; 271 262 272 rc = udp_pdu_encode(&sp, msg, &pdu); 263 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - check version"); 264 265 if (epp.remote.addr.version != epp.local.addr.version) 266 return EINVAL; 267 268 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - encode pdu"); 269 270 rc = udp_pdu_encode(&epp, msg, &pdu); 273 271 if (rc != EOK) 274 272 return ENOMEM; 275 273 274 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - transmit"); 275 276 276 rc = udp_transmit_pdu(pdu); 277 277 udp_pdu_delete(pdu); … … 280 280 return EIO; 281 281 282 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - success"); 282 283 return EOK; 283 284 } … … 287 288 * Pull one message from the association's receive queue. 288 289 */ 289 int udp_assoc_recv(udp_assoc_t *assoc, udp_msg_t **msg, udp_sock_t *fsock)290 int udp_assoc_recv(udp_assoc_t *assoc, udp_msg_t **msg, inet_ep_t *remote) 290 291 { 291 292 link_t *link; … … 303 304 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - association was reset"); 304 305 fibril_mutex_unlock(&assoc->lock); 305 return E CONNABORTED;306 return ENXIO; 306 307 } 307 308 … … 313 314 314 315 *msg = rqe->msg; 315 * fsock = rqe->sp.foreign;316 *remote = rqe->epp.remote; 316 317 free(rqe); 317 318 … … 323 324 * Find the association to which the message belongs and queue it. 324 325 */ 325 void udp_assoc_received( udp_sockpair_t *rsp, udp_msg_t *msg)326 void udp_assoc_received(inet_ep2_t *repp, udp_msg_t *msg) 326 327 { 327 328 udp_assoc_t *assoc; 328 329 int rc; 329 330 330 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_received(%p, %p)", r sp, msg);331 332 assoc = udp_assoc_find_ref(r sp);331 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_received(%p, %p)", repp, msg); 332 333 assoc = udp_assoc_find_ref(repp); 333 334 if (assoc == NULL) { 334 335 log_msg(LOG_DEFAULT, LVL_DEBUG, "No association found. Message dropped."); … … 339 340 } 340 341 341 rc = udp_assoc_queue_msg(assoc, rsp, msg); 342 if (rc != EOK) { 343 log_msg(LOG_DEFAULT, LVL_DEBUG, "Out of memory. Message dropped."); 342 if (0) { 343 rc = udp_assoc_queue_msg(assoc, repp, msg); 344 if (rc != EOK) { 345 log_msg(LOG_DEFAULT, LVL_DEBUG, "Out of memory. Message dropped."); 344 346 /* XXX Generate ICMP error? */ 345 } 347 } 348 } 349 350 log_msg(LOG_DEFAULT, LVL_DEBUG, "call assoc->cb->recv_msg"); 351 assoc->cb->recv_msg(assoc->cb_arg, repp, msg); 352 udp_assoc_delref(assoc); 346 353 } 347 354 … … 359 366 } 360 367 361 static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp,368 static int udp_assoc_queue_msg(udp_assoc_t *assoc, inet_ep2_t *epp, 362 369 udp_msg_t *msg) 363 370 { … … 365 372 366 373 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_queue_msg(%p, %p, %p)", 367 assoc, sp, msg);374 assoc, epp, msg); 368 375 369 376 rqe = calloc(1, sizeof(udp_rcv_queue_entry_t)); … … 372 379 373 380 link_initialize(&rqe->link); 374 rqe-> sp = *sp;381 rqe->epp = *epp; 375 382 rqe->msg = msg; 376 383 … … 384 391 } 385 392 386 /** Match socket with pattern. */ 387 static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt) 388 { 389 log_msg(LOG_DEFAULT, LVL_DEBUG, 390 "udp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port); 391 392 if ((!inet_addr_is_any(&patt->addr)) && 393 (!inet_addr_compare(&patt->addr, &sock->addr))) 394 return false; 395 396 if ((patt->port != UDP_PORT_ANY) && 397 (patt->port != sock->port)) 398 return false; 399 400 log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match"); 401 402 return true; 403 } 404 405 /** Match socket pair with pattern. */ 406 static bool udp_sockpair_match(udp_sockpair_t *sp, udp_sockpair_t *pattern) 407 { 408 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sockpair_match(%p, %p)", sp, pattern); 409 410 if (!udp_socket_match(&sp->local, &pattern->local)) 411 return false; 412 413 if (!udp_socket_match(&sp->foreign, &pattern->foreign)) 414 return false; 415 416 log_msg(LOG_DEFAULT, LVL_DEBUG, "Socket pair matched."); 417 return true; 418 } 419 420 421 /** Find association structure for specified socket pair. 422 * 423 * An association is uniquely identified by a socket pair. Look up our 424 * association map and return association structure based on socket pair. 393 /** Find association structure for specified endpoint pair. 394 * 395 * An association is uniquely identified by an endpoint pair. Look up our 396 * association map and return association structure based on endpoint pair. 425 397 * The association reference count is bumped by one. 426 398 * 427 * @param sp Socket pair399 * @param epp Endpoint pair 428 400 * @return Association structure or NULL if not found. 429 401 */ 430 static udp_assoc_t *udp_assoc_find_ref(udp_sockpair_t *sp) 431 { 432 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp); 433 402 static udp_assoc_t *udp_assoc_find_ref(inet_ep2_t *epp) 403 { 404 int rc; 405 void *arg; 406 udp_assoc_t *assoc; 407 408 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", epp); 434 409 fibril_mutex_lock(&assoc_list_lock); 435 436 list_foreach(assoc_list, link, udp_assoc_t, assoc) { 437 udp_sockpair_t *asp = &assoc->ident; 438 439 /* Skip unbound associations */ 440 if (asp->local.port == UDP_PORT_ANY) 441 continue; 442 443 if (udp_sockpair_match(sp, asp)) { 444 log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc); 445 udp_assoc_addref(assoc); 446 fibril_mutex_unlock(&assoc_list_lock); 447 return assoc; 448 } 449 } 450 410 411 rc = amap_find_match(amap, epp, &arg); 412 if (rc != EOK) { 413 assert(rc == ENOMEM); 414 fibril_mutex_unlock(&assoc_list_lock); 415 return NULL; 416 } 417 418 assoc = (udp_assoc_t *)arg; 419 udp_assoc_addref(assoc); 420 451 421 fibril_mutex_unlock(&assoc_list_lock); 452 return NULL;422 return assoc; 453 423 } 454 424 -
uspace/srv/net/udp/assoc.h
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define ASSOC_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <ipc/loc.h> 39 40 #include <sys/types.h> 40 41 #include "udp_type.h" 41 42 42 extern udp_assoc_t *udp_assoc_new(udp_sock_t *, udp_sock_t *); 43 extern int udp_assocs_init(void); 44 extern udp_assoc_t *udp_assoc_new(inet_ep2_t *, udp_assoc_cb_t *, void *); 43 45 extern void udp_assoc_delete(udp_assoc_t *); 44 extern voidudp_assoc_add(udp_assoc_t *);46 extern int udp_assoc_add(udp_assoc_t *); 45 47 extern void udp_assoc_remove(udp_assoc_t *); 46 48 extern void udp_assoc_addref(udp_assoc_t *); 47 49 extern void udp_assoc_delref(udp_assoc_t *); 48 50 extern void udp_assoc_set_iplink(udp_assoc_t *, service_id_t); 49 extern void udp_assoc_set_foreign(udp_assoc_t *, udp_sock_t *); 50 extern void udp_assoc_set_local(udp_assoc_t *, udp_sock_t *); 51 extern void udp_assoc_set_local_port(udp_assoc_t *, uint16_t); 52 extern int udp_assoc_send(udp_assoc_t *, udp_sock_t *, udp_msg_t *); 53 extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, udp_sock_t *); 54 extern void udp_assoc_received(udp_sockpair_t *, udp_msg_t *); 51 extern int udp_assoc_send(udp_assoc_t *, inet_ep_t *, udp_msg_t *); 52 extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, inet_ep_t *); 53 extern void udp_assoc_received(inet_ep2_t *, udp_msg_t *); 55 54 extern void udp_assoc_reset(udp_assoc_t *); 56 55 -
uspace/srv/net/udp/msg.c
r4d11204 r048cd69 50 50 void udp_msg_delete(udp_msg_t *msg) 51 51 { 52 free(msg->data); 52 53 free(msg); 53 54 } -
uspace/srv/net/udp/pdu.c
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 41 41 #include <stdlib.h> 42 42 #include <inet/addr.h> 43 #include <net/socket_codes.h>44 43 #include "msg.h" 45 44 #include "pdu.h" … … 163 162 164 163 /** Decode incoming PDU */ 165 int udp_pdu_decode(udp_pdu_t *pdu, udp_sockpair_t *sp, udp_msg_t **msg)164 int udp_pdu_decode(udp_pdu_t *pdu, inet_ep2_t *epp, udp_msg_t **msg) 166 165 { 167 166 udp_msg_t *nmsg; … … 180 179 hdr = (udp_header_t *)pdu->data; 181 180 182 sp->foreign.port = uint16_t_be2host(hdr->src_port); 183 sp->foreign.addr = pdu->src; 184 sp->local.port = uint16_t_be2host(hdr->dest_port); 185 sp->local.addr = pdu->dest; 181 epp->local_link = pdu->iplink; 182 epp->remote.port = uint16_t_be2host(hdr->src_port); 183 epp->remote.addr = pdu->src; 184 epp->local.port = uint16_t_be2host(hdr->dest_port); 185 epp->local.addr = pdu->dest; 186 186 187 187 length = uint16_t_be2host(hdr->length); … … 197 197 return ENOMEM; 198 198 199 nmsg->data = text;200 199 nmsg->data_size = length - sizeof(udp_header_t); 200 nmsg->data = malloc(nmsg->data_size); 201 if (nmsg->data == NULL) 202 return ENOMEM; 203 204 memcpy(nmsg->data, text, nmsg->data_size); 201 205 202 206 *msg = nmsg; … … 205 209 206 210 /** Encode outgoing PDU */ 207 int udp_pdu_encode( udp_sockpair_t *sp, udp_msg_t *msg, udp_pdu_t **pdu)211 int udp_pdu_encode(inet_ep2_t *epp, udp_msg_t *msg, udp_pdu_t **pdu) 208 212 { 209 213 udp_pdu_t *npdu; … … 215 219 return ENOMEM; 216 220 217 npdu->iplink = sp->iplink;218 npdu->src = sp->local.addr;219 npdu->dest = sp->foreign.addr;221 npdu->iplink = epp->local_link; 222 npdu->src = epp->local.addr; 223 npdu->dest = epp->remote.addr; 220 224 221 225 npdu->data_size = sizeof(udp_header_t) + msg->data_size; … … 227 231 228 232 hdr = (udp_header_t *)npdu->data; 229 hdr->src_port = host2uint16_t_be( sp->local.port);230 hdr->dest_port = host2uint16_t_be( sp->foreign.port);233 hdr->src_port = host2uint16_t_be(epp->local.port); 234 hdr->dest_port = host2uint16_t_be(epp->remote.port); 231 235 hdr->length = host2uint16_t_be(npdu->data_size); 232 236 hdr->checksum = 0; -
uspace/srv/net/udp/pdu.h
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define PDU_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <sys/types.h> 39 40 #include "std.h" … … 42 43 extern udp_pdu_t *udp_pdu_new(void); 43 44 extern void udp_pdu_delete(udp_pdu_t *); 44 extern int udp_pdu_decode(udp_pdu_t *, udp_sockpair_t *, udp_msg_t **);45 extern int udp_pdu_encode( udp_sockpair_t *, udp_msg_t *, udp_pdu_t **);45 extern int udp_pdu_decode(udp_pdu_t *, inet_ep2_t *, udp_msg_t **); 46 extern int udp_pdu_encode(inet_ep2_t *, udp_msg_t *, udp_pdu_t **); 46 47 47 48 #endif -
uspace/srv/net/udp/service.h
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 /** @file Socket provider32 /** @file HelenOS service implementation 33 33 */ 34 34 35 #ifndef S OCK_H36 #define S OCK_H35 #ifndef SERVICE_H 36 #define SERVICE_H 37 37 38 #include <async.h> 39 40 extern int udp_sock_init(void); 38 extern int udp_service_init(void); 41 39 42 40 #endif -
uspace/srv/net/udp/udp.c
r4d11204 r048cd69 41 41 #include <task.h> 42 42 43 #include "assoc.h" 44 #include "service.h" 43 45 #include "udp_inet.h" 44 #include "sock.h"45 46 46 47 #define NAME "udp" … … 52 53 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_init()"); 53 54 55 rc = udp_assocs_init(); 56 if (rc != EOK) { 57 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing associations."); 58 return ENOMEM; 59 } 60 54 61 rc = udp_inet_init(); 55 62 if (rc != EOK) { … … 58 65 } 59 66 60 rc = udp_s ock_init();67 rc = udp_service_init(); 61 68 if (rc != EOK) { 62 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing socketservice.");69 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing UDP service."); 63 70 return ENOENT; 64 71 } -
uspace/srv/net/udp/udp_inet.c
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 64 64 65 65 pdu = udp_pdu_new(); 66 pdu->iplink = dgram->iplink; 66 67 pdu->data = dgram->data; 67 68 pdu->data_size = dgram->size; … … 105 106 { 106 107 udp_msg_t *dmsg; 107 udp_sockpair_t rident;108 inet_ep2_t rident; 108 109 109 110 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_received_pdu()"); -
uspace/srv/net/udp/udp_type.h
r4d11204 r048cd69 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define UDP_TYPE_H 37 37 38 #include <async.h> 38 39 #include <fibril.h> 39 40 #include <fibril_synch.h> 41 #include <inet/endpoint.h> 40 42 #include <ipc/loc.h> 41 #include <socket_core.h>42 43 #include <sys/types.h> 43 44 #include <inet/addr.h> … … 49 50 /* Insufficient resources */ 50 51 UDP_ENORES, 51 /* Foreign socket unspecified */52 /* Remote endpoint unspecified */ 52 53 UDP_EUNSPEC, 53 54 /* No route to destination */ … … 60 61 XF_DUMMY = 0x1 61 62 } xflags_t; 62 63 enum udp_port {64 UDP_PORT_ANY = 065 };66 67 typedef struct {68 inet_addr_t addr;69 uint16_t port;70 } udp_sock_t;71 72 typedef struct {73 service_id_t iplink;74 udp_sock_t local;75 udp_sock_t foreign;76 } udp_sockpair_t;77 63 78 64 /** Unencoded UDP message (datagram) */ … … 99 85 100 86 typedef struct { 101 async_sess_t *sess; 102 socket_cores_t sockets; 103 } udp_client_t; 87 void (*recv_msg)(void *, inet_ep2_t *, udp_msg_t *); 88 } udp_assoc_cb_t; 104 89 105 90 /** UDP association … … 107 92 * This is a rough equivalent of a TCP connection endpoint. It allows 108 93 * sending and receiving UDP datagrams and it is uniquely identified 109 * by a socket pair.94 * by an endpoint pair. 110 95 */ 111 96 typedef struct { … … 113 98 link_t link; 114 99 115 /** Association identification ( local and foreign socket) */116 udp_sockpair_t ident;100 /** Association identification (endpoint pair) */ 101 inet_ep2_t ident; 117 102 118 103 /** True if association was reset by user */ … … 131 116 /** Receive queue CV. Broadcast when new datagram is inserted */ 132 117 fibril_condvar_t rcv_queue_cv; 118 119 udp_assoc_cb_t *cb; 120 void *cb_arg; 133 121 } udp_assoc_t; 134 122 … … 136 124 } udp_assoc_status_t; 137 125 138 typedef struct udp_sockdata { 139 /** Lock */ 140 fibril_mutex_t lock; 141 /** Socket core */ 142 socket_core_t *sock_core; 126 typedef struct { 127 /** Link to receive queue */ 128 link_t link; 129 /** Endpoint pair */ 130 inet_ep2_t epp; 131 /** Message */ 132 udp_msg_t *msg; 133 } udp_rcv_queue_entry_t; 134 135 typedef struct udp_cassoc { 136 /** Association */ 137 udp_assoc_t *assoc; 138 /** Association ID for the client */ 139 sysarg_t id; 143 140 /** Client */ 144 udp_client_t *client; 145 /** Connection */ 146 udp_assoc_t *assoc; 147 /** User-configured IP link */ 148 service_id_t iplink; 149 /** Receiving fibril */ 150 fid_t recv_fibril; 151 uint8_t recv_buffer[UDP_FRAGMENT_SIZE]; 152 size_t recv_buffer_used; 153 udp_sock_t recv_fsock; 154 fibril_mutex_t recv_buffer_lock; 155 fibril_condvar_t recv_buffer_cv; 156 udp_error_t recv_error; 157 } udp_sockdata_t; 141 struct udp_client *client; 142 link_t lclient; 143 } udp_cassoc_t; 158 144 159 145 typedef struct { 160 146 /** Link to receive queue */ 161 147 link_t link; 162 /** Socket pair */163 udp_sockpair_t sp;148 /** Endpoint pair */ 149 inet_ep2_t epp; 164 150 /** Message */ 165 151 udp_msg_t *msg; 166 } udp_rcv_queue_entry_t; 152 /** Client association */ 153 udp_cassoc_t *cassoc; 154 } udp_crcv_queue_entry_t; 155 156 typedef struct udp_client { 157 /** Client callback session */ 158 async_sess_t *sess; 159 /** Client assocations */ 160 list_t cassoc; /* of udp_cassoc_t */ 161 /** Client receive queue */ 162 list_t crcv_queue; 163 } udp_client_t; 167 164 168 165 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
