Mercurial > hg > freeDiameter
annotate libfdcore/p_cnx.c @ 1187:436e4342ecd0
Rollback to using TLS/SCTP in release 1.2.0. DTLS dev to happen in freeDiameter-dtls branch
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Mon, 10 Jun 2013 12:04:50 +0800 |
parents | 56c36d1007b4 |
children | 6a1042d8075b |
rev | line source |
---|---|
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
740
4a9f08d6b6ba
Updated my mail address
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
706
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
931
155d45d06530
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
928
diff
changeset
|
5 * Copyright (c) 2013, WIDE Project and NICT * |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
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 * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
379
diff
changeset
|
36 #include "fdcore-internal.h" |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
706
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
38 |
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
39 /* TODO: change the behavior to handle properly forced ordering at beginning & end of OPEN state */ |
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
40 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
41 /* This file contains code used by a peer state machine to initiate a connection to remote peer */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
43 struct next_conn { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
44 struct fd_list chain; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
45 int proto; /* Protocol of the next attempt */ |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
46 union { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
47 sSS ss; /* The address, only for TCP */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
48 sSA4 sin; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
49 sSA6 sin6; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
50 }; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
51 uint16_t port; /* The port, for SCTP (included in ss for TCP) */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
52 int dotls; /* Handshake TLS after connection ? */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
53 }; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
54 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
55 static __inline__ void failed_connection_attempt(struct fd_peer * peer) |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
56 { |
50 | 57 /* Simply remove the first item in the list if not empty */ |
58 if (! FD_IS_LIST_EMPTY(&peer->p_connparams) ) { | |
59 struct fd_list * li = peer->p_connparams.next; | |
60 fd_list_unlink(li); | |
61 free(li); | |
62 } | |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
63 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
64 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
65 static void empty_connection_list(struct fd_peer * peer) |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
66 { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
67 /* Remove all items */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
68 while (!FD_IS_LIST_EMPTY(&peer->p_connparams)) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
69 failed_connection_attempt(peer); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
70 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
71 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
72 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
73 static int prepare_connection_list(struct fd_peer * peer) |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
74 { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
75 struct fd_list * li, *last_prio; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
76 struct next_conn * new; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
77 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
78 uint16_t port_no; /* network order */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
79 int dotls_immediate; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
80 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
81 TRACE_ENTRY("%p", peer); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
82 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
83 /* Resolve peer address(es) if needed */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
84 if (FD_IS_LIST_EMPTY(&peer->p_hdr.info.pi_endpoints)) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
85 struct addrinfo hints, *ai, *aip; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
86 int ret; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
87 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
88 memset(&hints, 0, sizeof(hints)); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
89 hints.ai_flags = AI_ADDRCONFIG; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
90 ret = getaddrinfo(peer->p_hdr.info.pi_diamid, NULL, &hints, &ai); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
91 if (ret) { |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
931
diff
changeset
|
92 TRACE_DEBUG(INFO, "Unable to resolve address for peer '%s' (%s), aborting", peer->p_hdr.info.pi_diamid, gai_strerror(ret)); |
370
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
93 if (ret != EAI_AGAIN) |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
94 fd_psm_terminate( peer, NULL ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
95 return 0; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
96 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
97 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
98 for (aip = ai; aip != NULL; aip = aip->ai_next) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
99 CHECK_FCT( fd_ep_add_merge( &peer->p_hdr.info.pi_endpoints, aip->ai_addr, aip->ai_addrlen, EP_FL_DISC ) ); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
100 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
101 freeaddrinfo(ai); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
102 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
103 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
104 /* Remove addresses from unwanted family */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
105 if (peer->p_hdr.info.config.pic_flags.pro3) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
106 CHECK_FCT( fd_ep_filter_family( |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
107 &peer->p_hdr.info.pi_endpoints, |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
108 (peer->p_hdr.info.config.pic_flags.pro3 == PI_P3_IP) ? |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
109 AF_INET |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
110 : AF_INET6)); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
111 } |
370
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
112 if (fd_g_config->cnf_flags.no_ip4) { |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
113 CHECK_FCT( fd_ep_filter_family( |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
114 &peer->p_hdr.info.pi_endpoints, |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
115 AF_INET6)); |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
116 } |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
117 if (fd_g_config->cnf_flags.no_ip6) { |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
118 CHECK_FCT( fd_ep_filter_family( |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
119 &peer->p_hdr.info.pi_endpoints, |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
120 AF_INET)); |
06692259d788
Enforce address family from config when connecting to a peer
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
121 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
122 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
123 /* Now check we have at least one address to attempt */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
124 if (FD_IS_LIST_EMPTY(&peer->p_hdr.info.pi_endpoints)) { |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
931
diff
changeset
|
125 TRACE_DEBUG(INFO, "No address %savailable to connect to peer '%s', aborting", |
706
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
126 peer->p_hdr.info.config.pic_flags.pro3 ? "in the configured family " : "", peer->p_hdr.info.pi_diamid); |
78
a58f0757c06a
Added code for DPR/DPA
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
70
diff
changeset
|
127 fd_psm_terminate( peer, NULL ); |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
128 return 0; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
129 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
130 |
1155
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
131 /* Check if we are able to communicate with this peer */ |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
132 if (fd_g_config->cnf_sec_data.tls_disabled && ( peer->p_hdr.info.config.pic_flags.sec != PI_SEC_NONE)) { |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
133 LOG_E("Peer '%s' not configured for No_TLS and TLS is locally disabled; giving up connection attempts", |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
134 peer->p_hdr.info.pi_diamid); |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
135 fd_psm_terminate( peer, NULL ); |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
136 return 0; |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
137 } |
d00b5914351e
Allow running freeDiameter without TLS credentials if the following conditions are verified:
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1136
diff
changeset
|
138 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
139 /* Cleanup any previous list */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
140 empty_connection_list(peer); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
141 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
142 /* Prepare the parameters */ |
372
2687aa506ef6
Enforce TLS_OLD mechanism from configuration
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
370
diff
changeset
|
143 if ((peer->p_hdr.info.config.pic_flags.sec != PI_SEC_DEFAULT) || (fd_g_config->cnf_flags.tls_alg)) { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
144 dotls_immediate = 0; |
897
d8d0772586ad
Use correct default port for outgoing connections even when local port is not the default one
Sebastien Decugis <sdecugis@freediameter.net>
parents:
765
diff
changeset
|
145 port_no = htons(peer->p_hdr.info.config.pic_port ?: DIAMETER_PORT); |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
146 } else { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
147 dotls_immediate = 1; |
897
d8d0772586ad
Use correct default port for outgoing connections even when local port is not the default one
Sebastien Decugis <sdecugis@freediameter.net>
parents:
765
diff
changeset
|
148 port_no = htons(peer->p_hdr.info.config.pic_port ?: DIAMETER_SECURE_PORT); |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
149 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
150 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
151 last_prio = &peer->p_connparams; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
152 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
153 /* Create TCP parameters unless specified otherwise */ |
64
bb45a8ffec77
Enforce configuration flags for new outgoing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
50
diff
changeset
|
154 if ((!fd_g_config->cnf_flags.no_tcp) && (peer->p_hdr.info.config.pic_flags.pro4 != PI_P4_SCTP)) { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
155 for (li = peer->p_hdr.info.pi_endpoints.next; li != &peer->p_hdr.info.pi_endpoints; li = li->next) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
156 struct fd_endpoint * ep = (struct fd_endpoint *)li; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
157 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
158 CHECK_MALLOC( new = malloc(sizeof(struct next_conn)) ); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
159 memset(new, 0, sizeof(struct next_conn)); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
160 fd_list_init(&new->chain, new); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
161 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
162 new->proto = IPPROTO_TCP; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
163 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
164 memcpy( &new->ss, &ep->ss, sizeof(sSS) ); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
165 switch (new->ss.ss_family) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
166 case AF_INET: |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
167 new->sin.sin_port = port_no; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
168 break; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
169 case AF_INET6: |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
170 new->sin6.sin6_port = port_no; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
171 break; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
172 default: |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
173 free(new); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
174 continue; /* Move to the next endpoint */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
175 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
176 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
177 new->dotls = dotls_immediate; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
178 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
179 /* Add the new entry to the appropriate position (conf and disc go first) */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
180 if (ep->flags & (EP_FL_CONF | EP_FL_DISC)) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
181 fd_list_insert_after(last_prio, &new->chain); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
182 last_prio = &new->chain; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
183 } else { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
184 fd_list_insert_before(&peer->p_connparams, &new->chain); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
185 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
186 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
187 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
188 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
189 /* Now, add the SCTP entry, if not disabled */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
190 #ifndef DISABLE_SCTP |
64
bb45a8ffec77
Enforce configuration flags for new outgoing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
50
diff
changeset
|
191 if ((!fd_g_config->cnf_flags.no_sctp) && (peer->p_hdr.info.config.pic_flags.pro4 != PI_P4_TCP)) { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
192 struct next_conn * new; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
193 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
194 CHECK_MALLOC( new = malloc(sizeof(struct next_conn)) ); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
195 memset(new, 0, sizeof(struct next_conn)); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
196 fd_list_init(&new->chain, new); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
197 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
198 new->proto = IPPROTO_SCTP; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
199 new->port = ntohs(port_no); /* back to host byte order... */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
200 new->dotls = dotls_immediate; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
201 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
202 /* Add the new entry to the appropriate position (depending on preferences) */ |
374
8f4ae09bc7c3
Enforce the TCP preference from config also
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
372
diff
changeset
|
203 if ((fd_g_config->cnf_flags.pr_tcp) || (peer->p_hdr.info.config.pic_flags.alg == PI_ALGPREF_TCP)) { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
204 fd_list_insert_after(last_prio, &new->chain); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
205 } else { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
206 fd_list_insert_after(&peer->p_connparams, &new->chain); /* very first position */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
207 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
208 } |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
209 #endif /* DISABLE_SCTP */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
210 |
375
40507b3750da
No need to return an error there
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
374
diff
changeset
|
211 return 0; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
212 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
213 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
214 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
215 /* The thread that attempts the connection */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
216 static void * connect_thr(void * arg) |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
217 { |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
218 struct fd_peer * peer = arg; |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
219 struct cnxctx * cnx = NULL; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
220 struct next_conn * nc = NULL; |
49 | 221 int rebuilt = 0; |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
222 int fatal_error=0; |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
223 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
224 TRACE_ENTRY("%p", arg); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
225 CHECK_PARAMS_DO( CHECK_PEER(peer), return NULL ); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
226 |
49 | 227 /* Set the thread name */ |
228 { | |
229 char buf[48]; | |
706
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
230 snprintf(buf, sizeof(buf), "ConnTo:%s", peer->p_hdr.info.pi_diamid); |
49 | 231 fd_log_threadname ( buf ); |
232 } | |
233 | |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
234 do { |
49 | 235 /* Rebuild the list if needed, if it is empty -- but at most once */ |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
236 if (FD_IS_LIST_EMPTY(&peer->p_connparams)) { |
49 | 237 if (! rebuilt) { |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
238 CHECK_FCT_DO( fatal_error = prepare_connection_list(peer), goto out ); |
49 | 239 rebuilt ++; |
240 } | |
241 if (FD_IS_LIST_EMPTY(&peer->p_connparams)) { | |
242 /* We encountered an error or we have looped over all the addresses of the peer. */ | |
1103
d8591b1c56cd
Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
243 fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "All connection attempts failed, will retry later", NULL); |
d8591b1c56cd
Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
244 |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
245 CHECK_FCT_DO( fatal_error = fd_event_send(peer->p_events, FDEVP_CNX_FAILED, 0, NULL), goto out ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
246 return NULL; |
49 | 247 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
248 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
249 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
250 /* Attempt connection to the first entry */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
251 nc = (struct next_conn *)(peer->p_connparams.next); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
252 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
253 switch (nc->proto) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
254 case IPPROTO_TCP: |
246
6418a188c1b5
getnameinfo is also more sensitive on freeBSD
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
219
diff
changeset
|
255 cnx = fd_cnx_cli_connect_tcp((sSA *)&nc->ss, sSAlen(&nc->ss)); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
256 break; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
257 #ifndef DISABLE_SCTP |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
258 case IPPROTO_SCTP: |
765
edbdb35a603f
Fix a few compilation warning, some are still remaining
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
740
diff
changeset
|
259 cnx = fd_cnx_cli_connect_sctp((peer->p_hdr.info.config.pic_flags.pro3 == PI_P3_IP) ? 1 : fd_g_config->cnf_flags.no_ip6, |
706
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
260 nc->port, &peer->p_hdr.info.pi_endpoints); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
261 break; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
262 #endif /* DISABLE_SCTP */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
263 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
264 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
265 if (cnx) |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
266 break; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
267 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
268 /* Pop these parameters and continue */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
269 failed_connection_attempt(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
270 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
271 pthread_testcancel(); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
272 |
706
4ffbc9f1e922
Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
691
diff
changeset
|
273 } while (!cnx); /* and until cancellation or all addresses attempted without success */ |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
274 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
275 /* Now, we have an established connection in cnx */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
276 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
277 pthread_cleanup_push((void *)fd_cnx_destroy, cnx); |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
278 |
219
e5bcc8c9322e
Add hostname verification
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
136
diff
changeset
|
279 /* Set the hostname in the connection, so that handshake verifies the remote identity */ |
e5bcc8c9322e
Add hostname verification
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
136
diff
changeset
|
280 fd_cnx_sethostname(cnx,peer->p_hdr.info.pi_diamid); |
e5bcc8c9322e
Add hostname verification
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
136
diff
changeset
|
281 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
282 /* Handshake if needed (secure port) */ |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
283 if (nc->dotls) { |
1181
22de21feec64
Preparing for DTLS support
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1155
diff
changeset
|
284 CHECK_FCT_DO( fd_cnx_handshake(cnx, GNUTLS_CLIENT, |
1187
436e4342ecd0
Rollback to using TLS/SCTP in release 1.2.0. DTLS dev to happen in freeDiameter-dtls branch
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1186
diff
changeset
|
285 ALGO_HANDSHAKE_3436, |
1181
22de21feec64
Preparing for DTLS support
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1155
diff
changeset
|
286 peer->p_hdr.info.config.pic_priority, NULL), |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
287 { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
288 /* Handshake failed ... */ |
1103
d8591b1c56cd
Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
289 fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "TLS Handshake failed", NULL); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
290 fd_cnx_destroy(cnx); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
291 empty_connection_list(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
292 fd_ep_filter(&peer->p_hdr.info.pi_endpoints, EP_FL_CONF); |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
293 goto out_pop; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
294 } ); |
1103
d8591b1c56cd
Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
295 LOG_A("%s: TLS handshake successful.", peer->p_hdr.info.pi_diamid); |
43
2db15632a63d
Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
39
diff
changeset
|
296 } else { |
2db15632a63d
Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
39
diff
changeset
|
297 /* Prepare to receive the next message */ |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
298 CHECK_FCT_DO( fatal_error = fd_cnx_start_clear(cnx, 0), goto out_pop ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
299 } |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
300 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
301 /* Upon success, generate FDEVP_CNX_ESTABLISHED */ |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
302 CHECK_FCT_DO( fatal_error = fd_event_send(peer->p_events, FDEVP_CNX_ESTABLISHED, 0, cnx), ); |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
303 out_pop: |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
304 ; |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
305 pthread_cleanup_pop(0); |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
306 |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
307 out: |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
308 |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
309 if (fatal_error) { |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
310 |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
311 /* Cleanup the connection */ |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
312 if (cnx) |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
313 fd_cnx_destroy(cnx); |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
314 |
691
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
315 /* Generate a termination event */ |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
316 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); |
78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
317 } |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
318 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
319 return NULL; |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
320 } |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
321 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
322 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
323 /* Initiate a connection attempt to a remote peer */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
324 int fd_p_cnx_init(struct fd_peer * peer) |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
325 { |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
326 TRACE_ENTRY("%p", peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
327 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
328 /* Start the connect thread */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
329 CHECK_FCT( pthread_create(&peer->p_ini_thr, NULL, connect_thr, peer) ); |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
330 return 0; |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
331 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
332 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
333 /* Cancel a connection attempt */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
334 void fd_p_cnx_abort(struct fd_peer * peer, int cleanup_all) |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
335 { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
336 TRACE_ENTRY("%p %d", peer, cleanup_all); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
337 CHECK_PARAMS_DO( CHECK_PEER(peer), return ); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
338 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
339 if (peer->p_ini_thr != (pthread_t)NULL) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
340 CHECK_FCT_DO( fd_thr_term(&peer->p_ini_thr), /* continue */); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
341 failed_connection_attempt(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
342 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
343 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
344 if (cleanup_all) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
345 empty_connection_list(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
346 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
347 } |
1186
56c36d1007b4
Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1181
diff
changeset
|
348 |