blob: 4f5066912d1155338db0efa14e33e574e2fb3ae6 [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{ \
Obaid Amin2a928a52013-02-20 11:06:51 -060048 if ((resval) < 0) { \
49 nlsr_destroy(); \
50 exit(1);\
51 } \
akmhoque81c25e02012-09-10 14:50:33 -050052}
53
54
55#define ON_ERROR_EXIT(resval) \
56{ \
Obaid Amin2a928a52013-02-20 11:06:51 -060057 if ((resval) < 0) { \
58 exit(1); \
59 } \
akmhoque81c25e02012-09-10 14:50:33 -050060}
akmhoque59980a52012-08-09 12:36:09 -050061
62struct option longopts[] =
63{
Obaid Amin2a928a52013-02-20 11:06:51 -060064 { "daemon", no_argument, NULL, 'd'},
65 { "config_file", required_argument, NULL, 'f'},
66 { "api_port", required_argument, NULL, 'p'},
67 { "help", no_argument, NULL, 'h'},
68 { 0 }
akmhoque59980a52012-08-09 12:36:09 -050069};
70
Obaid Amin2a928a52013-02-20 11:06:51 -060071 static int
akmhoque59980a52012-08-09 12:36:09 -050072usage(char *progname)
73{
74
Obaid Amin2a928a52013-02-20 11:06:51 -060075 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\
79 -p, --api_port port where api client will connect\n\
80 -h, --help Display this help message\n", progname);
akmhoque59980a52012-08-09 12:36:09 -050081
Obaid Amin2a928a52013-02-20 11:06:51 -060082 exit(1);
akmhoque59980a52012-08-09 12:36:09 -050083}
84
85void ndn_rtr_gettime(const struct ccn_gettime *self, struct ccn_timeval *result)
86{
Obaid Amin2a928a52013-02-20 11:06:51 -060087 struct timeval now = {0};
88 gettimeofday(&now, 0);
89 result->s = now.tv_sec;
90 result->micros = now.tv_usec;
akmhoque59980a52012-08-09 12:36:09 -050091}
92
93static struct ccn_gettime ndn_rtr_ticker = {
Obaid Amin2a928a52013-02-20 11:06:51 -060094 "timer",
95 &ndn_rtr_gettime,
96 1000000,
97 NULL
akmhoque59980a52012-08-09 12:36:09 -050098};
99
Obaid Amin2a928a52013-02-20 11:06:51 -0600100 void
akmhoqueffacaa82012-09-13 17:48:30 -0500101nlsr_lock(void)
102{
103 nlsr->semaphor=NLSR_LOCKED;
104}
105
Obaid Amin2a928a52013-02-20 11:06:51 -0600106 void
akmhoqueffacaa82012-09-13 17:48:30 -0500107nlsr_unlock(void)
108{
109 nlsr->semaphor=NLSR_UNLOCKED;
110}
akmhoque42098b12012-08-27 22:54:23 -0500111
Obaid Amin2a928a52013-02-20 11:06:51 -0600112 void
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);
Obaid Amin2a928a52013-02-20 11:06:51 -0600116 nlsr_destroy();
akmhoqueffacaa82012-09-13 17:48:30 -0500117 exit(0);
akmhoque59980a52012-08-09 12:36:09 -0500118}
119
Obaid Amin2a928a52013-02-20 11:06:51 -0600120 void
akmhoquebfefef22012-09-26 10:09:34 -0500121daemonize_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600138
akmhoquebfefef22012-09-26 10:09:34 -0500139 umask(0);
140 sid = setsid();
141 if(sid < 0)
142 {
143 ON_ERROR_DESTROY(sid);
144 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600145
akmhoquebfefef22012-09-26 10:09:34 -0500146 chdir("/");
147 close(STDIN_FILENO);
148 close(STDOUT_FILENO);
149 close(STDERR_FILENO);
150}
151
Obaid Amin2a928a52013-02-20 11:06:51 -0600152 void
akmhoque59980a52012-08-09 12:36:09 -0500153process_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
Obaid Amin2a928a52013-02-20 11:06:51 -0600192
akmhoqueb77b95f2013-02-08 12:28:47 -0600193 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);
Obaid Amin2a928a52013-02-20 11:06:51 -0600215
akmhoque03004e62012-09-06 01:12:28 -0500216
217 free(nbr->name);
218 free(nbr);
219}
220
Obaid Amin2a928a52013-02-20 11:06:51 -0600221 void
akmhoque03004e62012-09-06 01:12:28 -0500222process_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
Obaid Amin2a928a52013-02-20 11:06:51 -0600258 void
akmhoque03004e62012-09-06 01:12:28 -0500259process_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600276
akmhoque03004e62012-09-06 01:12:28 -0500277
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/*
Obaid Amin2a928a52013-02-20 11:06:51 -0600289 void
290 process_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;
akmhoqued79438d2012-08-27 13:31:42 -0500301
Obaid Amin2a928a52013-02-20 11:06:51 -0600302 secs=strtok_r(command,sep,&rem);
303 if(secs==NULL)
304 {
305 printf(" Wrong Command Format ( lsdb-synch-interval secs)\n");
306 return;
307 }
akmhoqued79438d2012-08-27 13:31:42 -0500308
Obaid Amin2a928a52013-02-20 11:06:51 -0600309 seconds=atoi(secs);
310 if ( seconds >= 120 && seconds <= 3600 )
311 {
312 nlsr->lsdb_synch_interval=seconds;
313 }
akmhoqued79438d2012-08-27 13:31:42 -0500314
Obaid Amin2a928a52013-02-20 11:06:51 -0600315 }
316 */
317
318 void
akmhoqued79438d2012-08-27 13:31:42 -0500319process_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;
Obaid Amin2a928a52013-02-20 11:06:51 -0600330
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
Obaid Amin2a928a52013-02-20 11:06:51 -0600346 void
akmhoqued79438d2012-08-27 13:31:42 -0500347process_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;
Obaid Amin2a928a52013-02-20 11:06:51 -0600358
akmhoqued79438d2012-08-27 13:31:42 -0500359 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
Obaid Amin2a928a52013-02-20 11:06:51 -0600374 void
akmhoqued5152122012-09-19 06:44:23 -0500375process_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;
Obaid Amin2a928a52013-02-20 11:06:51 -0600386
akmhoqued5152122012-09-19 06:44:23 -0500387 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
Obaid Amin2a928a52013-02-20 11:06:51 -0600406 void
akmhoqued5152122012-09-19 06:44:23 -0500407process_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;
Obaid Amin2a928a52013-02-20 11:06:51 -0600418
akmhoqued5152122012-09-19 06:44:23 -0500419 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
Obaid Amin2a928a52013-02-20 11:06:51 -0600438 void
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;
Obaid Amin2a928a52013-02-20 11:06:51 -0600450
akmhoque3cced642012-09-24 16:20:20 -0500451 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
Obaid Amin2a928a52013-02-20 11:06:51 -0600466 void
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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600484
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
Obaid Amin2a928a52013-02-20 11:06:51 -0600490 void
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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600508
akmhoque7b791452012-10-30 11:24:56 -0500509 if ( strcmp(on_off,"ON") == 0 || strcmp(on_off,"on") == 0)
510 {
511 nlsr->detailed_logging=1;
512 }
513}
514
Obaid Amin2a928a52013-02-20 11:06:51 -0600515 void
akmhoque7b791452012-10-30 11:24:56 -0500516process_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600533
akmhoque7b791452012-10-30 11:24:56 -0500534 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
Obaid Amin2a928a52013-02-20 11:06:51 -0600541 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600542process_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));
akmhoqueb77b95f2013-02-08 12:28:47 -0600567 memcpy(nlsr->topo_prefix,topo_prefix,strlen(topo_prefix));
Obaid Amin0e9a3002013-02-20 14:55:37 -0600568 printf ("Topo prefix is: %s", nlsr->topo_prefix);;
akmhoqueb77b95f2013-02-08 12:28:47 -0600569 }
570}
571
572
Obaid Amin2a928a52013-02-20 11:06:51 -0600573 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600574process_command_slice_prefix(char *command)
575{
576 if(command==NULL)
577 {
578 printf(" Wrong Command Format ( slice-prefix /name/prefix )\n");
579 return;
580 }
581 char *rem;
582 const char *sep=" \t\n";
583 char *slice_prefix;
584
585 slice_prefix=strtok_r(command,sep,&rem);
586 if(slice_prefix==NULL)
587 {
588 printf(" Wrong Command Format ( slice-prefix /name/prefix )\n");
589 return;
590 }
591 else
592 {
593 if ( nlsr->slice_prefix != NULL)
594 free(nlsr->slice_prefix);
595 if ( slice_prefix[strlen(slice_prefix)-1] == '/' )
596 slice_prefix[strlen(slice_prefix)-1]='\0';
597
akmhoque7c234e02013-02-13 11:23:56 -0600598 nlsr->slice_prefix=(char *)calloc(strlen(slice_prefix)+1,sizeof(char));
akmhoqueb77b95f2013-02-08 12:28:47 -0600599 memcpy(nlsr->slice_prefix,slice_prefix,strlen(slice_prefix));
600 }
601}
602
Obaid Amin2a928a52013-02-20 11:06:51 -0600603 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600604process_command_hyperbolic_routing(char *command)
605{
606 if(command==NULL)
607 {
608 printf(" Wrong Command Format ( hyperbolic-routing on)\n");
609 return;
610 }
611 char *rem;
612 const char *sep=" \t\n";
613 char *on_off;
614
615 on_off=strtok_r(command,sep,&rem);
616 if(on_off==NULL)
617 {
618 printf(" Wrong Command Format ( hyperbolic-routing on )\n");
619 return;
620 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600621
akmhoqueb77b95f2013-02-08 12:28:47 -0600622 if ( strcmp(on_off,"ON") == 0 || strcmp(on_off,"on") == 0 )
623 {
624 nlsr->is_hyperbolic_calc=1;
625 }
626}
627
Obaid Amin2a928a52013-02-20 11:06:51 -0600628 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600629process_command_hyperbolic_cordinate(char *command)
630{
631 if(command==NULL)
632 {
633 printf(" Wrong Command Format ( hyperbolic r 0 )\n");
634 return;
635 }
636
637 char *rem;
638 const char *sep=" \t\n\r";
639 char *radious;
640 char *theta;
641
642 radious=strtok_r(command,sep,&rem);
643 if (radious == NULL )
644 {
645 printf(" Wrong Command Format ( hyperbolic r 0 )\n");
646 return;
647 }
648
649 theta=strtok_r(NULL,sep,&rem);
650 if (theta == NULL )
651 {
652 printf(" Wrong Command Format ( hyperbolic r 0 )\n");
653 return;
654 }
655
656 nlsr->cor_r=strtof(radious,NULL);
657 nlsr->cor_theta=strtof(theta,NULL);
658
659}
660
Obaid Amin2a928a52013-02-20 11:06:51 -0600661 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600662process_command_tunnel_type(char *command)
663{
664 if(command==NULL)
665 {
666 printf(" Wrong Command Format ( tunnel-type udp/tcp)\n");
667 return;
668 }
669 char *rem;
670 const char *sep=" \t\n";
671 char *on_off;
672
673 on_off=strtok_r(command,sep,&rem);
674 if(on_off==NULL)
675 {
676 printf(" Wrong Command Format ( tunnel-type udp/tcp )\n");
677 return;
678 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600679
akmhoqueb77b95f2013-02-08 12:28:47 -0600680 if ( strcmp(on_off,"TCP") == 0 || strcmp(on_off,"tcp") == 0 )
681 {
682 nlsr->tunnel_type=IPPROTO_TCP;
683 }
684 else if ( strcmp(on_off,"UDP") == 0 || strcmp(on_off,"udp") == 0 )
685 {
686 nlsr->tunnel_type=IPPROTO_UDP;
687 }
688}
689
Obaid Amin2a928a52013-02-20 11:06:51 -0600690 void
akmhoque59980a52012-08-09 12:36:09 -0500691process_conf_command(char *command)
692{
693 const char *separators=" \t\n";
694 char *remainder=NULL;
695 char *cmd_type=NULL;
696
697 if(command==NULL || strlen(command)==0 || command[0]=='!')
698 return;
699
700 cmd_type=strtok_r(command,separators,&remainder);
701
702 if(!strcmp(cmd_type,"router-name") )
703 {
704 process_command_router_name(remainder);
705 }
706 else if(!strcmp(cmd_type,"ccnneighbor") )
707 {
708 process_command_ccnneighbor(remainder);
709 }
710 else if(!strcmp(cmd_type,"ccnname") )
711 {
712 process_command_ccnname(remainder);
713 }
akmhoqued79438d2012-08-27 13:31:42 -0500714 else if(!strcmp(cmd_type,"interest-retry") )
715 {
716 process_command_interest_retry(remainder);
717 }
718 else if(!strcmp(cmd_type,"interest-resend-time") )
719 {
720 process_command_interest_resend_time(remainder);
721 }
akmhoqued5152122012-09-19 06:44:23 -0500722 else if(!strcmp(cmd_type,"lsa-refresh-time") )
723 {
724 process_command_lsa_refresh_time(remainder);
725 }
726 else if(!strcmp(cmd_type,"router-dead-interval") )
727 {
728 process_command_router_dead_interval(remainder);
729 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600730 else if(!strcmp(cmd_type,"max-faces-per-prefix") )
akmhoque3cced642012-09-24 16:20:20 -0500731 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600732 process_command_max_faces_per_prefix(remainder);
akmhoque3cced642012-09-24 16:20:20 -0500733 }
akmhoquebfefef22012-09-26 10:09:34 -0500734 else if(!strcmp(cmd_type,"logdir") )
735 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600736 process_command_logdir(remainder);
akmhoquebfefef22012-09-26 10:09:34 -0500737 }
akmhoque7b791452012-10-30 11:24:56 -0500738 else if(!strcmp(cmd_type,"detailed-log") )
739 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600740 process_command_detailed_log(remainder);
akmhoque7b791452012-10-30 11:24:56 -0500741 }
742 else if(!strcmp(cmd_type,"debug") )
743 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600744 process_command_debug(remainder);
akmhoque7b791452012-10-30 11:24:56 -0500745 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600746 else if(!strcmp(cmd_type,"topo-prefix") )
747 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600748 process_command_topo_prefix(remainder);
akmhoqueb77b95f2013-02-08 12:28:47 -0600749 }
750 else if(!strcmp(cmd_type,"slice-prefix") )
751 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600752 process_command_slice_prefix(remainder);
akmhoqueb77b95f2013-02-08 12:28:47 -0600753 }
754 else if(!strcmp(cmd_type,"hyperbolic-cordinate") )
755 {
756 process_command_hyperbolic_cordinate(remainder);
757 }
758 else if(!strcmp(cmd_type,"hyperbolic-routing") )
759 {
760 process_command_hyperbolic_routing(remainder);
761 }
762 else if(!strcmp(cmd_type,"tunnel-type") )
763 {
764 process_command_tunnel_type(remainder);
765 }
akmhoqued5152122012-09-19 06:44:23 -0500766 else
akmhoque59980a52012-08-09 12:36:09 -0500767 {
768 printf("Wrong configuration Command %s \n",cmd_type);
769 }
770}
771
akmhoque03004e62012-09-06 01:12:28 -0500772
Obaid Amin0e9a3002013-02-20 14:55:37 -0600773 int
akmhoque59980a52012-08-09 12:36:09 -0500774readConfigFile(const char *filename)
775{
776 FILE *cfg;
777 char buf[1024];
778 int len;
779
780 cfg=fopen(filename, "r");
781
782 if(cfg == NULL)
783 {
784 printf("\nConfiguration File does not exists\n");
Obaid Amin0e9a3002013-02-20 14:55:37 -0600785 return -1;
akmhoque59980a52012-08-09 12:36:09 -0500786 }
787
788 while(fgets((char *)buf, sizeof(buf), cfg))
789 {
790 len=strlen(buf);
791 if(buf[len-1] == '\n')
Obaid Amin2a928a52013-02-20 11:06:51 -0600792 buf[len-1]='\0';
akmhoqued5152122012-09-19 06:44:23 -0500793 if ( buf[0] != '#' && buf[0] != '!')
794 process_conf_command(buf);
akmhoque59980a52012-08-09 12:36:09 -0500795 }
796
797 fclose(cfg);
798
799 return 0;
800}
801
akmhoqueb77b95f2013-02-08 12:28:47 -0600802
Obaid Amin0e9a3002013-02-20 14:55:37 -0600803 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600804add_faces_for_nbrs(void)
805{
806 int i, adl_element;
807 struct ndn_neighbor *nbr;
808
809 struct hashtb_enumerator ee;
Obaid Amin2a928a52013-02-20 11:06:51 -0600810 struct hashtb_enumerator *e = &ee;
811
812 hashtb_start(nlsr->adl, e);
akmhoqueb77b95f2013-02-08 12:28:47 -0600813 adl_element=hashtb_n(nlsr->adl);
814
815 for(i=0;i<adl_element;i++)
816 {
817 nbr=e->data;
Obaid Amin2a928a52013-02-20 11:06:51 -0600818 int face_id=add_ccn_face(nlsr->ccn, (const char *)nbr->neighbor->name,
Obaid Amin0e9a3002013-02-20 14:55:37 -0600819 (const char *)nbr->ip_address, 9695,nlsr->tunnel_type);
akmhoqueb77b95f2013-02-08 12:28:47 -0600820 update_face_to_adl_for_nbr(nbr->neighbor->name, face_id);
Obaid Amin2a928a52013-02-20 11:06:51 -0600821 add_delete_ccn_face_by_face_id(nlsr->ccn,
822 (const char *)nlsr->topo_prefix, OP_REG, face_id);
823 add_delete_ccn_face_by_face_id(nlsr->ccn,
824 (const char *)nlsr->slice_prefix, OP_REG, face_id);
akmhoqueb77b95f2013-02-08 12:28:47 -0600825 hashtb_next(e);
826 }
827
828 hashtb_end(e);
829
830}
831
Obaid Amin0e9a3002013-02-20 14:55:37 -0600832 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600833destroy_faces_for_nbrs(void)
834{
835 int i, adl_element;
836 struct ndn_neighbor *nbr;
837
838 struct hashtb_enumerator ee;
Obaid Amin2a928a52013-02-20 11:06:51 -0600839 struct hashtb_enumerator *e = &ee;
840
841 hashtb_start(nlsr->adl, e);
akmhoqueb77b95f2013-02-08 12:28:47 -0600842 adl_element=hashtb_n(nlsr->adl);
843
844 for(i=0;i<adl_element;i++)
845 {
846 nbr=e->data;
847 if ( nbr->face > 0 )
848 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600849 add_delete_ccn_face_by_face_id(nlsr->ccn,
850 (const char *)nlsr->topo_prefix, OP_UNREG, nbr->face);
851 add_delete_ccn_face_by_face_id(nlsr->ccn,
852 (const char *)nbr->neighbor->name,OP_UNREG,nbr->face);
853 add_delete_ccn_face_by_face_id(nlsr->ccn,
854 (const char *)nlsr->slice_prefix, OP_UNREG, nbr->face);
akmhoqueb77b95f2013-02-08 12:28:47 -0600855 }
856 hashtb_next(e);
857 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600858 hashtb_end(e);
akmhoqueb77b95f2013-02-08 12:28:47 -0600859}
860
Obaid Amin0e9a3002013-02-20 14:55:37 -0600861 char *
akmhoque562caef2012-11-09 13:29:06 -0600862process_api_client_command(char *command)
863{
864 char *msg;
865 msg=(char *)malloc(100);
akmhoqueb77b95f2013-02-08 12:28:47 -0600866 memset(msg,0,100);
Obaid Amin2a928a52013-02-20 11:06:51 -0600867
akmhoque3171d652012-11-13 11:44:33 -0600868 const char *sep=" \t\n";
869 char *rem=NULL;
870 char *cmd_type=NULL;
871 char *op_type=NULL;
872 char *name=NULL;
873 char *face=NULL;
874 int face_id;
875 int res;
876
877 op_type=strtok_r(command,sep,&rem);
878 cmd_type=strtok_r(NULL,sep,&rem);
879 name=strtok_r(NULL,sep,&rem);
880 if ( name[strlen(name)-1] == '/' )
881 name[strlen(name)-1]='\0';
882
Obaid Amin2a928a52013-02-20 11:06:51 -0600883 struct name_prefix *np=(struct name_prefix *) calloc (1,
Obaid Amin0e9a3002013-02-20 14:55:37 -0600884 sizeof(struct name_prefix ));
Obaid Amin2a928a52013-02-20 11:06:51 -0600885 np->name = (char *) calloc (strlen(name)+1,sizeof(char));
akmhoque3171d652012-11-13 11:44:33 -0600886 memcpy(np->name,name,strlen(name)+1);
887 np->length=strlen(name)+1;
888
889 if ( strcmp(cmd_type,"name")!= 0 )
890 {
891 face=strtok_r(NULL,sep,&rem);
892 sscanf(face,"face%d",&face_id);
893 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600894
akmhoque3171d652012-11-13 11:44:33 -0600895 if ( strcmp(cmd_type,"name")== 0 )
896 {
897 if ( strcmp(op_type,"del") == 0 )
898 {
899 res=does_name_exist_in_npl(np);
900 if ( res == 0)
901 {
902 sprintf(msg,"Name %s does not exist !!",name);
903 }
904 else
905 {
906 long int ls_id=get_lsa_id_from_npl(np);
907 if ( ls_id != 0 )
908 {
909 make_name_lsa_invalid(np,LS_TYPE_NAME,ls_id);
910 sprintf(msg,"Name %s has been deleted and Advertised.",name);
911 }
912 else
913 {
914 sprintf(msg,"Name %s does not have an Name LSA yet !!",name);
915 }
916 }
917 }
918 else if ( strcmp(op_type,"add") == 0 )
919 {
920 res=does_name_exist_in_npl(np);
921 if ( res == 0)
922 {
923 add_name_to_npl(np);
924 build_and_install_single_name_lsa(np);
925 sprintf(msg,"Name %s has been added to advertise.",name);
926 }
927 else
928 {
929 sprintf(msg,"Name %s has already been advertised from this router !!",name);
930 }
931 }
932 }
933 else if ( strcmp(cmd_type,"neighbor") == 0 )
934 {
935 if ( strcmp(op_type,"del") == 0 )
936 {
937 res=is_neighbor(np->name);
938 if ( res == 0)
939 {
940 sprintf(msg,"Neighbor %s does not exist !!",name);
941 }
942 else
943 {
944 update_adjacent_status_to_adl(np,NBR_DOWN);
akmhoqueb77b95f2013-02-08 12:28:47 -0600945 int face_id=get_next_hop_face_from_adl(np->name);
946 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)np->name, OP_UNREG, face_id);
947 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->topo_prefix, OP_UNREG, face_id);
948 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->slice_prefix, OP_UNREG, face_id);
akmhoque3171d652012-11-13 11:44:33 -0600949 delete_nbr_from_adl(np);
950 if(!nlsr->is_build_adj_lsa_sheduled)
951 {
952 nlsr->event_build_adj_lsa = ccn_schedule_event(nlsr->sched, 1000, &build_and_install_adj_lsa, NULL, 0);
953 nlsr->is_build_adj_lsa_sheduled=1;
954 }
955 sprintf(msg,"Neighbor %s has been deleted from adjacency list.",name);
956 }
957 }
958 else if ( strcmp(op_type,"add") == 0 )
959 {
960 res=is_neighbor(np->name);
961 if ( res == 0 )
962 {
akmhoque7c234e02013-02-13 11:23:56 -0600963 struct name_prefix *nbr_name=(struct name_prefix *)calloc(1,sizeof(struct name_prefix ));
akmhoqueb77b95f2013-02-08 12:28:47 -0600964 get_host_name_from_command_string(nbr_name,np->name,0);
965 printf("Hostname of neighbor: %s ",nbr_name->name);
966
akmhoque7c234e02013-02-13 11:23:56 -0600967 char *ip_addr=(char *)calloc(20,sizeof(char));
968 //memset(ip_addr,0,20);
akmhoqueb77b95f2013-02-08 12:28:47 -0600969 get_ip_from_hostname_02(nbr_name->name,ip_addr);
970 printf("IP Address: %s \n",ip_addr);
971 int face_id=add_ccn_face(nlsr->ccn, (const char *)nbr_name->name, (const char *)ip_addr, 9695,nlsr->tunnel_type);
972 update_face_to_adl_for_nbr(nbr_name->name, face_id);
973 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->topo_prefix, OP_REG, face_id);
974 add_delete_ccn_face_by_face_id(nlsr->ccn, (const char *)nlsr->slice_prefix, OP_REG, face_id);
975
976 add_nbr_to_adl(np,face_id,ip_addr);
977
akmhoque3171d652012-11-13 11:44:33 -0600978 sprintf(msg,"Neighbor %s has been added to adjacency list.",name);
akmhoque7c234e02013-02-13 11:23:56 -0600979 free(ip_addr);
akmhoqueb77b95f2013-02-08 12:28:47 -0600980
akmhoque3171d652012-11-13 11:44:33 -0600981 }
982 else
983 {
984 sprintf(msg,"Neighbor %s already exists in adjacency list.",name);
985 }
986 }
987 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600988
akmhoque562caef2012-11-09 13:29:06 -0600989
990 return msg;
991}
akmhoque1771c412012-11-09 13:06:08 -0600992
Obaid Amin2a928a52013-02-20 11:06:51 -0600993 int
akmhoque1771c412012-11-09 13:06:08 -0600994nlsr_api_server_poll(long int time_out_micro_sec, int ccn_fd)
995{
996 struct timeval timeout;
akmhoqueb77b95f2013-02-08 12:28:47 -0600997 if (time_out_micro_sec< 500000 && time_out_micro_sec> 0 )
akmhoque1771c412012-11-09 13:06:08 -0600998 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600999 timeout.tv_sec=0;
1000 timeout.tv_usec=time_out_micro_sec;
akmhoque1771c412012-11-09 13:06:08 -06001001 }
akmhoqueb77b95f2013-02-08 12:28:47 -06001002 else
akmhoque1771c412012-11-09 13:06:08 -06001003 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001004 timeout.tv_sec = 0;
1005 timeout.tv_usec = 500000;
akmhoque1771c412012-11-09 13:06:08 -06001006 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001007
akmhoque1771c412012-11-09 13:06:08 -06001008 int fd;
1009 int nread;
1010 int result;
1011 fd_set testfds;
1012 unsigned int client_len;
1013 int client_sockfd;
1014 char recv_buffer[1024];
1015 bzero(recv_buffer,1024);
akmhoque95041802012-11-16 09:18:02 -06001016 struct sockaddr_in client_address;
akmhoque1771c412012-11-09 13:06:08 -06001017
1018 testfds=nlsr->readfds;
1019 result = select(FD_SETSIZE, &testfds, NULL,NULL, &timeout);
Obaid Amin2a928a52013-02-20 11:06:51 -06001020
akmhoqueb77b95f2013-02-08 12:28:47 -06001021 for(fd = 0; fd < FD_SETSIZE && result > 0; fd++)
akmhoque1771c412012-11-09 13:06:08 -06001022 {
1023 if(FD_ISSET(fd,&testfds))
1024 {
1025 if ( fd == ccn_fd )
1026 {
1027 return 0;
1028 }
1029 else if(fd == nlsr->nlsr_api_server_sock_fd)
1030 {
1031 client_len = sizeof(client_address);
1032 client_sockfd = accept(nlsr->nlsr_api_server_sock_fd,(struct sockaddr *)&client_address, &client_len);
1033 FD_SET(client_sockfd, &nlsr->readfds);
1034 }
1035 else
1036 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001037
akmhoque1771c412012-11-09 13:06:08 -06001038 ioctl(fd, FIONREAD, &nread);
1039 if(nread == 0)
1040 {
1041 close(fd);
1042 FD_CLR(fd, &nlsr->readfds);
1043 }
1044 else
1045 {
1046 recv(fd, recv_buffer, 1024, 0);
akmhoqueb77b95f2013-02-08 12:28:47 -06001047 printf("Received Data from NLSR API cleint: %s \n",recv_buffer);
akmhoque562caef2012-11-09 13:29:06 -06001048 char *msg=process_api_client_command(recv_buffer);
1049 send(fd, msg, strlen(msg),0);
1050 free(msg);
akmhoque1771c412012-11-09 13:06:08 -06001051 close(fd);
1052 FD_CLR(fd, &nlsr->readfds);
akmhoque1771c412012-11-09 13:06:08 -06001053 }
1054 }
1055 }
1056 }
1057
1058 return 0;
1059}
1060
Obaid Amin2a928a52013-02-20 11:06:51 -06001061 int
akmhoqueb77b95f2013-02-08 12:28:47 -06001062check_config_validity()
1063{
1064 if (nlsr->router_name == NULL )
1065 {
1066 fprintf(stderr,"Router name has not been configured :(\n");
1067 return -1;
1068 }
1069 if ( nlsr->is_hyperbolic_calc == 1 && (nlsr->cor_r == -1.0 && nlsr->cor_theta== -1.0) )
1070 {
1071 fprintf(stderr,"Hyperbolic codinate has not been defined :(\n");
1072 return -1;
1073 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001074
akmhoqueb77b95f2013-02-08 12:28:47 -06001075 return 0;
1076}
1077
Obaid Amin2a928a52013-02-20 11:06:51 -06001078 void
akmhoque386081b2012-08-10 10:53:21 -05001079nlsr_destroy( void )
1080{
akmhoque7b791452012-10-30 11:24:56 -05001081 if ( nlsr->debugging )
1082 {
1083 printf("Freeing Allocated Memory....\n");
1084 }
akmhoque9e9fc722012-09-26 14:03:25 -05001085 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Freeing Allocated Memory....\n");
akmhoquefbfd0982012-09-09 20:59:03 -05001086 /* Destroying all face created by nlsr in CCND */
1087 destroy_all_face_by_nlsr();
akmhoqueb77b95f2013-02-08 12:28:47 -06001088 destroy_faces_for_nbrs();
Obaid Amin0e9a3002013-02-20 14:55:37 -06001089
akmhoque386081b2012-08-10 10:53:21 -05001090 /* Destroying every hash table attached to each neighbor in ADL before destorying ADL */
akmhoque7c234e02013-02-13 11:23:56 -06001091 hashtb_destroy(&nlsr->adl);
1092 hashtb_destroy(&nlsr->npl);
1093 hashtb_destroy(&nlsr->pit_alsa);
akmhoque03004e62012-09-06 01:12:28 -05001094 hashtb_destroy(&nlsr->lsdb->name_lsdb);
1095 hashtb_destroy(&nlsr->lsdb->adj_lsdb);
akmhoque7c234e02013-02-13 11:23:56 -06001096 hashtb_destroy(&nlsr->lsdb->cor_lsdb);
akmhoque3cced642012-09-24 16:20:20 -05001097
akmhoque7c234e02013-02-13 11:23:56 -06001098 int i, npt_element,rt_element;
akmhoque3560cb62012-09-09 10:52:30 -05001099 struct npt_entry *ne;
1100 struct hashtb_enumerator ee;
Obaid Amin2a928a52013-02-20 11:06:51 -06001101 struct hashtb_enumerator *e = &ee;
1102 hashtb_start(nlsr->npt, e);
akmhoque3560cb62012-09-09 10:52:30 -05001103 npt_element=hashtb_n(nlsr->npt);
1104 for(i=0;i<npt_element;i++)
1105 {
1106 ne=e->data;
akmhoque3cced642012-09-24 16:20:20 -05001107 hashtb_destroy(&ne->name_list);
1108 hashtb_destroy(&ne->face_list);
akmhoque3560cb62012-09-09 10:52:30 -05001109 hashtb_next(e);
1110 }
1111
1112 hashtb_end(e);
1113 hashtb_destroy(&nlsr->npt);
Obaid Amin2a928a52013-02-20 11:06:51 -06001114
akmhoque7c234e02013-02-13 11:23:56 -06001115 struct routing_table_entry *rte;
1116 hashtb_start(nlsr->routing_table, e);
1117 rt_element=hashtb_n(nlsr->routing_table);
1118 for(i=0;i<rt_element;i++)
1119 {
1120 rte=e->data;
1121 hashtb_destroy(&rte->face_list);
1122 hashtb_next(e);
1123 }
1124 hashtb_end(e);
1125 hashtb_destroy(&nlsr->routing_table);
Obaid Amin2a928a52013-02-20 11:06:51 -06001126
akmhoque7c234e02013-02-13 11:23:56 -06001127 if ( nlsr->ccns != NULL )
1128 ccns_close(&nlsr->ccns, NULL, NULL);
1129 if ( nlsr->slice != NULL )
1130 ccns_slice_destroy(&nlsr->slice);
akmhoque3560cb62012-09-09 10:52:30 -05001131
akmhoque7c234e02013-02-13 11:23:56 -06001132 close(nlsr->nlsr_api_server_sock_fd);
akmhoque95041802012-11-16 09:18:02 -06001133
akmhoque866c2222013-02-12 10:49:33 -06001134 ccn_destroy(&nlsr->ccn);
akmhoque03004e62012-09-06 01:12:28 -05001135 free(nlsr->lsdb->lsdb_version);
1136 free(nlsr->lsdb);
1137 free(nlsr->router_name);
akmhoque7b791452012-10-30 11:24:56 -05001138 if ( nlsr->debugging )
1139 {
1140 printf("Finished freeing allocated memory\n");
1141 }
akmhoque9e9fc722012-09-26 14:03:25 -05001142 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Finished freeing allocated memory\n");
Obaid Amin2a928a52013-02-20 11:06:51 -06001143
akmhoque7c234e02013-02-13 11:23:56 -06001144 free(nlsr);
akmhoque53f64222012-09-05 13:57:51 -05001145
akmhoque386081b2012-08-10 10:53:21 -05001146}
1147
akmhoque03004e62012-09-06 01:12:28 -05001148
akmhoqueb77b95f2013-02-08 12:28:47 -06001149
Obaid Amin0e9a3002013-02-20 14:55:37 -06001150 void
akmhoque1771c412012-11-09 13:06:08 -06001151init_api_server(int ccn_fd)
1152{
1153 int server_sockfd;
1154 int server_len;
akmhoque95041802012-11-16 09:18:02 -06001155 struct sockaddr_in server_address;
akmhoquef31f13b2012-11-16 09:42:24 -06001156 unsigned int yes=1;
1157
akmhoque95041802012-11-16 09:18:02 -06001158 server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
akmhoque1771c412012-11-09 13:06:08 -06001159
1160 int flags = fcntl(server_sockfd, F_GETFL, 0);
1161 fcntl(server_sockfd, F_SETFL, O_NONBLOCK|flags);
1162
akmhoquef31f13b2012-11-16 09:42:24 -06001163 if (setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)
1164 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001165 ON_ERROR_DESTROY(-1);
1166 }
akmhoque95041802012-11-16 09:18:02 -06001167
1168 server_address.sin_family = AF_INET;
Adam Alyyanb5fff372013-01-09 14:32:52 -06001169 server_address.sin_addr.s_addr = INADDR_ANY;
1170 server_address.sin_port = htons(nlsr->api_port);
akmhoque95041802012-11-16 09:18:02 -06001171
akmhoque1771c412012-11-09 13:06:08 -06001172 server_len = sizeof(server_address);
1173 bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
1174 listen(server_sockfd, 100);
1175 FD_ZERO(&nlsr->readfds);
1176 FD_SET(server_sockfd, &nlsr->readfds);
1177 FD_SET(ccn_fd, &nlsr->readfds);
1178 nlsr->nlsr_api_server_sock_fd=server_sockfd;
akmhoque1771c412012-11-09 13:06:08 -06001179}
1180
Obaid Amin0e9a3002013-02-20 14:55:37 -06001181 int
akmhoque902d57e2012-08-17 09:24:38 -05001182init_nlsr(void)
akmhoque59980a52012-08-09 12:36:09 -05001183{
akmhoque03004e62012-09-06 01:12:28 -05001184 if (signal(SIGQUIT, nlsr_stop_signal_handler ) == SIG_ERR)
1185 {
1186 perror("SIGQUIT install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001187 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001188 }
1189 if (signal(SIGTERM, nlsr_stop_signal_handler ) == SIG_ERR)
1190 {
1191 perror("SIGTERM install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001192 return -1;
Obaid Amin2a928a52013-02-20 11:06:51 -06001193 }
1194 if (signal(SIGINT, nlsr_stop_signal_handler ) == SIG_ERR)
akmhoque03004e62012-09-06 01:12:28 -05001195 {
1196 perror("SIGTERM install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001197 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001198 }
akmhoque902d57e2012-08-17 09:24:38 -05001199
akmhoque7c234e02013-02-13 11:23:56 -06001200 nlsr=(struct nlsr *)calloc(1,sizeof(struct nlsr));
Obaid Amin2a928a52013-02-20 11:06:51 -06001201
1202 nlsr->adl=hashtb_create(sizeof(struct ndn_neighbor), NULL);
1203 nlsr->npl = hashtb_create(sizeof(struct name_prefix_list_entry), NULL);
1204 nlsr->pit_alsa = hashtb_create(sizeof(struct pending_interest), NULL);
1205 nlsr->npt = hashtb_create(sizeof(struct npt_entry), NULL);
1206 nlsr->routing_table = hashtb_create(sizeof(struct routing_table_entry), NULL);
akmhoque29c1db52012-09-07 14:47:43 -05001207
akmhoque59980a52012-08-09 12:36:09 -05001208 nlsr->in_interest.p = &incoming_interest;
1209 nlsr->in_content.p = &incoming_content;
akmhoque07dd8cc2012-08-16 10:23:01 -05001210
akmhoque03004e62012-09-06 01:12:28 -05001211 nlsr->lsdb=(struct linkStateDatabase *)malloc(sizeof(struct linkStateDatabase));
akmhoque07dd8cc2012-08-16 10:23:01 -05001212
Obaid Amin0e9a3002013-02-20 14:55:37 -06001213 char *time_stamp=(char *) calloc (20,sizeof(char));
akmhoque7c234e02013-02-13 11:23:56 -06001214 //memset(time_stamp,0,20);
akmhoque03004e62012-09-06 01:12:28 -05001215 get_current_timestamp_micro(time_stamp);
1216 nlsr->lsdb->lsdb_version=(char *)malloc(strlen(time_stamp)+1);
akmhoqueb77b95f2013-02-08 12:28:47 -06001217 memset(nlsr->lsdb->lsdb_version,0,strlen(time_stamp));
akmhoque03004e62012-09-06 01:12:28 -05001218 free(time_stamp);
akmhoque902d57e2012-08-17 09:24:38 -05001219
Obaid Amin2a928a52013-02-20 11:06:51 -06001220 nlsr->lsdb->adj_lsdb = hashtb_create(sizeof(struct alsa), NULL);
1221 nlsr->lsdb->name_lsdb = hashtb_create(sizeof(struct nlsa), NULL);
1222 nlsr->lsdb->cor_lsdb = hashtb_create(sizeof(struct clsa), NULL);
akmhoque53f64222012-09-05 13:57:51 -05001223
akmhoque59980a52012-08-09 12:36:09 -05001224 nlsr->is_synch_init=1;
akmhoquec9286692012-08-16 09:57:58 -05001225 nlsr->nlsa_id=0;
akmhoqued79438d2012-08-27 13:31:42 -05001226 nlsr->adj_build_flag=0;
akmhoque53f64222012-09-05 13:57:51 -05001227 nlsr->adj_build_count=0;
1228 nlsr->is_build_adj_lsa_sheduled=0;
akmhoque29c1db52012-09-07 14:47:43 -05001229 nlsr->is_send_lsdb_interest_scheduled=0;
1230 nlsr->is_route_calculation_scheduled=0;
akmhoqued79438d2012-08-27 13:31:42 -05001231
akmhoque7b791452012-10-30 11:24:56 -05001232 nlsr->detailed_logging=0;
1233 nlsr->debugging=0;
1234
akmhoqueb77b95f2013-02-08 12:28:47 -06001235 //nlsr->lsdb_synch_interval = LSDB_SYNCH_INTERVAL;
akmhoqued79438d2012-08-27 13:31:42 -05001236 nlsr->interest_retry = INTEREST_RETRY;
1237 nlsr->interest_resend_time = INTEREST_RESEND_TIME;
akmhoqueda5b6832012-09-13 22:33:55 -05001238 nlsr->lsa_refresh_time=LSA_REFRESH_TIME;
1239 nlsr->router_dead_interval=ROUTER_DEAD_INTERVAL;
akmhoqueb77b95f2013-02-08 12:28:47 -06001240 nlsr->max_faces_per_prefix=MAX_FACES_PER_PREFIX;
akmhoqueffacaa82012-09-13 17:48:30 -05001241 nlsr->semaphor=NLSR_UNLOCKED;
akmhoque81c25e02012-09-10 14:50:33 -05001242
akmhoque95041802012-11-16 09:18:02 -06001243 nlsr->api_port=API_PORT;
1244
akmhoque7c234e02013-02-13 11:23:56 -06001245 nlsr->topo_prefix=(char *)calloc(strlen("/ndn/routing/nlsr")+1,sizeof(char));
akmhoqueb77b95f2013-02-08 12:28:47 -06001246 memcpy(nlsr->topo_prefix,"/ndn/routing/nlsr",strlen("/ndn/routing/nlsr"));
1247
akmhoque7c234e02013-02-13 11:23:56 -06001248 nlsr->slice_prefix=(char *)calloc(strlen("/ndn/routing/nlsr/LSA")+1,sizeof(char));
akmhoqueb77b95f2013-02-08 12:28:47 -06001249 memcpy(nlsr->slice_prefix,"/ndn/routing/nlsr/LSA",strlen("/ndn/routing/nlsr/LSA"));
1250
1251 nlsr->is_hyperbolic_calc=0;
1252 nlsr->cor_r=-1.0;
1253 nlsr->cor_theta=-1.0;
1254
1255 nlsr->tunnel_type=IPPROTO_UDP;
1256
akmhoque81c25e02012-09-10 14:50:33 -05001257 return 0;
akmhoque902d57e2012-08-17 09:24:38 -05001258}
1259
Obaid Amin0e9a3002013-02-20 14:55:37 -06001260 int
akmhoque902d57e2012-08-17 09:24:38 -05001261main(int argc, char *argv[])
1262{
Obaid Amin2a928a52013-02-20 11:06:51 -06001263 int res, ret;
1264 char *config_file;
akmhoquebfefef22012-09-26 10:09:34 -05001265 int daemon_mode=0;
akmhoque95041802012-11-16 09:18:02 -06001266 int port=0;
akmhoque902d57e2012-08-17 09:24:38 -05001267
akmhoque95041802012-11-16 09:18:02 -06001268 while ((res = getopt_long(argc, argv, "df:p:h", longopts, 0)) != -1)
akmhoque59980a52012-08-09 12:36:09 -05001269 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001270 switch (res)
akmhoque59980a52012-08-09 12:36:09 -05001271 {
1272 case 'd':
akmhoquebfefef22012-09-26 10:09:34 -05001273 daemon_mode = 1;
akmhoque59980a52012-08-09 12:36:09 -05001274 break;
1275 case 'f':
1276 config_file = optarg;
1277 break;
akmhoque95041802012-11-16 09:18:02 -06001278 case 'p':
1279 port = atoi(optarg);
1280 break;
akmhoque59980a52012-08-09 12:36:09 -05001281 case 'h':
1282 default:
1283 usage(argv[0]);
1284 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001285 }
akmhoque59980a52012-08-09 12:36:09 -05001286
Obaid Amin2a928a52013-02-20 11:06:51 -06001287 ret = init_nlsr();
1288 ON_ERROR_EXIT(ret);
akmhoque95041802012-11-16 09:18:02 -06001289
1290 if ( port !=0 )
1291 nlsr->api_port=port;
1292
Obaid Amin0e9a3002013-02-20 14:55:37 -06001293 ON_ERROR_DESTROY(readConfigFile(config_file));
akmhoqueb77b95f2013-02-08 12:28:47 -06001294
1295 ON_ERROR_DESTROY(check_config_validity());
1296
1297 print_adjacent_from_adl();
1298
akmhoquebfefef22012-09-26 10:09:34 -05001299 if ( daemon_mode == 1 )
1300 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001301 nlsr->debugging=0;
akmhoquebfefef22012-09-26 10:09:34 -05001302 daemonize_nlsr();
1303 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001304
akmhoquebfefef22012-09-26 10:09:34 -05001305 startLogging(nlsr->logDir);
Obaid Amin2a928a52013-02-20 11:06:51 -06001306
akmhoque59980a52012-08-09 12:36:09 -05001307 nlsr->ccn=ccn_create();
akmhoque1771c412012-11-09 13:06:08 -06001308 int ccn_fd=ccn_connect(nlsr->ccn, NULL);
Obaid Amin0e9a3002013-02-20 14:55:37 -06001309
akmhoque1771c412012-11-09 13:06:08 -06001310 if(ccn_fd == -1)
akmhoque03004e62012-09-06 01:12:28 -05001311 {
1312 fprintf(stderr,"Could not connect to ccnd\n");
akmhoquebfefef22012-09-26 10:09:34 -05001313 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Could not connect to ccnd\n");
akmhoque81c25e02012-09-10 14:50:33 -05001314 ON_ERROR_DESTROY(-1);
akmhoque03004e62012-09-06 01:12:28 -05001315 }
akmhoque1771c412012-11-09 13:06:08 -06001316
1317 init_api_server(ccn_fd);
akmhoqueb77b95f2013-02-08 12:28:47 -06001318
1319 res=create_sync_slice(nlsr->topo_prefix, nlsr->slice_prefix);
Obaid Amin2a928a52013-02-20 11:06:51 -06001320
akmhoqueb77b95f2013-02-08 12:28:47 -06001321 if(res<0)
1322 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001323 fprintf(stderr, "Can not create slice for prefix %s\n",
Obaid Amin0e9a3002013-02-20 14:55:37 -06001324 nlsr->slice_prefix);
Obaid Amin2a928a52013-02-20 11:06:51 -06001325 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Can not create slice for"
Obaid Amin0e9a3002013-02-20 14:55:37 -06001326 "prefix %s\n",nlsr->slice_prefix);
akmhoqueb77b95f2013-02-08 12:28:47 -06001327 ON_ERROR_DESTROY(res);
1328 }
Obaid Amin0e9a3002013-02-20 14:55:37 -06001329
akmhoque53f64222012-09-05 13:57:51 -05001330 struct ccn_charbuf *router_prefix;
Obaid Amin0e9a3002013-02-20 14:55:37 -06001331
akmhoque03004e62012-09-06 01:12:28 -05001332 router_prefix=ccn_charbuf_create();
1333 res=ccn_name_from_uri(router_prefix,nlsr->router_name);
akmhoque59980a52012-08-09 12:36:09 -05001334 if(res<0)
akmhoque03004e62012-09-06 01:12:28 -05001335 {
1336 fprintf(stderr, "Bad ccn URI: %s\n",nlsr->router_name);
Obaid Amin2a928a52013-02-20 11:06:51 -06001337 writeLogg(__FILE__,__FUNCTION__,__LINE__,
Obaid Amin0e9a3002013-02-20 14:55:37 -06001338 "Bad ccn URI: %s\n", nlsr->router_name);
akmhoque81c25e02012-09-10 14:50:33 -05001339 ON_ERROR_DESTROY(res);
akmhoque03004e62012-09-06 01:12:28 -05001340 }
akmhoque59980a52012-08-09 12:36:09 -05001341
1342 ccn_name_append_str(router_prefix,"nlsr");
akmhoque03004e62012-09-06 01:12:28 -05001343 nlsr->in_interest.data=nlsr->router_name;
akmhoque59980a52012-08-09 12:36:09 -05001344 res=ccn_set_interest_filter(nlsr->ccn,router_prefix,&nlsr->in_interest);
1345 if ( res < 0 )
akmhoque03004e62012-09-06 01:12:28 -05001346 {
1347 fprintf(stderr,"Failed to register interest for router\n");
Obaid Amin2a928a52013-02-20 11:06:51 -06001348 writeLogg(__FILE__,__FUNCTION__,__LINE__,
Obaid Amin0e9a3002013-02-20 14:55:37 -06001349 "Failed to register interest for router\n");
akmhoque81c25e02012-09-10 14:50:33 -05001350 ON_ERROR_DESTROY(res);
akmhoque03004e62012-09-06 01:12:28 -05001351 }
1352 ccn_charbuf_destroy(&router_prefix);
Obaid Amin2a928a52013-02-20 11:06:51 -06001353
akmhoque7b791452012-10-30 11:24:56 -05001354 if ( nlsr->debugging )
1355 printf("Router Name : %s\n",nlsr->router_name);
akmhoque9e9fc722012-09-26 14:03:25 -05001356 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Router Name : %s\n",nlsr->router_name);
akmhoque7b791452012-10-30 11:24:56 -05001357 if ( nlsr->debugging )
1358 printf("lsdb_version: %s\n",nlsr->lsdb->lsdb_version);
akmhoque9e9fc722012-09-26 14:03:25 -05001359 writeLogg(__FILE__,__FUNCTION__,__LINE__,"lsdb_version: %s\n",nlsr->lsdb->lsdb_version);
akmhoque59980a52012-08-09 12:36:09 -05001360
akmhoqueb77b95f2013-02-08 12:28:47 -06001361 add_faces_for_nbrs();
akmhoque53f64222012-09-05 13:57:51 -05001362 print_name_prefix_from_npl();
1363 print_adjacent_from_adl();
akmhoqueb77b95f2013-02-08 12:28:47 -06001364 build_and_install_name_lsas();
1365
akmhoqueb77b95f2013-02-08 12:28:47 -06001366 print_name_lsdb();
1367 if ( nlsr->cor_r != -1.0 && nlsr->cor_theta != -1.0)
1368 {
1369 build_and_install_cor_lsa();
1370 }
1371 write_name_lsdb_to_repo(nlsr->slice_prefix);
akmhoque53f64222012-09-05 13:57:51 -05001372
1373 nlsr->sched = ccn_schedule_create(nlsr, &ndn_rtr_ticker);
akmhoque184dde02013-02-14 15:53:24 -06001374 ccn_set_schedule(nlsr->ccn,nlsr->sched);
akmhoque03004e62012-09-06 01:12:28 -05001375 nlsr->event_send_info_interest = ccn_schedule_event(nlsr->sched, 1, &send_info_interest, NULL, 0);
akmhoqueffacaa82012-09-13 17:48:30 -05001376 nlsr->event = ccn_schedule_event(nlsr->sched, 60000000, &refresh_lsdb, NULL, 0);
Obaid Amin2a928a52013-02-20 11:06:51 -06001377
akmhoque0678c5d2013-02-18 11:03:31 -06001378 res=sync_monitor(nlsr->topo_prefix,nlsr->slice_prefix);
1379 ON_ERROR_DESTROY(res);
akmhoque1c9b92f2012-08-13 10:57:50 -05001380
akmhoque59980a52012-08-09 12:36:09 -05001381 while(1)
akmhoque29c1db52012-09-07 14:47:43 -05001382 {
akmhoqueffacaa82012-09-13 17:48:30 -05001383 if ( nlsr->semaphor == NLSR_UNLOCKED )
akmhoque29c1db52012-09-07 14:47:43 -05001384 {
akmhoqueffacaa82012-09-13 17:48:30 -05001385 if( nlsr->sched != NULL )
1386 {
akmhoque1771c412012-11-09 13:06:08 -06001387 long int micro_sec=ccn_schedule_run(nlsr->sched);
1388 res=nlsr_api_server_poll(micro_sec,ccn_fd);
1389 ON_ERROR_DESTROY(res);
akmhoqueffacaa82012-09-13 17:48:30 -05001390 }
1391 if(nlsr->ccn != NULL)
1392 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001393 res = ccn_run(nlsr->ccn, 1);
akmhoqueffacaa82012-09-13 17:48:30 -05001394 }
1395 if (!(nlsr->sched && nlsr->ccn))
1396 {
1397 break;
1398 }
akmhoque29c1db52012-09-07 14:47:43 -05001399 }
1400
akmhoque59980a52012-08-09 12:36:09 -05001401 }
akmhoque59980a52012-08-09 12:36:09 -05001402 return 0;
1403}
1404