network.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * network.h
  3. *
  4. * Created on: Jul 29, 2017
  5. * Author: wangyu
  6. */
  7. #ifndef UDP2RAW_NETWORK_H_
  8. #define UDP2RAW_NETWORK_H_
  9. extern int raw_recv_fd;
  10. extern int raw_send_fd;
  11. extern int seq_mode;
  12. extern int max_seq_mode;
  13. extern int filter_port;
  14. //extern u32_t bind_address_uint32;
  15. extern int disable_bpf_filter;
  16. extern int lower_level;
  17. extern int lower_level_manual;
  18. extern char if_name[100];
  19. extern char dev[100];
  20. extern unsigned char dest_hw_addr[];
  21. extern int random_drop;
  22. extern int ifindex;
  23. extern char g_packet_buf[buf_len];
  24. extern int g_packet_buf_len;
  25. extern int g_packet_buf_cnt;
  26. struct icmphdr
  27. {
  28. uint8_t type;
  29. uint8_t code;
  30. uint16_t check_sum;
  31. uint16_t id;
  32. uint16_t seq;
  33. };
  34. struct pseudo_header {
  35. u_int32_t source_address;
  36. u_int32_t dest_address;
  37. u_int8_t placeholder;
  38. u_int8_t protocol;
  39. u_int16_t tcp_length;
  40. };
  41. struct packet_info_t //todo change this to union
  42. {
  43. uint8_t protocol;
  44. union tmp_ip_t
  45. {
  46. u32_t v4;
  47. in6_addr v6;
  48. bool equal (const tmp_ip_t &b) const;
  49. char * get_str1() const;
  50. char * get_str2() const;
  51. }ip;
  52. tmp_ip_t new_src_ip;
  53. tmp_ip_t new_dst_ip;
  54. uint16_t src_port;
  55. uint16_t dst_port;
  56. //tcp_part:
  57. bool syn,ack,psh,rst;
  58. u32_t seq,ack_seq;
  59. u32_t ack_seq_counter;
  60. u32_t ts,ts_ack;
  61. uint16_t icmp_seq;
  62. bool has_ts;
  63. sockaddr_ll addr_ll;
  64. i32_t data_len;
  65. packet_info_t();
  66. };
  67. struct raw_info_t
  68. {
  69. packet_info_t send_info;
  70. packet_info_t recv_info;
  71. //int last_send_len;
  72. //int last_recv_len;
  73. u32_t reserved_send_seq;
  74. //uint32_t first_seq,first_ack_seq;
  75. int rst_received=0;
  76. bool disabled=0;
  77. };//g_raw_info;
  78. int init_raw_socket();
  79. void init_filter(int port);
  80. void remove_filter();
  81. int init_ifindex(const char * if_name,int fd,int &index);
  82. int find_lower_level_info(u32_t ip,u32_t &dest_ip,string &if_name,string &hw);
  83. 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
  84. int get_src_adress2(address_t &output_addr,address_t remote_addr);
  85. int try_to_list_and_bind(int & bind_fd,u32_t local_ip_uint32,int port); //try to bind to a port,may fail.
  86. int client_bind_to_a_new_port(int & bind_fd,u32_t local_ip_uint32);//find a free port and bind to it.
  87. int client_bind_to_a_new_port2(int &fd,const address_t& address);
  88. int discard_raw_packet();
  89. int pre_recv_raw_packet();
  90. int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen);
  91. int peek_raw(packet_info_t &peek_info);
  92. int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen);
  93. int send_raw_icmp(raw_info_t &raw_info, const char * payload, int payloadlen);
  94. int send_raw_udp(raw_info_t &raw_info, const char * payload, int payloadlen);
  95. int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen);
  96. int recv_raw_icmp(raw_info_t &raw_info, char *&payload, int &payloadlen);
  97. int recv_raw_udp(raw_info_t &raw_info, char *&payload, int &payloadlen);
  98. int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen);
  99. //int send_raw(raw_info_t &raw_info,const char * payload,int payloadlen);
  100. //int recv_raw(raw_info_t &raw_info,char * &payload,int &payloadlen);
  101. int send_raw0(raw_info_t &raw_info,const char * payload,int payloadlen);
  102. int recv_raw0(raw_info_t &raw_info,char * &payload,int &payloadlen);
  103. int after_send_raw0(raw_info_t &raw_info);
  104. int after_recv_raw0(raw_info_t &raw_info);
  105. #endif /* NETWORK_H_ */