Navigation


Changeset 1419:89cbb08d3189 in freeDiameter for libfdcore


Ignore:
Timestamp:
Feb 18, 2020, 7:38:37 PM (4 years ago)
Author:
Thomas Klausner <tk@giga.or.at>
Branch:
default
Phase:
public
Message:

Remove trailing whitespace.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdcore/cnxctx.c

    r1356 r1419  
    177177                cnx->cc_family = AF_INET6; /* can create socket for both IP and IPv6 */
    178178        }
    179        
     179
    180180        /* Create the socket */
    181181        CHECK_FCT_DO( fd_sctp_create_bind_server( &cnx->cc_socket, cnx->cc_family, ep_list, port ), goto error );
     
    227227        TRACE_ENTRY("%p", serv);
    228228        CHECK_PARAMS_DO(serv, return NULL);
    229        
     229
    230230        /* Accept the new connection -- this is blocking until new client enters or until cancellation */
    231231        CHECK_SYS_DO( cli_sock = accept(serv->cc_socket, (sSA *)&ss, &ss_len), return NULL );
    232        
     232
    233233        CHECK_MALLOC_DO( cli = fd_cnx_init(1), { shutdown(cli_sock, SHUT_RDWR); close(cli_sock); return NULL; } );
    234234        cli->cc_socket = cli_sock;
    235235        cli->cc_family = serv->cc_family;
    236236        cli->cc_proto = serv->cc_proto;
    237        
     237
    238238        /* Set the timeout */
    239239        fd_cnx_s_setto(cli->cc_socket);
    240        
     240
    241241        /* Generate the name for the connection object */
    242242        {
     
    244244                char portbuf[10];
    245245                int  rc;
    246                
     246
    247247                rc = getnameinfo((sSA *)&ss, ss_len, addrbuf, sizeof(addrbuf), portbuf, sizeof(portbuf), NI_NUMERICHOST | NI_NUMERICSERV);
    248248                if (rc) {
     
    250250                        portbuf[0] = '\0';
    251251                }
    252                
     252
    253253                /* Numeric values for debug... */
    254                 snprintf(cli->cc_id, sizeof(cli->cc_id), CC_ID_HDR "%s from [%s]:%s (%d<-%d)", 
     254                snprintf(cli->cc_id, sizeof(cli->cc_id), CC_ID_HDR "%s from [%s]:%s (%d<-%d)",
    255255                                IPPROTO_NAME(cli->cc_proto), addrbuf, portbuf, serv->cc_socket, cli->cc_socket);
    256                
    257                
     256
     257
    258258                /* ...Name for log messages */
    259259                rc = getnameinfo((sSA *)&ss, ss_len, cli->cc_remid, sizeof(cli->cc_remid), NULL, 0, 0);
     
    261261                        snprintf(cli->cc_remid, sizeof(cli->cc_remid), "[err:%s]", gai_strerror(rc));
    262262        }
    263        
     263
    264264        LOG_D("Incoming connection: '%s' <- '%s'   {%s}", fd_cnx_getid(serv), cli->cc_remid, cli->cc_id);
    265265
     
    273273                else
    274274                        cli->cc_sctp_para.pairs = cli->cc_sctp_para.str_in;
    275                
     275
    276276                LOG_A( "%s : client '%s' (SCTP:%d, %d/%d streams)", fd_cnx_getid(serv), fd_cnx_getid(cli), cli->cc_socket, cli->cc_sctp_para.str_in, cli->cc_sctp_para.str_out);
    277277        }
     
    287287        struct cnxctx * cnx = NULL;
    288288        char sa_buf[sSA_DUMP_STRLEN];
    289        
     289
    290290        TRACE_ENTRY("%p %d", sa, addrlen);
    291291        CHECK_PARAMS_DO( sa && addrlen, return NULL );
    292        
     292
    293293        fd_sa_sdump_numeric(sa_buf, sa);
    294        
     294
    295295        LOG_D("Connecting to TCP %s...", sa_buf);
    296        
     296
    297297        /* Create the socket and connect, which can take some time and/or fail */
    298298        {
     
    303303                }
    304304        }
    305        
     305
    306306        /* Once the socket is created successfuly, prepare the remaining of the cnx */
    307307        CHECK_MALLOC_DO( cnx = fd_cnx_init(1), { shutdown(sock, SHUT_RDWR); close(sock); return NULL; } );
    308        
     308
    309309        cnx->cc_socket = sock;
    310310        cnx->cc_family = sa->sa_family;
    311311        cnx->cc_proto  = IPPROTO_TCP;
    312        
     312
    313313        /* Set the timeout */
    314314        fd_cnx_s_setto(cnx->cc_socket);
    315        
     315
    316316        /* Generate the names for the object */
    317317        {
    318318                int  rc;
    319                
     319
    320320                snprintf(cnx->cc_id, sizeof(cnx->cc_id), CC_ID_HDR "TCP,#%d->%s", cnx->cc_socket, sa_buf);
    321                
     321
    322322                /* ...Name for log messages */
    323323                rc = getnameinfo(sa, addrlen, cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0);
     
    325325                        snprintf(cnx->cc_remid, sizeof(cnx->cc_remid), "[err:%s]", gai_strerror(rc));
    326326        }
    327        
     327
    328328        LOG_A("TCP connection to %s succeed (socket:%d).", sa_buf, sock);
    329        
     329
    330330        return cnx;
    331331}
     
    344344        char sa_buf[sSA_DUMP_STRLEN];
    345345        sSS primary;
    346        
     346
    347347        TRACE_ENTRY("%p", list);
    348348        CHECK_PARAMS_DO( list && !FD_IS_LIST_EMPTY(list), return NULL );
    349        
     349
    350350        fd_sa_sdump_numeric(sa_buf, &((struct fd_endpoint *)(list->next))->sa);
    351        
     351
    352352        LOG_D("Connecting to SCTP %s:%hu...", sa_buf, port);
    353        
     353
    354354        {
    355355                int ret = fd_sctp_client( &sock, no_ip6, port, list );
     
    359359                }
    360360        }
    361        
     361
    362362        /* Once the socket is created successfuly, prepare the remaining of the cnx */
    363363        CHECK_MALLOC_DO( cnx = fd_cnx_init(1), { shutdown(sock, SHUT_RDWR); close(sock); return NULL; } );
    364        
     364
    365365        cnx->cc_socket = sock;
    366366        cnx->cc_family = no_ip6 ? AF_INET : AF_INET6;
    367367        cnx->cc_proto  = IPPROTO_SCTP;
    368        
     368
    369369        /* Set the timeout */
    370370        fd_cnx_s_setto(cnx->cc_socket);
    371        
     371
    372372        /* Retrieve the number of streams and primary address */
    373373        CHECK_FCT_DO( fd_sctp_get_str_info( sock, &cnx->cc_sctp_para.str_in, &cnx->cc_sctp_para.str_out, &primary ), goto error );
     
    376376        else
    377377                cnx->cc_sctp_para.pairs = cnx->cc_sctp_para.str_in;
    378        
     378
    379379        fd_sa_sdump_numeric(sa_buf, (sSA *)&primary);
    380        
     380
    381381        /* Generate the names for the object */
    382382        {
    383383                int  rc;
    384                
     384
    385385                snprintf(cnx->cc_id, sizeof(cnx->cc_id), CC_ID_HDR "SCTP,#%d->%s", cnx->cc_socket, sa_buf);
    386                
     386
    387387                /* ...Name for log messages */
    388388                rc = getnameinfo((sSA *)&primary, sSAlen(&primary), cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0);
     
    390390                        snprintf(cnx->cc_remid, sizeof(cnx->cc_remid), "[err:%s]", gai_strerror(rc));
    391391        }
    392        
     392
    393393        LOG_A("SCTP connection to %s succeed (socket:%d, %d/%d streams).", sa_buf, sock, cnx->cc_sctp_para.str_in, cnx->cc_sctp_para.str_out);
    394        
     394
    395395        return cnx;
    396396
     
    445445        else
    446446                conn->cc_id[1] = '-';
    447        
     447
    448448        if (conn->cc_state & CC_STATUS_ERROR)
    449449                conn->cc_id[2] = 'E';
    450450        else
    451451                conn->cc_id[2] = '-';
    452        
     452
    453453        if (conn->cc_state & CC_STATUS_SIGNALED)
    454454                conn->cc_id[3] = 'S';
    455455        else
    456456                conn->cc_id[3] = '-';
    457        
     457
    458458        if (conn->cc_state & CC_STATUS_TLS)
    459459                conn->cc_id[4] = 'T';
     
    509509        TRACE_ENTRY("%p %p", conn, eps);
    510510        CHECK_PARAMS(conn && eps);
    511        
     511
    512512        /* Check we have a full connection object, not a listening socket (with no remote) */
    513513        CHECK_PARAMS( conn->cc_incoming );
     
    547547
    548548/* Get a short string representing the connection */
    549 int fd_cnx_proto_info(struct cnxctx * conn, char * buf, size_t len) 
     549int fd_cnx_proto_info(struct cnxctx * conn, char * buf, size_t len)
    550550{
    551551        CHECK_PARAMS( conn );
    552        
     552
    553553        if (fd_cnx_teststate(conn, CC_STATUS_TLS)) {
    554554                snprintf(buf, len, "%s,%s,soc#%d", IPPROTO_NAME(conn->cc_proto), fd_cnx_may_dtls(conn) ? "DTLS" : "TLS", conn->cc_socket);
     
    556556                snprintf(buf, len, "%s,soc#%d", IPPROTO_NAME(conn->cc_proto), conn->cc_socket);
    557557        }
    558        
     558
    559559        return 0;
    560560}
     
    564564{
    565565        struct ifaddrs *iflist, *cur;
    566        
     566
    567567        CHECK_SYS(getifaddrs(&iflist));
    568        
     568
    569569        for (cur = iflist; cur != NULL; cur = cur->ifa_next) {
    570570                if (cur->ifa_flags & IFF_LOOPBACK)
    571571                        continue;
    572                
     572
    573573                if (cur->ifa_addr == NULL) /* may happen with ppp interfaces */
    574574                        continue;
    575                
     575
    576576                if (fd_g_config->cnf_flags.no_ip4 && (cur->ifa_addr->sa_family == AF_INET))
    577577                        continue;
    578                
     578
    579579                if (fd_g_config->cnf_flags.no_ip6 && (cur->ifa_addr->sa_family == AF_INET6))
    580580                        continue;
    581                
     581
    582582                CHECK_FCT(fd_ep_add_merge( list, cur->ifa_addr, sSAlen(cur->ifa_addr), EP_FL_LL ));
    583583        }
    584        
     584
    585585        freeifaddrs(iflist);
    586        
     586
    587587        return 0;
    588588}
     
    598598        TRACE_ENTRY("%p", conn);
    599599        CHECK_PARAMS_DO( conn, goto fatal );
    600        
     600
    601601        TRACE_DEBUG(FULL, "Error flag set for socket %d (%s, %s)", conn->cc_socket, conn->cc_id, conn->cc_remid);
    602602
    603603        /* Mark the error */
    604604        fd_cnx_addstate(conn, CC_STATUS_ERROR);
    605        
     605
    606606        /* Report the error if not reported yet, and not closing */
    607607        if (!fd_cnx_teststate(conn, CC_STATUS_CLOSING | CC_STATUS_SIGNALED ))  {
     
    610610                fd_cnx_addstate(conn, CC_STATUS_SIGNALED);
    611611        }
    612        
     612
    613613        return;
    614614fatal:
    615615        /* An unrecoverable error occurred, stop the daemon */
    616616        ASSERT(0);
    617         CHECK_FCT_DO(fd_core_shutdown(), );     
     617        CHECK_FCT_DO(fd_core_shutdown(), );
    618618}
    619619
    620620/* Set the timeout option on the socket */
    621 void fd_cnx_s_setto(int sock) 
     621void fd_cnx_s_setto(int sock)
    622622{
    623623        struct timeval tv;
    624        
     624
    625625        /* Set a timeout on the socket so that in any case we are not stuck waiting for something */
    626626        memset(&tv, 0, sizeof(tv));
     
    637637        fd_set rfds;
    638638        struct timeval tv;
    639        
     639
    640640        FD_ZERO (&rfds);
    641641        FD_SET (conn->cc_socket, &rfds);
    642        
     642
    643643        tv.tv_sec = ms / 1000;
    644644        tv.tv_usec = (ms * 1000) % 1000000;
    645        
     645
    646646        return select (conn->cc_socket + 1, &rfds, NULL, NULL, &tv);
    647 }               
     647}
    648648#endif /* GNUTLS_VERSION_300 */
    649649
     
    665665                }
    666666        }
    667        
     667
    668668        /* Mark the error */
    669669        if (ret <= 0) {
     
    671671                fd_cnx_markerror(conn);
    672672        }
    673        
     673
    674674        return ret;
    675675}
     
    687687                ret = -errno;
    688688                pthread_testcancel();
    689                
     689
    690690                /* Check how much time we were blocked for this sending. */
    691691                CHECK_SYS_DO(  clock_gettime(CLOCK_REALTIME, &now), return -1 );
     
    695695                        goto again; /* don't care, just ignore */
    696696                }
    697                
     697
    698698                /* propagate the error */
    699699                errno = -ret;
     
    701701                CHECK_SYS_DO(ret, /* continue */);
    702702        }
    703        
     703
    704704        /* Mark the error */
    705705        if (ret <= 0)
    706706                fd_cnx_markerror(conn);
    707        
     707
    708708        return ret;
    709709}
     
    731731{
    732732        return (struct fd_msg_pmdl *)(buf + PMDL_PADDED(datalen));
    733 } 
     733}
    734734
    735735static int fd_cnx_init_msg_buffer(uint8_t * buffer, size_t expected_len, struct fd_msg_pmdl ** pmdl)
     
    744744{
    745745        uint8_t * ret = NULL;
    746        
     746
    747747        CHECK_MALLOC_DO(  ret = malloc( fd_msg_pmdl_sizewithoverhead(expected_len) ), return NULL );
    748748        CHECK_FCT_DO( fd_cnx_init_msg_buffer(ret, expected_len, pmdl), {free(ret); return NULL;} );
     
    754754{
    755755        uint8_t * ret = NULL;
    756        
     756
    757757        CHECK_MALLOC_DO(  ret = realloc( buffer, fd_msg_pmdl_sizewithoverhead(expected_len) ), return NULL );
    758758        CHECK_FCT_DO( fd_cnx_init_msg_buffer(ret, expected_len, pmdl), {free(ret); return NULL;} );
     
    761761#endif /* DISABLE_SCTP */
    762762
    763 static void free_rcvdata(void * arg) 
     763static void free_rcvdata(void * arg)
    764764{
    765765        struct fd_cnx_rcvdata * data = arg;
     
    773773{
    774774        struct cnxctx * conn = arg;
    775        
     775
    776776        TRACE_ENTRY("%p", arg);
    777777        CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto out);
    778        
     778
    779779        /* Set the thread name */
    780780        {
     
    783783                fd_log_threadname ( buf );
    784784        }
    785        
     785
    786786        ASSERT( conn->cc_proto == IPPROTO_TCP );
    787787        ASSERT( ! fd_cnx_teststate(conn, CC_STATUS_TLS ) );
    788788        ASSERT( fd_cnx_target_queue(conn) );
    789        
     789
    790790        /* Receive from a TCP connection: we have to rebuild the message boundaries */
    791791        do {
     
    803803
    804804                        received += ret;
    805                        
     805
    806806                        if (header[0] != DIAMETER_VERSION)
    807807                                break; /* No need to wait for 4 bytes in this case */
     
    834834                        received += ret;
    835835                }
    836                
     836
    837837                fd_hook_call(HOOK_DATA_RECEIVED, NULL, NULL, &rcv_data, pmdl);
    838                
     838
    839839                /* We have received a complete message, pass it to the daemon */
    840                 CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), 
    841                         { 
     840                CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer),
     841                        {
    842842                                free_rcvdata(&rcv_data);
    843                                 goto fatal; 
     843                                goto fatal;
    844844                        } );
    845                
     845
    846846        } while (conn->cc_loop);
    847        
     847
    848848out:
    849         TRACE_DEBUG(FULL, "Thread terminated"); 
     849        TRACE_DEBUG(FULL, "Thread terminated");
    850850        return NULL;
    851        
     851
    852852fatal:
    853853        /* An unrecoverable error occurred, stop the daemon */
     
    863863        struct fd_cnx_rcvdata rcv_data;
    864864        int       event;
    865        
     865
    866866        TRACE_ENTRY("%p", arg);
    867867        CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto fatal);
    868        
     868
    869869        /* Set the thread name */
    870870        {
     
    873873                fd_log_threadname ( buf );
    874874        }
    875        
     875
    876876        ASSERT( conn->cc_proto == IPPROTO_SCTP );
    877877        ASSERT( ! fd_cnx_teststate(conn, CC_STATUS_TLS ) );
    878878        ASSERT( fd_cnx_target_queue(conn) );
    879        
     879
    880880        do {
    881881                struct fd_msg_pmdl *pmdl=NULL;
     
    885885                        goto out;
    886886                }
    887                
     887
    888888                if (event == FDEVP_CNX_SHUTDOWN) {
    889889                        /* Just ignore the notification for now, we will get another error later anyway */
     
    896896                }
    897897                CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), event, rcv_data.length, rcv_data.buffer), goto fatal );
    898                
     898
    899899        } while (conn->cc_loop || (event != FDEVP_CNX_MSG_RECV));
    900        
     900
    901901out:
    902         TRACE_DEBUG(FULL, "Thread terminated"); 
     902        TRACE_DEBUG(FULL, "Thread terminated");
    903903        return NULL;
    904904
     
    914914{
    915915        TRACE_ENTRY("%p %i", conn, loop);
    916        
     916
    917917        CHECK_PARAMS( conn && fd_cnx_target_queue(conn) && (!fd_cnx_teststate(conn, CC_STATUS_TLS)) && (!conn->cc_loop));
    918        
     918
    919919        /* Release resources in case of a previous call was already made */
    920920        CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */);
    921        
     921
    922922        /* Save the loop request */
    923923        conn->cc_loop = loop;
    924        
     924
    925925        switch (conn->cc_proto) {
    926926                case IPPROTO_TCP:
     
    939939                        return ENOTSUP;
    940940        }
    941                        
     941
    942942        return 0;
    943943}
     
    950950{
    951951        ssize_t ret;
    952 again: 
    953         CHECK_GNUTLS_DO( ret = gnutls_record_recv(session, data, sz), 
     952again:
     953        CHECK_GNUTLS_DO( ret = gnutls_record_recv(session, data, sz),
    954954                {
    955955                        switch (ret) {
    956                                 case GNUTLS_E_REHANDSHAKE: 
     956                                case GNUTLS_E_REHANDSHAKE:
    957957                                        if (!fd_cnx_teststate(conn, CC_STATUS_CLOSING)) {
    958958                                                CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
     
    976976                                        TRACE_DEBUG(FULL, "Got 0 size while reading the socket, probably connection closed...");
    977977                                        break;
    978                                
     978
    979979                                default:
    980980                                        if (gnutls_error_is_fatal (ret) == 0) {
     
    985985                        }
    986986                } );
    987                
     987
    988988        if (ret == 0)
    989989                CHECK_GNUTLS_DO( gnutls_bye(session, GNUTLS_SHUT_RDWR),  );
    990        
    991 end:   
     990
     991end:
    992992        if (ret <= 0)
    993993                fd_cnx_markerror(conn);
     
    10011001        struct timespec ts, now;
    10021002        CHECK_SYS_DO(  clock_gettime(CLOCK_REALTIME, &ts), return -1 );
    1003 again: 
     1003again:
    10041004        CHECK_GNUTLS_DO( ret = gnutls_record_send(session, data, sz),
    10051005                {
    10061006                        pthread_testcancel();
    10071007                        switch (ret) {
    1008                                 case GNUTLS_E_REHANDSHAKE: 
     1008                                case GNUTLS_E_REHANDSHAKE:
    10091009                                        if (!fd_cnx_teststate(conn, CC_STATUS_CLOSING)) {
    10101010                                                CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
     
    10351035                        }
    10361036                } );
    1037 end:   
     1037end:
    10381038        if (ret <= 0)
    10391039                fd_cnx_markerror(conn);
    1040                
     1040
    10411041        return ret;
    10421042}
     
    10461046/*         For the case of DTLS, since we are not using SCTP_UNORDERED, the messages over a single stream are ordered.
    10471047           Furthermore, as long as messages are shorter than the MTU [2^14 = 16384 bytes], they are delivered in a single
    1048            record, as far as I understand. 
    1049            For larger messages, however, it is possible that pieces of messages coming from different streams can get interleaved. 
     1048           record, as far as I understand.
     1049           For larger messages, however, it is possible that pieces of messages coming from different streams can get interleaved.
    10501050           As a result, we do not use the following function for DTLS reception, because we use the sequence number to rebuild the
    10511051           messages. */
     
    10961096                        received += ret;
    10971097                }
    1098                
     1098
    10991099                fd_hook_call(HOOK_DATA_RECEIVED, NULL, NULL, &rcv_data, pmdl);
    1100                
     1100
    11011101                /* We have received a complete message, pass it to the daemon */
    1102                 CHECK_FCT_DO( ret = fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), 
    1103                         { 
     1102                CHECK_FCT_DO( ret = fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer),
     1103                        {
    11041104                                free_rcvdata(&rcv_data);
    11051105                                CHECK_FCT_DO(fd_core_shutdown(), );
    1106                                 return ret; 
     1106                                return ret;
    11071107                        } );
    1108                
     1108
    11091109        } while (1);
    1110        
     1110
    11111111out:
    11121112        return (ret == 0) ? 0 : ENOTCONN;
     
    11171117{
    11181118        struct cnxctx * conn = arg;
    1119        
     1119
    11201120        TRACE_ENTRY("%p", arg);
    11211121        CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), return NULL );
    1122        
     1122
    11231123        /* Set the thread name */
    11241124        {
     
    11271127                fd_log_threadname ( buf );
    11281128        }
    1129        
     1129
    11301130        ASSERT( fd_cnx_teststate(conn, CC_STATUS_TLS) );
    11311131        ASSERT( fd_cnx_target_queue(conn) );
    11321132
    1133         /* The next function only returns when there is an error on the socket */       
     1133        /* The next function only returns when there is an error on the socket */
    11341134        CHECK_FCT_DO(fd_tls_rcvthr_core(conn, conn->cc_tls_para.session), /* continue */);
    11351135
    1136         TRACE_DEBUG(FULL, "Thread terminated"); 
     1136        TRACE_DEBUG(FULL, "Thread terminated");
    11371137        return NULL;
    11381138}
     
    11521152        if (priority) {
    11531153                const char * errorpos;
    1154                 CHECK_GNUTLS_DO( gnutls_priority_set_direct( *session, priority, &errorpos ), 
     1154                CHECK_GNUTLS_DO( gnutls_priority_set_direct( *session, priority, &errorpos ),
    11551155                        { TRACE_DEBUG(INFO, "Error in priority string '%s' at position: '%s'", priority, errorpos); return EINVAL; } );
    11561156        } else {
     
    11651165                gnutls_certificate_server_set_request (*session, GNUTLS_CERT_REQUIRE);
    11661166        }
    1167                
     1167
    11681168        return 0;
    11691169}
     
    11801180        gnutls_x509_crt_t cert;
    11811181        time_t now;
    1182        
     1182
    11831183        TRACE_ENTRY("%p %d", conn, verbose);
    11841184        CHECK_PARAMS(conn);
    1185        
     1185
    11861186        /* Trace the session information -- http://www.gnu.org/software/gnutls/manual/gnutls.html#Obtaining-session-information */
    11871187        #ifdef DEBUG
     
    11901190                gnutls_kx_algorithm_t kx;
    11911191                gnutls_credentials_type_t cred;
    1192                
     1192
    11931193                LOG_D("TLS Session information for connection '%s':", conn->cc_id);
    11941194
     
    12301230                                }
    12311231                                break;
    1232 #ifdef ENABLE_SRP                               
     1232#ifdef ENABLE_SRP
    12331233                        case GNUTLS_CRD_SRP:
    12341234                                LOG_D("\t - SRP session with username %s",
     
    12641264        }
    12651265        #endif /* DEBUG */
    1266        
     1266
    12671267        /* First, use built-in verification */
    12681268        CHECK_GNUTLS_DO( gnutls_certificate_verify_peers2 (session, &gtret), return EINVAL );
     
    12811281                return EINVAL;
    12821282        }
    1283        
     1283
    12841284        /* Code from http://www.gnu.org/software/gnutls/manual/gnutls.html#Verifying-peer_0027s-certificate */
    12851285        if (gnutls_certificate_type_get (session) != GNUTLS_CRT_X509) {
     
    12871287                return EINVAL;
    12881288        }
    1289        
     1289
    12901290        GNUTLS_TRACE( cert_list = gnutls_certificate_get_peers (session, &cert_list_size) );
    12911291        if (cert_list == NULL)
    12921292                return EINVAL;
    1293        
     1293
    12941294        now = time(NULL);
    1295        
     1295
    12961296        #ifdef DEBUG
    12971297                char serial[40];
     
    13001300                unsigned int algo, bits;
    13011301                time_t expiration_time, activation_time;
    1302                
     1302
    13031303                LOG_D("TLS Certificate information for connection '%s' (%d certs provided):", conn->cc_id, cert_list_size);
    13041304                for (i = 0; i < cert_list_size; i++)
     
    13071307                        CHECK_GNUTLS_DO( gnutls_x509_crt_init (&cert), return EINVAL);
    13081308                        CHECK_GNUTLS_DO( gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER), return EINVAL);
    1309                
     1309
    13101310                        LOG_A(" Certificate %d info:", i);
    13111311
     
    13191319                        size = sizeof (serial);
    13201320                        gnutls_x509_crt_get_serial (cert, serial, &size);
    1321                        
     1321
    13221322                        {
    13231323                                int j;
     
    13551355        {
    13561356                time_t deadline;
    1357                
     1357
    13581358                CHECK_GNUTLS_DO( gnutls_x509_crt_init (&cert), return EINVAL);
    13591359                CHECK_GNUTLS_DO( gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER), return EINVAL);
    1360                
     1360
    13611361                GNUTLS_TRACE( deadline = gnutls_x509_crt_get_expiration_time(cert) );
    13621362                if ((deadline != (time_t)-1) && (deadline < now)) {
     
    13651365                        ret = EINVAL;
    13661366                }
    1367                
     1367
    13681368                GNUTLS_TRACE( deadline = gnutls_x509_crt_get_activation_time(cert) );
    13691369                if ((deadline != (time_t)-1) && (deadline > now)) {
     
    13721372                        ret = EINVAL;
    13731373                }
    1374                
     1374
    13751375                if ((i == 0) && (conn->cc_tls_para.cn)) {
    13761376                        if (!gnutls_x509_crt_check_hostname (cert, conn->cc_tls_para.cn)) {
     
    13801380                        }
    13811381                }
    1382                
     1382
    13831383                GNUTLS_TRACE( gnutls_x509_crt_deinit (cert) );
    13841384        }
     
    14011401
    14021402        TRACE_ENTRY("%p", session);
    1403        
     1403
    14041404        /* get the associated connection */
    14051405        conn = gnutls_session_get_ptr (session);
    1406        
     1406
    14071407        /* Trace the session information -- http://www.gnu.org/software/gnutls/manual/gnutls.html#Obtaining-session-information */
    14081408#ifdef DEBUG
     
    14151415
    14161416                LOG_A("TLS Session information for connection '%s':", conn->cc_id);
    1417                
     1417
    14181418                /* print the key exchange's algorithm name
    14191419                */
     
    14751475                                else if (kx == GNUTLS_KX_ECDHE_RSA || kx == GNUTLS_KX_ECDHE_ECDSA)
    14761476                                        ecdh = 1;
    1477                                
     1477
    14781478                                /* Now print some info on the remote certificate */
    14791479                                if (gnutls_certificate_type_get (session) == GNUTLS_CRT_X509) {
     
    15051505                                                  gnutls_free (cinfo.data);
    15061506                                                }
    1507                                                
     1507
    15081508                                                if (conn->cc_tls_para.cn) {
    15091509                                                        if (!gnutls_x509_crt_check_hostname (cert, conn->cc_tls_para.cn)) {
     
    15131513                                                                return GNUTLS_E_CERTIFICATE_ERROR;
    15141514                                                        }
    1515                                                        
     1515
    15161516                                                }
    15171517
     
    15361536                                gnutls_dh_get_prime_bits (session));
    15371537
    1538                 /* print the protocol's name (ie TLS 1.0) 
     1538                /* print the protocol's name (ie TLS 1.0)
    15391539                */
    15401540                tmp = gnutls_protocol_get_name (gnutls_protocol_get_version (session));
     
    15581558                tmp = gnutls_mac_get_name (gnutls_mac_get (session));
    15591559                LOG_D("\t - MAC: %s", tmp);
    1560        
    1561 #endif /* DEBUG */             
     1560
     1561#endif /* DEBUG */
    15621562
    15631563        /* This verification function uses the trusted CAs in the credentials
     
    15781578                if (status & GNUTLS_CERT_NOT_ACTIVATED)
    15791579                        LOG_E(" - The certificate is not yet activated.");
    1580         }       
     1580        }
    15811581        if (status & GNUTLS_CERT_INVALID)
    15821582        {
    15831583                return GNUTLS_E_CERTIFICATE_ERROR;
    15841584        }
    1585        
     1585
    15861586        /* Up to here the process is the same for X.509 certificates and
    15871587        * OpenPGP keys. From now on X.509 certificates are assumed. This can
     
    16351635{
    16361636        int dtls = 0;
    1637        
     1637
    16381638        TRACE_ENTRY( "%p %d %d %p %p", conn, mode, algo, priority, alt_creds);
    16391639        CHECK_PARAMS( conn && (!fd_cnx_teststate(conn, CC_STATUS_TLS)) && ( (mode == GNUTLS_CLIENT) || (mode == GNUTLS_SERVER) ) && (!conn->cc_loop) );
     
    16421642        conn->cc_tls_para.mode = mode;
    16431643        conn->cc_tls_para.algo = algo;
    1644        
     1644
    16451645        /* Cancel receiving thread if any -- it should already be terminated anyway, we just release the resources */
    16461646        CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */);
    1647        
     1647
    16481648        /* Once TLS handshake is done, we don't stop after the first message */
    16491649        conn->cc_loop = 1;
    1650        
     1650
    16511651        dtls = fd_cnx_may_dtls(conn);
    1652        
     1652
    16531653        /* Prepare the master session credentials and priority */
    16541654        CHECK_FCT( fd_tls_prepare(&conn->cc_tls_para.session, mode, dtls, priority, alt_creds) );
     
    16831683                }
    16841684        }
    1685        
     1685
    16861686        /* additional initialization for gnutls 3.x */
    16871687        #ifdef GNUTLS_VERSION_300
    16881688                /* the verify function has already been set in the global initialization in config.c */
    1689        
     1689
    16901690        /* fd_tls_verify_credentials_2 uses the connection */
    16911691        gnutls_session_set_ptr (conn->cc_tls_para.session, (void *) conn);
    1692        
     1692
    16931693        if ((conn->cc_tls_para.cn != NULL) && (mode == GNUTLS_CLIENT)) {
    16941694                /* this might allow virtual hosting on the remote peer */
    16951695                CHECK_GNUTLS_DO( gnutls_server_name_set (conn->cc_tls_para.session, GNUTLS_NAME_DNS, conn->cc_tls_para.cn, strlen(conn->cc_tls_para.cn)), /* ignore failure */);
    16961696        }
    1697        
     1697
    16981698        #endif /* GNUTLS_VERSION_300 */
    16991699
     
    17011701        GNUTLS_TRACE( gnutls_handshake_set_timeout( conn->cc_tls_para.session, GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT));
    17021702        #endif /* GNUTLS_VERSION_310 */
    1703        
     1703
    17041704        /* Mark the connection as protected from here, so that the gnutls credentials will be freed */
    17051705        fd_cnx_addstate(conn, CC_STATUS_TLS);
    1706        
     1706
    17071707        /* Handshake master session */
    17081708        {
    17091709                int ret;
    1710        
     1710
    17111711                CHECK_GNUTLS_DO( ret = gnutls_handshake(conn->cc_tls_para.session),
    17121712                        {
     
    17201720                #ifndef GNUTLS_VERSION_300
    17211721                /* Now verify the remote credentials are valid -- only simple tests here */
    1722                 CHECK_FCT_DO( fd_tls_verify_credentials(conn->cc_tls_para.session, conn, 1), 
    1723                         { 
     1722                CHECK_FCT_DO( fd_tls_verify_credentials(conn->cc_tls_para.session, conn, 1),
     1723                        {
    17241724                                CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_RDWR),  );
    17251725                                fd_cnx_markerror(conn);
     
    17281728                #endif /* GNUTLS_VERSION_300 */
    17291729        }
    1730        
     1730
    17311731        /* Multi-stream TLS: handshake other streams as well */
    17321732        if ((!dtls) && (conn->cc_sctp_para.pairs > 1)) {
     
    17511751                }
    17521752        }
    1753        
     1753
    17541754        return 0;
    17551755}
     
    17601760        TRACE_ENTRY("%p %p %p", conn, cert_list, cert_list_size);
    17611761        CHECK_PARAMS( conn && fd_cnx_teststate(conn, CC_STATUS_TLS) && cert_list && cert_list_size );
    1762        
     1762
    17631763        /* This function only works for X.509 certificates. */
    17641764        CHECK_PARAMS( gnutls_certificate_type_get (conn->cc_tls_para.session) == GNUTLS_CRT_X509 );
    1765        
     1765
    17661766        GNUTLS_TRACE( *cert_list = gnutls_certificate_get_peers (conn->cc_tls_para.session, cert_list_size) );
    17671767        if (*cert_list == NULL) {
     
    17711771
    17721772        TRACE_DEBUG( FULL, "Saved certificate chain (%d certificates) in peer structure.", *cert_list_size);
    1773        
     1773
    17741774        return 0;
    17751775}
     
    17821782        size_t ev_sz;
    17831783        void * ev_data;
    1784        
     1784
    17851785        TRACE_ENTRY("%p %p %p %p", conn, timeout, buf, len);
    17861786        CHECK_PARAMS(conn && (conn->cc_socket > 0) && buf && len);
     
    17951795                CHECK_FCT( fd_event_get(conn->cc_incoming, &ev, &ev_sz, &ev_data) );
    17961796        }
    1797        
     1797
    17981798        switch (ev) {
    17991799                case FDEVP_CNX_MSG_RECV:
     
    18021802                        *buf = ev_data;
    18031803                        return 0;
    1804                        
     1804
    18051805                case FDEVP_PSM_TIMEOUT:
    18061806                        TRACE_DEBUG(FULL, "Timeout event received");
    18071807                        return ETIMEDOUT;
    1808                        
     1808
    18091809                case FDEVP_CNX_EP_CHANGE:
    18101810                        /* We ignore this event */
    18111811                        goto get_next;
    1812                        
     1812
    18131813                case FDEVP_CNX_ERROR:
    18141814                        TRACE_DEBUG(FULL, "Received ERROR event on the connection");
    18151815                        return ENOTCONN;
    18161816        }
    1817        
     1817
    18181818        TRACE_DEBUG(INFO, "Received unexpected event %d (%s)", ev, fd_pev_str(ev));
    18191819        return EINVAL;
     
    18361836        TRACE_ENTRY( "%p %p", conn, alt_fifo );
    18371837        CHECK_PARAMS( conn && alt_fifo && conn->cc_incoming );
    1838        
     1838
    18391839        /* The magic function does it all */
    18401840        CHECK_POSIX_DO( pthread_mutex_lock(&state_lock), { ASSERT(0); } );
    18411841        CHECK_FCT_DO( ret = fd_fifo_move( conn->cc_incoming, alt_fifo, &conn->cc_alt ), );
    18421842        CHECK_POSIX_DO( pthread_mutex_unlock(&state_lock), { ASSERT(0); } );
    1843        
     1843
    18441844        return ret;
    18451845}
     
    18621862                if (ret <= 0)
    18631863                        return ENOTCONN;
    1864                
     1864
    18651865                sent += ret;
    18661866        } while ( sent < len );
     
    18721872{
    18731873        TRACE_ENTRY("%p %p %zd", conn, buf, len);
    1874        
     1874
    18751875        CHECK_PARAMS(conn && (conn->cc_socket > 0) && (! fd_cnx_teststate(conn, CC_STATUS_ERROR)) && buf && len);
    18761876
    18771877        TRACE_DEBUG(FULL, "Sending %zdb %sdata on connection %s", len, fd_cnx_teststate(conn, CC_STATUS_TLS) ? "TLS-protected ":"", conn->cc_id);
    1878        
     1878
    18791879        switch (conn->cc_proto) {
    18801880                case IPPROTO_TCP:
    18811881                        CHECK_FCT( send_simple(conn, buf, len) );
    18821882                        break;
    1883                
     1883
    18841884#ifndef DISABLE_SCTP
    18851885                case IPPROTO_SCTP: {
     
    18931893                                        else
    18941894                                                limit = conn->cc_sctp_para.str_out;
    1895                                        
     1895
    18961896                                        if (limit > 1) {
    18971897                                                conn->cc_sctp_para.next += 1;
     
    19001900                                        }
    19011901                                }
    1902                                
     1902
    19031903                                if (stream == 0) {
    19041904                                        /* We can use default function, it sends over stream #0 */
     
    19091909                                                iov.iov_base = buf;
    19101910                                                iov.iov_len  = len;
    1911                                                
     1911
    19121912                                                CHECK_SYS_DO( fd_sctp_sendstrv(conn, stream, &iov, 1), { fd_cnx_markerror(conn); return ENOTCONN; } );
    19131913                                        } else {
     
    19331933                break;
    19341934#endif /* DISABLE_SCTP */
    1935        
     1935
    19361936                default:
    19371937                        TRACE_DEBUG(INFO, "Unknown protocol: %d", conn->cc_proto);
     
    19391939                        return ENOTSUP; /* or EINVAL... */
    19401940        }
    1941        
     1941
    19421942        return 0;
    19431943}
     
    19521952{
    19531953        TRACE_ENTRY("%p", conn);
    1954        
     1954
    19551955        CHECK_PARAMS_DO(conn, return);
    1956        
     1956
    19571957        fd_cnx_addstate(conn, CC_STATUS_CLOSING);
    1958        
     1958
    19591959        /* Initiate shutdown of the TLS session(s): call gnutls_bye(WR), then read until error */
    19601960        if (fd_cnx_teststate(conn, CC_STATUS_TLS)) {
     
    19861986                                conn->cc_tls_para.session = NULL;
    19871987                        }
    1988                        
     1988
    19891989                        /* Destroy the wrapper (also stops the demux thread) */
    19901990                        fd_sctp3436_destroy(conn);
     
    20082008                                CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ );
    20092009                        }
    2010                        
     2010
    20112011                        /* Free the resources of the TLS session */
    20122012                        if (conn->cc_tls_para.session) {
     
    20182018#endif /* DISABLE_SCTP */
    20192019        }
    2020        
     2020
    20212021        /* Terminate the thread in case it is not done yet -- is there any such case left ?*/
    20222022        CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ );
    2023                
     2023
    20242024        /* Shut the connection down */
    20252025        if (conn->cc_socket > 0) {
     
    20282028                conn->cc_socket = -1;
    20292029        }
    2030        
     2030
    20312031        /* Empty and destroy FIFO list */
    20322032        if (conn->cc_incoming) {
    20332033                fd_event_destroy( &conn->cc_incoming, free );
    20342034        }
    2035        
     2035
    20362036        /* Free the object */
    20372037        free(conn);
    2038        
     2038
    20392039        /* Done! */
    20402040        return;
Note: See TracChangeset for help on using the changeset viewer.