Mercurial > pidgin
annotate src/stun.c @ 14163:c3167a1dd817
[gaim-migrate @ 16811]
Split the DNS query stuff out into it's own file. Eventually
we should move the dnssrv code into this same file. Maybe
even share some code?
Also the first steps toward cancelable DNS queries.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 17 Aug 2006 07:44:52 +0000 |
parents | 8e3b85fe4a55 |
children | 879bb47cff8e |
rev | line source |
---|---|
11225 | 1 /** |
2 * @file stun.c STUN (RFC3489) Implementation | |
3 * @ingroup core | |
4 * | |
5 * gaim | |
6 * | |
11336 | 7 * STUN implementation inspired by jstun [http://jstun.javawi.de/] |
8 * | |
11225 | 9 * Gaim is the legal property of its developers, whose names are too numerous |
10 * to list here. Please refer to the COPYRIGHT file distributed with this | |
11 * source distribution. | |
12 * | |
13 * This program is free software; you can redistribute it and/or modify | |
14 * it under the terms of the GNU General Public License as published by | |
15 * the Free Software Foundation; either version 2 of the License, or | |
16 * (at your option) any later version. | |
17 * | |
18 * This program is distributed in the hope that it will be useful, | |
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 * GNU General Public License for more details. | |
22 * | |
23 * You should have received a copy of the GNU General Public License | |
24 * along with this program; if not, write to the Free Software | |
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
26 * | |
27 */ | |
28 | |
11898 | 29 #include "internal.h" |
30 | |
11364
e1840eb860e7
[gaim-migrate @ 13588]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11354
diff
changeset
|
31 #ifndef _WIN32 |
11225 | 32 #include <net/if.h> |
33 #include <sys/ioctl.h> | |
11364
e1840eb860e7
[gaim-migrate @ 13588]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11354
diff
changeset
|
34 #endif |
11225 | 35 |
12700
cf0d9e207cdc
[gaim-migrate @ 15043]
Richard Laager <rlaager@wiktel.com>
parents:
12686
diff
changeset
|
36 /* Solaris */ |
cf0d9e207cdc
[gaim-migrate @ 15043]
Richard Laager <rlaager@wiktel.com>
parents:
12686
diff
changeset
|
37 #if defined (__SVR4) && defined (__sun) |
cf0d9e207cdc
[gaim-migrate @ 15043]
Richard Laager <rlaager@wiktel.com>
parents:
12686
diff
changeset
|
38 #include <sys/sockio.h> |
cf0d9e207cdc
[gaim-migrate @ 15043]
Richard Laager <rlaager@wiktel.com>
parents:
12686
diff
changeset
|
39 #endif |
cf0d9e207cdc
[gaim-migrate @ 15043]
Richard Laager <rlaager@wiktel.com>
parents:
12686
diff
changeset
|
40 |
11225 | 41 #include "debug.h" |
42 #include "account.h" | |
14163 | 43 #include "dnsquery.h" |
11424 | 44 #include "dnssrv.h" |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
45 #include "network.h" |
11429 | 46 #include "proxy.h" |
11225 | 47 #include "stun.h" |
48 #include "prefs.h" | |
49 | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
50 #define MSGTYPE_BINDINGREQUEST 0x0001 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
51 #define MSGTYPE_BINDINGRESPONSE 0x0101 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
52 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
53 #define ATTRIB_MAPPEDADDRESS 0x0001 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
54 |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
55 struct stun_header { |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
56 guint16 type; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
57 guint16 len; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
58 guint32 transid[4]; |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
59 }; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
60 |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
61 struct stun_attrib { |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
62 guint16 type; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
63 guint16 len; |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
64 }; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
65 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
66 #ifdef NOTYET |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
67 struct stun_change { |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
68 struct stun_header hdr; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
69 struct stun_attrib attrib; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
70 char value[4]; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
71 }; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
72 #endif |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
73 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
74 struct stun_conn { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
75 int fd; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
76 struct sockaddr_in addr; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
77 int test; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
78 int retry; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
79 guint incb; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
80 guint timeout; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
81 struct stun_header *packet; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
82 size_t packetsize; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
83 }; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
84 |
12877
a7bf698eb37c
[gaim-migrate @ 15229]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12757
diff
changeset
|
85 static GaimStunNatDiscovery nattype = { |
a7bf698eb37c
[gaim-migrate @ 15229]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12757
diff
changeset
|
86 GAIM_STUN_STATUS_UNDISCOVERED, |
a7bf698eb37c
[gaim-migrate @ 15229]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12757
diff
changeset
|
87 GAIM_STUN_NAT_TYPE_PUBLIC_IP, |
a7bf698eb37c
[gaim-migrate @ 15229]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12757
diff
changeset
|
88 "\0", NULL, 0}; |
11225 | 89 |
12877
a7bf698eb37c
[gaim-migrate @ 15229]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12757
diff
changeset
|
90 static GSList *callbacks = NULL; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
91 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
92 static void close_stun_conn(struct stun_conn *sc) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
93 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
94 if (sc->incb) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
95 gaim_input_remove(sc->incb); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
96 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
97 if (sc->timeout) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
98 gaim_timeout_remove(sc->timeout); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
99 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
100 if (sc->fd) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
101 close(sc->fd); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
102 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
103 g_free(sc); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
104 } |
11225 | 105 |
106 static void do_callbacks() { | |
107 while(callbacks) { | |
108 StunCallback cb = callbacks->data; | |
11336 | 109 if(cb) |
110 cb(&nattype); | |
11225 | 111 callbacks = g_slist_remove(callbacks, cb); |
112 } | |
113 } | |
114 | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
115 static gboolean timeoutfunc(gpointer data) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
116 struct stun_conn *sc = data; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
117 if(sc->retry >= 2) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
118 gaim_debug_info("stun", "request timed out, giving up.\n"); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
119 if(sc->test == 2) |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
120 nattype.type = GAIM_STUN_NAT_TYPE_SYMMETRIC; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
121 |
11354 | 122 /* set unknown */ |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
123 nattype.status = GAIM_STUN_STATUS_UNKNOWN; |
11354 | 124 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
125 nattype.lookup_time = time(NULL); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
126 |
11354 | 127 /* callbacks */ |
128 do_callbacks(); | |
129 | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
130 /* we don't need to remove the timeout (returning FALSE) */ |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
131 sc->timeout = 0; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
132 close_stun_conn(sc); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
133 |
11354 | 134 return FALSE; |
135 } | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
136 gaim_debug_info("stun", "request timed out, retrying.\n"); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
137 sc->retry++; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
138 sendto(sc->fd, sc->packet, sc->packetsize, 0, |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
139 (struct sockaddr *)&(sc->addr), sizeof(struct sockaddr_in)); |
11354 | 140 return TRUE; |
141 } | |
142 | |
143 #ifdef NOTYET | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
144 static void do_test2(struct stun_conn *sc) { |
11354 | 145 struct stun_change data; |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
146 data.hdr.type = htons(0x0001); |
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
147 data.hdr.len = 0; |
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
148 data.hdr.transid[0] = rand(); |
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
149 data.hdr.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m'); |
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
150 data.hdr.transid[2] = rand(); |
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
151 data.hdr.transid[3] = rand(); |
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
152 data.attrib.type = htons(0x003); |
11354 | 153 data.attrib.len = htons(4); |
154 data.value[3] = 6; | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
155 sc->packet = (struct stun_header*)&data; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
156 sc->packetsize = sizeof(struct stun_change); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
157 sc->retry = 0; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
158 sc->test = 2; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
159 sendto(sc->fd, sc->packet, sc->packetsize, 0, (struct sockaddr *)&(sc->addr), sizeof(struct sockaddr_in)); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
160 sc->timeout = gaim_timeout_add(500, (GSourceFunc) timeoutfunc, sc); |
11354 | 161 } |
162 #endif | |
163 | |
11225 | 164 static void reply_cb(gpointer data, gint source, GaimInputCondition cond) { |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
165 struct stun_conn *sc = data; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
166 char buffer[65536]; |
11225 | 167 char *tmp; |
168 int len; | |
169 struct in_addr in; | |
170 struct stun_attrib *attrib; | |
171 struct stun_header *hdr; | |
11300
dd1a5969b2e5
[gaim-migrate @ 13500]
Richard Laager <rlaager@wiktel.com>
parents:
11229
diff
changeset
|
172 struct ifconf ifc; |
dd1a5969b2e5
[gaim-migrate @ 13500]
Richard Laager <rlaager@wiktel.com>
parents:
11229
diff
changeset
|
173 struct ifreq *ifr; |
dd1a5969b2e5
[gaim-migrate @ 13500]
Richard Laager <rlaager@wiktel.com>
parents:
11229
diff
changeset
|
174 struct sockaddr_in *sinptr; |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
175 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
176 len = recv(source, buffer, sizeof(buffer) - 1, 0); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
177 if (!len) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
178 gaim_debug_info("stun", "unable to read stun response\n"); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
179 return; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
180 } |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
181 buffer[len] = '\0'; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
182 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
183 if (len < sizeof(struct stun_header)) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
184 gaim_debug_info("stun", "got invalid response\n"); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
185 return; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
186 } |
11225 | 187 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
188 hdr = (struct stun_header*) buffer; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
189 if (len != (ntohs(hdr->len) + sizeof(struct stun_header))) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
190 gaim_debug_info("stun", "got incomplete response\n"); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
191 return; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
192 } |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
193 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
194 /* wrong transaction */ |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
195 if(hdr->transid[0] != sc->packet->transid[0] |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
196 || hdr->transid[1] != sc->packet->transid[1] |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
197 || hdr->transid[2] != sc->packet->transid[2] |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
198 || hdr->transid[3] != sc->packet->transid[3]) { |
11371
6e02e20e3a58
[gaim-migrate @ 13596]
Richard Laager <rlaager@wiktel.com>
parents:
11364
diff
changeset
|
199 gaim_debug_info("stun", "got wrong transid\n"); |
11225 | 200 return; |
201 } | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
202 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
203 if(sc->test==1) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
204 if (hdr->type != MSGTYPE_BINDINGRESPONSE) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
205 gaim_debug_info("stun", |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
206 "Expected Binding Response, got %d\n", |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
207 hdr->type); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
208 return; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
209 } |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
210 |
11354 | 211 tmp = buffer + sizeof(struct stun_header); |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
212 while((buffer + len) > (tmp + sizeof(struct stun_attrib))) { |
11354 | 213 attrib = (struct stun_attrib*) tmp; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
214 tmp += sizeof(struct stun_attrib); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
215 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
216 if (!((buffer + len) > (tmp + ntohs(attrib->len)))) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
217 break; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
218 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
219 if(attrib->type == htons(ATTRIB_MAPPEDADDRESS) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
220 && ntohs(attrib->len) == 8) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
221 char *ip; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
222 /* Skip the first unused byte, |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
223 * the family(1 byte), and the port(2 bytes); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
224 * then read the 4 byte IPv4 address */ |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
225 memcpy(&in.s_addr, tmp + 4, 4); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
226 ip = inet_ntoa(in); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
227 if(ip) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
228 strcpy(nattype.publicip, ip); |
11354 | 229 } |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
230 |
12757
e2f1f49fad1a
[gaim-migrate @ 15104]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12756
diff
changeset
|
231 tmp += ntohs(attrib->len); |
11225 | 232 } |
11371
6e02e20e3a58
[gaim-migrate @ 13596]
Richard Laager <rlaager@wiktel.com>
parents:
11364
diff
changeset
|
233 gaim_debug_info("stun", "got public ip %s\n", nattype.publicip); |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
234 nattype.status = GAIM_STUN_STATUS_DISCOVERED; |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
235 nattype.type = GAIM_STUN_NAT_TYPE_UNKNOWN_NAT; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
236 nattype.lookup_time = time(NULL); |
11354 | 237 |
11371
6e02e20e3a58
[gaim-migrate @ 13596]
Richard Laager <rlaager@wiktel.com>
parents:
11364
diff
changeset
|
238 /* is it a NAT? */ |
11225 | 239 |
11354 | 240 ifc.ifc_len = sizeof(buffer); |
241 ifc.ifc_req = (struct ifreq *) buffer; | |
242 ioctl(source, SIOCGIFCONF, &ifc); | |
11225 | 243 |
11354 | 244 tmp = buffer; |
245 while(tmp < buffer + ifc.ifc_len) { | |
246 ifr = (struct ifreq *) tmp; | |
11225 | 247 |
11364
e1840eb860e7
[gaim-migrate @ 13588]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11354
diff
changeset
|
248 tmp += sizeof(struct ifreq); |
11225 | 249 |
11354 | 250 if(ifr->ifr_addr.sa_family == AF_INET) { |
11371
6e02e20e3a58
[gaim-migrate @ 13596]
Richard Laager <rlaager@wiktel.com>
parents:
11364
diff
changeset
|
251 /* we only care about ipv4 interfaces */ |
11354 | 252 sinptr = (struct sockaddr_in *) &ifr->ifr_addr; |
253 if(sinptr->sin_addr.s_addr == in.s_addr) { | |
11371
6e02e20e3a58
[gaim-migrate @ 13596]
Richard Laager <rlaager@wiktel.com>
parents:
11364
diff
changeset
|
254 /* no NAT */ |
6e02e20e3a58
[gaim-migrate @ 13596]
Richard Laager <rlaager@wiktel.com>
parents:
11364
diff
changeset
|
255 gaim_debug_info("stun", "no nat"); |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
256 nattype.type = GAIM_STUN_NAT_TYPE_PUBLIC_IP; |
11354 | 257 } |
11225 | 258 } |
259 } | |
260 | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
261 #ifndef NOTYET |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
262 close_stun_conn(sc); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
263 do_callbacks(); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
264 #else |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
265 gaim_timeout_remove(sc->timeout); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
266 sc->timeout = 0; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
267 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
268 do_test2(sc); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
269 } else if(sc->test == 2) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
270 close_stun_conn(sc); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
271 nattype.type = GAIM_STUN_NAT_TYPE_FULL_CONE; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
272 do_callbacks(); |
11354 | 273 #endif |
274 } | |
11336 | 275 } |
11424 | 276 |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
277 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
278 static void hbn_listen_cb(int fd, gpointer data) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
279 GSList *hosts = data; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
280 struct stun_conn *sc; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
281 static struct stun_header hdr_data; |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
282 int ret; |
11425 | 283 |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
284 if(fd < 0) { |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
285 nattype.status = GAIM_STUN_STATUS_UNKNOWN; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
286 nattype.lookup_time = time(NULL); |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
287 do_callbacks(); |
11424 | 288 return; |
11225 | 289 } |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
290 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
291 sc = g_new0(struct stun_conn, 1); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
292 sc->fd = fd; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
293 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
294 sc->addr.sin_family = AF_INET; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
295 sc->addr.sin_port = htons(gaim_network_get_port_from_fd(fd)); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
296 sc->addr.sin_addr.s_addr = INADDR_ANY; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
297 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
298 sc->incb = gaim_input_add(fd, GAIM_INPUT_READ, reply_cb, sc); |
11225 | 299 |
11429 | 300 ret = GPOINTER_TO_INT(hosts->data); |
301 hosts = g_slist_remove(hosts, hosts->data); | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
302 memcpy(&(sc->addr), hosts->data, sizeof(struct sockaddr_in)); |
11429 | 303 g_free(hosts->data); |
304 hosts = g_slist_remove(hosts, hosts->data); | |
305 while(hosts) { | |
306 hosts = g_slist_remove(hosts, hosts->data); | |
307 g_free(hosts->data); | |
308 hosts = g_slist_remove(hosts, hosts->data); | |
309 } | |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
310 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
311 hdr_data.type = htons(MSGTYPE_BINDINGREQUEST); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
312 hdr_data.len = 0; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
313 hdr_data.transid[0] = rand(); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
314 hdr_data.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m'); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
315 hdr_data.transid[2] = rand(); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
316 hdr_data.transid[3] = rand(); |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
317 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
318 if(sendto(sc->fd, &hdr_data, sizeof(struct stun_header), 0, |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
319 (struct sockaddr *)&(sc->addr), |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
320 sizeof(struct sockaddr_in)) < sizeof(struct stun_header)) { |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
321 nattype.status = GAIM_STUN_STATUS_UNKNOWN; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
322 nattype.lookup_time = time(NULL); |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
323 do_callbacks(); |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
324 close_stun_conn(sc); |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
325 return; |
11225 | 326 } |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
327 sc->test = 1; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
328 sc->packet = &hdr_data; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
329 sc->packetsize = sizeof(struct stun_header); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
330 sc->timeout = gaim_timeout_add(500, (GSourceFunc) timeoutfunc, sc); |
11429 | 331 } |
332 | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
333 static void hbn_cb(GSList *hosts, gpointer data, const char *error_message) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
334 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
335 if(!hosts || !hosts->data) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
336 nattype.status = GAIM_STUN_STATUS_UNDISCOVERED; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
337 nattype.lookup_time = time(NULL); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
338 do_callbacks(); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
339 return; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
340 } |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
341 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
342 if (!gaim_network_listen_range(12108, 12208, SOCK_DGRAM, hbn_listen_cb, hosts)) { |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
343 nattype.status = GAIM_STUN_STATUS_UNKNOWN; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
344 nattype.lookup_time = time(NULL); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
345 do_callbacks(); |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
346 return; |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
347 } |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
348 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
349 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
350 } |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
351 |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
352 static void do_test1(GaimSrvResponse *resp, int results, gpointer sdata) { |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
353 const char *servername = sdata; |
11429 | 354 int port = 3478; |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
355 |
11429 | 356 if(results) { |
357 servername = resp[0].hostname; | |
358 port = resp[0].port; | |
359 } | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
360 gaim_debug_info("stun", "got %d SRV responses, server: %s, port: %d\n", |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
361 results, servername, port); |
11429 | 362 |
14163 | 363 gaim_dnsquery_a(servername, port, hbn_cb, NULL); |
11424 | 364 g_free(resp); |
11225 | 365 } |
11424 | 366 |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
367 static gboolean call_callback(gpointer data) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
368 StunCallback cb = data; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
369 cb(&nattype); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
370 return FALSE; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
371 } |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
372 |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
373 GaimStunNatDiscovery *gaim_stun_discover(StunCallback cb) { |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
374 const char *servername = gaim_prefs_get_string("/core/network/stun_server"); |
11424 | 375 |
376 gaim_debug_info("stun", "using server %s\n", servername); | |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
377 |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
378 if(nattype.status == GAIM_STUN_STATUS_DISCOVERING) { |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
379 if(cb) |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
380 callbacks = g_slist_append(callbacks, cb); |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
381 return &nattype; |
11424 | 382 } |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
383 |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
384 if(nattype.status != GAIM_STUN_STATUS_UNDISCOVERED) { |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
385 gboolean use_cached_result = TRUE; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
386 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
387 /** Deal with the server name having changed since we did the |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
388 lookup */ |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
389 if (servername && strlen(servername) > 1 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
390 && ((nattype.servername |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
391 && strcmp(servername, nattype.servername)) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
392 || !nattype.servername)) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
393 use_cached_result = FALSE; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
394 } |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
395 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
396 /* If we don't have a successful status and it has been 5 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
397 minutes since we last did a lookup, redo the lookup */ |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
398 if (nattype.status != GAIM_STUN_STATUS_DISCOVERED |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
399 && (time(NULL) - nattype.lookup_time) > 300) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
400 use_cached_result = FALSE; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
401 } |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
402 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
403 if (use_cached_result) { |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
404 if(cb) |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
405 gaim_timeout_add(10, call_callback, cb); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
406 return &nattype; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
407 } |
11424 | 408 } |
409 | |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
410 if(!servername || (strlen(servername) < 2)) { |
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
411 nattype.status = GAIM_STUN_STATUS_UNKNOWN; |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
412 nattype.lookup_time = time(NULL); |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
413 if(cb) |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
414 gaim_timeout_add(10, call_callback, cb); |
11424 | 415 return &nattype; |
416 } | |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
417 |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
418 nattype.status = GAIM_STUN_STATUS_DISCOVERING; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
419 nattype.publicip[0] = '\0'; |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
420 g_free(nattype.servername); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
421 nattype.servername = g_strdup(servername); |
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
422 |
11424 | 423 callbacks = g_slist_append(callbacks, cb); |
12686
5f65a0cca87c
[gaim-migrate @ 15029]
Richard Laager <rlaager@wiktel.com>
parents:
11898
diff
changeset
|
424 gaim_srv_resolve("stun", "udp", servername, do_test1, |
11431
d2e44c8085e0
[gaim-migrate @ 13668]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11429
diff
changeset
|
425 (gpointer) servername); |
12756
6ef1cdc26b40
[gaim-migrate @ 15103]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12700
diff
changeset
|
426 |
11424 | 427 return &nattype; |
428 } | |
429 | |
430 void gaim_stun_init() { | |
431 gaim_prefs_add_string("/core/network/stun_server", ""); | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12877
diff
changeset
|
432 gaim_stun_discover(NULL); |
11424 | 433 } |