2017-07-29 12:32:26 +00:00
/*
* network . h
*
* Created on : Jul 29 , 2017
* Author : wangyu
*/
2017-09-01 22:40:55 +00:00
# ifndef UDP2RAW_NETWORK_H_
# define UDP2RAW_NETWORK_H_
2017-07-29 12:32:26 +00:00
extern int raw_recv_fd ;
extern int raw_send_fd ;
extern int seq_mode ;
2017-09-06 10:31:29 +00:00
extern int max_seq_mode ;
2017-07-29 12:32:26 +00:00
extern int filter_port ;
2018-07-17 16:33:02 +00:00
//extern u32_t bind_address_uint32;
2017-07-29 12:32:26 +00:00
extern int disable_bpf_filter ;
2017-08-07 05:58:42 +00:00
extern int lower_level ;
2017-08-21 12:26:55 +00:00
extern int lower_level_manual ;
2017-08-07 05:58:42 +00:00
extern char if_name [ 100 ] ;
2018-07-18 07:02:30 +00:00
extern char dev [ 100 ] ;
2017-08-17 16:23:18 +00:00
extern unsigned char dest_hw_addr [ ] ;
2017-08-07 05:58:42 +00:00
2017-10-11 14:10:38 +00:00
extern int random_drop ;
2017-08-21 12:26:55 +00:00
extern int ifindex ;
2018-07-21 19:23:13 +00:00
extern char g_packet_buf [ buf_len ] ;
extern int g_packet_buf_len ;
extern int g_packet_buf_cnt ;
2018-07-23 14:50:21 +00:00
2017-07-29 12:32:26 +00:00
struct icmphdr
{
uint8_t type ;
uint8_t code ;
uint16_t check_sum ;
uint16_t id ;
uint16_t seq ;
} ;
struct pseudo_header {
u_int32_t source_address ;
u_int32_t dest_address ;
u_int8_t placeholder ;
u_int8_t protocol ;
u_int16_t tcp_length ;
} ;
2017-07-31 11:01:50 +00:00
struct packet_info_t //todo change this to union
2017-07-29 12:32:26 +00:00
{
uint8_t protocol ;
2018-07-22 13:59:09 +00:00
2018-07-23 14:50:21 +00:00
my_ip_t new_src_ip ;
my_ip_t new_dst_ip ;
2018-07-22 13:59:09 +00:00
uint16_t src_port ;
2017-07-29 12:32:26 +00:00
uint16_t dst_port ;
//tcp_part:
bool syn , ack , psh , rst ;
2017-08-04 09:12:23 +00:00
u32_t seq , ack_seq ;
2017-08-01 12:14:13 +00:00
2017-09-06 10:31:29 +00:00
u32_t ack_seq_counter ;
2017-07-29 12:32:26 +00:00
2017-08-04 09:12:23 +00:00
u32_t ts , ts_ack ;
2017-07-29 12:32:26 +00:00
uint16_t icmp_seq ;
bool has_ts ;
2017-08-21 12:26:55 +00:00
sockaddr_ll addr_ll ;
2017-09-06 06:31:29 +00:00
i32_t data_len ;
2017-07-29 19:46:28 +00:00
packet_info_t ( ) ;
2017-07-29 12:32:26 +00:00
} ;
struct raw_info_t
{
packet_info_t send_info ;
packet_info_t recv_info ;
2017-09-06 06:31:29 +00:00
//int last_send_len;
//int last_recv_len;
2017-08-03 15:32:19 +00:00
2017-09-06 06:37:14 +00:00
u32_t reserved_send_seq ;
2017-08-03 15:32:19 +00:00
//uint32_t first_seq,first_ack_seq;
2018-02-24 23:26:29 +00:00
int rst_received = 0 ;
bool disabled = 0 ;
2017-08-01 12:14:13 +00:00
2017-07-29 12:32:26 +00:00
} ; //g_raw_info;
int init_raw_socket ( ) ;
void init_filter ( int port ) ;
void remove_filter ( ) ;
2017-09-23 08:05:23 +00:00
2018-07-18 07:02:30 +00:00
int init_ifindex ( const char * if_name , int fd , int & index ) ;
2017-07-29 12:32:26 +00:00
2017-08-26 10:38:33 +00:00
int find_lower_level_info ( u32_t ip , u32_t & dest_ip , string & if_name , string & hw ) ;
2017-07-29 12:32:26 +00:00
2017-09-23 08:05:23 +00:00
int get_src_adress ( u32_t & ip , u32_t remote_ip_uint32 , int remote_port ) ; //a trick to get src adress for a dest adress,so that we can use the src address in raw socket as source ip
2018-07-17 16:33:02 +00:00
int get_src_adress2 ( address_t & output_addr , address_t remote_addr ) ;
2017-11-01 13:25:50 +00:00
int try_to_list_and_bind ( int & bind_fd , u32_t local_ip_uint32 , int port ) ; //try to bind to a port,may fail.
2017-09-23 08:05:23 +00:00
2017-11-01 13:25:50 +00:00
int client_bind_to_a_new_port ( int & bind_fd , u32_t local_ip_uint32 ) ; //find a free port and bind to it.
2018-07-17 16:33:02 +00:00
int client_bind_to_a_new_port2 ( int & fd , const address_t & address ) ;
2017-09-23 08:05:23 +00:00
2018-07-21 19:23:13 +00:00
int discard_raw_packet ( ) ;
int pre_recv_raw_packet ( ) ;
2017-07-29 12:32:26 +00:00
int send_raw_ip ( raw_info_t & raw_info , const char * payload , int payloadlen ) ;
2017-08-03 15:32:19 +00:00
int peek_raw ( packet_info_t & peek_info ) ;
2017-07-29 12:32:26 +00:00
int recv_raw_ip ( raw_info_t & raw_info , char * & payload , int & payloadlen ) ;
int send_raw_icmp ( raw_info_t & raw_info , const char * payload , int payloadlen ) ;
int send_raw_udp ( raw_info_t & raw_info , const char * payload , int payloadlen ) ;
int send_raw_tcp ( raw_info_t & raw_info , const char * payload , int payloadlen ) ;
int recv_raw_icmp ( raw_info_t & raw_info , char * & payload , int & payloadlen ) ;
int recv_raw_udp ( raw_info_t & raw_info , char * & payload , int & payloadlen ) ;
int recv_raw_tcp ( raw_info_t & raw_info , char * & payload , int & payloadlen ) ;
2017-08-03 19:29:53 +00:00
//int send_raw(raw_info_t &raw_info,const char * payload,int payloadlen);
2017-07-29 12:32:26 +00:00
2017-08-03 19:29:53 +00:00
//int recv_raw(raw_info_t &raw_info,char * &payload,int &payloadlen);
2017-07-29 12:32:26 +00:00
2017-08-03 15:32:19 +00:00
int send_raw0 ( raw_info_t & raw_info , const char * payload , int payloadlen ) ;
int recv_raw0 ( raw_info_t & raw_info , char * & payload , int & payloadlen ) ;
int after_send_raw0 ( raw_info_t & raw_info ) ;
2017-07-29 12:32:26 +00:00
2017-08-03 15:32:19 +00:00
int after_recv_raw0 ( raw_info_t & raw_info ) ;
2017-07-29 12:32:26 +00:00
# endif /* NETWORK_H_ */