Changeset 19a4f73 in mainline
- Timestamp:
- 2013-06-20T15:21:48Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a2e3ee6
- Parents:
- 3e66428
- Location:
- uspace
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/inet.c
r3e66428 r19a4f73 144 144 } 145 145 146 int inet2_get_srcaddr(inet2_addr_t *remote, uint8_t tos, inet2_addr_t *local) 147 { 148 uint32_t remote_addr; 149 int rc = inet2_addr_pack(remote, &remote_addr); 150 if (rc != EOK) 151 return rc; 152 153 async_exch_t *exch = async_exchange_begin(inet_sess); 154 155 sysarg_t local_addr; 156 rc = async_req_2_1(exch, INET_GET_SRCADDR, (sysarg_t) remote_addr, 157 tos, &local_addr); 158 159 async_exchange_end(exch); 160 161 if (rc != EOK) 162 return rc; 163 164 inet2_addr_unpack(local_addr, local); 165 return EOK; 166 } 167 146 168 static void inet_ev_recv(ipc_callid_t callid, ipc_call_t *call) 147 169 { -
uspace/lib/c/generic/inet/addr2.c
r3e66428 r19a4f73 40 40 #include <stdio.h> 41 41 42 // TODO temporarily 43 #include <assert.h> 44 45 static inet2_addr_t inet2_addr_any = { 46 .family = AF_INET, 47 .addr = {0, 0, 0, 0} 48 }; 49 50 static inet2_addr_t inet2_addr6_any = { 51 .family = AF_INET6, 52 .addr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 53 }; 54 42 55 /** Parse network address family. 43 56 * … … 336 349 } 337 350 338 int inet2_addr_is_empty(inet2_addr_t *addr) 339 { 340 return (addr->family == 0); 351 int inet2_addr_is_any(inet2_addr_t *addr) 352 { 353 return ((addr->family == 0) || 354 (inet2_addr_compare(addr, &inet2_addr_any)) || 355 (inet2_addr_compare(addr, &inet2_addr6_any))); 356 } 357 358 void inet_inet2(inet_addr_t *addr, inet2_addr_t *addr2) 359 { 360 // TODO temporarily 361 inet2_addr_unpack(addr->ipv4, addr2); 362 } 363 364 void inet2_inet(inet2_addr_t *addr2, inet_addr_t *addr) 365 { 366 // TODO temporarily 367 assert(addr2->family == AF_INET); 368 inet2_addr_pack(addr2, &addr->ipv4); 341 369 } 342 370 -
uspace/lib/c/include/inet/addr2.h
r3e66428 r19a4f73 38 38 #include <stdint.h> 39 39 #include <net/in.h> 40 #include <inet/addr.h> 40 41 41 42 #define INET2_ADDR_SIZE 16 … … 84 85 85 86 extern int inet2_addr_compare(inet2_addr_t *, inet2_addr_t *); 86 extern int inet2_addr_is_empty(inet2_addr_t *); 87 extern int inet2_addr_is_any(inet2_addr_t *); 88 89 extern void inet_inet2(inet_addr_t *, inet2_addr_t *); 90 extern void inet2_inet(inet2_addr_t *, inet_addr_t *); 87 91 88 92 #endif -
uspace/lib/c/include/inet/inet.h
r3e66428 r19a4f73 37 37 38 38 #include <inet/addr.h> 39 #include <inet/addr2.h> 39 40 #include <sys/types.h> 40 41 … … 60 61 extern int inet_send(inet_dgram_t *, uint8_t, inet_df_t); 61 62 extern int inet_get_srcaddr(inet_addr_t *, uint8_t, inet_addr_t *); 63 extern int inet2_get_srcaddr(inet2_addr_t *, uint8_t, inet2_addr_t *); 62 64 63 65 #endif -
uspace/lib/c/include/net/in.h
r3e66428 r19a4f73 47 47 #define INADDR_ANY 0 48 48 49 /** Type definition of the INET address.50 * @see in_addr51 */52 typedef struct in_addr in_addr_t;53 54 /** Type definition of the INET socket address.55 * @see sockaddr_in56 */57 typedef struct sockaddr_in sockaddr_in_t;58 59 49 /** INET address. */ 60 struct in_addr {50 typedef struct in_addr { 61 51 /** 4 byte IP address. */ 62 52 uint32_t s_addr; 63 } ;53 } in_addr_t; 64 54 65 55 /** INET socket address. 66 56 * @see sockaddr 67 57 */ 68 struct sockaddr_in {58 typedef struct sockaddr_in { 69 59 /** Address family. Should be AF_INET. */ 70 60 uint16_t sin_family; … … 72 62 uint16_t sin_port; 73 63 /** Internet address. */ 74 struct in_addrsin_addr;64 in_addr_t sin_addr; 75 65 /** Padding to meet the sockaddr size. */ 76 66 uint8_t sin_zero[8]; 77 } ;67 } sockaddr_in_t; 78 68 79 69 #endif -
uspace/lib/c/include/net/ip_protocols.h
r3e66428 r19a4f73 44 44 /*@{*/ 45 45 46 #define IPPROTO_ICMP 1 47 #define IPPROTO_TCP 6 48 #define IPPROTO_UDP 17 46 #define IPPROTO_ICMP 1 47 #define IPPROTO_TCP 6 48 #define IPPROTO_UDP 17 49 #define IPPROTO_ICMPV6 58 49 50 50 51 /*@}*/ -
uspace/srv/net/udp/assoc.c
r3e66428 r19a4f73 82 82 if (lsock != NULL) 83 83 assoc->ident.local = *lsock; 84 84 85 if (fsock != NULL) 85 86 assoc->ident.foreign = *fsock; … … 251 252 sp.foreign = *fsock; 252 253 253 if (sp.foreign.addr.ipv4 == 0 || sp.foreign.port == 0) 254 if ((inet2_addr_is_any(&sp.foreign.addr)) || 255 (sp.foreign.port == UDP_PORT_ANY)) 254 256 return EINVAL; 255 257 … … 370 372 static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt) 371 373 { 372 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_socket_match(sock=(%x,%u), pat=(%x,%u))", 373 sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port); 374 375 if (patt->addr.ipv4 != UDP_IPV4_ANY && 376 patt->addr.ipv4 != sock->addr.ipv4) 374 if ((!inet2_addr_is_any(&patt->addr)) && 375 (!inet2_addr_compare(&patt->addr, &sock->addr))) 377 376 return false; 378 379 if ( patt->port != UDP_PORT_ANY&&380 patt->port != sock->port)377 378 if ((patt->port != UDP_PORT_ANY) && 379 (patt->port != sock->port)) 381 380 return false; 382 381 383 382 log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match"); 384 383 385 384 return true; 386 385 } … … 414 413 { 415 414 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp); 416 415 417 416 fibril_mutex_lock(&assoc_list_lock); 418 417 419 418 list_foreach(assoc_list, link) { 420 419 udp_assoc_t *assoc = list_get_instance(link, udp_assoc_t, link); 421 420 udp_sockpair_t *asp = &assoc->ident; 422 log_msg(LOG_DEFAULT, LVL_DEBUG, "compare with assoc (f:(%x,%u), l:(%x,%u))", 423 asp->foreign.addr.ipv4, asp->foreign.port, 424 asp->local.addr.ipv4, asp->local.port); 425 421 426 422 /* Skip unbound associations */ 427 423 if (asp->local.port == UDP_PORT_ANY) 428 424 continue; 429 425 430 426 if (udp_sockpair_match(sp, asp)) { 431 427 log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc); … … 435 431 } 436 432 } 437 433 438 434 fibril_mutex_unlock(&assoc_list_lock); 439 435 return NULL; -
uspace/srv/net/udp/pdu.c
r3e66428 r19a4f73 86 86 static void udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr) 87 87 { 88 phdr->src_addr = host2uint32_t_be(pdu->src.ipv4); 89 phdr->dest_addr = host2uint32_t_be(pdu->dest.ipv4); 88 // FIXME: Check for correctness 89 90 uint32_t src; 91 inet2_addr_pack(&pdu->src, &src); 92 93 uint32_t dest; 94 inet2_addr_pack(&pdu->dest, &dest); 95 96 phdr->src_addr = host2uint32_t_be(src); 97 phdr->dest_addr = host2uint32_t_be(dest); 90 98 phdr->zero = 0; 91 99 phdr->protocol = IP_PROTO_UDP; -
uspace/srv/net/udp/sock.c
r3e66428 r19a4f73 199 199 } 200 200 201 socket = (udp_sockdata_t *)sock_core->specific_data; 202 203 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 201 socket = (udp_sockdata_t *) sock_core->specific_data; 202 203 inet2_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr), 204 &fsock.addr); 204 205 fsock.port = sock_core->port; 205 206 urc = udp_uc_set_local(socket->assoc, &fsock); … … 269 270 } 270 271 271 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 272 inet2_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr), 273 &fsock.addr); 272 274 fsock.port = uint16_t_be2host(addr->sin_port); 273 275 fsock_ptr = &fsock; … … 314 316 fibril_mutex_lock(&socket->lock); 315 317 316 if ( socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) {318 if (inet2_addr_is_any(&socket->assoc->ident.local.addr)) { 317 319 /* Determine local IP address */ 318 inet_addr_t loc_addr, rem_addr; 319 320 rem_addr.ipv4 = fsock_ptr ? fsock.addr.ipv4 : 321 socket->assoc->ident.foreign.addr.ipv4; 322 323 int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); 320 inet2_addr_t loc_addr; 321 inet2_addr_t rem_addr; 322 323 rem_addr = fsock_ptr ? fsock.addr : 324 socket->assoc->ident.foreign.addr; 325 326 int rc = inet2_get_srcaddr(&rem_addr, 0, &loc_addr); 324 327 if (rc != EOK) { 325 328 fibril_mutex_unlock(&socket->lock); … … 330 333 } 331 334 332 socket->assoc->ident.local.addr.ipv4 = loc_addr.ipv4; 333 log_msg(LOG_DEFAULT, LVL_DEBUG, "Local IP address is %x", 334 socket->assoc->ident.local.addr.ipv4); 335 socket->assoc->ident.local.addr = loc_addr; 335 336 } 336 337 … … 410 411 size_t data_len; 411 412 udp_error_t urc; 412 udp_sock_t rsock;413 udp_sock_t *rsock; 413 414 struct sockaddr_in addr; 414 415 int rc; … … 446 447 log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer"); 447 448 448 rsock = socket->recv_fsock;449 rsock = &socket->recv_fsock; 449 450 data_len = socket->recv_buffer_used; 450 451 urc = socket->recv_error; … … 476 477 477 478 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 478 /* Fill addr */ 479 /* Fill address */ 480 uint32_t rsock_addr; 481 int rc = inet2_addr_pack(&rsock->addr, &rsock_addr); 482 if (rc != EOK) { 483 fibril_mutex_unlock(&socket->recv_buffer_lock); 484 fibril_mutex_unlock(&socket->lock); 485 async_answer_0(callid, rc); 486 return; 487 } 488 479 489 addr.sin_family = AF_INET; 480 addr.sin_addr.s_addr = host2uint32_t_be(rsock .addr.ipv4);481 addr.sin_port = host2uint16_t_be(rsock .port);490 addr.sin_addr.s_addr = host2uint32_t_be(rsock_addr); 491 addr.sin_port = host2uint16_t_be(rsock->port); 482 492 483 493 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); -
uspace/srv/net/udp/udp_inet.c
r3e66428 r19a4f73 66 66 pdu->data = dgram->data; 67 67 pdu->data_size = dgram->size; 68 69 pdu->src.ipv4 = dgram->src.ipv4; 70 pdu->dest.ipv4 = dgram->dest.ipv4; 71 log_msg(LOG_DEFAULT, LVL_DEBUG, "src: 0x%08x, dest: 0x%08x", 72 pdu->src.ipv4, pdu->dest.ipv4); 68 69 inet_inet2(&dgram->src, &pdu->src); 70 inet_inet2(&dgram->dest, &pdu->dest); 73 71 74 72 udp_received_pdu(pdu); … … 86 84 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_transmit_pdu()"); 87 85 88 dgram.src.ipv4 = pdu->src.ipv4;89 dgram.dest.ipv4 = pdu->dest.ipv4;86 inet2_inet(&pdu->src, &dgram.src); 87 inet2_inet(&pdu->dest, &dgram.dest); 90 88 dgram.tos = 0; 91 89 dgram.data = pdu->data; -
uspace/srv/net/udp/udp_type.h
r3e66428 r19a4f73 40 40 #include <socket_core.h> 41 41 #include <sys/types.h> 42 #include <inet/addr2.h> 42 43 43 44 #define UDP_FRAGMENT_SIZE 4096 … … 57 58 58 59 typedef enum { 59 XF_DUMMY 60 XF_DUMMY = 0x1 60 61 } xflags_t; 61 62 typedef struct {63 uint32_t ipv4;64 } netaddr_t;65 66 enum netaddr {67 UDP_IPV4_ANY = 068 };69 62 70 63 enum udp_port { … … 73 66 74 67 typedef struct { 75 netaddr_t addr;68 inet2_addr_t addr; 76 69 uint16_t port; 77 70 } udp_sock_t; … … 93 86 typedef struct { 94 87 /** Source address */ 95 netaddr_t src;88 inet2_addr_t src; 96 89 /** Destination address */ 97 netaddr_t dest;98 90 inet2_addr_t dest; 91 99 92 /** Encoded PDU data including header */ 100 93 void *data;
Note:
See TracChangeset
for help on using the changeset viewer.