You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

netsukuku.c 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. /* This file is part of Netsukuku
  2. * (c) Copyright 2005 Andrea Lo Pumo aka AlpT <alpt@freaknet.org>
  3. *
  4. * This source code is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as published
  6. * by the Free Software Foundation; either version 2 of the License,
  7. * or (at your option) any later version.
  8. *
  9. * This source code is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. * Please refer to the GNU Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Public License along with
  15. * this source code; if not, write to:
  16. * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. *
  18. * --
  19. * netsukuku.c:
  20. * Where main() resides.
  21. */
  22. #include "includes.h"
  23. #include "common.h"
  24. #include "conf.h"
  25. #include "libnetlink.h"
  26. #include "ll_map.h"
  27. #include "request.h"
  28. #include "pkts.h"
  29. #include "if.h"
  30. #include "bmap.h"
  31. #include "netsukuku.h"
  32. #include "qspn.h"
  33. #include "accept.h"
  34. #include "daemon.h"
  35. #include "crypto.h"
  36. #include "andna_cache.h"
  37. #include "andna.h"
  38. #include "radar.h"
  39. #include "hook.h"
  40. #include "rehook.h"
  41. extern int errno;
  42. extern char *optarg;
  43. extern int optind, opterr, optopt;
  44. int destroy_netsukuku_mutex;
  45. int pid_saved;
  46. int options_parsed=0; /* How many times parse_options() has been called */
  47. void save_pid(void)
  48. {
  49. FILE *fd;
  50. if(!(fd=fopen(server_opt.pid_file, "w")))
  51. error("Couldn't create pid file \"%s\": %s",
  52. server_opt.pid_file, strerror(errno));
  53. fprintf(fd, "ntkd %ld\n", (long) getpid());
  54. fclose(fd);
  55. pid_saved=1;
  56. }
  57. /*
  58. * is_ntkd_already_running
  59. *
  60. * Returns 1 if there's already a ntkd running
  61. */
  62. int is_ntkd_already_running(void)
  63. {
  64. pid_t oldpid;
  65. FILE *fd;
  66. if(!(fd=fopen(server_opt.pid_file, "r"))) {
  67. if(errno != ENOENT)
  68. error("Cannot read pid file \"%s\": %s",
  69. server_opt.pid_file, strerror(errno));
  70. return 0;
  71. }
  72. fscanf(fd, "ntkd %d\n", &oldpid);
  73. if(ferror(fd)) {
  74. error("error reading pid file \"%s\": %s\n",
  75. server_opt.pid_file, strerror(errno));
  76. fclose(fd);
  77. return 0;
  78. }
  79. fclose(fd);
  80. return !kill(oldpid, 0);
  81. }
  82. int ntk_load_maps(void)
  83. {
  84. if(file_exist(server_opt.int_map_file) &&
  85. (me.int_map=load_map(server_opt.int_map_file,
  86. &me.cur_node)))
  87. debug(DBG_NORMAL, "Internal map loaded");
  88. else
  89. me.int_map=init_map(0);
  90. #if 0
  91. /* Don't load the bnode map, it's useless */
  92. if((me.bnode_map=load_bmap(server_opt.bnode_map_file, me.ext_map,
  93. FAMILY_LVLS, &me.bmap_nodes))) {
  94. debug(DBG_NORMAL, "Bnode map loaded");
  95. } else
  96. #endif
  97. bmap_levels_init(BMAP_LEVELS(FAMILY_LVLS), &me.bnode_map,
  98. &me.bmap_nodes);
  99. bmap_counter_init(BMAP_LEVELS(FAMILY_LVLS), &me.bmap_nodes_closed,
  100. &me.bmap_nodes_opened);
  101. if(file_exist(server_opt.ext_map_file) &&
  102. (me.ext_map=load_extmap(server_opt.ext_map_file,
  103. &me.cur_quadg)))
  104. debug(DBG_NORMAL, "External map loaded");
  105. else
  106. me.ext_map=init_extmap(FAMILY_LVLS, 0);
  107. return 0;
  108. }
  109. int ntk_save_maps(void)
  110. {
  111. debug(DBG_NORMAL, "Saving the internal map");
  112. save_map(me.int_map, me.cur_node, server_opt.int_map_file);
  113. #ifdef DEBUG
  114. debug(DBG_NORMAL, "Saving the border nodes map");
  115. save_bmap(me.bnode_map, me.bmap_nodes, me.ext_map, me.cur_quadg,
  116. server_opt.bnode_map_file);
  117. #endif
  118. debug(DBG_NORMAL, "Saving the external map");
  119. save_extmap(me.ext_map, MAXGROUPNODE, &me.cur_quadg,
  120. server_opt.ext_map_file);
  121. return 0;
  122. }
  123. int ntk_free_maps(void)
  124. {
  125. bmap_levels_free(me.bnode_map, me.bmap_nodes);
  126. bmap_counter_free(me.bmap_nodes_closed, me.bmap_nodes_opened);
  127. free_extmap(me.ext_map, FAMILY_LVLS, 0);
  128. free_map(me.int_map, 0);
  129. return 0;
  130. }
  131. void usage(void)
  132. {
  133. printf("Usage:\n"
  134. " ntkd [-hvaldrRD46] [-i net_interface] [-c conf_file] [-l logfile]\n\n"
  135. " -4 ipv4\n"
  136. " -6 ipv6\n"
  137. " -i Specify the interface after this\n\n"
  138. " -a Prevents running the ANDNA daemon\n"
  139. " -R Prevents editting /etc/resolv.conf\n"
  140. " -D Prevents running as daemon (Does not fork to the background)\n"
  141. "\n"
  142. " -r Runs in restricted mode\n"
  143. " -I Share your internet connection with other nodes\n"
  144. "\n"
  145. " -c configuration file\n"
  146. " -l Enables logging to file\n"
  147. "\n"
  148. " -d Debug (Add more ds to get more info)\n"
  149. " -h Shows this help\n"
  150. " -v Shows the version you are using\n"
  151. " -k Kills the running instance of ntkd\n"
  152. " -e Excludes an interface from usage I.E all interfaces except this one\n");
  153. }
  154. /*
  155. * fill_default_options: fills the default values in the server_opt struct
  156. */
  157. void fill_default_options(void)
  158. {
  159. setzero(&server_opt, sizeof(server_opt));
  160. server_opt.family=AF_INET;
  161. server_opt.config_file=NTK_CONFIG_FILE;
  162. server_opt.pid_file=NTK_PID_FILE;
  163. server_opt.int_map_file=INT_MAP_FILE;
  164. server_opt.ext_map_file=EXT_MAP_FILE;
  165. server_opt.bnode_map_file=BNODE_MAP_FILE;
  166. server_opt.andna_hnames_file=ANDNA_HNAMES_FILE;
  167. server_opt.snsd_nodes_file=SNSD_NODES_FILE;
  168. server_opt.andna_cache_file=ANDNA_CACHE_FILE;
  169. server_opt.lclkey_file=LCLKEY_FILE;
  170. server_opt.lcl_file=LCL_FILE;
  171. server_opt.rhc_file=RHC_FILE;
  172. server_opt.counter_c_file=COUNTER_C_FILE;
  173. server_opt.daemon=1;
  174. server_opt.dbg_lvl=0;
  175. server_opt.disable_andna=0;
  176. server_opt.disable_resolvconf=0;
  177. server_opt.restricted=0;
  178. server_opt.restricted_class=0;
  179. server_opt.use_shared_inet=1;
  180. server_opt.ip_masq_script=IPMASQ_SCRIPT_FILE;
  181. server_opt.tc_shaper_script=TCSHAPER_SCRIPT_FILE;
  182. server_opt.max_connections=MAX_CONNECTIONS;
  183. server_opt.max_accepts_per_host=MAX_ACCEPTS;
  184. server_opt.max_accepts_per_host_time=FREE_ACCEPT_TIME;
  185. }
  186. /*
  187. * fill_loaded_cfg_options
  188. *
  189. * stores in server_opt the options loaded from the configuration file
  190. */
  191. void fill_loaded_cfg_options(void)
  192. {
  193. char *value;
  194. CONF_GET_STRN_VALUE ( CONF_NTK_INT_MAP_FILE, &server_opt.int_map_file, NAME_MAX-1 );
  195. CONF_GET_STRN_VALUE ( CONF_NTK_BNODE_MAP_FILE, &server_opt.bnode_map_file, NAME_MAX-1 );
  196. CONF_GET_STRN_VALUE ( CONF_NTK_EXT_MAP_FILE, &server_opt.ext_map_file, NAME_MAX-1 );
  197. CONF_GET_STRN_VALUE ( CONF_ANDNA_HNAMES_FILE, &server_opt.andna_hnames_file, NAME_MAX-1 );
  198. CONF_GET_STRN_VALUE ( CONF_SNSD_NODES_FILE, &server_opt.snsd_nodes_file, NAME_MAX-1 );
  199. CONF_GET_STRN_VALUE ( CONF_ANDNA_CACHE_FILE, &server_opt.andna_cache_file, NAME_MAX-1 );
  200. CONF_GET_STRN_VALUE ( CONF_ANDNA_LCLKEY_FILE, &server_opt.lclkey_file, NAME_MAX-1 );
  201. CONF_GET_STRN_VALUE ( CONF_ANDNA_LCL_FILE, &server_opt.lcl_file, NAME_MAX-1 );
  202. CONF_GET_STRN_VALUE ( CONF_ANDNA_RHC_FILE, &server_opt.rhc_file, NAME_MAX-1 );
  203. CONF_GET_STRN_VALUE ( CONF_ANDNA_COUNTER_C_FILE, &server_opt.counter_c_file, NAME_MAX-1 );
  204. CONF_GET_STRN_VALUE ( CONF_NTK_PID_FILE, &server_opt.pid_file, NAME_MAX-1 );
  205. CONF_GET_INT_VALUE ( CONF_NTK_MAX_CONNECTIONS, server_opt.max_connections );
  206. CONF_GET_INT_VALUE ( CONF_NTK_MAX_ACCEPTS_PER_HOST, server_opt.max_accepts_per_host );
  207. CONF_GET_INT_VALUE ( CONF_NTK_MAX_ACCEPTS_PER_HOST_TIME, server_opt.max_accepts_per_host_time );
  208. CONF_GET_INT_VALUE ( CONF_DISABLE_ANDNA, server_opt.disable_andna );
  209. CONF_GET_INT_VALUE ( CONF_DISABLE_RESOLVCONF, server_opt.disable_resolvconf );
  210. CONF_GET_INT_VALUE ( CONF_NTK_RESTRICTED_MODE, server_opt.restricted );
  211. CONF_GET_INT_VALUE ( CONF_NTK_RESTRICTED_CLASS, server_opt.restricted_class );
  212. CONF_GET_INT_VALUE ( CONF_NTK_INTERNET_CONNECTION, server_opt.inet_connection);
  213. if((value=CONF_GET_VALUE(CONF_NTK_INTERNET_GW))) {
  214. if(str_to_inet_gw(value, &server_opt.inet_gw,
  215. &server_opt.inet_gw_dev))
  216. fatal("Malformed `%s' option: \"%s\". Its syntax is \"IP:dev\"",
  217. config_str[CONF_NTK_INTERNET_GW], value);
  218. }
  219. CONF_GET_INT_VALUE ( CONF_NTK_INTERNET_UPLOAD, server_opt.my_upload_bw );
  220. CONF_GET_INT_VALUE ( CONF_NTK_INTERNET_DOWNLOAD, server_opt.my_dnload_bw );
  221. if(server_opt.my_upload_bw && server_opt.my_dnload_bw)
  222. me.my_bandwidth =
  223. bandwidth_in_8bit((server_opt.my_upload_bw+server_opt.my_dnload_bw)/2);
  224. if((value=CONF_GET_VALUE(CONF_NTK_INTERNET_PING_HOSTS))) {
  225. server_opt.inet_hosts=parse_internet_hosts(value,
  226. &server_opt.inet_hosts_counter);
  227. if(!server_opt.inet_hosts)
  228. fatal("Malformed `%s' option: \"%s\". "
  229. "Its syntax is host1:host2:...",
  230. config_str[CONF_NTK_INTERNET_PING_HOSTS], value);
  231. }
  232. CONF_GET_INT_VALUE ( CONF_SHARE_INTERNET, server_opt.share_internet );
  233. CONF_GET_INT_VALUE ( CONF_SHAPE_INTERNET, server_opt.shape_internet );
  234. CONF_GET_INT_VALUE ( CONF_USE_SHARED_INET, server_opt.use_shared_inet );
  235. CONF_GET_STRN_VALUE ( CONF_NTK_IP_MASQ_SCRIPT, &server_opt.ip_masq_script, NAME_MAX-1 );
  236. CONF_GET_STRN_VALUE ( CONF_NTK_TC_SHAPER_SCRIPT, &server_opt.tc_shaper_script, NAME_MAX-1 );
  237. /* Clean the enviroment */
  238. clear_config_env();
  239. }
  240. void free_server_opt(void)
  241. {
  242. int i;
  243. if(server_opt.config_file != NTK_CONFIG_FILE)
  244. xfree(server_opt.config_file);
  245. if(server_opt.pid_file != NTK_PID_FILE)
  246. xfree(server_opt.pid_file);
  247. if(server_opt.int_map_file != INT_MAP_FILE)
  248. xfree(server_opt.int_map_file);
  249. if(server_opt.ext_map_file != EXT_MAP_FILE)
  250. xfree(server_opt.ext_map_file);
  251. if(server_opt.bnode_map_file != BNODE_MAP_FILE)
  252. xfree(server_opt.bnode_map_file);
  253. if(server_opt.andna_hnames_file != ANDNA_HNAMES_FILE)
  254. xfree(server_opt.andna_hnames_file);
  255. if(server_opt.snsd_nodes_file != SNSD_NODES_FILE)
  256. xfree(server_opt.snsd_nodes_file);
  257. if(server_opt.andna_cache_file != ANDNA_CACHE_FILE)
  258. xfree(server_opt.andna_cache_file);
  259. if(server_opt.lclkey_file != LCLKEY_FILE)
  260. xfree(server_opt.lclkey_file);
  261. if(server_opt.lcl_file != LCL_FILE)
  262. xfree(server_opt.lcl_file);
  263. if(server_opt.rhc_file != RHC_FILE)
  264. xfree(server_opt.rhc_file);
  265. if(server_opt.counter_c_file != COUNTER_C_FILE)
  266. xfree(server_opt.counter_c_file);
  267. if(server_opt.ip_masq_script != IPMASQ_SCRIPT_FILE)
  268. xfree(server_opt.ip_masq_script);
  269. if(server_opt.tc_shaper_script != TCSHAPER_SCRIPT_FILE)
  270. xfree(server_opt.tc_shaper_script);
  271. if(server_opt.inet_gw_dev)
  272. xfree(server_opt.inet_gw_dev);
  273. for(i=0; i<MAX_INTERFACES && server_opt.ifs[i]; i++)
  274. xfree(server_opt.ifs[i]);
  275. }
  276. void exclude_interface(void) {
  277. char *ifs = "null1";
  278. char *old_tmp = "null2";
  279. struct ifaddrs *addrs,*tmp;
  280. struct ifreq *a_ifs;
  281. getifaddrs(&addrs);
  282. tmp = addrs;
  283. while(tmp) {
  284. old_tmp = ifs;
  285. if(tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_PACKET)
  286. ifs = tmp->ifa_name;
  287. if(strncmp(ifs, "lo", 2) == 0 || strncmp(ifs, "tunl0", 5) == 0 || strncmp(ifs, "tunl1", 5) == 0 || strcmp(ifs, optarg) == 0)
  288. goto Check_Active;
  289. Check_Active:
  290. a_ifs = ifs;
  291. if(a_ifs->ifr_name != IFF_UP) {
  292. tmp = tmp->ifa_next;
  293. if(tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_PACKET)
  294. ifs = tmp->ifa_name;
  295. }
  296. tmp = tmp->ifa_next;
  297. if(strcmp(old_tmp, ifs) == 0)
  298. break;
  299. server_opt.ifs[server_opt.ifs_n++]=xstrndup(ifs, IFNAMSIZ-1);
  300. }
  301. freeifaddrs(addrs);
  302. }
  303. void parse_options(int argc, char **argv)
  304. {
  305. int c, saved_argc=argc;
  306. optind=0;
  307. while (1) {
  308. int option_index = 0;
  309. static struct option long_options[] = {
  310. {"help", 0, 0, 'h'},
  311. {"iface", 1, 0, 'i'},
  312. {"ipv6", 0, 0, '6'},
  313. {"ipv4", 0, 0, '4'},
  314. {"conf", 1, 0, 'c'},
  315. {"logfile", 1, 0, 'l'},
  316. {"no_andna", 0, 0, 'a'},
  317. {"no_daemon", 0, 0, 'D'},
  318. {"no_resolv", 0, 0, 'R'},
  319. {"restricted", 0, 0, 'r'},
  320. {"share-inet", 0, 0, 'I'},
  321. {"debug", 0, 0, 'd'},
  322. {"version", 0, 0, 'v'},
  323. {"kill", 0, 0, 'k'},
  324. {"exclude", 1, 0, 'e'},
  325. {0, 0, 0, 0}
  326. };
  327. c = getopt_long (argc, argv,"i:c:l:e:hvd64DRrIak", long_options,
  328. &option_index);
  329. if (c == -1)
  330. break;
  331. switch(c)
  332. {
  333. case 'v':
  334. printf("%s\n",VERSION_STR);
  335. exit(0);
  336. break;
  337. case 'e':
  338. exclude_interface();
  339. break;
  340. case 'k':
  341. if(is_ntkd_already_running() == 1){
  342. char process_name[256] = {0};
  343. pid_t pid;
  344. printf("...Closing ntkd...\n");
  345. FILE *fd=fopen(server_opt.pid_file, "r");
  346. while(fscanf(fd, "%s %d", process_name, &pid)!=EOF) {
  347. if(strcmp(process_name, "ntkd") == 0) {
  348. kill(pid, SIGINT);
  349. }
  350. }
  351. fclose(fd);
  352. exit(0);
  353. }
  354. else if(is_ntkd_already_running() == 0) {
  355. printf("ntkd is not running\n ...Exiting...\n");
  356. exit(0);
  357. }
  358. break;
  359. case 'h':
  360. usage();
  361. exit(0);
  362. break;
  363. case '4':
  364. server_opt.family=AF_INET;
  365. break;
  366. case '6':
  367. #ifdef IPV6_DISABLED
  368. fatal("The ipv6 is still not supported");
  369. #endif
  370. loginfo("WARNING: The ipv6 support is still experimental and under "
  371. "development, nothing is assured to work.");
  372. server_opt.family=AF_INET6;
  373. break;
  374. case 'c':
  375. server_opt.config_file=xstrndup(optarg, NAME_MAX-1);
  376. break;
  377. case 'l':
  378. if(log_to_file(optarg) < 0)
  379. fatal(0);
  380. break;
  381. case 'i':
  382. if(server_opt.ifs_n+1 >= MAX_INTERFACES)
  383. fatal("The maximum number of interfaces is %d",
  384. MAX_INTERFACES);
  385. server_opt.ifs[server_opt.ifs_n++]=xstrndup(optarg, IFNAMSIZ-1);
  386. break;
  387. case 'D':
  388. server_opt.daemon=0;
  389. break;
  390. case 'a':
  391. server_opt.disable_andna=1;
  392. break;
  393. case 'R':
  394. server_opt.disable_resolvconf=1;
  395. break;
  396. case 'r':
  397. server_opt.restricted=1;
  398. /***
  399. * This is a very dirty hack, but it handles
  400. * the optional argument better than getopt.
  401. *
  402. * This is the problem:
  403. * ntkd -abcrdefg
  404. * If 'r' is an element that specifies an
  405. * optional argument, then the "defg" string
  406. * is taken as its arg, but this is not what
  407. * we want because in this case '-r' is
  408. * specified without its argument.
  409. *
  410. * So, what we do is checking if the argv
  411. * next to the arg of 'r' begins with a '-'
  412. * or not. If not, it is the option of '-r'
  413. *
  414. * The only thing that won't work is:
  415. * ntkd -rOPTION
  416. * it has to be specified in this way:
  417. * ntkd -r OPTION
  418. */
  419. if(argc > optind && argv[optind][0] != '-') {
  420. server_opt.restricted_class=atoi(argv[optind]);
  421. saved_argc--;
  422. }
  423. /**/
  424. break;
  425. case 'I':
  426. server_opt.share_internet=1;
  427. if(!server_opt.restricted) {
  428. loginfo("Share_internet=1. Assuming restricted=1");
  429. server_opt.restricted=1;
  430. }
  431. if(!server_opt.inet_connection) {
  432. loginfo("Share_internet=1. Assuming inet_connection=1");
  433. server_opt.inet_connection=1;
  434. }
  435. break;
  436. case 'd':
  437. server_opt.dbg_lvl++;
  438. break;
  439. default:
  440. usage();
  441. exit(1);
  442. break;
  443. }
  444. }
  445. if (optind < saved_argc && !options_parsed) {
  446. usage();
  447. exit(1);
  448. }
  449. options_parsed++;
  450. }
  451. void check_conflicting_options(void)
  452. {
  453. #define FATAL_NOT_SPECIFIED(str) fatal("You didn't specified the `%s' " \
  454. "option in netsukuku.conf", \
  455. (str)); \
  456. if(!server_opt.pid_file)
  457. FATAL_NOT_SPECIFIED("pid_file");
  458. if(!server_opt.inet_hosts && server_opt.restricted)
  459. FATAL_NOT_SPECIFIED("internet_ping_hosts");
  460. if(server_opt.restricted && server_opt.share_internet &&
  461. !file_exist(server_opt.ip_masq_script))
  462. fatal("ip_masquerade_script \"%s\" is inexistent",
  463. server_opt.ip_masq_script);
  464. if(server_opt.shape_internet &&
  465. !file_exist(server_opt.tc_shaper_script))
  466. fatal("tc_shaper_script \"%s\" is inexistent",
  467. server_opt.ip_masq_script);
  468. if(!server_opt.restricted && server_opt.inet_connection)
  469. fatal("inet_connection=1 but ntk_restricted_mode=0. If you "
  470. "want to be compatible with the Internet, "
  471. "set the restricted mode in the options");
  472. if(!server_opt.restricted &&
  473. (server_opt.share_internet))
  474. fatal("You want to share your Internet connection,"
  475. "but I am not running in restricted mode (-r), "
  476. "'cause I'm not sure of what you want... "
  477. "I'm aborting.");
  478. if(server_opt.share_internet && me.my_bandwidth < MIN_CONN_BANDWIDTH)
  479. fatal("You want to share your Internet connection but "
  480. "your bandwidth is just TOO small. Do not share "
  481. "it, or your connection will be saturated");
  482. if(!server_opt.inet_connection && server_opt.share_internet) {
  483. loginfo("You want to share your Internet connection,"
  484. "but `internet_connection' is set to 0."
  485. "We are assuming it is 1");
  486. server_opt.inet_connection=1;
  487. }
  488. if(server_opt.shape_internet && !server_opt.inet_connection)
  489. fatal("The Internet traffic shaping option is set, but "
  490. "the `internet_connection' is set to 0, please check "
  491. "your options.");
  492. #ifdef IPV6_DISABLED
  493. if(server_opt.inet_gw.family == AF_INET6)
  494. fatal("Ipv6 is not supported");
  495. #endif
  496. }
  497. void init_netsukuku(char **argv)
  498. {
  499. xsrand();
  500. if(geteuid())
  501. fatal("Need root privileges");
  502. destroy_netsukuku_mutex=pid_saved=0;
  503. sigterm_timestamp=sighup_timestamp=sigalrm_timestamp=0;
  504. setzero(&me, sizeof(struct current_globals));
  505. if(is_ntkd_already_running())
  506. fatal("ntkd is already running. If it is not, remove \"%s\"",
  507. server_opt.pid_file);
  508. else
  509. save_pid();
  510. my_family=server_opt.family;
  511. restricted_mode =server_opt.restricted;
  512. restricted_class=server_opt.restricted_class ? RESTRICTED_172 : RESTRICTED_10;
  513. /* Check if the DATA_DIR exists, if not create it */
  514. if(check_and_create_dir(DATA_DIR))
  515. fatal("Cannot access to the %s directory. Exiting.", DATA_DIR);
  516. /*
  517. * Device initialization
  518. */
  519. if(if_init_all(server_opt.ifs, server_opt.ifs_n,
  520. me.cur_ifs, &me.cur_ifs_n) < 0)
  521. fatal("Cannot initialize any network interfaces");
  522. /*
  523. * ANDNA init
  524. */
  525. if(!server_opt.disable_andna)
  526. andna_init();
  527. /*
  528. * Initialize the Internet gateway stuff
  529. */
  530. if(server_opt.my_upload_bw && server_opt.my_dnload_bw)
  531. me.my_bandwidth = bandwidth_in_8bit((server_opt.my_upload_bw +
  532. server_opt.my_dnload_bw)/2);
  533. init_internet_gateway_search();
  534. pkts_init(me.cur_ifs, me.cur_ifs_n, 0);
  535. qspn_init(FAMILY_LVLS);
  536. me.cur_erc=e_rnode_init(&me.cur_erc_counter);
  537. /* Radar init */
  538. rq_wait_idx_init(rq_wait_idx);
  539. first_init_radar();
  540. total_radars=0;
  541. ntk_load_maps();
  542. #if 0
  543. /* TODO: activate and test it !! */
  544. debug(DBG_NORMAL, "ACPT: Initializing the accept_tbl: \n"
  545. " max_connections: %d,\n"
  546. " max_accepts_per_host: %d,\n"
  547. " max_accept_per_host_time: %d",
  548. server_opt.max_connections,
  549. server_opt.max_accepts_per_host,
  550. server_opt.max_accepts_per_host_time);
  551. init_accept_tbl(server_opt.max_connections,
  552. server_opt.max_accepts_per_host,
  553. server_opt.max_accepts_per_host_time);
  554. #endif
  555. if(restricted_mode)
  556. loginfo("NetsukukuD is in restricted mode. "
  557. "Restricted class: %s",
  558. server_opt.restricted_class?RESTRICTED_172_STR:RESTRICTED_10_STR);
  559. hook_init();
  560. rehook_init();
  561. me.uptime=time(0);
  562. }
  563. int destroy_netsukuku(void)
  564. {
  565. if(destroy_netsukuku_mutex)
  566. return -1;
  567. destroy_netsukuku_mutex=1;
  568. unlink(server_opt.pid_file);
  569. ntk_save_maps();
  570. ntk_free_maps();
  571. if(!server_opt.disable_andna)
  572. andna_close();
  573. close_internet_gateway_search();
  574. last_close_radar();
  575. e_rnode_free(&me.cur_erc, &me.cur_erc_counter);
  576. destroy_accept_tbl();
  577. if_close_all();
  578. qspn_free();
  579. free_server_opt();
  580. return 0;
  581. }
  582. void sigterm_handler(int sig)
  583. {
  584. time_t cur_t;
  585. if(sigterm_timestamp == (cur_t=time(0)))
  586. return;
  587. sigterm_timestamp=time(0);
  588. if(!destroy_netsukuku())
  589. fatal("Termination signal caught. Dying, bye, bye");
  590. }
  591. void *reload_hostname_thread(void *null)
  592. {
  593. /*
  594. * Reload the file where the hostnames to be registered are and
  595. * register the new ones
  596. */
  597. loginfo("Reloading the andna hostnames file");
  598. load_hostnames(server_opt.andna_hnames_file, &andna_lcl, &lcl_counter);
  599. load_snsd(server_opt.snsd_nodes_file, andna_lcl);
  600. andna_update_hnames(1);
  601. return 0;
  602. }
  603. void sighup_handler(int sig)
  604. {
  605. pthread_t thread;
  606. pthread_attr_t t_attr;
  607. time_t cur_t;
  608. if(sighup_timestamp == (cur_t=time(0)))
  609. return;
  610. sighup_timestamp=time(0);
  611. pthread_attr_init(&t_attr);
  612. pthread_attr_setdetachstate(&t_attr, PTHREAD_CREATE_DETACHED);
  613. pthread_create(&thread, &t_attr, reload_hostname_thread, 0);
  614. }
  615. void *rh_cache_flush_thread(void *null)
  616. {
  617. /*
  618. * Flush the resolved hostnames cache.
  619. */
  620. loginfo("Flush the resolved hostnames cache");
  621. rh_cache_flush();
  622. return 0;
  623. }
  624. void sigalrm_handler(int sig)
  625. {
  626. pthread_t thread;
  627. pthread_attr_t t_attr;
  628. time_t cur_t;
  629. if(sigalrm_timestamp == (cur_t=time(0)))
  630. return;
  631. sigalrm_timestamp=time(0);
  632. pthread_attr_init(&t_attr);
  633. pthread_attr_setdetachstate(&t_attr, PTHREAD_CREATE_DETACHED);
  634. pthread_create(&thread, &t_attr, rh_cache_flush_thread, 0);
  635. }
  636. /*
  637. * The main flow shall never be stopped, and the sand of time will be
  638. * revealed.
  639. */
  640. int main(int argc, char **argv)
  641. {
  642. struct udp_daemon_argv ud_argv;
  643. u_short *port;
  644. pthread_t daemon_tcp_thread, daemon_udp_thread, andna_thread;
  645. pthread_t ping_igw_thread;
  646. pthread_attr_t t_attr;
  647. log_init(argv[0], 0, 1);
  648. /* Options loading... */
  649. fill_default_options();
  650. parse_options(argc, argv);
  651. /* reinit the logs using the new `dbg_lvl' value */
  652. log_init(argv[0], server_opt.dbg_lvl, 1);
  653. log_to_file(0);
  654. /* Load the option from the config file */
  655. load_config_file(server_opt.config_file);
  656. fill_loaded_cfg_options();
  657. /* If a same option was specified in the config file and in the
  658. * command line, give priority to the latter */
  659. parse_options(argc, argv);
  660. check_conflicting_options();
  661. /* Initialize the whole netsukuku source code */
  662. init_netsukuku(argv);
  663. signal(SIGALRM, sigalrm_handler);
  664. signal(SIGHUP, sighup_handler);
  665. signal(SIGINT, sigterm_handler);
  666. signal(SIGTERM, sigterm_handler);
  667. signal(SIGQUIT, sigterm_handler);
  668. /* Angelic foreground or Daemonic background ? */
  669. if(server_opt.daemon) {
  670. loginfo("Forking to background");
  671. log_init(argv[0], server_opt.dbg_lvl, 0);
  672. if(daemon(0, 0) == -1)
  673. error("Impossible to daemonize: %s.", strerror(errno));
  674. }
  675. pthread_attr_init(&t_attr);
  676. pthread_attr_setdetachstate(&t_attr, PTHREAD_CREATE_DETACHED);
  677. setzero(&ud_argv, sizeof(struct udp_daemon_argv));
  678. port=xmalloc(sizeof(u_short));
  679. /*
  680. * These are the daemons, the main threads that keeps NetsukukuD
  681. * up & running.
  682. */
  683. debug(DBG_NORMAL, "Activating all daemons");
  684. pthread_mutex_init(&udp_daemon_lock, 0);
  685. pthread_mutex_init(&tcp_daemon_lock, 0);
  686. debug(DBG_SOFT, "Evoking the netsukuku udp radar daemon.");
  687. ud_argv.port=ntk_udp_radar_port;
  688. pthread_mutex_lock(&udp_daemon_lock);
  689. pthread_create(&daemon_udp_thread, &t_attr, udp_daemon, (void *)&ud_argv);
  690. pthread_mutex_lock(&udp_daemon_lock);
  691. pthread_mutex_unlock(&udp_daemon_lock);
  692. debug(DBG_SOFT, "Evoking the netsukuku tcp daemon.");
  693. *port=ntk_tcp_port;
  694. pthread_mutex_lock(&tcp_daemon_lock);
  695. pthread_create(&daemon_tcp_thread, &t_attr, tcp_daemon, (void *)port);
  696. pthread_mutex_lock(&tcp_daemon_lock);
  697. pthread_mutex_unlock(&tcp_daemon_lock);
  698. /* Now we hook in Netsukuku */
  699. netsukuku_hook(0, 0);
  700. /*
  701. * If not disabled, start the ANDNA daemon
  702. */
  703. if(!server_opt.disable_andna)
  704. pthread_create(&andna_thread, &t_attr, andna_main, 0);
  705. xfree(port);
  706. if(restricted_mode && (server_opt.share_internet ||
  707. server_opt.use_shared_inet)) {
  708. debug(DBG_SOFT, "Evoking the Internet Gateway Pinger daemon");
  709. pthread_create(&ping_igw_thread, &t_attr,
  710. igw_monitor_igws_t, 0);
  711. }
  712. /* We use this same process for the radar_daemon. */
  713. debug(DBG_SOFT, "Evoking radar daemon.");
  714. radar_daemon(0);
  715. /* Not reached, hahaha */
  716. loginfo("Cya m8");
  717. pthread_attr_destroy(&t_attr);
  718. destroy_netsukuku();
  719. exit(0);
  720. }