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

Changeset 05bfce7 in mainline


Ignore:
Timestamp:
2013-03-14T17:09:59Z (9 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master
Children:
9164c0c
Parents:
6b0b508
Message:

make tcp_sock_bind() structurally similar to udp_sock_bind()
if calling listen() or accept() before bind() then find to a free port

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tcp/sock.c

    r6b0b508 r05bfce7  
    203203{
    204204        int rc;
    205         struct sockaddr *addr;
    206         size_t addr_len;
     205        struct sockaddr_in *addr;
     206        size_t addr_size;
    207207        socket_core_t *sock_core;
    208208        tcp_sockdata_t *socket;
    209 
     209       
    210210        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_bind()");
    211211        log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept");
    212         rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len);
     212       
     213        addr = NULL;
     214       
     215        rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size);
    213216        if (rc != EOK) {
    214217                async_answer_0(callid, rc);
    215                 return;
    216         }
    217 
     218                goto out;
     219        }
     220       
     221        if (addr_size != sizeof(struct sockaddr_in)) {
     222                async_answer_0(callid, EINVAL);
     223                goto out;
     224        }
     225       
    218226        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind");
    219227        rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
    220             addr, addr_len, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     228            addr, addr_size, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    221229            last_used_port);
    222230        if (rc != EOK) {
    223231                async_answer_0(callid, rc);
    224                 return;
    225         }
    226 
     232                goto out;
     233        }
     234       
    227235        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find");
    228236        sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call));
    229         if (sock_core != NULL) {
    230                 socket = (tcp_sockdata_t *)sock_core->specific_data;
    231                 /* XXX Anything to do? */
    232                 (void) socket;
    233         }
    234 
     237        if (sock_core == NULL) {
     238                async_answer_0(callid, ENOENT);
     239                goto out;
     240        }
     241       
     242        socket = (tcp_sockdata_t *)sock_core->specific_data;
     243        /* XXX Anything to do? */
     244        (void) socket;
     245       
    235246        log_msg(LOG_DEFAULT, LVL_DEBUG, " - success");
    236247        async_answer_0(callid, EOK);
     248       
     249out:
     250        if (addr != NULL)
     251                free(addr);
    237252}
    238253
     
    249264        tcp_sock_lconn_t *lconn;
    250265        int i;
     266        int rc;
    251267
    252268        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_listen()");
     
    268284                return;
    269285        }
    270 
    271         socket = (tcp_sockdata_t *)sock_core->specific_data;
    272 
     286       
     287        if (sock_core->port <= 0) {
     288                rc = socket_bind_free_port(&gsock, sock_core,
     289                    TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     290                    last_used_port);
     291                if (rc != EOK) {
     292                        async_answer_0(callid, rc);
     293                        return;
     294                }
     295               
     296                last_used_port = sock_core->port;
     297        }
     298       
     299        socket = (tcp_sockdata_t *) sock_core->specific_data;
     300       
    273301        /*
    274302         * Prepare @c backlog listening connections.
    275303         */
    276304        fibril_mutex_lock(&socket->lock);
    277 
     305       
    278306        socket->backlog = backlog;
    279307        socket->lconn = calloc(backlog, sizeof(tcp_conn_t *));
     
    283311                return;
    284312        }
    285 
     313       
    286314        log_msg(LOG_DEFAULT, LVL_DEBUG, " - open connections");
    287 
     315       
    288316        lsocket.addr.ipv4 = TCP_IPV4_ANY;
    289317        lsocket.port = sock_core->port;
    290318        fsocket.addr.ipv4 = TCP_IPV4_ANY;
    291319        fsocket.port = TCP_PORT_ANY;
    292 
     320       
    293321        for (i = 0; i < backlog; i++) {
    294322
     
    362390                        return;
    363391                }
    364 
     392               
    365393                last_used_port = sock_core->port;
    366394        }
     
    441469                return;
    442470        }
     471       
     472        if (sock_core->port <= 0) {
     473                rc = socket_bind_free_port(&gsock, sock_core,
     474                    TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     475                    last_used_port);
     476                if (rc != EOK) {
     477                        async_answer_0(callid, rc);
     478                        return;
     479                }
     480               
     481                last_used_port = sock_core->port;
     482        }
    443483
    444484        socket = (tcp_sockdata_t *)sock_core->specific_data;
Note: See TracChangeset for help on using the changeset viewer.