29 #ifndef Abstract_Socket_HH 30 #define Abstract_Socket_HH 33 #include <openssl/ssl.h> 34 #include <openssl/rand.h> 35 #include <openssl/err.h> 38 #include <sys/socket.h> 39 #include <netinet/in.h> 44 #define AF_INET6 (-255) 60 long p_value_offset = 0,
unsigned long p_length_multiplier = 1)
61 : length_offset(p_length_offset), nr_bytes_in_length(p_nr_bytes_in_length),
62 byte_order(p_byte_order), value_offset(p_value_offset),
63 length_multiplier(p_length_multiplier) { }
75 enum TCP_STATES {CLOSED, LISTEN, ESTABLISHED, CLOSE_WAIT, FIN_WAIT};
81 struct sockaddr_storage clientAddr;
82 #if defined LINUX || defined FREEBSD || defined SOLARIS8 97 bool parameter_set(
const char *parameter_name,
const char *parameter_value);
104 void get_host_id(
const char* hostName,
struct sockaddr_in *addr);
107 int open_listen_port(
const struct sockaddr_in & localAddr);
108 int open_listen_port(
const char* localHostname,
const char* localServicename);
110 void close_listen_port();
112 virtual void listen_port_opened(
int port_number);
115 int open_client_connection(
const struct sockaddr_in & new_remote_addr,
const struct sockaddr_in & new_local_addr);
116 int open_client_connection(
const char* remoteHostname,
const char* remoteService,
const char* localHostname,
const char* localService);
118 virtual void client_connection_opened(
int client_id);
121 void Handle_Socket_Event(
int fd,
boolean is_readable,
boolean is_writable,
boolean is_error);
126 void send_outgoing(
const unsigned char* message_buffer,
int length,
int client_id = -1);
127 void send_shutdown(
int client_id = -1);
137 int get_socket_fd()
const;
141 int set_non_block_mode(
int fd,
bool enable_nonblock);
144 bool increase_send_buffer(
int fd,
int &old_size,
int& new_size);
165 virtual void message_incoming(
const unsigned char* message_buffer,
int length,
int client_id = -1) = 0;
167 virtual void Add_Fd_Read_Handler(
int fd) = 0;
168 virtual void Add_Fd_Write_Handler(
int fd) = 0;
169 virtual void Remove_Fd_Read_Handler(
int fd) = 0;
170 virtual void Remove_Fd_Write_Handler(
int fd) = 0;
171 virtual void Remove_Fd_All_Handlers(
int fd) = 0;
172 virtual void Handler_Uninstall() = 0;
173 virtual void Timer_Set_Handler(
double call_interval,
boolean is_timeout = TRUE,
174 boolean call_anyway = TRUE,
boolean is_periodic = TRUE) = 0;
178 void log_debug(
const char *fmt, ...) const
179 __attribute__ ((__format__ (__printf__, 2, 3)));
180 void log_warning(const
char *fmt, ...) const
181 __attribute__ ((__format__ (__printf__, 2, 3)));
182 void log_error(const
char *fmt, ...) const
183 __attribute__ ((__format__ (__printf__, 2, 3), __noreturn__));
184 void log_hex(const
char *prompt, const
unsigned char *msg,
size_t length) const;
187 virtual
int receive_message_on_fd(
int client_id);
189 virtual
int send_message_on_fd(
int client_id, const
unsigned char* message_buffer,
int message_length);
190 virtual
int send_message_on_nonblocking_fd(
int client_id, const
unsigned char *message_buffer,
int message_length);
192 virtual
void peer_connected(
int client_id, sockaddr_in& remote_addr);
193 virtual
void peer_connected(
int , const
char * , const
int ) {};
195 virtual void peer_disconnected(
int client_id);
197 virtual void peer_half_closed(
int client_id);
199 virtual void report_error(
int client_id,
int msg_length,
int sent_length,
const unsigned char* msg,
const char* error_text);
201 virtual void report_unsent(
int client_id,
int msg_length,
int sent_length,
const unsigned char* msg,
const char* error_text);
204 virtual const char* local_port_name();
205 virtual const char* remote_address_name();
206 virtual const char* local_address_name();
207 virtual const char* remote_port_name();
208 virtual const char* ai_family_name();
209 virtual const char* use_connection_ASPs_name();
210 virtual const char* halt_on_connection_reset_name();
211 virtual const char* client_TCP_reconnect_name();
212 virtual const char* TCP_reconnect_attempts_name();
213 virtual const char* TCP_reconnect_delay_name();
214 virtual const char* server_mode_name();
215 virtual const char* socket_debugging_name();
216 virtual const char* nagling_name();
217 virtual const char* use_non_blocking_socket_name();
218 virtual const char* server_backlog_name();
222 void set_user_data(
int client_id,
void *uptr) {get_peer(client_id)->user_data = uptr;}
224 virtual bool add_user_data(
int client_id);
226 virtual bool remove_user_data(
int client_id);
228 virtual void remove_client(
int client_id);
230 virtual void remove_all_clients();
232 virtual bool user_all_mandatory_configparameters_present();
233 TTCN_Buffer *
get_buffer(
int client_id) {
return get_peer(client_id)->fd_buff; }
239 void peer_list_remove_peer(
int client_id);
241 void peer_list_reset_peer();
247 int peer_list_get_nr_of_peers()
const;
249 int peer_list_get_last_peer()
const;
251 int peer_list_get_first_peer()
const;
255 void handle_message(
int client_id = -1);
256 void all_mandatory_configparameters_present();
275 struct sockaddr_in remoteAddr;
276 struct sockaddr_in localAddr;
284 void peer_list_resize_list(
int client_id);
296 SSL_Socket(
const char *tp_type,
const char *tp_name);
297 virtual ~SSL_Socket();
299 bool parameter_set(
const char * parameter_name,
const char * parameter_value);
302 virtual bool add_user_data(
int client_id);
305 virtual bool remove_user_data(
int client_id);
308 virtual bool user_all_mandatory_configparameters_present();
313 virtual bool ssl_verify_certificates();
319 virtual int ssl_verify_certificates_at_handshake(
int preverify_ok, X509_STORE_CTX *ssl_ctx);
323 virtual int receive_message_on_fd(
int client_id);
327 virtual int send_message_on_fd(
int client_id,
const unsigned char * message_buffer,
int length_of_message);
328 virtual int send_message_on_nonblocking_fd(
int client_id,
const unsigned char * message_buffer,
int length_of_message);
331 bool get_ssl_use_ssl()
const {
return ssl_use_ssl;}
332 bool get_ssl_verifycertificate()
const {
return ssl_verify_certificate;}
333 bool get_ssl_use_session_resumption()
const {
return ssl_use_session_resumption;}
334 bool get_ssl_initialized()
const {
return ssl_initialized;}
335 char * get_ssl_key_file()
const {
return ssl_key_file;}
336 char * get_ssl_certificate_file()
const {
return ssl_certificate_file;}
337 char * get_ssl_trustedCAlist_file()
const {
return ssl_trustedCAlist_file;}
338 char * get_ssl_cipher_list()
const {
return ssl_cipher_list;}
339 char * get_ssl_password()
const;
340 const unsigned char * get_ssl_server_auth_session_id_context()
const {
return ssl_server_auth_session_id_context;}
343 SSL_SESSION* get_current_ssl_session()
const {
return ssl_session;}
344 SSL_CTX * get_current_ssl_ctx()
const {
return ssl_ctx;}
345 SSL * get_current_ssl()
const {
return ssl_current_ssl;}
350 void set_ssl_use_ssl(
bool parameter_value);
351 void set_ssl_verifycertificate(
bool parameter_value);
352 void set_ssl_use_session_resumption(
bool parameter_value);
353 void set_ssl_key_file(
char * parameter_value);
354 void set_ssl_certificate_file(
char * parameter_value);
355 void set_ssl_trustedCAlist_file(
char * parameter_value);
356 void set_ssl_cipher_list(
char * parameter_value);
357 void set_ssl_server_auth_session_id_context(
const unsigned char * parameter_value);
360 virtual const char* ssl_use_ssl_name();
361 virtual const char* ssl_use_session_resumption_name();
362 virtual const char* ssl_private_key_file_name();
363 virtual const char* ssl_trustedCAlist_file_name();
364 virtual const char* ssl_certificate_file_name();
365 virtual const char* ssl_password_name();
366 virtual const char* ssl_cipher_list_name();
367 virtual const char* ssl_verifycertificate_name();
368 virtual const char* ssl_disable_SSLv2();
369 virtual const char* ssl_disable_SSLv3();
370 virtual const char* ssl_disable_TLSv1();
371 virtual const char* ssl_disable_TLSv1_1();
372 virtual const char* ssl_disable_TLSv1_2();
375 bool ssl_verify_certificate;
377 bool ssl_initialized;
378 bool ssl_use_session_resumption;
388 char *ssl_certificate_file;
389 char *ssl_trustedCAlist_file;
390 char *ssl_cipher_list;
392 static const unsigned char * ssl_server_auth_session_id_context;
397 SSL_SESSION *ssl_session;
398 SSL *ssl_current_ssl;
399 static void *ssl_current_client;
401 void ssl_actions_to_seed_PRNG();
403 void ssl_log_SSL_info();
404 int ssl_getresult(
int result_code);
407 static int ssl_password_cb(
char * password_buffer,
int length_of_password,
int rw_flag,
void * user_data);
410 static int ssl_verify_callback(
int preverify_status, X509_STORE_CTX * ssl_context);
void set_ttcn_buffer_usercontrol(bool parameter_value)
Definition: Abstract_Socket.hh:160
bool halt_on_connection_reset
Definition: Abstract_Socket.hh:258
bool get_ttcn_buffer_usercontrol() const
Definition: Abstract_Socket.hh:154
unsigned int get_remote_port_number()
Definition: Abstract_Socket.hh:149
Definition: Abstract_Socket.hh:76
void set_socket_debugging(bool parameter_value)
Definition: Abstract_Socket.hh:158
bool use_non_blocking_socket
Definition: Abstract_Socket.hh:267
bool get_server_mode() const
Definition: Abstract_Socket.hh:132
void set_ai_family(int parameter_value)
Definition: Abstract_Socket.hh:153
unsigned int local_port_number
Definition: Abstract_Socket.hh:270
void * get_user_data(int client_id)
Definition: Abstract_Socket.hh:221
bool handle_half_close
Definition: Abstract_Socket.hh:264
bool get_handle_half_close() const
Definition: Abstract_Socket.hh:136
void * user_data
Definition: Abstract_Socket.hh:79
const struct sockaddr_in & get_remote_addr()
Definition: Abstract_Socket.hh:150
Definition: Abstract_Socket.hh:78
const char * test_port_type
Definition: Abstract_Socket.hh:161
char * local_host_name
Definition: Abstract_Socket.hh:269
bool socket_debugging
Definition: Abstract_Socket.hh:265
TTCN_Buffer * get_buffer(int client_id)
Definition: Abstract_Socket.hh:233
READING_STATES
Definition: Abstract_Socket.hh:76
void set_server_mode(bool parameter_value)
Definition: Abstract_Socket.hh:156
int listen_fd
Definition: Abstract_Socket.hh:279
bool get_nagling() const
Definition: Abstract_Socket.hh:130
void Handle_Timeout_Event(double)
Definition: Abstract_Socket.hh:123
unsigned int get_local_port_number()
Definition: Abstract_Socket.hh:147
void set_halt_on_connection_reset(bool parameter_value)
Definition: Abstract_Socket.hh:159
void set_user_data(int client_id, void *uptr)
Definition: Abstract_Socket.hh:222
unsigned int remote_port_number
Definition: Abstract_Socket.hh:272
TCP_STATES tcp_state
Definition: Abstract_Socket.hh:88
int ai_family
Definition: Abstract_Socket.hh:273
bool get_halt_on_connection_reset() const
Definition: Abstract_Socket.hh:134
READING_STATES reading_state
Definition: Abstract_Socket.hh:89
void set_handle_half_close(bool parameter_value)
Definition: Abstract_Socket.hh:157
Definition: Abstract_Socket.hh:72
int peer_list_get_length() const
Definition: Abstract_Socket.hh:245
bool use_connection_ASPs
Definition: Abstract_Socket.hh:263
char * remote_host_name
Definition: Abstract_Socket.hh:271
bool ttcn_buffer_usercontrol
Definition: Abstract_Socket.hh:268
TTCN_Buffer * fd_buff
Definition: Abstract_Socket.hh:80
TCP_STATES
Definition: Abstract_Socket.hh:75
bool server_mode
Definition: Abstract_Socket.hh:262
const char * get_remote_host_name()
Definition: Abstract_Socket.hh:148
void set_nagling(bool parameter_value)
Definition: Abstract_Socket.hh:155
int clientAddrlen
Definition: Abstract_Socket.hh:87
bool halt_on_connection_reset_set
Definition: Abstract_Socket.hh:257
int TCP_reconnect_attempts
Definition: Abstract_Socket.hh:260
int deadlock_counter
Definition: Abstract_Socket.hh:278
bool nagling
Definition: Abstract_Socket.hh:266
bool get_socket_debugging() const
Definition: Abstract_Socket.hh:133
bool get_use_non_blocking_socket() const
Definition: Abstract_Socket.hh:131
int TCP_reconnect_delay
Definition: Abstract_Socket.hh:261
int get_listen_fd() const
Definition: Abstract_Socket.hh:138
bool client_TCP_reconnect
Definition: Abstract_Socket.hh:259
const char * test_port_name
Definition: Abstract_Socket.hh:162
int peer_list_length
Definition: Abstract_Socket.hh:280
int server_backlog
Definition: Abstract_Socket.hh:277
const char * get_local_host_name()
Definition: Abstract_Socket.hh:146
const int & get_ai_family() const
Definition: Abstract_Socket.hh:152
const struct sockaddr_in & get_local_addr()
Definition: Abstract_Socket.hh:151
bool get_use_connection_ASPs() const
Definition: Abstract_Socket.hh:135
as_client_struct ** peer_list_root
Definition: Abstract_Socket.hh:283