client.c 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862
  1. /**
  2. * @file client.c
  3. * @author Ambroz Bizjak <ambrop7@gmail.com>
  4. *
  5. * @section LICENSE
  6. *
  7. * This file is part of BadVPN.
  8. *
  9. * BadVPN is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2
  11. * as published by the Free Software Foundation.
  12. *
  13. * BadVPN is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. */
  22. /*
  23. NOTE:
  24. This program works with I/O inside the BPending job environment.
  25. A consequence of this is that in response to an input, we can't
  26. directly do any output, but instead have to schedule outputs.
  27. Because all the buffers used (e.g. server send buffer, data buffers in DataProto)
  28. are based on flow components, it is impossible to directly write two or more
  29. packets to a buffer.
  30. To, for instance, send two packets to a buffer, we have to first schedule
  31. writing the second packet (using BPending), then send the first one.
  32. */
  33. #include <inttypes.h>
  34. #include <stdlib.h>
  35. #include <string.h>
  36. #include <stdio.h>
  37. #include <protocol/msgproto.h>
  38. #include <protocol/addr.h>
  39. #include <protocol/dataproto.h>
  40. #include <misc/version.h>
  41. #include <misc/debug.h>
  42. #include <misc/offset.h>
  43. #include <misc/jenkins_hash.h>
  44. #include <misc/byteorder.h>
  45. #include <misc/ethernet_proto.h>
  46. #include <misc/nsskey.h>
  47. #include <misc/loglevel.h>
  48. #include <misc/loggers_string.h>
  49. #include <structure/LinkedList2.h>
  50. #include <security/BRandom.h>
  51. #include <nspr_support/DummyPRFileDesc.h>
  52. #include <nspr_support/BSocketPRFileDesc.h>
  53. #include <system/BLog.h>
  54. #include <system/BSignal.h>
  55. #include <system/BTime.h>
  56. #include <system/DebugObject.h>
  57. #include <server_connection/ServerConnection.h>
  58. #ifndef BADVPN_USE_WINAPI
  59. #include <system/BLog_syslog.h>
  60. #endif
  61. #include <client/client.h>
  62. #include <generated/blog_channel_client.h>
  63. #define TRANSPORT_MODE_UDP 0
  64. #define TRANSPORT_MODE_TCP 1
  65. #define LOGGER_STDOUT 1
  66. #define LOGGER_SYSLOG 2
  67. // declares and initializes a pointer x to y
  68. #define POINTER(x, y) typeof (y) *(x) = &(y);
  69. // command-line options
  70. struct {
  71. int help;
  72. int version;
  73. int logger;
  74. #ifndef BADVPN_USE_WINAPI
  75. char *logger_syslog_facility;
  76. char *logger_syslog_ident;
  77. #endif
  78. int loglevel;
  79. int loglevels[BLOG_NUM_CHANNELS];
  80. int ssl;
  81. char *nssdb;
  82. char *client_cert_name;
  83. char *server_name;
  84. char *server_addr;
  85. int num_bind_addrs;
  86. struct {
  87. char *addr;
  88. int num_ports;
  89. int num_ext_addrs;
  90. struct {
  91. char *addr;
  92. char *scope;
  93. } ext_addrs[MAX_EXT_ADDRS];
  94. } bind_addrs[MAX_BIND_ADDRS];
  95. char *tapdev;
  96. int transport_mode;
  97. int encryption_mode;
  98. int hash_mode;
  99. int otp_mode;
  100. int otp_num;
  101. int otp_num_warn;
  102. int fragmentation_latency;
  103. int peer_ssl;
  104. char *scopes[MAX_SCOPES];
  105. int num_scopes;
  106. int send_buffer_size;
  107. int send_buffer_relay_size;
  108. } options;
  109. // bind addresses
  110. int num_bind_addrs;
  111. struct {
  112. BAddr addr;
  113. int num_ports;
  114. int num_ext_addrs;
  115. struct {
  116. int server_reported_port;
  117. BAddr addr; // if server_reported_port>=0, defined only after hello received
  118. char scope[64];
  119. } ext_addrs[MAX_EXT_ADDRS];
  120. } bind_addrs[MAX_BIND_ADDRS];
  121. // TCP listeners
  122. PasswordListener listeners[MAX_BIND_ADDRS];
  123. // SPProto parameters (UDP only)
  124. struct spproto_security_params sp_params;
  125. // server address we connect to
  126. BAddr server_addr;
  127. // server name to use for SSL
  128. char server_name[256];
  129. // reactor
  130. BReactor ss;
  131. // client certificate if using SSL
  132. CERTCertificate *client_cert;
  133. // client private key if using SSL
  134. SECKEYPrivateKey *client_key;
  135. // device data
  136. struct device_data device;
  137. // data communication MTU
  138. int data_mtu;
  139. // peers list
  140. LinkedList2 peers;
  141. int num_peers;
  142. // peers by ID hash table
  143. HashTable peers_by_id;
  144. uint32_t peers_by_id_initval;
  145. // frame decider
  146. FrameDecider frame_decider;
  147. // peers that can be user as relays
  148. LinkedList2 relays;
  149. // peers than need a relay
  150. LinkedList2 waiting_relay_peers;
  151. // server connection
  152. ServerConnection server;
  153. // whether server is ready
  154. int server_ready;
  155. // my ID, defined only after server_ready
  156. peerid_t my_id;
  157. // cleans everything up that can be cleaned in order to return
  158. // from the event loop and exit
  159. static void terminate (void);
  160. // prints program name and version to standard output
  161. static void print_help (const char *name);
  162. // prints program name and version to standard output
  163. static void print_version (void);
  164. // parses the command line
  165. static int parse_arguments (int argc, char *argv[]);
  166. // processes certain command line options
  167. static int process_arguments (void);
  168. // handler for program termination request
  169. static void signal_handler (void *unused);
  170. // provides a buffer for sending a packet to the server
  171. static int server_start_msg (void **data, peerid_t peer_id, int type, int len);
  172. // submits a written packet to the server
  173. static void server_end_msg (void);
  174. // adds a new peer
  175. static int peer_add (peerid_t id, int flags, const uint8_t *cert, int cert_len);
  176. // removes a peer
  177. static void peer_remove (struct peer_data *peer);
  178. // deallocates peer resources
  179. static void peer_dealloc (struct peer_data *peer);
  180. // passes a message to the logger, prepending it info about the peer
  181. static void peer_log (struct peer_data *peer, int level, const char *fmt, ...);
  182. // see if we are the master relative to this peer
  183. static int peer_am_master (struct peer_data *peer);
  184. // initializes the link
  185. static int peer_init_link (struct peer_data *peer);
  186. // frees link resources
  187. static void peer_free_link (struct peer_data *peer);
  188. // creates a fresh link
  189. static int peer_new_link (struct peer_data *peer);
  190. // registers the peer as a relay provider
  191. static void peer_enable_relay_provider (struct peer_data *peer);
  192. // unregisters the peer as a relay provider
  193. static void peer_disable_relay_provider (struct peer_data *peer);
  194. // deallocates peer relay provider resources. Inserts relay users to the
  195. // need relay list. Used while freeing a peer.
  196. static void peer_dealloc_relay_provider (struct peer_data *peer);
  197. // install relaying for a peer
  198. static void peer_install_relay (struct peer_data *peer, struct peer_data *relay);
  199. // uninstall relaying for a peer
  200. static void peer_uninstall_relay (struct peer_data *peer);
  201. // deallocates relaying for a peer. Used when the relay is beeing freed,
  202. // and when uninstalling relaying after having released the connection.
  203. static void peer_dealloc_relay (struct peer_data *peer);
  204. // handle a peer that needs a relay
  205. static void peer_need_relay (struct peer_data *peer);
  206. // inserts the peer into the need relay list
  207. static void peer_register_need_relay (struct peer_data *peer);
  208. // removes the peer from the need relay list
  209. static void peer_unregister_need_relay (struct peer_data *peer);
  210. // handle a link setup failure
  211. static int peer_reset (struct peer_data *peer);
  212. // handle incoming peer messages
  213. static void peer_msg (struct peer_data *peer, uint8_t *data, int data_len);
  214. // handlers for different message types
  215. static void peer_msg_youconnect (struct peer_data *peer, uint8_t *data, int data_len);
  216. static void peer_msg_cannotconnect (struct peer_data *peer, uint8_t *data, int data_len);
  217. static void peer_msg_cannotbind (struct peer_data *peer, uint8_t *data, int data_len);
  218. static void peer_msg_seed (struct peer_data *peer, uint8_t *data, int data_len);
  219. static void peer_msg_confirmseed (struct peer_data *peer, uint8_t *data, int data_len);
  220. static void peer_msg_youretry (struct peer_data *peer, uint8_t *data, int data_len);
  221. // handler from DatagramPeerIO when we should generate a new OTP send seed
  222. static void peer_udp_pio_handler_seed_warning (struct peer_data *peer);
  223. // handler from StreamPeerIO when an error occurs on the connection
  224. static void peer_tcp_pio_handler_error (struct peer_data *peer);
  225. // peer retry timer handler. The timer is used only on the master side,
  226. // wither when we detect an error, or the peer reports an error.
  227. static void peer_reset_timer_handler (struct peer_data *peer);
  228. // PacketPassInterface handler for receiving packets from the link
  229. static void peer_recv_handler_send (struct peer_data *peer, uint8_t *data, int data_len);
  230. static void local_recv_qflow_output_handler_done (struct peer_data *peer);
  231. // start binding, according to the protocol
  232. static int peer_start_binding (struct peer_data *peer);
  233. // tries binding on one address, according to the protocol
  234. static int peer_bind (struct peer_data *peer);
  235. static int peer_bind_one_address (struct peer_data *peer, int addr_index, int *cont);
  236. static int peer_connect (struct peer_data *peer, BAddr addr, uint8_t *encryption_key, uint64_t password);
  237. // sends a message with no payload to the peer
  238. static int peer_send_simple (struct peer_data *peer, int msgid);
  239. static int peer_send_conectinfo (struct peer_data *peer, int addr_index, int port_adjust, uint8_t *enckey, uint64_t pass);
  240. static int peer_udp_send_seed (struct peer_data *peer);
  241. static int peer_send_confirmseed (struct peer_data *peer, uint16_t seed_id);
  242. // submits a relayed frame for sending to the peer
  243. static void peer_submit_relayed_frame (struct peer_data *peer, struct peer_data *source_peer, uint8_t *frame, int frame_len);
  244. // handler for peer DataProto up state changes
  245. static void peer_dataproto_handler (struct peer_data *peer, int up);
  246. // looks for a peer with the given ID
  247. static struct peer_data * find_peer_by_id (peerid_t id);
  248. // hash table callback functions
  249. static int peers_by_id_key_comparator (peerid_t *id1, peerid_t *id2);
  250. static int peers_by_id_hash_function (peerid_t *id, int modulo);
  251. // device error handler
  252. static void device_error_handler (void *unused);
  253. // PacketPassInterfacre handler for packets from the device
  254. static void device_input_handler_send (void *unused, uint8_t *data, int data_len);
  255. // submits a local frame for sending to the peer. The frame is taken from the device frame buffer.
  256. static void submit_frame_to_peer (struct peer_data *peer, uint8_t *data, int data_len);
  257. // assign relays to clients waiting for them
  258. static void assign_relays (void);
  259. // checks if the given address scope is known (i.e. we can connect to an address in it)
  260. static char * address_scope_known (uint8_t *name, int name_len);
  261. // handlers for server messages
  262. static void server_handler_error (void *user);
  263. static void server_handler_ready (void *user, peerid_t param_my_id, uint32_t ext_ip);
  264. static void server_handler_newclient (void *user, peerid_t peer_id, int flags, const uint8_t *cert, int cert_len);
  265. static void server_handler_endclient (void *user, peerid_t peer_id);
  266. static void server_handler_message (void *user, peerid_t peer_id, uint8_t *data, int data_len);
  267. // process job handlers
  268. static void peer_job_send_seed_after_binding (struct peer_data *peer);
  269. int main (int argc, char *argv[])
  270. {
  271. if (argc <= 0) {
  272. return 1;
  273. }
  274. // parse command-line arguments
  275. if (!parse_arguments(argc, argv)) {
  276. fprintf(stderr, "Failed to parse arguments\n");
  277. print_help(argv[0]);
  278. goto fail0;
  279. }
  280. // handle --help and --version
  281. if (options.help) {
  282. print_version();
  283. print_help(argv[0]);
  284. return 0;
  285. }
  286. if (options.version) {
  287. print_version();
  288. return 0;
  289. }
  290. // initialize logger
  291. switch (options.logger) {
  292. case LOGGER_STDOUT:
  293. BLog_InitStdout();
  294. break;
  295. #ifndef BADVPN_USE_WINAPI
  296. case LOGGER_SYSLOG:
  297. if (!BLog_InitSyslog(options.logger_syslog_ident, options.logger_syslog_facility)) {
  298. fprintf(stderr, "Failed to initialize syslog logger\n");
  299. goto fail0;
  300. }
  301. break;
  302. #endif
  303. default:
  304. ASSERT(0);
  305. }
  306. // configure logger channels
  307. for (int i = 0; i < BLOG_NUM_CHANNELS; i++) {
  308. if (options.loglevels[i] >= 0) {
  309. BLog_SetChannelLoglevel(i, options.loglevels[i]);
  310. }
  311. else if (options.loglevel >= 0) {
  312. BLog_SetChannelLoglevel(i, options.loglevel);
  313. }
  314. }
  315. BLog(BLOG_NOTICE, "initializing "GLOBAL_PRODUCT_NAME" client "GLOBAL_VERSION);
  316. // initialize sockets
  317. if (BSocket_GlobalInit() < 0) {
  318. BLog(BLOG_ERROR, "BSocket_GlobalInit failed");
  319. goto fail1;
  320. }
  321. // init time
  322. BTime_Init();
  323. // process arguments
  324. if (!process_arguments()) {
  325. BLog(BLOG_ERROR, "Failed to process arguments");
  326. goto fail1;
  327. }
  328. // init reactor
  329. if (!BReactor_Init(&ss)) {
  330. BLog(BLOG_ERROR, "BReactor_Init failed");
  331. goto fail1;
  332. }
  333. // setup signal handler
  334. if (!BSignal_Init()) {
  335. BLog(BLOG_ERROR, "BSignal_Init failed");
  336. goto fail1b;
  337. }
  338. BSignal_Capture();
  339. if (!BSignal_SetHandler(&ss, signal_handler, NULL)) {
  340. BLog(BLOG_ERROR, "BSignal_SetHandler failed");
  341. goto fail1b;
  342. }
  343. if (options.ssl) {
  344. // init NSPR
  345. PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
  346. // register local NSPR file types
  347. if (!DummyPRFileDesc_GlobalInit()) {
  348. BLog(BLOG_ERROR, "DummyPRFileDesc_GlobalInit failed");
  349. goto fail2;
  350. }
  351. if (!BSocketPRFileDesc_GlobalInit()) {
  352. BLog(BLOG_ERROR, "BSocketPRFileDesc_GlobalInit failed");
  353. goto fail2;
  354. }
  355. // init NSS
  356. if (NSS_Init(options.nssdb) != SECSuccess) {
  357. BLog(BLOG_ERROR, "NSS_Init failed (%d)", (int)PR_GetError());
  358. goto fail2;
  359. }
  360. // set cipher policy
  361. if (NSS_SetDomesticPolicy() != SECSuccess) {
  362. BLog(BLOG_ERROR, "NSS_SetDomesticPolicy failed (%d)", (int)PR_GetError());
  363. goto fail3;
  364. }
  365. // init server cache
  366. if (SSL_ConfigServerSessionIDCache(0, 0, 0, NULL) != SECSuccess) {
  367. BLog(BLOG_ERROR, "SSL_ConfigServerSessionIDCache failed (%d)", (int)PR_GetError());
  368. goto fail3;
  369. }
  370. // open server certificate and private key
  371. if (!open_nss_cert_and_key(options.client_cert_name, &client_cert, &client_key)) {
  372. BLog(BLOG_ERROR, "Cannot open certificate and key");
  373. goto fail4;
  374. }
  375. }
  376. // init listeners
  377. int num_listeners = 0;
  378. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  379. while (num_listeners < num_bind_addrs) {
  380. POINTER(addr, bind_addrs[num_listeners])
  381. if (!PasswordListener_Init(
  382. &listeners[num_listeners], &ss, addr->addr, 50, options.peer_ssl,
  383. (options.peer_ssl ? client_cert : NULL),
  384. (options.peer_ssl ? client_key : NULL)
  385. )) {
  386. BLog(BLOG_ERROR, "PasswordListener_Init failed");
  387. goto fail5;
  388. }
  389. num_listeners++;
  390. }
  391. }
  392. // init device
  393. if (!BTap_Init(&device.btap, &ss, options.tapdev, device_error_handler, NULL)) {
  394. BLog(BLOG_ERROR, "BTap_Init failed");
  395. goto fail5;
  396. }
  397. // remember device MTU
  398. device.mtu = sizeof(struct ethernet_header) + BTap_GetDeviceMTU(&device.btap);
  399. BLog(BLOG_INFO, "device MTU is %d", device.mtu);
  400. // init device input
  401. PacketPassInterface_Init(&device.input_interface, device.mtu, device_input_handler_send, NULL, BReactor_PendingGroup(&ss));
  402. if (!SinglePacketBuffer_Init(&device.input_buffer, BTap_GetOutput(&device.btap), &device.input_interface, BReactor_PendingGroup(&ss))) {
  403. goto fail5a;
  404. }
  405. // init device output
  406. PacketPassFairQueue_Init(&device.output_queue, BTap_GetInput(&device.btap), BReactor_PendingGroup(&ss), 1);
  407. // calculate data MTU
  408. data_mtu = DATAPROTO_MAX_OVERHEAD + device.mtu;
  409. // init peers list
  410. LinkedList2_Init(&peers);
  411. num_peers = 0;
  412. // init peers by ID hash table
  413. BRandom_randomize((uint8_t *)&peers_by_id_initval, sizeof(peers_by_id_initval));
  414. if (!HashTable_Init(
  415. &peers_by_id,
  416. OFFSET_DIFF(struct peer_data, id, table_node),
  417. (HashTable_comparator)peers_by_id_key_comparator,
  418. (HashTable_hash_function)peers_by_id_hash_function,
  419. MAX_PEERS
  420. )) {
  421. BLog(BLOG_ERROR, "HashTable_Init failed");
  422. goto fail7;
  423. }
  424. // init frame decider
  425. FrameDecider_Init(&frame_decider, PEER_MAX_MACS, PEER_MAX_GROUPS, IGMP_GROUP_MEMBERSHIP_INTERVAL, IGMP_LAST_MEMBER_QUERY_TIME, &ss);
  426. // init relays list
  427. LinkedList2_Init(&relays);
  428. // init need relay list
  429. LinkedList2_Init(&waiting_relay_peers);
  430. // start connecting to server
  431. if (!ServerConnection_Init(
  432. &server, &ss, server_addr, SC_KEEPALIVE_INTERVAL, SERVER_BUFFER_MIN_PACKETS, options.ssl, client_cert, client_key, server_name, NULL,
  433. server_handler_error, server_handler_ready, server_handler_newclient, server_handler_endclient, server_handler_message
  434. )) {
  435. BLog(BLOG_ERROR, "ServerConnection_Init failed");
  436. goto fail10;
  437. }
  438. // set server not ready
  439. server_ready = 0;
  440. goto event_loop;
  441. // cleanup on error
  442. fail10:
  443. FrameDecider_Free(&frame_decider);
  444. HashTable_Free(&peers_by_id);
  445. fail7:
  446. PacketPassFairQueue_Free(&device.output_queue);
  447. SinglePacketBuffer_Free(&device.input_buffer);
  448. fail5a:
  449. PacketPassInterface_Free(&device.input_interface);
  450. BTap_Free(&device.btap);
  451. fail5:
  452. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  453. while (num_listeners-- > 0) {
  454. PasswordListener_Free(&listeners[num_listeners]);
  455. }
  456. }
  457. fail4a:
  458. if (options.ssl) {
  459. CERT_DestroyCertificate(client_cert);
  460. SECKEY_DestroyPrivateKey(client_key);
  461. fail4:
  462. SSL_ShutdownServerSessionIDCache();
  463. fail3:
  464. SSL_ClearSessionCache();
  465. ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
  466. fail2:
  467. ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
  468. PL_ArenaFinish();
  469. }
  470. BSignal_RemoveHandler();
  471. fail1b:
  472. BReactor_Free(&ss);
  473. fail1:
  474. BLog(BLOG_ERROR, "initialization failed");
  475. BLog_Free();
  476. fail0:
  477. // finish objects
  478. DebugObjectGlobal_Finish();
  479. return 1;
  480. event_loop:
  481. // enter event loop
  482. BLog(BLOG_NOTICE, "entering event loop");
  483. int ret = BReactor_Exec(&ss);
  484. // free reactor
  485. BReactor_Free(&ss);
  486. // free logger
  487. BLog(BLOG_NOTICE, "exiting");
  488. BLog_Free();
  489. // finish objects
  490. DebugObjectGlobal_Finish();
  491. return ret;
  492. }
  493. void terminate (void)
  494. {
  495. BLog(BLOG_NOTICE, "tearing down");
  496. // allow freeing local receive flows
  497. PacketPassFairQueue_PrepareFree(&device.output_queue);
  498. // free peers
  499. LinkedList2Node *node;
  500. while (node = LinkedList2_GetFirst(&peers)) {
  501. struct peer_data *peer = UPPER_OBJECT(node, struct peer_data, list_node);
  502. // free relaying
  503. if (peer->have_relaying) {
  504. struct peer_data *relay = peer->relaying_peer;
  505. ASSERT(relay->is_relay)
  506. ASSERT(relay->have_link)
  507. // free relay provider
  508. peer_dealloc_relay_provider(relay);
  509. }
  510. // free relay provider
  511. if (peer->is_relay) {
  512. peer_dealloc_relay_provider(peer);
  513. }
  514. // free relay source
  515. DataProtoRelaySource_FreeRelease(&peer->relay_source);
  516. // deallocate peer
  517. peer_dealloc(peer);
  518. }
  519. // free server
  520. ServerConnection_Free(&server);
  521. // free frame decider
  522. FrameDecider_Free(&frame_decider);
  523. // free hash tables
  524. HashTable_Free(&peers_by_id);
  525. // free device output
  526. PacketPassFairQueue_Free(&device.output_queue);
  527. // free device input
  528. SinglePacketBuffer_Free(&device.input_buffer);
  529. PacketPassInterface_Free(&device.input_interface);
  530. // free device
  531. BTap_Free(&device.btap);
  532. // free listeners
  533. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  534. for (int i = num_bind_addrs - 1; i >= 0; i--) {
  535. PasswordListener_Free(&listeners[i]);
  536. }
  537. }
  538. if (options.ssl) {
  539. // free client certificate and private key
  540. CERT_DestroyCertificate(client_cert);
  541. SECKEY_DestroyPrivateKey(client_key);
  542. // free server cache
  543. ASSERT_FORCE(SSL_ShutdownServerSessionIDCache() == SECSuccess)
  544. // free client cache
  545. SSL_ClearSessionCache();
  546. // free NSS
  547. ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
  548. // free NSPR
  549. ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
  550. PL_ArenaFinish();
  551. }
  552. // remove signal handler
  553. BSignal_RemoveHandler();
  554. // exit reactor
  555. BReactor_Quit(&ss, 1);
  556. }
  557. void print_help (const char *name)
  558. {
  559. printf(
  560. "Usage:\n"
  561. " %s\n"
  562. " [--help]\n"
  563. " [--version]\n"
  564. " [--logger <"LOGGERS_STRING">]\n"
  565. #ifndef BADVPN_USE_WINAPI
  566. " (logger=syslog?\n"
  567. " [--syslog-facility <string>]\n"
  568. " [--syslog-ident <string>]\n"
  569. " )\n"
  570. #endif
  571. " [--loglevel <0-5/none/error/warning/notice/info/debug>]\n"
  572. " [--channel-loglevel <channel-name> <0-5/none/error/warning/notice/info/debug>] ...\n"
  573. " [--ssl --nssdb <string> --client-cert-name <string>]\n"
  574. " [--server-name <string>]\n"
  575. " --server-addr <addr>\n"
  576. " [--tapdev <name>]\n"
  577. " [--scope <scope_name>] ...\n"
  578. " [\n"
  579. " --bind-addr <addr>\n"
  580. " (transport-mode=udp? --num-ports <num>)\n"
  581. " [--ext-addr <addr / {server_reported}:port> <scope_name>] ...\n"
  582. " ] ...\n"
  583. " --transport-mode <udp/tcp>\n"
  584. " (transport-mode=udp?\n"
  585. " --encryption-mode <blowfish/aes/none>\n"
  586. " --hash-mode <md5/sha1/none>\n"
  587. " [--otp <blowfish/aes> <num> <num-warn>]\n"
  588. " [--fragmentation-latency <milliseconds>]\n"
  589. " )\n"
  590. " (transport-mode=tcp?\n"
  591. " (ssl? [--peer-ssl])\n"
  592. " )\n"
  593. " [--send-buffer-size <num-packets>]\n"
  594. " [--send-buffer-relay-size <num-packets>]\n"
  595. "Address format is a.b.c.d:port (IPv4) or [addr]:port (IPv6).\n",
  596. name
  597. );
  598. }
  599. void print_version (void)
  600. {
  601. printf(GLOBAL_PRODUCT_NAME" "PROGRAM_NAME" "GLOBAL_VERSION"\n"GLOBAL_COPYRIGHT_NOTICE"\n");
  602. }
  603. int parse_arguments (int argc, char *argv[])
  604. {
  605. if (argc <= 0) {
  606. return 0;
  607. }
  608. options.help = 0;
  609. options.version = 0;
  610. options.logger = LOGGER_STDOUT;
  611. #ifndef BADVPN_USE_WINAPI
  612. options.logger_syslog_facility = "daemon";
  613. options.logger_syslog_ident = argv[0];
  614. #endif
  615. options.loglevel = -1;
  616. for (int i = 0; i < BLOG_NUM_CHANNELS; i++) {
  617. options.loglevels[i] = -1;
  618. }
  619. options.ssl = 0;
  620. options.nssdb = NULL;
  621. options.client_cert_name = NULL;
  622. options.server_name = NULL;
  623. options.server_addr = NULL;
  624. options.tapdev = NULL;
  625. options.num_scopes = 0;
  626. options.num_bind_addrs = 0;
  627. options.transport_mode = -1;
  628. options.encryption_mode = -1;
  629. options.hash_mode = -1;
  630. options.otp_mode = SPPROTO_OTP_MODE_NONE;
  631. options.fragmentation_latency = PEER_DEFAULT_FRAGMENTATION_LATENCY;
  632. options.peer_ssl = 0;
  633. options.send_buffer_size = PEER_DEFAULT_SEND_BUFFER_SIZE;
  634. options.send_buffer_relay_size = PEER_DEFAULT_SEND_BUFFER_RELAY_SIZE;
  635. int have_fragmentation_latency = 0;
  636. int i;
  637. for (i = 1; i < argc; i++) {
  638. char *arg = argv[i];
  639. if (!strcmp(arg, "--help")) {
  640. options.help = 1;
  641. }
  642. else if (!strcmp(arg, "--version")) {
  643. options.version = 1;
  644. }
  645. else if (!strcmp(arg, "--logger")) {
  646. if (1 >= argc - i) {
  647. fprintf(stderr, "%s: requires an argument\n", arg);
  648. return 0;
  649. }
  650. char *arg2 = argv[i + 1];
  651. if (!strcmp(arg2, "stdout")) {
  652. options.logger = LOGGER_STDOUT;
  653. }
  654. #ifndef BADVPN_USE_WINAPI
  655. else if (!strcmp(arg2, "syslog")) {
  656. options.logger = LOGGER_SYSLOG;
  657. }
  658. #endif
  659. else {
  660. fprintf(stderr, "%s: wrong argument\n", arg);
  661. return 0;
  662. }
  663. i++;
  664. }
  665. #ifndef BADVPN_USE_WINAPI
  666. else if (!strcmp(arg, "--syslog-facility")) {
  667. if (1 >= argc - i) {
  668. fprintf(stderr, "%s: requires an argument\n", arg);
  669. return 0;
  670. }
  671. options.logger_syslog_facility = argv[i + 1];
  672. i++;
  673. }
  674. else if (!strcmp(arg, "--syslog-ident")) {
  675. if (1 >= argc - i) {
  676. fprintf(stderr, "%s: requires an argument\n", arg);
  677. return 0;
  678. }
  679. options.logger_syslog_ident = argv[i + 1];
  680. i++;
  681. }
  682. #endif
  683. else if (!strcmp(arg, "--loglevel")) {
  684. if (1 >= argc - i) {
  685. fprintf(stderr, "%s: requires an argument\n", arg);
  686. return 0;
  687. }
  688. if ((options.loglevel = parse_loglevel(argv[i + 1])) < 0) {
  689. fprintf(stderr, "%s: wrong argument\n", arg);
  690. return 0;
  691. }
  692. i++;
  693. }
  694. else if (!strcmp(arg, "--channel-loglevel")) {
  695. if (2 >= argc - i) {
  696. fprintf(stderr, "%s: requires two arguments\n", arg);
  697. return 0;
  698. }
  699. int channel = BLogGlobal_GetChannelByName(argv[i + 1]);
  700. if (channel < 0) {
  701. fprintf(stderr, "%s: wrong channel argument\n", arg);
  702. return 0;
  703. }
  704. int loglevel = parse_loglevel(argv[i + 2]);
  705. if (loglevel < 0) {
  706. fprintf(stderr, "%s: wrong loglevel argument\n", arg);
  707. return 0;
  708. }
  709. options.loglevels[channel] = loglevel;
  710. i += 2;
  711. }
  712. else if (!strcmp(arg, "--ssl")) {
  713. options.ssl = 1;
  714. }
  715. else if (!strcmp(arg, "--nssdb")) {
  716. if (1 >= argc - i) {
  717. fprintf(stderr, "%s: requires an argument\n", arg);
  718. return 0;
  719. }
  720. options.nssdb = argv[i + 1];
  721. i++;
  722. }
  723. else if (!strcmp(arg, "--client-cert-name")) {
  724. if (1 >= argc - i) {
  725. fprintf(stderr, "%s: requires an argument\n", arg);
  726. return 0;
  727. }
  728. options.client_cert_name = argv[i + 1];
  729. i++;
  730. }
  731. else if (!strcmp(arg, "--server-name")) {
  732. if (1 >= argc - i) {
  733. fprintf(stderr, "%s: requires an argument\n", arg);
  734. return 0;
  735. }
  736. options.server_name = argv[i + 1];
  737. i++;
  738. }
  739. else if (!strcmp(arg, "--server-addr")) {
  740. if (1 >= argc - i) {
  741. fprintf(stderr, "%s: requires an argument\n", arg);
  742. return 0;
  743. }
  744. options.server_addr = argv[i + 1];
  745. i++;
  746. }
  747. else if (!strcmp(arg, "--tapdev")) {
  748. if (1 >= argc - i) {
  749. fprintf(stderr, "%s: requires an argument\n", arg);
  750. return 0;
  751. }
  752. options.tapdev = argv[i + 1];
  753. i++;
  754. }
  755. else if (!strcmp(arg, "--scope")) {
  756. if (1 >= argc - i) {
  757. fprintf(stderr, "%s: requires an argument\n", arg);
  758. return 0;
  759. }
  760. if (options.num_scopes == MAX_SCOPES) {
  761. fprintf(stderr, "%s: too many\n", arg);
  762. return 0;
  763. }
  764. options.scopes[options.num_scopes] = argv[i + 1];
  765. options.num_scopes++;
  766. i++;
  767. }
  768. else if (!strcmp(arg, "--bind-addr")) {
  769. if (1 >= argc - i) {
  770. fprintf(stderr, "%s: requires an argument\n", arg);
  771. return 0;
  772. }
  773. if (options.num_bind_addrs == MAX_BIND_ADDRS) {
  774. fprintf(stderr, "%s: too many\n", arg);
  775. return 0;
  776. }
  777. POINTER(addr, options.bind_addrs[options.num_bind_addrs])
  778. addr->addr = argv[i + 1];
  779. addr->num_ports = -1;
  780. addr->num_ext_addrs = 0;
  781. options.num_bind_addrs++;
  782. i++;
  783. }
  784. else if (!strcmp(arg, "--num-ports")) {
  785. if (1 >= argc - i) {
  786. fprintf(stderr, "%s: requires an argument\n", arg);
  787. return 0;
  788. }
  789. if (options.num_bind_addrs == 0) {
  790. fprintf(stderr, "%s: must folow --bind-addr\n", arg);
  791. return 0;
  792. }
  793. POINTER(addr, options.bind_addrs[options.num_bind_addrs - 1])
  794. if ((addr->num_ports = atoi(argv[i + 1])) < 0) {
  795. fprintf(stderr, "%s: wrong argument\n", arg);
  796. return 0;
  797. }
  798. i++;
  799. }
  800. else if (!strcmp(arg, "--ext-addr")) {
  801. if (2 >= argc - i) {
  802. fprintf(stderr, "%s: requires two arguments\n", arg);
  803. return 0;
  804. }
  805. if (options.num_bind_addrs == 0) {
  806. fprintf(stderr, "%s: must folow --bind-addr\n", arg);
  807. return 0;
  808. }
  809. POINTER(addr, options.bind_addrs[options.num_bind_addrs - 1])
  810. if (addr->num_ext_addrs == MAX_EXT_ADDRS) {
  811. fprintf(stderr, "%s: too many\n", arg);
  812. return 0;
  813. }
  814. POINTER(eaddr, addr->ext_addrs[addr->num_ext_addrs])
  815. eaddr->addr = argv[i + 1];
  816. eaddr->scope = argv[i + 2];
  817. addr->num_ext_addrs++;
  818. i += 2;
  819. }
  820. else if (!strcmp(arg, "--transport-mode")) {
  821. if (1 >= argc - i) {
  822. fprintf(stderr, "%s: requires an argument\n", arg);
  823. return 0;
  824. }
  825. char *arg2 = argv[i + 1];
  826. if (!strcmp(arg2, "udp")) {
  827. options.transport_mode = TRANSPORT_MODE_UDP;
  828. }
  829. else if (!strcmp(arg2, "tcp")) {
  830. options.transport_mode = TRANSPORT_MODE_TCP;
  831. }
  832. else {
  833. fprintf(stderr, "%s: wrong argument\n", arg);
  834. return 0;
  835. }
  836. i++;
  837. }
  838. else if (!strcmp(arg, "--encryption-mode")) {
  839. if (1 >= argc - i) {
  840. fprintf(stderr, "%s: requires an argument\n", arg);
  841. return 0;
  842. }
  843. char *arg2 = argv[i + 1];
  844. if (!strcmp(arg2, "none")) {
  845. options.encryption_mode = SPPROTO_ENCRYPTION_MODE_NONE;
  846. }
  847. else if (!strcmp(arg2, "blowfish")) {
  848. options.encryption_mode = BENCRYPTION_CIPHER_BLOWFISH;
  849. }
  850. else if (!strcmp(arg2, "aes")) {
  851. options.encryption_mode = BENCRYPTION_CIPHER_AES;
  852. }
  853. else {
  854. fprintf(stderr, "%s: wrong argument\n", arg);
  855. return 0;
  856. }
  857. i++;
  858. }
  859. else if (!strcmp(arg, "--hash-mode")) {
  860. if (1 >= argc - i) {
  861. fprintf(stderr, "%s: requires an argument\n", arg);
  862. return 0;
  863. }
  864. char *arg2 = argv[i + 1];
  865. if (!strcmp(arg2, "none")) {
  866. options.hash_mode = SPPROTO_HASH_MODE_NONE;
  867. }
  868. else if (!strcmp(arg2, "md5")) {
  869. options.hash_mode = BHASH_TYPE_MD5;
  870. }
  871. else if (!strcmp(arg2, "sha1")) {
  872. options.hash_mode = BHASH_TYPE_SHA1;
  873. }
  874. else {
  875. fprintf(stderr, "%s: wrong argument\n", arg);
  876. return 0;
  877. }
  878. i++;
  879. }
  880. else if (!strcmp(arg, "--otp")) {
  881. if (3 >= argc - i) {
  882. fprintf(stderr, "%s: requires three arguments\n", arg);
  883. return 0;
  884. }
  885. char *otp_mode = argv[i + 1];
  886. char *otp_num = argv[i + 2];
  887. char *otp_num_warn = argv[i + 3];
  888. if (!strcmp(otp_mode, "blowfish")) {
  889. options.otp_mode = BENCRYPTION_CIPHER_BLOWFISH;
  890. }
  891. else if (!strcmp(otp_mode, "aes")) {
  892. options.otp_mode = BENCRYPTION_CIPHER_AES;
  893. }
  894. else {
  895. fprintf(stderr, "%s: wrong mode\n", arg);
  896. return 0;
  897. }
  898. if ((options.otp_num = atoi(otp_num)) <= 0) {
  899. fprintf(stderr, "%s: wrong num\n", arg);
  900. return 0;
  901. }
  902. options.otp_num_warn = atoi(otp_num_warn);
  903. if (options.otp_num_warn <= 0 || options.otp_num_warn > options.otp_num) {
  904. fprintf(stderr, "%s: wrong num warn\n", arg);
  905. return 0;
  906. }
  907. i += 3;
  908. }
  909. else if (!strcmp(arg, "--fragmentation-latency")) {
  910. if (1 >= argc - i) {
  911. fprintf(stderr, "%s: requires an argument\n", arg);
  912. return 0;
  913. }
  914. options.fragmentation_latency = atoi(argv[i + 1]);
  915. have_fragmentation_latency = 1;
  916. i++;
  917. }
  918. else if (!strcmp(arg, "--peer-ssl")) {
  919. options.peer_ssl = 1;
  920. }
  921. else if (!strcmp(arg, "--send-buffer-size")) {
  922. if (1 >= argc - i) {
  923. fprintf(stderr, "%s: requires an argument\n", arg);
  924. return 0;
  925. }
  926. if ((options.send_buffer_size = atoi(argv[i + 1])) <= 0) {
  927. fprintf(stderr, "%s: wrong argument\n", arg);
  928. return 0;
  929. }
  930. i++;
  931. }
  932. else if (!strcmp(arg, "--send-buffer-relay-size")) {
  933. if (1 >= argc - i) {
  934. fprintf(stderr, "%s: requires an argument\n", arg);
  935. return 0;
  936. }
  937. if ((options.send_buffer_relay_size = atoi(argv[i + 1])) <= 0) {
  938. fprintf(stderr, "%s: wrong argument\n", arg);
  939. return 0;
  940. }
  941. i++;
  942. }
  943. else {
  944. fprintf(stderr, "unknown option: %s\n", arg);
  945. return 0;
  946. }
  947. }
  948. if (options.help || options.version) {
  949. return 1;
  950. }
  951. if (options.ssl != !!options.nssdb) {
  952. fprintf(stderr, "False: --ssl <=> --nssdb\n");
  953. return 0;
  954. }
  955. if (options.ssl != !!options.client_cert_name) {
  956. fprintf(stderr, "False: --ssl <=> --client-cert-name\n");
  957. return 0;
  958. }
  959. if (!options.server_addr) {
  960. fprintf(stderr, "False: --server-addr\n");
  961. return 0;
  962. }
  963. if (options.transport_mode < 0) {
  964. fprintf(stderr, "False: --transport-mode\n");
  965. return 0;
  966. }
  967. if ((options.transport_mode == TRANSPORT_MODE_UDP) != (options.encryption_mode >= 0)) {
  968. fprintf(stderr, "False: UDP <=> --encryption-mode\n");
  969. return 0;
  970. }
  971. if ((options.transport_mode == TRANSPORT_MODE_UDP) != (options.hash_mode >= 0)) {
  972. fprintf(stderr, "False: UDP <=> --hash-mode\n");
  973. return 0;
  974. }
  975. if (!(!(options.otp_mode != SPPROTO_OTP_MODE_NONE) || (options.transport_mode == TRANSPORT_MODE_UDP))) {
  976. fprintf(stderr, "False: --otp => UDP\n");
  977. return 0;
  978. }
  979. if (!(!have_fragmentation_latency || (options.transport_mode == TRANSPORT_MODE_UDP))) {
  980. fprintf(stderr, "False: --fragmentation-latency => UDP\n");
  981. return 0;
  982. }
  983. if (!(!options.peer_ssl || (options.ssl && options.transport_mode == TRANSPORT_MODE_TCP))) {
  984. fprintf(stderr, "False: --peer-ssl => (--ssl && TCP)\n");
  985. return 0;
  986. }
  987. return 1;
  988. }
  989. int process_arguments (void)
  990. {
  991. // resolve server address
  992. ASSERT(options.server_addr)
  993. if (!BAddr_Parse(&server_addr, options.server_addr, server_name, sizeof(server_name))) {
  994. BLog(BLOG_ERROR, "server addr: BAddr_Parse failed");
  995. return 0;
  996. }
  997. if (!addr_supported(server_addr)) {
  998. BLog(BLOG_ERROR, "server addr: not supported");
  999. return 0;
  1000. }
  1001. // override server name if requested
  1002. if (options.server_name) {
  1003. snprintf(server_name, sizeof(server_name), "%s", options.server_name);
  1004. }
  1005. // resolve bind addresses and external addresses
  1006. num_bind_addrs = 0;
  1007. for (int i = 0; i < options.num_bind_addrs; i++) {
  1008. POINTER(addr, options.bind_addrs[i])
  1009. POINTER(out, bind_addrs[num_bind_addrs])
  1010. // read addr
  1011. if (!BAddr_Parse(&out->addr, addr->addr, NULL, 0)) {
  1012. BLog(BLOG_ERROR, "bind addr: BAddr_Parse failed");
  1013. return 0;
  1014. }
  1015. // read num ports
  1016. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1017. if (addr->num_ports < 0) {
  1018. BLog(BLOG_ERROR, "bind addr: num ports missing");
  1019. return 0;
  1020. }
  1021. out->num_ports = addr->num_ports;
  1022. }
  1023. else if (addr->num_ports >= 0) {
  1024. BLog(BLOG_ERROR, "bind addr: num ports given, but not using UDP");
  1025. return 0;
  1026. }
  1027. // read ext addrs
  1028. out->num_ext_addrs = 0;
  1029. for (int j = 0; j < addr->num_ext_addrs; j++) {
  1030. POINTER(eaddr, addr->ext_addrs[j])
  1031. POINTER(eout, out->ext_addrs[out->num_ext_addrs])
  1032. // read addr
  1033. char *colon = strstr(eaddr->addr, ":");
  1034. if (!colon) {
  1035. BLog(BLOG_ERROR, "ext addr: no colon");
  1036. return 0;
  1037. }
  1038. char addrstr[colon - eaddr->addr + 1];
  1039. memcpy(addrstr, eaddr->addr, colon - eaddr->addr);
  1040. addrstr[colon - eaddr->addr] = '\0';
  1041. if (!strcmp(addrstr, "{server_reported}")) {
  1042. if ((eout->server_reported_port = atoi(colon + 1)) < 0) {
  1043. BLog(BLOG_ERROR, "ext addr: wrong port");
  1044. return 0;
  1045. }
  1046. } else {
  1047. eout->server_reported_port = -1;
  1048. if (!BAddr_Parse(&eout->addr, eaddr->addr, NULL, 0)) {
  1049. BLog(BLOG_ERROR, "ext addr: BAddr_Parse failed");
  1050. return 0;
  1051. }
  1052. }
  1053. // read scope
  1054. snprintf(eout->scope, sizeof(eout->scope), "%s", eaddr->scope);
  1055. out->num_ext_addrs++;
  1056. }
  1057. num_bind_addrs++;
  1058. }
  1059. // initialize SPProto parameters
  1060. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1061. sp_params.encryption_mode = options.encryption_mode;
  1062. sp_params.hash_mode = options.hash_mode;
  1063. sp_params.otp_mode = options.otp_mode;
  1064. if (options.otp_mode > 0) {
  1065. sp_params.otp_num = options.otp_num;
  1066. }
  1067. }
  1068. return 1;
  1069. }
  1070. void signal_handler (void *unused)
  1071. {
  1072. BLog(BLOG_NOTICE, "termination requested");
  1073. terminate();
  1074. return;
  1075. }
  1076. int server_start_msg (void **data, peerid_t peer_id, int type, int len)
  1077. {
  1078. ASSERT(server_ready)
  1079. ASSERT(len >= 0)
  1080. ASSERT(len <= MSG_MAX_PAYLOAD)
  1081. ASSERT(!(len > 0) || data)
  1082. uint8_t *packet;
  1083. if (!ServerConnection_StartMessage(&server, (void **)&packet, peer_id, msg_SIZEtype + msg_SIZEpayload(len))) {
  1084. BLog(BLOG_ERROR, "out of server buffer, exiting");
  1085. terminate();
  1086. return -1;
  1087. }
  1088. msgWriter writer;
  1089. msgWriter_Init(&writer, packet);
  1090. msgWriter_Addtype(&writer, type);
  1091. uint8_t *payload_dst = msgWriter_Addpayload(&writer, len);
  1092. msgWriter_Finish(&writer);
  1093. if (data) {
  1094. *data = payload_dst;
  1095. }
  1096. return 0;
  1097. }
  1098. void server_end_msg (void)
  1099. {
  1100. ASSERT(server_ready)
  1101. ServerConnection_EndMessage(&server);
  1102. }
  1103. int peer_add (peerid_t id, int flags, const uint8_t *cert, int cert_len)
  1104. {
  1105. ASSERT(server_ready)
  1106. ASSERT(num_peers < MAX_PEERS)
  1107. ASSERT(!find_peer_by_id(id))
  1108. ASSERT(id != my_id)
  1109. ASSERT(cert_len >= 0)
  1110. ASSERT(cert_len <= SCID_NEWCLIENT_MAX_CERT_LEN)
  1111. // allocate structure
  1112. struct peer_data *peer = malloc(sizeof(*peer));
  1113. if (!peer) {
  1114. BLog(BLOG_ERROR, "peer %d: failed to allocate memory", (int)id);
  1115. goto fail0;
  1116. }
  1117. // remember id
  1118. peer->id = id;
  1119. // remember flags
  1120. peer->flags = flags;
  1121. // remember certificate if using SSL
  1122. if (options.ssl) {
  1123. memcpy(peer->cert, cert, cert_len);
  1124. peer->cert_len = cert_len;
  1125. }
  1126. // init local flow
  1127. if (!DataProtoLocalSource_Init(&peer->local_dpflow, device.mtu, my_id, peer->id, options.send_buffer_size, &ss)) {
  1128. peer_log(peer, BLOG_ERROR, "DataProtoLocalSource_Init failed");
  1129. goto fail1;
  1130. }
  1131. // init local receive flow
  1132. PacketPassFairQueueFlow_Init(&peer->local_recv_qflow, &device.output_queue);
  1133. peer->local_recv_if = PacketPassFairQueueFlow_GetInput(&peer->local_recv_qflow);
  1134. PacketPassInterface_Sender_Init(peer->local_recv_if, (PacketPassInterface_handler_done)local_recv_qflow_output_handler_done, peer);
  1135. // init relay source
  1136. DataProtoRelaySource_Init(&peer->relay_source, peer->id);
  1137. // have no link
  1138. peer->have_link = 0;
  1139. // allocate OTP seed buffers
  1140. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_OTP(sp_params)) {
  1141. if (!(peer->pio.udp.sendseed_sent_key = malloc(BEncryption_cipher_key_size(sp_params.otp_mode)))) {
  1142. goto fail3;
  1143. }
  1144. if (!(peer->pio.udp.sendseed_sent_iv = malloc(BEncryption_cipher_block_size(sp_params.otp_mode)))) {
  1145. goto fail4;
  1146. }
  1147. }
  1148. // have no relaying
  1149. peer->have_relaying = 0;
  1150. // not waiting for relay
  1151. peer->waiting_relay = 0;
  1152. // init retry timer
  1153. BTimer_Init(&peer->reset_timer, PEER_RETRY_TIME, (BTimer_handler)peer_reset_timer_handler, peer);
  1154. // init frame decider peer
  1155. if (!FrameDeciderPeer_Init(&peer->decider_peer, &frame_decider)) {
  1156. goto fail5;
  1157. }
  1158. // is not relay server
  1159. peer->is_relay = 0;
  1160. // init binding
  1161. peer->binding = 0;
  1162. // init jobs
  1163. BPending_Init(&peer->job_send_seed_after_binding, BReactor_PendingGroup(&ss), (BPending_handler)peer_job_send_seed_after_binding, peer);
  1164. // add to peers linked list
  1165. LinkedList2_Append(&peers, &peer->list_node);
  1166. // add to peers-by-ID hash table
  1167. ASSERT_EXECUTE(HashTable_Insert(&peers_by_id, &peer->table_node))
  1168. // increment number of peers
  1169. num_peers++;
  1170. peer_log(peer, BLOG_INFO, "initialized");
  1171. // start setup process
  1172. if (peer_am_master(peer)) {
  1173. return peer_start_binding(peer);
  1174. } else {
  1175. return 0;
  1176. }
  1177. fail5:
  1178. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_OTP(sp_params)) {
  1179. free(peer->pio.udp.sendseed_sent_iv);
  1180. fail4:
  1181. free(peer->pio.udp.sendseed_sent_key);
  1182. }
  1183. fail3:
  1184. DataProtoRelaySource_Free(&peer->relay_source);
  1185. PacketPassFairQueueFlow_Free(&peer->local_recv_qflow);
  1186. DataProtoLocalSource_Free(&peer->local_dpflow);
  1187. fail1:
  1188. free(peer);
  1189. fail0:
  1190. return 0;
  1191. }
  1192. void peer_remove (struct peer_data *peer)
  1193. {
  1194. peer_log(peer, BLOG_INFO, "removing");
  1195. // uninstall relaying
  1196. if (peer->have_relaying) {
  1197. peer_uninstall_relay(peer);
  1198. }
  1199. // disable relay provider
  1200. // this inserts former relay users into the need relay list
  1201. if (peer->is_relay) {
  1202. peer_dealloc_relay_provider(peer);
  1203. }
  1204. // release relay flows
  1205. DataProtoRelaySource_Release(&peer->relay_source);
  1206. // release local receive flow
  1207. if (PacketPassFairQueueFlow_IsBusy(&peer->local_recv_qflow)) {
  1208. PacketPassFairQueueFlow_Release(&peer->local_recv_qflow);
  1209. }
  1210. // deallocate peer
  1211. peer_dealloc(peer);
  1212. // assign relays because former relay users are disconnected above
  1213. assign_relays();
  1214. }
  1215. void peer_dealloc (struct peer_data *peer)
  1216. {
  1217. ASSERT(!peer->have_relaying)
  1218. ASSERT(!peer->is_relay)
  1219. ASSERT(DataProtoRelaySource_IsEmpty(&peer->relay_source))
  1220. PacketPassFairQueueFlow_AssertFree(&peer->local_recv_qflow);
  1221. LinkedList2Iterator it;
  1222. LinkedList2Node *node;
  1223. // remove from waiting relay list
  1224. if (peer->waiting_relay) {
  1225. peer_unregister_need_relay(peer);
  1226. }
  1227. // free link
  1228. if (peer->have_link) {
  1229. peer_free_link(peer);
  1230. }
  1231. // decrement number of peers
  1232. num_peers--;
  1233. // remove from peers-by-ID hash table
  1234. ASSERT_EXECUTE(HashTable_Remove(&peers_by_id, &peer->id))
  1235. // remove from peers linked list
  1236. LinkedList2_Remove(&peers, &peer->list_node);
  1237. // free jobs
  1238. BPending_Free(&peer->job_send_seed_after_binding);
  1239. // free frame decider
  1240. FrameDeciderPeer_Free(&peer->decider_peer);
  1241. // free retry timer
  1242. BReactor_RemoveTimer(&ss, &peer->reset_timer);
  1243. // free OTP seed buffers
  1244. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_OTP(sp_params)) {
  1245. free(peer->pio.udp.sendseed_sent_iv);
  1246. free(peer->pio.udp.sendseed_sent_key);
  1247. }
  1248. // free relay source
  1249. DataProtoRelaySource_Free(&peer->relay_source);
  1250. // free local receive flow
  1251. PacketPassFairQueueFlow_Free(&peer->local_recv_qflow);
  1252. // free local flow
  1253. DataProtoLocalSource_Free(&peer->local_dpflow);
  1254. // free peer structure
  1255. free(peer);
  1256. }
  1257. void peer_log (struct peer_data *peer, int level, const char *fmt, ...)
  1258. {
  1259. va_list vl;
  1260. va_start(vl, fmt);
  1261. BLog_Append("peer %d: ", (int)peer->id);
  1262. BLog_LogToChannelVarArg(BLOG_CURRENT_CHANNEL, level, fmt, vl);
  1263. va_end(vl);
  1264. }
  1265. int peer_am_master (struct peer_data *peer)
  1266. {
  1267. return (my_id > peer->id);
  1268. }
  1269. int peer_init_link (struct peer_data *peer)
  1270. {
  1271. ASSERT(!peer->have_link)
  1272. ASSERT(!peer->have_relaying)
  1273. ASSERT(!peer->waiting_relay)
  1274. ASSERT(!peer->is_relay)
  1275. // init link receive interface
  1276. PacketPassInterface_Init(&peer->recv_ppi, data_mtu, (PacketPassInterface_handler_send)peer_recv_handler_send, peer, BReactor_PendingGroup(&ss));
  1277. // init transport-specific link objects
  1278. PacketPassInterface *link_if;
  1279. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1280. // init DatagramPeerIO
  1281. if (!DatagramPeerIO_Init(
  1282. &peer->pio.udp.pio, &ss, data_mtu, CLIENT_UDP_MTU,
  1283. sp_params, options.fragmentation_latency,
  1284. &peer->recv_ppi
  1285. )) {
  1286. peer_log(peer, BLOG_ERROR, "DatagramPeerIO_Init failed");
  1287. goto fail1;
  1288. }
  1289. // init OTP warning handler
  1290. if (SPPROTO_HAVE_OTP(sp_params)) {
  1291. DatagramPeerIO_SetOTPWarningHandler(&peer->pio.udp.pio, (DatagramPeerIO_handler_otp_warning)peer_udp_pio_handler_seed_warning, peer, options.otp_num_warn);
  1292. }
  1293. // init send seed state
  1294. if (SPPROTO_HAVE_OTP(sp_params)) {
  1295. peer->pio.udp.sendseed_nextid = 0;
  1296. peer->pio.udp.sendseed_sent = 0;
  1297. }
  1298. link_if = DatagramPeerIO_GetSendInput(&peer->pio.udp.pio);
  1299. } else {
  1300. // init StreamPeerIO
  1301. if (!StreamPeerIO_Init(
  1302. &peer->pio.tcp.pio, &ss, options.peer_ssl,
  1303. (options.peer_ssl ? peer->cert : NULL),
  1304. (options.peer_ssl ? peer->cert_len : -1),
  1305. data_mtu, &peer->recv_ppi,
  1306. (StreamPeerIO_handler_error)peer_tcp_pio_handler_error, peer
  1307. )) {
  1308. peer_log(peer, BLOG_ERROR, "StreamPeerIO_Init failed");
  1309. goto fail1;
  1310. }
  1311. link_if = StreamPeerIO_GetSendInput(&peer->pio.tcp.pio);
  1312. }
  1313. // init sending
  1314. if (!DataProtoDest_Init(&peer->send_dp, &ss, peer->id, link_if, PEER_KEEPALIVE_INTERVAL, PEER_KEEPALIVE_RECEIVE_TIMER, (DataProtoDest_handler)peer_dataproto_handler, peer)) {
  1315. peer_log(peer, BLOG_ERROR, "DataProto_Init failed");
  1316. goto fail2;
  1317. }
  1318. // attach local flow to our DataProto
  1319. DataProtoLocalSource_Attach(&peer->local_dpflow, &peer->send_dp);
  1320. peer->have_link = 1;
  1321. return 1;
  1322. fail2:
  1323. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1324. DatagramPeerIO_Free(&peer->pio.udp.pio);
  1325. } else {
  1326. StreamPeerIO_Free(&peer->pio.tcp.pio);
  1327. }
  1328. fail1:
  1329. PacketPassInterface_Free(&peer->recv_ppi);
  1330. return 0;
  1331. }
  1332. void peer_free_link (struct peer_data *peer)
  1333. {
  1334. ASSERT(peer->have_link)
  1335. ASSERT(!peer->is_relay)
  1336. ASSERT(!peer->have_relaying)
  1337. ASSERT(!peer->waiting_relay)
  1338. // allow detaching DataProto flows
  1339. DataProtoDest_PrepareFree(&peer->send_dp);
  1340. // detach local flow from our DataProto
  1341. DataProtoLocalSource_Detach(&peer->local_dpflow);
  1342. // free sending
  1343. DataProtoDest_Free(&peer->send_dp);
  1344. // free transport-specific link objects
  1345. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1346. // free DatagramPeerIO
  1347. DatagramPeerIO_Free(&peer->pio.udp.pio);
  1348. } else {
  1349. // free StreamPeerIO
  1350. StreamPeerIO_Free(&peer->pio.tcp.pio);
  1351. }
  1352. // free common link objects
  1353. PacketPassInterface_Free(&peer->recv_ppi);
  1354. peer->have_link = 0;
  1355. }
  1356. int peer_new_link (struct peer_data *peer)
  1357. {
  1358. if (peer->have_link) {
  1359. if (peer->is_relay) {
  1360. peer_disable_relay_provider(peer);
  1361. }
  1362. peer_free_link(peer);
  1363. }
  1364. else if (peer->have_relaying) {
  1365. peer_uninstall_relay(peer);
  1366. }
  1367. else if (peer->waiting_relay) {
  1368. peer_unregister_need_relay(peer);
  1369. }
  1370. if (!peer_init_link(peer)) {
  1371. return 0;
  1372. }
  1373. return 1;
  1374. }
  1375. void peer_enable_relay_provider (struct peer_data *peer)
  1376. {
  1377. ASSERT(peer->have_link)
  1378. ASSERT(!peer->is_relay)
  1379. ASSERT(!peer->have_relaying)
  1380. ASSERT(!peer->waiting_relay)
  1381. // add to relays list
  1382. LinkedList2_Append(&relays, &peer->relay_list_node);
  1383. // init users list
  1384. LinkedList2_Init(&peer->relay_users);
  1385. peer->is_relay = 1;
  1386. // assign relays
  1387. assign_relays();
  1388. }
  1389. void peer_disable_relay_provider (struct peer_data *peer)
  1390. {
  1391. ASSERT(peer->is_relay)
  1392. ASSERT(peer->have_link)
  1393. ASSERT(!peer->have_relaying)
  1394. ASSERT(!peer->waiting_relay)
  1395. // disconnect relay users
  1396. LinkedList2Node *list_node;
  1397. while (list_node = LinkedList2_GetFirst(&peer->relay_users)) {
  1398. struct peer_data *relay_user = UPPER_OBJECT(list_node, struct peer_data, relaying_list_node);
  1399. ASSERT(relay_user->have_relaying)
  1400. ASSERT(relay_user->relaying_peer == peer)
  1401. // disconnect relay user
  1402. peer_uninstall_relay(relay_user);
  1403. // add it to need relay list
  1404. peer_register_need_relay(relay_user);
  1405. }
  1406. // remove from relays list
  1407. LinkedList2_Remove(&relays, &peer->relay_list_node);
  1408. peer->is_relay = 0;
  1409. // assign relays
  1410. assign_relays();
  1411. }
  1412. void peer_dealloc_relay_provider (struct peer_data *peer)
  1413. {
  1414. ASSERT(peer->is_relay)
  1415. ASSERT(peer->have_link)
  1416. ASSERT(!peer->have_relaying)
  1417. ASSERT(!peer->waiting_relay)
  1418. // allow detaching DataProto flows from the relay peer
  1419. DataProtoDest_PrepareFree(&peer->send_dp);
  1420. // disconnect relay users
  1421. LinkedList2Node *list_node;
  1422. while (list_node = LinkedList2_GetFirst(&peer->relay_users)) {
  1423. struct peer_data *relay_user = UPPER_OBJECT(list_node, struct peer_data, relaying_list_node);
  1424. ASSERT(relay_user->have_relaying)
  1425. ASSERT(relay_user->relaying_peer == peer)
  1426. // disconnect relay user
  1427. peer_dealloc_relay(relay_user);
  1428. // add it to need relay list
  1429. peer_register_need_relay(relay_user);
  1430. }
  1431. // remove from relays list
  1432. LinkedList2_Remove(&relays, &peer->relay_list_node);
  1433. peer->is_relay = 0;
  1434. }
  1435. void peer_install_relay (struct peer_data *peer, struct peer_data *relay)
  1436. {
  1437. ASSERT(!peer->have_relaying)
  1438. ASSERT(!peer->have_link)
  1439. ASSERT(!peer->waiting_relay)
  1440. ASSERT(relay->is_relay)
  1441. ASSERT(!peer->is_relay)
  1442. ASSERT(relay->have_link)
  1443. peer_log(peer, BLOG_INFO, "installing relaying through %d", (int)relay->id);
  1444. // remember relaying peer
  1445. peer->relaying_peer = relay;
  1446. // add to relay's users list
  1447. LinkedList2_Append(&relay->relay_users, &peer->relaying_list_node);
  1448. // attach local flow to relay
  1449. DataProtoLocalSource_Attach(&peer->local_dpflow, &relay->send_dp);
  1450. peer->have_relaying = 1;
  1451. }
  1452. void peer_uninstall_relay (struct peer_data *peer)
  1453. {
  1454. ASSERT(peer->have_relaying)
  1455. ASSERT(!peer->have_link)
  1456. ASSERT(!peer->waiting_relay)
  1457. struct peer_data *relay = peer->relaying_peer;
  1458. ASSERT(relay->is_relay)
  1459. ASSERT(relay->have_link)
  1460. peer_log(peer, BLOG_INFO, "uninstalling relaying through %d", (int)relay->id);
  1461. // release local flow before detaching it
  1462. DataProtoLocalSource_Release(&peer->local_dpflow);
  1463. // link out relay
  1464. peer_dealloc_relay(peer);
  1465. }
  1466. void peer_dealloc_relay (struct peer_data *peer)
  1467. {
  1468. ASSERT(peer->have_relaying)
  1469. ASSERT(!peer->have_link)
  1470. ASSERT(!peer->waiting_relay)
  1471. struct peer_data *relay = peer->relaying_peer;
  1472. ASSERT(relay->is_relay)
  1473. ASSERT(relay->have_link)
  1474. // detach local flow from relay
  1475. DataProtoLocalSource_Detach(&peer->local_dpflow);
  1476. // remove from relay's users list
  1477. LinkedList2_Remove(&relay->relay_users, &peer->relaying_list_node);
  1478. peer->have_relaying = 0;
  1479. }
  1480. void peer_need_relay (struct peer_data *peer)
  1481. {
  1482. ASSERT(!peer->is_relay)
  1483. if (peer->have_link) {
  1484. peer_free_link(peer);
  1485. }
  1486. if (peer->have_relaying) {
  1487. peer_uninstall_relay(peer);
  1488. }
  1489. if (peer->waiting_relay) {
  1490. // already waiting for relay, do nothing
  1491. return;
  1492. }
  1493. // register the peer as needing a relay
  1494. peer_register_need_relay(peer);
  1495. // assign relays
  1496. assign_relays();
  1497. }
  1498. void peer_register_need_relay (struct peer_data *peer)
  1499. {
  1500. ASSERT(!peer->waiting_relay)
  1501. ASSERT(!peer->have_link)
  1502. ASSERT(!peer->have_relaying)
  1503. ASSERT(!peer->is_relay)
  1504. // add to need relay list
  1505. LinkedList2_Append(&waiting_relay_peers, &peer->waiting_relay_list_node);
  1506. peer->waiting_relay = 1;
  1507. }
  1508. void peer_unregister_need_relay (struct peer_data *peer)
  1509. {
  1510. ASSERT(peer->waiting_relay)
  1511. ASSERT(!peer->have_link)
  1512. ASSERT(!peer->have_relaying)
  1513. ASSERT(!peer->is_relay)
  1514. // remove from need relay list
  1515. LinkedList2_Remove(&waiting_relay_peers, &peer->waiting_relay_list_node);
  1516. peer->waiting_relay = 0;
  1517. }
  1518. int peer_reset (struct peer_data *peer)
  1519. {
  1520. peer_log(peer, BLOG_NOTICE, "resetting");
  1521. if (peer_am_master(peer)) {
  1522. // if we're the master, schedule retry
  1523. BReactor_SetTimer(&ss, &peer->reset_timer);
  1524. } else {
  1525. // if we're the slave, report to master
  1526. if (peer_send_simple(peer, MSGID_YOURETRY) < 0) {
  1527. return -1;
  1528. }
  1529. }
  1530. return 0;
  1531. }
  1532. void peer_msg (struct peer_data *peer, uint8_t *data, int data_len)
  1533. {
  1534. ASSERT(server_ready)
  1535. ASSERT(data_len >= 0)
  1536. ASSERT(data_len <= SC_MAX_MSGLEN)
  1537. // parse message
  1538. msgParser parser;
  1539. if (!msgParser_Init(&parser, data, data_len)) {
  1540. peer_log(peer, BLOG_NOTICE, "msg: failed to parse");
  1541. return;
  1542. }
  1543. // read message
  1544. uint16_t type;
  1545. ASSERT_EXECUTE(msgParser_Gettype(&parser, &type))
  1546. uint8_t *payload;
  1547. int payload_len;
  1548. ASSERT_EXECUTE(msgParser_Getpayload(&parser, &payload, &payload_len))
  1549. // dispatch according to message type
  1550. switch (type) {
  1551. case MSGID_YOUCONNECT:
  1552. peer_msg_youconnect(peer, payload, payload_len);
  1553. return;
  1554. case MSGID_CANNOTCONNECT:
  1555. peer_msg_cannotconnect(peer, payload, payload_len);
  1556. return;
  1557. case MSGID_CANNOTBIND:
  1558. peer_msg_cannotbind(peer, payload, payload_len);
  1559. return;
  1560. case MSGID_YOURETRY:
  1561. peer_msg_youretry(peer, payload, payload_len);
  1562. return;
  1563. case MSGID_SEED:
  1564. peer_msg_seed(peer, payload, payload_len);
  1565. return;
  1566. case MSGID_CONFIRMSEED:
  1567. peer_msg_confirmseed(peer, payload, payload_len);
  1568. return;
  1569. default:
  1570. BLog(BLOG_NOTICE, "msg: unknown type");
  1571. return;
  1572. }
  1573. }
  1574. void peer_msg_youconnect (struct peer_data *peer, uint8_t *data, int data_len)
  1575. {
  1576. // init parser
  1577. msg_youconnectParser parser;
  1578. if (!msg_youconnectParser_Init(&parser, data, data_len)) {
  1579. peer_log(peer, BLOG_WARNING, "msg_youconnect: failed to parse");
  1580. return;
  1581. }
  1582. // try addresses
  1583. BAddr addr;
  1584. while (1) {
  1585. // get address message
  1586. uint8_t *addrmsg_data;
  1587. int addrmsg_len;
  1588. if (!msg_youconnectParser_Getaddr(&parser, &addrmsg_data, &addrmsg_len)) {
  1589. peer_log(peer, BLOG_NOTICE, "msg_youconnect: no usable addresses");
  1590. peer_send_simple(peer, MSGID_CANNOTCONNECT);
  1591. return;
  1592. }
  1593. // parse address message
  1594. msg_youconnect_addrParser aparser;
  1595. if (!msg_youconnect_addrParser_Init(&aparser, addrmsg_data, addrmsg_len)) {
  1596. peer_log(peer, BLOG_WARNING, "msg_youconnect: failed to parse address message");
  1597. return;
  1598. }
  1599. // check if the address scope is known
  1600. uint8_t *name_data;
  1601. int name_len;
  1602. ASSERT_EXECUTE(msg_youconnect_addrParser_Getname(&aparser, &name_data, &name_len))
  1603. char *name;
  1604. if (!(name = address_scope_known(name_data, name_len))) {
  1605. continue;
  1606. }
  1607. // read address
  1608. uint8_t *addr_data;
  1609. int addr_len;
  1610. ASSERT_EXECUTE(msg_youconnect_addrParser_Getaddr(&aparser, &addr_data, &addr_len))
  1611. if (!addr_read(addr_data, addr_len, &addr)) {
  1612. peer_log(peer, BLOG_WARNING, "msg_youconnect: failed to read address");
  1613. return;
  1614. }
  1615. peer_log(peer, BLOG_NOTICE, "msg_youconnect: using address in scope '%s'", name);
  1616. break;
  1617. }
  1618. // discard further addresses
  1619. msg_youconnectParser_Forwardaddr(&parser);
  1620. uint8_t *key = NULL;
  1621. uint64_t password = 0;
  1622. // read additonal parameters
  1623. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1624. if (SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  1625. int key_len;
  1626. if (!msg_youconnectParser_Getkey(&parser, &key, &key_len)) {
  1627. peer_log(peer, BLOG_WARNING, "msg_youconnect: no key");
  1628. return;
  1629. }
  1630. if (key_len != BEncryption_cipher_key_size(sp_params.encryption_mode)) {
  1631. peer_log(peer, BLOG_WARNING, "msg_youconnect: wrong key size");
  1632. return;
  1633. }
  1634. }
  1635. } else {
  1636. if (!msg_youconnectParser_Getpassword(&parser, &password)) {
  1637. peer_log(peer, BLOG_WARNING, "msg_youconnect: no password");
  1638. return;
  1639. }
  1640. }
  1641. if (!msg_youconnectParser_GotEverything(&parser)) {
  1642. peer_log(peer, BLOG_WARNING, "msg_youconnect: stray data");
  1643. return;
  1644. }
  1645. peer_log(peer, BLOG_INFO, "connecting");
  1646. peer_connect(peer, addr, key, password);
  1647. return;
  1648. }
  1649. void peer_msg_cannotconnect (struct peer_data *peer, uint8_t *data, int data_len)
  1650. {
  1651. if (data_len != 0) {
  1652. peer_log(peer, BLOG_WARNING, "msg_cannotconnect: invalid length");
  1653. return;
  1654. }
  1655. if (!peer->binding) {
  1656. peer_log(peer, BLOG_WARNING, "msg_cannotconnect: not binding");
  1657. return;
  1658. }
  1659. peer_log(peer, BLOG_INFO, "peer could not connect");
  1660. // continue trying bind addresses
  1661. peer_bind(peer);
  1662. return;
  1663. }
  1664. void peer_msg_cannotbind (struct peer_data *peer, uint8_t *data, int data_len)
  1665. {
  1666. if (data_len != 0) {
  1667. peer_log(peer, BLOG_WARNING, "msg_cannotbind: invalid length");
  1668. return;
  1669. }
  1670. peer_log(peer, BLOG_INFO, "peer cannot bind");
  1671. if (!peer_am_master(peer)) {
  1672. peer_start_binding(peer);
  1673. return;
  1674. } else {
  1675. if (!peer->is_relay) {
  1676. peer_need_relay(peer);
  1677. }
  1678. }
  1679. }
  1680. void peer_msg_seed (struct peer_data *peer, uint8_t *data, int data_len)
  1681. {
  1682. msg_seedParser parser;
  1683. if (!msg_seedParser_Init(&parser, data, data_len)) {
  1684. peer_log(peer, BLOG_WARNING, "msg_seed: failed to parse");
  1685. return;
  1686. }
  1687. // read message
  1688. uint16_t seed_id;
  1689. ASSERT_EXECUTE(msg_seedParser_Getseed_id(&parser, &seed_id))
  1690. uint8_t *key;
  1691. int key_len;
  1692. ASSERT_EXECUTE(msg_seedParser_Getkey(&parser, &key, &key_len))
  1693. uint8_t *iv;
  1694. int iv_len;
  1695. ASSERT_EXECUTE(msg_seedParser_Getiv(&parser, &iv, &iv_len))
  1696. if (options.transport_mode != TRANSPORT_MODE_UDP) {
  1697. peer_log(peer, BLOG_WARNING, "msg_seed: not in UDP mode");
  1698. return;
  1699. }
  1700. if (!SPPROTO_HAVE_OTP(sp_params)) {
  1701. peer_log(peer, BLOG_WARNING, "msg_seed: OTPs disabled");
  1702. return;
  1703. }
  1704. if (key_len != BEncryption_cipher_key_size(sp_params.otp_mode)) {
  1705. peer_log(peer, BLOG_WARNING, "msg_seed: wrong key length");
  1706. return;
  1707. }
  1708. if (iv_len != BEncryption_cipher_block_size(sp_params.otp_mode)) {
  1709. peer_log(peer, BLOG_WARNING, "msg_seed: wrong IV length");
  1710. return;
  1711. }
  1712. if (!peer->have_link) {
  1713. peer_log(peer, BLOG_WARNING, "msg_seed: have no link");
  1714. return;
  1715. }
  1716. peer_log(peer, BLOG_DEBUG, "received OTP receive seed");
  1717. // add receive seed
  1718. DatagramPeerIO_AddOTPRecvSeed(&peer->pio.udp.pio, seed_id, key, iv);
  1719. // send confirmation
  1720. peer_send_confirmseed(peer, seed_id);
  1721. return;
  1722. }
  1723. void peer_msg_confirmseed (struct peer_data *peer, uint8_t *data, int data_len)
  1724. {
  1725. msg_confirmseedParser parser;
  1726. if (!msg_confirmseedParser_Init(&parser, data, data_len)) {
  1727. peer_log(peer, BLOG_WARNING, "msg_confirmseed: failed to parse");
  1728. return;
  1729. }
  1730. // read message
  1731. uint16_t seed_id;
  1732. ASSERT_EXECUTE(msg_confirmseedParser_Getseed_id(&parser, &seed_id))
  1733. if (options.transport_mode != TRANSPORT_MODE_UDP) {
  1734. peer_log(peer, BLOG_WARNING, "msg_confirmseed: not in UDP mode");
  1735. return;
  1736. }
  1737. if (!SPPROTO_HAVE_OTP(sp_params)) {
  1738. peer_log(peer, BLOG_WARNING, "msg_confirmseed: OTPs disabled");
  1739. return;
  1740. }
  1741. if (!peer->have_link) {
  1742. peer_log(peer, BLOG_WARNING, "msg_confirmseed: have no link");
  1743. return;
  1744. }
  1745. if (!peer->pio.udp.sendseed_sent) {
  1746. peer_log(peer, BLOG_WARNING, "msg_confirmseed: no seed has been sent");
  1747. return;
  1748. }
  1749. if (seed_id != peer->pio.udp.sendseed_sent_id) {
  1750. peer_log(peer, BLOG_WARNING, "msg_confirmseed: invalid seed: expecting %d, received %d", (int)peer->pio.udp.sendseed_sent_id, (int)seed_id);
  1751. return;
  1752. }
  1753. peer_log(peer, BLOG_DEBUG, "OTP send seed confirmed");
  1754. // no longer waiting for confirmation
  1755. peer->pio.udp.sendseed_sent = 0;
  1756. // start using the seed
  1757. DatagramPeerIO_SetOTPSendSeed(&peer->pio.udp.pio, peer->pio.udp.sendseed_sent_id, peer->pio.udp.sendseed_sent_key, peer->pio.udp.sendseed_sent_iv);
  1758. }
  1759. void peer_msg_youretry (struct peer_data *peer, uint8_t *data, int data_len)
  1760. {
  1761. if (data_len != 0) {
  1762. peer_log(peer, BLOG_WARNING, "msg_youretry: invalid length");
  1763. return;
  1764. }
  1765. if (!peer_am_master(peer)) {
  1766. peer_log(peer, BLOG_WARNING, "msg_youretry: we are not master");
  1767. return;
  1768. }
  1769. peer_log(peer, BLOG_NOTICE, "requests reset");
  1770. peer_reset(peer);
  1771. return;
  1772. }
  1773. void peer_udp_pio_handler_seed_warning (struct peer_data *peer)
  1774. {
  1775. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  1776. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  1777. ASSERT(peer->have_link)
  1778. // generate and send a new seed
  1779. if (!peer->pio.udp.sendseed_sent) {
  1780. peer_udp_send_seed(peer);
  1781. return;
  1782. }
  1783. }
  1784. void peer_tcp_pio_handler_error (struct peer_data *peer)
  1785. {
  1786. ASSERT(options.transport_mode == TRANSPORT_MODE_TCP)
  1787. ASSERT(peer->have_link)
  1788. peer_log(peer, BLOG_NOTICE, "TCP connection failed");
  1789. peer_reset(peer);
  1790. return;
  1791. }
  1792. void peer_reset_timer_handler (struct peer_data *peer)
  1793. {
  1794. ASSERT(peer_am_master(peer))
  1795. BLog(BLOG_NOTICE, "retry timer expired");
  1796. // start setup process
  1797. peer_start_binding(peer);
  1798. return;
  1799. }
  1800. void peer_recv_handler_send (struct peer_data *peer, uint8_t *data, int data_len)
  1801. {
  1802. ASSERT(peer->have_link)
  1803. ASSERT(data_len >= 0)
  1804. ASSERT(data_len <= data_mtu)
  1805. uint8_t *orig_data = data;
  1806. int orig_data_len = data_len;
  1807. int dp_good = 0;
  1808. struct peer_data *relay = NULL;
  1809. int local = 0;
  1810. // check dataproto header
  1811. if (data_len < sizeof(struct dataproto_header)) {
  1812. peer_log(peer, BLOG_NOTICE, "receive: no dataproto header");
  1813. goto out;
  1814. }
  1815. struct dataproto_header *header = (struct dataproto_header *)data;
  1816. data += sizeof(struct dataproto_header);
  1817. data_len -= sizeof(struct dataproto_header);
  1818. uint8_t flags = header->flags;
  1819. peerid_t from_id = ltoh16(header->from_id);
  1820. int num_ids = ltoh16(header->num_peer_ids);
  1821. // check destination IDs
  1822. if (num_ids > 1) {
  1823. peer_log(peer, BLOG_NOTICE, "receive: too many destination IDs");
  1824. goto out;
  1825. }
  1826. if (data_len < num_ids * sizeof(struct dataproto_peer_id)) {
  1827. peer_log(peer, BLOG_NOTICE, "receive: invalid length for destination IDs");
  1828. goto out;
  1829. }
  1830. struct dataproto_peer_id *ids = (struct dataproto_peer_id *)data;
  1831. data += num_ids * sizeof(struct dataproto_peer_id);
  1832. data_len -= num_ids * sizeof(struct dataproto_peer_id);
  1833. // check remaining data
  1834. if (data_len > device.mtu) {
  1835. peer_log(peer, BLOG_NOTICE, "receive: frame too large");
  1836. goto out;
  1837. }
  1838. dp_good = 1;
  1839. if (num_ids == 0) {
  1840. goto out;
  1841. }
  1842. // find source peer
  1843. struct peer_data *src_peer = find_peer_by_id(from_id);
  1844. if (!src_peer) {
  1845. peer_log(peer, BLOG_NOTICE, "receive: source peer %d not known", (int)from_id);
  1846. goto out;
  1847. }
  1848. // find destination
  1849. peerid_t id = ltoh16(ids[0].id);
  1850. if (id == my_id) {
  1851. // frame is for us
  1852. // let the frame decider analyze the frame
  1853. FrameDeciderPeer_Analyze(&peer->decider_peer, data, data_len);
  1854. local = 1;
  1855. } else {
  1856. // frame is for someone else
  1857. // make sure the client is allowed to relay though us
  1858. if (!(peer->flags & SCID_NEWCLIENT_FLAG_RELAY_CLIENT)) {
  1859. peer_log(peer, BLOG_NOTICE, "relaying not allowed");
  1860. goto out;
  1861. }
  1862. // lookup destination peer
  1863. struct peer_data *dest_peer = find_peer_by_id(id);
  1864. if (!dest_peer) {
  1865. peer_log(peer, BLOG_NOTICE, "relay destination peer not known");
  1866. goto out;
  1867. }
  1868. // check if the destination peer has link
  1869. if (!dest_peer->have_link) {
  1870. peer_log(peer, BLOG_NOTICE, "relay destination peer has no link");
  1871. goto out;
  1872. }
  1873. relay = dest_peer;
  1874. }
  1875. out:
  1876. // accept packet
  1877. if (!local) {
  1878. PacketPassInterface_Done(&peer->recv_ppi);
  1879. }
  1880. // relay frame
  1881. if (relay) {
  1882. peer_submit_relayed_frame(relay, src_peer, data, data_len);
  1883. }
  1884. // submit to device
  1885. if (local) {
  1886. PacketPassInterface_Sender_Send(peer->local_recv_if, data, data_len);
  1887. }
  1888. // inform DataProto of received packet
  1889. if (dp_good) {
  1890. DataProtoDest_Received(&peer->send_dp, !!(flags & DATAPROTO_FLAGS_RECEIVING_KEEPALIVES));
  1891. }
  1892. }
  1893. void local_recv_qflow_output_handler_done (struct peer_data *peer)
  1894. {
  1895. PacketPassInterface_Done(&peer->recv_ppi);
  1896. }
  1897. int peer_start_binding (struct peer_data *peer)
  1898. {
  1899. peer->binding = 1;
  1900. peer->binding_addrpos = 0;
  1901. return peer_bind(peer);
  1902. }
  1903. int peer_bind (struct peer_data *peer)
  1904. {
  1905. ASSERT(peer->binding)
  1906. ASSERT(peer->binding_addrpos >= 0)
  1907. ASSERT(peer->binding_addrpos <= num_bind_addrs)
  1908. int res;
  1909. while (peer->binding_addrpos < num_bind_addrs) {
  1910. // if there are no external addresses, skip bind address
  1911. if (bind_addrs[peer->binding_addrpos].num_ext_addrs == 0) {
  1912. peer->binding_addrpos++;
  1913. continue;
  1914. }
  1915. // try to bind
  1916. int cont;
  1917. if (peer_bind_one_address(peer, peer->binding_addrpos, &cont) < 0) {
  1918. return -1;
  1919. }
  1920. // increment address counter
  1921. peer->binding_addrpos++;
  1922. if (!cont) {
  1923. return 0;
  1924. }
  1925. }
  1926. peer_log(peer, BLOG_NOTICE, "no more addresses to bind to");
  1927. // no longer binding
  1928. peer->binding = 0;
  1929. // tell the peer we failed to bind
  1930. if (peer_send_simple(peer, MSGID_CANNOTBIND) < 0) {
  1931. return -1;
  1932. }
  1933. // if we are the slave, setup relaying
  1934. if (!peer_am_master(peer)) {
  1935. if (!peer->is_relay) {
  1936. peer_need_relay(peer);
  1937. }
  1938. }
  1939. return 0;
  1940. }
  1941. int peer_bind_one_address (struct peer_data *peer, int addr_index, int *cont)
  1942. {
  1943. ASSERT(addr_index >= 0)
  1944. ASSERT(addr_index < num_bind_addrs)
  1945. ASSERT(bind_addrs[addr_index].num_ext_addrs > 0)
  1946. // get a fresh link
  1947. if (!peer_new_link(peer)) {
  1948. peer_log(peer, BLOG_ERROR, "cannot get link");
  1949. *cont = 0;
  1950. return peer_reset(peer);
  1951. }
  1952. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1953. // get addr
  1954. POINTER(addr, bind_addrs[addr_index]);
  1955. // try binding to all ports in the range
  1956. int port_add;
  1957. for (port_add = 0; port_add < addr->num_ports; port_add++) {
  1958. BAddr tryaddr = addr->addr;
  1959. BAddr_SetPort(&tryaddr, hton16(ntoh16(BAddr_GetPort(&tryaddr)) + port_add));
  1960. if (DatagramPeerIO_Bind(&peer->pio.udp.pio, tryaddr)) {
  1961. break;
  1962. }
  1963. }
  1964. if (port_add == addr->num_ports) {
  1965. BLog(BLOG_NOTICE, "failed to bind to any port");
  1966. *cont = 1;
  1967. return 0;
  1968. }
  1969. uint8_t key[SPPROTO_HAVE_ENCRYPTION(sp_params) ? BEncryption_cipher_key_size(sp_params.encryption_mode) : 0];
  1970. // generate and set encryption key
  1971. if (SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  1972. BRandom_randomize(key, sizeof(key));
  1973. DatagramPeerIO_SetEncryptionKey(&peer->pio.udp.pio, key);
  1974. }
  1975. // schedule sending OTP seed
  1976. if (SPPROTO_HAVE_OTP(sp_params)) {
  1977. BPending_Set(&peer->job_send_seed_after_binding);
  1978. }
  1979. // send connectinfo
  1980. if (peer_send_conectinfo(peer, addr_index, port_add, key, 0) < 0) {
  1981. return -1;
  1982. }
  1983. } else {
  1984. // order StreamPeerIO to listen
  1985. uint64_t pass;
  1986. StreamPeerIO_Listen(&peer->pio.tcp.pio, &listeners[addr_index], &pass);
  1987. // send connectinfo
  1988. if (peer_send_conectinfo(peer, addr_index, 0, NULL, pass) < 0) {
  1989. return -1;
  1990. }
  1991. }
  1992. peer_log(peer, BLOG_NOTICE, "bound to address number %d", addr_index);
  1993. *cont = 0;
  1994. return 0;
  1995. }
  1996. int peer_connect (struct peer_data *peer, BAddr addr, uint8_t *encryption_key, uint64_t password)
  1997. {
  1998. ASSERT(!BAddr_IsInvalid(&addr))
  1999. // get a fresh link
  2000. if (!peer_new_link(peer)) {
  2001. peer_log(peer, BLOG_ERROR, "cannot get link");
  2002. return peer_reset(peer);
  2003. }
  2004. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  2005. // order DatagramPeerIO to connect
  2006. if (!DatagramPeerIO_Connect(&peer->pio.udp.pio, addr)) {
  2007. peer_log(peer, BLOG_NOTICE, "DatagramPeerIO_Connect failed");
  2008. return peer_reset(peer);
  2009. }
  2010. // set encryption key
  2011. if (SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2012. DatagramPeerIO_SetEncryptionKey(&peer->pio.udp.pio, encryption_key);
  2013. }
  2014. // generate and send a send seed
  2015. if (SPPROTO_HAVE_OTP(sp_params)) {
  2016. if (peer_udp_send_seed(peer) < 0) {
  2017. return -1;
  2018. }
  2019. }
  2020. } else {
  2021. // order StreamPeerIO to connect
  2022. if (!StreamPeerIO_Connect(
  2023. &peer->pio.tcp.pio, addr, password,
  2024. (options.peer_ssl ? client_cert : NULL),
  2025. (options.peer_ssl ? client_key : NULL)
  2026. )) {
  2027. peer_log(peer, BLOG_NOTICE, "StreamPeerIO_Connect failed");
  2028. return peer_reset(peer);
  2029. }
  2030. }
  2031. return 0;
  2032. }
  2033. int peer_send_simple (struct peer_data *peer, int msgid)
  2034. {
  2035. if (server_start_msg(NULL, peer->id, msgid, 0) < 0) {
  2036. return -1;
  2037. }
  2038. server_end_msg();
  2039. return 0;
  2040. }
  2041. int peer_send_conectinfo (struct peer_data *peer, int addr_index, int port_adjust, uint8_t *enckey, uint64_t pass)
  2042. {
  2043. ASSERT(addr_index >= 0)
  2044. ASSERT(addr_index < num_bind_addrs)
  2045. ASSERT(bind_addrs[addr_index].num_ext_addrs > 0)
  2046. // get address
  2047. POINTER(bind_addr, bind_addrs[addr_index]);
  2048. // remember encryption key size
  2049. int key_size;
  2050. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2051. key_size = BEncryption_cipher_key_size(sp_params.encryption_mode);
  2052. }
  2053. // calculate message length ..
  2054. int msg_len = 0;
  2055. // addresses
  2056. for (int i = 0; i < bind_addr->num_ext_addrs; i++) {
  2057. int addrmsg_len =
  2058. msg_youconnect_addr_SIZEname(strlen(bind_addr->ext_addrs[i].scope)) +
  2059. msg_youconnect_addr_SIZEaddr(addr_size(bind_addr->ext_addrs[i].addr));
  2060. msg_len += msg_youconnect_SIZEaddr(addrmsg_len);
  2061. }
  2062. // encryption key
  2063. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2064. msg_len += msg_youconnect_SIZEkey(key_size);
  2065. }
  2066. // password
  2067. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  2068. msg_len += msg_youconnect_SIZEpassword;
  2069. }
  2070. // check if it's too big (because of the addresses)
  2071. if (msg_len > MSG_MAX_PAYLOAD) {
  2072. BLog(BLOG_ERROR, "cannot send too big youconnect message");
  2073. return 0;
  2074. }
  2075. // start message
  2076. uint8_t *msg;
  2077. if (server_start_msg((void **)&msg, peer->id, MSGID_YOUCONNECT, msg_len) < 0) {
  2078. return -1;
  2079. }
  2080. // init writer
  2081. msg_youconnectWriter writer;
  2082. msg_youconnectWriter_Init(&writer, msg);
  2083. // write addresses
  2084. for (int i = 0; i < bind_addr->num_ext_addrs; i++) {
  2085. int name_len = strlen(bind_addr->ext_addrs[i].scope);
  2086. int addr_len = addr_size(bind_addr->ext_addrs[i].addr);
  2087. // get a pointer for writing the address
  2088. int addrmsg_len =
  2089. msg_youconnect_addr_SIZEname(name_len) +
  2090. msg_youconnect_addr_SIZEaddr(addr_len);
  2091. uint8_t *addrmsg_dst = msg_youconnectWriter_Addaddr(&writer, addrmsg_len);
  2092. // init address writer
  2093. msg_youconnect_addrWriter awriter;
  2094. msg_youconnect_addrWriter_Init(&awriter, addrmsg_dst);
  2095. // write scope
  2096. uint8_t *name_dst = msg_youconnect_addrWriter_Addname(&awriter, name_len);
  2097. memcpy(name_dst, bind_addr->ext_addrs[i].scope, name_len);
  2098. // write address with adjusted port
  2099. BAddr addr = bind_addr->ext_addrs[i].addr;
  2100. BAddr_SetPort(&addr, hton16(ntoh16(BAddr_GetPort(&addr)) + port_adjust));
  2101. uint8_t *addr_dst = msg_youconnect_addrWriter_Addaddr(&awriter, addr_len);
  2102. addr_write(addr_dst, addr);
  2103. // finish address writer
  2104. msg_youconnect_addrWriter_Finish(&awriter);
  2105. }
  2106. // write encryption key
  2107. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2108. uint8_t *key_dst = msg_youconnectWriter_Addkey(&writer, key_size);
  2109. memcpy(key_dst, enckey, key_size);
  2110. }
  2111. // write password
  2112. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  2113. msg_youconnectWriter_Addpassword(&writer, pass);
  2114. }
  2115. // finish writer
  2116. msg_youconnectWriter_Finish(&writer);
  2117. // end message
  2118. server_end_msg();
  2119. return 0;
  2120. }
  2121. int peer_udp_send_seed (struct peer_data *peer)
  2122. {
  2123. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  2124. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  2125. ASSERT(peer->have_link)
  2126. ASSERT(!peer->pio.udp.sendseed_sent)
  2127. peer_log(peer, BLOG_DEBUG, "sending OTP send seed");
  2128. int key_len = BEncryption_cipher_key_size(sp_params.otp_mode);
  2129. int iv_len = BEncryption_cipher_block_size(sp_params.otp_mode);
  2130. // generate seed
  2131. peer->pio.udp.sendseed_sent_id = peer->pio.udp.sendseed_nextid;
  2132. BRandom_randomize(peer->pio.udp.sendseed_sent_key, key_len);
  2133. BRandom_randomize(peer->pio.udp.sendseed_sent_iv, iv_len);
  2134. // set as sent, increment next seed ID
  2135. peer->pio.udp.sendseed_sent = 1;
  2136. peer->pio.udp.sendseed_nextid++;
  2137. // send seed to the peer
  2138. int msg_len = msg_seed_SIZEseed_id + msg_seed_SIZEkey(key_len) + msg_seed_SIZEiv(iv_len);
  2139. uint8_t *msg;
  2140. if (server_start_msg((void **)&msg, peer->id, MSGID_SEED, msg_len) < 0) {
  2141. return -1;
  2142. }
  2143. msg_seedWriter writer;
  2144. msg_seedWriter_Init(&writer, msg);
  2145. msg_seedWriter_Addseed_id(&writer, peer->pio.udp.sendseed_sent_id);
  2146. uint8_t *key_dst = msg_seedWriter_Addkey(&writer, key_len);
  2147. memcpy(key_dst, peer->pio.udp.sendseed_sent_key, key_len);
  2148. uint8_t *iv_dst = msg_seedWriter_Addiv(&writer, iv_len);
  2149. memcpy(iv_dst, peer->pio.udp.sendseed_sent_iv, iv_len);
  2150. msg_seedWriter_Finish(&writer);
  2151. server_end_msg();
  2152. return 0;
  2153. }
  2154. int peer_send_confirmseed (struct peer_data *peer, uint16_t seed_id)
  2155. {
  2156. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  2157. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  2158. // send confirmation
  2159. int msg_len = msg_confirmseed_SIZEseed_id;
  2160. uint8_t *msg;
  2161. if (server_start_msg((void **)&msg, peer->id, MSGID_CONFIRMSEED, msg_len) < 0) {
  2162. return -1;
  2163. }
  2164. msg_confirmseedWriter writer;
  2165. msg_confirmseedWriter_Init(&writer, msg);
  2166. msg_confirmseedWriter_Addseed_id(&writer, seed_id);
  2167. msg_confirmseedWriter_Finish(&writer);
  2168. server_end_msg();
  2169. return 0;
  2170. }
  2171. void peer_submit_relayed_frame (struct peer_data *peer, struct peer_data *source_peer, uint8_t *frame, int frame_len)
  2172. {
  2173. ASSERT(peer->have_link)
  2174. ASSERT(frame_len >= 0)
  2175. ASSERT(frame_len <= device.mtu)
  2176. DataProtoDest_SubmitRelayFrame(&peer->send_dp, &source_peer->relay_source, frame, frame_len, options.send_buffer_relay_size);
  2177. }
  2178. void peer_dataproto_handler (struct peer_data *peer, int up)
  2179. {
  2180. ASSERT(peer->have_link)
  2181. // peer_recv_handler_send relies on this not bringing everything down
  2182. if (up) {
  2183. peer_log(peer, BLOG_INFO, "up");
  2184. // if it can be a relay provided, enable it
  2185. if ((peer->flags&SCID_NEWCLIENT_FLAG_RELAY_SERVER) && !peer->is_relay) {
  2186. peer_enable_relay_provider(peer);
  2187. }
  2188. } else {
  2189. peer_log(peer, BLOG_INFO, "down");
  2190. // if it is a relay provider, disable it
  2191. if (peer->is_relay) {
  2192. peer_disable_relay_provider(peer);
  2193. }
  2194. }
  2195. }
  2196. struct peer_data * find_peer_by_id (peerid_t id)
  2197. {
  2198. HashTableNode *node;
  2199. if (!HashTable_Lookup(&peers_by_id, &id, &node)) {
  2200. return NULL;
  2201. }
  2202. struct peer_data *peer = UPPER_OBJECT(node, struct peer_data, table_node);
  2203. return peer;
  2204. }
  2205. int peers_by_id_key_comparator (peerid_t *id1, peerid_t *id2)
  2206. {
  2207. return (*id1 == *id2);
  2208. }
  2209. int peers_by_id_hash_function (peerid_t *id, int modulo)
  2210. {
  2211. return (jenkins_lookup2_hash((uint8_t *)id, sizeof(*id), peers_by_id_initval) % modulo);
  2212. }
  2213. void device_error_handler (void *unused)
  2214. {
  2215. BLog(BLOG_ERROR, "device error");
  2216. terminate();
  2217. return;
  2218. }
  2219. void device_input_handler_send (void *unused, uint8_t *data, int data_len)
  2220. {
  2221. ASSERT(data_len >= 0)
  2222. ASSERT(data_len <= device.mtu)
  2223. // accept packet
  2224. PacketPassInterface_Done(&device.input_interface);
  2225. // give frame to decider
  2226. FrameDecider_AnalyzeAndDecide(&frame_decider, data, data_len);
  2227. // forward frame to peers
  2228. FrameDeciderPeer *decider_peer;
  2229. while (decider_peer = FrameDecider_NextDestination(&frame_decider)) {
  2230. struct peer_data *peer = UPPER_OBJECT(decider_peer, struct peer_data, decider_peer);
  2231. submit_frame_to_peer(peer, data, data_len);
  2232. }
  2233. }
  2234. void submit_frame_to_peer (struct peer_data *peer, uint8_t *data, int data_len)
  2235. {
  2236. ASSERT(data_len >= 0)
  2237. ASSERT(data_len <= device.mtu)
  2238. DataProtoLocalSource_SubmitFrame(&peer->local_dpflow, data, data_len);
  2239. }
  2240. void assign_relays (void)
  2241. {
  2242. LinkedList2Node *list_node;
  2243. while (list_node = LinkedList2_GetFirst(&waiting_relay_peers)) {
  2244. struct peer_data *peer = UPPER_OBJECT(list_node, struct peer_data, waiting_relay_list_node);
  2245. ASSERT(peer->waiting_relay)
  2246. ASSERT(!peer->have_relaying)
  2247. ASSERT(!peer->have_link)
  2248. // get a relay
  2249. LinkedList2Node *list_node2 = LinkedList2_GetFirst(&relays);
  2250. if (!list_node2) {
  2251. BLog(BLOG_NOTICE, "no relays");
  2252. return;
  2253. }
  2254. struct peer_data *relay = UPPER_OBJECT(list_node2, struct peer_data, relay_list_node);
  2255. ASSERT(relay->is_relay)
  2256. // no longer waiting for relay
  2257. peer_unregister_need_relay(peer);
  2258. // install the relay
  2259. peer_install_relay(peer, relay);
  2260. }
  2261. }
  2262. char * address_scope_known (uint8_t *name, int name_len)
  2263. {
  2264. ASSERT(name_len >= 0)
  2265. for (int i = 0; i < options.num_scopes; i++) {
  2266. if (name_len == strlen(options.scopes[i]) && !memcmp(name, options.scopes[i], name_len)) {
  2267. return options.scopes[i];
  2268. }
  2269. }
  2270. return NULL;
  2271. }
  2272. void server_handler_error (void *user)
  2273. {
  2274. BLog(BLOG_ERROR, "server connection failed, exiting");
  2275. terminate();
  2276. return;
  2277. }
  2278. void server_handler_ready (void *user, peerid_t param_my_id, uint32_t ext_ip)
  2279. {
  2280. ASSERT(!server_ready)
  2281. // remember our ID
  2282. my_id = param_my_id;
  2283. // store server reported addresses
  2284. for (int i = 0; i < num_bind_addrs; i++) {
  2285. POINTER(addr, bind_addrs[i]);
  2286. for (int j = 0; j < addr->num_ext_addrs; j++) {
  2287. POINTER(eaddr, addr->ext_addrs[j]);
  2288. if (eaddr->server_reported_port >= 0) {
  2289. if (ext_ip == 0) {
  2290. BLog(BLOG_ERROR, "server did not provide our address");
  2291. terminate();
  2292. return;
  2293. }
  2294. BAddr_InitIPv4(&eaddr->addr, ext_ip, hton16(eaddr->server_reported_port));
  2295. char str[BADDR_MAX_PRINT_LEN];
  2296. BAddr_Print(&eaddr->addr, str);
  2297. BLog(BLOG_INFO, "external address (%d,%d): server reported %s", i, j, str);
  2298. }
  2299. }
  2300. }
  2301. // set server ready
  2302. server_ready = 1;
  2303. BLog(BLOG_INFO, "server: ready, my ID is %d", (int)my_id);
  2304. }
  2305. void server_handler_newclient (void *user, peerid_t peer_id, int flags, const uint8_t *cert, int cert_len)
  2306. {
  2307. ASSERT(server_ready)
  2308. ASSERT(cert_len >= 0)
  2309. ASSERT(cert_len <= SCID_NEWCLIENT_MAX_CERT_LEN)
  2310. // check if the peer already exists
  2311. if (find_peer_by_id(peer_id)) {
  2312. BLog(BLOG_WARNING, "server: newclient: peer already known");
  2313. return;
  2314. }
  2315. // make sure it's not the same ID as us
  2316. if (peer_id == my_id) {
  2317. BLog(BLOG_WARNING, "server: newclient: peer has our ID");
  2318. return;
  2319. }
  2320. // check if there is spece for the peer
  2321. if (num_peers >= MAX_PEERS) {
  2322. BLog(BLOG_WARNING, "server: newclient: no space for new peer (maximum number reached)");
  2323. return;
  2324. }
  2325. if (!options.ssl && cert_len > 0) {
  2326. BLog(BLOG_WARNING, "server: newclient: certificate supplied, but not using TLS");
  2327. return;
  2328. }
  2329. peer_add(peer_id, flags, cert, cert_len);
  2330. return;
  2331. }
  2332. void server_handler_endclient (void *user, peerid_t peer_id)
  2333. {
  2334. ASSERT(server_ready)
  2335. // find peer
  2336. struct peer_data *peer = find_peer_by_id(peer_id);
  2337. if (!peer) {
  2338. BLog(BLOG_WARNING, "server: endclient: peer %d not known", (int)peer_id);
  2339. return;
  2340. }
  2341. // remove peer
  2342. peer_remove(peer);
  2343. }
  2344. void server_handler_message (void *user, peerid_t peer_id, uint8_t *data, int data_len)
  2345. {
  2346. ASSERT(server_ready)
  2347. ASSERT(data_len >= 0)
  2348. ASSERT(data_len <= SC_MAX_MSGLEN)
  2349. // find peer
  2350. struct peer_data *peer = find_peer_by_id(peer_id);
  2351. if (!peer) {
  2352. BLog(BLOG_WARNING, "server: message: peer not known");
  2353. return;
  2354. }
  2355. // process peer message
  2356. peer_msg(peer, data, data_len);
  2357. return;
  2358. }
  2359. void peer_job_send_seed_after_binding (struct peer_data *peer)
  2360. {
  2361. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  2362. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  2363. ASSERT(peer->have_link)
  2364. ASSERT(!peer->pio.udp.sendseed_sent)
  2365. peer_udp_send_seed(peer);
  2366. return;
  2367. }