client.c 78 KB

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