00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef STUN_H
00026
00027 #define STUN_H
00028
00037 #ifndef SU_WAIT_H
00038 #include <sofia-sip/su_wait.h>
00039 #endif
00040 #ifndef SU_TAG_H
00041 #include <sofia-sip/su_tag.h>
00042 #endif
00043 #include "sofia-sip/stun_common.h"
00044
00045 #include <sofia-sip/su_localinfo.h>
00046
00047 SOFIA_BEGIN_DECLS
00048
00049 typedef struct stun_handle_s stun_handle_t;
00050 typedef struct stun_request_s stun_request_t;
00051 typedef struct stun_discovery_s stun_discovery_t;
00052 typedef struct stun_dns_lookup_s stun_dns_lookup_t;
00053
00054 typedef struct stun_mini_s stun_mini_t;
00055
00056 #ifndef STUN_MAGIC_T
00057 #define STUN_MAGIC_T struct stun_magic_t
00058 #endif
00059
00060 typedef STUN_MAGIC_T stun_magic_t;
00061
00062 #ifndef STUN_DISCOVERY_MAGIC_T
00063 #define STUN_DISCOVERY_MAGIC_T struct stun_discovery_magic_t
00064 #endif
00065
00066 typedef STUN_DISCOVERY_MAGIC_T stun_discovery_magic_t;
00067
00069 SOFIAPUBVAR char const stun_version[];
00070
00075 typedef enum stun_action_s {
00076 stun_action_no_action = 1,
00077 stun_action_tls_query = 2,
00078 stun_action_binding_request = 4,
00079 stun_action_keepalive = 8,
00080 stun_action_test_nattype = 16,
00081 stun_action_test_lifetime = 32,
00082 } stun_action_t;
00083
00094 typedef enum stun_nattype_e {
00095 stun_nat_unknown = 0,
00096
00097
00098 stun_open_internet,
00099
00100
00101 stun_udp_blocked,
00102
00103
00104
00105 stun_sym_udp_fw,
00106
00107
00108
00109 stun_nat_full_cone,
00110
00111
00112
00113 stun_nat_res_cone,
00114
00115
00116
00117 stun_nat_port_res_cone,
00118
00119
00120 stun_nat_ei_filt_ad_map,
00121
00122
00123 stun_nat_ad_filt_ad_map,
00124
00125
00126
00127 stun_nat_adp_filt_ad_map,
00128
00129 } stun_nattype_t;
00130
00139 typedef enum stun_state_e {
00140
00141 stun_no_assigned_event,
00142
00143
00144 stun_tls_connecting,
00145 stun_tls_ssl_connecting,
00146 stun_tls_writing,
00147 stun_tls_closing,
00148 stun_tls_reading,
00149 stun_tls_done,
00151
00152 stun_discovery_done,
00154
00155
00156
00157 stun_error,
00158 stun_tls_connection_timeout,
00159 stun_tls_connection_failed,
00160 stun_tls_ssl_connect_failed,
00162 stun_discovery_error,
00163 stun_discovery_timeout,
00165 } stun_state_t;
00166
00167
00168
00169
00170
00171 typedef void (*stun_discovery_f)(stun_discovery_magic_t *magic,
00172 stun_handle_t *sh,
00173 stun_discovery_t *sd,
00174 stun_action_t action,
00175 stun_state_t event);
00176
00178 typedef int (*stun_send_callback)(stun_magic_t *magic,
00179 stun_handle_t *sh,
00180 int socket,
00181 void *data,
00182 unsigned len,
00183 int only_a_keepalive);
00184
00186 typedef void (*stun_dns_lookup_f)(stun_dns_lookup_t *self,
00187 stun_magic_t *magic);
00188
00189
00190
00191
00192 SOFIAPUBFUN stun_handle_t *stun_handle_init(su_root_t *root,
00193 tag_type_t, tag_value_t, ...);
00194
00195 SOFIAPUBFUN void stun_handle_destroy(stun_handle_t *sh);
00196
00197 SOFIAPUBFUN su_root_t *stun_root(stun_handle_t *sh);
00198 SOFIAPUBFUN int stun_is_requested(tag_type_t tag, tag_value_t value, ...);
00199 SOFIAPUBFUN char const *stun_str_state(stun_state_t state);
00200 SOFIAPUBFUN su_addrinfo_t const *stun_server_address(stun_handle_t *sh);
00201
00202 SOFIAPUBFUN
00203 int stun_process_message(stun_handle_t *sh, su_socket_t s,
00204 su_sockaddr_t *sa, socklen_t salen,
00205 void *data, int len);
00206 SOFIAPUBFUN
00207 int stun_process_request(su_socket_t s, stun_msg_t *req,
00208 int sid, su_sockaddr_t *from_addr,
00209 int from_len);
00210
00211
00212
00213
00214 SOFIAPUBFUN
00215 int stun_obtain_shared_secret(stun_handle_t *sh, stun_discovery_f,
00216 stun_discovery_magic_t *magic,
00217 tag_type_t tag, tag_value_t value, ...);
00218
00219 SOFIAPUBFUN
00220 int stun_bind(stun_handle_t *sh,
00221 stun_discovery_f, stun_discovery_magic_t *magic,
00222 tag_type_t tag, tag_value_t value, ...);
00223
00224 SOFIAPUBFUN
00225 int stun_discovery_get_address(stun_discovery_t *sd,
00226 void *addr,
00227 socklen_t *return_addrlen);
00228 SOFIAPUBFUN su_socket_t stun_discovery_get_socket(stun_discovery_t *sd);
00229 SOFIAPUBFUN int stun_discovery_release_socket(stun_discovery_t *sd);
00230
00231 SOFIAPUBFUN
00232 int stun_test_nattype(stun_handle_t *sh,
00233 stun_discovery_f, stun_discovery_magic_t *magic,
00234 tag_type_t tag, tag_value_t value, ...);
00235 SOFIAPUBFUN char const *stun_nattype_str(stun_discovery_t *sd);
00236 SOFIAPUBFUN stun_nattype_t stun_nattype(stun_discovery_t *sd);
00237
00238 SOFIAPUBFUN
00239 int stun_test_lifetime(stun_handle_t *sh,
00240 stun_discovery_f, stun_discovery_magic_t *magic,
00241 tag_type_t tag, tag_value_t value, ...);
00242 SOFIAPUBFUN int stun_lifetime(stun_discovery_t *sd);
00243
00244
00245
00246
00247 SOFIAPUBFUN
00248 int stun_set_uname_pwd(stun_handle_t *sh,
00249 const char *uname,
00250 int len_uname,
00251 const char *pwd,
00252 int len_pwd);
00253
00254 SOFIAPUBFUN int stun_msg_is_keepalive(uint16_t data);
00255 SOFIAPUBFUN int stun_message_length(void *data, int len, int end_of_message);
00256
00257
00258
00259 SOFIAPUBFUN
00260 int stun_keepalive(stun_handle_t *sh,
00261 su_sockaddr_t *sa,
00262 tag_type_t tag, tag_value_t value,
00263 ...);
00264 SOFIAPUBFUN int stun_keepalive_destroy(stun_handle_t *sh, su_socket_t s);
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 SOFIAPUBFUN
00275 stun_dns_lookup_t *stun_dns_lookup(stun_magic_t *magic,
00276 su_root_t *root,
00277 stun_dns_lookup_f func,
00278 const char *domain);
00279 SOFIAPUBFUN void stun_dns_lookup_destroy(stun_dns_lookup_t *self);
00280
00281 SOFIAPUBFUN int stun_dns_lookup_udp_addr(stun_dns_lookup_t *,
00282 const char **target, uint16_t *port);
00283 SOFIAPUBFUN int stun_dns_lookup_tcp_addr(stun_dns_lookup_t *self,
00284 const char **target, uint16_t *port);
00285 SOFIAPUBFUN int stun_dns_lookup_stp_addr(stun_dns_lookup_t *self,
00286 const char **target, uint16_t *port);
00287
00288
00289
00290
00291 SOFIAPUBFUN stun_mini_t *stun_mini_create(void);
00292 SOFIAPUBFUN void stun_mini_destroy(stun_mini_t *);
00293
00294 SOFIAPUBFUN int stun_mini_add_socket(stun_mini_t *server, int socket);
00295 SOFIAPUBFUN int stun_mini_remove_socket(stun_mini_t *server, int socket);
00296
00297 SOFIAPUBFUN void stun_mini_request(stun_mini_t *server, int socket,
00298 void *msg, ssize_t msglen,
00299 void *addr, socklen_t addrlen);
00300
00301 SOFIA_END_DECLS
00302
00303 #endif