main.cpp 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860
  1. #include "common.h"
  2. #include "network.h"
  3. #include "log.h"
  4. char local_address[100]="0.0.0.0", remote_address[100]="255.255.255.255",source_address[100]="0.0.0.0";
  5. uint32_t local_address_uint32,remote_address_uint32,source_address_uint32;
  6. int source_port=0,local_port = -1, remote_port = -1;
  7. id_t const_id=0;
  8. const int disable_conv_clear=0;
  9. const int disable_conn_clear=0;
  10. enum server_current_state_t {server_nothing=0,server_syn_ack_sent,server_handshake_sent,server_ready};
  11. enum client_current_state_t {client_nothing=0,client_syn_sent,client_ack_sent,client_handshake_sent,client_ready};
  12. union current_state_t
  13. {
  14. server_current_state_t server_current_state;
  15. client_current_state_t client_current_state;
  16. };
  17. int udp_fd=-1; //for client only
  18. int bind_fd=-1; //bind only,never send or recv
  19. int epollfd=-1;
  20. int timer_fd=-1;
  21. char key_string[1000]= "secret key";
  22. char key[16],key2[16];
  23. uint64_t current_time_rough=0;
  24. int VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV;
  25. ////////==============================variable divider=============================================================
  26. struct anti_replay_t
  27. {
  28. uint64_t max_packet_received;
  29. char window[anti_replay_window_size];
  30. char disabled;
  31. anti_replay_seq_t anti_replay_seq;
  32. anti_replay_seq_t get_new_seq_for_send()
  33. {
  34. return anti_replay_seq++;
  35. }
  36. anti_replay_t()
  37. {
  38. disabled=0;
  39. max_packet_received=0;
  40. anti_replay_seq=get_true_random_number();
  41. //memset(window,0,sizeof(window)); //not necessary
  42. }
  43. void re_init()
  44. {
  45. disabled=0;
  46. max_packet_received=0;
  47. //memset(window,0,sizeof(window));
  48. }
  49. void disable()
  50. {
  51. disabled=1;
  52. }
  53. void enable()
  54. {
  55. disabled=0;
  56. }
  57. int is_vaild(uint64_t seq)
  58. {
  59. //if(disabled) return 0;
  60. if(seq==max_packet_received) return 0||disabled;
  61. else if(seq>max_packet_received)
  62. {
  63. if(seq-max_packet_received>=anti_replay_window_size)
  64. {
  65. memset(window,0,sizeof(window));
  66. window[seq%anti_replay_window_size]=1;
  67. }
  68. else
  69. {
  70. for (uint32_t i=max_packet_received+1;i<seq;i++)
  71. window[i%anti_replay_window_size]=0;
  72. window[seq%anti_replay_window_size]=1;
  73. }
  74. max_packet_received=seq;
  75. return 1;
  76. }
  77. else if(seq<max_packet_received)
  78. {
  79. if(max_packet_received-seq>=anti_replay_window_size) return 0||disabled;
  80. else
  81. {
  82. if (window[seq%anti_replay_window_size]==1) return 0||disabled;
  83. else
  84. {
  85. window[seq%anti_replay_window_size]=1;
  86. return 1;
  87. }
  88. }
  89. }
  90. return 0; //for complier check
  91. }
  92. };//anti_replay;
  93. void server_clear_function(uint64_t u64);
  94. struct conv_manager_t //TODO change map to unordered map
  95. {
  96. //typedef hash_map map;
  97. unordered_map<uint64_t,uint32_t> u64_to_conv; //conv and u64 are both supposed to be uniq
  98. unordered_map<uint32_t,uint64_t> conv_to_u64;
  99. unordered_map<uint32_t,uint64_t> conv_last_active_time;
  100. unordered_map<uint32_t,uint64_t>::iterator clear_it;
  101. unordered_map<uint32_t,uint64_t>::iterator it;
  102. unordered_map<uint32_t,uint64_t>::iterator old_it;
  103. //void (*clear_function)(uint64_t u64) ;
  104. conv_manager_t()
  105. {
  106. clear_it=conv_last_active_time.begin();
  107. //clear_function=0;
  108. }
  109. ~conv_manager_t()
  110. {
  111. clear();
  112. }
  113. int get_size()
  114. {
  115. return conv_to_u64.size();
  116. }
  117. void reserve()
  118. {
  119. u64_to_conv.reserve(10007);
  120. conv_to_u64.reserve(10007);
  121. conv_last_active_time.reserve(10007);
  122. }
  123. void clear()
  124. {
  125. if(disable_conv_clear) return ;
  126. if(program_mode==server_mode)
  127. {
  128. for(it=conv_to_u64.begin();it!=conv_to_u64.end();it++)
  129. {
  130. //int fd=int((it->second<<32u)>>32u);
  131. server_clear_function( it->second);
  132. }
  133. }
  134. u64_to_conv.clear();
  135. conv_to_u64.clear();
  136. conv_last_active_time.clear();
  137. clear_it=conv_last_active_time.begin();
  138. }
  139. uint32_t get_new_conv()
  140. {
  141. uint32_t conv=get_true_random_number_nz();
  142. while(conv_to_u64.find(conv)!=conv_to_u64.end())
  143. {
  144. conv=get_true_random_number_nz();
  145. }
  146. return conv;
  147. }
  148. int is_conv_used(uint32_t conv)
  149. {
  150. return conv_to_u64.find(conv)!=conv_to_u64.end();
  151. }
  152. int is_u64_used(uint64_t u64)
  153. {
  154. return u64_to_conv.find(u64)!=u64_to_conv.end();
  155. }
  156. uint32_t find_conv_by_u64(uint64_t u64)
  157. {
  158. return u64_to_conv[u64];
  159. }
  160. uint64_t find_u64_by_conv(uint32_t conv)
  161. {
  162. return conv_to_u64[conv];
  163. }
  164. int update_active_time(uint32_t conv)
  165. {
  166. return conv_last_active_time[conv]=current_time_rough;
  167. }
  168. int insert_conv(uint32_t conv,uint64_t u64)
  169. {
  170. u64_to_conv[u64]=conv;
  171. conv_to_u64[conv]=u64;
  172. conv_last_active_time[conv]=current_time_rough;
  173. return 0;
  174. }
  175. int erase_conv(uint32_t conv)
  176. {
  177. if(disable_conv_clear) return 0;
  178. uint64_t u64=conv_to_u64[conv];
  179. if(program_mode==server_mode)
  180. {
  181. server_clear_function(u64);
  182. }
  183. conv_to_u64.erase(conv);
  184. u64_to_conv.erase(u64);
  185. conv_last_active_time.erase(conv);
  186. mylog(log_info,"conv %x cleared\n");
  187. return 0;
  188. }
  189. int clear_inactive()
  190. {
  191. if(disable_conv_clear) return 0;
  192. //map<uint32_t,uint64_t>::iterator it;
  193. int cnt=0;
  194. it=clear_it;
  195. int size=conv_last_active_time.size();
  196. int num_to_clean=size/conv_clear_ratio+conv_clear_min; //clear 1/10 each time,to avoid latency glitch
  197. uint64_t current_time=get_current_time();
  198. for(;;)
  199. {
  200. if(cnt>=num_to_clean) break;
  201. if(conv_last_active_time.begin()==conv_last_active_time.end()) break;
  202. if(it==conv_last_active_time.end())
  203. {
  204. it=conv_last_active_time.begin();
  205. }
  206. if( current_time -it->second >conv_timeout )
  207. {
  208. //mylog(log_info,"inactive conv %u cleared \n",it->first);
  209. old_it=it;
  210. it++;
  211. erase_conv(old_it->first);
  212. }
  213. else
  214. {
  215. it++;
  216. }
  217. cnt++;
  218. }
  219. return 0;
  220. }
  221. };//g_conv_manager;
  222. struct conn_info_t
  223. {
  224. current_state_t state;
  225. raw_info_t raw_info;
  226. long long last_state_time;
  227. long long last_hb_recv_time;
  228. long long last_hb_sent_time;
  229. id_t my_id;
  230. id_t oppsite_id;
  231. conv_manager_t *conv_manager;
  232. anti_replay_t *anti_replay;
  233. int timer_fd;
  234. int retry_counter;
  235. id_t oppsite_const_id;
  236. conn_info_t()
  237. {
  238. //send_packet_info.protocol=g_packet_info_send.protocol;
  239. if(program_mode==server_mode)
  240. state.server_current_state=server_nothing;
  241. else
  242. state.client_current_state=client_nothing;
  243. last_state_time=0;
  244. oppsite_const_id=0;
  245. conv_manager=0;
  246. anti_replay=0;
  247. }
  248. void prepare()
  249. {
  250. conv_manager=new conv_manager_t;
  251. anti_replay=new anti_replay_t;
  252. }
  253. conn_info_t(const conn_info_t&b)
  254. {
  255. //mylog(log_error,"called!!!!!!!!!!!!!\n");
  256. *this=b;
  257. if(conv_manager!=0)
  258. {
  259. conv_manager=new conv_manager_t(*b.conv_manager);
  260. }
  261. if(anti_replay!=0)
  262. {
  263. anti_replay=new anti_replay_t(*b.anti_replay);
  264. }
  265. }
  266. conn_info_t& operator=(const conn_info_t& b)
  267. {
  268. mylog(log_fatal,"not allowed\n");
  269. myexit(-1);
  270. return *this;
  271. }
  272. ~conn_info_t();
  273. };//g_conn_info;
  274. struct conn_manager_t
  275. {
  276. uint32_t ready_num;
  277. unordered_map<int,conn_info_t *> udp_fd_mp; //a bit dirty to used pointer,but can void unordered_map search
  278. unordered_map<int,conn_info_t *> timer_fd_mp;//we can use pointer here since unordered_map.rehash() uses shallow copy
  279. unordered_map<id_t,conn_info_t *> const_id_mp;
  280. unordered_map<uint64_t,conn_info_t*> mp; //put it at end so that it de-consturcts first
  281. unordered_map<uint64_t,conn_info_t*>::iterator clear_it;
  282. conn_manager_t()
  283. {
  284. ready_num=0;
  285. mp.reserve(10007);
  286. clear_it=mp.begin();
  287. timer_fd_mp.reserve(10007);
  288. const_id_mp.reserve(10007);
  289. udp_fd_mp.reserve(100007);
  290. //current_ready_ip=0;
  291. // current_ready_port=0;
  292. }
  293. int exist(uint32_t ip,uint16_t port)
  294. {
  295. uint64_t u64=0;
  296. u64=ip;
  297. u64<<=32u;
  298. u64|=port;
  299. if(mp.find(u64)!=mp.end())
  300. {
  301. return 1;
  302. }
  303. return 0;
  304. }
  305. /*
  306. int insert(uint32_t ip,uint16_t port)
  307. {
  308. uint64_t u64=0;
  309. u64=ip;
  310. u64<<=32u;
  311. u64|=port;
  312. mp[u64];
  313. return 0;
  314. }*/
  315. conn_info_t *& find_insert_p(uint32_t ip,uint16_t port) //be aware,the adress may change after rehash
  316. {
  317. uint64_t u64=0;
  318. u64=ip;
  319. u64<<=32u;
  320. u64|=port;
  321. unordered_map<uint64_t,conn_info_t*>::iterator it=mp.find(u64);
  322. if(it==mp.end())
  323. {
  324. mp[u64]=new conn_info_t;
  325. }
  326. return mp[u64];
  327. }
  328. conn_info_t & find_insert(uint32_t ip,uint16_t port) //be aware,the adress may change after rehash
  329. {
  330. uint64_t u64=0;
  331. u64=ip;
  332. u64<<=32u;
  333. u64|=port;
  334. unordered_map<uint64_t,conn_info_t*>::iterator it=mp.find(u64);
  335. if(it==mp.end())
  336. {
  337. mp[u64]=new conn_info_t;
  338. }
  339. return *mp[u64];
  340. }
  341. int erase(unordered_map<uint64_t,conn_info_t*>::iterator erase_it)
  342. {
  343. if(erase_it->second->state.server_current_state==server_ready)
  344. {
  345. ready_num--;
  346. const_id_mp.erase(erase_it->second->oppsite_const_id);
  347. timer_fd_mp.erase(erase_it->second->timer_fd);
  348. close(erase_it->second->timer_fd);// close will auto delte it from epoll
  349. delete(erase_it->second);
  350. mp.erase(erase_it->first);
  351. }
  352. return 0;
  353. }
  354. int clear_inactive()
  355. {
  356. unordered_map<uint64_t,conn_info_t*>::iterator it;
  357. unordered_map<uint64_t,conn_info_t*>::iterator old_it;
  358. if(disable_conn_clear) return 0;
  359. //map<uint32_t,uint64_t>::iterator it;
  360. int cnt=0;
  361. it=clear_it;
  362. int size=mp.size();
  363. int num_to_clean=size/conn_clear_ratio+conn_clear_min; //clear 1/10 each time,to avoid latency glitch
  364. uint64_t current_time=get_current_time();
  365. for(;;)
  366. {
  367. if(cnt>=num_to_clean) break;
  368. if(mp.begin()==mp.end()) break;
  369. if(it==mp.end())
  370. {
  371. it=mp.begin();
  372. }
  373. if(it->second->state.server_current_state==server_ready&& current_time - it->second->last_hb_recv_time <=server_conn_timeout )
  374. {
  375. it++;
  376. }
  377. else if(it->second->state.server_current_state!=server_ready&& current_time - it->second->last_state_time <=server_handshake_timeout )
  378. {
  379. it++;
  380. }
  381. else if(it->second->conv_manager!=0&&it->second->conv_manager->get_size() >0)
  382. {
  383. if(it->second->state.server_current_state!=server_ready)
  384. {
  385. mylog(log_fatal,"this shouldnt happen!\n");
  386. myexit(-1);
  387. }
  388. it++;
  389. }
  390. else
  391. {
  392. //mylog(log_info,"inactive conv %u cleared \n",it->first);
  393. old_it=it;
  394. it++;
  395. erase(old_it);
  396. }
  397. cnt++;
  398. }
  399. return 0;
  400. }
  401. }conn_manager;
  402. conn_info_t::~conn_info_t()
  403. {
  404. if(oppsite_const_id!=0)
  405. conn_manager.const_id_mp.erase(oppsite_const_id);
  406. if(conv_manager!=0)
  407. delete conv_manager;
  408. if(anti_replay!=0)
  409. delete anti_replay;
  410. //send_packet_info.protocol=g_packet_info_send.protocol;
  411. }
  412. int TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
  413. ////////==========================type divider=======================================================
  414. /*
  415. int pre_send_deprecate(char * data, int &data_len)
  416. {
  417. const int disable_encrypt=0;
  418. const int disable_anti_replay=0;
  419. char replay_buf[buf_len];
  420. //return 0;
  421. if(data_len<0) return -3;
  422. if(disable_encrypt&&disable_anti_replay) return 0;
  423. if(!disable_anti_replay)
  424. {
  425. anti_replay_seq++;
  426. uint32_t seq_high= htonl(anti_replay_seq>>32u);
  427. uint32_t seq_low= htonl((anti_replay_seq<<32u)>>32u);
  428. memcpy(replay_buf,&seq_high,sizeof(uint32_t));
  429. memcpy(replay_buf+sizeof(uint32_t),&seq_low,sizeof(uint32_t));
  430. memcpy(replay_buf+sizeof(uint32_t)*2,data,data_len);
  431. data_len+=sizeof(uint32_t)*2;
  432. }
  433. else
  434. {
  435. memcpy(replay_buf,data,data_len);
  436. }
  437. if(!disable_encrypt)
  438. {
  439. if(my_encrypt(replay_buf,data,data_len,key2) <0)
  440. {
  441. mylog(log_debug,"encrypt fail\n");
  442. return -1;
  443. }
  444. }
  445. else
  446. {
  447. memcpy(data,replay_buf,data_len);
  448. }
  449. return 0;
  450. }
  451. int pre_recv_deprecated(char * data, int &data_len)
  452. {
  453. const int disable_encrypt=0;
  454. const int disable_anti_replay=0;
  455. char replay_buf[buf_len];
  456. //return 0;
  457. if(data_len<0) return -1;
  458. if(disable_encrypt&&disable_anti_replay) return 0;
  459. if(!disable_encrypt)
  460. {
  461. if(my_decrypt(data,replay_buf,data_len,key2) <0)
  462. {
  463. mylog(log_debug,"decrypt fail\n");
  464. return -1;
  465. }
  466. else
  467. {
  468. mylog(log_debug,"decrypt succ\n");
  469. }
  470. }
  471. else
  472. {
  473. memcpy(replay_buf,data,data_len);
  474. }
  475. if(!disable_anti_replay)
  476. {
  477. data_len-=sizeof(uint32_t)*2;
  478. if(data_len<0)
  479. {
  480. mylog(log_debug,"data_len<=0\n");
  481. return -2;
  482. }
  483. uint64_t seq_high= ntohl(*((uint32_t*)(replay_buf) ) );
  484. uint32_t seq_low= ntohl(*((uint32_t*)(replay_buf+sizeof(uint32_t)) ) );
  485. uint64_t recv_seq =(seq_high<<32u )+seq_low;
  486. if((program_mode==client_mode&&client_current_state==client_ready)
  487. ||(program_mode==server_mode&&server_current_state==server_ready ))
  488. {
  489. if(data_len<sizeof(uint32_t)*2+1)
  490. {
  491. mylog(log_debug,"no room for session id and oppiste session_id\n");
  492. return -4;
  493. }
  494. uint32_t tmp_oppiste_session_id = ntohl(
  495. *((uint32_t*) (replay_buf + sizeof(uint32_t) * 2+1)));
  496. uint32_t tmp_session_id = ntohl(
  497. *((uint32_t*) (replay_buf + sizeof(uint32_t) * 3+1)));
  498. if (tmp_oppiste_session_id != oppsite_id
  499. || tmp_session_id != my_id) {
  500. mylog(log_debug,"auth fail and pre send\n");
  501. return -5;
  502. }
  503. mylog(log_debug,"seq=========%u\n", recv_seq);
  504. if (anti_replay.is_vaild(recv_seq) != 1) {
  505. mylog(log_info,"dropped replay packet\n");
  506. return -1;
  507. }
  508. }
  509. mylog(log_trace,"<<<<<%ld,%d,%ld>>>>\n",seq_high,seq_low,recv_seq);
  510. memcpy(data,replay_buf+sizeof(uint32_t)*2,data_len);
  511. }
  512. else
  513. {
  514. memcpy(data,replay_buf,data_len);
  515. }
  516. return 0;
  517. }*/
  518. void server_clear_function(uint64_t u64)
  519. {
  520. int fd=int(u64);
  521. int ret;
  522. /*
  523. epoll_event ev;
  524. ev.events = EPOLLIN;
  525. ev.data.u64 = u64;
  526. ret = epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, &ev);
  527. if (ret!=0)
  528. {
  529. mylog(log_fatal,"fd:%d epoll delete failed!!!!\n",fd);
  530. myexit(-1); //this shouldnt happen
  531. }*/ //no need
  532. ret= close(fd); //closed fd should be auto removed from epoll
  533. if (ret!=0)
  534. {
  535. mylog(log_fatal,"close fd %d failed !!!!\n",fd);
  536. myexit(-1); //this shouldnt happen
  537. }
  538. //mylog(log_fatal,"size:%d !!!!\n",conn_manager.udp_fd_mp.size());
  539. conn_manager.udp_fd_mp.erase(udp_fd);
  540. }
  541. int send_bare(raw_info_t &raw_info,const char* data,int len)
  542. {
  543. packet_info_t &send_info=raw_info.send_info;
  544. packet_info_t &recv_info=raw_info.recv_info;
  545. char send_data_buf[buf_len]; //buf for send data and send hb
  546. char send_data_buf2[buf_len];
  547. if(len==0) //dont encrpyt zero length packet;
  548. {
  549. send_raw(raw_info,data,len);
  550. return 0;
  551. }
  552. //static send_bare[buf_len];
  553. iv_t iv=get_true_random_number_64();
  554. memcpy(send_data_buf,&iv,sizeof(iv_t));
  555. memcpy(send_data_buf+sizeof(iv_t),data,len);
  556. int new_len=len+sizeof(iv_t);
  557. if(my_encrypt(send_data_buf,send_data_buf2,new_len,key)!=0)
  558. {
  559. return -1;
  560. }
  561. send_raw(raw_info,send_data_buf2,new_len);
  562. return 0;
  563. }
  564. int parse_bare(const char *input,int input_len,char* & data,int & len) //allow overlap
  565. {
  566. static char recv_data_buf[buf_len];
  567. if(len==0) //dont decrpyt zero length packet;
  568. {
  569. return 0;
  570. }
  571. if(my_decrypt(input,recv_data_buf,input_len,key)!=0)
  572. {
  573. mylog(log_debug,"decrypt_fail in recv bare\n");
  574. return -1;
  575. }
  576. len=input_len;
  577. data=recv_data_buf+sizeof(iv_t);
  578. len-=sizeof(iv_t);
  579. return 0;
  580. }
  581. int recv_bare(raw_info_t &raw_info,char* & data,int & len)
  582. {
  583. packet_info_t &send_info=raw_info.send_info;
  584. packet_info_t &recv_info=raw_info.recv_info;
  585. if(recv_raw(raw_info,data,len)<0)
  586. {
  587. //printf("recv_raw_fail in recv bare\n");
  588. return -1;
  589. }
  590. parse_bare(data,len,data,len);
  591. return 0;
  592. }
  593. int send_handshake(raw_info_t &raw_info,id_t id1,id_t id2,id_t id3)
  594. {
  595. packet_info_t &send_info=raw_info.send_info;
  596. packet_info_t &recv_info=raw_info.recv_info;
  597. char * data;int len;
  598. //len=sizeof(id_t)*3;
  599. if(numbers_to_char(id1,id2,id3,data,len)!=0) return -1;
  600. if(send_bare(raw_info,data,len)!=0) {mylog(log_warn,"send bare fail\n");return -1;}
  601. return 0;
  602. }
  603. /*
  604. int recv_handshake(packet_info_t &info,id_t &id1,id_t &id2,id_t &id3)
  605. {
  606. char * data;int len;
  607. if(recv_bare(info,data,len)!=0) return -1;
  608. if(char_to_numbers(data,len,id1,id2,id3)!=0) return -1;
  609. return 0;
  610. }*/
  611. int send_safer(conn_info_t &conn_info,const char* data,int len)
  612. {
  613. packet_info_t &send_info=conn_info.raw_info.send_info;
  614. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  615. char send_data_buf[buf_len]; //buf for send data and send hb
  616. char send_data_buf2[buf_len];
  617. id_t n_tmp_id=htonl(conn_info.my_id);
  618. memcpy(send_data_buf,&n_tmp_id,sizeof(n_tmp_id));
  619. n_tmp_id=htonl(conn_info.oppsite_id);
  620. memcpy(send_data_buf+sizeof(n_tmp_id),&n_tmp_id,sizeof(n_tmp_id));
  621. anti_replay_seq_t n_seq=hton64(conn_info.anti_replay->get_new_seq_for_send());
  622. memcpy(send_data_buf+sizeof(n_tmp_id)*2,&n_seq,sizeof(n_seq));
  623. memcpy(send_data_buf+sizeof(n_tmp_id)*2+sizeof(n_seq),data,len);//data;
  624. int new_len=len+sizeof(n_seq)+sizeof(n_tmp_id)*2;
  625. if(my_encrypt(send_data_buf,send_data_buf2,new_len,key2)!=0)
  626. {
  627. return -1;
  628. }
  629. send_raw(conn_info.raw_info,send_data_buf2,new_len);
  630. return 0;
  631. }
  632. int send_data_safer(conn_info_t &conn_info,const char* data,int len,uint32_t conv_num)
  633. {
  634. packet_info_t &send_info=conn_info.raw_info.send_info;
  635. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  636. char send_data_buf[buf_len];
  637. send_data_buf[0]='d';
  638. uint32_t n_conv_num=htonl(conv_num);
  639. memcpy(send_data_buf+1,&n_conv_num,sizeof(n_conv_num));
  640. memcpy(send_data_buf+1+sizeof(n_conv_num),data,len);
  641. int new_len=len+1+sizeof(n_conv_num);
  642. send_safer(conn_info,send_data_buf,new_len);
  643. return 0;
  644. }
  645. int parse_safer(conn_info_t &conn_info,const char * input,int input_len,char* &data,int &len)//allow overlap
  646. {
  647. static char recv_data_buf0[buf_len];
  648. char *recv_data_buf=recv_data_buf0; //fix strict alias warning
  649. if(my_decrypt(input,recv_data_buf,input_len,key2)!=0)
  650. {
  651. //printf("decrypt fail\n");
  652. return -1;
  653. }
  654. //char *a=recv_data_buf;
  655. id_t h_oppiste_id= ntohl ( *((id_t * )(recv_data_buf)) );
  656. id_t h_my_id= ntohl ( *((id_t * )(recv_data_buf+sizeof(id_t))) );
  657. anti_replay_seq_t h_seq= ntoh64 ( *((anti_replay_seq_t * )(recv_data_buf +sizeof(id_t) *2 )) );
  658. if(h_oppiste_id!=conn_info.oppsite_id||h_my_id!=conn_info.my_id)
  659. {
  660. mylog(log_warn,"id and oppsite_id verification failed %x %x %x %x \n",h_oppiste_id,conn_info.oppsite_id,h_my_id,conn_info.my_id);
  661. return -1;
  662. }
  663. if (conn_info.anti_replay->is_vaild(h_seq) != 1) {
  664. mylog(log_warn,"dropped replay packet\n");
  665. return -1;
  666. }
  667. //printf("recv _len %d\n ",recv_len);
  668. data=recv_data_buf+sizeof(anti_replay_seq_t)+sizeof(id_t)*2;
  669. len=input_len-(sizeof(anti_replay_seq_t)+sizeof(id_t)*2 );
  670. if(len<0)
  671. {
  672. mylog(log_error,"len <0 ,%d\n",len);
  673. return -1;
  674. }
  675. return 0;
  676. }
  677. int recv_safer(conn_info_t &conn_info,char* &data,int &len)
  678. {
  679. packet_info_t &send_info=conn_info.raw_info.send_info;
  680. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  681. char * recv_data;int recv_len;
  682. static char recv_data_buf[buf_len];
  683. if(recv_raw(conn_info.raw_info,recv_data,recv_len)!=0) return -1;
  684. return parse_safer(conn_info,recv_data,recv_len,data,len);
  685. }
  686. int try_to_list_and_bind(int port)
  687. {
  688. int old_bind_fd=bind_fd;
  689. if(raw_mode==mode_faketcp)
  690. {
  691. bind_fd=socket(AF_INET,SOCK_STREAM,0);
  692. }
  693. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  694. {
  695. bind_fd=socket(AF_INET,SOCK_DGRAM,0);
  696. }
  697. if(old_bind_fd!=-1)
  698. {
  699. close(old_bind_fd);
  700. }
  701. struct sockaddr_in temp_bind_addr;
  702. bzero(&temp_bind_addr, sizeof(temp_bind_addr));
  703. temp_bind_addr.sin_family = AF_INET;
  704. temp_bind_addr.sin_port = htons(port);
  705. temp_bind_addr.sin_addr.s_addr = local_address_uint32;
  706. if (bind(bind_fd, (struct sockaddr*)&temp_bind_addr, sizeof(temp_bind_addr)) !=0)
  707. {
  708. mylog(log_debug,"bind fail\n");
  709. return -1;
  710. }
  711. if(raw_mode==mode_faketcp)
  712. {
  713. if (listen(bind_fd, SOMAXCONN) != 0) {
  714. mylog(log_warn,"listen fail\n");
  715. return -1;
  716. }
  717. }
  718. return 0;
  719. }
  720. int client_bind_to_a_new_port()
  721. {
  722. int raw_send_port=10000+get_true_random_number()%(65535-10000);
  723. for(int i=0;i<1000;i++)//try 1000 times at max,this should be enough
  724. {
  725. if (try_to_list_and_bind(raw_send_port)==0)
  726. {
  727. return raw_send_port;
  728. }
  729. }
  730. mylog(log_fatal,"bind port fail\n");
  731. myexit(-1);
  732. return -1;////for compiler check
  733. }
  734. int keep_connection_client(conn_info_t &conn_info) //for client
  735. {
  736. packet_info_t &send_info=conn_info.raw_info.send_info;
  737. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  738. raw_info_t &raw_info=conn_info.raw_info;
  739. current_time_rough=get_current_time();
  740. conn_info.conv_manager->clear_inactive();
  741. mylog(log_trace,"timer!\n");
  742. //begin:
  743. if(conn_info.state.client_current_state==client_nothing)
  744. {
  745. conn_info.anti_replay->re_init(); // this is not safe
  746. if(raw_mode==mode_icmp)
  747. {
  748. remove_filter();
  749. }
  750. if(source_port==0)
  751. {
  752. send_info.src_port = client_bind_to_a_new_port();
  753. }
  754. else
  755. {
  756. send_info.src_port=source_port;
  757. }
  758. if(raw_mode==mode_icmp)
  759. {
  760. send_info.dst_port =send_info.src_port ;
  761. }
  762. mylog(log_info,"using port %d\n", send_info.src_port);
  763. init_filter(send_info.src_port);
  764. if(raw_mode==mode_faketcp)
  765. {
  766. conn_info.state.client_current_state = client_syn_sent;
  767. conn_info.last_state_time = get_current_time();
  768. mylog(log_info,"state changed from nothing to syn_sent %d\n",conn_info.state.client_current_state);
  769. conn_info.retry_counter = RETRY_TIME;
  770. send_info.seq = get_true_random_number();
  771. send_info.ack_seq = 0; //get_true_random_number();
  772. send_info.ts_ack = 0;
  773. send_info.ack = 0;
  774. send_info.syn = 1;
  775. send_info.psh = 0;
  776. send_bare(raw_info, 0, 0); /////////////send
  777. }
  778. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  779. {
  780. conn_info.state.client_current_state = client_ack_sent;
  781. conn_info.last_state_time = get_current_time();
  782. mylog(log_info,"state changed from nothing to ack_sent\n");
  783. conn_info.retry_counter = RETRY_TIME;
  784. send_info.icmp_seq=0;
  785. send_bare(raw_info, (char*)"hello", strlen("hello"));/////////////send
  786. }
  787. return 0;
  788. }
  789. if(conn_info.state.client_current_state==client_syn_sent &&get_current_time()-conn_info.last_state_time>client_handshake_timeout)
  790. {
  791. if(conn_info.retry_counter==0)
  792. {
  793. conn_info.state.client_current_state=client_nothing;
  794. mylog(log_info,"state back to nothing\n");
  795. return 0;
  796. //goto begin;
  797. }
  798. else
  799. {
  800. conn_info.retry_counter--;
  801. mylog(log_info,"retry send sync\n");
  802. send_bare(raw_info,0,0); /////////////send
  803. conn_info.last_state_time=get_current_time();
  804. }
  805. }
  806. if(conn_info.state.client_current_state==client_ack_sent &&get_current_time()-conn_info.last_state_time>client_handshake_timeout)
  807. {
  808. if(conn_info.retry_counter==0)
  809. {
  810. conn_info.state.client_current_state=client_nothing;
  811. mylog(log_info,"state back to nothing\n");
  812. return 0;
  813. //goto begin;
  814. }
  815. else
  816. {
  817. conn_info.retry_counter--;
  818. if(raw_mode==mode_faketcp)
  819. {
  820. send_bare(raw_info,0,0);/////////////send
  821. }
  822. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  823. {
  824. send_bare(raw_info, (char*)"hello", strlen("hello"));/////////////send
  825. }
  826. conn_info.last_state_time=get_current_time();
  827. mylog(log_info,"retry send ack counter left:%d\n",conn_info.retry_counter);
  828. }
  829. }
  830. if(conn_info.state.client_current_state==client_handshake_sent&&get_current_time()-conn_info.last_state_time>client_handshake_timeout)
  831. {
  832. if(conn_info.retry_counter==0)
  833. {
  834. conn_info.state.client_current_state=client_nothing;
  835. mylog(log_info,"state back to nothing\n");
  836. return 0;
  837. //goto begin;
  838. }
  839. else
  840. {
  841. conn_info.retry_counter--;
  842. send_handshake(raw_info,conn_info.my_id,conn_info.oppsite_id,const_id);/////////////send
  843. conn_info.last_state_time=get_current_time();
  844. mylog(log_info,"retry send handshake counter left:%d\n",conn_info.retry_counter);
  845. mylog(log_info,"handshake sent <%x,%x>\n",conn_info.oppsite_id,conn_info.my_id);
  846. }
  847. }
  848. if(conn_info.state.client_current_state==client_ready)
  849. {
  850. mylog(log_trace,"time %lld %lld\n",get_current_time(),conn_info.last_state_time);
  851. if(get_current_time()-conn_info.last_hb_recv_time>client_conn_timeout)
  852. {
  853. conn_info.state.client_current_state=client_nothing;
  854. conn_info.my_id=get_true_random_number_nz();
  855. mylog(log_info,"state back to nothing\n");
  856. return 0;
  857. }
  858. if(get_current_time()-conn_info.last_hb_sent_time<heartbeat_interval)
  859. {
  860. return 0;
  861. }
  862. mylog(log_trace,"heartbeat sent <%x,%x>\n",conn_info.oppsite_id,conn_info.my_id);
  863. send_safer(conn_info,(char *)"h",1);/////////////send
  864. conn_info.last_hb_sent_time=get_current_time();
  865. }
  866. return 0;
  867. }
  868. int keep_connection_server_multi(conn_info_t &conn_info)
  869. {
  870. mylog(log_trace,"server timer!\n");
  871. raw_info_t &raw_info=conn_info.raw_info;
  872. if(conn_info.state.server_current_state==server_ready)
  873. {
  874. conn_info.conv_manager->clear_inactive();
  875. /*
  876. if( get_current_time()-conn_info.last_hb_recv_time>heartbeat_timeout )
  877. {
  878. mylog(log_trace,"%lld %lld\n",get_current_time(),conn_info.last_state_time);
  879. conn_info.server_current_state=server_nothing;
  880. //conn_manager.current_ready_ip=0;
  881. //conn_manager.current_ready_port=0;
  882. mylog(log_info,"changed state to server_nothing\n");
  883. return 0;
  884. }*/ //dont need to do this at server,conn_manger will clear expired connections
  885. if(get_current_time()-conn_info.last_hb_sent_time<heartbeat_interval)
  886. {
  887. return 0;
  888. }
  889. send_safer(conn_info,(char *)"h",1); /////////////send
  890. conn_info.last_hb_sent_time=get_current_time();
  891. mylog(log_trace,"heart beat sent<%x>\n",conn_info.my_id);
  892. }
  893. return 0;
  894. }
  895. /*
  896. int keep_connection_server()
  897. {
  898. current_time_rough=get_current_time();
  899. conv_manager.clean_inactive();
  900. //begin:
  901. mylog(log_trace,"timer!\n");
  902. if(server_current_state==server_nothing)
  903. {
  904. return 0;
  905. }
  906. if(server_current_state==server_syn_ack_sent &&get_current_time()-last_state_time>handshake_timeout )
  907. {
  908. if(retry_counter==0)
  909. {
  910. server_current_state=server_nothing;
  911. mylog(log_info,"state back to nothing\n");
  912. }
  913. else
  914. {
  915. retry_counter--;
  916. send_bare(g_packet_info_send,0,0); /////////////send
  917. last_state_time=get_current_time();
  918. mylog(log_info,"resend syn ack\n");
  919. }
  920. }
  921. if(server_current_state==server_handshake_sent &&get_current_time()-last_state_time>handshake_timeout)
  922. {
  923. if(retry_counter==0)
  924. {
  925. server_current_state=server_nothing;
  926. mylog(log_info,"state back to nothing\n");
  927. }
  928. else
  929. {
  930. retry_counter--;
  931. send_handshake(g_packet_info_send,my_id,random(),const_id); /////////////send
  932. last_state_time=get_current_time();
  933. mylog(log_info,"handshake sent<%x>\n",my_id);
  934. }
  935. }
  936. if(server_current_state==server_ready)
  937. {
  938. if( get_current_time()-last_hb_recv_time>heartbeat_timeout )
  939. {
  940. mylog(log_trace,"%lld %lld\n",get_current_time(),last_state_time);
  941. server_current_state=server_nothing;
  942. mylog(log_info,"changed server id\n");
  943. my_id=get_true_random_number_nz();
  944. mylog(log_info,"changed state to server_nothing\n");
  945. return 0;
  946. }
  947. if(get_current_time()-last_hb_sent_time<heartbeat_interval)
  948. {
  949. return 0;
  950. }
  951. //printf("heart beat sent\n");
  952. send_safer(g_packet_info_send,(char *)"h",1); /////////////send
  953. last_hb_sent_time=get_current_time();
  954. mylog(log_trace,"heart beat sent<%x>\n",my_id);
  955. }
  956. }
  957. */
  958. int set_timer(int epollfd,int &timer_fd)
  959. {
  960. int ret;
  961. epoll_event ev;
  962. itimerspec its;
  963. memset(&its,0,sizeof(its));
  964. if((timer_fd=timerfd_create(CLOCK_MONOTONIC,TFD_NONBLOCK)) < 0)
  965. {
  966. mylog(log_fatal,"timer_fd create error\n");
  967. myexit(1);
  968. }
  969. its.it_interval.tv_sec=(timer_interval/1000);
  970. its.it_interval.tv_nsec=(timer_interval%1000)*1000ll*1000ll;
  971. its.it_value.tv_nsec=1; //imidiately
  972. timerfd_settime(timer_fd,0,&its,0);
  973. ev.events = EPOLLIN;
  974. ev.data.u64 = timer_fd;
  975. ret=epoll_ctl(epollfd, EPOLL_CTL_ADD, timer_fd, &ev);
  976. if (ret < 0) {
  977. mylog(log_fatal,"epoll_ctl return %d\n", ret);
  978. myexit(-1);
  979. }
  980. return 0;
  981. }
  982. int set_timer_server(int epollfd,int &timer_fd)
  983. {
  984. int ret;
  985. epoll_event ev;
  986. itimerspec its;
  987. memset(&its,0,sizeof(its));
  988. if((timer_fd=timerfd_create(CLOCK_MONOTONIC,TFD_NONBLOCK)) < 0)
  989. {
  990. mylog(log_fatal,"timer_fd create error\n");
  991. myexit(1);
  992. }
  993. its.it_interval.tv_sec=(timer_interval/1000);
  994. its.it_interval.tv_nsec=(timer_interval%1000)*1000ll*1000ll;
  995. its.it_value.tv_nsec=1; //imidiately
  996. timerfd_settime(timer_fd,0,&its,0);
  997. ev.events = EPOLLIN;
  998. ev.data.u64 = pack_u64(2,timer_fd);
  999. ret=epoll_ctl(epollfd, EPOLL_CTL_ADD, timer_fd, &ev);
  1000. if (ret < 0) {
  1001. mylog(log_fatal,"epoll_ctl return %d\n", ret);
  1002. myexit(-1);
  1003. }
  1004. return 0;
  1005. }
  1006. int client_on_raw_recv(conn_info_t &conn_info)
  1007. {
  1008. char* data;int data_len;
  1009. packet_info_t &send_info=conn_info.raw_info.send_info;
  1010. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  1011. raw_info_t &raw_info=conn_info.raw_info;
  1012. if(conn_info.state.client_current_state==client_nothing )
  1013. {
  1014. recv_raw(raw_info,data,data_len);//todo change it to something else faster
  1015. }
  1016. if(conn_info.state.client_current_state==client_syn_sent )
  1017. {
  1018. if(recv_bare(raw_info,data,data_len)!=0)
  1019. {
  1020. mylog(log_debug,"recv_bare failed!\n");
  1021. return -1;
  1022. }
  1023. if (raw_mode==mode_faketcp&&!(recv_info.syn==1&&recv_info.ack==1&&data_len==0))
  1024. {
  1025. mylog(log_debug,"%d %d %d \n",recv_info.syn,recv_info.ack,data_len);
  1026. }
  1027. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1028. {
  1029. mylog(log_debug,"unexpected adress %x %x %d %d\n",recv_info.src_ip,send_info.dst_ip,recv_info.src_port,send_info.dst_port);
  1030. return 0;
  1031. }
  1032. send_info.ack_seq=recv_info.seq+1;
  1033. send_info.psh=0;
  1034. send_info.syn=0;
  1035. send_info.ack=1;
  1036. send_info.seq+=1;
  1037. mylog(log_info,"sent ack back\n");
  1038. send_raw(raw_info,0,0);
  1039. conn_info.state.client_current_state=client_ack_sent;
  1040. conn_info.last_state_time=get_current_time();
  1041. conn_info.retry_counter=RETRY_TIME;
  1042. mylog(log_info,"changed state to client_ack_sent\n");
  1043. }
  1044. if(conn_info.state.client_current_state==client_ack_sent )
  1045. {
  1046. if(recv_bare(raw_info,data,data_len)!=0)
  1047. {
  1048. mylog(log_debug,"recv_bare failed!\n");
  1049. return -1;
  1050. }
  1051. if(raw_mode==mode_faketcp&& (recv_info.syn==1||recv_info.ack!=1 ||data_len==0))
  1052. {
  1053. mylog(log_debug,"unexpected syn ack or other zero lenght packet\n");
  1054. return 0;
  1055. }
  1056. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1057. {
  1058. mylog(log_debug,"unexpected adress %x %x %d %d\n",recv_info.src_ip,send_info.dst_ip,recv_info.src_port,send_info.dst_port);
  1059. return 0;
  1060. }
  1061. /*
  1062. if(data_len<hb_length||data[0]!='h')
  1063. {
  1064. printf("not a heartbeat\n");
  1065. return 0;
  1066. }*/
  1067. conn_info.oppsite_id= ntohl(* ((uint32_t *)&data[0]));
  1068. mylog(log_info,"handshake received %x\n",conn_info.oppsite_id);
  1069. mylog(log_info,"changed state to client_handshake_sent\n");
  1070. send_handshake(raw_info,conn_info.my_id,conn_info.oppsite_id,const_id);
  1071. mylog(log_info,"<<handshake sent %x %d>>\n",conn_info.my_id,conn_info.oppsite_id);
  1072. conn_info.state.client_current_state=client_handshake_sent;
  1073. conn_info.last_state_time=get_current_time();
  1074. conn_info.retry_counter=RETRY_TIME;
  1075. }
  1076. if(conn_info.state.client_current_state==client_handshake_sent)
  1077. {
  1078. if(recv_safer(conn_info,data,data_len)!=0)
  1079. {
  1080. return -1;
  1081. }
  1082. if((raw_mode==mode_faketcp&&( recv_info.syn==1||recv_info.ack!=1 ) )||data_len==0 )
  1083. {
  1084. mylog(log_trace,"unexpected syn ack or other zero lenght packet\n");
  1085. return 0;
  1086. }
  1087. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1088. {
  1089. mylog(log_trace,"unexpected adress\n");
  1090. return 0;
  1091. }
  1092. if(data_len!=1||data[0]!='h')
  1093. {
  1094. mylog(log_trace,"not a heartbeat\n");
  1095. return 0;
  1096. }
  1097. /*
  1098. uint32_t tmp_my_id= ntohl(* ((uint32_t *)&data[1+sizeof(my_id)]));
  1099. if(tmp_my_id!=my_id)
  1100. {
  1101. printf("auth fail\n");
  1102. return 0;
  1103. }
  1104. uint32_t tmp_oppsite_session_id=ntohl(* ((uint32_t *)&data[1]));
  1105. if(tmp_oppsite_session_id!=oppsite_id)
  1106. {
  1107. printf("oppsite id mismatch%x %x,ignore\n",tmp_oppsite_session_id,my_id);
  1108. return 0;
  1109. }*/
  1110. mylog(log_info,"changed state to client_ready\n");
  1111. conn_info.state.client_current_state=client_ready;
  1112. conn_info.last_state_time=get_current_time();
  1113. conn_info.last_hb_recv_time=get_current_time();
  1114. }
  1115. if(conn_info.state.client_current_state==client_ready )
  1116. {
  1117. if(recv_safer(conn_info,data,data_len)!=0)
  1118. {
  1119. return -1;
  1120. }
  1121. if((raw_mode==mode_faketcp&&( recv_info.syn==1||recv_info.ack!=1) )||data_len==0)
  1122. {
  1123. mylog(log_debug,"unexpected syn ack\n");
  1124. return 0;
  1125. }
  1126. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1127. {
  1128. mylog(log_debug,"unexpected adress\n");
  1129. return 0;
  1130. }
  1131. if(data_len==1&&data[0]=='h')
  1132. {
  1133. mylog(log_debug,"[hb]heart beat received\n");
  1134. conn_info.last_hb_recv_time=current_time_rough;
  1135. return 0;
  1136. }
  1137. else if(data_len>= int( sizeof(uint32_t)+1 )&&data[0]=='d')
  1138. {
  1139. mylog(log_trace,"received a data from fake tcp,len:%d\n",data_len);
  1140. conn_info.last_hb_recv_time=current_time_rough;
  1141. uint32_t tmp_conv_id= ntohl(* ((uint32_t *)&data[1]));
  1142. if(!conn_info.conv_manager->is_conv_used(tmp_conv_id))
  1143. {
  1144. mylog(log_info,"unknow conv %d,ignore\n",tmp_conv_id);
  1145. return 0;
  1146. }
  1147. conn_info.conv_manager->update_active_time(tmp_conv_id);
  1148. uint64_t u64=conn_info.conv_manager->find_u64_by_conv(tmp_conv_id);
  1149. sockaddr_in tmp_sockaddr;
  1150. tmp_sockaddr.sin_family = AF_INET;
  1151. tmp_sockaddr.sin_addr.s_addr=(u64>>32u);
  1152. tmp_sockaddr.sin_port= htons(uint16_t((u64<<32u)>>32u));
  1153. int ret=sendto(udp_fd,data+1+sizeof(uint32_t),data_len -(1+sizeof(uint32_t)),0,(struct sockaddr *)&tmp_sockaddr,sizeof(tmp_sockaddr));
  1154. if(ret<0)
  1155. {
  1156. mylog(log_warn,"sento returned %d\n",ret);
  1157. //perror("ret<0");
  1158. }
  1159. mylog(log_trace,"%s :%d\n",inet_ntoa(tmp_sockaddr.sin_addr),ntohs(tmp_sockaddr.sin_port));
  1160. mylog(log_trace,"%d byte sent\n",ret);
  1161. }
  1162. return 0;
  1163. }
  1164. return 0;
  1165. }
  1166. int server_on_raw_ready(conn_info_t &conn_info)
  1167. {
  1168. int data_len; char *data;
  1169. raw_info_t &raw_info = conn_info.raw_info;
  1170. packet_info_t &send_info = conn_info.raw_info.send_info;
  1171. packet_info_t &recv_info = conn_info.raw_info.recv_info;
  1172. char ip_port[40];
  1173. sprintf(ip_port,"%s:%d",my_ntoa(recv_info.src_ip),recv_info.src_port);
  1174. if (recv_safer(conn_info, data, data_len) != 0) {
  1175. return -1;
  1176. }
  1177. if ((raw_mode == mode_faketcp && (recv_info.syn == 1 || recv_info.ack != 1))
  1178. || data_len == 0)
  1179. return 0;
  1180. if (recv_info.src_ip != send_info.dst_ip
  1181. || recv_info.src_port != send_info.dst_port) {
  1182. mylog(log_debug, "unexpected adress\n");
  1183. return 0;
  1184. }
  1185. if (data[0] == 'h' && data_len == 1) {
  1186. uint32_t tmp = ntohl(*((uint32_t *) &data[1 + sizeof(uint32_t)]));
  1187. mylog(log_debug,"[%s][hb]received hb \n",ip_port);
  1188. conn_info.last_hb_recv_time = current_time_rough;
  1189. return 0;
  1190. } else if (data[0] == 'd' && data_len >=int( sizeof(uint32_t) + 1)) {
  1191. uint32_t tmp_conv_id = ntohl(*((uint32_t *) &data[1]));
  1192. conn_info.last_hb_recv_time = current_time_rough;
  1193. mylog(log_trace, "<<<<conv:%u>>>>\n", tmp_conv_id);
  1194. if (!conn_info.conv_manager->is_conv_used(tmp_conv_id)) {
  1195. if (conn_info.conv_manager->get_size() >= max_conv_num) {
  1196. mylog(log_warn,
  1197. "ignored new conv %x connect bc max_conv_num exceed\n",
  1198. tmp_conv_id);
  1199. return 0;
  1200. }
  1201. struct sockaddr_in remote_addr_in;
  1202. socklen_t slen = sizeof(sockaddr_in);
  1203. memset(&remote_addr_in, 0, sizeof(remote_addr_in));
  1204. remote_addr_in.sin_family = AF_INET;
  1205. remote_addr_in.sin_port = htons(remote_port);
  1206. remote_addr_in.sin_addr.s_addr = remote_address_uint32;
  1207. int new_udp_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1208. if (new_udp_fd < 0) {
  1209. mylog(log_warn, "create udp_fd error\n");
  1210. return -1;
  1211. }
  1212. setnonblocking(new_udp_fd);
  1213. set_buf_size(new_udp_fd);
  1214. mylog(log_debug, "created new udp_fd %d\n", new_udp_fd);
  1215. int ret = connect(new_udp_fd, (struct sockaddr *) &remote_addr_in,
  1216. slen);
  1217. if (ret != 0) {
  1218. mylog(log_warn, "udp fd connect fail\n");
  1219. close(new_udp_fd);
  1220. return -1;
  1221. }
  1222. struct epoll_event ev;
  1223. uint64_t u64 = (uint32_t(new_udp_fd))+(1llu<<32u);
  1224. mylog(log_trace, "u64: %ld\n", u64);
  1225. ev.events = EPOLLIN;
  1226. ev.data.u64 = u64;
  1227. ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, new_udp_fd, &ev);
  1228. if (ret != 0) {
  1229. mylog(log_warn, "add udp_fd error\n");
  1230. close(new_udp_fd);
  1231. return -1;
  1232. }
  1233. conn_info.conv_manager->insert_conv(tmp_conv_id, new_udp_fd);
  1234. conn_manager.udp_fd_mp[new_udp_fd] = &conn_info;
  1235. //pack_u64(conn_info.raw_info.recv_info.src_ip,conn_info.raw_info.recv_info.src_port);
  1236. mylog(log_info, "new conv conv_id=%x, assigned fd=%d\n",
  1237. tmp_conv_id, new_udp_fd);
  1238. }
  1239. uint64_t u64 = conn_info.conv_manager->find_u64_by_conv(tmp_conv_id);
  1240. conn_info.conv_manager->update_active_time(tmp_conv_id);
  1241. int fd = int((u64 << 32u) >> 32u);
  1242. mylog(log_trace, "received a data from fake tcp,len:%d\n", data_len);
  1243. int ret = send(fd, data + 1 + sizeof(uint32_t),
  1244. data_len - (1 + sizeof(uint32_t)), 0);
  1245. mylog(log_trace, "%d byte sent ,fd :%d\n ", ret, fd);
  1246. if (ret < 0) {
  1247. mylog(log_warn, "send returned %d\n", ret);
  1248. //perror("what happened????");
  1249. }
  1250. return 0;
  1251. }
  1252. return 0;
  1253. }
  1254. int server_on_raw_recv_multi()
  1255. {
  1256. uint32_t ip;uint16_t port;
  1257. if(peek_raw(ip,port)<0)
  1258. {
  1259. struct sockaddr saddr;
  1260. socklen_t saddr_size;
  1261. recvfrom(raw_recv_fd, 0,0, 0 ,&saddr , &saddr_size);//
  1262. mylog(log_trace,"peek_raw failed\n");
  1263. return -1;
  1264. }
  1265. mylog(log_trace,"peek_raw %s %d\n",my_ntoa(ip),port);
  1266. char ip_port[40];
  1267. sprintf(ip_port,"%s:%d",my_ntoa(ip),port);
  1268. /*if(ip==conn_manager.current_ready_ip&&port==conn_manager.current_ready_port)
  1269. {
  1270. return server_on_raw_ready();
  1271. }*/
  1272. int data_len; char *data;
  1273. if(!conn_manager.exist(ip,port))
  1274. {
  1275. raw_info_t tmp_raw_info;
  1276. recv_bare(tmp_raw_info,data,data_len);
  1277. if(raw_mode==mode_faketcp)
  1278. {
  1279. if (!(tmp_raw_info.recv_info.syn == 1 && tmp_raw_info.recv_info.ack == 0 && data_len == 0))
  1280. return 0;
  1281. }
  1282. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  1283. {
  1284. if(data_len==strlen("hello")&& memcmp((char *)"hello",data,strlen("hello"))!=0)
  1285. {
  1286. //data[6]=0;
  1287. mylog(log_debug,"[%s]not a hello packet %d\n",ip_port,data,data_len);
  1288. return 0;
  1289. }
  1290. }
  1291. conn_info_t &conn_info=conn_manager.find_insert(ip,port);
  1292. conn_info.raw_info=tmp_raw_info;
  1293. packet_info_t &send_info=conn_info.raw_info.send_info;
  1294. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  1295. raw_info_t &raw_info=conn_info.raw_info;
  1296. send_info.src_ip=recv_info.dst_ip;
  1297. send_info.src_port=recv_info.dst_port;
  1298. send_info.dst_port = recv_info.src_port;
  1299. send_info.dst_ip = recv_info.src_ip;
  1300. mylog(log_info,"[%s]send_info.src_port %d,%d\n",ip_port,send_info.src_port,send_info.dst_port);
  1301. if(raw_mode==mode_faketcp)
  1302. {
  1303. send_info.ack_seq = recv_info.seq + 1;
  1304. send_info.psh = 0;
  1305. send_info.syn = 1;
  1306. send_info.ack = 1;
  1307. send_info.seq = get_true_random_number(); //not necessary to set
  1308. mylog(log_info,"[%s]sent syn ack\n",ip_port);
  1309. send_bare(raw_info, 0, 0); //////////////send
  1310. mylog(log_info,"[%s]changed state to server_syn_ack_sent\n",ip_port);
  1311. conn_info.state.server_current_state = server_syn_ack_sent;
  1312. conn_info.last_state_time = get_current_time();
  1313. }
  1314. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  1315. {
  1316. mylog(log_info,"[%s]got a hello packet\n",ip_port);
  1317. mylog(log_info,"[%s]sent handshake\n",ip_port);
  1318. conn_info.my_id=get_true_random_number_nz();
  1319. send_handshake(raw_info,conn_info.my_id,get_true_random_number_nz(),const_id); //////////////send
  1320. mylog(log_info,"[%s]changed state to server_heartbeat_sent_sent\n",ip_port);
  1321. conn_info.state.server_current_state = server_handshake_sent;
  1322. conn_info.last_state_time = get_current_time();
  1323. }
  1324. return 0;
  1325. }
  1326. if(conn_manager.mp.size()>=max_handshake_conn_num)
  1327. {
  1328. mylog(log_info,"[%s]reached max_handshake_conn_num,ignored new handshake\n",ip_port);
  1329. return 0;
  1330. }
  1331. conn_info_t & conn_info=conn_manager.find_insert(ip,port);//insert if not exist
  1332. packet_info_t &send_info=conn_info.raw_info.send_info;
  1333. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  1334. raw_info_t &raw_info=conn_info.raw_info;
  1335. if(conn_info.state.server_current_state==server_ready)
  1336. {
  1337. return server_on_raw_ready(conn_info);
  1338. }
  1339. if(recv_bare(conn_info.raw_info,data,data_len)<0)
  1340. return -1;
  1341. if(conn_info.state.server_current_state==server_syn_ack_sent)
  1342. {
  1343. if(raw_mode==mode_faketcp&&!( recv_info.syn==0&&recv_info.ack==1 &&data_len==0)) return 0;
  1344. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1345. {
  1346. mylog(log_debug,"[%s]unexpected adress\n",ip_port);
  1347. return 0;
  1348. }
  1349. send_info.syn=0;
  1350. send_info.ack=1;
  1351. send_info.seq+=1;////////is this right?
  1352. conn_info.my_id=get_true_random_number_nz();
  1353. send_handshake(raw_info,conn_info.my_id,0,const_id); //////////////send
  1354. mylog(log_info,"[%s]changed state to server_handshake_sent\n",ip_port);
  1355. conn_info.state.server_current_state=server_handshake_sent;
  1356. conn_info.last_state_time=get_current_time();
  1357. }
  1358. else if(conn_info.state.server_current_state==server_handshake_sent)//heart beat received
  1359. {
  1360. if(( raw_mode==mode_faketcp&& (recv_info.syn==1||recv_info.ack!=1)) ||data_len==0)
  1361. {
  1362. mylog(log_debug,"[%s]enexpected packet type\n",ip_port);
  1363. return 0;
  1364. }
  1365. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1366. {
  1367. mylog(log_trace,"[%s]unexpected adress\n",ip_port);
  1368. return 0;
  1369. }
  1370. if(conn_info.last_state_time <conn_info.last_state_time)
  1371. {
  1372. mylog(log_info,"[%s]ignored handshake of older timestamp than current ready connection",ip_port);
  1373. return 0;
  1374. }
  1375. //mylog(log_debug,"!!!\n");
  1376. uint32_t tmp_session_id= ntohl(* ((uint32_t *)&data[sizeof(id_t)]));
  1377. uint32_t tmp_oppsite_const_id=ntohl(* ((uint32_t *)&data[sizeof(id_t)*2]));
  1378. /*
  1379. if(oppsite_const_id!=0&&tmp_oppsite_const_id!=oppsite_const_id) //TODO MOVE TO READY
  1380. {
  1381. conv_manager.clear();
  1382. }
  1383. oppsite_const_id=tmp_oppsite_const_id;*/
  1384. if(tmp_session_id!=conn_info.my_id)
  1385. {
  1386. mylog(log_debug,"[%s]%x %x auth fail!!\n",tmp_session_id,conn_info.my_id,ip_port);
  1387. return 0;
  1388. }
  1389. int tmp_oppsite_session_id= ntohl(* ((uint32_t *)&data[0]));
  1390. conn_info.oppsite_id=tmp_oppsite_session_id;
  1391. mylog(log_info,"[%s]received handshake %x %x\n",ip_port,conn_info.oppsite_id,conn_info.my_id);
  1392. if(conn_manager.const_id_mp.find(tmp_oppsite_const_id)==conn_manager.const_id_mp.end())
  1393. {
  1394. //conn_manager.const_id_mp=
  1395. if(conn_manager.ready_num>=max_ready_conn_num)
  1396. {
  1397. mylog(log_info,"[%s]max_ready_conn_num,cant turn to ready\n",ip_port);
  1398. conn_info.state.server_current_state =server_nothing;
  1399. return 0;
  1400. }
  1401. conn_info.prepare();
  1402. conn_info.state.server_current_state = server_ready;
  1403. conn_info.oppsite_const_id=tmp_oppsite_const_id;
  1404. conn_manager.ready_num++;
  1405. conn_manager.const_id_mp[tmp_oppsite_const_id]=&conn_info;
  1406. //conn_info.last_state_time=get_current_time(); //dont change this!!!!!!!!!!!!!!!!!!!!!!!!!
  1407. //conn_manager.current_ready_ip=ip;
  1408. //conn_manager.current_ready_port=port;
  1409. //my_id=conn_info.my_id;
  1410. //oppsite_id=conn_info.oppsite_id;
  1411. conn_info.last_hb_recv_time = get_current_time();
  1412. conn_info.last_hb_sent_time = conn_info.last_hb_recv_time;//=get_current_time()
  1413. send_safer(conn_info, (char *) "h", 1); /////////////send
  1414. mylog(log_info, "[%s]changed state to server_ready\n",ip_port);
  1415. conn_info.anti_replay->re_init();
  1416. //g_conn_info=conn_info;
  1417. int new_timer_fd;
  1418. set_timer_server(epollfd, new_timer_fd);
  1419. conn_manager.timer_fd_mp[new_timer_fd] = &conn_info;//pack_u64(ip,port);
  1420. //timer_fd_mp[new_timer_fd]
  1421. /*
  1422. if(oppsite_const_id!=0&&tmp_oppsite_const_id!=oppsite_const_id) //TODO MOVE TO READY
  1423. {
  1424. mylog(log_info,"cleared all conv bc of const id doesnt match\n");
  1425. conv_manager.clear();
  1426. }*/
  1427. //oppsite_const_id=tmp_oppsite_const_id;
  1428. }
  1429. else
  1430. {
  1431. conn_info_t &ori_conn_info=*conn_manager.const_id_mp[tmp_oppsite_const_id];
  1432. if(ori_conn_info.state.server_current_state==server_ready)
  1433. {
  1434. if(conn_info.last_state_time<ori_conn_info.last_state_time)
  1435. {
  1436. mylog(log_info,"[%s]conn_info.last_state_time<ori_conn_info.last_state_time. ignored new handshake\n",ip_port);
  1437. conn_info.state.server_current_state=server_nothing;
  1438. conn_info.oppsite_const_id=0;
  1439. return 0;
  1440. }
  1441. if(!conn_manager.exist(ori_conn_info.raw_info.recv_info.src_ip,ori_conn_info.raw_info.recv_info.src_port))//TODO remove this
  1442. {
  1443. mylog(log_fatal,"[%s]this shouldnt happen\n",ip_port);
  1444. myexit(-1);
  1445. }
  1446. if(!conn_manager.exist(conn_info.raw_info.recv_info.src_ip,conn_info.raw_info.recv_info.src_port))//TODO remove this
  1447. {
  1448. mylog(log_fatal,"[%s]this shouldnt happen2\n",ip_port);
  1449. myexit(-1);
  1450. }
  1451. conn_info_t *&p_ori=conn_manager.find_insert_p(ori_conn_info.raw_info.recv_info.src_ip,ori_conn_info.raw_info.recv_info.src_port);
  1452. conn_info_t *&p=conn_manager.find_insert_p(conn_info.raw_info.recv_info.src_ip,conn_info.raw_info.recv_info.src_port);
  1453. conn_info_t *tmp=p;
  1454. p=p_ori;
  1455. p_ori=tmp;
  1456. mylog(log_info,"[%s]grabbed a connection\n",ip_port);
  1457. //ori_conn_info.state.server_current_state=server_ready;
  1458. ori_conn_info.raw_info=conn_info.raw_info;
  1459. ori_conn_info.last_state_time=conn_info.last_state_time;
  1460. ori_conn_info.last_hb_recv_time=conn_info.last_hb_recv_time;
  1461. ori_conn_info.last_hb_sent_time=conn_info.last_hb_sent_time;
  1462. ori_conn_info.my_id=conn_info.my_id;
  1463. ori_conn_info.oppsite_id=conn_info.oppsite_id;
  1464. send_safer(ori_conn_info, (char *) "h", 1);
  1465. ori_conn_info.anti_replay->re_init();
  1466. conn_info.state.server_current_state=server_nothing;
  1467. conn_info.oppsite_const_id=0;
  1468. }
  1469. else
  1470. {
  1471. mylog(log_fatal,"[%s]this should never happen\n",ip_port);
  1472. myexit(-1);
  1473. }
  1474. }
  1475. }
  1476. return 0;
  1477. }
  1478. /*
  1479. int server_on_raw_recv()
  1480. {
  1481. raw_info_t &raw_info=g_conn_info.raw_info;
  1482. packet_info_t &send_info=g_conn_info.raw_info.send_info;
  1483. packet_info_t &recv_info=g_conn_info.raw_info.recv_info;
  1484. char* data;int data_len;
  1485. //packet_info_t send_info;
  1486. if(g_conn_info.server_current_state==server_nothing)
  1487. {
  1488. if(recv_bare(raw_info,data,data_len)!=0)
  1489. {
  1490. return -1;
  1491. }
  1492. anti_replay.re_init();
  1493. if(raw_mode==mode_icmp)
  1494. {
  1495. send_info.src_port = recv_info.src_port;;
  1496. }
  1497. send_info.src_ip=recv_info.dst_ip;
  1498. send_info.src_port=recv_info.dst_port;
  1499. send_info.dst_port = recv_info.src_port;
  1500. send_info.dst_ip = recv_info.src_ip;
  1501. if(raw_mode==mode_faketcp)
  1502. {
  1503. if (!(recv_info.syn == 1 && recv_info.ack == 0 && data_len == 0))
  1504. return 0;
  1505. send_info.ack_seq = recv_info.seq + 1;
  1506. send_info.psh = 0;
  1507. send_info.syn = 1;
  1508. send_info.ack = 1;
  1509. send_info.seq = get_true_random_number_nz(); //not necessary to set
  1510. mylog(log_info,"sent syn ack\n");
  1511. send_bare(raw_info, 0, 0); //////////////send
  1512. mylog(log_info,"changed state to server_syn_ack_sent\n");
  1513. g_conn_info.server_current_state = server_syn_ack_sent;
  1514. g_conn_info.retry_counter = 0;
  1515. g_conn_info.last_state_time = get_current_time();
  1516. }
  1517. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  1518. {
  1519. if(data_len==strlen("hello")&& memcmp((char *)"hello",data,strlen("hello"))!=0)
  1520. {
  1521. //data[6]=0;
  1522. mylog(log_debug,"not a hello packet %d\n",data,data_len);
  1523. return 0;
  1524. }
  1525. else
  1526. {
  1527. mylog(log_info,"got a hello packet\n");
  1528. }
  1529. mylog(log_info,"sent half heart_beat\n");
  1530. //send_raw(g_packet_info_send, 0, 0);
  1531. send_handshake(raw_info,my_id,random(),const_id); //////////////send
  1532. mylog(log_info,"changed state to server_heartbeat_sent_sent\n");
  1533. g_conn_info.server_current_state = server_handshake_sent;
  1534. g_conn_info.retry_counter = 0;
  1535. g_conn_info.last_state_time = get_current_time();
  1536. }
  1537. }
  1538. else if(g_conn_info.server_current_state==server_syn_ack_sent)
  1539. {
  1540. if(recv_bare(raw_info,data,data_len)!=0)
  1541. {
  1542. return -1;
  1543. }
  1544. if(raw_mode==mode_faketcp&&!( recv_info.syn==0&&recv_info.ack==1 &&data_len==0)) return 0;
  1545. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1546. {
  1547. mylog(log_debug,"unexpected adress\n");
  1548. return 0;
  1549. }
  1550. send_info.syn=0;
  1551. send_info.ack=1;
  1552. send_info.seq+=1;////////is this right?
  1553. send_handshake(raw_info,my_id,0,const_id); //////////////send
  1554. mylog(log_info,"changed state to server_handshake_sent\n");
  1555. g_conn_info.server_current_state=server_handshake_sent;
  1556. g_conn_info.last_state_time=get_current_time();
  1557. g_conn_info.retry_counter=RETRY_TIME;
  1558. }
  1559. else if(g_conn_info.server_current_state==server_handshake_sent)//heart beat received
  1560. {
  1561. if(recv_bare(raw_info,data,data_len)!=0)
  1562. {
  1563. return -1;
  1564. }
  1565. if(( raw_mode==mode_faketcp&& (recv_info.syn==1||recv_info.ack!=1)) ||data_len==0) return 0;
  1566. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1567. {
  1568. mylog(log_trace,"unexpected adress\n");
  1569. return 0;
  1570. }
  1571. //if(data_len<hb_length||data[0]!='h')
  1572. //{
  1573. // return 0;
  1574. //}
  1575. uint32_t tmp_session_id= ntohl(* ((uint32_t *)&data[sizeof(my_id)]));
  1576. uint32_t tmp_oppsite_const_id=ntohl(* ((uint32_t *)&data[sizeof(my_id)*2]));
  1577. if(oppsite_const_id!=0&&tmp_oppsite_const_id!=oppsite_const_id)
  1578. {
  1579. conv_manager.clear();
  1580. }
  1581. oppsite_const_id=tmp_oppsite_const_id;
  1582. if(tmp_session_id!=my_id)
  1583. {
  1584. mylog(log_trace,"auth fail!!\n");
  1585. return 0;
  1586. }
  1587. int tmp_oppsite_session_id= ntohl(* ((uint32_t *)&data[0]));
  1588. oppsite_id=tmp_oppsite_session_id;
  1589. mylog(log_info,"received heartbeat %x %x\n",oppsite_id,tmp_session_id);
  1590. send_safer(raw_info,(char *)"h",1);/////////////send
  1591. //send_hb(g_packet_info_send,my_id,oppsite_id,const_id);/////////////////send
  1592. g_conn_info.server_current_state=server_ready;
  1593. g_conn_info.last_state_time=get_current_time();
  1594. g_conn_info.last_hb_recv_time=get_current_time();
  1595. //first_data_packet=1;
  1596. mylog(log_info,"changed state to server_ready\n");
  1597. }
  1598. else if(g_conn_info.server_current_state==server_ready)
  1599. {
  1600. if(recv_safer(raw_info,data,data_len)!=0)
  1601. {
  1602. return -1;
  1603. }
  1604. if( (raw_mode==mode_faketcp&&(recv_info.syn==1||recv_info.ack!=1)) ||data_len==0) return 0;
  1605. if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port)
  1606. {
  1607. mylog(log_debug,"unexpected adress\n");
  1608. return 0;
  1609. }
  1610. if(data[0]=='h'&&data_len==1)
  1611. {
  1612. uint32_t tmp= ntohl(* ((uint32_t *)&data[1+sizeof(uint32_t)]));
  1613. mylog(log_debug,"received hb <%x,%x>\n",oppsite_id,tmp);
  1614. g_conn_info.last_hb_recv_time=current_time_rough;
  1615. return 0;
  1616. }
  1617. else if(data[0]=='d'&&data_len>=sizeof(uint32_t)+1)
  1618. {
  1619. uint32_t tmp_conv_id=ntohl(* ((uint32_t *)&data[1]));
  1620. g_conn_info.last_hb_recv_time=current_time_rough;
  1621. mylog(log_debug,"<<<<conv:%u>>>>\n",tmp_conv_id);
  1622. if(!conv_manager.is_conv_used(tmp_conv_id))
  1623. {
  1624. if(conv_manager.get_size() >=max_conv_num)
  1625. {
  1626. mylog(log_warn,"ignored new conv %x connect bc max_conv_num exceed\n",tmp_conv_id);
  1627. return 0;
  1628. }
  1629. struct sockaddr_in remote_addr_in;
  1630. socklen_t slen = sizeof(sockaddr_in);
  1631. memset(&remote_addr_in, 0, sizeof(remote_addr_in));
  1632. remote_addr_in.sin_family = AF_INET;
  1633. remote_addr_in.sin_port = htons(remote_port);
  1634. remote_addr_in.sin_addr.s_addr = remote_address_uint32;
  1635. int new_udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1636. if(new_udp_fd<0)
  1637. {
  1638. mylog(log_warn,"create udp_fd error\n");
  1639. return -1;
  1640. }
  1641. set_buf_size(new_udp_fd);
  1642. mylog(log_debug,"created new udp_fd %d\n",new_udp_fd);
  1643. int ret = connect(new_udp_fd, (struct sockaddr *) &remote_addr_in, slen);
  1644. if(ret!=0)
  1645. {
  1646. mylog(log_warn,"udp fd connect fail\n");
  1647. close(new_udp_fd);
  1648. return -1;
  1649. }
  1650. struct epoll_event ev;
  1651. uint64_t u64=((u_int64_t(tmp_conv_id))<<32u)+(uint32_t)new_udp_fd;
  1652. mylog(log_trace,"u64: %ld\n",u64);
  1653. ev.events = EPOLLIN;
  1654. ev.data.u64 = u64;
  1655. ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, new_udp_fd, &ev);
  1656. if (ret!= 0) {
  1657. mylog(log_warn,"add udp_fd error\n");
  1658. close(new_udp_fd);
  1659. return -1;
  1660. }
  1661. conv_manager.insert_conv(tmp_conv_id,u64);
  1662. mylog(log_info,"new conv conv_id=%x, assigned fd=%d\n",tmp_conv_id,new_udp_fd);
  1663. }
  1664. uint64_t u64=conv_manager.find_u64_by_conv(tmp_conv_id);
  1665. conv_manager.update_active_time(tmp_conv_id);
  1666. int fd=int((u64<<32u)>>32u);
  1667. mylog(log_debug,"received a data from fake tcp,len:%d\n",data_len);
  1668. int ret=send(fd,data+1+sizeof(uint32_t),data_len -(1+sizeof(uint32_t)),0);
  1669. mylog(log_debug,"%d byte sent ,fd :%d\n ",ret,fd);
  1670. if(ret<0)
  1671. {
  1672. mylog(log_warn,"send returned %d\n",ret);
  1673. //perror("what happened????");
  1674. }
  1675. }
  1676. }
  1677. return 0;
  1678. }*/
  1679. int get_src_adress(uint32_t &ip)
  1680. {
  1681. struct sockaddr_in remote_addr_in;
  1682. socklen_t slen = sizeof(sockaddr_in);
  1683. memset(&remote_addr_in, 0, sizeof(remote_addr_in));
  1684. remote_addr_in.sin_family = AF_INET;
  1685. remote_addr_in.sin_port = htons(remote_port);
  1686. remote_addr_in.sin_addr.s_addr = remote_address_uint32;
  1687. int new_udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1688. if(new_udp_fd<0)
  1689. {
  1690. mylog(log_warn,"create udp_fd error\n");
  1691. return -1;
  1692. }
  1693. set_buf_size(new_udp_fd);
  1694. mylog(log_debug,"created new udp_fd %d\n",new_udp_fd);
  1695. int ret = connect(new_udp_fd, (struct sockaddr *) &remote_addr_in, slen);
  1696. if(ret!=0)
  1697. {
  1698. mylog(log_warn,"udp fd connect fail\n");
  1699. close(new_udp_fd);
  1700. return -1;
  1701. }
  1702. struct sockaddr_in my_addr;
  1703. unsigned int len=sizeof(my_addr);
  1704. if(getsockname(new_udp_fd, (struct sockaddr *) &my_addr, &len)!=0) return -1;
  1705. ip=my_addr.sin_addr.s_addr;
  1706. close(new_udp_fd);
  1707. return 0;
  1708. }
  1709. int client_event_loop()
  1710. {
  1711. char buf[buf_len];
  1712. conn_info_t conn_info;
  1713. conn_info.my_id=get_true_random_number_nz();
  1714. conn_info.prepare();
  1715. packet_info_t &send_info=conn_info.raw_info.send_info;
  1716. packet_info_t &recv_info=conn_info.raw_info.recv_info;
  1717. //printf("?????\n");
  1718. if(source_address_uint32==0)
  1719. {
  1720. mylog(log_info,"get_src_adress called\n");
  1721. if(get_src_adress(source_address_uint32)!=0)
  1722. {
  1723. mylog(log_fatal,"the trick to auto get source ip failed,you should specific an ip by --source-ip\n");
  1724. myexit(-1);
  1725. }
  1726. }
  1727. in_addr tmp;
  1728. tmp.s_addr=source_address_uint32;
  1729. mylog(log_info,"source ip = %s\n",inet_ntoa(tmp));
  1730. //printf("done\n");
  1731. if(try_to_list_and_bind(source_port)!=0)
  1732. {
  1733. mylog(log_fatal,"bind to source_port:%d fail\n ",source_port);
  1734. myexit(-1);
  1735. }
  1736. send_info.src_port=source_port;
  1737. send_info.src_ip = source_address_uint32;
  1738. int i, j, k;int ret;
  1739. init_raw_socket();
  1740. //init_filter(source_port);
  1741. send_info.dst_ip=remote_address_uint32;
  1742. send_info.dst_port=remote_port;
  1743. //g_packet_info.src_ip=source_address_uint32;
  1744. //g_packet_info.src_port=source_port;
  1745. udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1746. set_buf_size(udp_fd);
  1747. int yes = 1;
  1748. //setsockopt(udp_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
  1749. struct sockaddr_in local_me;
  1750. socklen_t slen = sizeof(sockaddr_in);
  1751. memset(&local_me, 0, sizeof(local_me));
  1752. local_me.sin_family = AF_INET;
  1753. local_me.sin_port = htons(local_port);
  1754. local_me.sin_addr.s_addr = local_address_uint32;
  1755. if (bind(udp_fd, (struct sockaddr*) &local_me, slen) == -1) {
  1756. mylog(log_fatal,"socket bind error\n");
  1757. //perror("socket bind error");
  1758. myexit(1);
  1759. }
  1760. setnonblocking(udp_fd);
  1761. epollfd = epoll_create1(0);
  1762. const int max_events = 4096;
  1763. struct epoll_event ev, events[max_events];
  1764. if (epollfd < 0) {
  1765. mylog(log_fatal,"epoll return %d\n", epollfd);
  1766. myexit(-1);
  1767. }
  1768. ev.events = EPOLLIN;
  1769. ev.data.u64 = udp_fd;
  1770. ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, udp_fd, &ev);
  1771. if (ret!=0) {
  1772. mylog(log_fatal,"add udp_listen_fd error\n");
  1773. myexit(-1);
  1774. }
  1775. ev.events = EPOLLIN;
  1776. ev.data.u64 = raw_recv_fd;
  1777. ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev);
  1778. if (ret!= 0) {
  1779. mylog(log_fatal,"add raw_fd error\n");
  1780. myexit(-1);
  1781. }
  1782. ////add_timer for fake_tcp_keep_connection_client
  1783. //sleep(10);
  1784. //memset(&udp_old_addr_in,0,sizeof(sockaddr_in));
  1785. int unbind=1;
  1786. set_timer(epollfd,timer_fd);
  1787. mylog(log_debug,"send_raw : from %x %d to %x %d\n",send_info.src_ip,send_info.src_port,send_info.dst_ip,send_info.dst_port);
  1788. while(1)////////////////////////
  1789. {
  1790. int nfds = epoll_wait(epollfd, events, max_events, 180 * 1000);
  1791. if (nfds < 0) { //allow zero
  1792. mylog(log_fatal,"epoll_wait return %d\n", nfds);
  1793. myexit(-1);
  1794. }
  1795. int idx;
  1796. for (idx = 0; idx < nfds; ++idx) {
  1797. if (events[idx].data.u64 == (uint64_t)raw_recv_fd)
  1798. {
  1799. iphdr *iph;tcphdr *tcph;
  1800. client_on_raw_recv(conn_info);
  1801. }
  1802. if(events[idx].data.u64 ==(uint64_t)timer_fd)
  1803. {
  1804. uint64_t value;
  1805. read(timer_fd, &value, 8);
  1806. keep_connection_client(conn_info);
  1807. }
  1808. if (events[idx].data.u64 == (uint64_t)udp_fd)
  1809. {
  1810. int recv_len;
  1811. struct sockaddr_in udp_new_addr_in;
  1812. if ((recv_len = recvfrom(udp_fd, buf, buf_len, 0,
  1813. (struct sockaddr *) &udp_new_addr_in, &slen)) == -1) {
  1814. mylog(log_error,"recv_from error,this shouldnt happen at client\n");
  1815. myexit(1);
  1816. };
  1817. mylog(log_trace,"Received packet from %s:%d,len: %d\n", inet_ntoa(udp_new_addr_in.sin_addr),
  1818. ntohs(udp_new_addr_in.sin_port),recv_len);
  1819. /*
  1820. if(udp_old_addr_in.sin_addr.s_addr==0&&udp_old_addr_in.sin_port==0)
  1821. {
  1822. memcpy(&udp_old_addr_in,&udp_new_addr_in,sizeof(udp_new_addr_in));
  1823. }
  1824. else if(udp_new_addr_in.sin_addr.s_addr!=udp_old_addr_in.sin_addr.s_addr
  1825. ||udp_new_addr_in.sin_port!=udp_old_addr_in.sin_port)
  1826. {
  1827. if(get_current_time()- last_udp_recv_time <udp_timeout)
  1828. {
  1829. printf("new <ip,port> connected in,ignored,bc last connection is still active\n");
  1830. continue;
  1831. }
  1832. else
  1833. {
  1834. printf("new <ip,port> connected in,accpeted\n");
  1835. memcpy(&udp_old_addr_in,&udp_new_addr_in,sizeof(udp_new_addr_in));
  1836. conv_id++;
  1837. }
  1838. }*/
  1839. //last_udp_recv_time=get_current_time();
  1840. uint64_t u64=((uint64_t(udp_new_addr_in.sin_addr.s_addr))<<32u)+ntohs(udp_new_addr_in.sin_port);
  1841. uint32_t conv;
  1842. if(!conn_info.conv_manager->is_u64_used(u64))
  1843. {
  1844. if(conn_info.conv_manager->get_size() >=max_conv_num)
  1845. {
  1846. mylog(log_warn,"ignored new udp connect bc max_conv_num exceed\n");
  1847. continue;
  1848. }
  1849. conv=conn_info.conv_manager->get_new_conv();
  1850. conn_info.conv_manager->insert_conv(conv,u64);
  1851. mylog(log_info,"new connection from %s:%d,conv_id=%x\n",inet_ntoa(udp_new_addr_in.sin_addr),ntohs(udp_new_addr_in.sin_port),conv);
  1852. }
  1853. else
  1854. {
  1855. conv=conn_info.conv_manager->find_conv_by_u64(u64);
  1856. }
  1857. conn_info.conv_manager->update_active_time(conv);
  1858. if(conn_info.state.client_current_state==client_ready)
  1859. {
  1860. send_data_safer(conn_info,buf,recv_len,conv);
  1861. }
  1862. }
  1863. }
  1864. }
  1865. return 0;
  1866. }
  1867. int server_event_loop()
  1868. {
  1869. char buf[buf_len];
  1870. int i, j, k;int ret;
  1871. bind_address_uint32=local_address_uint32;
  1872. //g_packet_info_send.src_ip=inet_addr(local_address);
  1873. //g_packet_info_send.src_port=local_port;
  1874. if(raw_mode==mode_faketcp)
  1875. {
  1876. bind_fd=socket(AF_INET,SOCK_STREAM,0);
  1877. }
  1878. else if(raw_mode==mode_udp||raw_mode==mode_icmp)
  1879. {
  1880. bind_fd=socket(AF_INET,SOCK_DGRAM,0);
  1881. }
  1882. struct sockaddr_in temp_bind_addr;
  1883. bzero(&temp_bind_addr, sizeof(temp_bind_addr));
  1884. temp_bind_addr.sin_family = AF_INET;
  1885. temp_bind_addr.sin_port = htons(local_port);
  1886. temp_bind_addr.sin_addr.s_addr = local_address_uint32;
  1887. if (bind(bind_fd, (struct sockaddr*)&temp_bind_addr, sizeof(temp_bind_addr)) !=0)
  1888. {
  1889. mylog(log_fatal,"bind fail\n");
  1890. myexit(-1);
  1891. }
  1892. if(raw_mode==mode_faketcp)
  1893. {
  1894. if(listen(bind_fd, SOMAXCONN) != 0 )
  1895. {
  1896. mylog(log_fatal,"listen fail\n");
  1897. myexit(-1);
  1898. }
  1899. }
  1900. init_raw_socket();
  1901. init_filter(local_port);
  1902. epollfd = epoll_create1(0);
  1903. const int max_events = 4096;
  1904. struct epoll_event ev, events[max_events];
  1905. if (epollfd < 0) {
  1906. mylog(log_fatal,"epoll return %d\n", epollfd);
  1907. myexit(-1);
  1908. }
  1909. ev.events = EPOLLIN;
  1910. ev.data.u64 = raw_recv_fd;
  1911. ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev);
  1912. if (ret!= 0) {
  1913. mylog(log_fatal,"add raw_fd error\n");
  1914. myexit(-1);
  1915. }
  1916. int timer_fd;
  1917. set_timer(epollfd,timer_fd);
  1918. while(1)////////////////////////
  1919. {
  1920. int nfds = epoll_wait(epollfd, events, max_events, 180 * 1000);
  1921. if (nfds < 0) { //allow zero
  1922. mylog(log_fatal,"epoll_wait return %d\n", nfds);
  1923. myexit(-1);
  1924. }
  1925. int idx;
  1926. const int MTU=1440;
  1927. for (idx = 0; idx < nfds; ++idx)
  1928. {
  1929. //printf("%d %d %d %d\n",timer_fd,raw_recv_fd,raw_send_fd,n);
  1930. if ((events[idx].data.u64 ) == (uint64_t)timer_fd)
  1931. {
  1932. uint64_t dummy;
  1933. read(timer_fd, &dummy, 8);
  1934. current_time_rough=get_current_time();
  1935. conn_manager.clear_inactive();
  1936. }
  1937. if ((events[idx].data.u64 >>32u) == 2u)
  1938. {
  1939. int fd=get_u64_l(events[idx].data.u64);
  1940. uint64_t dummy;
  1941. read(fd, &dummy, 8);
  1942. if(conn_manager.timer_fd_mp.find(fd)==conn_manager.timer_fd_mp.end()) //this can happen,when fd is a just closed fd
  1943. {
  1944. mylog(log_info,"timer_fd no longer exits\n", nfds);
  1945. continue;
  1946. }
  1947. conn_info_t* p_conn_info=conn_manager.timer_fd_mp[fd];
  1948. uint32_t ip=p_conn_info->raw_info.recv_info.src_ip;
  1949. uint32_t port=p_conn_info->raw_info.recv_info.src_port;
  1950. if(!conn_manager.exist(ip,port))//TODO remove this for peformance
  1951. {
  1952. mylog(log_fatal,"ip port no longer exits!!!this shouldnt happen\n", nfds);
  1953. myexit(-1);
  1954. }
  1955. //conn_info_t &conn_info=conn_manager.find(ip,port);
  1956. keep_connection_server_multi(*p_conn_info);
  1957. }
  1958. else if (events[idx].data.u64 == (uint64_t)raw_recv_fd)
  1959. {
  1960. server_on_raw_recv_multi();
  1961. }
  1962. else
  1963. if ((events[idx].data.u64 >>32u) == 1u)
  1964. {
  1965. //uint32_t conv_id=events[n].data.u64>>32u;
  1966. int fd=int((events[idx].data.u64<<32u)>>32u);
  1967. if(conn_manager.udp_fd_mp.find(fd)==conn_manager.udp_fd_mp.end()) //this can happen,when fd is a just closed fd
  1968. {
  1969. mylog(log_debug,"fd no longer exists in udp_fd_mp,udp fd %d\n",fd);
  1970. recv(fd,0,0,0);
  1971. continue;
  1972. }
  1973. conn_info_t* p_conn_info=conn_manager.udp_fd_mp[fd];
  1974. uint32_t ip=p_conn_info->raw_info.recv_info.src_ip;
  1975. uint32_t port=p_conn_info->raw_info.recv_info.src_port;
  1976. if(!conn_manager.exist(ip,port))//TODO remove this for peformance
  1977. {
  1978. mylog(log_fatal,"ip port no longer exits!!!this shouldnt happen\n", nfds);
  1979. myexit(-1);
  1980. }
  1981. if(p_conn_info->state.server_current_state!=server_ready)//TODO remove this for peformance
  1982. {
  1983. mylog(log_fatal,"p_conn_info->state.server_current_state!=server_ready!!!this shouldnt happen\n", nfds);
  1984. myexit(-1);
  1985. }
  1986. conn_info_t &conn_info=*p_conn_info;
  1987. if(!conn_info.conv_manager->is_u64_used(fd))
  1988. {
  1989. mylog(log_debug,"conv no longer exists,udp fd %d\n",fd);
  1990. int recv_len=recv(fd,buf,buf_len,0); ///////////TODO ,delete this
  1991. continue;
  1992. }
  1993. uint32_t conv_id=conn_info.conv_manager->find_conv_by_u64(fd);
  1994. int recv_len=recv(fd,buf,buf_len,0);
  1995. mylog(log_trace,"received a packet from udp_fd,len:%d\n",recv_len);
  1996. if(recv_len<0)
  1997. {
  1998. mylog(log_trace,"continue\n");
  1999. //perror("wtf?");
  2000. continue;
  2001. //return 0;
  2002. }
  2003. conn_info.conv_manager->update_active_time(conv_id);
  2004. if(conn_info.state.server_current_state==server_ready)
  2005. {
  2006. send_data_safer(conn_info,buf,recv_len,conv_id);
  2007. //send_data(g_packet_info_send,buf,recv_len,my_id,oppsite_id,conv_id);
  2008. mylog(log_trace,"send !!\n");
  2009. }
  2010. }
  2011. }
  2012. }
  2013. return 0;
  2014. }
  2015. void print_help()
  2016. {
  2017. printf("udp-to-raw tunnel v0.1\n");
  2018. printf("\n");
  2019. printf("usage:\n");
  2020. printf(" run as client : ./this_program -c -l adress:port -r adress:port [options]\n");
  2021. printf(" run as server : ./this_program -s -l adress:port -r adress:port [options]\n");
  2022. printf("\n");
  2023. printf("common options,these options must be same on both side:\n");
  2024. printf(" --raw-mode <string> avaliable values:faketcp,udp,icmp\n");
  2025. printf(" --key <string> password to gen symetric key\n");
  2026. printf(" --auth-mode <string> avaliable values:aes128cbc,xor,none\n");
  2027. printf(" --cipher-mode <string> avaliable values:md5,crc32,sum,none\n");
  2028. printf("\n");
  2029. printf("client options:\n");
  2030. printf(" --source-ip <ip> override source-ip for raw socket\n");
  2031. printf(" --source-port <port> override source-port for tcp/udp \n");
  2032. printf("\n");
  2033. printf("other options:\n");
  2034. printf(" --log-level <number> 0:never print log\n");
  2035. printf(" 1:fatal\n");
  2036. printf(" 2:error\n");
  2037. printf(" 3:warn\n");
  2038. printf(" 4:info (default)\n");
  2039. printf(" 5:debug\n");
  2040. printf(" 6:trace\n");
  2041. printf("\n");
  2042. printf(" --disable-color disable log color\n");
  2043. printf(" --log-position enable file name,function name,line number in log\n");
  2044. printf(" --disable-bpf disable the kernel space filter,most time its not necessary\n");
  2045. printf(" unless you suspect there is a bug\n");
  2046. printf("\n");
  2047. printf(" --sock-buf <number> buf size for socket,>=1 and <=10240,unit:kbyte\n");
  2048. printf(" --seqmode <number> seq increase mode for faketcp:\n");
  2049. printf(" 0:dont increase\n");
  2050. printf(" 1:increase every packet\n");
  2051. printf(" 2:increase randomly, about every 5 packets (default)\n");
  2052. printf("\n");
  2053. printf(" -h,--help print this help message\n");
  2054. //printf("common options,these options must be same on both side\n");
  2055. }
  2056. void process_arg(int argc, char *argv[])
  2057. {
  2058. int i,j,k,opt;
  2059. static struct option long_options[] =
  2060. {
  2061. /* These options set a flag. */
  2062. {"source-ip", required_argument, 0, 1},
  2063. {"source-port", required_argument, 0, 1},
  2064. {"log-level", required_argument, 0, 1},
  2065. {"key", required_argument, 0, 'k'},
  2066. {"auth-mode", required_argument, 0, 1},
  2067. {"cipher-mode", required_argument, 0, 1},
  2068. {"raw-mode", required_argument, 0, 1},
  2069. {"disable-color", no_argument, 0, 1},
  2070. {"log-position", no_argument, 0, 1},
  2071. {"disable-bpf", no_argument, 0, 1},
  2072. {"sock-buf", required_argument, 0, 1},
  2073. {"seq-mode", required_argument, 0, 1},
  2074. {NULL, 0, 0, 0}
  2075. };
  2076. int option_index = 0;
  2077. for (i = 0; i < argc; i++)
  2078. {
  2079. if(strcmp(argv[i],"-h")==0||strcmp(argv[i],"--help")==0)
  2080. {
  2081. print_help();
  2082. myexit(0);
  2083. }
  2084. }
  2085. for (i = 0; i < argc; i++)
  2086. {
  2087. if(strcmp(argv[i],"--log-level")==0)
  2088. {
  2089. if(i<argc -1)
  2090. {
  2091. sscanf(argv[i+1],"%d",&log_level);
  2092. if(0<=log_level&&log_level<log_end)
  2093. {
  2094. }
  2095. else
  2096. {
  2097. log_bare(log_fatal,"invalid log_level\n");
  2098. myexit(-1);
  2099. }
  2100. }
  2101. }
  2102. if(strcmp(argv[i],"--disable-color")==0)
  2103. {
  2104. enable_log_color=0;
  2105. }
  2106. }
  2107. mylog(log_info,"argc=%d ", argc);
  2108. for (i = 0; i < argc; i++) {
  2109. log_bare(log_info, "%s ", argv[i]);
  2110. }
  2111. log_bare(log_info, "\n");
  2112. if (argc == 1)
  2113. {
  2114. print_help();
  2115. myexit(-1);
  2116. }
  2117. int no_l = 1, no_r = 1;
  2118. while ((opt = getopt_long(argc, argv, "l:r:sch",long_options,&option_index)) != -1) {
  2119. //string opt_key;
  2120. //opt_key+=opt;
  2121. switch (opt) {
  2122. case 'l':
  2123. no_l = 0;
  2124. if (strchr(optarg, ':') != 0) {
  2125. sscanf(optarg, "%[^:]:%d", local_address, &local_port);
  2126. } else {
  2127. strcpy(local_address, "127.0.0.1");
  2128. sscanf(optarg, "%d", &local_port);
  2129. }
  2130. break;
  2131. case 'r':
  2132. no_r = 0;
  2133. if (strchr(optarg, ':') != 0) {
  2134. sscanf(optarg, "%[^:]:%d", remote_address, &remote_port);
  2135. } else {
  2136. strcpy(remote_address, "127.0.0.1");
  2137. sscanf(optarg, "%d", &remote_port);
  2138. }
  2139. break;
  2140. case 's':
  2141. if(program_mode==0)
  2142. {
  2143. program_mode=server_mode;
  2144. }
  2145. else
  2146. {
  2147. mylog(log_fatal,"-s /-c has already been set,-s option conflict\n");
  2148. myexit(-1);
  2149. }
  2150. break;
  2151. case 'c':
  2152. if(program_mode==0)
  2153. {
  2154. program_mode=client_mode;
  2155. }
  2156. else
  2157. {
  2158. mylog(log_fatal,"-s /-c has already been set,-c option conflict\n");
  2159. myexit(-1);
  2160. }
  2161. break;
  2162. case 'h':
  2163. break;
  2164. case 'k':
  2165. mylog(log_debug,"parsing key option\n");
  2166. sscanf(optarg,"%s",key_string);
  2167. break;
  2168. case 1:
  2169. mylog(log_debug,"option_index: %d\n",option_index);
  2170. if(strcmp(long_options[option_index].name,"source-ip")==0)
  2171. {
  2172. mylog(log_debug,"parsing long option :source-ip\n");
  2173. sscanf(optarg, "%s", source_address);
  2174. mylog(log_debug,"source: %s\n",source_address);
  2175. }
  2176. else if(strcmp(long_options[option_index].name,"source-port")==0)
  2177. {
  2178. mylog(log_debug,"parsing long option :source-port\n");
  2179. sscanf(optarg, "%d", &source_port);
  2180. mylog(log_info,"source: %d\n",&source_port);
  2181. }
  2182. else if(strcmp(long_options[option_index].name,"raw-mode")==0)
  2183. {
  2184. for(i=0;i<mode_end;i++)
  2185. {
  2186. if(strcmp(optarg,raw_mode_tostring[i].c_str())==0)
  2187. {
  2188. raw_mode=(raw_mode_t)i;
  2189. break;
  2190. }
  2191. }
  2192. if(i==mode_end)
  2193. {
  2194. mylog(log_fatal,"no such raw_mode %s\n",optarg);
  2195. myexit(-1);
  2196. }
  2197. }
  2198. else if(strcmp(long_options[option_index].name,"auth-mode")==0)
  2199. {
  2200. for(i=0;i<auth_end;i++)
  2201. {
  2202. if(strcmp(optarg,auth_mode_tostring[i].c_str())==0)
  2203. {
  2204. auth_mode=(auth_mode_t)i;
  2205. break;
  2206. }
  2207. }
  2208. if(i==auth_end)
  2209. {
  2210. mylog(log_fatal,"no such auth_mode %s\n",optarg);
  2211. myexit(-1);
  2212. }
  2213. }
  2214. else if(strcmp(long_options[option_index].name,"cipher-mode")==0)
  2215. {
  2216. for(i=0;i<cipher_end;i++)
  2217. {
  2218. if(strcmp(optarg,cipher_mode_tostring[i].c_str())==0)
  2219. {
  2220. cipher_mode=(cipher_mode_t)i;
  2221. break;
  2222. }
  2223. }
  2224. if(i==cipher_end)
  2225. {
  2226. mylog(log_fatal,"no such cipher_mode %s\n",optarg);
  2227. myexit(-1);
  2228. }
  2229. }
  2230. else if(strcmp(long_options[option_index].name,"log-level")==0)
  2231. {
  2232. }
  2233. else if(strcmp(long_options[option_index].name,"disable-color")==0)
  2234. {
  2235. //enable_log_color=0;
  2236. }
  2237. else if(strcmp(long_options[option_index].name,"log-position")==0)
  2238. {
  2239. enable_log_position=1;
  2240. }
  2241. else if(strcmp(long_options[option_index].name,"disable-bpf")==0)
  2242. {
  2243. disable_bpf_filter=1;
  2244. }
  2245. else if(strcmp(long_options[option_index].name,"sock-buf")==0)
  2246. {
  2247. int tmp=-1;
  2248. sscanf(optarg,"%d",&tmp);
  2249. if(1<=tmp&&tmp<=10*1024)
  2250. {
  2251. socket_buf_size=tmp*1024;
  2252. }
  2253. else
  2254. {
  2255. mylog(log_fatal,"sock-buf value must be between 1 and 10240 (kbyte) \n");
  2256. myexit(-1);
  2257. }
  2258. }
  2259. else if(strcmp(long_options[option_index].name,"seq-mode")==0)
  2260. {
  2261. sscanf(optarg,"%d",&seq_mode);
  2262. if(1<=seq_mode&&seq_mode<=10*1024)
  2263. {
  2264. }
  2265. else
  2266. {
  2267. mylog(log_fatal,"seq_mode value must be 0,1,or 2 \n");
  2268. myexit(-1);
  2269. }
  2270. }
  2271. else
  2272. {
  2273. mylog(log_warn,"ignored unknown long option ,option_index:%d code:<%x>\n",option_index, optopt);
  2274. }
  2275. break;
  2276. default:
  2277. mylog(log_warn,"ignored unknown option ,code:<%x>\n", optopt);
  2278. }
  2279. }
  2280. if (no_l)
  2281. mylog(log_fatal,"error: -l not found\n");
  2282. if (no_r)
  2283. mylog(log_fatal,"error: -r not found\n");
  2284. if(program_mode==0)
  2285. mylog(log_fatal,"error: -c /-s hasnt been set\n");
  2286. if (no_l || no_r||program_mode==0)
  2287. {
  2288. print_help();
  2289. myexit(-1);
  2290. }
  2291. mylog(log_info,"important variables: ", argc);
  2292. log_bare(log_info,"log_level=%d:%s ",log_level,log_text[log_level]);
  2293. log_bare(log_info,"raw_mode=%s ",raw_mode_tostring[raw_mode].c_str());
  2294. log_bare(log_info,"cipher_mode=%s ",cipher_mode_tostring[cipher_mode].c_str());
  2295. log_bare(log_info,"auth_mode=%s ",auth_mode_tostring[auth_mode].c_str());
  2296. log_bare(log_info,"key=%s ",key_string);
  2297. log_bare(log_info,"local_ip=%s ",local_address);
  2298. log_bare(log_info,"local_port=%d ",local_port);
  2299. log_bare(log_info,"remote_ip=%s ",remote_address);
  2300. log_bare(log_info,"remote_port=%d ",remote_port);
  2301. log_bare(log_info,"source_ip=%s ",source_address);
  2302. log_bare(log_info,"source_port=%d ",source_port);
  2303. log_bare(log_info,"socket_buf_size=%d ",socket_buf_size);
  2304. log_bare(log_info,"\n");
  2305. }
  2306. void iptables_warn()
  2307. {
  2308. if(program_mode==client_mode)
  2309. {
  2310. if(raw_mode==mode_faketcp)
  2311. {
  2312. mylog(log_warn,"make sure you have run once: iptables -A INPUT -s %s/32 -p tcp -m tcp --sport %d -j DROP\n",remote_address,remote_port);
  2313. }
  2314. if(raw_mode==mode_udp)
  2315. {
  2316. mylog(log_warn,"make sure you have run once: iptables -A INPUT -s %s/32 -p udp -m udp --sport %d -j DROP\n",remote_address,remote_port);
  2317. }
  2318. if(raw_mode==mode_icmp)
  2319. {
  2320. mylog(log_warn,"make sure you have run once: iptables -A INPUT -s %s/32 -p icmp -j DROP\n",remote_address);
  2321. }
  2322. }
  2323. if(program_mode==server_mode)
  2324. {
  2325. if(raw_mode==mode_faketcp)
  2326. {
  2327. mylog(log_warn,"make sure you have run once: iptables -A INPUT -p tcp -m tcp --dport %d -j DROP\n",local_port);
  2328. }
  2329. if(raw_mode==mode_udp)
  2330. {
  2331. mylog(log_warn,"make sure you have run once: iptables -A INPUT -p udp -m udp --udp %d -j DROP\n",local_port);
  2332. }
  2333. if(raw_mode==mode_icmp)
  2334. {
  2335. if(local_address_uint32==0)
  2336. {
  2337. mylog(log_warn,"make sure you have run once: iptables -A INPUT -p icmp -j DROP\n");
  2338. }
  2339. else
  2340. {
  2341. mylog(log_warn,"make sure you have run once: iptables -A INPUT -d %s/32 -p icmp -j DROP\n",local_address);
  2342. }
  2343. }
  2344. }
  2345. }
  2346. int main(int argc, char *argv[])
  2347. {
  2348. dup2(1, 2);//redirect stderr to stdout
  2349. signal(SIGINT, INThandler);
  2350. process_arg(argc,argv);
  2351. iptables_warn();
  2352. current_time_rough=get_current_time();
  2353. init_random_number_fd();
  2354. srand(get_true_random_number_nz());
  2355. const_id=get_true_random_number_nz();
  2356. mylog(log_info,"const_id:%x\n",const_id);
  2357. local_address_uint32=inet_addr(local_address);
  2358. remote_address_uint32=inet_addr(remote_address);
  2359. source_address_uint32=inet_addr(source_address);
  2360. char tmp[1000]="";
  2361. strcat(tmp,key_string);
  2362. strcat(tmp,"key1");
  2363. md5((uint8_t*)tmp,strlen(tmp),(uint8_t*)key);
  2364. tmp[0]=0;
  2365. strcat(tmp,key_string);
  2366. strcat(tmp,"key2");
  2367. md5((uint8_t*)tmp,strlen(tmp),(uint8_t*)key2);
  2368. if(program_mode==client_mode)
  2369. {
  2370. client_event_loop();
  2371. }
  2372. else
  2373. {
  2374. server_event_loop();
  2375. }
  2376. return 0;
  2377. }