123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- /*
- * 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_ */
|