Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 92b42442 in mainline for uspace/srv/udp/sock.c


Ignore:
Timestamp:
2012-04-05T21:16:00Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
7094e196
Parents:
ee603c4
Message:

UDP datagram reception plus fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/udp/sock.c

    ree603c4 r92b42442  
    114114        fibril_mutex_initialize(&sock->lock);
    115115        sock->client = client;
    116         sock->laddr.ipv4 = UDP_IPV4_ANY;
    117116
    118117        rc = udp_uc_create(&sock->assoc);
     
    189188
    190189        fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
    191         fsock.port = uint16_t_be2host(sock_core->port);
     190        fsock.port = sock_core->port;
    192191        urc = udp_uc_set_local(socket->assoc, &fsock);
    193192
     
    209208        }
    210209
     210        udp_sock_notify_data(sock_core);
     211
    211212        log_msg(LVL_DEBUG, " - success");
    212213        async_answer_0(callid, rc);
     
    286287
    287288        if (sock_core->port == 0) {
    288                 /* Implicitly bind socket */
     289                /* Implicitly bind socket to port */
    289290                rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
    290291                    addr, addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,
     
    294295                        goto out;
    295296                }
     297
     298                udp_sock_notify_data(sock_core);
    296299        }
    297300
    298301        socket = (udp_sockdata_t *)sock_core->specific_data;
    299302        fibril_mutex_lock(&socket->lock);
     303
     304        if (socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) {
     305                /* Determine local IP address */
     306                inet_addr_t loc_addr, rem_addr;
     307
     308                rem_addr.ipv4 = fsockp ? fsock.addr.ipv4 :
     309                    socket->assoc->ident.foreign.addr.ipv4;
     310
     311                rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr);
     312                if (rc != EOK) {
     313                        fibril_mutex_unlock(&socket->lock);
     314                        async_answer_0(callid, rc);
     315                        log_msg(LVL_DEBUG, "udp_sock_sendto: Failed to "
     316                            "determine local address.");
     317                        return;
     318                }
     319
     320                socket->assoc->ident.local.addr.ipv4 = loc_addr.ipv4;
     321                log_msg(LVL_DEBUG, "Local IP address is %x",
     322                    socket->assoc->ident.local.addr.ipv4);
     323        }
     324
    300325
    301326        assert(socket->assoc != NULL);
     
    394419        urc = udp_uc_receive(socket->assoc, buffer, FRAGMENT_SIZE, &data_len,
    395420            &xflags, &rsock);
    396         log_msg(LVL_DEBUG, "**** udp_uc_receive done");
     421        log_msg(LVL_DEBUG, "**** udp_uc_receive done, data_len=%zu", data_len);
    397422
    398423        switch (urc) {
     
    459484                rc = EOVERFLOW;
    460485
     486        log_msg(LVL_DEBUG, "read_data_length <- %zu", length);
    461487        SOCKET_SET_READ_DATA_LENGTH(answer, length);
    462         answer_call(callid, EOK, &answer, 1);
     488        SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr));
     489        answer_call(callid, EOK, &answer, 3);
    463490
    464491        /* Push one fragment notification to client's queue */
     
    526553
    527554        while (true) {
     555                log_msg(LVL_DEBUG, "udp_sock_connection: wait");
    528556                callid = async_get_call(&call);
    529557                if (!IPC_GET_IMETHOD(call))
    530558                        break;
    531559
    532                 log_msg(LVL_DEBUG, "udp_sock_connection: METHOD=%d\n",
     560                log_msg(LVL_DEBUG, "udp_sock_connection: METHOD=%d",
    533561                    (int)IPC_GET_IMETHOD(call));
    534562
Note: See TracChangeset for help on using the changeset viewer.