network.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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 use_tcp_dummy_socket;
  12. extern int seq_mode;
  13. extern int max_seq_mode;
  14. extern int filter_port;
  15. // extern u32_t bind_address_uint32;
  16. extern int disable_bpf_filter;
  17. extern int lower_level;
  18. extern int lower_level_manual;
  19. extern char if_name[100];
  20. extern char dev[100];
  21. extern unsigned char dest_hw_addr[];
  22. extern int random_drop;
  23. extern int ifindex;
  24. extern char g_packet_buf[huge_buf_len];
  25. extern int g_packet_buf_len;
  26. extern int g_packet_buf_cnt;
  27. #ifdef UDP2RAW_MP
  28. extern queue_t my_queue;
  29. extern ev_async async_watcher;
  30. extern struct ev_loop *g_default_loop;
  31. extern pthread_mutex_t queue_mutex;
  32. extern int use_pcap_mutex;
  33. extern int pcap_cnt;
  34. extern int pcap_link_header_len;
  35. extern int send_with_pcap;
  36. extern int pcap_header_captured;
  37. extern int pcap_header_buf[buf_len];
  38. struct icmphdr {
  39. uint8_t type;
  40. uint8_t code;
  41. uint16_t check_sum;
  42. uint16_t id;
  43. uint16_t seq;
  44. };
  45. #endif
  46. struct my_iphdr {
  47. #ifdef UDP2RAW_LITTLE_ENDIAN
  48. unsigned char ihl : 4;
  49. unsigned char version : 4;
  50. #else
  51. unsigned char version : 4;
  52. unsigned char ihl : 4;
  53. #endif
  54. u_int8_t tos;
  55. u_int16_t tot_len;
  56. u_int16_t id;
  57. u_int16_t frag_off;
  58. u_int8_t ttl;
  59. u_int8_t protocol;
  60. u_int16_t check;
  61. u_int32_t saddr;
  62. u_int32_t daddr;
  63. /*The options start here. */
  64. };
  65. struct my_udphdr {
  66. /*__extension__*/ union {
  67. struct
  68. {
  69. u_int16_t uh_sport; /* source port */
  70. u_int16_t uh_dport; /* destination port */
  71. u_int16_t uh_ulen; /* udp length */
  72. u_int16_t uh_sum; /* udp checksum */
  73. };
  74. struct
  75. {
  76. u_int16_t source;
  77. u_int16_t dest;
  78. u_int16_t len;
  79. u_int16_t check;
  80. };
  81. };
  82. };
  83. struct my_tcphdr {
  84. /*__extension__*/ union {
  85. struct
  86. {
  87. u_int16_t th_sport; /* source port */
  88. u_int16_t th_dport; /* destination port */
  89. u_int32_t th_seq; /* sequence number */
  90. u_int32_t th_ack; /* acknowledgement number */
  91. #ifdef UDP2RAW_LITTLE_ENDIAN
  92. u_int8_t th_x2 : 4; /* (unused) */
  93. u_int8_t tc_off : 4; /* data offset */
  94. #else
  95. u_int8_t th_off : 4; /* data offset */
  96. u_int8_t th_x2 : 4; /* (unused) */
  97. #endif
  98. u_int8_t th_flags;
  99. #define TH_FIN 0x01
  100. #define TH_SYN 0x02
  101. #define TH_RST 0x04
  102. #define TH_PUSH 0x08
  103. #define TH_ACK 0x10
  104. #define TH_URG 0x20
  105. u_int16_t th_win; /* window */
  106. u_int16_t th_sum; /* checksum */
  107. u_int16_t th_urp; /* urgent pointer */
  108. };
  109. struct
  110. {
  111. u_int16_t source;
  112. u_int16_t dest;
  113. u_int32_t seq;
  114. u_int32_t ack_seq;
  115. #ifdef UDP2RAW_LITTLE_ENDIAN
  116. u_int16_t res1 : 4;
  117. u_int16_t doff : 4;
  118. u_int16_t fin : 1;
  119. u_int16_t syn : 1;
  120. u_int16_t rst : 1;
  121. u_int16_t psh : 1;
  122. u_int16_t ack : 1;
  123. u_int16_t urg : 1;
  124. u_int16_t res2 : 2;
  125. #else
  126. u_int16_t doff : 4;
  127. u_int16_t res1 : 4;
  128. u_int16_t res2 : 2;
  129. u_int16_t urg : 1;
  130. u_int16_t ack : 1;
  131. u_int16_t psh : 1;
  132. u_int16_t rst : 1;
  133. u_int16_t syn : 1;
  134. u_int16_t fin : 1;
  135. #endif
  136. u_int16_t window;
  137. u_int16_t check;
  138. u_int16_t urg_ptr;
  139. };
  140. };
  141. };
  142. struct my_ip6hdr {
  143. #ifdef UDP2RAW_LITTLE_ENDIAN
  144. uint8_t traffic_class_high : 4;
  145. uint8_t version : 4;
  146. uint8_t flow_label_high : 4;
  147. uint8_t traffic_class_low : 4;
  148. #else
  149. uint8_t version : 4;
  150. uint8_t traffic_class_high : 4;
  151. uint8_t traffic_class_low : 4;
  152. uint8_t flow_label_high : 4;
  153. #endif
  154. u_int16_t flow_label_low;
  155. u_int16_t payload_len;
  156. uint8_t next_header;
  157. uint8_t hop_limit;
  158. struct in6_addr src;
  159. struct in6_addr dst;
  160. };
  161. struct my_icmphdr {
  162. uint8_t type;
  163. uint8_t code;
  164. uint16_t check_sum;
  165. uint16_t id;
  166. uint16_t seq;
  167. };
  168. struct pseudo_header {
  169. u_int32_t source_address;
  170. u_int32_t dest_address;
  171. u_int8_t placeholder;
  172. u_int8_t protocol;
  173. u_int16_t tcp_length;
  174. };
  175. struct pseudo_header6 {
  176. struct in6_addr src;
  177. struct in6_addr dst;
  178. u_int32_t tcp_length;
  179. u_int16_t placeholder1;
  180. u_int8_t placeholder2;
  181. u_int8_t next_header;
  182. };
  183. struct packet_info_t // todo change this to union
  184. {
  185. uint8_t protocol;
  186. // u32_t src_ip;
  187. // u32_t dst_ip;
  188. my_ip_t new_src_ip;
  189. my_ip_t new_dst_ip;
  190. uint16_t src_port;
  191. uint16_t dst_port;
  192. // tcp_part:
  193. bool syn, ack, psh, rst;
  194. u32_t seq, ack_seq;
  195. u32_t ack_seq_counter;
  196. u32_t ts, ts_ack;
  197. uint16_t my_icmp_seq;
  198. bool has_ts;
  199. i32_t data_len;
  200. #ifdef UDP2RAW_LINUX
  201. sockaddr_ll addr_ll;
  202. #endif
  203. packet_info_t();
  204. };
  205. struct raw_info_t {
  206. packet_info_t send_info;
  207. packet_info_t recv_info;
  208. // int last_send_len;
  209. // int last_recv_len;
  210. bool peek = 0;
  211. // bool csum=1;
  212. u32_t reserved_send_seq;
  213. // uint32_t first_seq,first_ack_seq;
  214. int rst_received = 0;
  215. bool disabled = 0;
  216. }; // g_raw_info;
  217. int init_raw_socket();
  218. void init_filter(int port);
  219. void remove_filter();
  220. #ifdef UDP2RAW_LINUX
  221. int init_ifindex(const char *if_name, int fd, int &index);
  222. #endif
  223. #ifdef UDP2RAW_MP
  224. int init_ifindex(const char *if_name, int &index);
  225. #endif
  226. int find_lower_level_info(u32_t ip, u32_t &dest_ip, string &if_name, string &hw);
  227. 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
  228. int get_src_adress2(address_t &output_addr, address_t remote_addr);
  229. int try_to_list_and_bind(int &bind_fd, u32_t local_ip_uint32, int port); // try to bind to a port,may fail.
  230. int try_to_list_and_bind2(int &fd, address_t address);
  231. int client_bind_to_a_new_port(int &bind_fd, u32_t local_ip_uint32); // find a free port and bind to it.
  232. int client_bind_to_a_new_port2(int &fd, const address_t &address);
  233. int discard_raw_packet();
  234. int pre_recv_raw_packet();
  235. int send_raw_ip(raw_info_t &raw_info, const char *payload, int payloadlen);
  236. int peek_raw(raw_info_t &peek_info);
  237. int recv_raw_ip(raw_info_t &raw_info, char *&payload, int &payloadlen);
  238. int send_raw_icmp(raw_info_t &raw_info, const char *payload, int payloadlen);
  239. int send_raw_udp(raw_info_t &raw_info, const char *payload, int payloadlen);
  240. int send_raw_tcp(raw_info_t &raw_info, const char *payload, int payloadlen);
  241. int recv_raw_icmp(raw_info_t &raw_info, char *&payload, int &payloadlen);
  242. int recv_raw_udp(raw_info_t &raw_info, char *&payload, int &payloadlen);
  243. int recv_raw_tcp(raw_info_t &raw_info, char *&payload, int &payloadlen);
  244. // int send_raw(raw_info_t &raw_info,const char * payload,int payloadlen);
  245. // int recv_raw(raw_info_t &raw_info,char * &payload,int &payloadlen);
  246. int send_raw0(raw_info_t &raw_info, const char *payload, int payloadlen);
  247. int recv_raw0(raw_info_t &raw_info, char *&payload, int &payloadlen);
  248. int after_send_raw0(raw_info_t &raw_info);
  249. int after_recv_raw0(raw_info_t &raw_info);
  250. #endif /* NETWORK_H_ */