annotate freeDiameter/cnxctx.c @ 378:41e3c2a3721c

Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner! Should close #4
author Sebastien Decugis <sdecugis@nict.go.jp>
date Mon, 05 Jul 2010 16:21:22 +0900
parents 5df55136361b
children 918fbb92eb8b
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 * *
258
5df55136361b Updated copyright information
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 251
diff changeset
5 * Copyright (c) 2010, WIDE Project and NICT *
20
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
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
39 #include <net/if.h>
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
40 #include <ifaddrs.h> /* for getifaddrs */
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
41
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
42 /* 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
43 #ifndef DIAMETER_MSG_SIZE_MAX
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
44 #define DIAMETER_MSG_SIZE_MAX 65535 /* in bytes */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
45 #endif /* DIAMETER_MSG_SIZE_MAX */
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
46
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
47
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
48 /* 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
49 * 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
50 * 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
51 */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
52
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
53 /* 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
54
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
55 /* Lifetime of a cnxctx object:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
56 * 1) Creation
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
57 * a) a server socket:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
58 * - 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
59 * - start listening incoming connections: fd_cnx_serv_listen
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
60 * - accept new clients with fd_cnx_serv_accept.
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
61 * b) a client socket:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
62 * - 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
63 *
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
64 * 2) Initialization
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
65 * - if TLS is started first, call fd_cnx_handshake
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
66 * - 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
67 *
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
68 * 3) Usage
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
69 * - 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
70 * - 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
71 * - 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
72 * - 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
73 * - 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
74 * - 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
75 *
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
76 * 4) End
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
77 * - fd_cnx_destroy
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
78 */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
79
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
80 /*******************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
81 /* Creation of a connection object */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
82 /*******************************************/
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
83
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
84 /* Initialize a context structure */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
85 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
86 {
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
87 struct cnxctx * conn = NULL;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
88
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
89 TRACE_ENTRY("%d", full);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
90
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
91 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
92 memset(conn, 0, sizeof(struct cnxctx));
22
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 if (full) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
95 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
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 return conn;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
99 }
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 /* 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
102 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
103 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
104 struct cnxctx * cnx = NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
105 sSS dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
106 sSA * sa = (sSA *) &dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
107
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
108 TRACE_ENTRY("%hu %d %p", port, family, ep);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
109
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
110 CHECK_PARAMS_DO( port, return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
111 CHECK_PARAMS_DO( ep || family, return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
112 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
113 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
114
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
115 /* The connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
116 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
117
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
118 /* Prepare the socket address information */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
119 if (ep) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
120 memcpy(sa, &ep->ss, sizeof(sSS));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
121 } else {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
122 memset(&dummy, 0, sizeof(dummy));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
123 sa->sa_family = family;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
124 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
125 if (sa->sa_family == AF_INET) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
126 ((sSA4 *)sa)->sin_port = htons(port);
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
127 cnx->cc_family = AF_INET;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
128 } else {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
129 ((sSA6 *)sa)->sin6_port = htons(port);
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
130 cnx->cc_family = AF_INET6;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
131 }
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 /* Create the socket */
246
6418a188c1b5 getnameinfo is also more sensitive on freeBSD
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 245
diff changeset
134 CHECK_FCT_DO( fd_tcp_create_bind_server( &cnx->cc_socket, sa, sSAlen(sa) ), goto error );
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
135
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
136 /* Generate the name for the connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
137 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
138 char addrbuf[INET6_ADDRSTRLEN];
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
139 int rc;
247
f89b5a12d2af Forgot a couple of getnameinfo
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 246
diff changeset
140 rc = getnameinfo(sa, sSAlen(sa), addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
141 if (rc)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
142 snprintf(addrbuf, sizeof(addrbuf), "[err:%s]", gai_strerror(rc));
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
143 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "TCP srv [%s]:%hu (%d)", addrbuf, port, cnx->cc_socket);
22
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
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
146 cnx->cc_proto = IPPROTO_TCP;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
147
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
148 return cnx;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
149
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
150 error:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
151 fd_cnx_destroy(cnx);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
152 return NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
153 }
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
154
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
155 /* 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
156 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
157 {
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
158 #ifdef DISABLE_SCTP
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
159 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
160 ASSERT(0);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
161 CHECK_FCT_DO( ENOTSUP, return NULL);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
162 #else /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
163 struct cnxctx * cnx = NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
164 sSS dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
165 sSA * sa = (sSA *) &dummy;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
166
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
167 TRACE_ENTRY("%hu %p", port, ep_list);
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 CHECK_PARAMS_DO( port, return NULL );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
170
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
171 /* The connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
172 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
173
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
174 if (fd_g_config->cnf_flags.no_ip6) {
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
175 cnx->cc_family = AF_INET;
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
176 } else {
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
177 cnx->cc_family = AF_INET6; /* can create socket for both IP and IPv6 */
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
178 }
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
179
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
180 /* Create the socket */
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
181 CHECK_FCT_DO( fd_sctp_create_bind_server( &cnx->cc_socket, cnx->cc_family, ep_list, port ), goto error );
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
182
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
183 /* Generate the name for the connection object */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
184 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "SCTP srv :%hu (%d)", port, cnx->cc_socket);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
185
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
186 cnx->cc_proto = IPPROTO_SCTP;
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 return cnx;
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 error:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
191 fd_cnx_destroy(cnx);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
192 return NULL;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
193 #endif /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
194 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
195
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
196 /* Allow clients to connect on the server socket */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
197 int fd_cnx_serv_listen(struct cnxctx * conn)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
198 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
199 CHECK_PARAMS( conn );
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 switch (conn->cc_proto) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
202 case IPPROTO_TCP:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
203 CHECK_FCT(fd_tcp_listen(conn->cc_socket));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
204 break;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
205
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
206 #ifndef DISABLE_SCTP
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
207 case IPPROTO_SCTP:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
208 CHECK_FCT(fd_sctp_listen(conn->cc_socket));
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
209 break;
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
210 #endif /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
211
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
212 default:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
213 CHECK_PARAMS(0);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
214 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
215
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
216 return 0;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
217 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
218
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
219 /* 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
220 struct cnxctx * fd_cnx_serv_accept(struct cnxctx * serv)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
221 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
222 struct cnxctx * cli = NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
223 sSS ss;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
224 socklen_t ss_len = sizeof(ss);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
225 int cli_sock = 0;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
226 struct fd_endpoint * ep;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
227
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
228 TRACE_ENTRY("%p", serv);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
229 CHECK_PARAMS_DO(serv, return NULL);
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
230
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
231 /* Accept the new connection -- this is blocking until new client enters or until cancellation */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
232 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
233
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
234 if (TRACE_BOOL(INFO)) {
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
235 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
236 sSA_DUMP_NODE( &ss, NI_NUMERICHOST );
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
237 fd_log_debug("].\n");
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
238 }
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
239
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
240 CHECK_MALLOC_DO( cli = fd_cnx_init(1), { shutdown(cli_sock, SHUT_RDWR); close(cli_sock); return NULL; } );
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
241 cli->cc_socket = cli_sock;
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
242 cli->cc_family = serv->cc_family;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
243 cli->cc_proto = serv->cc_proto;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
244
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
245 /* 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
246 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
247
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
248 /* Generate the name for the connection object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
249 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
250 char addrbuf[INET6_ADDRSTRLEN];
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
251 char portbuf[10];
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
252 int rc;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
253
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
254 /* Numeric values for debug */
247
f89b5a12d2af Forgot a couple of getnameinfo
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 246
diff changeset
255 rc = getnameinfo((sSA *)&ss, sSAlen(&ss), 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
256 if (rc) {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
257 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
258 portbuf[0] = '\0';
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
259 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
260
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
261 snprintf(cli->cc_id, sizeof(cli->cc_id), "{%s} (%d) <- [%s]:%s (%d)",
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
262 IPPROTO_NAME(cli->cc_proto), serv->cc_socket,
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
263 addrbuf, portbuf, cli->cc_socket);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
264
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
265 /* Name for log messages */
247
f89b5a12d2af Forgot a couple of getnameinfo
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 246
diff changeset
266 rc = getnameinfo((sSA *)&ss, sSAlen(&ss), 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
267 if (rc)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
268 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
269 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
270
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
271 #ifndef DISABLE_SCTP
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
272 /* SCTP-specific handlings */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
273 if (cli->cc_proto == IPPROTO_SCTP) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
274 /* Retrieve the number of streams */
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
275 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
276 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
277 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
278 else
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
279 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
280 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
281 #endif /* DISABLE_SCTP */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
282
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
283 return cli;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
284 error:
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
285 fd_cnx_destroy(cli);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
286 return NULL;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
287 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
288
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
289 /* 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
290 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
291 {
227
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
292 int sock = 0;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
293 struct cnxctx * cnx = NULL;
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 TRACE_ENTRY("%p %d", sa, addrlen);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
296 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
297
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
298 /* Create the socket and connect, which can take some time and/or fail */
227
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
299 {
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
300 int ret = fd_tcp_client( &sock, sa, addrlen );
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
301 if (ret != 0) {
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
302 int lvl;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
303 switch (ret) {
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
304 case ECONNREFUSED:
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
305
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
306 /* "Normal" errors */
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
307 lvl = FULL;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
308 break;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
309 default:
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
310 lvl = INFO;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
311 }
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
312 /* Some errors are expected, we log at different level */
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
313 TRACE_DEBUG( lvl, "fd_tcp_client returned an error: %s", strerror(ret));
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
314 return NULL;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
315 }
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
316 }
24
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 if (TRACE_BOOL(INFO)) {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
319 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
320 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
321 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
322 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
323
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
324 /* 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
325 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
326
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
327 cnx->cc_socket = sock;
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
328 cnx->cc_family = sa->sa_family;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
329 cnx->cc_proto = IPPROTO_TCP;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
330
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
331 /* 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
332 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
333
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
334 /* Generate the names for the object */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
335 {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
336 char addrbuf[INET6_ADDRSTRLEN];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
337 char portbuf[10];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
338 int rc;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
339
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
340 /* Numeric values for debug */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
341 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
342 if (rc) {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
343 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
344 portbuf[0] = '\0';
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
345 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
346
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
347 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "{TCP} -> [%s]:%s (%d)", addrbuf, portbuf, cnx->cc_socket);
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
348
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
349 /* Name for log messages */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
350 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
351 if (rc)
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
352 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
353 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
354
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
355 return cnx;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
356 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
357
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
358 /* 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
359 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
360 {
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
361 #ifdef DISABLE_SCTP
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
362 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
363 ASSERT(0);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
364 CHECK_FCT_DO( ENOTSUP, return NULL);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
365 #else /* DISABLE_SCTP */
227
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
366 int sock = 0;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
367 struct cnxctx * cnx = NULL;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
368 sSS primary;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
369
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
370 TRACE_ENTRY("%p", list);
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
371 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
372
227
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
373 {
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
374 int ret = fd_sctp_client( &sock, no_ip6, port, list );
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
375 if (ret != 0) {
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
376 int lvl;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
377 switch (ret) {
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
378 case ECONNREFUSED:
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
379
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
380 /* "Normal" errors */
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
381 lvl = FULL;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
382 break;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
383 default:
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
384 lvl = INFO;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
385 }
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
386 /* Some errors are expected, we log at different level */
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
387 TRACE_DEBUG( lvl, "fd_sctp_client returned an error: %s", strerror(ret));
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
388 return NULL;
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
389 }
80a7e65167c4 Cleanup verbosity and fix unintialized variable
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 223
diff changeset
390 }
24
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 /* Once the socket is created successfuly, prepare the remaining of the cnx */
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
393 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
394
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
395 cnx->cc_socket = sock;
220
5f2ce627db3c Try to fix the old bug on sctp_getpaddrs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 214
diff changeset
396 cnx->cc_family = no_ip6 ? AF_INET : AF_INET6;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
397 cnx->cc_proto = IPPROTO_SCTP;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
398
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
399 /* 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
400 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
401
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
402 /* 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
403 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
404 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
405 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
406 else
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
407 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
408
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
409 if (TRACE_BOOL(INFO)) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
410 fd_log_debug("Connection established to server '");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
411 sSA_DUMP_NODE_SERV( &primary, NI_NUMERICSERV);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
412 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
413 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
414
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
415 /* Generate the names for the object */
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
416 {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
417 char addrbuf[INET6_ADDRSTRLEN];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
418 char portbuf[10];
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
419 int rc;
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
420
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
421 /* Numeric values for debug */
247
f89b5a12d2af Forgot a couple of getnameinfo
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 246
diff changeset
422 rc = getnameinfo((sSA *)&primary, sSAlen(&primary), 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
423 if (rc) {
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
424 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
425 portbuf[0] = '\0';
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
426 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
427
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
428 snprintf(cnx->cc_id, sizeof(cnx->cc_id), "{SCTP} -> [%s]:%s (%d)", addrbuf, portbuf, cnx->cc_socket);
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
429
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
430 /* Name for log messages */
247
f89b5a12d2af Forgot a couple of getnameinfo
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 246
diff changeset
431 rc = getnameinfo((sSA *)&primary, sSAlen(&primary), cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0);
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
432 if (rc)
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
433 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
434 }
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
435
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
436 return cnx;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
437
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
438 error:
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
439 fd_cnx_destroy(cnx);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
440 return NULL;
24
bd83ce9328ed Cleanups and completed sctp code (not finished)
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 23
diff changeset
441 #endif /* DISABLE_SCTP */
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
442 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
443
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
444 /* Return a string describing the connection, for debug */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
445 char * fd_cnx_getid(struct cnxctx * conn)
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
446 {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
447 CHECK_PARAMS_DO( conn, return "" );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
448 return conn->cc_id;
20
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
449 }
277ec00d793e Backup before typhoon... Progress on server side
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
450
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
451 /* 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
452 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
453 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
454 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
455 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
456 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
457
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
458 /* 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
459 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
460 {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
461 CHECK_PARAMS_DO( conn, return );
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
462 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
463 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
464
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
465 /* 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
466 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
467 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
468 CHECK_PARAMS_DO( conn, return 0 );
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
469 return conn->cc_status & CC_STATUS_TLS;
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
470 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
471
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
472 /* Get the list of endpoints (IP addresses) of the local and remote peers on this connection */
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
473 int fd_cnx_getremoteeps(struct cnxctx * conn, struct fd_list * eps)
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
474 {
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
475 TRACE_ENTRY("%p %p %p", conn, eps);
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
476 CHECK_PARAMS(conn && eps);
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
477
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
478 /* Check we have a full connection object, not a listening socket (with no remote) */
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
479 CHECK_PARAMS( conn->cc_incoming );
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
480
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
481 /* Retrieve the peer endpoint(s) of the connection */
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
482 switch (conn->cc_proto) {
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
483 case IPPROTO_TCP: {
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
484 sSS ss;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
485 socklen_t sl;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
486 CHECK_FCT(fd_tcp_get_remote_ep(conn->cc_socket, &ss, &sl));
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
487 CHECK_FCT(fd_ep_add_merge( eps, (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
488 }
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
489 break;
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
490
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
491 #ifndef DISABLE_SCTP
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
492 case IPPROTO_SCTP: {
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
493 CHECK_FCT(fd_sctp_get_remote_ep(conn->cc_socket, eps));
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
494 }
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
495 break;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
496 #endif /* DISABLE_SCTP */
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
497
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
498 default:
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
499 CHECK_PARAMS(0);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
500 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
501
23
db6c40b8b307 Added some code in cnxctx.c mainly
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 22
diff changeset
502 return 0;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
503 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
504
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
505 /* 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
506 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
507 {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
508 CHECK_PARAMS_DO( conn, return "" );
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
509 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
510 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
511
378
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
512 /* Retrieve a list of all IP addresses of the local system from the kernel, using */
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
513 int fd_cnx_get_local_eps(struct fd_list * list)
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
514 {
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
515 struct ifaddrs *iflist, *cur;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
516 CHECK_SYS(getifaddrs(&iflist));
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
517
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
518 for (cur = iflist; cur != NULL; cur = cur->ifa_next) {
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
519 if (cur->ifa_flags & IFF_LOOPBACK)
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
520 continue;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
521
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
522 if (fd_g_config->cnf_flags.no_ip4 && (cur->ifa_addr->sa_family == AF_INET))
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
523 continue;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
524
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
525 if (fd_g_config->cnf_flags.no_ip6 && (cur->ifa_addr->sa_family == AF_INET6))
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
526 continue;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
527
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
528 CHECK_FCT(fd_ep_add_merge( list, cur->ifa_addr, sSAlen(cur->ifa_addr), EP_FL_LL ));
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
529 }
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
530
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
531 freeifaddrs(iflist);
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
532
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
533 return 0;
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
534 }
41e3c2a3721c Replaced old mechanism to discover local addresses by a call to getifaddrs, lot cleaner!
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 258
diff changeset
535
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
536
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
537 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
538 /* Use of a connection object */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
539 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
540
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
541 /* An error occurred on the socket */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
542 void fd_cnx_markerror(struct cnxctx * conn)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
543 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
544 TRACE_ENTRY("%p", conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
545 CHECK_PARAMS_DO( conn, goto fatal );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
546
228
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
547 TRACE_DEBUG(FULL, "Error flag set for socket %d (%s / %s)", conn->cc_socket, conn->cc_remid, conn->cc_id);
211
929513df9024 Add a debug message
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 209
diff changeset
548
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
549 /* Mark the error */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
550 conn->cc_status |= CC_STATUS_ERROR;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
551
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
552 /* Report the error if not reported yet, and not closing */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
553 if ((!(conn->cc_status & CC_STATUS_CLOSING )) && (!(conn->cc_status & CC_STATUS_SIGNALED ))) {
223
85dc47afeac7 Cleanup termination
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 220
diff changeset
554 TRACE_DEBUG(FULL, "Sending FDEVP_CNX_ERROR event");
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
555 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_ERROR, 0, NULL), goto fatal);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
556 conn->cc_status |= CC_STATUS_SIGNALED;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
557 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
558
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
559 return;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
560 fatal:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
561 /* An unrecoverable error occurred, stop the daemon */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
562 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
563 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
564
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
565 /* 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
566 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
567 {
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
568 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
569
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
570 /* 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
571 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
572 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
573 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
574 CHECK_SYS_DO( setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)), /* Also timeout for sending, to avoid waiting forever */ );
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
575 }
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
576
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
577 /* A recv-like function, taking a cnxctx object instead of socket as entry. We use it to quickly react to timeouts without traversing GNUTLS wrapper each time */
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
578 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
579 {
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
580 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
581 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
582 again:
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
583 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
584 /* 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
585 if ((ret < 0) && (errno == EAGAIN)) {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
586 if (! (conn->cc_status & CC_STATUS_CLOSING))
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
587 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
588 if (!timedout) {
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
589 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
590 goto again;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
591 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
592 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
593
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
594 CHECK_SYS_DO(ret, /* continue */);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
595
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
596 /* Mark the error */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
597 if (ret <= 0)
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
598 fd_cnx_markerror(conn);
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
599
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
600 return ret;
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
601 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
602
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
603 /* Send */
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
604 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
605 {
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
606 ssize_t ret = 0;
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
607 int timedout = 0;
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
608 again:
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
609 ret = send(conn->cc_socket, buffer, length, 0);
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
610 /* Handle special case of timeout */
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
611 if ((ret < 0) && (errno == EAGAIN)) {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
612 if (! (conn->cc_status & CC_STATUS_CLOSING))
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
613 goto again; /* don't care, just ignore */
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
614 if (!timedout) {
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
615 timedout ++; /* allow for one timeout while closing */
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
616 goto again;
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
617 }
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
618 CHECK_SYS_DO(ret, /* continue */);
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
619 }
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
620
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
621 /* Mark the error */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
622 if (ret <= 0)
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
623 fd_cnx_markerror(conn);
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
624
201
1b47afa59358 Also timeout on sends
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 199
diff changeset
625 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
626 }
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
627
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
628 /* 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
629 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
630 {
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
631 struct cnxctx * conn = arg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
632
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
633 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
634 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
635
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
636 /* 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
637 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
638 char buf[48];
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
639 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
640 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
641 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
642
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
643 ASSERT( conn->cc_proto == IPPROTO_TCP );
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
644 ASSERT( ! (conn->cc_status & CC_STATUS_TLS) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
645 ASSERT( Target_Queue(conn) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
646
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
647 /* 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
648 do {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
649 uint8_t header[4];
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
650 uint8_t * newmsg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
651 size_t length;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
652 ssize_t ret = 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
653 size_t received = 0;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
654
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
655 do {
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
656 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
657 if (ret <= 0) {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
658 goto out; /* Stop the thread, the event was already sent */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
659 }
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 received += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
662 } while (received < sizeof(header));
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 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
665
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
666 /* 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
667 if ((header[0] != DIAMETER_VERSION) /* defined in <libfreeDiameter.h> */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
668 || (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
669 /* The message is suspect */
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
670 TRACE_DEBUG(INFO, "Received suspect header [ver: %d, size: %zd], assume disconnection", (int)header[0], length);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
671 fd_cnx_markerror(conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
672 goto out; /* Stop the thread, the recipient of the event will cleanup */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
673 }
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 /* Ok, now we can really receive the data */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
676 CHECK_MALLOC_DO( newmsg = malloc( length ), goto fatal );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
677 memcpy(newmsg, header, sizeof(header));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
678
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
679 while (received < length) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
680 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
681 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
682 pthread_cleanup_pop(0);
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 if (ret <= 0) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
685 free(newmsg);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
686 goto out;
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
687 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
688 received += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
689 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
690
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
691 /* We have received a complete message, pass it to the daemon */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
692 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
693
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
694 } while (conn->cc_loop);
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 out:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
697 TRACE_DEBUG(FULL, "Thread terminated");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
698 return NULL;
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
699
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
700 fatal:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
701 /* An unrecoverable error occurred, stop the daemon */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
702 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
703 goto out;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
704 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
705
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
706 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
707 /* 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
708 static void * rcvthr_notls_sctp(void * arg)
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
709 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
710 struct cnxctx * conn = arg;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
711 uint8_t * buf;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
712 size_t bufsz;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
713 int event;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
714
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
715 TRACE_ENTRY("%p", arg);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
716 CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto fatal);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
717
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
718 /* 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
719 {
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
720 char buf[48];
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
721 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
722 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
723 }
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
724
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
725 ASSERT( conn->cc_proto == IPPROTO_SCTP );
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
726 ASSERT( ! (conn->cc_status & CC_STATUS_TLS) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
727 ASSERT( Target_Queue(conn) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
728
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
729 do {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
730 CHECK_FCT_DO( fd_sctp_recvmeta(conn->cc_socket, NULL, &buf, &bufsz, &event, &conn->cc_status), goto fatal );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
731 if (event == FDEVP_CNX_ERROR) {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
732 fd_cnx_markerror(conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
733 goto out;
25
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
228
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
736 if (event == FDEVP_CNX_SHUTDOWN) {
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
737 /* Just ignore the notification for now, we will get another error later anyway */
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
738 continue;
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
739 }
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
740
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
741 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), event, bufsz, buf), goto fatal );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
742
250
07624e65c7e0 Loop anyway until we get a real message or an error
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 247
diff changeset
743 } while (conn->cc_loop || (event != FDEVP_CNX_MSG_RECV));
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
744
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
745 out:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
746 TRACE_DEBUG(FULL, "Thread terminated");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
747 return NULL;
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
748
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
749 fatal:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
750 /* An unrecoverable error occurred, stop the daemon */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
751 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
752 goto out;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
753 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
754 #endif /* DISABLE_SCTP */
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 /* 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
757 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
758 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
759 TRACE_ENTRY("%p %i", conn, loop);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
760
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
761 CHECK_PARAMS( conn && Target_Queue(conn) && (!(conn->cc_status & CC_STATUS_TLS)) && (!conn->cc_loop));
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
762
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
763 /* Release resources in case of a previous call was already made */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
764 CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */);
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
765
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
766 /* Save the loop request */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
767 conn->cc_loop = loop;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
768
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
769 switch (conn->cc_proto) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
770 case IPPROTO_TCP:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
771 /* Start the tcp_notls thread */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
772 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
773 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
774 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
775 case IPPROTO_SCTP:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
776 /* Start the tcp_notls thread */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
777 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
778 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
779 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
780 default:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
781 TRACE_DEBUG(INFO, "Unknown protocol: %d", conn->cc_proto);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
782 ASSERT(0);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
783 return ENOTSUP;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
784 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
785
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
786 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
787 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
788
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
789
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
790
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
791
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
792 /* Returns 0 on error, received data size otherwise (always >= 0) */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
793 static ssize_t fd_tls_recv_handle_error(struct cnxctx * conn, gnutls_session_t session, void * data, size_t sz)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
794 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
795 ssize_t ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
796 again:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
797 CHECK_GNUTLS_DO( ret = gnutls_record_recv(session, data, sz),
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
798 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
799 switch (ret) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
800 case GNUTLS_E_REHANDSHAKE:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
801 if (!(conn->cc_status & CC_STATUS_CLOSING))
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
802 CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
803 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
804 if (TRACE_BOOL(INFO)) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
805 fd_log_debug("TLS re-handshake failed on socket %d (%s) : %s\n", conn->cc_socket, conn->cc_id, gnutls_strerror(ret));
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
806 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
807 goto end;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
808 } );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
809
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
810 case GNUTLS_E_AGAIN:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
811 case GNUTLS_E_INTERRUPTED:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
812 if (!(conn->cc_status & CC_STATUS_CLOSING))
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
813 goto again;
228
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
814 TRACE_DEBUG(FULL, "Connection is closing, so abord gnutls_record_recv now.");
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
815 break;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
816
228
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
817 case GNUTLS_E_UNEXPECTED_PACKET_LENGTH:
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
818 /* The connection is closed */
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
819 TRACE_DEBUG(FULL, "Got 0 size while reading the socket, probably connection closed...");
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
820 break;
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
821
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
822 default:
228
dcb58243e91f More cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 227
diff changeset
823 TRACE_DEBUG(INFO, "This GNU TLS error is not handled, assume unrecoverable error");
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
824 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
825 } );
251
52c1547dab42 Call gnutls_bye on closing connection
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 250
diff changeset
826
52c1547dab42 Call gnutls_bye on closing connection
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 250
diff changeset
827 if (ret == 0)
52c1547dab42 Call gnutls_bye on closing connection
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 250
diff changeset
828 CHECK_GNUTLS_DO( gnutls_bye(session, GNUTLS_SHUT_RDWR), );
52c1547dab42 Call gnutls_bye on closing connection
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 250
diff changeset
829
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
830 end:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
831 if (ret <= 0)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
832 fd_cnx_markerror(conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
833 return ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
834 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
835
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
836 /* Wrapper around gnutls_record_send to handle some error codes */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
837 static ssize_t fd_tls_send_handle_error(struct cnxctx * conn, gnutls_session_t session, void * data, size_t sz)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
838 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
839 ssize_t ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
840 again:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
841 CHECK_GNUTLS_DO( ret = gnutls_record_send(session, data, sz),
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
842 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
843 switch (ret) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
844 case GNUTLS_E_REHANDSHAKE:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
845 if (!(conn->cc_status & CC_STATUS_CLOSING))
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
846 CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
847 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
848 if (TRACE_BOOL(INFO)) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
849 fd_log_debug("TLS re-handshake failed on socket %d (%s) : %s\n", conn->cc_socket, conn->cc_id, gnutls_strerror(ret));
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
850 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
851 goto end;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
852 } );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
853
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
854 case GNUTLS_E_AGAIN:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
855 case GNUTLS_E_INTERRUPTED:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
856 if (!(conn->cc_status & CC_STATUS_CLOSING))
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
857 goto again;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
858 TRACE_DEBUG(INFO, "Connection is closing, so abord gnutls_record_send now.");
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
859 break;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
860
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
861 default:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
862 TRACE_DEBUG(INFO, "This TLS error is not handled, assume unrecoverable error");
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
863 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
864 } );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
865 end:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
866 if (ret <= 0)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
867 fd_cnx_markerror(conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
868
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
869 return ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
870 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
871
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
872
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
873 /* The function that receives TLS data and re-builds a Diameter message -- it exits only on error or cancelation */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
874 int fd_tls_rcvthr_core(struct cnxctx * conn, gnutls_session_t session)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
875 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
876 /* No guarantee that GnuTLS preserves the message boundaries, so we re-build it as in TCP */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
877 do {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
878 uint8_t header[4];
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
879 uint8_t * newmsg;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
880 size_t length;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
881 ssize_t ret = 0;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
882 size_t received = 0;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
883
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
884 do {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
885 ret = fd_tls_recv_handle_error(conn, session, &header[received], sizeof(header) - received);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
886 if (ret <= 0) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
887 /* The connection is closed */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
888 goto out;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
889 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
890 received += ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
891 } while (received < sizeof(header));
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
892
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
893 length = ((size_t)header[1] << 16) + ((size_t)header[2] << 8) + (size_t)header[3];
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
894
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
895 /* Check the received word is a valid beginning of a Diameter message */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
896 if ((header[0] != DIAMETER_VERSION) /* defined in <libfreeDiameter.h> */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
897 || (length > DIAMETER_MSG_SIZE_MAX)) { /* to avoid too big mallocs */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
898 /* The message is suspect */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
899 TRACE_DEBUG(INFO, "Received suspect header [ver: %d, size: %zd], assume disconnection", (int)header[0], length);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
900 fd_cnx_markerror(conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
901 goto out;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
902 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
903
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
904 /* Ok, now we can really receive the data */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
905 CHECK_MALLOC( newmsg = malloc( length ) );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
906 memcpy(newmsg, header, sizeof(header));
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
907
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
908 while (received < length) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
909 pthread_cleanup_push(free, newmsg); /* In case we are canceled, clean the partialy built buffer */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
910 ret = fd_tls_recv_handle_error(conn, session, newmsg + received, length - received);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
911 pthread_cleanup_pop(0);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
912
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
913 if (ret <= 0) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
914 free(newmsg);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
915 goto out;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
916 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
917 received += ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
918 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
919
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
920 /* We have received a complete message, pass it to the daemon */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
921 CHECK_FCT_DO( ret = fd_event_send( Target_Queue(conn), FDEVP_CNX_MSG_RECV, length, newmsg),
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
922 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
923 free(newmsg);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
924 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
925 return ret;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
926 } );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
927
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
928 } while (1);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
929
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
930 out:
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
931 return ENOTCONN;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
932 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
933
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
934 /* Receiver thread (TLS & 1 stream SCTP or TCP) */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
935 static void * rcvthr_tls_single(void * arg)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
936 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
937 struct cnxctx * conn = arg;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
938
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
939 TRACE_ENTRY("%p", arg);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
940 CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), return NULL );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
941
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
942 /* Set the thread name */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
943 {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
944 char buf[48];
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
945 snprintf(buf, sizeof(buf), "Receiver (%d) TLS/single stream", conn->cc_socket);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
946 fd_log_threadname ( buf );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
947 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
948
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
949 ASSERT( conn->cc_status & CC_STATUS_TLS );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
950 ASSERT( Target_Queue(conn) );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
951
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
952 /* The next function only returns when there is an error on the socket */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
953 CHECK_FCT_DO(fd_tls_rcvthr_core(conn, conn->cc_tls_para.session), /* continue */);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
954
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
955 TRACE_DEBUG(FULL, "Thread terminated");
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
956 return NULL;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
957 }
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
958
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
959 /* 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
960 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
961 {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
962 /* Create the session context */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
963 CHECK_GNUTLS_DO( gnutls_init (session, mode), return ENOMEM );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
964
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
965 /* Set the algorithm suite */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
966 if (priority) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
967 const char * errorpos;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
968 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
969 { 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
970 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
971 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
972 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
973
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
974 /* 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
975 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
976
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
977 /* Request the remote credentials as well */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
978 if (mode == GNUTLS_SERVER) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
979 gnutls_certificate_server_set_request (*session, GNUTLS_CERT_REQUIRE);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
980 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
981
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
982 return 0;
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
983 }
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
984
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
985 /* 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
986 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
987 {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
988 int ret, i;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
989 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
990 unsigned int cert_list_size;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
991 gnutls_x509_crt_t cert;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
992 time_t now;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
993
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
994 TRACE_ENTRY("%p %d", conn, verbose);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
995 CHECK_PARAMS(conn);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
996
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
997 /* 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
998 if (verbose && TRACE_BOOL(FULL)) {
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
999 const char *tmp;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1000 gnutls_kx_algorithm_t kx;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1001 gnutls_credentials_type_t cred;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1002
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1003 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
1004
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1005 /* print the key exchange's algorithm name */
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1006 GNUTLS_TRACE( kx = gnutls_kx_get (session) );
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1007 GNUTLS_TRACE( tmp = gnutls_kx_get_name (kx) );
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1008 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
1009
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1010 /* Check the authentication type used and switch
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1011 * to the appropriate. */
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1012 GNUTLS_TRACE( cred = gnutls_auth_get_type (session) );
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1013 switch (cred)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1014 {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1015 case GNUTLS_CRD_IA:
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1016 fd_log_debug("\t - TLS/IA session\n");
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1017 break;
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
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1020 #ifdef ENABLE_SRP
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1021 case GNUTLS_CRD_SRP:
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1022 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
1023 gnutls_srp_server_get_username (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1024 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1025 #endif
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1026
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1027 case GNUTLS_CRD_PSK:
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1028 /* This returns NULL in server side. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1029 if (gnutls_psk_client_get_hint (session) != NULL)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1030 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
1031 gnutls_psk_client_get_hint (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1032 /* This returns NULL in client side. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1033 if (gnutls_psk_server_get_username (session) != NULL)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1034 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
1035 gnutls_psk_server_get_username (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1036 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1037
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1038 case GNUTLS_CRD_ANON: /* anonymous authentication */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1039 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
1040 gnutls_dh_get_prime_bits (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1041 break;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1042
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1043 case GNUTLS_CRD_CERTIFICATE: /* certificate authentication */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1044 /* 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
1045 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
1046 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
1047 gnutls_dh_get_prime_bits (session));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1048 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1049 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1050
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1051 /* 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
1052 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
1053 fd_log_debug("\t - Protocol: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1054
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1055 /* 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
1056 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
1057 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
1058
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1059 /* print the compression algorithm (if any) */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1060 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
1061 fd_log_debug("\t - Compression: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1062
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1063 /* 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
1064 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
1065 fd_log_debug("\t - Cipher: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1066
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1067 /* Print the MAC algorithms name. ie SHA1 */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1068 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
1069 fd_log_debug("\t - MAC: %s\n", tmp);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1070 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1071
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1072 /* First, use built-in verification */
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1073 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
1074 if (ret) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1075 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1076 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
1077 if (ret & GNUTLS_CERT_INVALID)
251
52c1547dab42 Call gnutls_bye on closing connection
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 250
diff changeset
1078 fd_log_debug(" - The certificate is not trusted (unknown CA? expired?)\n");
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1079 if (ret & GNUTLS_CERT_REVOKED)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1080 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
1081 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
1082 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
1083 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
1084 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
1085 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
1086 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
1087 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1088 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1089 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1090
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1091 /* 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
1092 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
1093 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1094
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1095 GNUTLS_TRACE( cert_list = gnutls_certificate_get_peers (session, &cert_list_size) );
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1096 if (cert_list == NULL)
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1097 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1098
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1099 now = time(NULL);
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1100
59
067ab3fc6093 Cleanups in debug messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 57
diff changeset
1101 if (verbose && TRACE_BOOL(FULL)) {
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1102 char serial[40];
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1103 char dn[128];
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1104 size_t size;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1105 unsigned int algo, bits;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1106 time_t expiration_time, activation_time;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1107
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1108 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
1109 for (i = 0; i < cert_list_size; i++)
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1110 {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1111
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1112 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
1113 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
1114
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1115 fd_log_debug(" Certificate %d info:\n", i);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1116
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1117 GNUTLS_TRACE( expiration_time = gnutls_x509_crt_get_expiration_time (cert) );
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1118 GNUTLS_TRACE( activation_time = gnutls_x509_crt_get_activation_time (cert) );
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1119
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1120 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
1121 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
1122
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1123 /* Print the serial number of the certificate. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1124 size = sizeof (serial);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1125 gnutls_x509_crt_get_serial (cert, serial, &size);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1126
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1127 fd_log_debug("\t - Certificate serial number: ");
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1128 {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1129 int j;
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1130 for (j = 0; j < size; j++) {
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1131 fd_log_debug("%02.2hhx", serial[j]);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1132 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1133 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1134 fd_log_debug("\n");
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1135
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1136 /* Extract some of the public key algorithm's parameters */
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1137 GNUTLS_TRACE( algo = gnutls_x509_crt_get_pk_algorithm (cert, &bits) );
57
54a55133044f Fix newline
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 54
diff changeset
1138 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
1139 gnutls_pk_algorithm_get_name (algo));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1140
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1141 /* Print the version of the X.509 certificate. */
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1142 fd_log_debug("\t - Certificate version: #%d\n",
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1143 gnutls_x509_crt_get_version (cert));
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1144
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1145 size = sizeof (dn);
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1146 GNUTLS_TRACE( gnutls_x509_crt_get_dn (cert, dn, &size) );
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1147 fd_log_debug("\t - DN: %s\n", dn);
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1148
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1149 size = sizeof (dn);
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1150 GNUTLS_TRACE( gnutls_x509_crt_get_issuer_dn (cert, dn, &size) );
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1151 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
1152
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1153 GNUTLS_TRACE( gnutls_x509_crt_deinit (cert) );
53
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1154 }
cd5620362909 Add debug information for TLS
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 43
diff changeset
1155 }
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1156
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1157 /* 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
1158 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
1159 {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1160 time_t deadline;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1161
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1162 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
1163 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
1164
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1165 GNUTLS_TRACE( deadline = gnutls_x509_crt_get_expiration_time(cert) );
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1166 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
1167 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1168 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
1169 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
1170 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1171 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1172 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1173
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1174 GNUTLS_TRACE( deadline = gnutls_x509_crt_get_activation_time(cert) );
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1175 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
1176 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1177 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
1178 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
1179 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1180 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1181 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1182
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1183 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
1184 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
1185 if (TRACE_BOOL(INFO)) {
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1186 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
1187 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
1188 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1189 return EINVAL;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1190 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1191 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1192
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1193 GNUTLS_TRACE( gnutls_x509_crt_deinit (cert) );
31
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1194 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1195
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1196 return 0;
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1197 }
26685c67d387 Completed the test and fixed a couple issues
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 30
diff changeset
1198
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1199 /* 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
1200 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
1201 {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1202 TRACE_ENTRY( "%p %d %p %p", conn, mode, priority, alt_creds);
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1203 CHECK_PARAMS( conn && (!(conn->cc_status & CC_STATUS_TLS)) && ( (mode == GNUTLS_CLIENT) || (mode == GNUTLS_SERVER) ) && (!conn->cc_loop) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1204
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1205 /* Save the mode */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1206 conn->cc_tls_para.mode = mode;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1207
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1208 /* 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
1209 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
1210
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1211 /* 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
1212 conn->cc_loop = 1;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1213
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1214 /* 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
1215 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
1216
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1217 /* 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
1218 if (conn->cc_sctp_para.pairs > 1) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1219 #ifdef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1220 ASSERT(0);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1221 CHECK_FCT( ENOTSUP );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1222 #else /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1223 /* Initialize the wrapper, start the demux thread */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1224 CHECK_FCT( fd_sctps_init(conn) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1225 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1226 } else {
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1227 /* Set the transport pointer passed to push & pull callbacks */
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1228 GNUTLS_TRACE( gnutls_transport_set_ptr( conn->cc_tls_para.session, (gnutls_transport_ptr_t) conn ) );
194
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1229
d1af490d6e85 Change in sockets options to avoid waiting forever on closing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 188
diff changeset
1230 /* Set the push and pull callbacks */
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1231 GNUTLS_TRACE( gnutls_transport_set_pull_function(conn->cc_tls_para.session, (void *)fd_cnx_s_recv) );
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1232 GNUTLS_TRACE( 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
1233 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1234
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1235 /* Mark the connection as protected from here, so that the gnutls credentials will be freed */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1236 conn->cc_status |= CC_STATUS_TLS;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1237
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1238 /* Handshake master session */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1239 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1240 int ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1241 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
1242 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1243 if (TRACE_BOOL(INFO)) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1244 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
1245 }
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1246 fd_cnx_markerror(conn);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1247 return EINVAL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1248 } );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1249
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1250 /* Now verify the remote credentials are valid -- only simple tests here */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1251 CHECK_FCT_DO( fd_tls_verify_credentials(conn->cc_tls_para.session, conn, 1),
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1252 {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1253 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_RDWR), );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1254 fd_cnx_markerror(conn);
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1255 return EINVAL;
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1256 });
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1257 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1258
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1259 /* Multi-stream TLS: handshake other streams as well */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1260 if (conn->cc_sctp_para.pairs > 1) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1261 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1262 /* 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
1263 CHECK_FCT(fd_sctps_handshake_others(conn, priority, alt_creds));
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1264
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1265 /* 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
1266 CHECK_FCT(fd_sctps_startthreads(conn));
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1267 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1268 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1269 /* Start decrypting the data */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1270 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
1271 }
29
5ba91682f0bc Added a test for cnxctx (tbc) and fixed some bugs
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 27
diff changeset
1272
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1273 return 0;
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
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1276 /* Retrieve TLS credentials of the remote peer, after handshake */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1277 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
1278 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1279 TRACE_ENTRY("%p %p %p", conn, cert_list, cert_list_size);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1280 CHECK_PARAMS( conn && (conn->cc_status & CC_STATUS_TLS) && cert_list && cert_list_size );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1281
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1282 /* This function only works for X.509 certificates. */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1283 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
1284
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1285 GNUTLS_TRACE( *cert_list = gnutls_certificate_get_peers (conn->cc_tls_para.session, cert_list_size) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1286 if (*cert_list == NULL) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1287 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
1288 return EINVAL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1289 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1290
54
889c55527a1d Fixed additional newline character
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 53
diff changeset
1291 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
1292
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1293 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1294 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1295
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1296 /* 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. */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1297 /* if the altfifo has been set on this conn object, this function must not be called */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1298 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
1299 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1300 int ev;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1301 size_t ev_sz;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1302 void * ev_data;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1303
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1304 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
1305 CHECK_PARAMS(conn && (conn->cc_socket > 0) && buf && len);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1306 CHECK_PARAMS(conn->cc_rcvthr != (pthread_t)NULL);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1307 CHECK_PARAMS(conn->cc_alt == NULL);
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1308
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1309 /* Now, pull the first event */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1310 get_next:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1311 if (timeout) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1312 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
1313 } else {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1314 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
1315 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1316
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1317 switch (ev) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1318 case FDEVP_CNX_MSG_RECV:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1319 /* We got one */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1320 *len = ev_sz;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1321 *buf = ev_data;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1322 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1323
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1324 case FDEVP_PSM_TIMEOUT:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1325 TRACE_DEBUG(FULL, "Timeout event received");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1326 return ETIMEDOUT;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1327
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1328 case FDEVP_CNX_EP_CHANGE:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1329 /* We ignore this event */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1330 goto get_next;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1331
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1332 case FDEVP_CNX_ERROR:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1333 TRACE_DEBUG(FULL, "Received ERROR event on the connection");
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1334 return ENOTCONN;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1335 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1336
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1337 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
1338 return EINVAL;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1339 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1340
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1341 /* 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
1342 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
1343 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1344 TRACE_ENTRY( "%p %p", conn, alt_fifo );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1345 CHECK_PARAMS( conn && alt_fifo && conn->cc_incoming );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1346
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1347 /* 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
1348 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
1349
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1350 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1351 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1352
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1353 /* 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
1354 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
1355 {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1356 ssize_t ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1357 size_t sent = 0;
27
b3a1773e9f46 again, correct was actually %zd
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 26
diff changeset
1358 TRACE_ENTRY("%p %p %zd", conn, buf, len);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1359 do {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1360 if (conn->cc_status & CC_STATUS_TLS) {
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1361 CHECK_GNUTLS_DO( ret = fd_tls_send_handle_error(conn, conn->cc_tls_para.session, buf + sent, len - sent), );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1362 } else {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1363 /* Maybe better to replace this call with sendmsg for atomic sending? */
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1364 CHECK_SYS_DO( ret = fd_cnx_s_send(conn, buf + sent, len - sent), );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1365 }
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1366 if (ret <= 0)
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1367 return ENOTCONN;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1368
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1369 sent += ret;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1370 } while ( sent < len );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1371 return 0;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1372 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1373
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1374 /* 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. */
229
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1375 int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len, uint32_t flags)
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1376 {
229
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1377 TRACE_ENTRY("%p %p %zd %x", conn, buf, len, flags);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1378
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1379 CHECK_PARAMS(conn && (conn->cc_socket > 0) && (! (conn->cc_status & CC_STATUS_ERROR)) && buf && len);
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1380
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1381 TRACE_DEBUG(FULL, "Sending %zdb %sdata on connection %s", len, (conn->cc_status & CC_STATUS_TLS) ? "TLS-protected ":"", conn->cc_id);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1382
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1383 switch (conn->cc_proto) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1384 case IPPROTO_TCP:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1385 CHECK_FCT( send_simple(conn, buf, len) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1386 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1387
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1388 #ifndef DISABLE_SCTP
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1389 case IPPROTO_SCTP: {
229
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1390 if (flags & FD_CNX_BROADCAST) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1391 /* Send the buffer over all other streams */
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1392 uint16_t str;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1393 if (conn->cc_status & CC_STATUS_TLS) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1394 for ( str=1; str < conn->cc_sctp_para.pairs; str++) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1395 ssize_t ret;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1396 size_t sent = 0;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1397 do {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1398 CHECK_GNUTLS_DO( ret = fd_tls_send_handle_error(conn, conn->cc_sctps_data.array[str].session, buf + sent, len - sent), );
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1399 if (ret <= 0)
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1400 return ENOTCONN;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1401
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1402 sent += ret;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1403 } while ( sent < len );
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1404 }
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1405 } else {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1406 for ( str=1; str < conn->cc_sctp_para.str_out; str++) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1407 CHECK_FCT_DO( fd_sctp_sendstr(conn->cc_socket, str, buf, len, &conn->cc_status), { fd_cnx_markerror(conn); return ENOTCONN; } );
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1408 }
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1409 }
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1410
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1411 /* Set the ORDERED flag also so that it is sent over stream 0 as well */
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1412 flags &= FD_CNX_ORDERED;
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1413 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1414
229
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1415 if (flags & FD_CNX_ORDERED) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1416 /* We send over stream #0 */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1417 CHECK_FCT( send_simple(conn, buf, len) );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1418 } else {
229
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1419 /* Default case : no flag specified */
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1420
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1421 int another_str = 0; /* do we send over stream #0 ? */
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1422
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1423 if ((conn->cc_sctp_para.str_out > 1) && ((! (conn->cc_status & CC_STATUS_TLS)) || (conn->cc_sctp_para.pairs > 1))) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1424 /* Update the id of the stream we will send this message over */
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1425 conn->cc_sctp_para.next += 1;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1426 conn->cc_sctp_para.next %= ((conn->cc_status & CC_STATUS_TLS) ? conn->cc_sctp_para.pairs : conn->cc_sctp_para.str_out);
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1427 another_str = (conn->cc_sctp_para.next ? 1 : 0);
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1428 }
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1429
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1430 if ( ! another_str ) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1431 CHECK_FCT( send_simple(conn, buf, len) );
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1432 } else {
229
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1433 if (!(conn->cc_status & CC_STATUS_TLS)) {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1434 CHECK_FCT_DO( fd_sctp_sendstr(conn->cc_socket, conn->cc_sctp_para.next, buf, len, &conn->cc_status), { fd_cnx_markerror(conn); return ENOTCONN; } );
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1435 } else {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1436 /* push the record to the appropriate session */
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1437 ssize_t ret;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1438 size_t sent = 0;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1439 ASSERT(conn->cc_sctps_data.array != NULL);
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1440 do {
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1441 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), );
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1442 if (ret <= 0)
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1443 return ENOTCONN;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1444
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1445 sent += ret;
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1446 } while ( sent < len );
965f5971dc23 Broadcast CEA over all streams to avoid possible race condition
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 228
diff changeset
1447 }
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1448 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1449 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1450 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1451 break;
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1452 #endif /* DISABLE_SCTP */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1453
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1454 default:
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1455 TRACE_DEBUG(INFO, "Unknwon protocol: %d", conn->cc_proto);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1456 ASSERT(0);
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1457 return ENOTSUP; /* or EINVAL... */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1458 }
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1459
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1460 return 0;
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1461 }
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1462
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1463
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1464 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1465 /* Destruction of connection */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1466 /**************************************/
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1467
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1468 /* 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
1469 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
1470 {
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1471 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
1472
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1473 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
1474
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1475 conn->cc_status |= CC_STATUS_CLOSING;
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1476
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1477 /* Initiate shutdown of the TLS session(s): call gnutls_bye(WR), then read until error */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1478 if (conn->cc_status & CC_STATUS_TLS) {
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1479 #ifndef DISABLE_SCTP
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1480 if (conn->cc_sctp_para.pairs > 1) {
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1481 if (! (conn->cc_status & CC_STATUS_ERROR )) {
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1482 /* Bye on master session */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1483 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_WR), fd_cnx_markerror(conn) );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1484 }
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1485
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1486 if (! (conn->cc_status & CC_STATUS_ERROR ) ) {
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1487 /* and other stream pairs */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1488 fd_sctps_bye(conn);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1489 }
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1490
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1491 if (! (conn->cc_status & CC_STATUS_ERROR ) ) {
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1492 /* Now wait for all decipher threads to terminate */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1493 fd_sctps_waitthreadsterm(conn);
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1494 } else {
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1495 /* Abord the threads, the connection is dead already */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1496 fd_sctps_stopthreads(conn);
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1497 }
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1498
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1499 /* Deinit gnutls resources */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1500 fd_sctps_gnutls_deinit_others(conn);
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1501 if (conn->cc_tls_para.session) {
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1502 GNUTLS_TRACE( gnutls_deinit(conn->cc_tls_para.session) );
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1503 conn->cc_tls_para.session = NULL;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1504 }
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1505
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1506 /* Destroy the wrapper (also stops the demux thread) */
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1507 fd_sctps_destroy(conn);
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1508
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1509 } else {
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1510 #endif /* DISABLE_SCTP */
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1511 /* We are not using the sctps wrapper layer */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1512 if (! (conn->cc_status & CC_STATUS_ERROR ) ) {
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1513 /* Master session */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1514 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_WR), fd_cnx_markerror(conn) );
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1515 }
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1516
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1517 if (! (conn->cc_status & CC_STATUS_ERROR ) ) {
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1518 /* In this case, just wait for thread rcvthr_tls_single to terminate */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1519 if (conn->cc_rcvthr != (pthread_t)NULL) {
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1520 CHECK_POSIX_DO( pthread_join(conn->cc_rcvthr, NULL), /* continue */ );
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1521 conn->cc_rcvthr = (pthread_t)NULL;
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1522 }
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1523 } else {
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1524 /* Cancel the receiver thread in case it did not already terminate */
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1525 CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ );
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1526 }
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1527
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1528 /* Free the resources of the TLS session */
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1529 if (conn->cc_tls_para.session) {
214
5a1b93f59f8f Added trace facility for GNUTLS calls
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 211
diff changeset
1530 GNUTLS_TRACE( gnutls_deinit(conn->cc_tls_para.session) );
209
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1531 conn->cc_tls_para.session = NULL;
b9f48f2f2a22 Some cleanups in the code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 208
diff changeset
1532 }
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1533
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1534 #ifndef DISABLE_SCTP
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1535 }
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1536 #endif /* DISABLE_SCTP */
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1537 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1538
203
536b1dde8761 Some cleanups in the cnxctx module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 201
diff changeset
1539 /* Terminate the thread in case it is not done yet -- is there any such case left ?*/
155
30a7252cbb55 Cleanup connection cleanup sequence
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 136
diff changeset
1540 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
1541
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1542 /* Shut the connection down */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1543 if (conn->cc_socket > 0) {
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1544 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
1545 close(conn->cc_socket);
68c1890f7049 Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 31
diff changeset
1546 conn->cc_socket = -1;
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1547 }
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1548
25
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1549 /* Empty and destroy FIFO list */
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1550 if (conn->cc_incoming) {
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1551 fd_event_destroy( &conn->cc_incoming, free );
67ca08d5bc48 Completed connection context files
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 24
diff changeset
1552 }
22
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1553
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1554 /* Free the object */
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1555 free(conn);
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1556
0b3b46da2c12 Progress on server code
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 21
diff changeset
1557 /* Done! */
21
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1558 return;
bef197f6826f Backup before week-end, cnxctx and server in progress
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 20
diff changeset
1559 }
"Welcome to our mercurial repository"