client.c 111 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523
  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/ipv4_proto.h>
  47. #include <misc/igmp_proto.h>
  48. #include <misc/nsskey.h>
  49. #include <misc/loglevel.h>
  50. #include <misc/loggers_string.h>
  51. #include <structure/LinkedList2.h>
  52. #include <security/BRandom.h>
  53. #include <nspr_support/DummyPRFileDesc.h>
  54. #include <nspr_support/BSocketPRFileDesc.h>
  55. #include <system/BLog.h>
  56. #include <system/BSignal.h>
  57. #include <system/BTime.h>
  58. #include <system/DebugObject.h>
  59. #include <server_connection/ServerConnection.h>
  60. #ifndef BADVPN_USE_WINAPI
  61. #include <system/BLog_syslog.h>
  62. #endif
  63. #include <client/client.h>
  64. #include <generated/blog_channel_client.h>
  65. #define TRANSPORT_MODE_UDP 0
  66. #define TRANSPORT_MODE_TCP 1
  67. #define LOGGER_STDOUT 1
  68. #define LOGGER_SYSLOG 2
  69. // declares and initializes a pointer x to y
  70. #define POINTER(x, y) typeof (y) *(x) = &(y);
  71. // command-line options
  72. struct {
  73. int help;
  74. int version;
  75. int logger;
  76. #ifndef BADVPN_USE_WINAPI
  77. char *logger_syslog_facility;
  78. char *logger_syslog_ident;
  79. #endif
  80. int loglevel;
  81. int loglevels[BLOG_NUM_CHANNELS];
  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. } options;
  111. // bind addresses
  112. int num_bind_addrs;
  113. struct {
  114. BAddr addr;
  115. int num_ports;
  116. int num_ext_addrs;
  117. struct {
  118. int server_reported_port;
  119. BAddr addr; // if server_reported_port>=0, defined only after hello received
  120. char scope[64];
  121. } ext_addrs[MAX_EXT_ADDRS];
  122. } bind_addrs[MAX_BIND_ADDRS];
  123. // TCP listeners
  124. PasswordListener listeners[MAX_BIND_ADDRS];
  125. // SPProto parameters (UDP only)
  126. struct spproto_security_params sp_params;
  127. // server address we connect to
  128. BAddr server_addr;
  129. // server name to use for SSL
  130. char server_name[256];
  131. // reactor
  132. BReactor ss;
  133. // client certificate if using SSL
  134. CERTCertificate *client_cert;
  135. // client private key if using SSL
  136. SECKEYPrivateKey *client_key;
  137. // device data
  138. struct device_data device;
  139. // data communication MTU
  140. int data_mtu;
  141. // peers list
  142. LinkedList2 peers;
  143. int num_peers;
  144. // peers by ID hash table
  145. HashTable peers_by_id;
  146. uint32_t peers_by_id_initval;
  147. // MAC addresses hash table
  148. HashTable mac_table;
  149. uint32_t mac_table_initval;
  150. // multicast MAC address hash table
  151. HashTable multicast_table;
  152. uint32_t multicast_table_initval;
  153. // multicast entries
  154. LinkedList2 multicast_entries_free;
  155. struct multicast_table_entry multicast_entries_data[MAX_PEERS*PEER_MAX_GROUPS];
  156. // peers that can be user as relays
  157. LinkedList2 relays;
  158. // peers than need a relay
  159. LinkedList2 waiting_relay_peers;
  160. // server connection
  161. ServerConnection server;
  162. // whether server is ready
  163. int server_ready;
  164. // my ID, defined only after server_ready
  165. peerid_t my_id;
  166. // cleans everything up that can be cleaned in order to return
  167. // from the event loop and exit
  168. static void terminate (void);
  169. // prints program name and version to standard output
  170. static void print_help (const char *name);
  171. // prints program name and version to standard output
  172. static void print_version (void);
  173. // parses the command line
  174. static int parse_arguments (int argc, char *argv[]);
  175. // processes certain command line options
  176. static int process_arguments (void);
  177. // handler for program termination request
  178. static void signal_handler (void *unused);
  179. // provides a buffer for sending a packet to the server
  180. static int server_start_msg (void **data, peerid_t peer_id, int type, int len);
  181. // submits a written packet to the server
  182. static void server_end_msg (void);
  183. // adds a new peer
  184. static int peer_add (peerid_t id, int flags, const uint8_t *cert, int cert_len);
  185. // removes a peer
  186. static void peer_remove (struct peer_data *peer);
  187. // deallocates peer resources
  188. static void peer_dealloc (struct peer_data *peer);
  189. // passes a message to the logger, prepending it info about the peer
  190. static void peer_log (struct peer_data *peer, int level, const char *fmt, ...);
  191. // see if we are the master relative to this peer
  192. static int peer_am_master (struct peer_data *peer);
  193. // initializes the link
  194. static int peer_init_link (struct peer_data *peer);
  195. // frees link resources
  196. static void peer_free_link (struct peer_data *peer);
  197. // creates a fresh link
  198. static int peer_new_link (struct peer_data *peer);
  199. // registers the peer as a relay provider
  200. static void peer_enable_relay_provider (struct peer_data *peer);
  201. // unregisters the peer as a relay provider
  202. static void peer_disable_relay_provider (struct peer_data *peer);
  203. // deallocates peer relay provider resources. Inserts relay users to the
  204. // need relay list. Used while freeing a peer.
  205. static void peer_dealloc_relay_provider (struct peer_data *peer);
  206. // install relaying for a peer
  207. static void peer_install_relay (struct peer_data *peer, struct peer_data *relay);
  208. // uninstall relaying for a peer
  209. static void peer_uninstall_relay (struct peer_data *peer);
  210. // deallocates relaying for a peer. Used when the relay is beeing freed,
  211. // and when uninstalling relaying after having released the connection.
  212. static void peer_dealloc_relay (struct peer_data *peer);
  213. // handle a peer that needs a relay
  214. static void peer_need_relay (struct peer_data *peer);
  215. // inserts the peer into the need relay list
  216. static void peer_register_need_relay (struct peer_data *peer);
  217. // removes the peer from the need relay list
  218. static void peer_unregister_need_relay (struct peer_data *peer);
  219. // handle a link setup failure
  220. static int peer_reset (struct peer_data *peer);
  221. // associates a MAC address with a peer
  222. static void peer_add_mac_address (struct peer_data *peer, uint8_t *mac);
  223. // associate an IPv4 multicast address with a peer
  224. static void peer_join_group (struct peer_data *peer, uint32_t group);
  225. // disassociate an IPv4 multicast address from a peer
  226. static void peer_leave_group (struct peer_data *peer, uint32_t group);
  227. // handle incoming peer messages
  228. static void peer_msg (struct peer_data *peer, uint8_t *data, int data_len);
  229. // handlers for different message types
  230. static void peer_msg_youconnect (struct peer_data *peer, uint8_t *data, int data_len);
  231. static void peer_msg_cannotconnect (struct peer_data *peer, uint8_t *data, int data_len);
  232. static void peer_msg_cannotbind (struct peer_data *peer, uint8_t *data, int data_len);
  233. static void peer_msg_seed (struct peer_data *peer, uint8_t *data, int data_len);
  234. static void peer_msg_confirmseed (struct peer_data *peer, uint8_t *data, int data_len);
  235. static void peer_msg_youretry (struct peer_data *peer, uint8_t *data, int data_len);
  236. // handler from DatagramPeerIO when we should generate a new OTP send seed
  237. static void peer_udp_pio_handler_seed_warning (struct peer_data *peer);
  238. // handler from StreamPeerIO when an error occurs on the connection
  239. static void peer_tcp_pio_handler_error (struct peer_data *peer);
  240. // peer retry timer handler. The timer is used only on the master side,
  241. // wither when we detect an error, or the peer reports an error.
  242. static void peer_reset_timer_handler (struct peer_data *peer);
  243. // PacketPassInterface handler for receiving packets from the link
  244. static void peer_recv_handler_send (struct peer_data *peer, uint8_t *data, int data_len);
  245. static void local_recv_qflow_output_handler_done (struct peer_data *peer);
  246. // start binding, according to the protocol
  247. static int peer_start_binding (struct peer_data *peer);
  248. // tries binding on one address, according to the protocol
  249. static int peer_bind (struct peer_data *peer);
  250. static int peer_bind_one_address (struct peer_data *peer, int addr_index, int *cont);
  251. static int peer_connect (struct peer_data *peer, BAddr addr, uint8_t *encryption_key, uint64_t password);
  252. // sends a message with no payload to the peer
  253. static int peer_send_simple (struct peer_data *peer, int msgid);
  254. static int peer_send_conectinfo (struct peer_data *peer, int addr_index, int port_adjust, uint8_t *enckey, uint64_t pass);
  255. static int peer_udp_send_seed (struct peer_data *peer);
  256. static int peer_send_confirmseed (struct peer_data *peer, uint16_t seed_id);
  257. // submits a relayed frame for sending to the peer
  258. static void peer_submit_relayed_frame (struct peer_data *peer, struct peer_data *source_peer, uint8_t *frame, int frame_len);
  259. // handler for group timers
  260. static void peer_group_timer_handler (struct peer_group_entry *entry);
  261. // handler for peer DataProto up state changes
  262. static void peer_dataproto_handler (struct peer_data *peer, int up);
  263. // looks for a peer with the given ID
  264. static struct peer_data * find_peer_by_id (peerid_t id);
  265. // multicast table operations
  266. static void multicast_table_add_entry (struct peer_group_entry *entry);
  267. static void multicast_table_remove_entry (struct peer_group_entry *entry);
  268. // hash table callback functions
  269. static int peer_groups_table_key_comparator (uint32_t *group1, uint32_t *group2);
  270. static int peer_groups_table_hash_function (uint32_t *group, int modulo);
  271. static int mac_table_key_comparator (uint8_t *mac1, uint8_t *mac2);
  272. static int mac_table_hash_function (uint8_t *mac, int modulo);
  273. static int multicast_table_key_comparator (uint32_t *sig1, uint32_t *sig2);
  274. static int multicast_table_hash_function (uint32_t *sig, int modulo);
  275. static int peers_by_id_key_comparator (peerid_t *id1, peerid_t *id2);
  276. static int peers_by_id_hash_function (peerid_t *id, int modulo);
  277. // device error handler
  278. static void device_error_handler (void *unused);
  279. // PacketPassInterfacre handler for packets from the device
  280. static void device_input_handler_send (void *unused, uint8_t *data, int data_len);
  281. // submits a local frame for sending to the peer. The frame is taken from the device frame buffer.
  282. static void submit_frame_to_peer (struct peer_data *peer, uint8_t *data, int data_len);
  283. // submits the current frame to all peers
  284. static void flood_frame (uint8_t *data, int data_len);
  285. // inspects a frame read from the device and determines how
  286. // it should be handled. Used for IGMP snooping.
  287. static int hook_outgoing (uint8_t *pos, int len);
  288. #define HOOK_OUT_DEFAULT 0
  289. #define HOOK_OUT_FLOOD 1
  290. // inpects an incoming frame. Used for IGMP snooping.
  291. static void peer_hook_incoming (struct peer_data *peer, uint8_t *pos, int len);
  292. // lowers every group entry timer to IGMP_LAST_MEMBER_QUERY_TIME if it's larger
  293. static void lower_group_timers_to_lmqt (uint32_t group);
  294. // check an IPv4 packet
  295. static int check_ipv4_packet (uint8_t *data, int data_len, struct ipv4_header **out_header, uint8_t **out_payload, int *out_payload_len);
  296. // assign relays to clients waiting for them
  297. static void assign_relays (void);
  298. // checks if the given address scope is known (i.e. we can connect to an address in it)
  299. static char * address_scope_known (uint8_t *name, int name_len);
  300. // handlers for server messages
  301. static void server_handler_error (void *user);
  302. static void server_handler_ready (void *user, peerid_t param_my_id, uint32_t ext_ip);
  303. static void server_handler_newclient (void *user, peerid_t peer_id, int flags, const uint8_t *cert, int cert_len);
  304. static void server_handler_endclient (void *user, peerid_t peer_id);
  305. static void server_handler_message (void *user, peerid_t peer_id, uint8_t *data, int data_len);
  306. // process job handlers
  307. static void peer_job_send_seed_after_binding (struct peer_data *peer);
  308. int main (int argc, char *argv[])
  309. {
  310. if (argc <= 0) {
  311. return 1;
  312. }
  313. // parse command-line arguments
  314. if (!parse_arguments(argc, argv)) {
  315. fprintf(stderr, "Failed to parse arguments\n");
  316. print_help(argv[0]);
  317. goto fail0;
  318. }
  319. // handle --help and --version
  320. if (options.help) {
  321. print_version();
  322. print_help(argv[0]);
  323. return 0;
  324. }
  325. if (options.version) {
  326. print_version();
  327. return 0;
  328. }
  329. // initialize logger
  330. switch (options.logger) {
  331. case LOGGER_STDOUT:
  332. BLog_InitStdout();
  333. break;
  334. #ifndef BADVPN_USE_WINAPI
  335. case LOGGER_SYSLOG:
  336. if (!BLog_InitSyslog(options.logger_syslog_ident, options.logger_syslog_facility)) {
  337. fprintf(stderr, "Failed to initialize syslog logger\n");
  338. goto fail0;
  339. }
  340. break;
  341. #endif
  342. default:
  343. ASSERT(0);
  344. }
  345. // configure logger channels
  346. for (int i = 0; i < BLOG_NUM_CHANNELS; i++) {
  347. if (options.loglevels[i] >= 0) {
  348. BLog_SetChannelLoglevel(i, options.loglevels[i]);
  349. }
  350. else if (options.loglevel >= 0) {
  351. BLog_SetChannelLoglevel(i, options.loglevel);
  352. }
  353. }
  354. BLog(BLOG_NOTICE, "initializing "GLOBAL_PRODUCT_NAME" client "GLOBAL_VERSION);
  355. // initialize sockets
  356. if (BSocket_GlobalInit() < 0) {
  357. BLog(BLOG_ERROR, "BSocket_GlobalInit failed");
  358. goto fail1;
  359. }
  360. // init time
  361. BTime_Init();
  362. // process arguments
  363. if (!process_arguments()) {
  364. BLog(BLOG_ERROR, "Failed to process arguments");
  365. goto fail1;
  366. }
  367. // init reactor
  368. if (!BReactor_Init(&ss)) {
  369. BLog(BLOG_ERROR, "BReactor_Init failed");
  370. goto fail1;
  371. }
  372. // setup signal handler
  373. if (!BSignal_Init()) {
  374. BLog(BLOG_ERROR, "BSignal_Init failed");
  375. goto fail1b;
  376. }
  377. BSignal_Capture();
  378. if (!BSignal_SetHandler(&ss, signal_handler, NULL)) {
  379. BLog(BLOG_ERROR, "BSignal_SetHandler failed");
  380. goto fail1b;
  381. }
  382. if (options.ssl) {
  383. // init NSPR
  384. PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
  385. // register local NSPR file types
  386. if (!DummyPRFileDesc_GlobalInit()) {
  387. BLog(BLOG_ERROR, "DummyPRFileDesc_GlobalInit failed");
  388. goto fail2;
  389. }
  390. if (!BSocketPRFileDesc_GlobalInit()) {
  391. BLog(BLOG_ERROR, "BSocketPRFileDesc_GlobalInit failed");
  392. goto fail2;
  393. }
  394. // init NSS
  395. if (NSS_Init(options.nssdb) != SECSuccess) {
  396. BLog(BLOG_ERROR, "NSS_Init failed (%d)", (int)PR_GetError());
  397. goto fail2;
  398. }
  399. // set cipher policy
  400. if (NSS_SetDomesticPolicy() != SECSuccess) {
  401. BLog(BLOG_ERROR, "NSS_SetDomesticPolicy failed (%d)", (int)PR_GetError());
  402. goto fail3;
  403. }
  404. // init server cache
  405. if (SSL_ConfigServerSessionIDCache(0, 0, 0, NULL) != SECSuccess) {
  406. BLog(BLOG_ERROR, "SSL_ConfigServerSessionIDCache failed (%d)", (int)PR_GetError());
  407. goto fail3;
  408. }
  409. // open server certificate and private key
  410. if (!open_nss_cert_and_key(options.client_cert_name, &client_cert, &client_key)) {
  411. BLog(BLOG_ERROR, "Cannot open certificate and key");
  412. goto fail4;
  413. }
  414. }
  415. // init listeners
  416. int num_listeners = 0;
  417. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  418. while (num_listeners < num_bind_addrs) {
  419. POINTER(addr, bind_addrs[num_listeners])
  420. if (!PasswordListener_Init(
  421. &listeners[num_listeners], &ss, addr->addr, 50, options.peer_ssl,
  422. (options.peer_ssl ? client_cert : NULL),
  423. (options.peer_ssl ? client_key : NULL)
  424. )) {
  425. BLog(BLOG_ERROR, "PasswordListener_Init failed");
  426. goto fail5;
  427. }
  428. num_listeners++;
  429. }
  430. }
  431. // init device
  432. if (!BTap_Init(&device.btap, &ss, options.tapdev, device_error_handler, NULL)) {
  433. BLog(BLOG_ERROR, "BTap_Init failed");
  434. goto fail5;
  435. }
  436. // remember device MTU
  437. device.mtu = sizeof(struct ethernet_header) + BTap_GetDeviceMTU(&device.btap);
  438. BLog(BLOG_INFO, "device MTU is %d", device.mtu);
  439. // init device input
  440. PacketPassInterface_Init(&device.input_interface, device.mtu, device_input_handler_send, NULL, BReactor_PendingGroup(&ss));
  441. if (!SinglePacketBuffer_Init(&device.input_buffer, BTap_GetOutput(&device.btap), &device.input_interface, BReactor_PendingGroup(&ss))) {
  442. goto fail5a;
  443. }
  444. // init device output
  445. PacketPassFairQueue_Init(&device.output_queue, BTap_GetInput(&device.btap), BReactor_PendingGroup(&ss), 1);
  446. // calculate data MTU
  447. data_mtu = DATAPROTO_MAX_OVERHEAD + device.mtu;
  448. // init peers list
  449. LinkedList2_Init(&peers);
  450. num_peers = 0;
  451. // init peers by ID hash table
  452. BRandom_randomize((uint8_t *)&peers_by_id_initval, sizeof(peers_by_id_initval));
  453. if (!HashTable_Init(
  454. &peers_by_id,
  455. OFFSET_DIFF(struct peer_data, id, table_node),
  456. (HashTable_comparator)peers_by_id_key_comparator,
  457. (HashTable_hash_function)peers_by_id_hash_function,
  458. MAX_PEERS
  459. )) {
  460. BLog(BLOG_ERROR, "HashTable_Init failed");
  461. goto fail7;
  462. }
  463. // init MAC address table
  464. BRandom_randomize((uint8_t *)&mac_table_initval, sizeof(mac_table_initval));
  465. if (!HashTable_Init(
  466. &mac_table,
  467. OFFSET_DIFF(struct mac_table_entry, mac, table_node),
  468. (HashTable_comparator)mac_table_key_comparator,
  469. (HashTable_hash_function)mac_table_hash_function,
  470. MAX_PEERS * PEER_MAX_MACS
  471. )) {
  472. BLog(BLOG_ERROR, "HashTable_Init failed");
  473. goto fail8;
  474. }
  475. // init multicast MAC address table
  476. BRandom_randomize((uint8_t *)&multicast_table_initval, sizeof(multicast_table_initval));
  477. if (!HashTable_Init(
  478. &multicast_table,
  479. OFFSET_DIFF(struct multicast_table_entry, sig, table_node),
  480. (HashTable_comparator)multicast_table_key_comparator,
  481. (HashTable_hash_function)multicast_table_hash_function,
  482. MAX_PEERS * PEER_MAX_GROUPS
  483. )) {
  484. BLog(BLOG_ERROR, "HashTable_Init failed");
  485. goto fail9;
  486. }
  487. // init multicast entries
  488. LinkedList2_Init(&multicast_entries_free);
  489. int i;
  490. for (i = 0; i < MAX_PEERS * PEER_MAX_GROUPS; i++) {
  491. struct multicast_table_entry *multicast_entry = &multicast_entries_data[i];
  492. LinkedList2_Append(&multicast_entries_free, &multicast_entry->free_list_node);
  493. }
  494. // init relays list
  495. LinkedList2_Init(&relays);
  496. // init need relay list
  497. LinkedList2_Init(&waiting_relay_peers);
  498. // start connecting to server
  499. if (!ServerConnection_Init(
  500. &server, &ss, server_addr, SC_KEEPALIVE_INTERVAL, SERVER_BUFFER_MIN_PACKETS, options.ssl, client_cert, client_key, server_name, NULL,
  501. server_handler_error, server_handler_ready, server_handler_newclient, server_handler_endclient, server_handler_message
  502. )) {
  503. BLog(BLOG_ERROR, "ServerConnection_Init failed");
  504. goto fail10;
  505. }
  506. // set server not ready
  507. server_ready = 0;
  508. goto event_loop;
  509. // cleanup on error
  510. fail10:
  511. HashTable_Free(&multicast_table);
  512. fail9:
  513. HashTable_Free(&mac_table);
  514. fail8:
  515. HashTable_Free(&peers_by_id);
  516. fail7:
  517. PacketPassFairQueue_Free(&device.output_queue);
  518. SinglePacketBuffer_Free(&device.input_buffer);
  519. fail5a:
  520. PacketPassInterface_Free(&device.input_interface);
  521. BTap_Free(&device.btap);
  522. fail5:
  523. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  524. while (num_listeners-- > 0) {
  525. PasswordListener_Free(&listeners[num_listeners]);
  526. }
  527. }
  528. fail4a:
  529. if (options.ssl) {
  530. CERT_DestroyCertificate(client_cert);
  531. SECKEY_DestroyPrivateKey(client_key);
  532. fail4:
  533. SSL_ShutdownServerSessionIDCache();
  534. fail3:
  535. SSL_ClearSessionCache();
  536. ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
  537. fail2:
  538. ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
  539. PL_ArenaFinish();
  540. }
  541. BSignal_RemoveHandler();
  542. fail1b:
  543. BReactor_Free(&ss);
  544. fail1:
  545. BLog(BLOG_ERROR, "initialization failed");
  546. BLog_Free();
  547. fail0:
  548. // finish objects
  549. DebugObjectGlobal_Finish();
  550. return 1;
  551. event_loop:
  552. // enter event loop
  553. BLog(BLOG_NOTICE, "entering event loop");
  554. int ret = BReactor_Exec(&ss);
  555. // free reactor
  556. BReactor_Free(&ss);
  557. // free logger
  558. BLog(BLOG_NOTICE, "exiting");
  559. BLog_Free();
  560. // finish objects
  561. DebugObjectGlobal_Finish();
  562. return ret;
  563. }
  564. void terminate (void)
  565. {
  566. BLog(BLOG_NOTICE, "tearing down");
  567. // allow freeing local receive flows
  568. PacketPassFairQueue_PrepareFree(&device.output_queue);
  569. // free peers
  570. LinkedList2Node *node;
  571. while (node = LinkedList2_GetFirst(&peers)) {
  572. struct peer_data *peer = UPPER_OBJECT(node, struct peer_data, list_node);
  573. // free relaying
  574. if (peer->have_relaying) {
  575. struct peer_data *relay = peer->relaying_peer;
  576. ASSERT(relay->is_relay)
  577. ASSERT(relay->have_link)
  578. // free relay provider
  579. peer_dealloc_relay_provider(relay);
  580. }
  581. // free relay provider
  582. if (peer->is_relay) {
  583. peer_dealloc_relay_provider(peer);
  584. }
  585. // free relay source
  586. DataProtoRelaySource_FreeRelease(&peer->relay_source);
  587. // deallocate peer
  588. peer_dealloc(peer);
  589. }
  590. // free server
  591. ServerConnection_Free(&server);
  592. // free hash tables
  593. HashTable_Free(&multicast_table);
  594. HashTable_Free(&mac_table);
  595. HashTable_Free(&peers_by_id);
  596. // free device output
  597. PacketPassFairQueue_Free(&device.output_queue);
  598. // free device input
  599. SinglePacketBuffer_Free(&device.input_buffer);
  600. PacketPassInterface_Free(&device.input_interface);
  601. // free device
  602. BTap_Free(&device.btap);
  603. // free listeners
  604. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  605. for (int i = num_bind_addrs - 1; i >= 0; i--) {
  606. PasswordListener_Free(&listeners[i]);
  607. }
  608. }
  609. if (options.ssl) {
  610. // free client certificate and private key
  611. CERT_DestroyCertificate(client_cert);
  612. SECKEY_DestroyPrivateKey(client_key);
  613. // free server cache
  614. ASSERT_FORCE(SSL_ShutdownServerSessionIDCache() == SECSuccess)
  615. // free client cache
  616. SSL_ClearSessionCache();
  617. // free NSS
  618. ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
  619. // free NSPR
  620. ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
  621. PL_ArenaFinish();
  622. }
  623. // remove signal handler
  624. BSignal_RemoveHandler();
  625. // exit reactor
  626. BReactor_Quit(&ss, 1);
  627. }
  628. void print_help (const char *name)
  629. {
  630. printf(
  631. "Usage:\n"
  632. " %s\n"
  633. " [--help]\n"
  634. " [--version]\n"
  635. " [--logger <"LOGGERS_STRING">]\n"
  636. #ifndef BADVPN_USE_WINAPI
  637. " (logger=syslog?\n"
  638. " [--syslog-facility <string>]\n"
  639. " [--syslog-ident <string>]\n"
  640. " )\n"
  641. #endif
  642. " [--loglevel <0-5/none/error/warning/notice/info/debug>]\n"
  643. " [--channel-loglevel <channel-name> <0-5/none/error/warning/notice/info/debug>] ...\n"
  644. " [--ssl --nssdb <string> --client-cert-name <string>]\n"
  645. " [--server-name <string>]\n"
  646. " --server-addr <addr>\n"
  647. " [--tapdev <name>]\n"
  648. " [--scope <scope_name>] ...\n"
  649. " [\n"
  650. " --bind-addr <addr>\n"
  651. " (transport-mode=udp? --num-ports <num>)\n"
  652. " [--ext-addr <addr / {server_reported}:port> <scope_name>] ...\n"
  653. " ] ...\n"
  654. " --transport-mode <udp/tcp>\n"
  655. " (transport-mode=udp?\n"
  656. " --encryption-mode <blowfish/aes/none>\n"
  657. " --hash-mode <md5/sha1/none>\n"
  658. " [--otp <blowfish/aes> <num> <num-warn>]\n"
  659. " [--fragmentation-latency <milliseconds>]\n"
  660. " )\n"
  661. " (transport-mode=tcp?\n"
  662. " (ssl? [--peer-ssl])\n"
  663. " )\n"
  664. " [--send-buffer-size <num-packets>]\n"
  665. " [--send-buffer-relay-size <num-packets>]\n"
  666. "Address format is a.b.c.d:port (IPv4) or [addr]:port (IPv6).\n",
  667. name
  668. );
  669. }
  670. void print_version (void)
  671. {
  672. printf(GLOBAL_PRODUCT_NAME" "PROGRAM_NAME" "GLOBAL_VERSION"\n"GLOBAL_COPYRIGHT_NOTICE"\n");
  673. }
  674. int parse_arguments (int argc, char *argv[])
  675. {
  676. if (argc <= 0) {
  677. return 0;
  678. }
  679. options.help = 0;
  680. options.version = 0;
  681. options.logger = LOGGER_STDOUT;
  682. #ifndef BADVPN_USE_WINAPI
  683. options.logger_syslog_facility = "daemon";
  684. options.logger_syslog_ident = argv[0];
  685. #endif
  686. options.loglevel = -1;
  687. for (int i = 0; i < BLOG_NUM_CHANNELS; i++) {
  688. options.loglevels[i] = -1;
  689. }
  690. options.ssl = 0;
  691. options.nssdb = NULL;
  692. options.client_cert_name = NULL;
  693. options.server_name = NULL;
  694. options.server_addr = NULL;
  695. options.tapdev = NULL;
  696. options.num_scopes = 0;
  697. options.num_bind_addrs = 0;
  698. options.transport_mode = -1;
  699. options.encryption_mode = -1;
  700. options.hash_mode = -1;
  701. options.otp_mode = SPPROTO_OTP_MODE_NONE;
  702. options.fragmentation_latency = PEER_DEFAULT_FRAGMENTATION_LATENCY;
  703. options.peer_ssl = 0;
  704. options.send_buffer_size = PEER_DEFAULT_SEND_BUFFER_SIZE;
  705. options.send_buffer_relay_size = PEER_DEFAULT_SEND_BUFFER_RELAY_SIZE;
  706. int have_fragmentation_latency = 0;
  707. int i;
  708. for (i = 1; i < argc; i++) {
  709. char *arg = argv[i];
  710. if (!strcmp(arg, "--help")) {
  711. options.help = 1;
  712. }
  713. else if (!strcmp(arg, "--version")) {
  714. options.version = 1;
  715. }
  716. else if (!strcmp(arg, "--logger")) {
  717. if (1 >= argc - i) {
  718. fprintf(stderr, "%s: requires an argument\n", arg);
  719. return 0;
  720. }
  721. char *arg2 = argv[i + 1];
  722. if (!strcmp(arg2, "stdout")) {
  723. options.logger = LOGGER_STDOUT;
  724. }
  725. #ifndef BADVPN_USE_WINAPI
  726. else if (!strcmp(arg2, "syslog")) {
  727. options.logger = LOGGER_SYSLOG;
  728. }
  729. #endif
  730. else {
  731. fprintf(stderr, "%s: wrong argument\n", arg);
  732. return 0;
  733. }
  734. i++;
  735. }
  736. #ifndef BADVPN_USE_WINAPI
  737. else if (!strcmp(arg, "--syslog-facility")) {
  738. if (1 >= argc - i) {
  739. fprintf(stderr, "%s: requires an argument\n", arg);
  740. return 0;
  741. }
  742. options.logger_syslog_facility = argv[i + 1];
  743. i++;
  744. }
  745. else if (!strcmp(arg, "--syslog-ident")) {
  746. if (1 >= argc - i) {
  747. fprintf(stderr, "%s: requires an argument\n", arg);
  748. return 0;
  749. }
  750. options.logger_syslog_ident = argv[i + 1];
  751. i++;
  752. }
  753. #endif
  754. else if (!strcmp(arg, "--loglevel")) {
  755. if (1 >= argc - i) {
  756. fprintf(stderr, "%s: requires an argument\n", arg);
  757. return 0;
  758. }
  759. if ((options.loglevel = parse_loglevel(argv[i + 1])) < 0) {
  760. fprintf(stderr, "%s: wrong argument\n", arg);
  761. return 0;
  762. }
  763. i++;
  764. }
  765. else if (!strcmp(arg, "--channel-loglevel")) {
  766. if (2 >= argc - i) {
  767. fprintf(stderr, "%s: requires two arguments\n", arg);
  768. return 0;
  769. }
  770. int channel = BLogGlobal_GetChannelByName(argv[i + 1]);
  771. if (channel < 0) {
  772. fprintf(stderr, "%s: wrong channel argument\n", arg);
  773. return 0;
  774. }
  775. int loglevel = parse_loglevel(argv[i + 2]);
  776. if (loglevel < 0) {
  777. fprintf(stderr, "%s: wrong loglevel argument\n", arg);
  778. return 0;
  779. }
  780. options.loglevels[channel] = loglevel;
  781. i += 2;
  782. }
  783. else if (!strcmp(arg, "--ssl")) {
  784. options.ssl = 1;
  785. }
  786. else if (!strcmp(arg, "--nssdb")) {
  787. if (1 >= argc - i) {
  788. fprintf(stderr, "%s: requires an argument\n", arg);
  789. return 0;
  790. }
  791. options.nssdb = argv[i + 1];
  792. i++;
  793. }
  794. else if (!strcmp(arg, "--client-cert-name")) {
  795. if (1 >= argc - i) {
  796. fprintf(stderr, "%s: requires an argument\n", arg);
  797. return 0;
  798. }
  799. options.client_cert_name = argv[i + 1];
  800. i++;
  801. }
  802. else if (!strcmp(arg, "--server-name")) {
  803. if (1 >= argc - i) {
  804. fprintf(stderr, "%s: requires an argument\n", arg);
  805. return 0;
  806. }
  807. options.server_name = argv[i + 1];
  808. i++;
  809. }
  810. else if (!strcmp(arg, "--server-addr")) {
  811. if (1 >= argc - i) {
  812. fprintf(stderr, "%s: requires an argument\n", arg);
  813. return 0;
  814. }
  815. options.server_addr = argv[i + 1];
  816. i++;
  817. }
  818. else if (!strcmp(arg, "--tapdev")) {
  819. if (1 >= argc - i) {
  820. fprintf(stderr, "%s: requires an argument\n", arg);
  821. return 0;
  822. }
  823. options.tapdev = argv[i + 1];
  824. i++;
  825. }
  826. else if (!strcmp(arg, "--scope")) {
  827. if (1 >= argc - i) {
  828. fprintf(stderr, "%s: requires an argument\n", arg);
  829. return 0;
  830. }
  831. if (options.num_scopes == MAX_SCOPES) {
  832. fprintf(stderr, "%s: too many\n", arg);
  833. return 0;
  834. }
  835. options.scopes[options.num_scopes] = argv[i + 1];
  836. options.num_scopes++;
  837. i++;
  838. }
  839. else if (!strcmp(arg, "--bind-addr")) {
  840. if (1 >= argc - i) {
  841. fprintf(stderr, "%s: requires an argument\n", arg);
  842. return 0;
  843. }
  844. if (options.num_bind_addrs == MAX_BIND_ADDRS) {
  845. fprintf(stderr, "%s: too many\n", arg);
  846. return 0;
  847. }
  848. POINTER(addr, options.bind_addrs[options.num_bind_addrs])
  849. addr->addr = argv[i + 1];
  850. addr->num_ports = -1;
  851. addr->num_ext_addrs = 0;
  852. options.num_bind_addrs++;
  853. i++;
  854. }
  855. else if (!strcmp(arg, "--num-ports")) {
  856. if (1 >= argc - i) {
  857. fprintf(stderr, "%s: requires an argument\n", arg);
  858. return 0;
  859. }
  860. if (options.num_bind_addrs == 0) {
  861. fprintf(stderr, "%s: must folow --bind-addr\n", arg);
  862. return 0;
  863. }
  864. POINTER(addr, options.bind_addrs[options.num_bind_addrs - 1])
  865. if ((addr->num_ports = atoi(argv[i + 1])) < 0) {
  866. fprintf(stderr, "%s: wrong argument\n", arg);
  867. return 0;
  868. }
  869. i++;
  870. }
  871. else if (!strcmp(arg, "--ext-addr")) {
  872. if (2 >= argc - i) {
  873. fprintf(stderr, "%s: requires two arguments\n", arg);
  874. return 0;
  875. }
  876. if (options.num_bind_addrs == 0) {
  877. fprintf(stderr, "%s: must folow --bind-addr\n", arg);
  878. return 0;
  879. }
  880. POINTER(addr, options.bind_addrs[options.num_bind_addrs - 1])
  881. if (addr->num_ext_addrs == MAX_EXT_ADDRS) {
  882. fprintf(stderr, "%s: too many\n", arg);
  883. return 0;
  884. }
  885. POINTER(eaddr, addr->ext_addrs[addr->num_ext_addrs])
  886. eaddr->addr = argv[i + 1];
  887. eaddr->scope = argv[i + 2];
  888. addr->num_ext_addrs++;
  889. i += 2;
  890. }
  891. else if (!strcmp(arg, "--transport-mode")) {
  892. if (1 >= argc - i) {
  893. fprintf(stderr, "%s: requires an argument\n", arg);
  894. return 0;
  895. }
  896. char *arg2 = argv[i + 1];
  897. if (!strcmp(arg2, "udp")) {
  898. options.transport_mode = TRANSPORT_MODE_UDP;
  899. }
  900. else if (!strcmp(arg2, "tcp")) {
  901. options.transport_mode = TRANSPORT_MODE_TCP;
  902. }
  903. else {
  904. fprintf(stderr, "%s: wrong argument\n", arg);
  905. return 0;
  906. }
  907. i++;
  908. }
  909. else if (!strcmp(arg, "--encryption-mode")) {
  910. if (1 >= argc - i) {
  911. fprintf(stderr, "%s: requires an argument\n", arg);
  912. return 0;
  913. }
  914. char *arg2 = argv[i + 1];
  915. if (!strcmp(arg2, "none")) {
  916. options.encryption_mode = SPPROTO_ENCRYPTION_MODE_NONE;
  917. }
  918. else if (!strcmp(arg2, "blowfish")) {
  919. options.encryption_mode = BENCRYPTION_CIPHER_BLOWFISH;
  920. }
  921. else if (!strcmp(arg2, "aes")) {
  922. options.encryption_mode = BENCRYPTION_CIPHER_AES;
  923. }
  924. else {
  925. fprintf(stderr, "%s: wrong argument\n", arg);
  926. return 0;
  927. }
  928. i++;
  929. }
  930. else if (!strcmp(arg, "--hash-mode")) {
  931. if (1 >= argc - i) {
  932. fprintf(stderr, "%s: requires an argument\n", arg);
  933. return 0;
  934. }
  935. char *arg2 = argv[i + 1];
  936. if (!strcmp(arg2, "none")) {
  937. options.hash_mode = SPPROTO_HASH_MODE_NONE;
  938. }
  939. else if (!strcmp(arg2, "md5")) {
  940. options.hash_mode = BHASH_TYPE_MD5;
  941. }
  942. else if (!strcmp(arg2, "sha1")) {
  943. options.hash_mode = BHASH_TYPE_SHA1;
  944. }
  945. else {
  946. fprintf(stderr, "%s: wrong argument\n", arg);
  947. return 0;
  948. }
  949. i++;
  950. }
  951. else if (!strcmp(arg, "--otp")) {
  952. if (3 >= argc - i) {
  953. fprintf(stderr, "%s: requires three arguments\n", arg);
  954. return 0;
  955. }
  956. char *otp_mode = argv[i + 1];
  957. char *otp_num = argv[i + 2];
  958. char *otp_num_warn = argv[i + 3];
  959. if (!strcmp(otp_mode, "blowfish")) {
  960. options.otp_mode = BENCRYPTION_CIPHER_BLOWFISH;
  961. }
  962. else if (!strcmp(otp_mode, "aes")) {
  963. options.otp_mode = BENCRYPTION_CIPHER_AES;
  964. }
  965. else {
  966. fprintf(stderr, "%s: wrong mode\n", arg);
  967. return 0;
  968. }
  969. if ((options.otp_num = atoi(otp_num)) <= 0) {
  970. fprintf(stderr, "%s: wrong num\n", arg);
  971. return 0;
  972. }
  973. options.otp_num_warn = atoi(otp_num_warn);
  974. if (options.otp_num_warn <= 0 || options.otp_num_warn > options.otp_num) {
  975. fprintf(stderr, "%s: wrong num warn\n", arg);
  976. return 0;
  977. }
  978. i += 3;
  979. }
  980. else if (!strcmp(arg, "--fragmentation-latency")) {
  981. if (1 >= argc - i) {
  982. fprintf(stderr, "%s: requires an argument\n", arg);
  983. return 0;
  984. }
  985. options.fragmentation_latency = atoi(argv[i + 1]);
  986. have_fragmentation_latency = 1;
  987. i++;
  988. }
  989. else if (!strcmp(arg, "--peer-ssl")) {
  990. options.peer_ssl = 1;
  991. }
  992. else if (!strcmp(arg, "--send-buffer-size")) {
  993. if (1 >= argc - i) {
  994. fprintf(stderr, "%s: requires an argument\n", arg);
  995. return 0;
  996. }
  997. if ((options.send_buffer_size = atoi(argv[i + 1])) <= 0) {
  998. fprintf(stderr, "%s: wrong argument\n", arg);
  999. return 0;
  1000. }
  1001. i++;
  1002. }
  1003. else if (!strcmp(arg, "--send-buffer-relay-size")) {
  1004. if (1 >= argc - i) {
  1005. fprintf(stderr, "%s: requires an argument\n", arg);
  1006. return 0;
  1007. }
  1008. if ((options.send_buffer_relay_size = atoi(argv[i + 1])) <= 0) {
  1009. fprintf(stderr, "%s: wrong argument\n", arg);
  1010. return 0;
  1011. }
  1012. i++;
  1013. }
  1014. else {
  1015. fprintf(stderr, "unknown option: %s\n", arg);
  1016. return 0;
  1017. }
  1018. }
  1019. if (options.help || options.version) {
  1020. return 1;
  1021. }
  1022. if (options.ssl != !!options.nssdb) {
  1023. fprintf(stderr, "False: --ssl <=> --nssdb\n");
  1024. return 0;
  1025. }
  1026. if (options.ssl != !!options.client_cert_name) {
  1027. fprintf(stderr, "False: --ssl <=> --client-cert-name\n");
  1028. return 0;
  1029. }
  1030. if (!options.server_addr) {
  1031. fprintf(stderr, "False: --server-addr\n");
  1032. return 0;
  1033. }
  1034. if (options.transport_mode < 0) {
  1035. fprintf(stderr, "False: --transport-mode\n");
  1036. return 0;
  1037. }
  1038. if ((options.transport_mode == TRANSPORT_MODE_UDP) != (options.encryption_mode >= 0)) {
  1039. fprintf(stderr, "False: UDP <=> --encryption-mode\n");
  1040. return 0;
  1041. }
  1042. if ((options.transport_mode == TRANSPORT_MODE_UDP) != (options.hash_mode >= 0)) {
  1043. fprintf(stderr, "False: UDP <=> --hash-mode\n");
  1044. return 0;
  1045. }
  1046. if (!(!(options.otp_mode != SPPROTO_OTP_MODE_NONE) || (options.transport_mode == TRANSPORT_MODE_UDP))) {
  1047. fprintf(stderr, "False: --otp => UDP\n");
  1048. return 0;
  1049. }
  1050. if (!(!have_fragmentation_latency || (options.transport_mode == TRANSPORT_MODE_UDP))) {
  1051. fprintf(stderr, "False: --fragmentation-latency => UDP\n");
  1052. return 0;
  1053. }
  1054. if (!(!options.peer_ssl || (options.ssl && options.transport_mode == TRANSPORT_MODE_TCP))) {
  1055. fprintf(stderr, "False: --peer-ssl => (--ssl && TCP)\n");
  1056. return 0;
  1057. }
  1058. return 1;
  1059. }
  1060. int process_arguments (void)
  1061. {
  1062. // resolve server address
  1063. ASSERT(options.server_addr)
  1064. if (!BAddr_Parse(&server_addr, options.server_addr, server_name, sizeof(server_name))) {
  1065. BLog(BLOG_ERROR, "server addr: BAddr_Parse failed");
  1066. return 0;
  1067. }
  1068. if (!addr_supported(server_addr)) {
  1069. BLog(BLOG_ERROR, "server addr: not supported");
  1070. return 0;
  1071. }
  1072. // override server name if requested
  1073. if (options.server_name) {
  1074. snprintf(server_name, sizeof(server_name), "%s", options.server_name);
  1075. }
  1076. // resolve bind addresses and external addresses
  1077. num_bind_addrs = 0;
  1078. for (int i = 0; i < options.num_bind_addrs; i++) {
  1079. POINTER(addr, options.bind_addrs[i])
  1080. POINTER(out, bind_addrs[num_bind_addrs])
  1081. // read addr
  1082. if (!BAddr_Parse(&out->addr, addr->addr, NULL, 0)) {
  1083. BLog(BLOG_ERROR, "bind addr: BAddr_Parse failed");
  1084. return 0;
  1085. }
  1086. // read num ports
  1087. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1088. if (addr->num_ports < 0) {
  1089. BLog(BLOG_ERROR, "bind addr: num ports missing");
  1090. return 0;
  1091. }
  1092. out->num_ports = addr->num_ports;
  1093. }
  1094. else if (addr->num_ports >= 0) {
  1095. BLog(BLOG_ERROR, "bind addr: num ports given, but not using UDP");
  1096. return 0;
  1097. }
  1098. // read ext addrs
  1099. out->num_ext_addrs = 0;
  1100. for (int j = 0; j < addr->num_ext_addrs; j++) {
  1101. POINTER(eaddr, addr->ext_addrs[j])
  1102. POINTER(eout, out->ext_addrs[out->num_ext_addrs])
  1103. // read addr
  1104. char *colon = strstr(eaddr->addr, ":");
  1105. if (!colon) {
  1106. BLog(BLOG_ERROR, "ext addr: no colon");
  1107. return 0;
  1108. }
  1109. char addrstr[colon - eaddr->addr + 1];
  1110. memcpy(addrstr, eaddr->addr, colon - eaddr->addr);
  1111. addrstr[colon - eaddr->addr] = '\0';
  1112. if (!strcmp(addrstr, "{server_reported}")) {
  1113. if ((eout->server_reported_port = atoi(colon + 1)) < 0) {
  1114. BLog(BLOG_ERROR, "ext addr: wrong port");
  1115. return 0;
  1116. }
  1117. } else {
  1118. eout->server_reported_port = -1;
  1119. if (!BAddr_Parse(&eout->addr, eaddr->addr, NULL, 0)) {
  1120. BLog(BLOG_ERROR, "ext addr: BAddr_Parse failed");
  1121. return 0;
  1122. }
  1123. }
  1124. // read scope
  1125. snprintf(eout->scope, sizeof(eout->scope), "%s", eaddr->scope);
  1126. out->num_ext_addrs++;
  1127. }
  1128. num_bind_addrs++;
  1129. }
  1130. // initialize SPProto parameters
  1131. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1132. sp_params.encryption_mode = options.encryption_mode;
  1133. sp_params.hash_mode = options.hash_mode;
  1134. sp_params.otp_mode = options.otp_mode;
  1135. if (options.otp_mode > 0) {
  1136. sp_params.otp_num = options.otp_num;
  1137. }
  1138. }
  1139. return 1;
  1140. }
  1141. void signal_handler (void *unused)
  1142. {
  1143. BLog(BLOG_NOTICE, "termination requested");
  1144. terminate();
  1145. return;
  1146. }
  1147. int server_start_msg (void **data, peerid_t peer_id, int type, int len)
  1148. {
  1149. ASSERT(server_ready)
  1150. ASSERT(len >= 0)
  1151. ASSERT(len <= MSG_MAX_PAYLOAD)
  1152. ASSERT(!(len > 0) || data)
  1153. uint8_t *packet;
  1154. if (!ServerConnection_StartMessage(&server, (void **)&packet, peer_id, msg_SIZEtype + msg_SIZEpayload(len))) {
  1155. BLog(BLOG_ERROR, "out of server buffer, exiting");
  1156. terminate();
  1157. return -1;
  1158. }
  1159. msgWriter writer;
  1160. msgWriter_Init(&writer, packet);
  1161. msgWriter_Addtype(&writer, type);
  1162. uint8_t *payload_dst = msgWriter_Addpayload(&writer, len);
  1163. msgWriter_Finish(&writer);
  1164. if (data) {
  1165. *data = payload_dst;
  1166. }
  1167. return 0;
  1168. }
  1169. void server_end_msg (void)
  1170. {
  1171. ASSERT(server_ready)
  1172. ServerConnection_EndMessage(&server);
  1173. }
  1174. int peer_add (peerid_t id, int flags, const uint8_t *cert, int cert_len)
  1175. {
  1176. ASSERT(server_ready)
  1177. ASSERT(num_peers < MAX_PEERS)
  1178. ASSERT(!find_peer_by_id(id))
  1179. ASSERT(id != my_id)
  1180. ASSERT(cert_len >= 0)
  1181. ASSERT(cert_len <= SCID_NEWCLIENT_MAX_CERT_LEN)
  1182. // allocate structure
  1183. struct peer_data *peer = malloc(sizeof(*peer));
  1184. if (!peer) {
  1185. BLog(BLOG_ERROR, "peer %d: failed to allocate memory", (int)id);
  1186. goto fail0;
  1187. }
  1188. // remember id
  1189. peer->id = id;
  1190. // remember flags
  1191. peer->flags = flags;
  1192. // remember certificate if using SSL
  1193. if (options.ssl) {
  1194. memcpy(peer->cert, cert, cert_len);
  1195. peer->cert_len = cert_len;
  1196. }
  1197. // init local flow
  1198. if (!DataProtoLocalSource_Init(&peer->local_dpflow, device.mtu, my_id, peer->id, options.send_buffer_size, &ss)) {
  1199. peer_log(peer, BLOG_ERROR, "DataProtoLocalSource_Init failed");
  1200. goto fail1;
  1201. }
  1202. // init local receive flow
  1203. PacketPassFairQueueFlow_Init(&peer->local_recv_qflow, &device.output_queue);
  1204. peer->local_recv_if = PacketPassFairQueueFlow_GetInput(&peer->local_recv_qflow);
  1205. PacketPassInterface_Sender_Init(peer->local_recv_if, (PacketPassInterface_handler_done)local_recv_qflow_output_handler_done, peer);
  1206. // init relay source
  1207. DataProtoRelaySource_Init(&peer->relay_source, peer->id);
  1208. // have no link
  1209. peer->have_link = 0;
  1210. // allocate OTP seed buffers
  1211. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_OTP(sp_params)) {
  1212. if (!(peer->pio.udp.sendseed_sent_key = malloc(BEncryption_cipher_key_size(sp_params.otp_mode)))) {
  1213. goto fail3;
  1214. }
  1215. if (!(peer->pio.udp.sendseed_sent_iv = malloc(BEncryption_cipher_block_size(sp_params.otp_mode)))) {
  1216. goto fail4;
  1217. }
  1218. }
  1219. // have no relaying
  1220. peer->have_relaying = 0;
  1221. // not waiting for relay
  1222. peer->waiting_relay = 0;
  1223. // init retry timer
  1224. BTimer_Init(&peer->reset_timer, PEER_RETRY_TIME, (BTimer_handler)peer_reset_timer_handler, peer);
  1225. // init MAC lists
  1226. LinkedList2_Init(&peer->macs_used);
  1227. LinkedList2_Init(&peer->macs_free);
  1228. // init MAC entries and add them to the free list
  1229. for (int i = 0; i < PEER_MAX_MACS; i++) {
  1230. struct mac_table_entry *entry = &peer->macs_data[i];
  1231. entry->peer = peer;
  1232. LinkedList2_Append(&peer->macs_free, &entry->list_node);
  1233. }
  1234. // init groups lists
  1235. LinkedList2_Init(&peer->groups_used);
  1236. LinkedList2_Init(&peer->groups_free);
  1237. // init group entries and add to unused list
  1238. for (int i = 0; i < PEER_MAX_GROUPS; i++) {
  1239. struct peer_group_entry *entry = &peer->groups_data[i];
  1240. entry->peer = peer;
  1241. LinkedList2_Append(&peer->groups_free, &entry->list_node);
  1242. BTimer_Init(&entry->timer, 0, (BTimer_handler)peer_group_timer_handler, entry);
  1243. }
  1244. // init groups hash table
  1245. if (!HashTable_Init(
  1246. &peer->groups_hashtable,
  1247. OFFSET_DIFF(struct peer_group_entry, group, table_node),
  1248. (HashTable_comparator)peer_groups_table_key_comparator,
  1249. (HashTable_hash_function)peer_groups_table_hash_function,
  1250. PEER_MAX_GROUPS
  1251. )) {
  1252. peer_log(peer, BLOG_ERROR, "HashTable_Init failed");
  1253. goto fail5;
  1254. }
  1255. // is not relay server
  1256. peer->is_relay = 0;
  1257. // init binding
  1258. peer->binding = 0;
  1259. // init jobs
  1260. BPending_Init(&peer->job_send_seed_after_binding, BReactor_PendingGroup(&ss), (BPending_handler)peer_job_send_seed_after_binding, peer);
  1261. // add to peers linked list
  1262. LinkedList2_Append(&peers, &peer->list_node);
  1263. // add to peers-by-ID hash table
  1264. ASSERT_EXECUTE(HashTable_Insert(&peers_by_id, &peer->table_node))
  1265. // increment number of peers
  1266. num_peers++;
  1267. peer_log(peer, BLOG_INFO, "initialized");
  1268. // start setup process
  1269. if (peer_am_master(peer)) {
  1270. return peer_start_binding(peer);
  1271. } else {
  1272. return 0;
  1273. }
  1274. fail5:
  1275. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_OTP(sp_params)) {
  1276. free(peer->pio.udp.sendseed_sent_iv);
  1277. fail4:
  1278. free(peer->pio.udp.sendseed_sent_key);
  1279. }
  1280. fail3:
  1281. DataProtoRelaySource_Free(&peer->relay_source);
  1282. PacketPassFairQueueFlow_Free(&peer->local_recv_qflow);
  1283. DataProtoLocalSource_Free(&peer->local_dpflow);
  1284. fail1:
  1285. free(peer);
  1286. fail0:
  1287. return 0;
  1288. }
  1289. void peer_remove (struct peer_data *peer)
  1290. {
  1291. peer_log(peer, BLOG_INFO, "removing");
  1292. // uninstall relaying
  1293. if (peer->have_relaying) {
  1294. peer_uninstall_relay(peer);
  1295. }
  1296. // disable relay provider
  1297. // this inserts former relay users into the need relay list
  1298. if (peer->is_relay) {
  1299. peer_dealloc_relay_provider(peer);
  1300. }
  1301. // release relay flows
  1302. DataProtoRelaySource_Release(&peer->relay_source);
  1303. // release local receive flow
  1304. if (PacketPassFairQueueFlow_IsBusy(&peer->local_recv_qflow)) {
  1305. PacketPassFairQueueFlow_Release(&peer->local_recv_qflow);
  1306. }
  1307. // deallocate peer
  1308. peer_dealloc(peer);
  1309. // assign relays because former relay users are disconnected above
  1310. assign_relays();
  1311. }
  1312. void peer_dealloc (struct peer_data *peer)
  1313. {
  1314. ASSERT(!peer->have_relaying)
  1315. ASSERT(!peer->is_relay)
  1316. ASSERT(DataProtoRelaySource_IsEmpty(&peer->relay_source))
  1317. PacketPassFairQueueFlow_AssertFree(&peer->local_recv_qflow);
  1318. LinkedList2Iterator it;
  1319. LinkedList2Node *node;
  1320. // remove from waiting relay list
  1321. if (peer->waiting_relay) {
  1322. peer_unregister_need_relay(peer);
  1323. }
  1324. // free link
  1325. if (peer->have_link) {
  1326. peer_free_link(peer);
  1327. }
  1328. // free group entries
  1329. LinkedList2Iterator_InitForward(&it, &peer->groups_used);
  1330. while (node = LinkedList2Iterator_Next(&it)) {
  1331. struct peer_group_entry *group_entry = UPPER_OBJECT(node, struct peer_group_entry, list_node);
  1332. ASSERT(group_entry->peer == peer)
  1333. multicast_table_remove_entry(group_entry);
  1334. BReactor_RemoveTimer(&ss, &group_entry->timer);
  1335. }
  1336. // free MAC addresses
  1337. LinkedList2Iterator_InitForward(&it, &peer->macs_used);
  1338. while (node = LinkedList2Iterator_Next(&it)) {
  1339. struct mac_table_entry *mac_entry = UPPER_OBJECT(node, struct mac_table_entry, list_node);
  1340. ASSERT(mac_entry->peer == peer)
  1341. ASSERT_EXECUTE(HashTable_Remove(&mac_table, mac_entry->mac))
  1342. }
  1343. // decrement number of peers
  1344. num_peers--;
  1345. // remove from peers-by-ID hash table
  1346. ASSERT_EXECUTE(HashTable_Remove(&peers_by_id, &peer->id))
  1347. // remove from peers linked list
  1348. LinkedList2_Remove(&peers, &peer->list_node);
  1349. // free jobs
  1350. BPending_Free(&peer->job_send_seed_after_binding);
  1351. // free groups table
  1352. HashTable_Free(&peer->groups_hashtable);
  1353. // free retry timer
  1354. BReactor_RemoveTimer(&ss, &peer->reset_timer);
  1355. // free OTP seed buffers
  1356. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_OTP(sp_params)) {
  1357. free(peer->pio.udp.sendseed_sent_iv);
  1358. free(peer->pio.udp.sendseed_sent_key);
  1359. }
  1360. // free relay source
  1361. DataProtoRelaySource_Free(&peer->relay_source);
  1362. // free local receive flow
  1363. PacketPassFairQueueFlow_Free(&peer->local_recv_qflow);
  1364. // free local flow
  1365. DataProtoLocalSource_Free(&peer->local_dpflow);
  1366. // free peer structure
  1367. free(peer);
  1368. }
  1369. void peer_log (struct peer_data *peer, int level, const char *fmt, ...)
  1370. {
  1371. va_list vl;
  1372. va_start(vl, fmt);
  1373. BLog_Append("peer %d: ", (int)peer->id);
  1374. BLog_LogToChannelVarArg(BLOG_CURRENT_CHANNEL, level, fmt, vl);
  1375. va_end(vl);
  1376. }
  1377. int peer_am_master (struct peer_data *peer)
  1378. {
  1379. return (my_id > peer->id);
  1380. }
  1381. int peer_init_link (struct peer_data *peer)
  1382. {
  1383. ASSERT(!peer->have_link)
  1384. ASSERT(!peer->have_relaying)
  1385. ASSERT(!peer->waiting_relay)
  1386. ASSERT(!peer->is_relay)
  1387. // init link receive interface
  1388. PacketPassInterface_Init(&peer->recv_ppi, data_mtu, (PacketPassInterface_handler_send)peer_recv_handler_send, peer, BReactor_PendingGroup(&ss));
  1389. // init transport-specific link objects
  1390. PacketPassInterface *link_if;
  1391. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1392. // init DatagramPeerIO
  1393. if (!DatagramPeerIO_Init(
  1394. &peer->pio.udp.pio, &ss, data_mtu, CLIENT_UDP_MTU,
  1395. sp_params, options.fragmentation_latency,
  1396. &peer->recv_ppi
  1397. )) {
  1398. peer_log(peer, BLOG_ERROR, "DatagramPeerIO_Init failed");
  1399. goto fail1;
  1400. }
  1401. // init OTP warning handler
  1402. if (SPPROTO_HAVE_OTP(sp_params)) {
  1403. DatagramPeerIO_SetOTPWarningHandler(&peer->pio.udp.pio, (DatagramPeerIO_handler_otp_warning)peer_udp_pio_handler_seed_warning, peer, options.otp_num_warn);
  1404. }
  1405. // init send seed state
  1406. if (SPPROTO_HAVE_OTP(sp_params)) {
  1407. peer->pio.udp.sendseed_nextid = 0;
  1408. peer->pio.udp.sendseed_sent = 0;
  1409. }
  1410. link_if = DatagramPeerIO_GetSendInput(&peer->pio.udp.pio);
  1411. } else {
  1412. // init StreamPeerIO
  1413. if (!StreamPeerIO_Init(
  1414. &peer->pio.tcp.pio, &ss, options.peer_ssl,
  1415. (options.peer_ssl ? peer->cert : NULL),
  1416. (options.peer_ssl ? peer->cert_len : -1),
  1417. data_mtu, &peer->recv_ppi,
  1418. (StreamPeerIO_handler_error)peer_tcp_pio_handler_error, peer
  1419. )) {
  1420. peer_log(peer, BLOG_ERROR, "StreamPeerIO_Init failed");
  1421. goto fail1;
  1422. }
  1423. link_if = StreamPeerIO_GetSendInput(&peer->pio.tcp.pio);
  1424. }
  1425. // init sending
  1426. if (!DataProtoDest_Init(&peer->send_dp, &ss, peer->id, link_if, PEER_KEEPALIVE_INTERVAL, PEER_KEEPALIVE_RECEIVE_TIMER, (DataProtoDest_handler)peer_dataproto_handler, peer)) {
  1427. peer_log(peer, BLOG_ERROR, "DataProto_Init failed");
  1428. goto fail2;
  1429. }
  1430. // attach local flow to our DataProto
  1431. DataProtoLocalSource_Attach(&peer->local_dpflow, &peer->send_dp);
  1432. peer->have_link = 1;
  1433. return 1;
  1434. fail2:
  1435. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1436. DatagramPeerIO_Free(&peer->pio.udp.pio);
  1437. } else {
  1438. StreamPeerIO_Free(&peer->pio.tcp.pio);
  1439. }
  1440. fail1:
  1441. PacketPassInterface_Free(&peer->recv_ppi);
  1442. return 0;
  1443. }
  1444. void peer_free_link (struct peer_data *peer)
  1445. {
  1446. ASSERT(peer->have_link)
  1447. ASSERT(!peer->is_relay)
  1448. ASSERT(!peer->have_relaying)
  1449. ASSERT(!peer->waiting_relay)
  1450. // allow detaching DataProto flows
  1451. DataProtoDest_PrepareFree(&peer->send_dp);
  1452. // detach local flow from our DataProto
  1453. DataProtoLocalSource_Detach(&peer->local_dpflow);
  1454. // free sending
  1455. DataProtoDest_Free(&peer->send_dp);
  1456. // free transport-specific link objects
  1457. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1458. // free DatagramPeerIO
  1459. DatagramPeerIO_Free(&peer->pio.udp.pio);
  1460. } else {
  1461. // free StreamPeerIO
  1462. StreamPeerIO_Free(&peer->pio.tcp.pio);
  1463. }
  1464. // free common link objects
  1465. PacketPassInterface_Free(&peer->recv_ppi);
  1466. peer->have_link = 0;
  1467. }
  1468. int peer_new_link (struct peer_data *peer)
  1469. {
  1470. if (peer->have_link) {
  1471. if (peer->is_relay) {
  1472. peer_disable_relay_provider(peer);
  1473. }
  1474. peer_free_link(peer);
  1475. }
  1476. else if (peer->have_relaying) {
  1477. peer_uninstall_relay(peer);
  1478. }
  1479. else if (peer->waiting_relay) {
  1480. peer_unregister_need_relay(peer);
  1481. }
  1482. if (!peer_init_link(peer)) {
  1483. return 0;
  1484. }
  1485. return 1;
  1486. }
  1487. void peer_enable_relay_provider (struct peer_data *peer)
  1488. {
  1489. ASSERT(peer->have_link)
  1490. ASSERT(!peer->is_relay)
  1491. ASSERT(!peer->have_relaying)
  1492. ASSERT(!peer->waiting_relay)
  1493. // add to relays list
  1494. LinkedList2_Append(&relays, &peer->relay_list_node);
  1495. // init users list
  1496. LinkedList2_Init(&peer->relay_users);
  1497. peer->is_relay = 1;
  1498. // assign relays
  1499. assign_relays();
  1500. }
  1501. void peer_disable_relay_provider (struct peer_data *peer)
  1502. {
  1503. ASSERT(peer->is_relay)
  1504. ASSERT(peer->have_link)
  1505. ASSERT(!peer->have_relaying)
  1506. ASSERT(!peer->waiting_relay)
  1507. // disconnect relay users
  1508. LinkedList2Node *list_node;
  1509. while (list_node = LinkedList2_GetFirst(&peer->relay_users)) {
  1510. struct peer_data *relay_user = UPPER_OBJECT(list_node, struct peer_data, relaying_list_node);
  1511. ASSERT(relay_user->have_relaying)
  1512. ASSERT(relay_user->relaying_peer == peer)
  1513. // disconnect relay user
  1514. peer_uninstall_relay(relay_user);
  1515. // add it to need relay list
  1516. peer_register_need_relay(relay_user);
  1517. }
  1518. // remove from relays list
  1519. LinkedList2_Remove(&relays, &peer->relay_list_node);
  1520. peer->is_relay = 0;
  1521. // assign relays
  1522. assign_relays();
  1523. }
  1524. void peer_dealloc_relay_provider (struct peer_data *peer)
  1525. {
  1526. ASSERT(peer->is_relay)
  1527. ASSERT(peer->have_link)
  1528. ASSERT(!peer->have_relaying)
  1529. ASSERT(!peer->waiting_relay)
  1530. // allow detaching DataProto flows from the relay peer
  1531. DataProtoDest_PrepareFree(&peer->send_dp);
  1532. // disconnect relay users
  1533. LinkedList2Node *list_node;
  1534. while (list_node = LinkedList2_GetFirst(&peer->relay_users)) {
  1535. struct peer_data *relay_user = UPPER_OBJECT(list_node, struct peer_data, relaying_list_node);
  1536. ASSERT(relay_user->have_relaying)
  1537. ASSERT(relay_user->relaying_peer == peer)
  1538. // disconnect relay user
  1539. peer_dealloc_relay(relay_user);
  1540. // add it to need relay list
  1541. peer_register_need_relay(relay_user);
  1542. }
  1543. // remove from relays list
  1544. LinkedList2_Remove(&relays, &peer->relay_list_node);
  1545. peer->is_relay = 0;
  1546. }
  1547. void peer_install_relay (struct peer_data *peer, struct peer_data *relay)
  1548. {
  1549. ASSERT(!peer->have_relaying)
  1550. ASSERT(!peer->have_link)
  1551. ASSERT(!peer->waiting_relay)
  1552. ASSERT(relay->is_relay)
  1553. ASSERT(!peer->is_relay)
  1554. ASSERT(relay->have_link)
  1555. peer_log(peer, BLOG_INFO, "installing relaying through %d", (int)relay->id);
  1556. // remember relaying peer
  1557. peer->relaying_peer = relay;
  1558. // add to relay's users list
  1559. LinkedList2_Append(&relay->relay_users, &peer->relaying_list_node);
  1560. // attach local flow to relay
  1561. DataProtoLocalSource_Attach(&peer->local_dpflow, &relay->send_dp);
  1562. peer->have_relaying = 1;
  1563. }
  1564. void peer_uninstall_relay (struct peer_data *peer)
  1565. {
  1566. ASSERT(peer->have_relaying)
  1567. ASSERT(!peer->have_link)
  1568. ASSERT(!peer->waiting_relay)
  1569. struct peer_data *relay = peer->relaying_peer;
  1570. ASSERT(relay->is_relay)
  1571. ASSERT(relay->have_link)
  1572. peer_log(peer, BLOG_INFO, "uninstalling relaying through %d", (int)relay->id);
  1573. // release local flow before detaching it
  1574. DataProtoLocalSource_Release(&peer->local_dpflow);
  1575. // link out relay
  1576. peer_dealloc_relay(peer);
  1577. }
  1578. void peer_dealloc_relay (struct peer_data *peer)
  1579. {
  1580. ASSERT(peer->have_relaying)
  1581. ASSERT(!peer->have_link)
  1582. ASSERT(!peer->waiting_relay)
  1583. struct peer_data *relay = peer->relaying_peer;
  1584. ASSERT(relay->is_relay)
  1585. ASSERT(relay->have_link)
  1586. // detach local flow from relay
  1587. DataProtoLocalSource_Detach(&peer->local_dpflow);
  1588. // remove from relay's users list
  1589. LinkedList2_Remove(&relay->relay_users, &peer->relaying_list_node);
  1590. peer->have_relaying = 0;
  1591. }
  1592. void peer_need_relay (struct peer_data *peer)
  1593. {
  1594. ASSERT(!peer->is_relay)
  1595. if (peer->have_link) {
  1596. peer_free_link(peer);
  1597. }
  1598. if (peer->have_relaying) {
  1599. peer_uninstall_relay(peer);
  1600. }
  1601. if (peer->waiting_relay) {
  1602. // already waiting for relay, do nothing
  1603. return;
  1604. }
  1605. // register the peer as needing a relay
  1606. peer_register_need_relay(peer);
  1607. // assign relays
  1608. assign_relays();
  1609. }
  1610. void peer_register_need_relay (struct peer_data *peer)
  1611. {
  1612. ASSERT(!peer->waiting_relay)
  1613. ASSERT(!peer->have_link)
  1614. ASSERT(!peer->have_relaying)
  1615. ASSERT(!peer->is_relay)
  1616. // add to need relay list
  1617. LinkedList2_Append(&waiting_relay_peers, &peer->waiting_relay_list_node);
  1618. peer->waiting_relay = 1;
  1619. }
  1620. void peer_unregister_need_relay (struct peer_data *peer)
  1621. {
  1622. ASSERT(peer->waiting_relay)
  1623. ASSERT(!peer->have_link)
  1624. ASSERT(!peer->have_relaying)
  1625. ASSERT(!peer->is_relay)
  1626. // remove from need relay list
  1627. LinkedList2_Remove(&waiting_relay_peers, &peer->waiting_relay_list_node);
  1628. peer->waiting_relay = 0;
  1629. }
  1630. int peer_reset (struct peer_data *peer)
  1631. {
  1632. peer_log(peer, BLOG_NOTICE, "resetting");
  1633. if (peer_am_master(peer)) {
  1634. // if we're the master, schedule retry
  1635. BReactor_SetTimer(&ss, &peer->reset_timer);
  1636. } else {
  1637. // if we're the slave, report to master
  1638. if (peer_send_simple(peer, MSGID_YOURETRY) < 0) {
  1639. return -1;
  1640. }
  1641. }
  1642. return 0;
  1643. }
  1644. void peer_add_mac_address (struct peer_data *peer, uint8_t *mac)
  1645. {
  1646. // check if the MAC address is already present in the global table
  1647. HashTableNode *old_table_node;
  1648. if (HashTable_Lookup(&mac_table, mac, &old_table_node)) {
  1649. struct mac_table_entry *old_entry = UPPER_OBJECT(old_table_node, struct mac_table_entry, table_node);
  1650. ASSERT(!memcmp(old_entry->mac, mac, 6))
  1651. // if the MAC is already associated with this peer, only move it to the end of the list
  1652. if (old_entry->peer == peer) {
  1653. LinkedList2_Remove(&peer->macs_used, &old_entry->list_node);
  1654. LinkedList2_Append(&peer->macs_used, &old_entry->list_node);
  1655. return;
  1656. }
  1657. // remove entry from global hash table
  1658. ASSERT_EXECUTE(HashTable_Remove(&mac_table, old_entry->mac))
  1659. // move entry to peer's unused list
  1660. LinkedList2_Remove(&old_entry->peer->macs_used, &old_entry->list_node);
  1661. LinkedList2_Append(&old_entry->peer->macs_free, &old_entry->list_node);
  1662. }
  1663. peer_log(peer, BLOG_INFO, "adding MAC %02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8"", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  1664. // aquire MAC address entry, if there are no free ones reuse the oldest used one
  1665. LinkedList2Node *node;
  1666. struct mac_table_entry *entry;
  1667. if (node = LinkedList2_GetFirst(&peer->macs_free)) {
  1668. entry = UPPER_OBJECT(node, struct mac_table_entry, list_node);
  1669. ASSERT(entry->peer == peer)
  1670. // remove from unused list
  1671. LinkedList2_Remove(&peer->macs_free, &entry->list_node);
  1672. } else {
  1673. node = LinkedList2_GetFirst(&peer->macs_used);
  1674. ASSERT(node)
  1675. entry = UPPER_OBJECT(node, struct mac_table_entry, list_node);
  1676. ASSERT(entry->peer == peer)
  1677. // remove from used list
  1678. LinkedList2_Remove(&peer->macs_used, &entry->list_node);
  1679. // remove from global hash table
  1680. ASSERT_EXECUTE(HashTable_Remove(&mac_table, entry->mac))
  1681. }
  1682. // copy MAC to entry
  1683. memcpy(entry->mac, mac, 6);
  1684. // add entry to used list
  1685. LinkedList2_Append(&peer->macs_used, &entry->list_node);
  1686. // add entry to global hash table
  1687. ASSERT_EXECUTE(HashTable_Insert(&mac_table, &entry->table_node))
  1688. }
  1689. void peer_join_group (struct peer_data *peer, uint32_t group)
  1690. {
  1691. struct peer_group_entry *group_entry;
  1692. HashTableNode *old_table_node;
  1693. if (HashTable_Lookup(&peer->groups_hashtable, &group, &old_table_node)) {
  1694. group_entry = UPPER_OBJECT(old_table_node, struct peer_group_entry, table_node);
  1695. // move to end of used list
  1696. LinkedList2_Remove(&peer->groups_used, &group_entry->list_node);
  1697. LinkedList2_Append(&peer->groups_used, &group_entry->list_node);
  1698. } else {
  1699. peer_log(peer, BLOG_INFO, "joined group %"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"",
  1700. ((uint8_t *)&group)[0], ((uint8_t *)&group)[1], ((uint8_t *)&group)[2], ((uint8_t *)&group)[3]
  1701. );
  1702. // aquire group entry, if there are no free ones reuse the earliest used one
  1703. LinkedList2Node *node;
  1704. if (node = LinkedList2_GetFirst(&peer->groups_free)) {
  1705. group_entry = UPPER_OBJECT(node, struct peer_group_entry, list_node);
  1706. // remove from free list
  1707. LinkedList2_Remove(&peer->groups_free, &group_entry->list_node);
  1708. } else {
  1709. node = LinkedList2_GetFirst(&peer->groups_used);
  1710. ASSERT(node)
  1711. group_entry = UPPER_OBJECT(node, struct peer_group_entry, list_node);
  1712. // remove from used list
  1713. LinkedList2_Remove(&peer->groups_used, &group_entry->list_node);
  1714. // remove from groups hash table
  1715. ASSERT_EXECUTE(HashTable_Remove(&peer->groups_hashtable, &group_entry->group))
  1716. // remove from global multicast table
  1717. multicast_table_remove_entry(group_entry);
  1718. }
  1719. // add entry to used list
  1720. LinkedList2_Append(&peer->groups_used, &group_entry->list_node);
  1721. // set group address in entry
  1722. group_entry->group = group;
  1723. // add entry to groups hash table
  1724. ASSERT_EXECUTE(HashTable_Insert(&peer->groups_hashtable, &group_entry->table_node))
  1725. // add entry to global multicast table
  1726. multicast_table_add_entry(group_entry);
  1727. }
  1728. // start timer
  1729. group_entry->timer_endtime = btime_gettime() + IGMP_DEFAULT_GROUP_MEMBERSHIP_INTERVAL;
  1730. BReactor_SetTimerAbsolute(&ss, &group_entry->timer, group_entry->timer_endtime);
  1731. }
  1732. void peer_leave_group (struct peer_data *peer, uint32_t group)
  1733. {
  1734. HashTableNode *table_node;
  1735. if (!HashTable_Lookup(&peer->groups_hashtable, &group, &table_node)) {
  1736. return;
  1737. }
  1738. struct peer_group_entry *group_entry = UPPER_OBJECT(table_node, struct peer_group_entry, table_node);
  1739. peer_log(peer, BLOG_INFO, "left group %"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"",
  1740. ((uint8_t *)&group)[0], ((uint8_t *)&group)[1], ((uint8_t *)&group)[2], ((uint8_t *)&group)[3]
  1741. );
  1742. // move to free list
  1743. LinkedList2_Remove(&peer->groups_used, &group_entry->list_node);
  1744. LinkedList2_Append(&peer->groups_free, &group_entry->list_node);
  1745. // stop timer
  1746. BReactor_RemoveTimer(&ss, &group_entry->timer);
  1747. // remove from groups hash table
  1748. ASSERT_EXECUTE(HashTable_Remove(&peer->groups_hashtable, &group_entry->group))
  1749. // remove from global multicast table
  1750. multicast_table_remove_entry(group_entry);
  1751. }
  1752. void peer_msg (struct peer_data *peer, uint8_t *data, int data_len)
  1753. {
  1754. ASSERT(server_ready)
  1755. ASSERT(data_len >= 0)
  1756. ASSERT(data_len <= SC_MAX_MSGLEN)
  1757. // parse message
  1758. msgParser parser;
  1759. if (!msgParser_Init(&parser, data, data_len)) {
  1760. peer_log(peer, BLOG_NOTICE, "msg: failed to parse");
  1761. return;
  1762. }
  1763. // read message
  1764. uint16_t type;
  1765. ASSERT_EXECUTE(msgParser_Gettype(&parser, &type))
  1766. uint8_t *payload;
  1767. int payload_len;
  1768. ASSERT_EXECUTE(msgParser_Getpayload(&parser, &payload, &payload_len))
  1769. // dispatch according to message type
  1770. switch (type) {
  1771. case MSGID_YOUCONNECT:
  1772. peer_msg_youconnect(peer, payload, payload_len);
  1773. return;
  1774. case MSGID_CANNOTCONNECT:
  1775. peer_msg_cannotconnect(peer, payload, payload_len);
  1776. return;
  1777. case MSGID_CANNOTBIND:
  1778. peer_msg_cannotbind(peer, payload, payload_len);
  1779. return;
  1780. case MSGID_YOURETRY:
  1781. peer_msg_youretry(peer, payload, payload_len);
  1782. return;
  1783. case MSGID_SEED:
  1784. peer_msg_seed(peer, payload, payload_len);
  1785. return;
  1786. case MSGID_CONFIRMSEED:
  1787. peer_msg_confirmseed(peer, payload, payload_len);
  1788. return;
  1789. default:
  1790. BLog(BLOG_NOTICE, "msg: unknown type");
  1791. return;
  1792. }
  1793. }
  1794. void peer_msg_youconnect (struct peer_data *peer, uint8_t *data, int data_len)
  1795. {
  1796. // init parser
  1797. msg_youconnectParser parser;
  1798. if (!msg_youconnectParser_Init(&parser, data, data_len)) {
  1799. peer_log(peer, BLOG_WARNING, "msg_youconnect: failed to parse");
  1800. return;
  1801. }
  1802. // try addresses
  1803. BAddr addr;
  1804. while (1) {
  1805. // get address message
  1806. uint8_t *addrmsg_data;
  1807. int addrmsg_len;
  1808. if (!msg_youconnectParser_Getaddr(&parser, &addrmsg_data, &addrmsg_len)) {
  1809. peer_log(peer, BLOG_NOTICE, "msg_youconnect: no usable addresses");
  1810. peer_send_simple(peer, MSGID_CANNOTCONNECT);
  1811. return;
  1812. }
  1813. // parse address message
  1814. msg_youconnect_addrParser aparser;
  1815. if (!msg_youconnect_addrParser_Init(&aparser, addrmsg_data, addrmsg_len)) {
  1816. peer_log(peer, BLOG_WARNING, "msg_youconnect: failed to parse address message");
  1817. return;
  1818. }
  1819. // check if the address scope is known
  1820. uint8_t *name_data;
  1821. int name_len;
  1822. ASSERT_EXECUTE(msg_youconnect_addrParser_Getname(&aparser, &name_data, &name_len))
  1823. char *name;
  1824. if (!(name = address_scope_known(name_data, name_len))) {
  1825. continue;
  1826. }
  1827. // read address
  1828. uint8_t *addr_data;
  1829. int addr_len;
  1830. ASSERT_EXECUTE(msg_youconnect_addrParser_Getaddr(&aparser, &addr_data, &addr_len))
  1831. if (!addr_read(addr_data, addr_len, &addr)) {
  1832. peer_log(peer, BLOG_WARNING, "msg_youconnect: failed to read address");
  1833. return;
  1834. }
  1835. peer_log(peer, BLOG_NOTICE, "msg_youconnect: using address in scope '%s'", name);
  1836. break;
  1837. }
  1838. // discard further addresses
  1839. msg_youconnectParser_Forwardaddr(&parser);
  1840. uint8_t *key = NULL;
  1841. uint64_t password = 0;
  1842. // read additonal parameters
  1843. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  1844. if (SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  1845. int key_len;
  1846. if (!msg_youconnectParser_Getkey(&parser, &key, &key_len)) {
  1847. peer_log(peer, BLOG_WARNING, "msg_youconnect: no key");
  1848. return;
  1849. }
  1850. if (key_len != BEncryption_cipher_key_size(sp_params.encryption_mode)) {
  1851. peer_log(peer, BLOG_WARNING, "msg_youconnect: wrong key size");
  1852. return;
  1853. }
  1854. }
  1855. } else {
  1856. if (!msg_youconnectParser_Getpassword(&parser, &password)) {
  1857. peer_log(peer, BLOG_WARNING, "msg_youconnect: no password");
  1858. return;
  1859. }
  1860. }
  1861. if (!msg_youconnectParser_GotEverything(&parser)) {
  1862. peer_log(peer, BLOG_WARNING, "msg_youconnect: stray data");
  1863. return;
  1864. }
  1865. peer_log(peer, BLOG_INFO, "connecting");
  1866. peer_connect(peer, addr, key, password);
  1867. return;
  1868. }
  1869. void peer_msg_cannotconnect (struct peer_data *peer, uint8_t *data, int data_len)
  1870. {
  1871. if (data_len != 0) {
  1872. peer_log(peer, BLOG_WARNING, "msg_cannotconnect: invalid length");
  1873. return;
  1874. }
  1875. if (!peer->binding) {
  1876. peer_log(peer, BLOG_WARNING, "msg_cannotconnect: not binding");
  1877. return;
  1878. }
  1879. peer_log(peer, BLOG_INFO, "peer could not connect");
  1880. // continue trying bind addresses
  1881. peer_bind(peer);
  1882. return;
  1883. }
  1884. void peer_msg_cannotbind (struct peer_data *peer, uint8_t *data, int data_len)
  1885. {
  1886. if (data_len != 0) {
  1887. peer_log(peer, BLOG_WARNING, "msg_cannotbind: invalid length");
  1888. return;
  1889. }
  1890. peer_log(peer, BLOG_INFO, "peer cannot bind");
  1891. if (!peer_am_master(peer)) {
  1892. peer_start_binding(peer);
  1893. return;
  1894. } else {
  1895. if (!peer->is_relay) {
  1896. peer_need_relay(peer);
  1897. }
  1898. }
  1899. }
  1900. void peer_msg_seed (struct peer_data *peer, uint8_t *data, int data_len)
  1901. {
  1902. msg_seedParser parser;
  1903. if (!msg_seedParser_Init(&parser, data, data_len)) {
  1904. peer_log(peer, BLOG_WARNING, "msg_seed: failed to parse");
  1905. return;
  1906. }
  1907. // read message
  1908. uint16_t seed_id;
  1909. ASSERT_EXECUTE(msg_seedParser_Getseed_id(&parser, &seed_id))
  1910. uint8_t *key;
  1911. int key_len;
  1912. ASSERT_EXECUTE(msg_seedParser_Getkey(&parser, &key, &key_len))
  1913. uint8_t *iv;
  1914. int iv_len;
  1915. ASSERT_EXECUTE(msg_seedParser_Getiv(&parser, &iv, &iv_len))
  1916. if (options.transport_mode != TRANSPORT_MODE_UDP) {
  1917. peer_log(peer, BLOG_WARNING, "msg_seed: not in UDP mode");
  1918. return;
  1919. }
  1920. if (!SPPROTO_HAVE_OTP(sp_params)) {
  1921. peer_log(peer, BLOG_WARNING, "msg_seed: OTPs disabled");
  1922. return;
  1923. }
  1924. if (key_len != BEncryption_cipher_key_size(sp_params.otp_mode)) {
  1925. peer_log(peer, BLOG_WARNING, "msg_seed: wrong key length");
  1926. return;
  1927. }
  1928. if (iv_len != BEncryption_cipher_block_size(sp_params.otp_mode)) {
  1929. peer_log(peer, BLOG_WARNING, "msg_seed: wrong IV length");
  1930. return;
  1931. }
  1932. if (!peer->have_link) {
  1933. peer_log(peer, BLOG_WARNING, "msg_seed: have no link");
  1934. return;
  1935. }
  1936. peer_log(peer, BLOG_DEBUG, "received OTP receive seed");
  1937. // add receive seed
  1938. DatagramPeerIO_AddOTPRecvSeed(&peer->pio.udp.pio, seed_id, key, iv);
  1939. // send confirmation
  1940. peer_send_confirmseed(peer, seed_id);
  1941. return;
  1942. }
  1943. void peer_msg_confirmseed (struct peer_data *peer, uint8_t *data, int data_len)
  1944. {
  1945. msg_confirmseedParser parser;
  1946. if (!msg_confirmseedParser_Init(&parser, data, data_len)) {
  1947. peer_log(peer, BLOG_WARNING, "msg_confirmseed: failed to parse");
  1948. return;
  1949. }
  1950. // read message
  1951. uint16_t seed_id;
  1952. ASSERT_EXECUTE(msg_confirmseedParser_Getseed_id(&parser, &seed_id))
  1953. if (options.transport_mode != TRANSPORT_MODE_UDP) {
  1954. peer_log(peer, BLOG_WARNING, "msg_confirmseed: not in UDP mode");
  1955. return;
  1956. }
  1957. if (!SPPROTO_HAVE_OTP(sp_params)) {
  1958. peer_log(peer, BLOG_WARNING, "msg_confirmseed: OTPs disabled");
  1959. return;
  1960. }
  1961. if (!peer->have_link) {
  1962. peer_log(peer, BLOG_WARNING, "msg_confirmseed: have no link");
  1963. return;
  1964. }
  1965. if (!peer->pio.udp.sendseed_sent) {
  1966. peer_log(peer, BLOG_WARNING, "msg_confirmseed: no seed has been sent");
  1967. return;
  1968. }
  1969. if (seed_id != peer->pio.udp.sendseed_sent_id) {
  1970. peer_log(peer, BLOG_WARNING, "msg_confirmseed: invalid seed: expecting %d, received %d", (int)peer->pio.udp.sendseed_sent_id, (int)seed_id);
  1971. return;
  1972. }
  1973. peer_log(peer, BLOG_DEBUG, "OTP send seed confirmed");
  1974. // no longer waiting for confirmation
  1975. peer->pio.udp.sendseed_sent = 0;
  1976. // start using the seed
  1977. DatagramPeerIO_SetOTPSendSeed(&peer->pio.udp.pio, peer->pio.udp.sendseed_sent_id, peer->pio.udp.sendseed_sent_key, peer->pio.udp.sendseed_sent_iv);
  1978. }
  1979. void peer_msg_youretry (struct peer_data *peer, uint8_t *data, int data_len)
  1980. {
  1981. if (data_len != 0) {
  1982. peer_log(peer, BLOG_WARNING, "msg_youretry: invalid length");
  1983. return;
  1984. }
  1985. if (!peer_am_master(peer)) {
  1986. peer_log(peer, BLOG_WARNING, "msg_youretry: we are not master");
  1987. return;
  1988. }
  1989. peer_log(peer, BLOG_NOTICE, "requests reset");
  1990. peer_reset(peer);
  1991. return;
  1992. }
  1993. void peer_udp_pio_handler_seed_warning (struct peer_data *peer)
  1994. {
  1995. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  1996. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  1997. ASSERT(peer->have_link)
  1998. // generate and send a new seed
  1999. if (!peer->pio.udp.sendseed_sent) {
  2000. peer_udp_send_seed(peer);
  2001. return;
  2002. }
  2003. }
  2004. void peer_tcp_pio_handler_error (struct peer_data *peer)
  2005. {
  2006. ASSERT(options.transport_mode == TRANSPORT_MODE_TCP)
  2007. ASSERT(peer->have_link)
  2008. peer_log(peer, BLOG_NOTICE, "TCP connection failed");
  2009. peer_reset(peer);
  2010. return;
  2011. }
  2012. void peer_reset_timer_handler (struct peer_data *peer)
  2013. {
  2014. ASSERT(peer_am_master(peer))
  2015. BLog(BLOG_NOTICE, "retry timer expired");
  2016. // start setup process
  2017. peer_start_binding(peer);
  2018. return;
  2019. }
  2020. void peer_recv_handler_send (struct peer_data *peer, uint8_t *data, int data_len)
  2021. {
  2022. ASSERT(peer->have_link)
  2023. ASSERT(data_len >= 0)
  2024. ASSERT(data_len <= data_mtu)
  2025. uint8_t *orig_data = data;
  2026. int orig_data_len = data_len;
  2027. int dp_good = 0;
  2028. struct peer_data *relay = NULL;
  2029. int local = 0;
  2030. // check dataproto header
  2031. if (data_len < sizeof(struct dataproto_header)) {
  2032. peer_log(peer, BLOG_NOTICE, "receive: no dataproto header");
  2033. goto out;
  2034. }
  2035. struct dataproto_header *header = (struct dataproto_header *)data;
  2036. data += sizeof(struct dataproto_header);
  2037. data_len -= sizeof(struct dataproto_header);
  2038. uint8_t flags = header->flags;
  2039. peerid_t from_id = ltoh16(header->from_id);
  2040. int num_ids = ltoh16(header->num_peer_ids);
  2041. // check destination IDs
  2042. if (num_ids > 1) {
  2043. peer_log(peer, BLOG_NOTICE, "receive: too many destination IDs");
  2044. goto out;
  2045. }
  2046. if (data_len < num_ids * sizeof(struct dataproto_peer_id)) {
  2047. peer_log(peer, BLOG_NOTICE, "receive: invalid length for destination IDs");
  2048. goto out;
  2049. }
  2050. struct dataproto_peer_id *ids = (struct dataproto_peer_id *)data;
  2051. data += num_ids * sizeof(struct dataproto_peer_id);
  2052. data_len -= num_ids * sizeof(struct dataproto_peer_id);
  2053. // check remaining data
  2054. if (data_len > device.mtu) {
  2055. peer_log(peer, BLOG_NOTICE, "receive: frame too large");
  2056. goto out;
  2057. }
  2058. dp_good = 1;
  2059. if (num_ids == 0) {
  2060. goto out;
  2061. }
  2062. // find source peer
  2063. struct peer_data *src_peer = find_peer_by_id(from_id);
  2064. if (!src_peer) {
  2065. peer_log(peer, BLOG_NOTICE, "receive: source peer %d not known", (int)from_id);
  2066. goto out;
  2067. }
  2068. // find destination
  2069. peerid_t id = ltoh16(ids[0].id);
  2070. if (id == my_id) {
  2071. // frame is for us
  2072. // check ethernet header
  2073. if (data_len < sizeof(struct ethernet_header)) {
  2074. peer_log(peer, BLOG_INFO, "received frame without ethernet header");
  2075. goto out;
  2076. }
  2077. struct ethernet_header *header = (struct ethernet_header *)data;
  2078. // associate source address with peer
  2079. peer_add_mac_address(peer, header->source);
  2080. // invoke incoming hook
  2081. peer_hook_incoming(peer, data, data_len);
  2082. local = 1;
  2083. } else {
  2084. // frame is for someone else
  2085. // make sure the client is allowed to relay though us
  2086. if (!(peer->flags & SCID_NEWCLIENT_FLAG_RELAY_CLIENT)) {
  2087. peer_log(peer, BLOG_NOTICE, "relaying not allowed");
  2088. goto out;
  2089. }
  2090. // lookup destination peer
  2091. struct peer_data *dest_peer = find_peer_by_id(id);
  2092. if (!dest_peer) {
  2093. peer_log(peer, BLOG_NOTICE, "relay destination peer not known");
  2094. goto out;
  2095. }
  2096. // check if the destination peer has link
  2097. if (!dest_peer->have_link) {
  2098. peer_log(peer, BLOG_NOTICE, "relay destination peer has no link");
  2099. goto out;
  2100. }
  2101. relay = dest_peer;
  2102. }
  2103. out:
  2104. // accept packet
  2105. if (!local) {
  2106. PacketPassInterface_Done(&peer->recv_ppi);
  2107. }
  2108. // relay frame
  2109. if (relay) {
  2110. peer_submit_relayed_frame(relay, src_peer, data, data_len);
  2111. }
  2112. // submit to device
  2113. if (local) {
  2114. PacketPassInterface_Sender_Send(peer->local_recv_if, data, data_len);
  2115. }
  2116. // inform DataProto of received packet
  2117. if (dp_good) {
  2118. DataProtoDest_Received(&peer->send_dp, !!(flags & DATAPROTO_FLAGS_RECEIVING_KEEPALIVES));
  2119. }
  2120. }
  2121. void local_recv_qflow_output_handler_done (struct peer_data *peer)
  2122. {
  2123. PacketPassInterface_Done(&peer->recv_ppi);
  2124. }
  2125. int peer_start_binding (struct peer_data *peer)
  2126. {
  2127. peer->binding = 1;
  2128. peer->binding_addrpos = 0;
  2129. return peer_bind(peer);
  2130. }
  2131. int peer_bind (struct peer_data *peer)
  2132. {
  2133. ASSERT(peer->binding)
  2134. ASSERT(peer->binding_addrpos >= 0)
  2135. ASSERT(peer->binding_addrpos <= num_bind_addrs)
  2136. int res;
  2137. while (peer->binding_addrpos < num_bind_addrs) {
  2138. // if there are no external addresses, skip bind address
  2139. if (bind_addrs[peer->binding_addrpos].num_ext_addrs == 0) {
  2140. peer->binding_addrpos++;
  2141. continue;
  2142. }
  2143. // try to bind
  2144. int cont;
  2145. if (peer_bind_one_address(peer, peer->binding_addrpos, &cont) < 0) {
  2146. return -1;
  2147. }
  2148. // increment address counter
  2149. peer->binding_addrpos++;
  2150. if (!cont) {
  2151. return 0;
  2152. }
  2153. }
  2154. peer_log(peer, BLOG_NOTICE, "no more addresses to bind to");
  2155. // no longer binding
  2156. peer->binding = 0;
  2157. // tell the peer we failed to bind
  2158. if (peer_send_simple(peer, MSGID_CANNOTBIND) < 0) {
  2159. return -1;
  2160. }
  2161. // if we are the slave, setup relaying
  2162. if (!peer_am_master(peer)) {
  2163. if (!peer->is_relay) {
  2164. peer_need_relay(peer);
  2165. }
  2166. }
  2167. return 0;
  2168. }
  2169. int peer_bind_one_address (struct peer_data *peer, int addr_index, int *cont)
  2170. {
  2171. ASSERT(addr_index >= 0)
  2172. ASSERT(addr_index < num_bind_addrs)
  2173. ASSERT(bind_addrs[addr_index].num_ext_addrs > 0)
  2174. // get a fresh link
  2175. if (!peer_new_link(peer)) {
  2176. peer_log(peer, BLOG_ERROR, "cannot get link");
  2177. *cont = 0;
  2178. return peer_reset(peer);
  2179. }
  2180. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  2181. // get addr
  2182. POINTER(addr, bind_addrs[addr_index]);
  2183. // try binding to all ports in the range
  2184. int port_add;
  2185. for (port_add = 0; port_add < addr->num_ports; port_add++) {
  2186. BAddr tryaddr = addr->addr;
  2187. BAddr_SetPort(&tryaddr, hton16(ntoh16(BAddr_GetPort(&tryaddr)) + port_add));
  2188. if (DatagramPeerIO_Bind(&peer->pio.udp.pio, tryaddr)) {
  2189. break;
  2190. }
  2191. }
  2192. if (port_add == addr->num_ports) {
  2193. BLog(BLOG_NOTICE, "failed to bind to any port");
  2194. *cont = 1;
  2195. return 0;
  2196. }
  2197. uint8_t key[SPPROTO_HAVE_ENCRYPTION(sp_params) ? BEncryption_cipher_key_size(sp_params.encryption_mode) : 0];
  2198. // generate and set encryption key
  2199. if (SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2200. BRandom_randomize(key, sizeof(key));
  2201. DatagramPeerIO_SetEncryptionKey(&peer->pio.udp.pio, key);
  2202. }
  2203. // schedule sending OTP seed
  2204. if (SPPROTO_HAVE_OTP(sp_params)) {
  2205. BPending_Set(&peer->job_send_seed_after_binding);
  2206. }
  2207. // send connectinfo
  2208. if (peer_send_conectinfo(peer, addr_index, port_add, key, 0) < 0) {
  2209. return -1;
  2210. }
  2211. } else {
  2212. // order StreamPeerIO to listen
  2213. uint64_t pass;
  2214. StreamPeerIO_Listen(&peer->pio.tcp.pio, &listeners[addr_index], &pass);
  2215. // send connectinfo
  2216. if (peer_send_conectinfo(peer, addr_index, 0, NULL, pass) < 0) {
  2217. return -1;
  2218. }
  2219. }
  2220. peer_log(peer, BLOG_NOTICE, "bound to address number %d", addr_index);
  2221. *cont = 0;
  2222. return 0;
  2223. }
  2224. int peer_connect (struct peer_data *peer, BAddr addr, uint8_t *encryption_key, uint64_t password)
  2225. {
  2226. ASSERT(!BAddr_IsInvalid(&addr))
  2227. // get a fresh link
  2228. if (!peer_new_link(peer)) {
  2229. peer_log(peer, BLOG_ERROR, "cannot get link");
  2230. return peer_reset(peer);
  2231. }
  2232. if (options.transport_mode == TRANSPORT_MODE_UDP) {
  2233. // order DatagramPeerIO to connect
  2234. if (!DatagramPeerIO_Connect(&peer->pio.udp.pio, addr)) {
  2235. peer_log(peer, BLOG_NOTICE, "DatagramPeerIO_Connect failed");
  2236. return peer_reset(peer);
  2237. }
  2238. // set encryption key
  2239. if (SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2240. DatagramPeerIO_SetEncryptionKey(&peer->pio.udp.pio, encryption_key);
  2241. }
  2242. // generate and send a send seed
  2243. if (SPPROTO_HAVE_OTP(sp_params)) {
  2244. if (peer_udp_send_seed(peer) < 0) {
  2245. return -1;
  2246. }
  2247. }
  2248. } else {
  2249. // order StreamPeerIO to connect
  2250. if (!StreamPeerIO_Connect(
  2251. &peer->pio.tcp.pio, addr, password,
  2252. (options.peer_ssl ? client_cert : NULL),
  2253. (options.peer_ssl ? client_key : NULL)
  2254. )) {
  2255. peer_log(peer, BLOG_NOTICE, "StreamPeerIO_Connect failed");
  2256. return peer_reset(peer);
  2257. }
  2258. }
  2259. return 0;
  2260. }
  2261. int peer_send_simple (struct peer_data *peer, int msgid)
  2262. {
  2263. if (server_start_msg(NULL, peer->id, msgid, 0) < 0) {
  2264. return -1;
  2265. }
  2266. server_end_msg();
  2267. return 0;
  2268. }
  2269. int peer_send_conectinfo (struct peer_data *peer, int addr_index, int port_adjust, uint8_t *enckey, uint64_t pass)
  2270. {
  2271. ASSERT(addr_index >= 0)
  2272. ASSERT(addr_index < num_bind_addrs)
  2273. ASSERT(bind_addrs[addr_index].num_ext_addrs > 0)
  2274. // get address
  2275. POINTER(bind_addr, bind_addrs[addr_index]);
  2276. // remember encryption key size
  2277. int key_size;
  2278. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2279. key_size = BEncryption_cipher_key_size(sp_params.encryption_mode);
  2280. }
  2281. // calculate message length ..
  2282. int msg_len = 0;
  2283. // addresses
  2284. for (int i = 0; i < bind_addr->num_ext_addrs; i++) {
  2285. int addrmsg_len =
  2286. msg_youconnect_addr_SIZEname(strlen(bind_addr->ext_addrs[i].scope)) +
  2287. msg_youconnect_addr_SIZEaddr(addr_size(bind_addr->ext_addrs[i].addr));
  2288. msg_len += msg_youconnect_SIZEaddr(addrmsg_len);
  2289. }
  2290. // encryption key
  2291. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2292. msg_len += msg_youconnect_SIZEkey(key_size);
  2293. }
  2294. // password
  2295. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  2296. msg_len += msg_youconnect_SIZEpassword;
  2297. }
  2298. // check if it's too big (because of the addresses)
  2299. if (msg_len > MSG_MAX_PAYLOAD) {
  2300. BLog(BLOG_ERROR, "cannot send too big youconnect message");
  2301. return 0;
  2302. }
  2303. // start message
  2304. uint8_t *msg;
  2305. if (server_start_msg((void **)&msg, peer->id, MSGID_YOUCONNECT, msg_len) < 0) {
  2306. return -1;
  2307. }
  2308. // init writer
  2309. msg_youconnectWriter writer;
  2310. msg_youconnectWriter_Init(&writer, msg);
  2311. // write addresses
  2312. for (int i = 0; i < bind_addr->num_ext_addrs; i++) {
  2313. int name_len = strlen(bind_addr->ext_addrs[i].scope);
  2314. int addr_len = addr_size(bind_addr->ext_addrs[i].addr);
  2315. // get a pointer for writing the address
  2316. int addrmsg_len =
  2317. msg_youconnect_addr_SIZEname(name_len) +
  2318. msg_youconnect_addr_SIZEaddr(addr_len);
  2319. uint8_t *addrmsg_dst = msg_youconnectWriter_Addaddr(&writer, addrmsg_len);
  2320. // init address writer
  2321. msg_youconnect_addrWriter awriter;
  2322. msg_youconnect_addrWriter_Init(&awriter, addrmsg_dst);
  2323. // write scope
  2324. uint8_t *name_dst = msg_youconnect_addrWriter_Addname(&awriter, name_len);
  2325. memcpy(name_dst, bind_addr->ext_addrs[i].scope, name_len);
  2326. // write address with adjusted port
  2327. BAddr addr = bind_addr->ext_addrs[i].addr;
  2328. BAddr_SetPort(&addr, hton16(ntoh16(BAddr_GetPort(&addr)) + port_adjust));
  2329. uint8_t *addr_dst = msg_youconnect_addrWriter_Addaddr(&awriter, addr_len);
  2330. addr_write(addr_dst, addr);
  2331. // finish address writer
  2332. msg_youconnect_addrWriter_Finish(&awriter);
  2333. }
  2334. // write encryption key
  2335. if (options.transport_mode == TRANSPORT_MODE_UDP && SPPROTO_HAVE_ENCRYPTION(sp_params)) {
  2336. uint8_t *key_dst = msg_youconnectWriter_Addkey(&writer, key_size);
  2337. memcpy(key_dst, enckey, key_size);
  2338. }
  2339. // write password
  2340. if (options.transport_mode == TRANSPORT_MODE_TCP) {
  2341. msg_youconnectWriter_Addpassword(&writer, pass);
  2342. }
  2343. // finish writer
  2344. msg_youconnectWriter_Finish(&writer);
  2345. // end message
  2346. server_end_msg();
  2347. return 0;
  2348. }
  2349. int peer_udp_send_seed (struct peer_data *peer)
  2350. {
  2351. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  2352. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  2353. ASSERT(peer->have_link)
  2354. ASSERT(!peer->pio.udp.sendseed_sent)
  2355. peer_log(peer, BLOG_DEBUG, "sending OTP send seed");
  2356. int key_len = BEncryption_cipher_key_size(sp_params.otp_mode);
  2357. int iv_len = BEncryption_cipher_block_size(sp_params.otp_mode);
  2358. // generate seed
  2359. peer->pio.udp.sendseed_sent_id = peer->pio.udp.sendseed_nextid;
  2360. BRandom_randomize(peer->pio.udp.sendseed_sent_key, key_len);
  2361. BRandom_randomize(peer->pio.udp.sendseed_sent_iv, iv_len);
  2362. // set as sent, increment next seed ID
  2363. peer->pio.udp.sendseed_sent = 1;
  2364. peer->pio.udp.sendseed_nextid++;
  2365. // send seed to the peer
  2366. int msg_len = msg_seed_SIZEseed_id + msg_seed_SIZEkey(key_len) + msg_seed_SIZEiv(iv_len);
  2367. uint8_t *msg;
  2368. if (server_start_msg((void **)&msg, peer->id, MSGID_SEED, msg_len) < 0) {
  2369. return -1;
  2370. }
  2371. msg_seedWriter writer;
  2372. msg_seedWriter_Init(&writer, msg);
  2373. msg_seedWriter_Addseed_id(&writer, peer->pio.udp.sendseed_sent_id);
  2374. uint8_t *key_dst = msg_seedWriter_Addkey(&writer, key_len);
  2375. memcpy(key_dst, peer->pio.udp.sendseed_sent_key, key_len);
  2376. uint8_t *iv_dst = msg_seedWriter_Addiv(&writer, iv_len);
  2377. memcpy(iv_dst, peer->pio.udp.sendseed_sent_iv, iv_len);
  2378. msg_seedWriter_Finish(&writer);
  2379. server_end_msg();
  2380. return 0;
  2381. }
  2382. int peer_send_confirmseed (struct peer_data *peer, uint16_t seed_id)
  2383. {
  2384. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  2385. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  2386. // send confirmation
  2387. int msg_len = msg_confirmseed_SIZEseed_id;
  2388. uint8_t *msg;
  2389. if (server_start_msg((void **)&msg, peer->id, MSGID_CONFIRMSEED, msg_len) < 0) {
  2390. return -1;
  2391. }
  2392. msg_confirmseedWriter writer;
  2393. msg_confirmseedWriter_Init(&writer, msg);
  2394. msg_confirmseedWriter_Addseed_id(&writer, seed_id);
  2395. msg_confirmseedWriter_Finish(&writer);
  2396. server_end_msg();
  2397. return 0;
  2398. }
  2399. void peer_submit_relayed_frame (struct peer_data *peer, struct peer_data *source_peer, uint8_t *frame, int frame_len)
  2400. {
  2401. ASSERT(peer->have_link)
  2402. ASSERT(frame_len >= 0)
  2403. ASSERT(frame_len <= device.mtu)
  2404. DataProtoDest_SubmitRelayFrame(&peer->send_dp, &source_peer->relay_source, frame, frame_len, options.send_buffer_relay_size);
  2405. }
  2406. void peer_group_timer_handler (struct peer_group_entry *entry)
  2407. {
  2408. struct peer_data *peer = entry->peer;
  2409. peer_leave_group(peer, entry->group);
  2410. }
  2411. void peer_dataproto_handler (struct peer_data *peer, int up)
  2412. {
  2413. ASSERT(peer->have_link)
  2414. // peer_recv_handler_send relies on this not bringing everything down
  2415. if (up) {
  2416. peer_log(peer, BLOG_INFO, "up");
  2417. // if it can be a relay provided, enable it
  2418. if ((peer->flags&SCID_NEWCLIENT_FLAG_RELAY_SERVER) && !peer->is_relay) {
  2419. peer_enable_relay_provider(peer);
  2420. }
  2421. } else {
  2422. peer_log(peer, BLOG_INFO, "down");
  2423. // if it is a relay provider, disable it
  2424. if (peer->is_relay) {
  2425. peer_disable_relay_provider(peer);
  2426. }
  2427. }
  2428. }
  2429. struct peer_data * find_peer_by_id (peerid_t id)
  2430. {
  2431. HashTableNode *node;
  2432. if (!HashTable_Lookup(&peers_by_id, &id, &node)) {
  2433. return NULL;
  2434. }
  2435. struct peer_data *peer = UPPER_OBJECT(node, struct peer_data, table_node);
  2436. return peer;
  2437. }
  2438. void multicast_table_add_entry (struct peer_group_entry *group_entry)
  2439. {
  2440. // key is 23 network byte order least-significant bits of group address
  2441. uint32_t sig = hton32(ntoh32(group_entry->group)&0x7FFFFF);
  2442. // lookup entry in multicast table
  2443. struct multicast_table_entry *multicast_entry;
  2444. HashTableNode *table_node;
  2445. if (HashTable_Lookup(&multicast_table, &sig, &table_node)) {
  2446. multicast_entry = UPPER_OBJECT(table_node, struct multicast_table_entry, table_node);
  2447. } else {
  2448. // grab entry from free multicast entries list
  2449. LinkedList2Node *free_list_node = LinkedList2_GetFirst(&multicast_entries_free);
  2450. ASSERT(free_list_node) // there are as many multicast entries as maximum number of groups
  2451. multicast_entry = UPPER_OBJECT(free_list_node, struct multicast_table_entry, free_list_node);
  2452. LinkedList2_Remove(&multicast_entries_free, &multicast_entry->free_list_node);
  2453. // set key
  2454. multicast_entry->sig = sig;
  2455. // insert into hash table
  2456. ASSERT_EXECUTE(HashTable_Insert(&multicast_table, &multicast_entry->table_node))
  2457. // init list of group entries
  2458. LinkedList2_Init(&multicast_entry->group_entries);
  2459. }
  2460. // add to list of group entries
  2461. LinkedList2_Append(&multicast_entry->group_entries, &group_entry->multicast_list_node);
  2462. // write multicast entry pointer to group entry for fast removal of groups
  2463. group_entry->multicast_entry = multicast_entry;
  2464. }
  2465. void multicast_table_remove_entry (struct peer_group_entry *group_entry)
  2466. {
  2467. struct multicast_table_entry *multicast_entry = group_entry->multicast_entry;
  2468. // remove group entry from linked list in multicast entry
  2469. LinkedList2_Remove(&multicast_entry->group_entries, &group_entry->multicast_list_node);
  2470. // if the multicast entry has no more group entries, remove it from the hash table
  2471. if (LinkedList2_IsEmpty(&multicast_entry->group_entries)) {
  2472. // remove from multicast table
  2473. ASSERT_EXECUTE(HashTable_Remove(&multicast_table, &multicast_entry->sig))
  2474. // add to free list
  2475. LinkedList2_Append(&multicast_entries_free, &multicast_entry->free_list_node);
  2476. }
  2477. }
  2478. int peer_groups_table_key_comparator (uint32_t *group1, uint32_t *group2)
  2479. {
  2480. return (*group1 == *group2);
  2481. }
  2482. int peer_groups_table_hash_function (uint32_t *group, int modulo)
  2483. {
  2484. return (jenkins_lookup2_hash((uint8_t *)group, sizeof(*group), 0) % modulo);
  2485. }
  2486. int mac_table_key_comparator (uint8_t *mac1, uint8_t *mac2)
  2487. {
  2488. return (memcmp(mac1, mac2, 6) == 0);
  2489. }
  2490. int mac_table_hash_function (uint8_t *mac, int modulo)
  2491. {
  2492. return (jenkins_lookup2_hash(mac, 6, mac_table_initval) % modulo);
  2493. }
  2494. int multicast_table_key_comparator (uint32_t *sig1, uint32_t *sig2)
  2495. {
  2496. return (*sig1 == *sig2);
  2497. }
  2498. int multicast_table_hash_function (uint32_t *sig, int modulo)
  2499. {
  2500. return (jenkins_lookup2_hash((uint8_t *)sig, sizeof(*sig), multicast_table_initval) % modulo);
  2501. }
  2502. int peers_by_id_key_comparator (peerid_t *id1, peerid_t *id2)
  2503. {
  2504. return (*id1 == *id2);
  2505. }
  2506. int peers_by_id_hash_function (peerid_t *id, int modulo)
  2507. {
  2508. return (jenkins_lookup2_hash((uint8_t *)id, sizeof(*id), peers_by_id_initval) % modulo);
  2509. }
  2510. void device_error_handler (void *unused)
  2511. {
  2512. BLog(BLOG_ERROR, "device error");
  2513. terminate();
  2514. return;
  2515. }
  2516. void device_input_handler_send (void *unused, uint8_t *data, int data_len)
  2517. {
  2518. ASSERT(data_len >= 0)
  2519. ASSERT(data_len <= device.mtu)
  2520. // accept packet
  2521. PacketPassInterface_Done(&device.input_interface);
  2522. const uint8_t broadcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  2523. const uint8_t multicast_header[] = {0x01, 0x00, 0x5e};
  2524. if (data_len < sizeof(struct ethernet_header)) {
  2525. BLog(BLOG_INFO, "device: frame too small (%d)", data_len);
  2526. return;
  2527. }
  2528. struct ethernet_header *header = (struct ethernet_header *)data;
  2529. // invoke outgoing hook
  2530. int hook_result = hook_outgoing(data, data_len);
  2531. switch (hook_result) {
  2532. case HOOK_OUT_DEFAULT:
  2533. // is it multicast?
  2534. if (!memcmp(header->dest, multicast_header, 3)) {
  2535. // obtain multicast group bits from MAC address
  2536. uint32_t sig;
  2537. memcpy(&sig, &header->dest[2], 4);
  2538. sig = hton32(ntoh32(sig)&0x7FFFFF);
  2539. // lookup multicast entry
  2540. HashTableNode *multicast_table_node;
  2541. if (HashTable_Lookup(&multicast_table, &sig, &multicast_table_node)) {
  2542. struct multicast_table_entry *multicast_entry = UPPER_OBJECT(multicast_table_node, struct multicast_table_entry, table_node);
  2543. // send to all peers with groups matching the known bits of the group address
  2544. LinkedList2Iterator it;
  2545. LinkedList2Iterator_InitForward(&it, &multicast_entry->group_entries);
  2546. LinkedList2Node *group_entries_list_node;
  2547. while (group_entries_list_node = LinkedList2Iterator_Next(&it)) {
  2548. struct peer_group_entry *group_entry = UPPER_OBJECT(group_entries_list_node, struct peer_group_entry, multicast_list_node);
  2549. submit_frame_to_peer(group_entry->peer, data, data_len);
  2550. }
  2551. }
  2552. } else {
  2553. // should we flood it?
  2554. HashTableNode *mac_table_node;
  2555. if (!memcmp(header->dest, broadcast_mac, 6) || !HashTable_Lookup(&mac_table, header->dest, &mac_table_node)) {
  2556. flood_frame(data, data_len);
  2557. }
  2558. // unicast it
  2559. else {
  2560. struct mac_table_entry *mac_entry = UPPER_OBJECT(mac_table_node, struct mac_table_entry, table_node);
  2561. submit_frame_to_peer(mac_entry->peer, data, data_len);
  2562. }
  2563. }
  2564. break;
  2565. case HOOK_OUT_FLOOD:
  2566. flood_frame(data, data_len);
  2567. break;
  2568. default:
  2569. ASSERT(0);
  2570. }
  2571. }
  2572. void submit_frame_to_peer (struct peer_data *peer, uint8_t *data, int data_len)
  2573. {
  2574. ASSERT(data_len >= 0)
  2575. ASSERT(data_len <= device.mtu)
  2576. DataProtoLocalSource_SubmitFrame(&peer->local_dpflow, data, data_len);
  2577. }
  2578. void flood_frame (uint8_t *data, int data_len)
  2579. {
  2580. ASSERT(data_len >= 0)
  2581. ASSERT(data_len <= device.mtu)
  2582. LinkedList2Iterator it;
  2583. LinkedList2Iterator_InitForward(&it, &peers);
  2584. LinkedList2Node *peer_list_node;
  2585. while (peer_list_node = LinkedList2Iterator_Next(&it)) {
  2586. struct peer_data *peer = UPPER_OBJECT(peer_list_node, struct peer_data, list_node);
  2587. submit_frame_to_peer(peer, data, data_len);
  2588. }
  2589. }
  2590. int hook_outgoing (uint8_t *pos, int len)
  2591. {
  2592. ASSERT(len >= sizeof(struct ethernet_header))
  2593. struct ethernet_header *eth_header = (struct ethernet_header *)pos;
  2594. pos += sizeof(struct ethernet_header);
  2595. len -= sizeof(struct ethernet_header);
  2596. switch (ntoh16(eth_header->type)) {
  2597. case ETHERTYPE_IPV4: {
  2598. struct ipv4_header *ipv4_header;
  2599. if (!check_ipv4_packet(pos, len, &ipv4_header, &pos, &len)) {
  2600. BLog(BLOG_INFO, "hook outgoing: wrong IP packet");
  2601. goto out;
  2602. }
  2603. if (ipv4_header->protocol != IPV4_PROTOCOL_IGMP) {
  2604. goto out;
  2605. }
  2606. if (len < sizeof(struct igmp_base)) {
  2607. BLog(BLOG_INFO, "hook outgoing: IGMP: short packet");
  2608. goto out;
  2609. }
  2610. struct igmp_base *igmp_base = (struct igmp_base *)pos;
  2611. pos += sizeof(struct igmp_base);
  2612. len -= sizeof(struct igmp_base);
  2613. switch (igmp_base->type) {
  2614. case IGMP_TYPE_MEMBERSHIP_QUERY: {
  2615. if (len == sizeof(struct igmp_v2_extra) && igmp_base->max_resp_code != 0) {
  2616. // V2 query
  2617. struct igmp_v2_extra *query = (struct igmp_v2_extra *)pos;
  2618. pos += sizeof(struct igmp_v2_extra);
  2619. len -= sizeof(struct igmp_v2_extra);
  2620. if (ntoh32(query->group) != 0) {
  2621. // got a Group Specific Query, lower group timers to LMQT
  2622. lower_group_timers_to_lmqt(query->group);
  2623. }
  2624. }
  2625. else if (len >= sizeof(struct igmp_v3_query_extra)) {
  2626. // V3 query
  2627. struct igmp_v3_query_extra *query = (struct igmp_v3_query_extra *)pos;
  2628. pos += sizeof(struct igmp_v3_query_extra);
  2629. len -= sizeof(struct igmp_v3_query_extra);
  2630. uint16_t num_sources = ntoh16(query->number_of_sources);
  2631. int i;
  2632. for (i = 0; i < num_sources; i++) {
  2633. if (len < sizeof(struct igmp_source)) {
  2634. BLog(BLOG_NOTICE, "hook outgoing: IGMP: short source");
  2635. goto out_igmp;
  2636. }
  2637. pos += sizeof(struct igmp_source);
  2638. len -= sizeof(struct igmp_source);
  2639. }
  2640. if (i < num_sources) {
  2641. BLog(BLOG_NOTICE, "hook outgoing: IGMP: not all sources present");
  2642. goto out_igmp;
  2643. }
  2644. if (ntoh32(query->group) != 0 && num_sources == 0) {
  2645. // got a Group Specific Query, lower group timers to LMQT
  2646. lower_group_timers_to_lmqt(query->group);
  2647. }
  2648. }
  2649. } break;
  2650. }
  2651. out_igmp:
  2652. // flood IGMP frames to allow all peers to learn group membership
  2653. return HOOK_OUT_FLOOD;
  2654. } break;
  2655. }
  2656. out:
  2657. return HOOK_OUT_DEFAULT;
  2658. }
  2659. void peer_hook_incoming (struct peer_data *peer, uint8_t *pos, int len)
  2660. {
  2661. ASSERT(len >= sizeof(struct ethernet_header))
  2662. struct ethernet_header *eth_header = (struct ethernet_header *)pos;
  2663. pos += sizeof(struct ethernet_header);
  2664. len -= sizeof(struct ethernet_header);
  2665. switch (ntoh16(eth_header->type)) {
  2666. case ETHERTYPE_IPV4: {
  2667. struct ipv4_header *ipv4_header;
  2668. if (!check_ipv4_packet(pos, len, &ipv4_header, &pos, &len)) {
  2669. BLog(BLOG_INFO, "hook incoming: wrong IP packet");
  2670. goto out;
  2671. }
  2672. if (ipv4_header->protocol != IPV4_PROTOCOL_IGMP) {
  2673. goto out;
  2674. }
  2675. if (len < sizeof(struct igmp_base)) {
  2676. BLog(BLOG_INFO, "hook incoming: IGMP: short");
  2677. goto out;
  2678. }
  2679. struct igmp_base *igmp_base = (struct igmp_base *)pos;
  2680. pos += sizeof(struct igmp_base);
  2681. len -= sizeof(struct igmp_base);
  2682. switch (igmp_base->type) {
  2683. case IGMP_TYPE_V2_MEMBERSHIP_REPORT: {
  2684. if (len < sizeof(struct igmp_v2_extra)) {
  2685. BLog(BLOG_INFO, "hook incoming: IGMP: short v2 report");
  2686. goto out;
  2687. }
  2688. struct igmp_v2_extra *report = (struct igmp_v2_extra *)pos;
  2689. pos += sizeof(struct igmp_v2_extra);
  2690. len -= sizeof(struct igmp_v2_extra);
  2691. peer_join_group(peer, report->group);
  2692. } break;
  2693. case IGMP_TYPE_V3_MEMBERSHIP_REPORT: {
  2694. if (len < sizeof(struct igmp_v3_report_extra)) {
  2695. BLog(BLOG_INFO, "hook incoming: IGMP: short v3 report");
  2696. goto out;
  2697. }
  2698. struct igmp_v3_report_extra *report = (struct igmp_v3_report_extra *)pos;
  2699. pos += sizeof(struct igmp_v3_report_extra);
  2700. len -= sizeof(struct igmp_v3_report_extra);
  2701. uint16_t num_records = ntoh16(report->number_of_group_records);
  2702. int i;
  2703. for (i = 0; i < num_records; i++) {
  2704. if (len < sizeof(struct igmp_v3_report_record)) {
  2705. BLog(BLOG_INFO, "hook incoming: IGMP: short record header");
  2706. goto out;
  2707. }
  2708. struct igmp_v3_report_record *record = (struct igmp_v3_report_record *)pos;
  2709. pos += sizeof(struct igmp_v3_report_record);
  2710. len -= sizeof(struct igmp_v3_report_record);
  2711. uint16_t num_sources = ntoh16(record->number_of_sources);
  2712. int j;
  2713. for (j = 0; j < num_sources; j++) {
  2714. if (len < sizeof(struct igmp_source)) {
  2715. BLog(BLOG_INFO, "hook incoming: IGMP: short source");
  2716. goto out;
  2717. }
  2718. struct igmp_source *source = (struct igmp_source *)pos;
  2719. pos += sizeof(struct igmp_source);
  2720. len -= sizeof(struct igmp_source);
  2721. }
  2722. if (j < num_sources) {
  2723. goto out;
  2724. }
  2725. uint16_t aux_len = ntoh16(record->aux_data_len);
  2726. if (len < aux_len) {
  2727. BLog(BLOG_INFO, "hook incoming: IGMP: short record aux data");
  2728. goto out;
  2729. }
  2730. pos += aux_len;
  2731. len -= aux_len;
  2732. switch (record->type) {
  2733. case IGMP_RECORD_TYPE_MODE_IS_INCLUDE:
  2734. case IGMP_RECORD_TYPE_CHANGE_TO_INCLUDE_MODE:
  2735. if (num_sources != 0) {
  2736. peer_join_group(peer, record->group);
  2737. }
  2738. break;
  2739. case IGMP_RECORD_TYPE_MODE_IS_EXCLUDE:
  2740. case IGMP_RECORD_TYPE_CHANGE_TO_EXCLUDE_MODE:
  2741. peer_join_group(peer, record->group);
  2742. break;
  2743. }
  2744. }
  2745. if (i < num_records) {
  2746. BLog(BLOG_INFO, "hook incoming: IGMP: not all records present");
  2747. }
  2748. } break;
  2749. }
  2750. } break;
  2751. }
  2752. out:;
  2753. }
  2754. void lower_group_timers_to_lmqt (uint32_t group)
  2755. {
  2756. // lookup the group in every peer's group entries hash table
  2757. LinkedList2Iterator it;
  2758. LinkedList2Iterator_InitForward(&it, &peers);
  2759. LinkedList2Node *peer_list_node;
  2760. while (peer_list_node = LinkedList2Iterator_Next(&it)) {
  2761. struct peer_data *peer = UPPER_OBJECT(peer_list_node, struct peer_data, list_node);
  2762. HashTableNode *groups_table_node;
  2763. if (HashTable_Lookup(&peer->groups_hashtable, &group, &groups_table_node)) {
  2764. struct peer_group_entry *group_entry = UPPER_OBJECT(groups_table_node, struct peer_group_entry, table_node);
  2765. ASSERT(group_entry->peer == peer)
  2766. btime_t now = btime_gettime();
  2767. if (group_entry->timer_endtime > now + IGMP_LAST_MEMBER_QUERY_TIME) {
  2768. group_entry->timer_endtime = now + IGMP_LAST_MEMBER_QUERY_TIME;
  2769. BReactor_SetTimerAbsolute(&ss, &group_entry->timer, group_entry->timer_endtime);
  2770. }
  2771. }
  2772. }
  2773. }
  2774. int check_ipv4_packet (uint8_t *data, int data_len, struct ipv4_header **out_header, uint8_t **out_payload, int *out_payload_len)
  2775. {
  2776. // check base header
  2777. if (data_len < sizeof(struct ipv4_header)) {
  2778. BLog(BLOG_DEBUG, "check ipv4: packet too short (base header)");
  2779. return 0;
  2780. }
  2781. struct ipv4_header *header = (struct ipv4_header *)data;
  2782. // check version
  2783. if (IPV4_GET_VERSION(*header) != 4) {
  2784. BLog(BLOG_DEBUG, "check ipv4: version not 4");
  2785. return 0;
  2786. }
  2787. // check options
  2788. int header_len = IPV4_GET_IHL(*header) * 4;
  2789. if (header_len < sizeof(struct ipv4_header)) {
  2790. BLog(BLOG_DEBUG, "check ipv4: ihl too small");
  2791. return 0;
  2792. }
  2793. if (header_len > data_len) {
  2794. BLog(BLOG_DEBUG, "check ipv4: packet too short for ihl");
  2795. return 0;
  2796. }
  2797. // check total length
  2798. uint16_t total_length = ntoh16(header->total_length);
  2799. if (total_length < header_len) {
  2800. BLog(BLOG_DEBUG, "check ipv4: total length too small");
  2801. return 0;
  2802. }
  2803. if (total_length > data_len) {
  2804. BLog(BLOG_DEBUG, "check ipv4: total length too large");
  2805. return 0;
  2806. }
  2807. *out_header = header;
  2808. *out_payload = data + header_len;
  2809. *out_payload_len = total_length - header_len;
  2810. return 1;
  2811. }
  2812. void assign_relays (void)
  2813. {
  2814. LinkedList2Node *list_node;
  2815. while (list_node = LinkedList2_GetFirst(&waiting_relay_peers)) {
  2816. struct peer_data *peer = UPPER_OBJECT(list_node, struct peer_data, waiting_relay_list_node);
  2817. ASSERT(peer->waiting_relay)
  2818. ASSERT(!peer->have_relaying)
  2819. ASSERT(!peer->have_link)
  2820. // get a relay
  2821. LinkedList2Node *list_node2 = LinkedList2_GetFirst(&relays);
  2822. if (!list_node2) {
  2823. BLog(BLOG_NOTICE, "no relays");
  2824. return;
  2825. }
  2826. struct peer_data *relay = UPPER_OBJECT(list_node2, struct peer_data, relay_list_node);
  2827. ASSERT(relay->is_relay)
  2828. // no longer waiting for relay
  2829. peer_unregister_need_relay(peer);
  2830. // install the relay
  2831. peer_install_relay(peer, relay);
  2832. }
  2833. }
  2834. char * address_scope_known (uint8_t *name, int name_len)
  2835. {
  2836. ASSERT(name_len >= 0)
  2837. for (int i = 0; i < options.num_scopes; i++) {
  2838. if (name_len == strlen(options.scopes[i]) && !memcmp(name, options.scopes[i], name_len)) {
  2839. return options.scopes[i];
  2840. }
  2841. }
  2842. return NULL;
  2843. }
  2844. void server_handler_error (void *user)
  2845. {
  2846. BLog(BLOG_ERROR, "server connection failed, exiting");
  2847. terminate();
  2848. return;
  2849. }
  2850. void server_handler_ready (void *user, peerid_t param_my_id, uint32_t ext_ip)
  2851. {
  2852. ASSERT(!server_ready)
  2853. // remember our ID
  2854. my_id = param_my_id;
  2855. // store server reported addresses
  2856. for (int i = 0; i < num_bind_addrs; i++) {
  2857. POINTER(addr, bind_addrs[i]);
  2858. for (int j = 0; j < addr->num_ext_addrs; j++) {
  2859. POINTER(eaddr, addr->ext_addrs[j]);
  2860. if (eaddr->server_reported_port >= 0) {
  2861. if (ext_ip == 0) {
  2862. BLog(BLOG_ERROR, "server did not provide our address");
  2863. terminate();
  2864. return;
  2865. }
  2866. BAddr_InitIPv4(&eaddr->addr, ext_ip, hton16(eaddr->server_reported_port));
  2867. char str[BADDR_MAX_PRINT_LEN];
  2868. BAddr_Print(&eaddr->addr, str);
  2869. BLog(BLOG_INFO, "external address (%d,%d): server reported %s", i, j, str);
  2870. }
  2871. }
  2872. }
  2873. // set server ready
  2874. server_ready = 1;
  2875. BLog(BLOG_INFO, "server: ready, my ID is %d", (int)my_id);
  2876. }
  2877. void server_handler_newclient (void *user, peerid_t peer_id, int flags, const uint8_t *cert, int cert_len)
  2878. {
  2879. ASSERT(server_ready)
  2880. ASSERT(cert_len >= 0)
  2881. ASSERT(cert_len <= SCID_NEWCLIENT_MAX_CERT_LEN)
  2882. // check if the peer already exists
  2883. if (find_peer_by_id(peer_id)) {
  2884. BLog(BLOG_WARNING, "server: newclient: peer already known");
  2885. return;
  2886. }
  2887. // make sure it's not the same ID as us
  2888. if (peer_id == my_id) {
  2889. BLog(BLOG_WARNING, "server: newclient: peer has our ID");
  2890. return;
  2891. }
  2892. // check if there is spece for the peer
  2893. if (num_peers >= MAX_PEERS) {
  2894. BLog(BLOG_WARNING, "server: newclient: no space for new peer (maximum number reached)");
  2895. return;
  2896. }
  2897. if (!options.ssl && cert_len > 0) {
  2898. BLog(BLOG_WARNING, "server: newclient: certificate supplied, but not using TLS");
  2899. return;
  2900. }
  2901. peer_add(peer_id, flags, cert, cert_len);
  2902. return;
  2903. }
  2904. void server_handler_endclient (void *user, peerid_t peer_id)
  2905. {
  2906. ASSERT(server_ready)
  2907. // find peer
  2908. struct peer_data *peer = find_peer_by_id(peer_id);
  2909. if (!peer) {
  2910. BLog(BLOG_WARNING, "server: endclient: peer %d not known", (int)peer_id);
  2911. return;
  2912. }
  2913. // remove peer
  2914. peer_remove(peer);
  2915. }
  2916. void server_handler_message (void *user, peerid_t peer_id, uint8_t *data, int data_len)
  2917. {
  2918. ASSERT(server_ready)
  2919. ASSERT(data_len >= 0)
  2920. ASSERT(data_len <= SC_MAX_MSGLEN)
  2921. // find peer
  2922. struct peer_data *peer = find_peer_by_id(peer_id);
  2923. if (!peer) {
  2924. BLog(BLOG_WARNING, "server: message: peer not known");
  2925. return;
  2926. }
  2927. // process peer message
  2928. peer_msg(peer, data, data_len);
  2929. return;
  2930. }
  2931. void peer_job_send_seed_after_binding (struct peer_data *peer)
  2932. {
  2933. ASSERT(options.transport_mode == TRANSPORT_MODE_UDP)
  2934. ASSERT(SPPROTO_HAVE_OTP(sp_params))
  2935. ASSERT(peer->have_link)
  2936. ASSERT(!peer->pio.udp.sendseed_sent)
  2937. peer_udp_send_seed(peer);
  2938. return;
  2939. }