Ignore:
File:
1 edited

Legend:

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

    rb243da3 rdb81577  
    9191static void tcp_sock_notify_data(socket_core_t *sock_core)
    9292{
    93         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_notify_data(%d)", sock_core->socket_id);
     93        log_msg(LVL_DEBUG, "tcp_sock_notify_data(%d)", sock_core->socket_id);
    9494        async_exch_t *exch = async_exchange_begin(sock_core->sess);
    9595        async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t)sock_core->socket_id,
     
    100100static void tcp_sock_notify_aconn(socket_core_t *lsock_core)
    101101{
    102         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_notify_aconn(%d)", lsock_core->socket_id);
     102        log_msg(LVL_DEBUG, "tcp_sock_notify_aconn(%d)", lsock_core->socket_id);
    103103        async_exch_t *exch = async_exchange_begin(lsock_core->sess);
    104104        async_msg_5(exch, NET_SOCKET_ACCEPTED, (sysarg_t)lsock_core->socket_id,
     
    111111        tcp_sockdata_t *sock;
    112112
    113         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_create()");
     113        log_msg(LVL_DEBUG, "tcp_sock_create()");
    114114        *rsock = NULL;
    115115
     
    133133static void tcp_sock_uncreate(tcp_sockdata_t *sock)
    134134{
    135         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_uncreate()");
     135        log_msg(LVL_DEBUG, "tcp_sock_uncreate()");
    136136        free(sock);
    137137}
     
    142142        int rc;
    143143
    144         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_finish_setup()");
     144        log_msg(LVL_DEBUG, "tcp_sock_finish_setup()");
    145145
    146146        sock->recv_fibril = fibril_create(tcp_sock_recv_fibril, sock);
     
    171171        ipc_call_t answer;
    172172
    173         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_socket()");
     173        log_msg(LVL_DEBUG, "tcp_sock_socket()");
    174174
    175175        rc = tcp_sock_create(client, &sock);
     
    179179        }
    180180
    181         inet_addr_any(&sock->laddr);
     181        sock->laddr.ipv4 = TCP_IPV4_ANY;
    182182        sock->lconn = NULL;
    183183        sock->backlog = 0;
     
    203203{
    204204        int rc;
    205         struct sockaddr_in *addr;
    206         size_t addr_size;
     205        struct sockaddr *addr;
     206        size_t addr_len;
    207207        socket_core_t *sock_core;
    208208        tcp_sockdata_t *socket;
    209        
    210         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_bind()");
    211         log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept");
    212        
    213         addr = NULL;
    214        
    215         rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size);
     209
     210        log_msg(LVL_DEBUG, "tcp_sock_bind()");
     211        log_msg(LVL_DEBUG, " - async_data_write_accept");
     212        rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len);
    216213        if (rc != EOK) {
    217214                async_answer_0(callid, rc);
    218                 goto out;
    219         }
    220        
    221         if (addr_size != sizeof(struct sockaddr_in)) {
    222                 async_answer_0(callid, EINVAL);
    223                 goto out;
    224         }
    225        
    226         log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind");
     215                return;
     216        }
     217
     218        log_msg(LVL_DEBUG, " - call socket_bind");
    227219        rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
    228             addr, addr_size, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     220            addr, addr_len, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    229221            last_used_port);
    230222        if (rc != EOK) {
    231223                async_answer_0(callid, rc);
    232                 goto out;
    233         }
    234        
    235         log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find");
     224                return;
     225        }
     226
     227        log_msg(LVL_DEBUG, " - call socket_cores_find");
    236228        sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call));
    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        
    246         log_msg(LOG_DEFAULT, LVL_DEBUG, " - success");
     229        if (sock_core != NULL) {
     230                socket = (tcp_sockdata_t *)sock_core->specific_data;
     231                /* XXX Anything to do? */
     232                (void) socket;
     233        }
     234
     235        log_msg(LVL_DEBUG, " - success");
    247236        async_answer_0(callid, EOK);
    248        
    249 out:
    250         if (addr != NULL)
    251                 free(addr);
    252237}
    253238
     
    264249        tcp_sock_lconn_t *lconn;
    265250        int i;
    266         int rc;
    267 
    268         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_listen()");
     251
     252        log_msg(LVL_DEBUG, "tcp_sock_listen()");
    269253
    270254        socket_id = SOCKET_GET_SOCKET_ID(call);
     
    284268                return;
    285269        }
    286        
     270
     271        socket = (tcp_sockdata_t *)sock_core->specific_data;
     272
     273        /*
     274         * Prepare @c backlog listening connections.
     275         */
     276        fibril_mutex_lock(&socket->lock);
     277
     278        socket->backlog = backlog;
     279        socket->lconn = calloc(backlog, sizeof(tcp_conn_t *));
     280        if (socket->lconn == NULL) {
     281                fibril_mutex_unlock(&socket->lock);
     282                async_answer_0(callid, ENOMEM);
     283                return;
     284        }
     285
     286        log_msg(LVL_DEBUG, " - open connections");
     287
     288        lsocket.addr.ipv4 = TCP_IPV4_ANY;
     289        lsocket.port = sock_core->port;
     290        fsocket.addr.ipv4 = TCP_IPV4_ANY;
     291        fsocket.port = TCP_PORT_ANY;
     292
     293        for (i = 0; i < backlog; i++) {
     294
     295                lconn = calloc(1, sizeof(tcp_sock_lconn_t));
     296                if (lconn == NULL) {
     297                        /* XXX Clean up */
     298                        fibril_mutex_unlock(&socket->lock);
     299                        async_answer_0(callid, ENOMEM);
     300                        return;
     301                }
     302
     303                trc = tcp_uc_open(&lsocket, &fsocket, ap_passive,
     304                    tcp_open_nonblock, &conn);
     305                if (conn == NULL) {
     306                        /* XXX Clean up */
     307                        fibril_mutex_unlock(&socket->lock);
     308                        async_answer_0(callid, ENOMEM);
     309                        return;
     310                }
     311
     312                tcp_uc_set_cstate_cb(conn, tcp_sock_cstate_cb, lconn);
     313
     314                assert(trc == TCP_EOK);
     315                conn->name = (char *)"S";
     316
     317                lconn->conn = conn;
     318                lconn->socket = socket;
     319                link_initialize(&lconn->ready_list);
     320                socket->lconn[i] = lconn;
     321        }
     322
     323        fibril_mutex_unlock(&socket->lock);
     324        async_answer_0(callid, EOK);
     325}
     326
     327static void tcp_sock_connect(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
     328{
     329        int rc;
     330        struct sockaddr_in *addr;
     331        int socket_id;
     332        size_t addr_len;
     333        socket_core_t *sock_core;
     334        tcp_sockdata_t *socket;
     335        tcp_error_t trc;
     336        tcp_sock_t lsocket;
     337        tcp_sock_t fsocket;
     338
     339        log_msg(LVL_DEBUG, "tcp_sock_connect()");
     340
     341        rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len);
     342        if (rc != EOK || addr_len != sizeof(struct sockaddr_in)) {
     343                async_answer_0(callid, rc);
     344                return;
     345        }
     346
     347        socket_id = SOCKET_GET_SOCKET_ID(call);
     348
     349        sock_core = socket_cores_find(&client->sockets, socket_id);
     350        if (sock_core == NULL) {
     351                async_answer_0(callid, ENOTSOCK);
     352                return;
     353        }
     354
     355        socket = (tcp_sockdata_t *)sock_core->specific_data;
    287356        if (sock_core->port <= 0) {
    288357                rc = socket_bind_free_port(&gsock, sock_core,
     
    293362                        return;
    294363                }
    295                
     364
    296365                last_used_port = sock_core->port;
    297366        }
    298        
    299         socket = (tcp_sockdata_t *) sock_core->specific_data;
    300        
    301         /*
    302          * Prepare @c backlog listening connections.
    303          */
     367
    304368        fibril_mutex_lock(&socket->lock);
    305        
    306         socket->backlog = backlog;
    307         socket->lconn = calloc(backlog, sizeof(tcp_conn_t *));
    308         if (socket->lconn == NULL) {
    309                 fibril_mutex_unlock(&socket->lock);
    310                 async_answer_0(callid, ENOMEM);
    311                 return;
    312         }
    313        
    314         log_msg(LOG_DEFAULT, LVL_DEBUG, " - open connections");
    315        
    316         inet_addr_any(&lsocket.addr);
    317         lsocket.port = sock_core->port;
    318        
    319         inet_addr_any(&fsocket.addr);
    320         fsocket.port = TCP_PORT_ANY;
    321        
    322         for (i = 0; i < backlog; i++) {
    323 
    324                 lconn = calloc(1, sizeof(tcp_sock_lconn_t));
    325                 if (lconn == NULL) {
    326                         /* XXX Clean up */
    327                         fibril_mutex_unlock(&socket->lock);
    328                         async_answer_0(callid, ENOMEM);
    329                         return;
    330                 }
    331 
    332                 trc = tcp_uc_open(&lsocket, &fsocket, ap_passive,
    333                     tcp_open_nonblock, &conn);
    334                 if (conn == NULL) {
    335                         /* XXX Clean up */
    336                         fibril_mutex_unlock(&socket->lock);
    337                         async_answer_0(callid, ENOMEM);
    338                         return;
    339                 }
    340 
    341                 tcp_uc_set_cstate_cb(conn, tcp_sock_cstate_cb, lconn);
    342 
    343                 assert(trc == TCP_EOK);
    344                 conn->name = (char *)"S";
    345 
    346                 lconn->conn = conn;
    347                 lconn->socket = socket;
    348                 link_initialize(&lconn->ready_list);
    349                 socket->lconn[i] = lconn;
    350         }
    351 
    352         fibril_mutex_unlock(&socket->lock);
    353         async_answer_0(callid, EOK);
    354 }
    355 
    356 static void tcp_sock_connect(tcp_client_t *client, ipc_callid_t callid,
    357     ipc_call_t call)
    358 {
    359         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connect()");
    360        
    361         struct sockaddr_in6 *addr6 = NULL;
    362         size_t addr_len;
    363         int rc = async_data_write_accept((void **) &addr6, false, 0, 0, 0, &addr_len);
    364         if (rc != EOK) {
    365                 async_answer_0(callid, rc);
    366                 return;
    367         }
    368        
    369         if ((addr_len != sizeof(struct sockaddr_in)) &&
    370             (addr_len != sizeof(struct sockaddr_in6))) {
    371                 async_answer_0(callid, EINVAL);
    372                 goto out;
    373         }
    374        
    375         struct sockaddr_in *addr = (struct sockaddr_in *) addr6;
    376        
    377         int socket_id = SOCKET_GET_SOCKET_ID(call);
    378         socket_core_t *sock_core = socket_cores_find(&client->sockets,
    379             socket_id);
    380         if (sock_core == NULL) {
    381                 async_answer_0(callid, ENOTSOCK);
    382                 goto out;
    383         }
    384        
    385         tcp_sockdata_t *socket =
    386             (tcp_sockdata_t *) sock_core->specific_data;
    387        
    388         if (sock_core->port <= 0) {
    389                 rc = socket_bind_free_port(&gsock, sock_core,
    390                     TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    391                     last_used_port);
    392                 if (rc != EOK) {
    393                         async_answer_0(callid, rc);
    394                         goto out;
    395                 }
    396                
    397                 last_used_port = sock_core->port;
    398         }
    399        
    400         fibril_mutex_lock(&socket->lock);
    401        
    402         if (inet_addr_is_any(&socket->laddr)) {
     369
     370        if (socket->laddr.ipv4 == TCP_IPV4_ANY) {
    403371                /* Determine local IP address */
    404                 inet_addr_t loc_addr;
    405                 inet_addr_t rem_addr;
    406                
    407                 switch (addr->sin_family) {
    408                 case AF_INET:
    409                         inet_sockaddr_in_addr(addr, &rem_addr);
    410                         break;
    411                 case AF_INET6:
    412                         inet_sockaddr_in6_addr(addr6, &rem_addr);
    413                         break;
    414                 default:
    415                         fibril_mutex_unlock(&socket->lock);
    416                         async_answer_0(callid, EINVAL);
    417                         goto out;
    418                 }
    419                
     372                inet_addr_t loc_addr, rem_addr;
     373
     374                rem_addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
    420375                rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr);
    421376                if (rc != EOK) {
    422377                        fibril_mutex_unlock(&socket->lock);
    423378                        async_answer_0(callid, rc);
    424                         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connect: Failed to "
     379                        log_msg(LVL_DEBUG, "tcp_sock_connect: Failed to "
    425380                            "determine local address.");
    426                         goto out;
    427                 }
    428                
    429                 socket->laddr = loc_addr;
    430         }
    431        
    432         tcp_sock_t lsocket;
    433         tcp_sock_t fsocket;
    434        
    435         lsocket.addr = socket->laddr;
     381                        return;
     382                }
     383
     384                socket->laddr.ipv4 = loc_addr.ipv4;
     385                log_msg(LVL_DEBUG, "Local IP address is %x", socket->laddr.ipv4);
     386        }
     387
     388        lsocket.addr.ipv4 = socket->laddr.ipv4;
    436389        lsocket.port = sock_core->port;
    437        
    438         switch (addr->sin_family) {
    439         case AF_INET:
    440                 inet_sockaddr_in_addr(addr, &fsocket.addr);
    441                 break;
    442         case AF_INET6:
    443                 inet_sockaddr_in6_addr(addr6, &fsocket.addr);
    444                 break;
    445         default:
    446                 fibril_mutex_unlock(&socket->lock);
    447                 async_answer_0(callid, EINVAL);
    448                 goto out;
    449         }
    450        
     390        fsocket.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
    451391        fsocket.port = uint16_t_be2host(addr->sin_port);
    452        
    453         tcp_error_t trc = tcp_uc_open(&lsocket, &fsocket, ap_active, 0,
    454             &socket->conn);
    455        
     392
     393        trc = tcp_uc_open(&lsocket, &fsocket, ap_active, 0, &socket->conn);
     394
    456395        if (socket->conn != NULL)
    457                 socket->conn->name = (char *) "C";
    458        
     396                socket->conn->name = (char *)"C";
     397
    459398        fibril_mutex_unlock(&socket->lock);
    460        
     399
    461400        switch (trc) {
    462401        case TCP_EOK:
     
    469408                assert(false);
    470409        }
    471        
     410
    472411        if (rc == EOK)
    473412                fibril_add_ready(socket->recv_fibril);
    474        
     413
    475414        async_answer_0(callid, rc);
    476        
    477 out:
    478         if (addr6 != NULL)
    479                 free(addr6);
    480415}
    481416
     
    496431        int rc;
    497432
    498         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_accept()");
     433        log_msg(LVL_DEBUG, "tcp_sock_accept()");
    499434
    500435        socket_id = SOCKET_GET_SOCKET_ID(call);
     
    506441                return;
    507442        }
    508        
    509         if (sock_core->port <= 0) {
    510                 rc = socket_bind_free_port(&gsock, sock_core,
    511                     TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    512                     last_used_port);
    513                 if (rc != EOK) {
    514                         async_answer_0(callid, rc);
    515                         return;
    516                 }
    517                
    518                 last_used_port = sock_core->port;
    519         }
    520443
    521444        socket = (tcp_sockdata_t *)sock_core->specific_data;
    522445        fibril_mutex_lock(&socket->lock);
    523446
    524         log_msg(LOG_DEFAULT, LVL_DEBUG, " - verify socket->conn");
     447        log_msg(LVL_DEBUG, " - verify socket->conn");
    525448        if (socket->conn != NULL) {
    526449                fibril_mutex_unlock(&socket->lock);
     
    544467        /* Replenish listening connection */
    545468
    546         inet_addr_any(&lsocket.addr);
     469        lsocket.addr.ipv4 = TCP_IPV4_ANY;
    547470        lsocket.port = sock_core->port;
    548        
    549         inet_addr_any(&fsocket.addr);
     471        fsocket.addr.ipv4 = TCP_IPV4_ANY;
    550472        fsocket.port = TCP_PORT_ANY;
    551473
     
    576498
    577499        asocket->conn = conn;
    578         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_accept():create asocket\n");
     500        log_msg(LVL_DEBUG, "tcp_sock_accept():create asocket\n");
    579501
    580502        rc = tcp_sock_finish_setup(asocket, &asock_id);
     
    588510        fibril_add_ready(asocket->recv_fibril);
    589511
    590         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_accept(): find acore\n");
     512        log_msg(LVL_DEBUG, "tcp_sock_accept(): find acore\n");
    591513
    592514        SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE);
     
    599521       
    600522        /* Push one fragment notification to client's queue */
    601         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_accept(): notify data\n");
     523        log_msg(LVL_DEBUG, "tcp_sock_accept(): notify data\n");
    602524        fibril_mutex_unlock(&socket->lock);
    603525}
     
    613535        ipc_callid_t wcallid;
    614536        size_t length;
     537        uint8_t buffer[TCP_SOCK_FRAGMENT_SIZE];
    615538        tcp_error_t trc;
    616539        int rc;
    617        
    618         uint8_t *buffer = calloc(TCP_SOCK_FRAGMENT_SIZE, 1);
    619         if (buffer == NULL) {
    620                 async_answer_0(callid, ENOMEM);
    621                 return;
    622         }
    623 
    624         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_send()");
     540
     541        log_msg(LVL_DEBUG, "tcp_sock_send()");
    625542        socket_id = SOCKET_GET_SOCKET_ID(call);
    626543        fragments = SOCKET_GET_DATA_FRAGMENTS(call);
     
    630547        if (sock_core == NULL) {
    631548                async_answer_0(callid, ENOTSOCK);
    632                 goto out;
     549                return;
    633550        }
    634551
     
    646563                        fibril_mutex_unlock(&socket->lock);
    647564                        async_answer_0(callid, EINVAL);
    648                         goto out;
     565                        return;
    649566                }
    650567
     
    656573                        fibril_mutex_unlock(&socket->lock);
    657574                        async_answer_0(callid, rc);
    658                         goto out;
     575                        return;
    659576                }
    660577
     
    681598                        fibril_mutex_unlock(&socket->lock);
    682599                        async_answer_0(callid, rc);
    683                         goto out;
     600                        return;
    684601                }
    685602        }
     
    690607            IPC_GET_ARG2(answer));
    691608        fibril_mutex_unlock(&socket->lock);
    692        
    693 out:
    694         free(buffer);
    695609}
    696610
    697611static void tcp_sock_sendto(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    698612{
    699         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_sendto()");
     613        log_msg(LVL_DEBUG, "tcp_sock_sendto()");
    700614        async_answer_0(callid, ENOTSUP);
    701615}
     
    703617static void tcp_sock_recvfrom(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    704618{
    705         log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: tcp_sock_recv[from]()", client);
    706        
    707         int socket_id = SOCKET_GET_SOCKET_ID(call);
    708        
    709         socket_core_t *sock_core =
    710             socket_cores_find(&client->sockets, socket_id);
     619        int socket_id;
     620        int flags;
     621        size_t addr_length, length;
     622        socket_core_t *sock_core;
     623        tcp_sockdata_t *socket;
     624        ipc_call_t answer;
     625        ipc_callid_t rcallid;
     626        size_t data_len;
     627        struct sockaddr_in addr;
     628        tcp_sock_t *rsock;
     629        int rc;
     630
     631        log_msg(LVL_DEBUG, "%p: tcp_sock_recv[from]()", client);
     632
     633        socket_id = SOCKET_GET_SOCKET_ID(call);
     634        flags = SOCKET_GET_FLAGS(call);
     635
     636        sock_core = socket_cores_find(&client->sockets, socket_id);
    711637        if (sock_core == NULL) {
    712638                async_answer_0(callid, ENOTSOCK);
    713639                return;
    714640        }
    715        
    716         tcp_sockdata_t *socket =
    717             (tcp_sockdata_t *) sock_core->specific_data;
    718        
     641
     642        socket = (tcp_sockdata_t *)sock_core->specific_data;
    719643        fibril_mutex_lock(&socket->lock);
    720        
     644
    721645        if (socket->conn == NULL) {
    722646                fibril_mutex_unlock(&socket->lock);
     
    724648                return;
    725649        }
    726        
    727         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock");
    728        
     650
     651        (void)flags;
     652
     653        log_msg(LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock");
    729654        fibril_mutex_lock(&socket->recv_buffer_lock);
    730         while ((socket->recv_buffer_used == 0) &&
    731             (socket->recv_error == TCP_EOK)) {
    732                 log_msg(LOG_DEFAULT, LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0");
     655        while (socket->recv_buffer_used == 0 && socket->recv_error == TCP_EOK) {
     656                log_msg(LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0");
    733657                fibril_condvar_wait(&socket->recv_buffer_cv,
    734658                    &socket->recv_buffer_lock);
    735659        }
    736        
    737         log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer");
    738        
    739         size_t data_len = socket->recv_buffer_used;
    740         tcp_error_t trc = socket->recv_error;
    741         int rc;
    742        
    743         switch (trc) {
     660
     661        log_msg(LVL_DEBUG, "Got data in sock recv_buffer");
     662
     663        data_len = socket->recv_buffer_used;
     664        rc = socket->recv_error;
     665
     666        switch (socket->recv_error) {
    744667        case TCP_EOK:
    745668                rc = EOK;
     
    755678                assert(false);
    756679        }
    757        
    758         log_msg(LOG_DEFAULT, LVL_DEBUG, "**** recv result -> %d", rc);
    759        
     680
     681        log_msg(LVL_DEBUG, "**** recv result -> %d", rc);
    760682        if (rc != EOK) {
    761683                fibril_mutex_unlock(&socket->recv_buffer_lock);
     
    764686                return;
    765687        }
    766        
    767         ipc_callid_t rcallid;
    768        
     688
    769689        if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) {
    770                 /* Fill address */
    771                 tcp_sock_t *rsock = &socket->conn->ident.foreign;
    772                 struct sockaddr_in addr;
    773                 struct sockaddr_in6 addr6;
    774                 size_t addr_length;
    775                
    776                 uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr,
    777                     &addr6);
    778                
    779                 switch (addr_af) {
    780                 case AF_INET:
    781                         addr.sin_port = host2uint16_t_be(rsock->port);
    782                        
    783                         log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive");
    784                         if (!async_data_read_receive(&rcallid, &addr_length)) {
    785                                 fibril_mutex_unlock(&socket->recv_buffer_lock);
    786                                 fibril_mutex_unlock(&socket->lock);
    787                                 async_answer_0(callid, EINVAL);
    788                                 return;
    789                         }
    790                        
    791                         if (addr_length > sizeof(addr))
    792                                 addr_length = sizeof(addr);
    793                        
    794                         log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize");
    795                         rc = async_data_read_finalize(rcallid, &addr, addr_length);
    796                         if (rc != EOK) {
    797                                 fibril_mutex_unlock(&socket->recv_buffer_lock);
    798                                 fibril_mutex_unlock(&socket->lock);
    799                                 async_answer_0(callid, EINVAL);
    800                                 return;
    801                         }
    802                        
    803                         break;
    804                 case AF_INET6:
    805                         addr6.sin6_port = host2uint16_t_be(rsock->port);
    806                        
    807                         log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive");
    808                         if (!async_data_read_receive(&rcallid, &addr_length)) {
    809                                 fibril_mutex_unlock(&socket->recv_buffer_lock);
    810                                 fibril_mutex_unlock(&socket->lock);
    811                                 async_answer_0(callid, EINVAL);
    812                                 return;
    813                         }
    814                        
    815                         if (addr_length > sizeof(addr6))
    816                                 addr_length = sizeof(addr6);
    817                        
    818                         log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize");
    819                         rc = async_data_read_finalize(rcallid, &addr6, addr_length);
    820                         if (rc != EOK) {
    821                                 fibril_mutex_unlock(&socket->recv_buffer_lock);
    822                                 fibril_mutex_unlock(&socket->lock);
    823                                 async_answer_0(callid, EINVAL);
    824                                 return;
    825                         }
    826                        
    827                         break;
    828                 default:
     690                /* Fill addr */
     691                rsock = &socket->conn->ident.foreign;
     692                addr.sin_family = AF_INET;
     693                addr.sin_addr.s_addr = host2uint32_t_be(rsock->addr.ipv4);
     694                addr.sin_port = host2uint16_t_be(rsock->port);
     695
     696                log_msg(LVL_DEBUG, "addr read receive");
     697                if (!async_data_read_receive(&rcallid, &addr_length)) {
    829698                        fibril_mutex_unlock(&socket->recv_buffer_lock);
    830699                        fibril_mutex_unlock(&socket->lock);
     
    832701                        return;
    833702                }
    834         }
    835        
    836         log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive");
    837        
    838         size_t length;
     703
     704                if (addr_length > sizeof(addr))
     705                        addr_length = sizeof(addr);
     706
     707                log_msg(LVL_DEBUG, "addr read finalize");
     708                rc = async_data_read_finalize(rcallid, &addr, addr_length);
     709                if (rc != EOK) {
     710                        fibril_mutex_unlock(&socket->recv_buffer_lock);
     711                        fibril_mutex_unlock(&socket->lock);
     712                        async_answer_0(callid, EINVAL);
     713                        return;
     714                }
     715        }
     716
     717        log_msg(LVL_DEBUG, "data read receive");
    839718        if (!async_data_read_receive(&rcallid, &length)) {
    840719                fibril_mutex_unlock(&socket->recv_buffer_lock);
     
    843722                return;
    844723        }
    845        
     724
    846725        if (length > data_len)
    847726                length = data_len;
    848        
    849         log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize");
    850        
     727
     728        log_msg(LVL_DEBUG, "data read finalize");
    851729        rc = async_data_read_finalize(rcallid, socket->recv_buffer, length);
    852        
     730
    853731        socket->recv_buffer_used -= length;
    854        
    855         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer",
     732        log_msg(LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer",
    856733            socket->recv_buffer_used);
    857        
    858734        if (socket->recv_buffer_used > 0) {
    859735                memmove(socket->recv_buffer, socket->recv_buffer + length,
     
    861737                tcp_sock_notify_data(socket->sock_core);
    862738        }
    863        
     739
    864740        fibril_condvar_broadcast(&socket->recv_buffer_cv);
    865        
    866         if ((length < data_len) && (rc == EOK))
     741
     742        if (length < data_len && rc == EOK)
    867743                rc = EOVERFLOW;
    868        
    869         ipc_call_t answer;
    870        
     744
    871745        SOCKET_SET_READ_DATA_LENGTH(answer, length);
    872746        async_answer_1(callid, EOK, IPC_GET_ARG1(answer));
    873        
     747
    874748        fibril_mutex_unlock(&socket->recv_buffer_lock);
    875749        fibril_mutex_unlock(&socket->lock);
     
    882756        tcp_sockdata_t *socket;
    883757        tcp_error_t trc;
    884         int i;
    885758        int rc;
    886759
    887         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close()");
     760        log_msg(LVL_DEBUG, "tcp_sock_close()");
    888761        socket_id = SOCKET_GET_SOCKET_ID(call);
    889762
     
    898771
    899772        if (socket->conn != NULL) {
    900                 /* Close connection */
    901773                trc = tcp_uc_close(socket->conn);
    902774                if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {
     
    907779        }
    908780
    909         if (socket->lconn != NULL) {
    910                 /* Close listening connections */
    911                 for (i = 0; i < socket->backlog; i++) {
    912                         tcp_uc_set_cstate_cb(socket->lconn[i]->conn, NULL, NULL);
    913                         trc = tcp_uc_close(socket->lconn[i]->conn);
    914                         if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {
    915                                 fibril_mutex_unlock(&socket->lock);
    916                                 async_answer_0(callid, EBADF);
    917                                 return;
    918                         }
    919 
    920                         free(socket->lconn[i]);
    921                         socket->lconn[i] = NULL;
    922                 }
    923         }
    924 
    925781        /* Grab recv_buffer_lock because of CV wait in tcp_sock_recv_fibril() */
    926782        fibril_mutex_lock(&socket->recv_buffer_lock);
     
    942798static void tcp_sock_getsockopt(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    943799{
    944         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_getsockopt()");
     800        log_msg(LVL_DEBUG, "tcp_sock_getsockopt()");
    945801        async_answer_0(callid, ENOTSUP);
    946802}
     
    948804static void tcp_sock_setsockopt(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    949805{
    950         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_setsockopt()");
     806        log_msg(LVL_DEBUG, "tcp_sock_setsockopt()");
    951807        async_answer_0(callid, ENOTSUP);
    952808}
     
    959815        tcp_sockdata_t *socket = lconn->socket;
    960816
    961         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_cstate_cb()");
     817        log_msg(LVL_DEBUG, "tcp_sock_cstate_cb()");
    962818        fibril_mutex_lock(&socket->lock);
    963819        assert(conn == lconn->conn);
     
    972828        list_append(&lconn->ready_list, &socket->ready);
    973829
    974         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_cstate_cb(): notify accept");
     830        log_msg(LVL_DEBUG, "tcp_sock_cstate_cb(): notify accept");
    975831
    976832        /* Push one accept notification to client's queue */
     
    986842        tcp_error_t trc;
    987843
    988         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recv_fibril()");
     844        log_msg(LVL_DEBUG, "tcp_sock_recv_fibril()");
    989845
    990846        fibril_mutex_lock(&sock->recv_buffer_lock);
    991847
    992848        while (true) {
    993                 log_msg(LOG_DEFAULT, LVL_DEBUG, "call tcp_uc_receive()");
     849                log_msg(LVL_DEBUG, "call tcp_uc_receive()");
    994850                while (sock->recv_buffer_used != 0 && sock->sock_core != NULL)
    995851                        fibril_condvar_wait(&sock->recv_buffer_cv,
     
    1007863                }
    1008864
    1009                 log_msg(LOG_DEFAULT, LVL_DEBUG, "got data - broadcast recv_buffer_cv");
     865                log_msg(LVL_DEBUG, "got data - broadcast recv_buffer_cv");
    1010866
    1011867                sock->recv_buffer_used = data_len;
     
    1039895                        break;
    1040896
    1041                 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connection: METHOD=%d\n",
     897                log_msg(LVL_DEBUG, "tcp_sock_connection: METHOD=%d\n",
    1042898                    (int)IPC_GET_IMETHOD(call));
    1043899
     
    1084940
    1085941        /* Clean up */
    1086         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connection: Clean up");
     942        log_msg(LVL_DEBUG, "tcp_sock_connection: Clean up");
    1087943        async_hangup(client.sess);
    1088944        socket_cores_release(NULL, &client.sockets, &gsock, tcp_free_sock_data);
Note: See TracChangeset for help on using the changeset viewer.