blob: a498264a141bdd1e9885d9580f4c6166a59b3378 [file] [log] [blame]
akmhoque1771c412012-11-09 13:06:08 -06001#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
akmhoque59980a52012-08-09 12:36:09 -05004#include <unistd.h>
5#include <getopt.h>
6#include <sys/time.h>
akmhoquebfefef22012-09-26 10:09:34 -05007#include <sys/stat.h>
akmhoque59980a52012-08-09 12:36:09 -05008#include <assert.h>
akmhoque1771c412012-11-09 13:06:08 -06009#include <sys/types.h>
10#include <signal.h>
11#include <sys/socket.h>
12#include <sys/un.h>
13#include <fcntl.h>
14#include <sys/ioctl.h>
akmhoque95041802012-11-16 09:18:02 -060015#include <netinet/in.h>
16#include <netdb.h>
17#include <arpa/inet.h>
akmhoque1771c412012-11-09 13:06:08 -060018
akmhoque59980a52012-08-09 12:36:09 -050019#ifdef HAVE_CONFIG_H
20#include <config.h>
21#endif
akmhoquebfefef22012-09-26 10:09:34 -050022
akmhoque59980a52012-08-09 12:36:09 -050023#include <ccn/ccn.h>
24#include <ccn/uri.h>
25#include <ccn/keystore.h>
26#include <ccn/signing.h>
27#include <ccn/schedule.h>
28#include <ccn/hashtb.h>
akmhoqueb77b95f2013-02-08 12:28:47 -060029#include <ccn/sync.h>
30#include <ccn/seqwriter.h>
akmhoque184dde02013-02-14 15:53:24 -060031#include <ccn/ccn_private.h>
akmhoque59980a52012-08-09 12:36:09 -050032
33#include "nlsr.h"
34#include "nlsr_ndn.h"
akmhoque902d57e2012-08-17 09:24:38 -050035#include "nlsr_lsdb.h"
akmhoque53f64222012-09-05 13:57:51 -050036#include "utility.h"
akmhoque03004e62012-09-06 01:12:28 -050037#include "nlsr_npl.h"
38#include "nlsr_adl.h"
akmhoque3560cb62012-09-09 10:52:30 -050039#include "nlsr_npt.h"
40#include "nlsr_route.h"
akmhoqueb77b95f2013-02-08 12:28:47 -060041#include "nlsr_sync.h"
42#include "nlsr_face.h"
43#include "nlsr_fib.h"
akmhoque3560cb62012-09-09 10:52:30 -050044
45
akmhoque81c25e02012-09-10 14:50:33 -050046#define ON_ERROR_DESTROY(resval) \
47{ \
48 if ((resval) < 0) { \
49 nlsr_destroy(); \
akmhoqueffacaa82012-09-13 17:48:30 -050050 exit(1);\
akmhoque81c25e02012-09-10 14:50:33 -050051 } \
52}
53
54
55#define ON_ERROR_EXIT(resval) \
56{ \
57 if ((resval) < 0) { \
akmhoqueffacaa82012-09-13 17:48:30 -050058 exit(1); \
akmhoque81c25e02012-09-10 14:50:33 -050059 } \
60}
akmhoque59980a52012-08-09 12:36:09 -050061
62struct option longopts[] =
63{
64 { "daemon", no_argument, NULL, 'd'},
65 { "config_file", required_argument, NULL, 'f'},
akmhoque95041802012-11-16 09:18:02 -060066 { "api_port", required_argument, NULL, 'p'},
akmhoque59980a52012-08-09 12:36:09 -050067 { "help", no_argument, NULL, 'h'},
68 { 0 }
69};
70
71static int
72usage(char *progname)
73{
74
75 printf("Usage: %s [OPTIONS...]\n\
76 NDN routing....\n\
77 -d, --daemon Run in daemon mode\n\
78 -f, --config_file Specify configuration file name\n\
akmhoque95041802012-11-16 09:18:02 -060079 -p, --api_port port where api client will connect\n\
akmhoque59980a52012-08-09 12:36:09 -050080 -h, --help Display this help message\n", progname);
81
82 exit(1);
83}
84
85void ndn_rtr_gettime(const struct ccn_gettime *self, struct ccn_timeval *result)
86{
87 struct timeval now = {0};
88 gettimeofday(&now, 0);
89 result->s = now.tv_sec;
90 result->micros = now.tv_usec;
91}
92
93static struct ccn_gettime ndn_rtr_ticker = {
94 "timer",
95 &ndn_rtr_gettime,
96 1000000,
97 NULL
98};
99
akmhoqueffacaa82012-09-13 17:48:30 -0500100void
101nlsr_lock(void)
102{
103 nlsr->semaphor=NLSR_LOCKED;
104}
105
106void
107nlsr_unlock(void)
108{
109 nlsr->semaphor=NLSR_UNLOCKED;
110}
akmhoque42098b12012-08-27 22:54:23 -0500111
112void
akmhoque03004e62012-09-06 01:12:28 -0500113nlsr_stop_signal_handler(int sig)
akmhoque42098b12012-08-27 22:54:23 -0500114{
akmhoque03004e62012-09-06 01:12:28 -0500115 signal(sig, SIG_IGN);
akmhoqueffacaa82012-09-13 17:48:30 -0500116 nlsr_destroy();
117 exit(0);
akmhoque59980a52012-08-09 12:36:09 -0500118}
119
akmhoquebfefef22012-09-26 10:09:34 -0500120void
121daemonize_nlsr(void)
122{
akmhoqueb28579d2013-02-12 11:15:52 -0600123 //int ret;
akmhoquebfefef22012-09-26 10:09:34 -0500124 pid_t process_id = 0;
125 pid_t sid = 0;
126 process_id = fork();
127 if (process_id < 0)
128 {
akmhoque7b791452012-10-30 11:24:56 -0500129 printf("Daemonization failed!\n");
akmhoquebfefef22012-09-26 10:09:34 -0500130 ON_ERROR_DESTROY(process_id);
131 }
132 if (process_id > 0)
133 {
134 printf("Process daemonized. Process id: %d \n", process_id);
akmhoqueb28579d2013-02-12 11:15:52 -0600135 //ret=process_id;
akmhoquebfefef22012-09-26 10:09:34 -0500136 exit(0);
137 }
138
139 umask(0);
140 sid = setsid();
141 if(sid < 0)
142 {
143 ON_ERROR_DESTROY(sid);
144 }
145
146 chdir("/");
147 close(STDIN_FILENO);
148 close(STDOUT_FILENO);
149 close(STDERR_FILENO);
150}
151
akmhoque59980a52012-08-09 12:36:09 -0500152void
153process_command_ccnneighbor(char *command)
154{
155 if(command==NULL)
156 {
akmhoque28c45022012-08-09 15:38:02 -0500157 printf(" Wrong Command Format ( ccnneighbor router_name faceX)\n");
akmhoque59980a52012-08-09 12:36:09 -0500158 return;
159 }
160 char *rem;
161 const char *sep=" \t\n";
akmhoqueb77b95f2013-02-08 12:28:47 -0600162 char *rtr_name;
163 char *nbr_ip_addr;
164 int is_ip_configured=0;
165 //char *face;
akmhoque7c234e02013-02-13 11:23:56 -0600166 char *ip_addr=(char *)calloc(20,sizeof(char));
167 //memset(ip_addr,0,12);
akmhoque59980a52012-08-09 12:36:09 -0500168
akmhoque28c45022012-08-09 15:38:02 -0500169 rtr_name=strtok_r(command,sep,&rem);
170 if(rtr_name==NULL)
akmhoque59980a52012-08-09 12:36:09 -0500171 {
akmhoque28c45022012-08-09 15:38:02 -0500172 printf(" Wrong Command Format ( ccnneighbor router_name faceX)\n");
akmhoque59980a52012-08-09 12:36:09 -0500173 return;
174 }
akmhoqued5152122012-09-19 06:44:23 -0500175 if ( rtr_name[strlen(rtr_name)-1] == '/' )
176 {
177 rtr_name[strlen(rtr_name)-1]='\0';
178 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600179
180 if (rem != NULL )
181 {
182 nbr_ip_addr=strtok_r(NULL,sep,&rem);
akmhoque958ccf72013-02-11 10:42:03 -0600183 if ( nbr_ip_addr != NULL)
184 is_ip_configured=1;
akmhoqueb77b95f2013-02-08 12:28:47 -0600185 }
akmhoque7c234e02013-02-13 11:23:56 -0600186 struct name_prefix *nbr=(struct name_prefix *)calloc(1,sizeof(struct name_prefix ));
187 nbr->name=(char *)calloc(strlen(rtr_name)+1,sizeof(char));
188 //memset(nbr->name,0,strlen(rtr_name)+1);
akmhoque03004e62012-09-06 01:12:28 -0500189 memcpy(nbr->name,rtr_name,strlen(rtr_name)+1);
190 nbr->length=strlen(rtr_name)+1;
191
akmhoqueb77b95f2013-02-08 12:28:47 -0600192
193 if ( !is_ip_configured )
194 {
akmhoque7c234e02013-02-13 11:23:56 -0600195 struct name_prefix *nbr_name=(struct name_prefix *)calloc(1,sizeof(struct name_prefix ));
akmhoqueb77b95f2013-02-08 12:28:47 -0600196 get_host_name_from_command_string(nbr_name,nbr->name,0);
akmhoque018692c2013-02-11 11:33:39 -0600197 if ( nlsr->debugging)
198 printf("Hostname of neighbor: %s ",nbr_name->name);
akmhoqueb77b95f2013-02-08 12:28:47 -0600199 get_ip_from_hostname_02(nbr_name->name,ip_addr);
akmhoque018692c2013-02-11 11:33:39 -0600200 if ( nlsr->debugging)
201 printf("IP Address: %s \n",ip_addr);
akmhoqueb77b95f2013-02-08 12:28:47 -0600202 free(nbr_name->name);
203 free(nbr_name);
204 }
205 else
206 {
207 memcpy(ip_addr,nbr_ip_addr,strlen(nbr_ip_addr));
akmhoque018692c2013-02-11 11:33:39 -0600208 if (nlsr->debugging)
209 {
210 printf("Name of neighbor: %s ",nbr->name);
211 printf("IP Address: %s \n",ip_addr);
212 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600213 }
214 add_nbr_to_adl(nbr,0,ip_addr);
215
akmhoque03004e62012-09-06 01:12:28 -0500216
217 free(nbr->name);
218 free(nbr);
219}
220
221void
222process_command_ccnname(char *command)
223{
224
225 if(command==NULL)
226 {
227 printf(" Wrong Command Format ( ccnname /name/prefix)\n");
228 return;
229 }
230 char *rem;
231 const char *sep=" \t\n";
232 char *name;
233 name=strtok_r(command,sep,&rem);
234 if(name==NULL)
235 {
236 printf(" Wrong Command Format ( ccnname /name/prefix/ )\n");
237 return;
238 }
239
240 printf("Name Prefix: %s \n",name);
241
akmhoqued5152122012-09-19 06:44:23 -0500242 if ( name[strlen(name)-1] == '/' )
243 name[strlen(name)-1]='\0';
244
akmhoque7c234e02013-02-13 11:23:56 -0600245 struct name_prefix *np=(struct name_prefix *)calloc(1,sizeof(struct name_prefix ));
246 np->name=(char *)calloc(strlen(name)+1,sizeof(char));
247 //memset(np->name,0,strlen(name)+1);
akmhoque03004e62012-09-06 01:12:28 -0500248 memcpy(np->name,name,strlen(name)+1);
249 np->length=strlen(name)+1;
akmhoque386081b2012-08-10 10:53:21 -0500250
akmhoque03004e62012-09-06 01:12:28 -0500251 add_name_to_npl(np);
akmhoque28c45022012-08-09 15:38:02 -0500252
akmhoque03004e62012-09-06 01:12:28 -0500253 free(np->name);
akmhoque53f64222012-09-05 13:57:51 -0500254 free(np);
akmhoque59980a52012-08-09 12:36:09 -0500255}
256
akmhoque03004e62012-09-06 01:12:28 -0500257
258void
259process_command_router_name(char *command)
260{
261 if(command==NULL)
262 {
263 printf(" Wrong Command Format ( router-name /router/name )\n");
264 return;
265 }
266 char *rem;
267 const char *sep=" \t\n";
268 char *rtr_name;
269
270 rtr_name=strtok_r(command,sep,&rem);
271 if(rtr_name==NULL)
272 {
273 printf(" Wrong Command Format ( router-name /router/name )\n");
274 return;
275 }
276
277
akmhoqued5152122012-09-19 06:44:23 -0500278 if ( rtr_name[strlen(rtr_name)-1] == '/' )
279 rtr_name[strlen(rtr_name)-1]='\0';
280
akmhoque7c234e02013-02-13 11:23:56 -0600281 nlsr->router_name=(char *)calloc(strlen(rtr_name)+1,sizeof(char));
282 //memset(nlsr->router_name,0,strlen(rtr_name)+1);
akmhoque03004e62012-09-06 01:12:28 -0500283 memcpy(nlsr->router_name,rtr_name,strlen(rtr_name)+1);
284
285
286}
287
akmhoqueb77b95f2013-02-08 12:28:47 -0600288/*
akmhoque59980a52012-08-09 12:36:09 -0500289void
akmhoqued79438d2012-08-27 13:31:42 -0500290process_command_lsdb_synch_interval(char *command)
291{
292 if(command==NULL)
293 {
294 printf(" Wrong Command Format ( lsdb-synch-interval secs )\n");
295 return;
296 }
297 char *rem;
298 const char *sep=" \t\n";
299 char *secs;
300 long int seconds;
301
302 secs=strtok_r(command,sep,&rem);
303 if(secs==NULL)
304 {
305 printf(" Wrong Command Format ( lsdb-synch-interval secs)\n");
306 return;
307 }
308
309 seconds=atoi(secs);
akmhoqueffacaa82012-09-13 17:48:30 -0500310 if ( seconds >= 120 && seconds <= 3600 )
311 {
312 nlsr->lsdb_synch_interval=seconds;
313 }
akmhoqued79438d2012-08-27 13:31:42 -0500314
315}
akmhoqueb77b95f2013-02-08 12:28:47 -0600316*/
akmhoqued79438d2012-08-27 13:31:42 -0500317
318void
319process_command_interest_retry(char *command)
320{
321 if(command==NULL)
322 {
323 printf(" Wrong Command Format ( interest-retry number )\n");
324 return;
325 }
326 char *rem;
327 const char *sep=" \t\n";
akmhoqueffacaa82012-09-13 17:48:30 -0500328 char *retry;
329 long int retry_number;
akmhoqued79438d2012-08-27 13:31:42 -0500330
akmhoqueffacaa82012-09-13 17:48:30 -0500331 retry=strtok_r(command,sep,&rem);
332 if(retry==NULL)
akmhoqued79438d2012-08-27 13:31:42 -0500333 {
334 printf(" Wrong Command Format ( interest-retry number)\n");
335 return;
336 }
337
akmhoqueffacaa82012-09-13 17:48:30 -0500338 retry_number=atoi(retry);
339 if ( retry_number >= 1 && retry_number<=10 )
340 {
341 nlsr->interest_retry=retry_number;
342 }
akmhoqued79438d2012-08-27 13:31:42 -0500343
344}
345
346void
347process_command_interest_resend_time(char *command)
348{
349 if(command==NULL)
350 {
351 printf(" Wrong Command Format ( interest-resend-time secs )\n");
352 return;
353 }
354 char *rem;
355 const char *sep=" \t\n";
356 char *secs;
357 long int seconds;
358
359 secs=strtok_r(command,sep,&rem);
360 if(secs==NULL)
361 {
362 printf(" Wrong Command Format ( interest-resend-time secs)\n");
363 return;
364 }
365
366 seconds=atoi(secs);
akmhoqueffacaa82012-09-13 17:48:30 -0500367 if ( seconds <= 60 && seconds >= 1 )
368 {
369 nlsr->interest_resend_time=seconds;
370 }
akmhoqued79438d2012-08-27 13:31:42 -0500371}
372
akmhoque03004e62012-09-06 01:12:28 -0500373
akmhoqued5152122012-09-19 06:44:23 -0500374void
375process_command_lsa_refresh_time(char *command)
376{
377 if(command==NULL)
378 {
379 printf(" Wrong Command Format ( lsa-refresh-time secs )\n");
380 return;
381 }
382 char *rem;
383 const char *sep=" \t\n";
384 char *secs;
385 long int seconds;
386
387 secs=strtok_r(command,sep,&rem);
388 if(secs==NULL)
389 {
390 printf(" Wrong Command Format ( lsa-refresh-time secs)\n");
391 return;
392 }
393
394 seconds=atoi(secs);
akmhoqueb77b95f2013-02-08 12:28:47 -0600395 if ( seconds >= 240)
akmhoqued5152122012-09-19 06:44:23 -0500396 {
397 nlsr->lsa_refresh_time=seconds;
akmhoqueb77b95f2013-02-08 12:28:47 -0600398 if ( nlsr->router_dead_interval < nlsr->lsa_refresh_time * 2 )
399 {
400 nlsr->router_dead_interval=2*nlsr->lsa_refresh_time;
401 }
akmhoqued5152122012-09-19 06:44:23 -0500402 }
403
404}
405
406void
407process_command_router_dead_interval(char *command)
408{
409 if(command==NULL)
410 {
411 printf(" Wrong Command Format ( router-dead-interval secs )\n");
412 return;
413 }
414 char *rem;
415 const char *sep=" \t\n";
416 char *secs;
417 long int seconds;
418
419 secs=strtok_r(command,sep,&rem);
420 if(secs==NULL)
421 {
422 printf(" Wrong Command Format ( router-dead-interval secs)\n");
423 return;
424 }
425
426 seconds=atoi(secs);
akmhoqueb77b95f2013-02-08 12:28:47 -0600427 if ( seconds >= 480 )
akmhoqued5152122012-09-19 06:44:23 -0500428 {
429 nlsr->router_dead_interval=seconds;
akmhoqueb77b95f2013-02-08 12:28:47 -0600430 if ( nlsr->router_dead_interval < nlsr->lsa_refresh_time * 2 )
431 {
432 nlsr->router_dead_interval=2*nlsr->lsa_refresh_time;
433 }
akmhoqued5152122012-09-19 06:44:23 -0500434 }
435
436}
akmhoque03004e62012-09-06 01:12:28 -0500437
akmhoqued79438d2012-08-27 13:31:42 -0500438void
akmhoqueb77b95f2013-02-08 12:28:47 -0600439process_command_max_faces_per_prefix(char *command)
akmhoque3cced642012-09-24 16:20:20 -0500440{
441 if(command==NULL)
442 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600443 printf(" Wrong Command Format ( max-faces-per-prefix n )\n");
akmhoque3cced642012-09-24 16:20:20 -0500444 return;
445 }
446 char *rem;
447 const char *sep=" \t\n";
448 char *num;
449 long int number;
450
451 num=strtok_r(command,sep,&rem);
452 if(num==NULL)
453 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600454 printf(" Wrong Command Format ( max-faces-per-prefix n)\n");
akmhoque3cced642012-09-24 16:20:20 -0500455 return;
456 }
457
458 number=atoi(num);
459 if ( number >= 0 && number <= 60 )
460 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600461 nlsr->max_faces_per_prefix=number;
akmhoque3cced642012-09-24 16:20:20 -0500462 }
463
464}
465
466void
akmhoquebfefef22012-09-26 10:09:34 -0500467process_command_logdir(char *command)
468{
469 if(command==NULL)
470 {
471 printf(" Wrong Command Format ( logdir /path/to/logdir )\n");
472 return;
473 }
474 char *rem;
475 const char *sep=" \t\n";
476 char *dir;
477
478 dir=strtok_r(command,sep,&rem);
479 if(dir==NULL)
480 {
481 printf(" Wrong Command Format ( logdir /path/to/logdir/ )\n");
482 return;
483 }
484
akmhoque7c234e02013-02-13 11:23:56 -0600485 nlsr->logDir=(char *)calloc(strlen(dir)+1,sizeof(char));
486 //memset(nlsr->logDir,0,strlen(dir)+1);
akmhoquebfefef22012-09-26 10:09:34 -0500487 memcpy(nlsr->logDir,dir,strlen(dir));
488}
489
490void
akmhoque7b791452012-10-30 11:24:56 -0500491process_command_detailed_log(char *command)
492{
493 if(command==NULL)
494 {
495 printf(" Wrong Command Format ( detailed-log on/off )\n");
496 return;
497 }
498 char *rem;
499 const char *sep=" \t\n";
500 char *on_off;
501
502 on_off=strtok_r(command,sep,&rem);
503 if(on_off==NULL)
504 {
505 printf(" Wrong Command Format ( detailed-log on/off )\n");
506 return;
507 }
508
509 if ( strcmp(on_off,"ON") == 0 || strcmp(on_off,"on") == 0)
510 {
511 nlsr->detailed_logging=1;
512 }
513}
514
515void
516process_command_debug(char *command)
517{
518 if(command==NULL)
519 {
520 printf(" Wrong Command Format ( debug on/off )\n");
521 return;
522 }
523 char *rem;
524 const char *sep=" \t\n";
525 char *on_off;
526
527 on_off=strtok_r(command,sep,&rem);
528 if(on_off==NULL)
529 {
530 printf(" Wrong Command Format ( debug on/off )\n");
531 return;
532 }
533
534 if ( strcmp(on_off,"ON") == 0 || strcmp(on_off,"on") == 0 )
535 {
536 nlsr->debugging=1;
537 }
538}
539
akmhoqueb77b95f2013-02-08 12:28:47 -0600540
541void
542process_command_topo_prefix(char *command)
543{
544 if(command==NULL)
545 {
546 printf(" Wrong Command Format ( topo-prefix )\n");
547 return;
548 }
549 char *rem;
550 const char *sep=" \t\n";
551 char *topo_prefix;
552
553 topo_prefix=strtok_r(command,sep,&rem);
554 if(topo_prefix==NULL)
555 {
556 printf(" Wrong Command Format ( topo-prefix /name/prefix )\n");
557 return;
558 }
559 else
560 {
561 if( nlsr->topo_prefix != NULL)
562 free(nlsr->topo_prefix);
563 if ( topo_prefix[strlen(topo_prefix)-1] == '/' )
564 topo_prefix[strlen(topo_prefix)-1]='\0';
565
akmhoque7c234e02013-02-13 11:23:56 -0600566 nlsr->topo_prefix=(char *)calloc(strlen(topo_prefix)+1,sizeof(char));
567 //memset(nlsr->topo_prefix,0,strlen(topo_prefix)+1);
akmhoqueb77b95f2013-02-08 12:28:47 -0600568 puts(topo_prefix);
569 memcpy(nlsr->topo_prefix,topo_prefix,strlen(topo_prefix));
570
571 }
572}
573
574
575void
576process_command_slice_prefix(char *command)
577{
578 if(command==NULL)
579 {
580 printf(" Wrong Command Format ( slice-prefix /name/prefix )\n");
581 return;
582 }
583 char *rem;
584 const char *sep=" \t\n";
585 char *slice_prefix;
586
587 slice_prefix=strtok_r(command,sep,&rem);
588 if(slice_prefix==NULL)
589 {
590 printf(" Wrong Command Format ( slice-prefix /name/prefix )\n");
591 return;
592 }
593 else
594 {
595 if ( nlsr->slice_prefix != NULL)
596 free(nlsr->slice_prefix);
597 if ( slice_prefix[strlen(slice_prefix)-1] == '/' )
598 slice_prefix[strlen(slice_prefix)-1]='\0';
599
akmhoque7c234e02013-02-13 11:23:56 -0600600 nlsr->slice_prefix=(char *)calloc(strlen(slice_prefix)+1,sizeof(char));
601 //memset(nlsr->slice_prefix,0,strlen(slice_prefix)+1);
akmhoqueb77b95f2013-02-08 12:28:47 -0600602 memcpy(nlsr->slice_prefix,slice_prefix,strlen(slice_prefix));
603 }
604}
605
606void
607process_command_hyperbolic_routing(char *command)
608{
609 if(command==NULL)
610 {
611 printf(" Wrong Command Format ( hyperbolic-routing on)\n");
612 return;
613 }
614 char *rem;
615 const char *sep=" \t\n";
616 char *on_off;
617
618 on_off=strtok_r(command,sep,&rem);
619 if(on_off==NULL)
620 {
621 printf(" Wrong Command Format ( hyperbolic-routing on )\n");
622 return;
623 }
624
625 if ( strcmp(on_off,"ON") == 0 || strcmp(on_off,"on") == 0 )
626 {
627 nlsr->is_hyperbolic_calc=1;
628 }
629}
630
631void
632process_command_hyperbolic_cordinate(char *command)
633{
634 if(command==NULL)
635 {
636 printf(" Wrong Command Format ( hyperbolic r 0 )\n");
637 return;
638 }
639
640 char *rem;
641 const char *sep=" \t\n\r";
642 char *radious;
643 char *theta;
644
645 radious=strtok_r(command,sep,&rem);
646 if (radious == NULL )
647 {
648 printf(" Wrong Command Format ( hyperbolic r 0 )\n");
649 return;
650 }
651
652 theta=strtok_r(NULL,sep,&rem);
653 if (theta == NULL )
654 {
655 printf(" Wrong Command Format ( hyperbolic r 0 )\n");
656 return;
657 }
658
659 nlsr->cor_r=strtof(radious,NULL);
660 nlsr->cor_theta=strtof(theta,NULL);
661
662}
663
664void
665process_command_tunnel_type(char *command)
666{
667 if(command==NULL)
668 {
669 printf(" Wrong Command Format ( tunnel-type udp/tcp)\n");
670 return;
671 }
672 char *rem;
673 const char *sep=" \t\n";
674 char *on_off;
675
676 on_off=strtok_r(command,sep,&rem);
677 if(on_off==NULL)
678 {
679 printf(" Wrong Command Format ( tunnel-type udp/tcp )\n");
680 return;
681 }
682
683 if ( strcmp(on_off,"TCP") == 0 || strcmp(on_off,"tcp") == 0 )
684 {
685 nlsr->tunnel_type=IPPROTO_TCP;
686 }
687 else if ( strcmp(on_off,"UDP") == 0 || strcmp(on_off,"udp") == 0 )
688 {
689 nlsr->tunnel_type=IPPROTO_UDP;
690 }
691}
692
akmhoque7b791452012-10-30 11:24:56 -0500693void
akmhoque59980a52012-08-09 12:36:09 -0500694process_conf_command(char *command)
695{
696 const char *separators=" \t\n";
697 char *remainder=NULL;
698 char *cmd_type=NULL;
699
700 if(command==NULL || strlen(command)==0 || command[0]=='!')
701 return;
702
703 cmd_type=strtok_r(command,separators,&remainder);
704
705 if(!strcmp(cmd_type,"router-name") )
706 {
707 process_command_router_name(remainder);
708 }
709 else if(!strcmp(cmd_type,"ccnneighbor") )
710 {
711 process_command_ccnneighbor(remainder);
712 }
713 else if(!strcmp(cmd_type,"ccnname") )
714 {
715 process_command_ccnname(remainder);
716 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600717 /*else if(!strcmp(cmd_type,"lsdb-synch-interval") )
akmhoqued79438d2012-08-27 13:31:42 -0500718 {
719 process_command_lsdb_synch_interval(remainder);
akmhoqueb77b95f2013-02-08 12:28:47 -0600720 }*/
akmhoqued79438d2012-08-27 13:31:42 -0500721 else if(!strcmp(cmd_type,"interest-retry") )
722 {
723 process_command_interest_retry(remainder);
724 }
725 else if(!strcmp(cmd_type,"interest-resend-time") )
726 {
727 process_command_interest_resend_time(remainder);
728 }
akmhoqued5152122012-09-19 06:44:23 -0500729 else if(!strcmp(cmd_type,"lsa-refresh-time") )
730 {
731 process_command_lsa_refresh_time(remainder);
732 }
733 else if(!strcmp(cmd_type,"router-dead-interval") )
734 {
735 process_command_router_dead_interval(remainder);
736 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600737 else if(!strcmp(cmd_type,"max-faces-per-prefix") )
akmhoque3cced642012-09-24 16:20:20 -0500738 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600739 process_command_max_faces_per_prefix(remainder);
akmhoque3cced642012-09-24 16:20:20 -0500740 }
akmhoquebfefef22012-09-26 10:09:34 -0500741 else if(!strcmp(cmd_type,"logdir") )
742 {
743 process_command_logdir(remainder);
744 }
akmhoque7b791452012-10-30 11:24:56 -0500745 else if(!strcmp(cmd_type,"detailed-log") )
746 {
747 process_command_detailed_log(remainder);
748 }
749 else if(!strcmp(cmd_type,"debug") )
750 {
751 process_command_debug(remainder);
752 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600753 else if(!strcmp(cmd_type,"topo-prefix") )
754 {
755 process_command_topo_prefix(remainder);
756 }
757 else if(!strcmp(cmd_type,"slice-prefix") )
758 {
759 process_command_slice_prefix(remainder);
760 }
761 else if(!strcmp(cmd_type,"hyperbolic-cordinate") )
762 {
763 process_command_hyperbolic_cordinate(remainder);
764 }
765 else if(!strcmp(cmd_type,"hyperbolic-routing") )
766 {
767 process_command_hyperbolic_routing(remainder);
768 }
769 else if(!strcmp(cmd_type,"tunnel-type") )
770 {
771 process_command_tunnel_type(remainder);
772 }
akmhoqued5152122012-09-19 06:44:23 -0500773 else
akmhoque59980a52012-08-09 12:36:09 -0500774 {
775 printf("Wrong configuration Command %s \n",cmd_type);
776 }
777}
778
akmhoque03004e62012-09-06 01:12:28 -0500779
akmhoque59980a52012-08-09 12:36:09 -0500780int
781readConfigFile(const char *filename)
782{
783 FILE *cfg;
784 char buf[1024];
785 int len;
786
787 cfg=fopen(filename, "r");
788
789 if(cfg == NULL)
790 {
791 printf("\nConfiguration File does not exists\n");
792 exit(1);
793 }
794
795 while(fgets((char *)buf, sizeof(buf), cfg))
796 {
797 len=strlen(buf);
798 if(buf[len-1] == '\n')
799 buf[len-1]='\0';
akmhoqued5152122012-09-19 06:44:23 -0500800 if ( buf[0] != '#' && buf[0] != '!')
801 process_conf_command(buf);
akmhoque59980a52012-08-09 12:36:09 -0500802 }
803
804 fclose(cfg);
805
806 return 0;
807}
808
akmhoqueb77b95f2013-02-08 12:28:47 -0600809
810void
811add_faces_for_nbrs(void)
812{
813 int i, adl_element;
814 struct ndn_neighbor *nbr;
815
816 struct hashtb_enumerator ee;
817 struct hashtb_enumerator *e = &ee;
818
819 hashtb_start(nlsr->adl, e);
820 adl_element=hashtb_n(nlsr->adl);
821
822 for(i=0;i<adl_element;i++)
823 {
824 nbr=e->data;
825 int face_id=add_ccn_face(nlsr->ccn, (const char *)nbr->neighbor->name, (const char *)nbr->ip_address, 9695,nlsr->tunnel_type);
826 update_face_to_adl_for_nbr(nbr->neighbor->name, face_id);
827 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->topo_prefix, OP_REG, face_id);
828 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->slice_prefix, OP_REG, face_id);
829 hashtb_next(e);
830 }
831
832 hashtb_end(e);
833
834}
835
836void
837destroy_faces_for_nbrs(void)
838{
839 int i, adl_element;
840 struct ndn_neighbor *nbr;
841
842 struct hashtb_enumerator ee;
843 struct hashtb_enumerator *e = &ee;
844
845 hashtb_start(nlsr->adl, e);
846 adl_element=hashtb_n(nlsr->adl);
847
848 for(i=0;i<adl_element;i++)
849 {
850 nbr=e->data;
851 if ( nbr->face > 0 )
852 {
853 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->topo_prefix, OP_UNREG, nbr->face);
854 add_delete_ccn_face_by_face_id(nlsr->ccn,(const char *)nbr->neighbor->name,OP_UNREG,nbr->face);
855 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->slice_prefix, OP_UNREG, nbr->face);
856 }
857 hashtb_next(e);
858 }
859
860 hashtb_end(e);
861
862}
863
akmhoque562caef2012-11-09 13:29:06 -0600864char *
865process_api_client_command(char *command)
866{
867 char *msg;
868 msg=(char *)malloc(100);
akmhoqueb77b95f2013-02-08 12:28:47 -0600869 memset(msg,0,100);
870
akmhoque3171d652012-11-13 11:44:33 -0600871 const char *sep=" \t\n";
872 char *rem=NULL;
873 char *cmd_type=NULL;
874 char *op_type=NULL;
875 char *name=NULL;
876 char *face=NULL;
877 int face_id;
878 int res;
879
880 op_type=strtok_r(command,sep,&rem);
881 cmd_type=strtok_r(NULL,sep,&rem);
882 name=strtok_r(NULL,sep,&rem);
883 if ( name[strlen(name)-1] == '/' )
884 name[strlen(name)-1]='\0';
885
akmhoque7c234e02013-02-13 11:23:56 -0600886 struct name_prefix *np=(struct name_prefix *)calloc(1,sizeof(struct name_prefix ));
887 np->name=(char *)calloc(strlen(name)+1,sizeof(char));
888 //memset(np->name,0,strlen(name)+1);
akmhoque3171d652012-11-13 11:44:33 -0600889 memcpy(np->name,name,strlen(name)+1);
890 np->length=strlen(name)+1;
891
892 if ( strcmp(cmd_type,"name")!= 0 )
893 {
894 face=strtok_r(NULL,sep,&rem);
895 sscanf(face,"face%d",&face_id);
896 }
akmhoque562caef2012-11-09 13:29:06 -0600897
akmhoque3171d652012-11-13 11:44:33 -0600898 if ( strcmp(cmd_type,"name")== 0 )
899 {
900 if ( strcmp(op_type,"del") == 0 )
901 {
902 res=does_name_exist_in_npl(np);
903 if ( res == 0)
904 {
905 sprintf(msg,"Name %s does not exist !!",name);
906 }
907 else
908 {
909 long int ls_id=get_lsa_id_from_npl(np);
910 if ( ls_id != 0 )
911 {
912 make_name_lsa_invalid(np,LS_TYPE_NAME,ls_id);
913 sprintf(msg,"Name %s has been deleted and Advertised.",name);
914 }
915 else
916 {
917 sprintf(msg,"Name %s does not have an Name LSA yet !!",name);
918 }
919 }
920 }
921 else if ( strcmp(op_type,"add") == 0 )
922 {
923 res=does_name_exist_in_npl(np);
924 if ( res == 0)
925 {
926 add_name_to_npl(np);
927 build_and_install_single_name_lsa(np);
928 sprintf(msg,"Name %s has been added to advertise.",name);
929 }
930 else
931 {
932 sprintf(msg,"Name %s has already been advertised from this router !!",name);
933 }
934 }
935 }
936 else if ( strcmp(cmd_type,"neighbor") == 0 )
937 {
938 if ( strcmp(op_type,"del") == 0 )
939 {
940 res=is_neighbor(np->name);
941 if ( res == 0)
942 {
943 sprintf(msg,"Neighbor %s does not exist !!",name);
944 }
945 else
946 {
947 update_adjacent_status_to_adl(np,NBR_DOWN);
akmhoqueb77b95f2013-02-08 12:28:47 -0600948 int face_id=get_next_hop_face_from_adl(np->name);
949 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)np->name, OP_UNREG, face_id);
950 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->topo_prefix, OP_UNREG, face_id);
951 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->slice_prefix, OP_UNREG, face_id);
akmhoque3171d652012-11-13 11:44:33 -0600952 delete_nbr_from_adl(np);
953 if(!nlsr->is_build_adj_lsa_sheduled)
954 {
955 nlsr->event_build_adj_lsa = ccn_schedule_event(nlsr->sched, 1000, &build_and_install_adj_lsa, NULL, 0);
956 nlsr->is_build_adj_lsa_sheduled=1;
957 }
958 sprintf(msg,"Neighbor %s has been deleted from adjacency list.",name);
959 }
960 }
961 else if ( strcmp(op_type,"add") == 0 )
962 {
963 res=is_neighbor(np->name);
964 if ( res == 0 )
965 {
akmhoque7c234e02013-02-13 11:23:56 -0600966 struct name_prefix *nbr_name=(struct name_prefix *)calloc(1,sizeof(struct name_prefix ));
akmhoqueb77b95f2013-02-08 12:28:47 -0600967 get_host_name_from_command_string(nbr_name,np->name,0);
968 printf("Hostname of neighbor: %s ",nbr_name->name);
969
akmhoque7c234e02013-02-13 11:23:56 -0600970 char *ip_addr=(char *)calloc(20,sizeof(char));
971 //memset(ip_addr,0,20);
akmhoqueb77b95f2013-02-08 12:28:47 -0600972 get_ip_from_hostname_02(nbr_name->name,ip_addr);
973 printf("IP Address: %s \n",ip_addr);
974 int face_id=add_ccn_face(nlsr->ccn, (const char *)nbr_name->name, (const char *)ip_addr, 9695,nlsr->tunnel_type);
975 update_face_to_adl_for_nbr(nbr_name->name, face_id);
976 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->topo_prefix, OP_REG, face_id);
977 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->slice_prefix, OP_REG, face_id);
978
979 add_nbr_to_adl(np,face_id,ip_addr);
980
akmhoque3171d652012-11-13 11:44:33 -0600981 sprintf(msg,"Neighbor %s has been added to adjacency list.",name);
akmhoque7c234e02013-02-13 11:23:56 -0600982 free(ip_addr);
akmhoqueb77b95f2013-02-08 12:28:47 -0600983
akmhoque3171d652012-11-13 11:44:33 -0600984 }
985 else
986 {
987 sprintf(msg,"Neighbor %s already exists in adjacency list.",name);
988 }
989 }
990 }
991
akmhoque562caef2012-11-09 13:29:06 -0600992
993 return msg;
994}
akmhoque1771c412012-11-09 13:06:08 -0600995
996int
997nlsr_api_server_poll(long int time_out_micro_sec, int ccn_fd)
998{
999 struct timeval timeout;
akmhoqueb77b95f2013-02-08 12:28:47 -06001000 if (time_out_micro_sec< 500000 && time_out_micro_sec> 0 )
akmhoque1771c412012-11-09 13:06:08 -06001001 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001002 timeout.tv_sec=0;
1003 timeout.tv_usec=time_out_micro_sec;
akmhoque1771c412012-11-09 13:06:08 -06001004 }
akmhoqueb77b95f2013-02-08 12:28:47 -06001005 else
akmhoque1771c412012-11-09 13:06:08 -06001006 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001007 timeout.tv_sec = 0;
1008 timeout.tv_usec = 500000;
akmhoque1771c412012-11-09 13:06:08 -06001009 }
akmhoque1771c412012-11-09 13:06:08 -06001010
1011 int fd;
1012 int nread;
1013 int result;
1014 fd_set testfds;
1015 unsigned int client_len;
1016 int client_sockfd;
1017 char recv_buffer[1024];
1018 bzero(recv_buffer,1024);
akmhoque95041802012-11-16 09:18:02 -06001019 struct sockaddr_in client_address;
akmhoque1771c412012-11-09 13:06:08 -06001020
1021 testfds=nlsr->readfds;
1022 result = select(FD_SETSIZE, &testfds, NULL,NULL, &timeout);
1023
akmhoqueb77b95f2013-02-08 12:28:47 -06001024 for(fd = 0; fd < FD_SETSIZE && result > 0; fd++)
akmhoque1771c412012-11-09 13:06:08 -06001025 {
1026 if(FD_ISSET(fd,&testfds))
1027 {
1028 if ( fd == ccn_fd )
1029 {
1030 return 0;
1031 }
1032 else if(fd == nlsr->nlsr_api_server_sock_fd)
1033 {
1034 client_len = sizeof(client_address);
1035 client_sockfd = accept(nlsr->nlsr_api_server_sock_fd,(struct sockaddr *)&client_address, &client_len);
1036 FD_SET(client_sockfd, &nlsr->readfds);
1037 }
1038 else
1039 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001040
akmhoque1771c412012-11-09 13:06:08 -06001041 ioctl(fd, FIONREAD, &nread);
1042 if(nread == 0)
1043 {
1044 close(fd);
1045 FD_CLR(fd, &nlsr->readfds);
1046 }
1047 else
1048 {
1049 recv(fd, recv_buffer, 1024, 0);
akmhoqueb77b95f2013-02-08 12:28:47 -06001050 printf("Received Data from NLSR API cleint: %s \n",recv_buffer);
akmhoque562caef2012-11-09 13:29:06 -06001051 char *msg=process_api_client_command(recv_buffer);
1052 send(fd, msg, strlen(msg),0);
1053 free(msg);
akmhoque1771c412012-11-09 13:06:08 -06001054 close(fd);
1055 FD_CLR(fd, &nlsr->readfds);
akmhoque1771c412012-11-09 13:06:08 -06001056 }
1057 }
1058 }
1059 }
1060
1061 return 0;
1062}
1063
akmhoqueb77b95f2013-02-08 12:28:47 -06001064int
1065check_config_validity()
1066{
1067 if (nlsr->router_name == NULL )
1068 {
1069 fprintf(stderr,"Router name has not been configured :(\n");
1070 return -1;
1071 }
1072 if ( nlsr->is_hyperbolic_calc == 1 && (nlsr->cor_r == -1.0 && nlsr->cor_theta== -1.0) )
1073 {
1074 fprintf(stderr,"Hyperbolic codinate has not been defined :(\n");
1075 return -1;
1076 }
1077
1078 return 0;
1079}
1080
akmhoque386081b2012-08-10 10:53:21 -05001081void
1082nlsr_destroy( void )
1083{
akmhoque7b791452012-10-30 11:24:56 -05001084 if ( nlsr->debugging )
1085 {
1086 printf("Freeing Allocated Memory....\n");
1087 }
akmhoque9e9fc722012-09-26 14:03:25 -05001088 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Freeing Allocated Memory....\n");
akmhoquefbfd0982012-09-09 20:59:03 -05001089 /* Destroying all face created by nlsr in CCND */
1090 destroy_all_face_by_nlsr();
akmhoqueb77b95f2013-02-08 12:28:47 -06001091 destroy_faces_for_nbrs();
akmhoque386081b2012-08-10 10:53:21 -05001092 /* Destroying every hash table attached to each neighbor in ADL before destorying ADL */
akmhoque7c234e02013-02-13 11:23:56 -06001093 hashtb_destroy(&nlsr->adl);
1094 hashtb_destroy(&nlsr->npl);
1095 hashtb_destroy(&nlsr->pit_alsa);
akmhoque03004e62012-09-06 01:12:28 -05001096 hashtb_destroy(&nlsr->lsdb->name_lsdb);
1097 hashtb_destroy(&nlsr->lsdb->adj_lsdb);
akmhoque7c234e02013-02-13 11:23:56 -06001098 hashtb_destroy(&nlsr->lsdb->cor_lsdb);
akmhoque3cced642012-09-24 16:20:20 -05001099
akmhoque7c234e02013-02-13 11:23:56 -06001100 int i, npt_element,rt_element;
akmhoque3560cb62012-09-09 10:52:30 -05001101 struct npt_entry *ne;
1102 struct hashtb_enumerator ee;
1103 struct hashtb_enumerator *e = &ee;
1104 hashtb_start(nlsr->npt, e);
1105 npt_element=hashtb_n(nlsr->npt);
1106 for(i=0;i<npt_element;i++)
1107 {
1108 ne=e->data;
akmhoque3cced642012-09-24 16:20:20 -05001109 hashtb_destroy(&ne->name_list);
1110 hashtb_destroy(&ne->face_list);
akmhoque3560cb62012-09-09 10:52:30 -05001111 hashtb_next(e);
1112 }
1113
1114 hashtb_end(e);
1115 hashtb_destroy(&nlsr->npt);
akmhoque7c234e02013-02-13 11:23:56 -06001116
1117
1118 struct routing_table_entry *rte;
1119 hashtb_start(nlsr->routing_table, e);
1120 rt_element=hashtb_n(nlsr->routing_table);
1121 for(i=0;i<rt_element;i++)
1122 {
1123 rte=e->data;
1124 hashtb_destroy(&rte->face_list);
1125 hashtb_next(e);
1126 }
1127 hashtb_end(e);
1128 hashtb_destroy(&nlsr->routing_table);
1129
1130 if ( nlsr->ccns != NULL )
1131 ccns_close(&nlsr->ccns, NULL, NULL);
1132 if ( nlsr->slice != NULL )
1133 ccns_slice_destroy(&nlsr->slice);
akmhoque3560cb62012-09-09 10:52:30 -05001134
akmhoque7c234e02013-02-13 11:23:56 -06001135 close(nlsr->nlsr_api_server_sock_fd);
akmhoque95041802012-11-16 09:18:02 -06001136
akmhoque866c2222013-02-12 10:49:33 -06001137 ccn_destroy(&nlsr->ccn);
akmhoque03004e62012-09-06 01:12:28 -05001138 free(nlsr->lsdb->lsdb_version);
1139 free(nlsr->lsdb);
1140 free(nlsr->router_name);
akmhoque7b791452012-10-30 11:24:56 -05001141 if ( nlsr->debugging )
1142 {
1143 printf("Finished freeing allocated memory\n");
1144 }
akmhoque9e9fc722012-09-26 14:03:25 -05001145 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Finished freeing allocated memory\n");
akmhoque7c234e02013-02-13 11:23:56 -06001146
1147 free(nlsr);
akmhoque53f64222012-09-05 13:57:51 -05001148
akmhoque386081b2012-08-10 10:53:21 -05001149}
1150
akmhoque03004e62012-09-06 01:12:28 -05001151
akmhoqueb77b95f2013-02-08 12:28:47 -06001152
akmhoque1771c412012-11-09 13:06:08 -06001153void
1154init_api_server(int ccn_fd)
1155{
1156 int server_sockfd;
1157 int server_len;
akmhoque95041802012-11-16 09:18:02 -06001158 struct sockaddr_in server_address;
akmhoquef31f13b2012-11-16 09:42:24 -06001159 unsigned int yes=1;
1160
akmhoque95041802012-11-16 09:18:02 -06001161 server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
akmhoque1771c412012-11-09 13:06:08 -06001162
1163 int flags = fcntl(server_sockfd, F_GETFL, 0);
1164 fcntl(server_sockfd, F_SETFL, O_NONBLOCK|flags);
1165
akmhoquef31f13b2012-11-16 09:42:24 -06001166 if (setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)
1167 {
1168 ON_ERROR_DESTROY(-1);
1169 }
akmhoque95041802012-11-16 09:18:02 -06001170
1171 server_address.sin_family = AF_INET;
Adam Alyyanb5fff372013-01-09 14:32:52 -06001172 server_address.sin_addr.s_addr = INADDR_ANY;
1173 server_address.sin_port = htons(nlsr->api_port);
akmhoque95041802012-11-16 09:18:02 -06001174
akmhoque1771c412012-11-09 13:06:08 -06001175 server_len = sizeof(server_address);
1176 bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
1177 listen(server_sockfd, 100);
1178 FD_ZERO(&nlsr->readfds);
1179 FD_SET(server_sockfd, &nlsr->readfds);
1180 FD_SET(ccn_fd, &nlsr->readfds);
1181 nlsr->nlsr_api_server_sock_fd=server_sockfd;
1182
1183}
1184
akmhoque81c25e02012-09-10 14:50:33 -05001185int
akmhoque902d57e2012-08-17 09:24:38 -05001186init_nlsr(void)
akmhoque59980a52012-08-09 12:36:09 -05001187{
akmhoque03004e62012-09-06 01:12:28 -05001188 if (signal(SIGQUIT, nlsr_stop_signal_handler ) == SIG_ERR)
1189 {
1190 perror("SIGQUIT install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001191 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001192 }
1193 if (signal(SIGTERM, nlsr_stop_signal_handler ) == SIG_ERR)
1194 {
1195 perror("SIGTERM install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001196 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001197 }
1198 if (signal(SIGINT, nlsr_stop_signal_handler ) == SIG_ERR)
1199 {
1200 perror("SIGTERM install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001201 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001202 }
akmhoque902d57e2012-08-17 09:24:38 -05001203
akmhoque7c234e02013-02-13 11:23:56 -06001204 nlsr=(struct nlsr *)calloc(1,sizeof(struct nlsr));
akmhoque03004e62012-09-06 01:12:28 -05001205
1206 struct hashtb_param param_adl = {0};
akmhoque28c45022012-08-09 15:38:02 -05001207 nlsr->adl=hashtb_create(sizeof(struct ndn_neighbor), &param_adl);
akmhoque03004e62012-09-06 01:12:28 -05001208 struct hashtb_param param_npl = {0};
akmhoque3171d652012-11-13 11:44:33 -06001209 nlsr->npl = hashtb_create(sizeof(struct name_prefix_list_entry), &param_npl);
akmhoque29c1db52012-09-07 14:47:43 -05001210 struct hashtb_param param_pit_alsa = {0};
akmhoque1ce71052012-09-13 22:51:32 -05001211 nlsr->pit_alsa = hashtb_create(sizeof(struct pending_interest), &param_pit_alsa);
akmhoque3560cb62012-09-09 10:52:30 -05001212 struct hashtb_param param_npt = {0};
1213 nlsr->npt = hashtb_create(sizeof(struct npt_entry), &param_npt);
1214 struct hashtb_param param_rte = {0};
1215 nlsr->routing_table = hashtb_create(sizeof(struct routing_table_entry), &param_rte);
akmhoque29c1db52012-09-07 14:47:43 -05001216
akmhoque59980a52012-08-09 12:36:09 -05001217 nlsr->in_interest.p = &incoming_interest;
1218 nlsr->in_content.p = &incoming_content;
akmhoque07dd8cc2012-08-16 10:23:01 -05001219
akmhoque03004e62012-09-06 01:12:28 -05001220 nlsr->lsdb=(struct linkStateDatabase *)malloc(sizeof(struct linkStateDatabase));
akmhoque07dd8cc2012-08-16 10:23:01 -05001221
akmhoque7c234e02013-02-13 11:23:56 -06001222 char *time_stamp=(char *)calloc(20,sizeof(char));
1223 //memset(time_stamp,0,20);
akmhoque03004e62012-09-06 01:12:28 -05001224 get_current_timestamp_micro(time_stamp);
1225 nlsr->lsdb->lsdb_version=(char *)malloc(strlen(time_stamp)+1);
akmhoqueb77b95f2013-02-08 12:28:47 -06001226 memset(nlsr->lsdb->lsdb_version,0,strlen(time_stamp));
akmhoque03004e62012-09-06 01:12:28 -05001227 free(time_stamp);
1228
1229 struct hashtb_param param_adj_lsdb = {0};
akmhoquef71d9082012-08-22 12:51:53 -04001230 nlsr->lsdb->adj_lsdb = hashtb_create(sizeof(struct alsa), &param_adj_lsdb);
akmhoque03004e62012-09-06 01:12:28 -05001231 struct hashtb_param param_name_lsdb = {0};
akmhoquef71d9082012-08-22 12:51:53 -04001232 nlsr->lsdb->name_lsdb = hashtb_create(sizeof(struct nlsa), &param_name_lsdb);
akmhoqueb77b95f2013-02-08 12:28:47 -06001233 struct hashtb_param param_cor_lsdb = {0};
1234 nlsr->lsdb->cor_lsdb = hashtb_create(sizeof(struct clsa), &param_cor_lsdb);
akmhoque29c1db52012-09-07 14:47:43 -05001235
1236
akmhoque902d57e2012-08-17 09:24:38 -05001237
akmhoque53f64222012-09-05 13:57:51 -05001238
akmhoque59980a52012-08-09 12:36:09 -05001239 nlsr->is_synch_init=1;
akmhoquec9286692012-08-16 09:57:58 -05001240 nlsr->nlsa_id=0;
akmhoqued79438d2012-08-27 13:31:42 -05001241 nlsr->adj_build_flag=0;
akmhoque53f64222012-09-05 13:57:51 -05001242 nlsr->adj_build_count=0;
1243 nlsr->is_build_adj_lsa_sheduled=0;
akmhoque29c1db52012-09-07 14:47:43 -05001244 nlsr->is_send_lsdb_interest_scheduled=0;
1245 nlsr->is_route_calculation_scheduled=0;
akmhoqued79438d2012-08-27 13:31:42 -05001246
akmhoque7b791452012-10-30 11:24:56 -05001247 nlsr->detailed_logging=0;
1248 nlsr->debugging=0;
1249
akmhoqueb77b95f2013-02-08 12:28:47 -06001250 //nlsr->lsdb_synch_interval = LSDB_SYNCH_INTERVAL;
akmhoqued79438d2012-08-27 13:31:42 -05001251 nlsr->interest_retry = INTEREST_RETRY;
1252 nlsr->interest_resend_time = INTEREST_RESEND_TIME;
akmhoqueda5b6832012-09-13 22:33:55 -05001253 nlsr->lsa_refresh_time=LSA_REFRESH_TIME;
1254 nlsr->router_dead_interval=ROUTER_DEAD_INTERVAL;
akmhoqueb77b95f2013-02-08 12:28:47 -06001255 nlsr->max_faces_per_prefix=MAX_FACES_PER_PREFIX;
akmhoqueffacaa82012-09-13 17:48:30 -05001256 nlsr->semaphor=NLSR_UNLOCKED;
akmhoque81c25e02012-09-10 14:50:33 -05001257
akmhoque95041802012-11-16 09:18:02 -06001258 nlsr->api_port=API_PORT;
1259
akmhoque7c234e02013-02-13 11:23:56 -06001260 nlsr->topo_prefix=(char *)calloc(strlen("/ndn/routing/nlsr")+1,sizeof(char));
1261 //memset(nlsr->topo_prefix,0,strlen("/ndn/routing/nlsr")+1);
akmhoqueb77b95f2013-02-08 12:28:47 -06001262 memcpy(nlsr->topo_prefix,"/ndn/routing/nlsr",strlen("/ndn/routing/nlsr"));
1263
akmhoque7c234e02013-02-13 11:23:56 -06001264 nlsr->slice_prefix=(char *)calloc(strlen("/ndn/routing/nlsr/LSA")+1,sizeof(char));
1265 //memset(nlsr->slice_prefix, 0, strlen("/ndn/routing/nlsr/LSA")+1);
akmhoqueb77b95f2013-02-08 12:28:47 -06001266 memcpy(nlsr->slice_prefix,"/ndn/routing/nlsr/LSA",strlen("/ndn/routing/nlsr/LSA"));
1267
1268 nlsr->is_hyperbolic_calc=0;
1269 nlsr->cor_r=-1.0;
1270 nlsr->cor_theta=-1.0;
1271
1272 nlsr->tunnel_type=IPPROTO_UDP;
1273
akmhoque81c25e02012-09-10 14:50:33 -05001274 return 0;
akmhoque902d57e2012-08-17 09:24:38 -05001275}
1276
akmhoque03004e62012-09-06 01:12:28 -05001277
akmhoque902d57e2012-08-17 09:24:38 -05001278int
1279main(int argc, char *argv[])
1280{
akmhoque81c25e02012-09-10 14:50:33 -05001281 int res, ret;
akmhoque902d57e2012-08-17 09:24:38 -05001282 char *config_file;
akmhoquebfefef22012-09-26 10:09:34 -05001283 int daemon_mode=0;
akmhoque95041802012-11-16 09:18:02 -06001284 int port=0;
akmhoque902d57e2012-08-17 09:24:38 -05001285
akmhoquebfefef22012-09-26 10:09:34 -05001286
akmhoque81c25e02012-09-10 14:50:33 -05001287
akmhoque95041802012-11-16 09:18:02 -06001288 while ((res = getopt_long(argc, argv, "df:p:h", longopts, 0)) != -1)
akmhoque59980a52012-08-09 12:36:09 -05001289 {
1290 switch (res)
1291 {
1292 case 'd':
akmhoquebfefef22012-09-26 10:09:34 -05001293 daemon_mode = 1;
akmhoque59980a52012-08-09 12:36:09 -05001294 break;
1295 case 'f':
1296 config_file = optarg;
1297 break;
akmhoque95041802012-11-16 09:18:02 -06001298 case 'p':
1299 port = atoi(optarg);
1300 break;
akmhoque59980a52012-08-09 12:36:09 -05001301 case 'h':
1302 default:
1303 usage(argv[0]);
1304 }
1305 }
1306
akmhoquebfefef22012-09-26 10:09:34 -05001307 ret=init_nlsr();
1308 ON_ERROR_EXIT(ret);
akmhoque95041802012-11-16 09:18:02 -06001309
1310 if ( port !=0 )
1311 nlsr->api_port=port;
1312
akmhoque59980a52012-08-09 12:36:09 -05001313 readConfigFile(config_file);
akmhoqueb77b95f2013-02-08 12:28:47 -06001314
1315 ON_ERROR_DESTROY(check_config_validity());
1316
1317 print_adjacent_from_adl();
1318
akmhoquebfefef22012-09-26 10:09:34 -05001319 if ( daemon_mode == 1 )
1320 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001321 nlsr->debugging=0;
akmhoquebfefef22012-09-26 10:09:34 -05001322 daemonize_nlsr();
1323 }
1324
1325 startLogging(nlsr->logDir);
1326
akmhoque59980a52012-08-09 12:36:09 -05001327 nlsr->ccn=ccn_create();
akmhoque1771c412012-11-09 13:06:08 -06001328 int ccn_fd=ccn_connect(nlsr->ccn, NULL);
1329 if(ccn_fd == -1)
akmhoque03004e62012-09-06 01:12:28 -05001330 {
1331 fprintf(stderr,"Could not connect to ccnd\n");
akmhoquebfefef22012-09-26 10:09:34 -05001332 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Could not connect to ccnd\n");
akmhoque81c25e02012-09-10 14:50:33 -05001333 ON_ERROR_DESTROY(-1);
akmhoque03004e62012-09-06 01:12:28 -05001334 }
akmhoque1771c412012-11-09 13:06:08 -06001335
1336 init_api_server(ccn_fd);
akmhoqueb77b95f2013-02-08 12:28:47 -06001337
1338 res=create_sync_slice(nlsr->topo_prefix, nlsr->slice_prefix);
1339 if(res<0)
1340 {
1341 fprintf(stderr, "Can not create slice for prefix %s\n",nlsr->slice_prefix);
1342 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Can not create slice for prefix %s\n",nlsr->slice_prefix);
1343 ON_ERROR_DESTROY(res);
1344 }
akmhoque53f64222012-09-05 13:57:51 -05001345 struct ccn_charbuf *router_prefix;
akmhoque03004e62012-09-06 01:12:28 -05001346 router_prefix=ccn_charbuf_create();
1347 res=ccn_name_from_uri(router_prefix,nlsr->router_name);
akmhoque59980a52012-08-09 12:36:09 -05001348 if(res<0)
akmhoque03004e62012-09-06 01:12:28 -05001349 {
1350 fprintf(stderr, "Bad ccn URI: %s\n",nlsr->router_name);
akmhoquebfefef22012-09-26 10:09:34 -05001351 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Bad ccn URI: %s\n",nlsr->router_name);
akmhoque81c25e02012-09-10 14:50:33 -05001352 ON_ERROR_DESTROY(res);
akmhoque03004e62012-09-06 01:12:28 -05001353 }
akmhoque59980a52012-08-09 12:36:09 -05001354
1355 ccn_name_append_str(router_prefix,"nlsr");
akmhoque03004e62012-09-06 01:12:28 -05001356 nlsr->in_interest.data=nlsr->router_name;
akmhoque59980a52012-08-09 12:36:09 -05001357 res=ccn_set_interest_filter(nlsr->ccn,router_prefix,&nlsr->in_interest);
1358 if ( res < 0 )
akmhoque03004e62012-09-06 01:12:28 -05001359 {
1360 fprintf(stderr,"Failed to register interest for router\n");
akmhoque9e9fc722012-09-26 14:03:25 -05001361 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Failed to register interest for router\n");
akmhoque81c25e02012-09-10 14:50:33 -05001362 ON_ERROR_DESTROY(res);
akmhoque03004e62012-09-06 01:12:28 -05001363 }
1364 ccn_charbuf_destroy(&router_prefix);
1365
akmhoque7b791452012-10-30 11:24:56 -05001366 if ( nlsr->debugging )
1367 printf("Router Name : %s\n",nlsr->router_name);
akmhoque9e9fc722012-09-26 14:03:25 -05001368 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Router Name : %s\n",nlsr->router_name);
akmhoque7b791452012-10-30 11:24:56 -05001369 if ( nlsr->debugging )
1370 printf("lsdb_version: %s\n",nlsr->lsdb->lsdb_version);
akmhoque9e9fc722012-09-26 14:03:25 -05001371 writeLogg(__FILE__,__FUNCTION__,__LINE__,"lsdb_version: %s\n",nlsr->lsdb->lsdb_version);
akmhoque59980a52012-08-09 12:36:09 -05001372
akmhoqueb77b95f2013-02-08 12:28:47 -06001373 add_faces_for_nbrs();
akmhoque53f64222012-09-05 13:57:51 -05001374 print_name_prefix_from_npl();
1375 print_adjacent_from_adl();
akmhoqueb77b95f2013-02-08 12:28:47 -06001376 build_and_install_name_lsas();
1377
akmhoqueb77b95f2013-02-08 12:28:47 -06001378 print_name_lsdb();
1379 if ( nlsr->cor_r != -1.0 && nlsr->cor_theta != -1.0)
1380 {
1381 build_and_install_cor_lsa();
1382 }
1383 write_name_lsdb_to_repo(nlsr->slice_prefix);
akmhoque53f64222012-09-05 13:57:51 -05001384
1385 nlsr->sched = ccn_schedule_create(nlsr, &ndn_rtr_ticker);
akmhoque184dde02013-02-14 15:53:24 -06001386 ccn_set_schedule(nlsr->ccn,nlsr->sched);
akmhoque03004e62012-09-06 01:12:28 -05001387 nlsr->event_send_info_interest = ccn_schedule_event(nlsr->sched, 1, &send_info_interest, NULL, 0);
akmhoqueffacaa82012-09-13 17:48:30 -05001388 nlsr->event = ccn_schedule_event(nlsr->sched, 60000000, &refresh_lsdb, NULL, 0);
akmhoque0678c5d2013-02-18 11:03:31 -06001389
1390 res=sync_monitor(nlsr->topo_prefix,nlsr->slice_prefix);
1391 ON_ERROR_DESTROY(res);
akmhoque1c9b92f2012-08-13 10:57:50 -05001392
akmhoque1771c412012-11-09 13:06:08 -06001393
akmhoque59980a52012-08-09 12:36:09 -05001394 while(1)
akmhoque29c1db52012-09-07 14:47:43 -05001395 {
akmhoqueffacaa82012-09-13 17:48:30 -05001396 if ( nlsr->semaphor == NLSR_UNLOCKED )
akmhoque29c1db52012-09-07 14:47:43 -05001397 {
akmhoqueffacaa82012-09-13 17:48:30 -05001398 if( nlsr->sched != NULL )
1399 {
akmhoque1771c412012-11-09 13:06:08 -06001400 long int micro_sec=ccn_schedule_run(nlsr->sched);
1401 res=nlsr_api_server_poll(micro_sec,ccn_fd);
1402 ON_ERROR_DESTROY(res);
akmhoqueffacaa82012-09-13 17:48:30 -05001403 }
1404 if(nlsr->ccn != NULL)
1405 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001406 res = ccn_run(nlsr->ccn, 1);
akmhoqueffacaa82012-09-13 17:48:30 -05001407 }
1408 if (!(nlsr->sched && nlsr->ccn))
1409 {
1410 break;
1411 }
akmhoque29c1db52012-09-07 14:47:43 -05001412 }
1413
akmhoque59980a52012-08-09 12:36:09 -05001414 }
akmhoque1771c412012-11-09 13:06:08 -06001415
akmhoque59980a52012-08-09 12:36:09 -05001416
akmhoque59980a52012-08-09 12:36:09 -05001417 return 0;
1418}
1419