/* * network.h * * Created on: Jul 29, 2017 * Author: wangyu */ #ifndef UDP2RAW_NETWORK_H_ #define UDP2RAW_NETWORK_H_ extern int raw_recv_fd; extern int raw_send_fd; extern int use_tcp_dummy_socket; extern int seq_mode; extern int max_seq_mode; extern int filter_port; // extern u32_t bind_address_uint32; extern int disable_bpf_filter; extern int lower_level; extern int lower_level_manual; extern char if_name[100]; extern char dev[100]; extern unsigned char dest_hw_addr[]; extern int random_drop; extern int ifindex; extern char g_packet_buf[huge_buf_len]; extern int g_packet_buf_len; extern int g_packet_buf_cnt; #ifdef UDP2RAW_MP extern queue_t my_queue; extern ev_async async_watcher; extern struct ev_loop *g_default_loop; extern pthread_mutex_t queue_mutex; extern int use_pcap_mutex; extern int pcap_cnt; extern int pcap_link_header_len; extern int send_with_pcap; extern int pcap_header_captured; extern int pcap_header_buf[buf_len]; struct icmphdr { uint8_t type; uint8_t code; uint16_t check_sum; uint16_t id; uint16_t seq; }; #endif struct my_iphdr { #ifdef UDP2RAW_LITTLE_ENDIAN unsigned char ihl : 4; unsigned char version : 4; #else unsigned char version : 4; unsigned char ihl : 4; #endif u_int8_t tos; u_int16_t tot_len; u_int16_t id; u_int16_t frag_off; u_int8_t ttl; u_int8_t protocol; u_int16_t check; u_int32_t saddr; u_int32_t daddr; /*The options start here. */ }; struct my_udphdr { /*__extension__*/ union { struct { u_int16_t uh_sport; /* source port */ u_int16_t uh_dport; /* destination port */ u_int16_t uh_ulen; /* udp length */ u_int16_t uh_sum; /* udp checksum */ }; struct { u_int16_t source; u_int16_t dest; u_int16_t len; u_int16_t check; }; }; }; struct my_tcphdr { /*__extension__*/ union { struct { u_int16_t th_sport; /* source port */ u_int16_t th_dport; /* destination port */ u_int32_t th_seq; /* sequence number */ u_int32_t th_ack; /* acknowledgement number */ #ifdef UDP2RAW_LITTLE_ENDIAN u_int8_t th_x2 : 4; /* (unused) */ u_int8_t tc_off : 4; /* data offset */ #else u_int8_t th_off : 4; /* data offset */ u_int8_t th_x2 : 4; /* (unused) */ #endif u_int8_t th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 u_int16_t th_win; /* window */ u_int16_t th_sum; /* checksum */ u_int16_t th_urp; /* urgent pointer */ }; struct { u_int16_t source; u_int16_t dest; u_int32_t seq; u_int32_t ack_seq; #ifdef UDP2RAW_LITTLE_ENDIAN u_int16_t res1 : 4; u_int16_t doff : 4; u_int16_t fin : 1; u_int16_t syn : 1; u_int16_t rst : 1; u_int16_t psh : 1; u_int16_t ack : 1; u_int16_t urg : 1; u_int16_t res2 : 2; #else u_int16_t doff : 4; u_int16_t res1 : 4; u_int16_t res2 : 2; u_int16_t urg : 1; u_int16_t ack : 1; u_int16_t psh : 1; u_int16_t rst : 1; u_int16_t syn : 1; u_int16_t fin : 1; #endif u_int16_t window; u_int16_t check; u_int16_t urg_ptr; }; }; }; struct my_ip6hdr { #ifdef UDP2RAW_LITTLE_ENDIAN uint8_t traffic_class_high : 4; uint8_t version : 4; uint8_t flow_label_high : 4; uint8_t traffic_class_low : 4; #else uint8_t version : 4; uint8_t traffic_class_high : 4; uint8_t traffic_class_low : 4; uint8_t flow_label_high : 4; #endif u_int16_t flow_label_low; u_int16_t payload_len; uint8_t next_header; uint8_t hop_limit; struct in6_addr src; struct in6_addr dst; }; struct my_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; }; struct pseudo_header6 { struct in6_addr src; struct in6_addr dst; u_int32_t tcp_length; u_int16_t placeholder1; u_int8_t placeholder2; u_int8_t next_header; }; struct packet_info_t // todo change this to union { uint8_t protocol; // u32_t src_ip; // u32_t dst_ip; my_ip_t new_src_ip; my_ip_t new_dst_ip; uint16_t src_port; uint16_t dst_port; // tcp_part: bool syn, ack, psh, rst; u32_t seq, ack_seq; u32_t ack_seq_counter; u32_t ts, ts_ack; uint16_t my_icmp_seq; bool has_ts; i32_t data_len; #ifdef UDP2RAW_LINUX sockaddr_ll addr_ll; #endif packet_info_t(); }; struct raw_info_t { packet_info_t send_info; packet_info_t recv_info; // int last_send_len; // int last_recv_len; bool peek = 0; // bool csum=1; u32_t reserved_send_seq; // uint32_t first_seq,first_ack_seq; int rst_received = 0; bool disabled = 0; }; // g_raw_info; int init_raw_socket(); void init_filter(int port); void remove_filter(); #ifdef UDP2RAW_LINUX int init_ifindex(const char *if_name, int fd, int &index); #endif #ifdef UDP2RAW_MP int init_ifindex(const char *if_name, int &index); #endif int find_lower_level_info(u32_t ip, u32_t &dest_ip, string &if_name, string &hw); 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 int get_src_adress2(address_t &output_addr, address_t remote_addr); int try_to_list_and_bind(int &bind_fd, u32_t local_ip_uint32, int port); // try to bind to a port,may fail. int try_to_list_and_bind2(int &fd, address_t address); int client_bind_to_a_new_port(int &bind_fd, u32_t local_ip_uint32); // find a free port and bind to it. int client_bind_to_a_new_port2(int &fd, const address_t &address); int discard_raw_packet(); int pre_recv_raw_packet(); int send_raw_ip(raw_info_t &raw_info, const char *payload, int payloadlen); int peek_raw(raw_info_t &peek_info); 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); // int send_raw(raw_info_t &raw_info,const char * payload,int payloadlen); // int recv_raw(raw_info_t &raw_info,char * &payload,int &payloadlen); 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); int after_recv_raw0(raw_info_t &raw_info); #endif /* NETWORK_H_ */