Mercurial > hg > freeDiameter
annotate freeDiameter/p_cnx.c @ 78:a58f0757c06a
Added code for DPR/DPA
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Tue, 01 Dec 2009 16:24:06 +0900 |
parents | 65b32c93f21e |
children | abd3c441780b |
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) * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
5 * Copyright (c) 2009, WIDE Project and NICT * |
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 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 #include "fD.h" |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
38 /* 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
|
39 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
40 struct next_conn { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
41 struct fd_list chain; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
42 int proto; /* Protocol of the next attempt */ |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
43 union { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
44 sSS ss; /* The address, only for TCP */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
45 sSA4 sin; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
46 sSA6 sin6; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
47 }; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
48 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
|
49 int dotls; /* Handshake TLS after connection ? */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
50 }; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
51 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
52 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
|
53 { |
50 | 54 /* Simply remove the first item in the list if not empty */ |
55 if (! FD_IS_LIST_EMPTY(&peer->p_connparams) ) { | |
56 struct fd_list * li = peer->p_connparams.next; | |
57 fd_list_unlink(li); | |
58 free(li); | |
59 } | |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
60 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
61 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
62 static void empty_connection_list(struct fd_peer * peer) |
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 /* Remove all items */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
65 while (!FD_IS_LIST_EMPTY(&peer->p_connparams)) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
66 failed_connection_attempt(peer); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
67 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
68 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
69 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
70 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
|
71 { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
72 struct fd_list * li, *last_prio; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
73 struct next_conn * new; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
74 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
75 uint16_t port_no; /* network order */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
76 int dotls_immediate; |
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 TRACE_ENTRY("%p", peer); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
79 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
80 /* Resolve peer address(es) if needed */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
81 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
|
82 struct addrinfo hints, *ai, *aip; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
83 int ret; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
84 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
85 memset(&hints, 0, sizeof(hints)); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
86 hints.ai_flags = AI_ADDRCONFIG; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
87 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
|
88 if (ret) { |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
89 fd_log_debug("Unable to resolve address for peer '%s' (%s), aborting\n", peer->p_hdr.info.pi_diamid, gai_strerror(ret)); |
78
a58f0757c06a
Added code for DPR/DPA
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
70
diff
changeset
|
90 fd_psm_terminate( peer, NULL ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
91 return 0; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
92 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
93 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
94 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
|
95 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
|
96 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
97 freeaddrinfo(ai); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
98 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
99 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
100 /* Remove addresses from unwanted family */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
101 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
|
102 CHECK_FCT( fd_ep_filter_family( |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
103 &peer->p_hdr.info.pi_endpoints, |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
104 (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
|
105 AF_INET |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
106 : AF_INET6)); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
107 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
108 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
109 /* 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
|
110 if (FD_IS_LIST_EMPTY(&peer->p_hdr.info.pi_endpoints)) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
111 fd_log_debug("No address %savailable to connect to peer '%s', aborting\n", 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
|
112 fd_psm_terminate( peer, NULL ); |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
113 return 0; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
114 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
115 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
116 /* Cleanup any previous list */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
117 empty_connection_list(peer); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
118 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
119 /* Prepare the parameters */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
120 if (peer->p_hdr.info.config.pic_flags.sec != PI_SEC_DEFAULT) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
121 dotls_immediate = 0; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
122 port_no = htons(peer->p_hdr.info.config.pic_port ?: fd_g_config->cnf_port); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
123 } else { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
124 dotls_immediate = 1; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
125 port_no = htons(peer->p_hdr.info.config.pic_port ?: fd_g_config->cnf_port_tls); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
126 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
127 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
128 last_prio = &peer->p_connparams; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
129 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
130 /* 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
|
131 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
|
132 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
|
133 struct fd_endpoint * ep = (struct fd_endpoint *)li; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
134 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
135 CHECK_MALLOC( new = malloc(sizeof(struct next_conn)) ); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
136 memset(new, 0, sizeof(struct next_conn)); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
137 fd_list_init(&new->chain, new); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
138 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
139 new->proto = IPPROTO_TCP; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
140 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
141 memcpy( &new->ss, &ep->ss, sizeof(sSS) ); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
142 switch (new->ss.ss_family) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
143 case AF_INET: |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
144 new->sin.sin_port = port_no; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
145 break; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
146 case AF_INET6: |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
147 new->sin6.sin6_port = port_no; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
148 break; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
149 default: |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
150 free(new); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
151 continue; /* Move to the next endpoint */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
152 } |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
153 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
154 new->dotls = dotls_immediate; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
155 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
156 /* 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
|
157 if (ep->flags & (EP_FL_CONF | EP_FL_DISC)) { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
158 fd_list_insert_after(last_prio, &new->chain); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
159 last_prio = &new->chain; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
160 } else { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
161 fd_list_insert_before(&peer->p_connparams, &new->chain); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
162 } |
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 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
165 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
166 /* Now, add the SCTP entry, if not disabled */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
167 #ifndef DISABLE_SCTP |
64
bb45a8ffec77
Enforce configuration flags for new outgoing connections
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
50
diff
changeset
|
168 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
|
169 struct next_conn * new; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
170 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
171 CHECK_MALLOC( new = malloc(sizeof(struct next_conn)) ); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
172 memset(new, 0, sizeof(struct next_conn)); |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
173 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
|
174 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
175 new->proto = IPPROTO_SCTP; |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
176 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
|
177 new->dotls = dotls_immediate; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
178 |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
179 /* Add the new entry to the appropriate position (depending on preferences) */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
180 if (peer->p_hdr.info.config.pic_flags.alg == PI_ALGPREF_TCP) { |
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 } else { |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
183 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
|
184 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
185 } |
39
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
186 #endif /* DISABLE_SCTP */ |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
187 |
d7535cf7bab5
Added initiator connection logic
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
38
diff
changeset
|
188 return FD_IS_LIST_EMPTY(&peer->p_connparams) ? EINVAL : 0; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
189 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
190 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
191 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
192 /* The thread that attempts the connection */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
193 static void * connect_thr(void * arg) |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
194 { |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
195 struct fd_peer * peer = arg; |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
196 struct cnxctx * cnx = NULL; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
197 struct next_conn * nc = NULL; |
49 | 198 int rebuilt = 0; |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
199 |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
200 TRACE_ENTRY("%p", arg); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
201 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
|
202 |
49 | 203 /* Set the thread name */ |
204 { | |
205 char buf[48]; | |
206 sprintf(buf, "ConnTo:%.*s", sizeof(buf) - 8, peer->p_hdr.info.pi_diamid); | |
207 fd_log_threadname ( buf ); | |
208 } | |
209 | |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
210 do { |
49 | 211 /* 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
|
212 if (FD_IS_LIST_EMPTY(&peer->p_connparams)) { |
49 | 213 if (! rebuilt) { |
214 CHECK_FCT_DO( prepare_connection_list(peer), goto fatal_error ); | |
215 rebuilt ++; | |
216 } | |
217 if (FD_IS_LIST_EMPTY(&peer->p_connparams)) { | |
218 /* We encountered an error or we have looped over all the addresses of the peer. */ | |
219 TRACE_DEBUG(INFO, "Unable to connect to the peer %s, aborting attempts for now.", peer->p_hdr.info.pi_diamid); | |
70
65b32c93f21e
Do not wait for timeout when all connections attempts have failed
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
64
diff
changeset
|
220 CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_FAILED, 0, NULL), goto fatal_error ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
221 return NULL; |
49 | 222 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
223 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
224 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
225 /* Attempt connection to the first entry */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
226 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
|
227 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
228 switch (nc->proto) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
229 case IPPROTO_TCP: |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
230 cnx = fd_cnx_cli_connect_tcp((sSA *)&nc->ss, sSSlen(&nc->ss)); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
231 break; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
232 #ifndef DISABLE_SCTP |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
233 case IPPROTO_SCTP: |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
234 cnx = fd_cnx_cli_connect_sctp((peer->p_hdr.info.config.pic_flags.pro3 == PI_P3_IP) ?: fd_g_config->cnf_flags.no_ip6, nc->port, &peer->p_hdr.info.pi_endpoints); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
235 break; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
236 #endif /* DISABLE_SCTP */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
237 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
238 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
239 if (cnx) |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
240 break; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
241 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
242 /* Pop these parameters and continue */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
243 failed_connection_attempt(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
244 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
245 pthread_testcancel(); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
246 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
247 } while (!cnx); /* and until cancellation */ |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
248 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
249 /* 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
|
250 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
251 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
|
252 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
253 /* Handshake if needed (secure port) */ |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
254 if (nc->dotls) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
255 CHECK_FCT_DO( fd_cnx_handshake(cnx, GNUTLS_CLIENT, peer->p_hdr.info.config.pic_priority, NULL), |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
256 { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
257 /* Handshake failed ... */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
258 fd_log_debug("TLS Handshake failed with peer '%s', resetting the connection\n", peer->p_hdr.info.pi_diamid); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
259 fd_cnx_destroy(cnx); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
260 empty_connection_list(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
261 fd_ep_filter(&peer->p_hdr.info.pi_endpoints, EP_FL_CONF); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
262 return NULL; |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
263 } ); |
43
2db15632a63d
Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
39
diff
changeset
|
264 } else { |
2db15632a63d
Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
39
diff
changeset
|
265 /* Prepare to receive the next message */ |
2db15632a63d
Added a large part of connection establishment logic, to test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
39
diff
changeset
|
266 CHECK_FCT_DO( fd_cnx_start_clear(cnx, 0), goto fatal_error ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
267 } |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
268 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
269 /* Upon success, generate FDEVP_CNX_ESTABLISHED */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
270 CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ESTABLISHED, 0, cnx), goto fatal_error ); |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
271 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
272 pthread_cleanup_pop(0); |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
273 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
274 return NULL; |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
275 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
276 fatal_error: |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
277 /* Cleanup the connection */ |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
278 if (cnx) |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
279 fd_cnx_destroy(cnx); |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
280 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
281 /* Generate a termination event */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
282 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
283 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
284 return NULL; |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
285 } |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
286 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
287 |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
288 /* 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
|
289 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
|
290 { |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
291 TRACE_ENTRY("%p", peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
292 |
37
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
293 /* Start the connect thread */ |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
294 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
|
295 return 0; |
cc3c59fe98fe
Lot of cleanups in peer structure management
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
296 } |
38
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
297 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
298 /* Cancel a connection attempt */ |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
299 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
|
300 { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
301 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
|
302 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
|
303 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
304 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
|
305 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
|
306 failed_connection_attempt(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
307 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
308 |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
309 if (cleanup_all) { |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
310 empty_connection_list(peer); |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
311 } |
68c1890f7049
Fixed a small bug in SCTP close
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
37
diff
changeset
|
312 } |