annotate freeDiameter/cnxctx.c @ 201:1b47afa59358

Also timeout on sends
author Sebastien Decugis <sdecugis@nict.go.jp>
date Wed, 10 Feb 2010 11:22:42 +0900
parents 3e79fef1031d
children 536b1dde8761
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
1 /*********************************************************************************************************
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
2 * Software License Agreement (BSD License) *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
4 * *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
5 * Copyright (c) 2009, WIDE Project and NICT *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
6 * All rights reserved. *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
7 * *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
8 * Redistribution and use of this software in source and binary forms, with or without modification, are *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
9 * permitted provided that the following conditions are met: *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
10 * *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
11 * * Redistributions of source code must retain the above *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
12 * copyright notice, this list of conditions and the *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
13 * following disclaimer. *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
14 * *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
15 * * Redistributions in binary form must reproduce the above *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
16 * copyright notice, this list of conditions and the *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
17 * following disclaimer in the documentation and/or other *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
18 * materials provided with the distribution. *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
19 * *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
20 * * Neither the name of the WIDE Project or NICT nor the *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
21 * names of its contributors may be used to endorse or *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
22 * promote products derived from this software without *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
23 * specific prior written permission of WIDE Project and *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
24 * NICT. *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
25 * *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
34 *********************************************************************************************************/
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
35
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
36 #include "fD.h"
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
37 #include "cnxctx.h"
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
38
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
39 /* The maximum size of Diameter message we accept to receive (<= 2^24) to avoid too big mallocs in case of trashed headers */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
40 #ifndef DIAMETER_MSG_SIZE_MAX
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
41 #define DIAMETER_MSG_SIZE_MAX 65535 /* in bytes */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
42 #endif /* DIAMETER_MSG_SIZE_MAX */
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
43
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
44 /* Connections contexts (cnxctx) in freeDiameter are wrappers around the sockets and TLS operations .
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
45 * They are used to hide the details of the processing to the higher layers of the daemon.
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
46 * They are always oriented on connections (TCP or SCTP), connectionless modes (UDP or SCTP) are not supported.
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
47 */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
48
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
49 /* Note: this file could be moved to libfreeDiameter instead, but since it uses gnuTLS we prefer to keep it in the daemon */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
50
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
51 /* Lifetime of a cnxctx object:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
52 * 1) Creation
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
53 * a) a server socket:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
54 * - create the object with fd_cnx_serv_tcp or fd_cnx_serv_sctp
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
55 * - start listening incoming connections: fd_cnx_serv_listen
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
56 * - accept new clients with fd_cnx_serv_accept.
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
57 * b) a client socket:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
58 * - connect to a remote server with fd_cnx_cli_connect
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
59 *
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
60 * 2) Initialization
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
61 * - if TLS is started first, call fd_cnx_handshake
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
62 * - otherwise to receive clear messages, call fd_cnx_start_clear. fd_cnx_handshake can be called later.
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
63 *
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
64 * 3) Usage
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
65 * - fd_cnx_receive, fd_cnx_send : exchange messages on this connection (send is synchronous, receive is not, but blocking).
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
66 * - fd_cnx_recv_setaltfifo : when a message is received, the event is sent to an external fifo list. fd_cnx_receive does not work when the alt_fifo is set.
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
67 * - fd_cnx_getid : retrieve a descriptive string for the connection (for debug)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
68 * - fd_cnx_getremoteid : identification of the remote peer (IP address or fqdn)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
69 * - fd_cnx_getcred : get the remote peer TLS credentials, after handshake
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
70 * - fd_cnx_getendpoints : get the endpoints (IP) of the connection
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
71 *
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
72 * 4) End
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
73 * - fd_cnx_destroy
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
74 */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
75
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
76
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
77 /*******************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
78 /* Creation of a connection object */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
79 /*******************************************/
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
80
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
81 /* Initialize a context structure */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
82 static struct cnxctx * fd_cnx_init(int full)
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
83 {
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
84 struct cnxctx * conn = NULL;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
85
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
86 TRACE_ENTRY("%d", full);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
87
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
88 CHECK_MALLOC_DO( conn = malloc(sizeof(struct cnxctx)), return NULL );
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
89 memset(conn, 0, sizeof(struct cnxctx));
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
90
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
91 if (full) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
92 CHECK_FCT_DO( fd_fifo_new ( &conn->cc_incoming ), return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
93 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
94
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
95 return conn;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
96 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
97
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
98 /* Create and bind a server socket to the given endpoint and port */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
99 struct cnxctx * fd_cnx_serv_tcp(uint16_t port, int family, struct fd_endpoint * ep)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
100 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
101 struct cnxctx * cnx = NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
102 sSS dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
103 sSA * sa = (sSA *) &dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
104
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
105 TRACE_ENTRY("%hu %d %p", port, family, ep);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
106
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
107 CHECK_PARAMS_DO( port, return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
108 CHECK_PARAMS_DO( ep || family, return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
109 CHECK_PARAMS_DO( (! family) || (family == AF_INET) || (family == AF_INET6), return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
110 CHECK_PARAMS_DO( (! ep) || (!family) || (ep->ss.ss_family == family), return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
111
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
112 /* The connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
113 CHECK_MALLOC_DO( cnx = fd_cnx_init(0), return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
114
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
115 /* Prepare the socket address information */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
116 if (ep) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
117 memcpy(sa, &ep->ss, sizeof(sSS));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
118 } else {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
119 memset(&dummy, 0, sizeof(dummy));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
120 sa->sa_family = family;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
121 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
122 if (sa->sa_family == AF_INET) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
123 ((sSA4 *)sa)->sin_port = htons(port);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
124 } else {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
125 ((sSA6 *)sa)->sin6_port = htons(port);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
126 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
127
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
128 /* Create the socket */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
129 CHECK_FCT_DO( fd_tcp_create_bind_server( &cnx->cc_socket, sa, sizeof(sSS) ), goto error );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
130
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
131 /* Generate the name for the connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
132 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
133 char addrbuf[INET6_ADDRSTRLEN];
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
134 int rc;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
135 rc = getnameinfo(sa, sizeof(sSS), addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
136 if (rc)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
137 snprintf(addrbuf, sizeof(addrbuf), "[err:%s]", gai_strerror(rc));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
138 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "Srv TCP [%s]:%hu (%d)", addrbuf, port, cnx->cc_socket);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
139 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
140
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
141 cnx->cc_proto = IPPROTO_TCP;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
142
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
143 return cnx;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
144
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
145 error:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
146 fd_cnx_destroy(cnx);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
147 return NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
148 }
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
149
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
150 /* Same function for SCTP, with a list of local endpoints to bind to */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
151 struct cnxctx * fd_cnx_serv_sctp(uint16_t port, struct fd_list * ep_list)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
152 {
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
153 #ifdef DISABLE_SCTP
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
154 TRACE_DEBUG(INFO, "This function should never been called when SCTP is disabled...");
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
155 ASSERT(0);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
156 CHECK_FCT_DO( ENOTSUP, return NULL);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
157 #else /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
158 struct cnxctx * cnx = NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
159 sSS dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
160 sSA * sa = (sSA *) &dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
161
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
162 TRACE_ENTRY("%hu %p", port, ep_list);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
163
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
164 CHECK_PARAMS_DO( port, return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
165
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
166 /* The connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
167 CHECK_MALLOC_DO( cnx = fd_cnx_init(0), return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
168
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
169 /* Create the socket */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
170 CHECK_FCT_DO( fd_sctp_create_bind_server( &cnx->cc_socket, ep_list, port ), goto error );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
171
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
172 /* Generate the name for the connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
173 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "Srv SCTP :%hu (%d)", port, cnx->cc_socket);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
174
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
175 cnx->cc_proto = IPPROTO_SCTP;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
176
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
177 return cnx;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
178
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
179 error:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
180 fd_cnx_destroy(cnx);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
181 return NULL;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
182 #endif /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
183 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
184
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
185 /* Allow clients to connect on the server socket */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
186 int fd_cnx_serv_listen(struct cnxctx * conn)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
187 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
188 CHECK_PARAMS( conn );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
189
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
190 switch (conn->cc_proto) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
191 case IPPROTO_TCP:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
192 CHECK_FCT(fd_tcp_listen(conn->cc_socket));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
193 break;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
194
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
195 #ifndef DISABLE_SCTP
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
196 case IPPROTO_SCTP:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
197 CHECK_FCT(fd_sctp_listen(conn->cc_socket));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
198 break;
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
199 #endif /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
200
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
201 default:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
202 CHECK_PARAMS(0);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
203 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
204
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
205 return 0;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
206 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
207
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
208 /* Accept a client (blocking until a new client connects) -- cancelable */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
209 struct cnxctx * fd_cnx_serv_accept(struct cnxctx * serv)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
210 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
211 struct cnxctx * cli = NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
212 sSS ss;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
213 socklen_t ss_len = sizeof(ss);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
214 int cli_sock = 0;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
215 struct fd_endpoint * ep;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
216
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
217 TRACE_ENTRY("%p", serv);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
218 CHECK_PARAMS_DO(serv, return NULL);
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
219
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
220 /* Accept the new connection -- this is blocking until new client enters or cancellation */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
221 CHECK_SYS_DO( cli_sock = accept(serv->cc_socket, (sSA *)&ss, &ss_len), return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
222
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
223 if (TRACE_BOOL(INFO)) {
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
224 fd_log_debug("%s : accepted new client [", fd_cnx_getid(serv));
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
225 sSA_DUMP_NODE( &ss, NI_NUMERICHOST );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
226 fd_log_debug("].\n");
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
227 }
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
228
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
229 CHECK_MALLOC_DO( cli = fd_cnx_init(1), { shutdown(cli_sock, SHUT_RDWR); return NULL; } );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
230 cli->cc_socket = cli_sock;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
231 cli->cc_proto = serv->cc_proto;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
232
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
233 /* Set the timeout */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
234 fd_cnx_s_setto(cli->cc_socket);
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
235
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
236 /* Generate the name for the connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
237 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
238 char addrbuf[INET6_ADDRSTRLEN];
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
239 char portbuf[10];
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
240 int rc;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
241
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
242 /* Numeric values for debug */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
243 rc = getnameinfo((sSA *)&ss, sizeof(sSS), addrbuf, sizeof(addrbuf), portbuf, sizeof(portbuf), NI_NUMERICHOST | NI_NUMERICSERV);
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
244 if (rc) {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
245 snprintf(addrbuf, sizeof(addrbuf), "[err:%s]", gai_strerror(rc));
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
246 portbuf[0] = '\0';
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
247 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
248
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
249 snprintf(cli->cc_id, sizeof(cli->cc_id), "Incoming %s [%s]:%s (%d) @ serv (%d)",
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
250 IPPROTO_NAME(cli->cc_proto),
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
251 addrbuf, portbuf,
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
252 cli->cc_socket, serv->cc_socket);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
253
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
254 /* Name for log messages */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
255 rc = getnameinfo((sSA *)&ss, sizeof(sSS), cli->cc_remid, sizeof(cli->cc_remid), NULL, 0, 0);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
256 if (rc)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
257 snprintf(cli->cc_remid, sizeof(cli->cc_remid), "[err:%s]", gai_strerror(rc));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
258 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
259
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
260 #ifndef DISABLE_SCTP
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
261 /* SCTP-specific handlings */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
262 if (cli->cc_proto == IPPROTO_SCTP) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
263 /* Retrieve the number of streams */
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
264 CHECK_FCT_DO( fd_sctp_get_str_info( cli->cc_socket, &cli->cc_sctp_para.str_in, &cli->cc_sctp_para.str_out, NULL ), goto error );
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
265 if (cli->cc_sctp_para.str_out > cli->cc_sctp_para.str_in)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
266 cli->cc_sctp_para.pairs = cli->cc_sctp_para.str_out;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
267 else
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
268 cli->cc_sctp_para.pairs = cli->cc_sctp_para.str_in;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
269 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
270 #endif /* DISABLE_SCTP */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
271
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
272 return cli;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
273 error:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
274 fd_cnx_destroy(cli);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
275 return NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
276 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
277
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
278 /* Client side: connect to a remote server -- cancelable */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
279 struct cnxctx * fd_cnx_cli_connect_tcp(sSA * sa /* contains the port already */, socklen_t addrlen)
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
280 {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
281 int sock;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
282 struct cnxctx * cnx = NULL;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
283
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
284 TRACE_ENTRY("%p %d", sa, addrlen);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
285 CHECK_PARAMS_DO( sa && addrlen, return NULL );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
286
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
287 /* Create the socket and connect, which can take some time and/or fail */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
288 CHECK_FCT_DO( fd_tcp_client( &sock, sa, addrlen ), return NULL );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
289
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
290 if (TRACE_BOOL(INFO)) {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
291 fd_log_debug("Connection established to server '");
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
292 sSA_DUMP_NODE_SERV( sa, NI_NUMERICSERV);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
293 fd_log_debug("' (TCP:%d).\n", sock);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
294 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
295
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
296 /* Once the socket is created successfuly, prepare the remaining of the cnx */
182
9ed2e3ce4434 Cleaner error handling
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 156
diff changeset
297 CHECK_MALLOC_DO( cnx = fd_cnx_init(1), { shutdown(sock, SHUT_RDWR); close(sock); return NULL; } );
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
298
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
299 cnx->cc_socket = sock;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
300 cnx->cc_proto = IPPROTO_TCP;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
301
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
302 /* Set the timeout */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
303 fd_cnx_s_setto(cnx->cc_socket);
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
304
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
305 /* Generate the names for the object */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
306 {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
307 char addrbuf[INET6_ADDRSTRLEN];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
308 char portbuf[10];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
309 int rc;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
310
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
311 /* Numeric values for debug */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
312 rc = getnameinfo(sa, addrlen, addrbuf, sizeof(addrbuf), portbuf, sizeof(portbuf), NI_NUMERICHOST | NI_NUMERICSERV);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
313 if (rc) {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
314 snprintf(addrbuf, sizeof(addrbuf), "[err:%s]", gai_strerror(rc));
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
315 portbuf[0] = '\0';
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
316 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
317
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
318 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "Client of TCP server [%s]:%s (%d)", addrbuf, portbuf, cnx->cc_socket);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
319
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
320 /* Name for log messages */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
321 rc = getnameinfo(sa, addrlen, cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
322 if (rc)
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
323 snprintf(cnx->cc_remid, sizeof(cnx->cc_remid), "[err:%s]", gai_strerror(rc));
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
324 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
325
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
326 return cnx;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
327
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
328 error:
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
329 fd_cnx_destroy(cnx);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
330 return NULL;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
331 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
332
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
333 /* Same for SCTP, accepts a list of remote addresses to connect to (see sctp_connectx for how they are used) */
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
334 struct cnxctx * fd_cnx_cli_connect_sctp(int no_ip6, uint16_t port, struct fd_list * list)
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
335 {
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
336 #ifdef DISABLE_SCTP
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
337 TRACE_DEBUG(INFO, "This function should never been called when SCTP is disabled...");
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
338 ASSERT(0);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
339 CHECK_FCT_DO( ENOTSUP, return NULL);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
340 #else /* DISABLE_SCTP */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
341 int sock;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
342 struct cnxctx * cnx = NULL;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
343 sSS primary;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
344
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
345 TRACE_ENTRY("%p", list);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
346 CHECK_PARAMS_DO( list && !FD_IS_LIST_EMPTY(list), return NULL );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
347
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
348 CHECK_FCT_DO( fd_sctp_client( &sock, no_ip6, port, list ), return NULL );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
349
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
350 /* Once the socket is created successfuly, prepare the remaining of the cnx */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
351 CHECK_MALLOC_DO( cnx = fd_cnx_init(1), { shutdown(sock, SHUT_RDWR); return NULL; } );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
352
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
353 cnx->cc_socket = sock;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
354 cnx->cc_proto = IPPROTO_SCTP;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
355
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
356 /* Set the timeout */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
357 fd_cnx_s_setto(cnx->cc_socket);
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
358
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
359 /* Retrieve the number of streams and primary address */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
360 CHECK_FCT_DO( fd_sctp_get_str_info( sock, &cnx->cc_sctp_para.str_in, &cnx->cc_sctp_para.str_out, &primary ), goto error );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
361 if (cnx->cc_sctp_para.str_out > cnx->cc_sctp_para.str_in)
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
362 cnx->cc_sctp_para.pairs = cnx->cc_sctp_para.str_out;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
363 else
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
364 cnx->cc_sctp_para.pairs = cnx->cc_sctp_para.str_in;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
365
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
366 if (TRACE_BOOL(INFO)) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
367 fd_log_debug("Connection established to server '");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
368 sSA_DUMP_NODE_SERV( &primary, NI_NUMERICSERV);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
369 fd_log_debug("' (SCTP:%d, %d/%d streams).\n", sock, cnx->cc_sctp_para.str_in, cnx->cc_sctp_para.str_out);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
370 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
371
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
372 /* Generate the names for the object */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
373 {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
374 char addrbuf[INET6_ADDRSTRLEN];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
375 char portbuf[10];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
376 int rc;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
377
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
378 /* Numeric values for debug */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
379 rc = getnameinfo((sSA *)&primary, sizeof(sSS), addrbuf, sizeof(addrbuf), portbuf, sizeof(portbuf), NI_NUMERICHOST | NI_NUMERICSERV);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
380 if (rc) {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
381 snprintf(addrbuf, sizeof(addrbuf), "[err:%s]", gai_strerror(rc));
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
382 portbuf[0] = '\0';
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
383 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
384
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
385 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "Client of SCTP server [%s]:%s (%d)", addrbuf, portbuf, cnx->cc_socket);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
386
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
387 /* Name for log messages */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
388 rc = getnameinfo((sSA *)&primary, sizeof(sSS), cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
389 if (rc)
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
390 snprintf(cnx->cc_remid, sizeof(cnx->cc_remid), "[err:%s]", gai_strerror(rc));
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
391 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
392
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
393 return cnx;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
394
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
395 error:
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
396 fd_cnx_destroy(cnx);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
397 return NULL;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
398 #endif /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
399 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
400
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
401 /* Return a string describing the connection, for debug */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
402 char * fd_cnx_getid(struct cnxctx * conn)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
403 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
404 CHECK_PARAMS_DO( conn, return "" );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
405 return conn->cc_id;
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
406 }
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
407
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
408 /* Return the protocol of a connection */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
409 int fd_cnx_getproto(struct cnxctx * conn)
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
410 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
411 CHECK_PARAMS_DO( conn, return 0 );
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
412 return conn->cc_proto;
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
413 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
414
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
415 /* Set the hostname to check during handshake */
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
416 void fd_cnx_sethostname(struct cnxctx * conn, char * hn)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
417 {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
418 CHECK_PARAMS_DO( conn, return );
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
419 conn->cc_tls_para.cn = hn;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
420 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
421
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
422 /* Return the TLS state of a connection */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
423 int fd_cnx_getTLS(struct cnxctx * conn)
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
424 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
425 CHECK_PARAMS_DO( conn, return 0 );
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
426 return conn->cc_tls;
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
427 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
428
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
429 /* Get the list of endpoints (IP addresses) of the local and remote peers on this connection */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
430 int fd_cnx_getendpoints(struct cnxctx * conn, struct fd_list * local, struct fd_list * remote)
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
431 {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
432 TRACE_ENTRY("%p %p %p", conn, local, remote);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
433 CHECK_PARAMS(conn);
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
434
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
435 if (local) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
436 /* Retrieve the local endpoint(s) of the connection */
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
437 switch (conn->cc_proto) {
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
438 case IPPROTO_TCP: {
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
439 sSS ss;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
440 socklen_t sl;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
441 CHECK_FCT(fd_tcp_get_local_ep(conn->cc_socket, &ss, &sl));
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
442 CHECK_FCT(fd_ep_add_merge( local, (sSA *)&ss, sl, EP_FL_LL | EP_FL_PRIMARY));
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
443 }
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
444 break;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
445
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
446 #ifndef DISABLE_SCTP
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
447 case IPPROTO_SCTP: {
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
448 CHECK_FCT(fd_sctp_get_local_ep(conn->cc_socket, local));
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
449 }
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
450 break;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
451 #endif /* DISABLE_SCTP */
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
452
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
453 default:
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
454 CHECK_PARAMS(0);
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
455 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
456 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
457
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
458 if (remote) {
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
459 /* Check we have a full connection object, not a listening socket (with no remote) */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
460 CHECK_PARAMS( conn->cc_incoming );
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
461
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
462 /* Retrieve the peer endpoint(s) of the connection */
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
463 switch (conn->cc_proto) {
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
464 case IPPROTO_TCP: {
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
465 sSS ss;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
466 socklen_t sl;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
467 CHECK_FCT(fd_tcp_get_remote_ep(conn->cc_socket, &ss, &sl));
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
468 CHECK_FCT(fd_ep_add_merge( remote, (sSA *)&ss, sl, EP_FL_LL | EP_FL_PRIMARY ));
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
469 }
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
470 break;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
471
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
472 #ifndef DISABLE_SCTP
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
473 case IPPROTO_SCTP: {
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
474 CHECK_FCT(fd_sctp_get_remote_ep(conn->cc_socket, remote));
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
475 }
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
476 break;
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
477 #endif /* DISABLE_SCTP */
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
478
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
479 default:
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
480 CHECK_PARAMS(0);
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
481 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
482 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
483
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
484 return 0;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
485 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
486
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
487
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
488 /* Get a string describing the remote peer address (ip address or fqdn) */
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
489 char * fd_cnx_getremoteid(struct cnxctx * conn)
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
490 {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
491 CHECK_PARAMS_DO( conn, return "" );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
492 return conn->cc_remid;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
493 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
494
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
495
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
496 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
497 /* Use of a connection object */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
498 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
499
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
500 /* Set the timeout option on the socket */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
501 void fd_cnx_s_setto(int sock)
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
502 {
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
503 struct timeval tv;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
504
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
505 /* Set a timeout on the socket so that in any case we are not stuck waiting for something */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
506 memset(&tv, 0, sizeof(tv));
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
507 tv.tv_sec = 3; /* allow 3 seconds timeout for TLS session cleanup */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
508 CHECK_SYS_DO( setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)), /* best effort only */ );
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
509 CHECK_SYS_DO( setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)), /* Also timeout for sending, to avoid waiting forever */ );
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
510 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
511
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
512 /* A recv-like function, taking a cnxctx object instead of socket as entry. Only used to filter timeouts error (GNUTLS does not like these...) */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
513 ssize_t fd_cnx_s_recv(struct cnxctx * conn, void *buffer, size_t length)
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
514 {
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
515 ssize_t ret = 0;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
516 int timedout = 0;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
517 again:
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
518 ret = recv(conn->cc_socket, buffer, length, 0);
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
519 /* Handle special case of timeout */
196
bc530e9dae04 Fix error code returned in case of SO_RCVTIMEO timer reached
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 194
diff changeset
520 if ((ret < 0) && (errno == EAGAIN)) {
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
521 if (!conn->cc_closing)
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
522 goto again; /* don't care, just ignore */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
523 if (!timedout) {
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
524 timedout ++; /* allow for one timeout while closing */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
525 goto again;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
526 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
527 CHECK_SYS_DO(ret, /* continue */);
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
528 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
529
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
530 return ret;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
531 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
532
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
533 /* Send */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
534 static ssize_t fd_cnx_s_send(struct cnxctx * conn, void *buffer, size_t length)
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
535 {
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
536 ssize_t ret = 0;
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
537 int timedout = 0;
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
538 again:
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
539 ret = send(conn->cc_socket, buffer, length, 0);
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
540 /* Handle special case of timeout */
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
541 if ((ret < 0) && (errno == EAGAIN)) {
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
542 if (!conn->cc_closing)
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
543 goto again; /* don't care, just ignore */
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
544 if (!timedout) {
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
545 timedout ++; /* allow for one timeout while closing */
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
546 goto again;
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
547 }
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
548 CHECK_SYS_DO(ret, /* continue */);
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
549 }
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
550
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
551 return ret;
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
552 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
553
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
554 /* Receiver thread (TCP & noTLS) : incoming message is directly saved into the target queue */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
555 static void * rcvthr_notls_tcp(void * arg)
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
556 {
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
557 struct cnxctx * conn = arg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
558
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
559 TRACE_ENTRY("%p", arg);
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
560 CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto out);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
561
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
562 /* Set the thread name */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
563 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
564 char buf[48];
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
565 snprintf(buf, sizeof(buf), "Receiver (%d) TCP/noTLS)", conn->cc_socket);
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
566 fd_log_threadname ( buf );
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
567 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
568
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
569 ASSERT( conn->cc_proto == IPPROTO_TCP );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
570 ASSERT( conn->cc_tls == 0 );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
571 ASSERT( Target_Queue(conn) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
572
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
573 /* Receive from a TCP connection: we have to rebuild the message boundaries */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
574 do {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
575 uint8_t header[4];
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
576 uint8_t * newmsg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
577 size_t length;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
578 ssize_t ret = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
579 size_t received = 0;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
580
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
581 do {
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
582 ret = fd_cnx_s_recv(conn, &header[received], sizeof(header) - received);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
583 if (ret <= 0) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
584 CHECK_SYS_DO(ret, /* continue */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
585 goto error; /* Stop the thread, the recipient of the event will cleanup */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
586 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
587
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
588 received += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
589 } while (received < sizeof(header));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
590
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
591 length = ((size_t)header[1] << 16) + ((size_t)header[2] << 8) + (size_t)header[3];
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
592
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
593 /* Check the received word is a valid begining of a Diameter message */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
594 if ((header[0] != DIAMETER_VERSION) /* defined in <libfreeDiameter.h> */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
595 || (length > DIAMETER_MSG_SIZE_MAX)) { /* to avoid too big mallocs */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
596 /* The message is suspect */
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
597 TRACE_DEBUG(INFO, "Received suspect header [ver: %d, size: %zd], assume disconnection", (int)header[0], length);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
598 goto error; /* Stop the thread, the recipient of the event will cleanup */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
599 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
600
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
601 /* Ok, now we can really receive the data */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
602 CHECK_MALLOC_DO( newmsg = malloc( length ), goto error );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
603 memcpy(newmsg, header, sizeof(header));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
604
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
605 while (received < length) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
606 pthread_cleanup_push(free, newmsg); /* In case we are canceled, clean the partialy built buffer */
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
607 ret = fd_cnx_s_recv(conn, newmsg + received, length - received);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
608 pthread_cleanup_pop(0);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
609
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
610 if (ret <= 0) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
611 CHECK_SYS_DO(ret, /* continue */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
612 free(newmsg);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
613 goto error; /* Stop the thread, the recipient of the event will cleanup */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
614 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
615 received += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
616 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
617
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
618 /* We have received a complete message, send it */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
619 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_MSG_RECV, length, newmsg), /* continue or destroy everything? */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
620
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
621 } while (conn->cc_loop);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
622
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
623 out:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
624 TRACE_DEBUG(FULL, "Thread terminated");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
625 return NULL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
626 error:
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
627 if (!conn->cc_closing) {
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
628 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_ERROR, 0, NULL), /* continue or destroy everything? */);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
629 }
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
630 goto out;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
631 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
632
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
633 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
634 /* Receiver thread (SCTP & noTLS) : incoming message is directly saved into cc_incoming, no need to care for the stream ID */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
635 static void * rcvthr_notls_sctp(void * arg)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
636 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
637 struct cnxctx * conn = arg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
638 uint8_t * buf;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
639 size_t bufsz;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
640 int event;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
641
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
642 TRACE_ENTRY("%p", arg);
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
643 CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto out);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
644
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
645 /* Set the thread name */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
646 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
647 char buf[48];
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
648 snprintf(buf, sizeof(buf), "Receiver (%d) SCTP/noTLS)", conn->cc_socket);
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
649 fd_log_threadname ( buf );
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
650 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
651
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
652 ASSERT( conn->cc_proto == IPPROTO_SCTP );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
653 ASSERT( conn->cc_tls == 0 );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
654 ASSERT( Target_Queue(conn) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
655
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
656 do {
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
657 CHECK_FCT_DO( fd_sctp_recvmeta(conn->cc_socket, NULL, &buf, &bufsz, &event, &conn->cc_closing), goto error );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
658 if (event == FDEVP_CNX_ERROR) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
659 goto error;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
660 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
661
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
662 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), event, bufsz, buf), goto error );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
663
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
664 } while (conn->cc_loop);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
665
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
666 out:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
667 TRACE_DEBUG(FULL, "Thread terminated");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
668 return NULL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
669 error:
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
670 if (!conn->cc_closing) {
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
671 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_ERROR, 0, NULL), /* continue or destroy everything? */);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
672 }
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
673 goto out;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
674 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
675 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
676
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
677 /* Returns 0 on error, received data size otherwise (always >= 0) */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
678 static ssize_t fd_tls_recv_handle_error(struct cnxctx * conn, gnutls_session_t session, void * data, size_t sz)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
679 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
680 ssize_t ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
681 again:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
682 CHECK_GNUTLS_DO( ret = gnutls_record_recv(session, data, sz),
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
683 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
684 switch (ret) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
685 case GNUTLS_E_REHANDSHAKE:
199
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
686 if (!conn->cc_closing)
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
687 CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
688 {
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
689 if (TRACE_BOOL(INFO)) {
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
690 fd_log_debug("TLS re-handshake failed on socket %d (%s) : %s\n", conn->cc_socket, conn->cc_id, gnutls_strerror(ret));
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
691 }
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
692 ret = 0;
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
693 goto end;
3e79fef1031d Still bugs pending...
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 198
diff changeset
694 } );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
695
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
696 case GNUTLS_E_AGAIN:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
697 case GNUTLS_E_INTERRUPTED:
197
6a033f90d8ea Pass the EAGAIN error to GNUTLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 196
diff changeset
698 if (!conn->cc_closing)
6a033f90d8ea Pass the EAGAIN error to GNUTLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 196
diff changeset
699 goto again;
198
5ea550c3f033 Fix handling of long network failures
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 197
diff changeset
700 TRACE_DEBUG(INFO, "Connection is closing, so abord gnutls_record_recv now.");
5ea550c3f033 Fix handling of long network failures
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 197
diff changeset
701 ret = 0;
5ea550c3f033 Fix handling of long network failures
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 197
diff changeset
702 break;
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
703
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
704 default:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
705 TRACE_DEBUG(INFO, "This TLS error is not handled, assume unrecoverable error");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
706 ret = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
707 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
708 } );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
709 end:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
710 return ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
711 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
712
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
713 /* The function that receives TLS data and re-builds a Diameter message -- it exits only on error or cancelation */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
714 int fd_tls_rcvthr_core(struct cnxctx * conn, gnutls_session_t session)
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
715 {
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
716 /* No guarantee that GnuTLS preserves the message boundaries, so we re-build it as in TCP */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
717 do {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
718 uint8_t header[4];
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
719 uint8_t * newmsg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
720 size_t length;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
721 ssize_t ret = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
722 size_t received = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
723
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
724 do {
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
725 ret = fd_tls_recv_handle_error(conn, session, &header[received], sizeof(header) - received);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
726 if (ret == 0) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
727 /* The connection is closed */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
728 goto out;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
729 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
730 received += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
731 } while (received < sizeof(header));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
732
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
733 length = ((size_t)header[1] << 16) + ((size_t)header[2] << 8) + (size_t)header[3];
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
734
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
735 /* Check the received word is a valid beginning of a Diameter message */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
736 if ((header[0] != DIAMETER_VERSION) /* defined in <libfreeDiameter.h> */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
737 || (length > DIAMETER_MSG_SIZE_MAX)) { /* to avoid too big mallocs */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
738 /* The message is suspect */
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
739 TRACE_DEBUG(INFO, "Received suspect header [ver: %d, size: %zd], assume disconnection", (int)header[0], length);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
740 goto out;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
741 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
742
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
743 /* Ok, now we can really receive the data */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
744 CHECK_MALLOC( newmsg = malloc( length ) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
745 memcpy(newmsg, header, sizeof(header));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
746
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
747 while (received < length) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
748 pthread_cleanup_push(free, newmsg); /* In case we are canceled, clean the partialy built buffer */
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
749 ret = fd_tls_recv_handle_error(conn, session, newmsg + received, length - received);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
750 pthread_cleanup_pop(0);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
751
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
752 if (ret == 0) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
753 free(newmsg);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
754 goto out; /* Stop the thread, the recipient of the event will cleanup */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
755 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
756 received += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
757 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
758
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
759 /* We have received a complete message, send it */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
760 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_MSG_RECV, length, newmsg), /* continue or destroy everything? */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
761
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
762 } while (1);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
763 out:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
764 return ENOTCONN;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
765 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
766
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
767 /* Receiver thread (TLS & 1 stream SCTP or TCP) : gnutls directly handles the socket, save records into the target queue */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
768 static void * rcvthr_tls_single(void * arg)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
769 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
770 struct cnxctx * conn = arg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
771
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
772 TRACE_ENTRY("%p", arg);
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
773 CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto error);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
774
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
775 /* Set the thread name */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
776 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
777 char buf[48];
74
9dcb1bd11a07 Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 59
diff changeset
778 snprintf(buf, sizeof(buf), "Receiver (%d) TLS/single stream", conn->cc_socket);
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
779 fd_log_threadname ( buf );
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
780 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
781
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
782 ASSERT( conn->cc_tls == 1 );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
783 ASSERT( Target_Queue(conn) );
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
784
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
785 CHECK_FCT_DO(fd_tls_rcvthr_core(conn, conn->cc_tls_para.session), /* continue */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
786 error:
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
787 if (!conn->cc_closing) {
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
788 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_ERROR, 0, NULL), /* continue or destroy everything? */);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
789 }
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
790 TRACE_DEBUG(FULL, "Thread terminated");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
791 return NULL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
792 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
793
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
794 /* Start receving messages in clear (no TLS) on the connection */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
795 int fd_cnx_start_clear(struct cnxctx * conn, int loop)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
796 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
797 TRACE_ENTRY("%p %i", conn, loop);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
798
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
799 CHECK_PARAMS( conn && Target_Queue(conn) && (!conn->cc_tls) && (!conn->cc_loop));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
800
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
801 /* Save the loop request */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
802 conn->cc_loop = loop;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
803
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
804 /* Release resources in case of a previous call was already made */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
805 CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
806
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
807 switch (conn->cc_proto) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
808 case IPPROTO_TCP:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
809 /* Start the tcp_notls thread */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
810 CHECK_POSIX( pthread_create( &conn->cc_rcvthr, NULL, rcvthr_notls_tcp, conn ) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
811 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
812 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
813 case IPPROTO_SCTP:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
814 /* Start the tcp_notls thread */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
815 CHECK_POSIX( pthread_create( &conn->cc_rcvthr, NULL, rcvthr_notls_sctp, conn ) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
816 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
817 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
818 default:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
819 TRACE_DEBUG(INFO, "Unknown protocol: %d", conn->cc_proto);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
820 return ENOTSUP;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
821 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
822
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
823 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
824 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
825
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
826 /* Prepare a gnutls session object for handshake */
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
827 int fd_tls_prepare(gnutls_session_t * session, int mode, char * priority, void * alt_creds)
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
828 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
829 /* Create the master session context */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
830 CHECK_GNUTLS_DO( gnutls_init (session, mode), return ENOMEM );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
831
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
832 /* Set the algorithm suite */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
833 if (priority) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
834 const char * errorpos;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
835 CHECK_GNUTLS_DO( gnutls_priority_set_direct( *session, priority, &errorpos ),
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
836 { TRACE_DEBUG(INFO, "Error in priority string '%s' at position: '%s'\n", priority, errorpos); return EINVAL; } );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
837 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
838 CHECK_GNUTLS_DO( gnutls_priority_set( *session, fd_g_config->cnf_sec_data.prio_cache ), return EINVAL );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
839 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
840
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
841 /* Set the credentials of this side of the connection */
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
842 CHECK_GNUTLS_DO( gnutls_credentials_set (*session, GNUTLS_CRD_CERTIFICATE, alt_creds ?: fd_g_config->cnf_sec_data.credentials), return EINVAL );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
843
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
844 /* Request the remote credentials as well */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
845 if (mode == GNUTLS_SERVER) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
846 gnutls_certificate_server_set_request (*session, GNUTLS_CERT_REQUIRE);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
847 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
848
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
849 return 0;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
850 }
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
851
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
852 /* Verify remote credentials after successful handshake (return 0 if OK, EINVAL otherwise) */
59
067ab3fc6093 Cleanups in debug messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 57
diff changeset
853 int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, int verbose)
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
854 {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
855 int ret, i;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
856 const gnutls_datum_t *cert_list;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
857 unsigned int cert_list_size;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
858 gnutls_x509_crt_t cert;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
859 time_t now;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
860
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
861 /* Trace the session information -- http://www.gnu.org/software/gnutls/manual/gnutls.html#Obtaining-session-information */
59
067ab3fc6093 Cleanups in debug messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 57
diff changeset
862 if (verbose && TRACE_BOOL(FULL)) {
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
863 const char *tmp;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
864 gnutls_kx_algorithm_t kx;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
865 gnutls_credentials_type_t cred;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
866
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
867 fd_log_debug("TLS Session information for connection '%s':\n", conn->cc_id);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
868
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
869 /* print the key exchange's algorithm name */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
870 kx = gnutls_kx_get (session);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
871 tmp = gnutls_kx_get_name (kx);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
872 fd_log_debug("\t - Key Exchange: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
873
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
874 /* Check the authentication type used and switch
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
875 * to the appropriate. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
876 cred = gnutls_auth_get_type (session);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
877 switch (cred)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
878 {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
879 case GNUTLS_CRD_IA:
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
880 fd_log_debug("\t - TLS/IA session\n");
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
881 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
882
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
883
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
884 #ifdef ENABLE_SRP
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
885 case GNUTLS_CRD_SRP:
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
886 fd_log_debug("\t - SRP session with username %s\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
887 gnutls_srp_server_get_username (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
888 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
889 #endif
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
890
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
891 case GNUTLS_CRD_PSK:
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
892 /* This returns NULL in server side. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
893 if (gnutls_psk_client_get_hint (session) != NULL)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
894 fd_log_debug("\t - PSK authentication. PSK hint '%s'\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
895 gnutls_psk_client_get_hint (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
896 /* This returns NULL in client side. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
897 if (gnutls_psk_server_get_username (session) != NULL)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
898 fd_log_debug("\t - PSK authentication. Connected as '%s'\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
899 gnutls_psk_server_get_username (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
900 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
901
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
902 case GNUTLS_CRD_ANON: /* anonymous authentication */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
903 fd_log_debug("\t - Anonymous DH using prime of %d bits\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
904 gnutls_dh_get_prime_bits (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
905 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
906
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
907 case GNUTLS_CRD_CERTIFICATE: /* certificate authentication */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
908 /* Check if we have been using ephemeral Diffie-Hellman. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
909 if (kx == GNUTLS_KX_DHE_RSA || kx == GNUTLS_KX_DHE_DSS) {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
910 fd_log_debug("\t - Ephemeral DH using prime of %d bits\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
911 gnutls_dh_get_prime_bits (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
912 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
913 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
914
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
915 /* print the protocol's name (ie TLS 1.0) */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
916 tmp = gnutls_protocol_get_name (gnutls_protocol_get_version (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
917 fd_log_debug("\t - Protocol: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
918
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
919 /* print the certificate type of the peer. ie X.509 */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
920 tmp = gnutls_certificate_type_get_name (gnutls_certificate_type_get (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
921 fd_log_debug("\t - Certificate Type: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
922
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
923 /* print the compression algorithm (if any) */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
924 tmp = gnutls_compression_get_name (gnutls_compression_get (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
925 fd_log_debug("\t - Compression: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
926
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
927 /* print the name of the cipher used. ie 3DES. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
928 tmp = gnutls_cipher_get_name (gnutls_cipher_get (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
929 fd_log_debug("\t - Cipher: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
930
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
931 /* Print the MAC algorithms name. ie SHA1 */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
932 tmp = gnutls_mac_get_name (gnutls_mac_get (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
933 fd_log_debug("\t - MAC: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
934 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
935
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
936 /* First, use built-in verification */
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
937 CHECK_GNUTLS_DO( gnutls_certificate_verify_peers2 (session, &ret), return EINVAL );
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
938 if (ret) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
939 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
940 fd_log_debug("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :\n", conn->cc_socket, conn->cc_remid, conn->cc_id);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
941 if (ret & GNUTLS_CERT_INVALID)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
942 fd_log_debug(" - The certificate is not trusted (unknown CA?)\n");
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
943 if (ret & GNUTLS_CERT_REVOKED)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
944 fd_log_debug(" - The certificate has been revoked.\n");
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
945 if (ret & GNUTLS_CERT_SIGNER_NOT_FOUND)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
946 fd_log_debug(" - The certificate hasn't got a known issuer.\n");
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
947 if (ret & GNUTLS_CERT_SIGNER_NOT_CA)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
948 fd_log_debug(" - The certificate signer is not a CA, or uses version 1, or 3 without basic constraints.\n");
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
949 if (ret & GNUTLS_CERT_INSECURE_ALGORITHM)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
950 fd_log_debug(" - The certificate signature uses a weak algorithm.\n");
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
951 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
952 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
953 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
954
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
955 /* Code from http://www.gnu.org/software/gnutls/manual/gnutls.html#Verifying-peer_0027s-certificate */
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
956 if (gnutls_certificate_type_get (session) != GNUTLS_CRT_X509)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
957 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
958
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
959 cert_list = gnutls_certificate_get_peers (session, &cert_list_size);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
960 if (cert_list == NULL)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
961 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
962
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
963 now = time(NULL);
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
964
59
067ab3fc6093 Cleanups in debug messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 57
diff changeset
965 if (verbose && TRACE_BOOL(FULL)) {
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
966 char serial[40];
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
967 char dn[128];
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
968 size_t size;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
969 unsigned int algo, bits;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
970 time_t expiration_time, activation_time;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
971
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
972 fd_log_debug("TLS Certificate information for connection '%s' (%d certs provided):\n", conn->cc_id, cert_list_size);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
973 for (i = 0; i < cert_list_size; i++)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
974 {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
975
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
976 CHECK_GNUTLS_DO( gnutls_x509_crt_init (&cert), return EINVAL);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
977 CHECK_GNUTLS_DO( gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER), return EINVAL);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
978
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
979 fd_log_debug(" Certificate %d info:\n", i);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
980
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
981 expiration_time = gnutls_x509_crt_get_expiration_time (cert);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
982 activation_time = gnutls_x509_crt_get_activation_time (cert);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
983
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
984 fd_log_debug("\t - Certificate is valid since: %s", ctime (&activation_time));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
985 fd_log_debug("\t - Certificate expires: %s", ctime (&expiration_time));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
986
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
987 /* Print the serial number of the certificate. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
988 size = sizeof (serial);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
989 gnutls_x509_crt_get_serial (cert, serial, &size);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
990
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
991 fd_log_debug("\t - Certificate serial number: ");
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
992 {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
993 int j;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
994 for (j = 0; j < size; j++) {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
995 fd_log_debug("%02.2hhx", serial[j]);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
996 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
997 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
998 fd_log_debug("\n");
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
999
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1000 /* Extract some of the public key algorithm's parameters */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1001 algo = gnutls_x509_crt_get_pk_algorithm (cert, &bits);
57
54a55133044f Fix newline
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 54
diff changeset
1002 fd_log_debug("\t - Certificate public key: %s\n",
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1003 gnutls_pk_algorithm_get_name (algo));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1004
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1005 /* Print the version of the X.509 certificate. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1006 fd_log_debug("\t - Certificate version: #%d\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1007 gnutls_x509_crt_get_version (cert));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1008
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1009 size = sizeof (dn);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1010 gnutls_x509_crt_get_dn (cert, dn, &size);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1011 fd_log_debug("\t - DN: %s\n", dn);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1012
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1013 size = sizeof (dn);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1014 gnutls_x509_crt_get_issuer_dn (cert, dn, &size);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1015 fd_log_debug("\t - Issuer's DN: %s\n", dn);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1016
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1017 gnutls_x509_crt_deinit (cert);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1018 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1019 }
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1020
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1021 /* Check validity of all the certificates */
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1022 for (i = 0; i < cert_list_size; i++)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1023 {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1024 time_t deadline;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1025
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1026 CHECK_GNUTLS_DO( gnutls_x509_crt_init (&cert), return EINVAL);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1027 CHECK_GNUTLS_DO( gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER), return EINVAL);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1028
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1029 deadline = gnutls_x509_crt_get_expiration_time(cert);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1030 if ((deadline != (time_t)-1) && (deadline < now)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1031 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1032 fd_log_debug("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :\n", conn->cc_socket, conn->cc_remid, conn->cc_id);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1033 fd_log_debug(" - The certificate %d in the chain is expired\n", i);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1034 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1035 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1036 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1037
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1038 deadline = gnutls_x509_crt_get_activation_time(cert);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1039 if ((deadline != (time_t)-1) && (deadline > now)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1040 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1041 fd_log_debug("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :\n", conn->cc_socket, conn->cc_remid, conn->cc_id);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1042 fd_log_debug(" - The certificate %d in the chain is not yet activated\n", i);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1043 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1044 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1045 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1046
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1047 if ((i == 0) && (conn->cc_tls_para.cn)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1048 if (!gnutls_x509_crt_check_hostname (cert, conn->cc_tls_para.cn)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1049 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1050 fd_log_debug("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :\n", conn->cc_socket, conn->cc_remid, conn->cc_id);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1051 fd_log_debug(" - The certificate hostname does not match '%s'\n", conn->cc_tls_para.cn);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1052 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1053 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1054 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1055 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1056
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1057 gnutls_x509_crt_deinit (cert);
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1058 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1059
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1060 return 0;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1061 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1062
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1063 /* TLS handshake a connection; no need to have called start_clear before. Reception is active if handhsake is successful */
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1064 int fd_cnx_handshake(struct cnxctx * conn, int mode, char * priority, void * alt_creds)
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1065 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1066 TRACE_ENTRY( "%p %d", conn, mode);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1067 CHECK_PARAMS( conn && (!conn->cc_tls) && ( (mode == GNUTLS_CLIENT) || (mode == GNUTLS_SERVER) ) && (!conn->cc_loop) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1068
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1069 /* Save the mode */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1070 conn->cc_tls_para.mode = mode;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1071
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1072 /* Cancel receiving thread if any -- it should already be terminated anyway, we just release the resources */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1073 CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1074
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1075 /* Once TLS handshake is done, we don't stop after the first message */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1076 conn->cc_loop = 1;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1077
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1078 /* Prepare the master session credentials and priority */
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1079 CHECK_FCT( fd_tls_prepare(&conn->cc_tls_para.session, mode, priority, alt_creds) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1080
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1081 /* Special case: multi-stream TLS is not natively managed in GNU TLS, we use a wrapper library */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1082 if (conn->cc_sctp_para.pairs > 1) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1083 #ifdef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1084 ASSERT(0);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1085 CHECK_FCT( ENOTSUP );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1086 #else /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1087 /* Initialize the wrapper, start the demux thread */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1088 CHECK_FCT( fd_sctps_init(conn) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1089 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1090 } else {
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1091 /* Set the transport pointer passed to push & pull callbacks */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1092 gnutls_transport_set_ptr( conn->cc_tls_para.session, (gnutls_transport_ptr_t) conn );
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1093
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1094 /* Set the push and pull callbacks */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1095 gnutls_transport_set_pull_function(conn->cc_tls_para.session, (void *)fd_cnx_s_recv);
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1096 gnutls_transport_set_push_function(conn->cc_tls_para.session, (void *)fd_cnx_s_send);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1097 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1098
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1099 /* Handshake master session */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1100 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1101 int ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1102 CHECK_GNUTLS_DO( ret = gnutls_handshake(conn->cc_tls_para.session),
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1103 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1104 if (TRACE_BOOL(INFO)) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1105 fd_log_debug("TLS Handshake failed on socket %d (%s) : %s\n", conn->cc_socket, conn->cc_id, gnutls_strerror(ret));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1106 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1107 return EINVAL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1108 } );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1109
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1110 /* Now verify the remote credentials are valid -- only simple test here */
59
067ab3fc6093 Cleanups in debug messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 57
diff changeset
1111 CHECK_FCT( fd_tls_verify_credentials(conn->cc_tls_para.session, conn, 1) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1112 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1113
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1114 /* Multi-stream TLS: handshake other streams as well */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1115 if (conn->cc_sctp_para.pairs > 1) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1116 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1117 /* Resume all additional sessions from the master one. */
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1118 CHECK_FCT(fd_sctps_handshake_others(conn, priority, alt_creds));
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1119
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1120 /* Mark the connection as protected from here */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1121 conn->cc_tls = 1;
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1122
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1123 /* Start decrypting the messages from all threads and queuing them in target queue */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1124 CHECK_FCT(fd_sctps_startthreads(conn));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1125 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1126 } else {
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1127 /* Mark the connection as protected from here */
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1128 conn->cc_tls = 1;
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1129
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1130 /* Start decrypting the data */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1131 CHECK_POSIX( pthread_create( &conn->cc_rcvthr, NULL, rcvthr_tls_single, conn ) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1132 }
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1133
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1134 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1135 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1136
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1137 /* Retrieve TLS credentials of the remote peer, after handshake */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1138 int fd_cnx_getcred(struct cnxctx * conn, const gnutls_datum_t **cert_list, unsigned int *cert_list_size)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1139 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1140 TRACE_ENTRY("%p %p %p", conn, cert_list, cert_list_size);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1141 CHECK_PARAMS( conn && (conn->cc_tls) && cert_list && cert_list_size );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1142
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1143 /* This function only works for X.509 certificates. */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1144 CHECK_PARAMS( gnutls_certificate_type_get (conn->cc_tls_para.session) == GNUTLS_CRT_X509 );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1145
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1146 *cert_list = gnutls_certificate_get_peers (conn->cc_tls_para.session, cert_list_size);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1147 if (*cert_list == NULL) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1148 TRACE_DEBUG(INFO, "No certificate was provided by remote peer / an error occurred.");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1149 return EINVAL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1150 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1151
54
889c55527a1d Fixed additional newline character
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 53
diff changeset
1152 TRACE_DEBUG( FULL, "Saved certificate chain (%d certificates) in peer structure.", *cert_list_size);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1153
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1154 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1155 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1156
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1157 /* Receive next message. if timeout is not NULL, wait only until timeout. This function only pulls from a queue, mgr thread is filling that queue aynchrounously. */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1158 int fd_cnx_receive(struct cnxctx * conn, struct timespec * timeout, unsigned char **buf, size_t * len)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1159 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1160 int ev;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1161 size_t ev_sz;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1162 void * ev_data;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1163
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1164 TRACE_ENTRY("%p %p %p %p", conn, timeout, buf, len);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1165 CHECK_PARAMS(conn && (conn->cc_socket > 0) && buf && len);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1166 CHECK_PARAMS(conn->cc_rcvthr != (pthread_t)NULL);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1167 CHECK_PARAMS(conn->cc_alt == NULL);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1168
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1169 /* Now, pull the first event */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1170 get_next:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1171 if (timeout) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1172 CHECK_FCT( fd_event_timedget(conn->cc_incoming, timeout, FDEVP_PSM_TIMEOUT, &ev, &ev_sz, &ev_data) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1173 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1174 CHECK_FCT( fd_event_get(conn->cc_incoming, &ev, &ev_sz, &ev_data) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1175 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1176
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1177 switch (ev) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1178 case FDEVP_CNX_MSG_RECV:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1179 /* We got one */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1180 *len = ev_sz;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1181 *buf = ev_data;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1182 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1183
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1184 case FDEVP_PSM_TIMEOUT:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1185 TRACE_DEBUG(FULL, "Timeout event received");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1186 return ETIMEDOUT;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1187
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1188 case FDEVP_CNX_EP_CHANGE:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1189 /* We ignore this event */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1190 goto get_next;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1191
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1192 case FDEVP_CNX_ERROR:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1193 TRACE_DEBUG(FULL, "Received ERROR event on the connection");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1194 return ENOTCONN;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1195 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1196
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1197 TRACE_DEBUG(INFO, "Received unexpected event %d (%s)", ev, fd_pev_str(ev));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1198 return EINVAL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1199 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1200
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1201 /* Set an alternate FIFO list to send FDEVP_CNX_* events to */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1202 int fd_cnx_recv_setaltfifo(struct cnxctx * conn, struct fifo * alt_fifo)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1203 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1204 TRACE_ENTRY( "%p %p", conn, alt_fifo );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1205 CHECK_PARAMS( conn && alt_fifo && conn->cc_incoming );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1206
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1207 /* The magic function does it all */
43
2db15632a63d Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 38
diff changeset
1208 CHECK_FCT( fd_fifo_move( conn->cc_incoming, alt_fifo, &conn->cc_alt ) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1209
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1210 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1211 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1212
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1213 /* Wrapper around gnutls_record_send to handle some error codes */
30
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1214 static ssize_t fd_tls_send_handle_error(struct cnxctx * conn, gnutls_session_t session, void * data, size_t sz)
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1215 {
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1216 ssize_t ret;
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1217 again:
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1218 CHECK_GNUTLS_DO( ret = gnutls_record_send(session, data, sz),
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1219 {
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1220 switch (ret) {
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1221 case GNUTLS_E_REHANDSHAKE:
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1222 CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1223 {
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1224 if (TRACE_BOOL(INFO)) {
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1225 fd_log_debug("TLS re-handshake failed on socket %d (%s) : %s\n", conn->cc_socket, conn->cc_id, gnutls_strerror(ret));
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1226 }
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1227 goto end;
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1228 } );
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1229
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1230 case GNUTLS_E_AGAIN:
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1231 case GNUTLS_E_INTERRUPTED:
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1232 goto again;
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1233
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1234 default:
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1235 TRACE_DEBUG(INFO, "This TLS error is not handled, assume unrecoverable error");
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1236 }
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1237 } );
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1238 end:
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1239 return ret;
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1240 }
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1241
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1242
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1243
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1244 /* Send function when no multi-stream is involved, or sending on stream #0 (send() always use stream 0)*/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1245 static int send_simple(struct cnxctx * conn, unsigned char * buf, size_t len)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1246 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1247 ssize_t ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1248 size_t sent = 0;
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
1249 TRACE_ENTRY("%p %p %zd", conn, buf, len);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1250 do {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1251 if (conn->cc_tls) {
30
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1252 CHECK_GNUTLS_DO( ret = fd_tls_send_handle_error(conn, conn->cc_tls_para.session, buf + sent, len - sent), return ENOTCONN );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1253 } else {
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
1254 CHECK_SYS( ret = fd_cnx_s_send(conn, buf + sent, len - sent) ); /* better to replace with sendmsg for atomic sending? */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1255 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1256 sent += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1257 } while ( sent < len );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1258 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1259 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1260
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1261 /* Send a message -- this is synchronous -- and we assume it's never called by several threads at the same time, so we don't protect. */
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1262 int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len)
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1263 {
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
1264 TRACE_ENTRY("%p %p %zd", conn, buf, len);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1265
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1266 CHECK_PARAMS(conn && (conn->cc_socket > 0) && buf && len);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1267
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
1268 TRACE_DEBUG(FULL, "Sending %zdb %sdata on connection %s", len, conn->cc_tls ? "TLS-protected ":"", conn->cc_id);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1269
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1270 switch (conn->cc_proto) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1271 case IPPROTO_TCP:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1272 CHECK_FCT( send_simple(conn, buf, len) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1273 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1274
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1275 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1276 case IPPROTO_SCTP: {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1277 int multistr = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1278
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1279 if ((conn->cc_sctp_para.str_out > 1) && ((! conn->cc_tls) || (conn->cc_sctp_para.pairs > 1))) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1280 /* Update the id of the stream we will send this message on */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1281 conn->cc_sctp_para.next += 1;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1282 conn->cc_sctp_para.next %= (conn->cc_tls ? conn->cc_sctp_para.pairs : conn->cc_sctp_para.str_out);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1283 multistr = 1;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1284 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1285
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1286 if ((!multistr) || (conn->cc_sctp_para.next == 0)) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1287 CHECK_FCT( send_simple(conn, buf, len) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1288 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1289 if (!conn->cc_tls) {
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
1290 CHECK_FCT( fd_sctp_sendstr(conn->cc_socket, conn->cc_sctp_para.next, buf, len, &conn->cc_closing) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1291 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1292 /* push the record to the appropriate session */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1293 ssize_t ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1294 size_t sent = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1295 ASSERT(conn->cc_sctps_data.array != NULL);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1296 do {
30
bca243c65b56 Fix some segfaults
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 29
diff changeset
1297 CHECK_GNUTLS_DO( ret = fd_tls_send_handle_error(conn, conn->cc_sctps_data.array[conn->cc_sctp_para.next].session, buf + sent, len - sent), return ENOTCONN );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1298 sent += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1299 } while ( sent < len );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1300 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1301 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1302 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1303 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1304 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1305
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1306 default:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1307 TRACE_DEBUG(INFO, "Unknwon protocol: %d", conn->cc_proto);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1308 return ENOTSUP; /* or EINVAL... */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1309 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1310
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1311 return 0;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1312 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1313
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1314
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1315 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1316 /* Destruction of connection */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1317 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1318
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1319 /* Destroy a conn structure, and shutdown the socket */
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1320 void fd_cnx_destroy(struct cnxctx * conn)
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1321 {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1322 TRACE_ENTRY("%p", conn);
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1323
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1324 CHECK_PARAMS_DO(conn, return);
43
2db15632a63d Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 38
diff changeset
1325
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1326 conn->cc_closing = 1;
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1327
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1328 /* Initiate shutdown of the TLS session(s): call gnutls_bye(WR), then read until error */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1329 if (conn->cc_tls) {
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1330 #ifndef DISABLE_SCTP
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1331 if (conn->cc_sctp_para.pairs > 1) {
156
e2dc300819b3 Fix overwriten thread location
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 155
diff changeset
1332 /* Bye on master session */
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1333 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_WR), /* Continue */ );
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1334
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1335 /* and other stream pairs */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1336 fd_sctps_bye(conn);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1337
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1338 /* Now wait for all decipher threads to terminate */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1339 fd_sctps_waitthreadsterm(conn);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1340
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1341 /* Deinit gnutls resources */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1342 fd_sctps_gnutls_deinit_others(conn);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1343 gnutls_deinit(conn->cc_tls_para.session);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1344
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1345 /* Destroy the wrapper (also stops the demux thread) */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1346 fd_sctps_destroy(conn);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1347
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1348 } else {
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1349 #endif /* DISABLE_SCTP */
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1350 /* We are not using the sctps wrapper layer */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1351 /* Master session */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1352 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_WR), /* Continue */ );
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1353
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1354 /* In this case, just wait for thread rcvthr_tls_single to terminate */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1355 if (conn->cc_rcvthr != (pthread_t)NULL) {
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1356 CHECK_POSIX_DO( pthread_join(conn->cc_rcvthr, NULL), /* continue */ );
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1357 conn->cc_rcvthr = (pthread_t)NULL;
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1358 }
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1359
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1360 /* Free the resources of the TLS session */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1361 gnutls_deinit(conn->cc_tls_para.session);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1362
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1363 #ifndef DISABLE_SCTP
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1364 }
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1365 #endif /* DISABLE_SCTP */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1366 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1367
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1368 /* Terminate the thread in case it is not done yet */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1369 CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1370
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1371 /* Shut the connection down */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1372 if (conn->cc_socket > 0) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1373 shutdown(conn->cc_socket, SHUT_RDWR);
38
68c1890f7049 Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 31
diff changeset
1374 close(conn->cc_socket);
68c1890f7049 Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 31
diff changeset
1375 conn->cc_socket = -1;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1376 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1377
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1378 /* Empty and destroy FIFO list */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1379 if (conn->cc_incoming) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1380 fd_event_destroy( &conn->cc_incoming, free );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1381 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1382
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1383 /* Free the object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1384 free(conn);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1385
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1386 /* Done! */
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1387 return;
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1388 }
"Welcome to our mercurial repository"