blob: 949d81edbce195328d76d4b8c36f5c0a2fc8b5a3 [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));
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
Obaid Amin2a928a52013-02-20 11:06:51 -0600575 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600576process_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
Obaid Amin2a928a52013-02-20 11:06:51 -0600606 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600607process_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600624
akmhoqueb77b95f2013-02-08 12:28:47 -0600625 if ( strcmp(on_off,"ON") == 0 || strcmp(on_off,"on") == 0 )
626 {
627 nlsr->is_hyperbolic_calc=1;
628 }
629}
630
Obaid Amin2a928a52013-02-20 11:06:51 -0600631 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600632process_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
Obaid Amin2a928a52013-02-20 11:06:51 -0600664 void
akmhoqueb77b95f2013-02-08 12:28:47 -0600665process_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600682
akmhoqueb77b95f2013-02-08 12:28:47 -0600683 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
Obaid Amin2a928a52013-02-20 11:06:51 -0600693 void
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 }
akmhoqued79438d2012-08-27 13:31:42 -0500717 else if(!strcmp(cmd_type,"interest-retry") )
718 {
719 process_command_interest_retry(remainder);
720 }
721 else if(!strcmp(cmd_type,"interest-resend-time") )
722 {
723 process_command_interest_resend_time(remainder);
724 }
akmhoqued5152122012-09-19 06:44:23 -0500725 else if(!strcmp(cmd_type,"lsa-refresh-time") )
726 {
727 process_command_lsa_refresh_time(remainder);
728 }
729 else if(!strcmp(cmd_type,"router-dead-interval") )
730 {
731 process_command_router_dead_interval(remainder);
732 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600733 else if(!strcmp(cmd_type,"max-faces-per-prefix") )
akmhoque3cced642012-09-24 16:20:20 -0500734 {
akmhoqueb77b95f2013-02-08 12:28:47 -0600735 process_command_max_faces_per_prefix(remainder);
akmhoque3cced642012-09-24 16:20:20 -0500736 }
akmhoquebfefef22012-09-26 10:09:34 -0500737 else if(!strcmp(cmd_type,"logdir") )
738 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600739 process_command_logdir(remainder);
akmhoquebfefef22012-09-26 10:09:34 -0500740 }
akmhoque7b791452012-10-30 11:24:56 -0500741 else if(!strcmp(cmd_type,"detailed-log") )
742 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600743 process_command_detailed_log(remainder);
akmhoque7b791452012-10-30 11:24:56 -0500744 }
745 else if(!strcmp(cmd_type,"debug") )
746 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600747 process_command_debug(remainder);
akmhoque7b791452012-10-30 11:24:56 -0500748 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600749 else if(!strcmp(cmd_type,"topo-prefix") )
750 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600751 process_command_topo_prefix(remainder);
akmhoqueb77b95f2013-02-08 12:28:47 -0600752 }
753 else if(!strcmp(cmd_type,"slice-prefix") )
754 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600755 process_command_slice_prefix(remainder);
akmhoqueb77b95f2013-02-08 12:28:47 -0600756 }
757 else if(!strcmp(cmd_type,"hyperbolic-cordinate") )
758 {
759 process_command_hyperbolic_cordinate(remainder);
760 }
761 else if(!strcmp(cmd_type,"hyperbolic-routing") )
762 {
763 process_command_hyperbolic_routing(remainder);
764 }
765 else if(!strcmp(cmd_type,"tunnel-type") )
766 {
767 process_command_tunnel_type(remainder);
768 }
akmhoqued5152122012-09-19 06:44:23 -0500769 else
akmhoque59980a52012-08-09 12:36:09 -0500770 {
771 printf("Wrong configuration Command %s \n",cmd_type);
772 }
773}
774
akmhoque03004e62012-09-06 01:12:28 -0500775
akmhoque59980a52012-08-09 12:36:09 -0500776int
777readConfigFile(const char *filename)
778{
779 FILE *cfg;
780 char buf[1024];
781 int len;
782
783 cfg=fopen(filename, "r");
784
785 if(cfg == NULL)
786 {
787 printf("\nConfiguration File does not exists\n");
788 exit(1);
789 }
790
791 while(fgets((char *)buf, sizeof(buf), cfg))
792 {
793 len=strlen(buf);
794 if(buf[len-1] == '\n')
Obaid Amin2a928a52013-02-20 11:06:51 -0600795 buf[len-1]='\0';
akmhoqued5152122012-09-19 06:44:23 -0500796 if ( buf[0] != '#' && buf[0] != '!')
797 process_conf_command(buf);
akmhoque59980a52012-08-09 12:36:09 -0500798 }
799
800 fclose(cfg);
801
802 return 0;
803}
804
akmhoqueb77b95f2013-02-08 12:28:47 -0600805
806void
807add_faces_for_nbrs(void)
808{
809 int i, adl_element;
810 struct ndn_neighbor *nbr;
811
812 struct hashtb_enumerator ee;
Obaid Amin2a928a52013-02-20 11:06:51 -0600813 struct hashtb_enumerator *e = &ee;
814
815 hashtb_start(nlsr->adl, e);
akmhoqueb77b95f2013-02-08 12:28:47 -0600816 adl_element=hashtb_n(nlsr->adl);
817
818 for(i=0;i<adl_element;i++)
819 {
820 nbr=e->data;
Obaid Amin2a928a52013-02-20 11:06:51 -0600821 int face_id=add_ccn_face(nlsr->ccn, (const char *)nbr->neighbor->name,
822 (const char *)nbr->ip_address, 9695,nlsr->tunnel_type);
akmhoqueb77b95f2013-02-08 12:28:47 -0600823 update_face_to_adl_for_nbr(nbr->neighbor->name, face_id);
Obaid Amin2a928a52013-02-20 11:06:51 -0600824 add_delete_ccn_face_by_face_id(nlsr->ccn,
825 (const char *)nlsr->topo_prefix, OP_REG, face_id);
826 add_delete_ccn_face_by_face_id(nlsr->ccn,
827 (const char *)nlsr->slice_prefix, OP_REG, face_id);
akmhoqueb77b95f2013-02-08 12:28:47 -0600828 hashtb_next(e);
829 }
830
831 hashtb_end(e);
832
833}
834
835void
836destroy_faces_for_nbrs(void)
837{
838 int i, adl_element;
839 struct ndn_neighbor *nbr;
840
841 struct hashtb_enumerator ee;
Obaid Amin2a928a52013-02-20 11:06:51 -0600842 struct hashtb_enumerator *e = &ee;
843
844 hashtb_start(nlsr->adl, e);
akmhoqueb77b95f2013-02-08 12:28:47 -0600845 adl_element=hashtb_n(nlsr->adl);
846
847 for(i=0;i<adl_element;i++)
848 {
849 nbr=e->data;
850 if ( nbr->face > 0 )
851 {
Obaid Amin2a928a52013-02-20 11:06:51 -0600852 add_delete_ccn_face_by_face_id(nlsr->ccn,
853 (const char *)nlsr->topo_prefix, OP_UNREG, nbr->face);
854 add_delete_ccn_face_by_face_id(nlsr->ccn,
855 (const char *)nbr->neighbor->name,OP_UNREG,nbr->face);
856 add_delete_ccn_face_by_face_id(nlsr->ccn,
857 (const char *)nlsr->slice_prefix, OP_UNREG, nbr->face);
akmhoqueb77b95f2013-02-08 12:28:47 -0600858 }
859 hashtb_next(e);
860 }
akmhoqueb77b95f2013-02-08 12:28:47 -0600861 hashtb_end(e);
akmhoqueb77b95f2013-02-08 12:28:47 -0600862}
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);
Obaid Amin2a928a52013-02-20 11:06:51 -0600870
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
Obaid Amin2a928a52013-02-20 11:06:51 -0600886 struct name_prefix *np=(struct name_prefix *) calloc (1,
887 sizeof(struct name_prefix ));
888 np->name = (char *) calloc (strlen(name)+1,sizeof(char));
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 }
Obaid Amin2a928a52013-02-20 11:06:51 -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 }
Obaid Amin2a928a52013-02-20 11:06:51 -0600991
akmhoque562caef2012-11-09 13:29:06 -0600992
993 return msg;
994}
akmhoque1771c412012-11-09 13:06:08 -0600995
Obaid Amin2a928a52013-02-20 11:06:51 -0600996 int
akmhoque1771c412012-11-09 13:06:08 -0600997nlsr_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001010
akmhoque1771c412012-11-09 13:06:08 -06001011 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);
Obaid Amin2a928a52013-02-20 11:06:51 -06001023
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 {
Obaid Amin2a928a52013-02-20 11:06:51 -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
Obaid Amin2a928a52013-02-20 11:06:51 -06001064 int
akmhoqueb77b95f2013-02-08 12:28:47 -06001065check_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 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001077
akmhoqueb77b95f2013-02-08 12:28:47 -06001078 return 0;
1079}
1080
Obaid Amin2a928a52013-02-20 11:06:51 -06001081 void
akmhoque386081b2012-08-10 10:53:21 -05001082nlsr_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;
Obaid Amin2a928a52013-02-20 11:06:51 -06001103 struct hashtb_enumerator *e = &ee;
1104 hashtb_start(nlsr->npt, e);
akmhoque3560cb62012-09-09 10:52:30 -05001105 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);
Obaid Amin2a928a52013-02-20 11:06:51 -06001116
1117
akmhoque7c234e02013-02-13 11:23:56 -06001118 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);
Obaid Amin2a928a52013-02-20 11:06:51 -06001129
akmhoque7c234e02013-02-13 11:23:56 -06001130 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");
Obaid Amin2a928a52013-02-20 11:06:51 -06001146
akmhoque7c234e02013-02-13 11:23:56 -06001147 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 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001168 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;
akmhoque1771c412012-11-09 13:06:08 -06001182}
1183
akmhoque81c25e02012-09-10 14:50:33 -05001184int
akmhoque902d57e2012-08-17 09:24:38 -05001185init_nlsr(void)
akmhoque59980a52012-08-09 12:36:09 -05001186{
akmhoque03004e62012-09-06 01:12:28 -05001187 if (signal(SIGQUIT, nlsr_stop_signal_handler ) == SIG_ERR)
1188 {
1189 perror("SIGQUIT install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001190 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001191 }
1192 if (signal(SIGTERM, nlsr_stop_signal_handler ) == SIG_ERR)
1193 {
1194 perror("SIGTERM install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001195 return -1;
Obaid Amin2a928a52013-02-20 11:06:51 -06001196 }
1197 if (signal(SIGINT, nlsr_stop_signal_handler ) == SIG_ERR)
akmhoque03004e62012-09-06 01:12:28 -05001198 {
1199 perror("SIGTERM install error\n");
akmhoque81c25e02012-09-10 14:50:33 -05001200 return -1;
akmhoque03004e62012-09-06 01:12:28 -05001201 }
akmhoque902d57e2012-08-17 09:24:38 -05001202
akmhoque7c234e02013-02-13 11:23:56 -06001203 nlsr=(struct nlsr *)calloc(1,sizeof(struct nlsr));
Obaid Amin2a928a52013-02-20 11:06:51 -06001204
1205 nlsr->adl=hashtb_create(sizeof(struct ndn_neighbor), NULL);
1206 nlsr->npl = hashtb_create(sizeof(struct name_prefix_list_entry), NULL);
1207 nlsr->pit_alsa = hashtb_create(sizeof(struct pending_interest), NULL);
1208 nlsr->npt = hashtb_create(sizeof(struct npt_entry), NULL);
1209 nlsr->routing_table = hashtb_create(sizeof(struct routing_table_entry), NULL);
akmhoque29c1db52012-09-07 14:47:43 -05001210
akmhoque59980a52012-08-09 12:36:09 -05001211 nlsr->in_interest.p = &incoming_interest;
1212 nlsr->in_content.p = &incoming_content;
akmhoque07dd8cc2012-08-16 10:23:01 -05001213
akmhoque03004e62012-09-06 01:12:28 -05001214 nlsr->lsdb=(struct linkStateDatabase *)malloc(sizeof(struct linkStateDatabase));
akmhoque07dd8cc2012-08-16 10:23:01 -05001215
akmhoque7c234e02013-02-13 11:23:56 -06001216 char *time_stamp=(char *)calloc(20,sizeof(char));
1217 //memset(time_stamp,0,20);
akmhoque03004e62012-09-06 01:12:28 -05001218 get_current_timestamp_micro(time_stamp);
1219 nlsr->lsdb->lsdb_version=(char *)malloc(strlen(time_stamp)+1);
akmhoqueb77b95f2013-02-08 12:28:47 -06001220 memset(nlsr->lsdb->lsdb_version,0,strlen(time_stamp));
akmhoque03004e62012-09-06 01:12:28 -05001221 free(time_stamp);
akmhoque902d57e2012-08-17 09:24:38 -05001222
Obaid Amin2a928a52013-02-20 11:06:51 -06001223 nlsr->lsdb->adj_lsdb = hashtb_create(sizeof(struct alsa), NULL);
1224 nlsr->lsdb->name_lsdb = hashtb_create(sizeof(struct nlsa), NULL);
1225 nlsr->lsdb->cor_lsdb = hashtb_create(sizeof(struct clsa), NULL);
akmhoque53f64222012-09-05 13:57:51 -05001226
akmhoque59980a52012-08-09 12:36:09 -05001227 nlsr->is_synch_init=1;
akmhoquec9286692012-08-16 09:57:58 -05001228 nlsr->nlsa_id=0;
akmhoqued79438d2012-08-27 13:31:42 -05001229 nlsr->adj_build_flag=0;
akmhoque53f64222012-09-05 13:57:51 -05001230 nlsr->adj_build_count=0;
1231 nlsr->is_build_adj_lsa_sheduled=0;
akmhoque29c1db52012-09-07 14:47:43 -05001232 nlsr->is_send_lsdb_interest_scheduled=0;
1233 nlsr->is_route_calculation_scheduled=0;
akmhoqued79438d2012-08-27 13:31:42 -05001234
akmhoque7b791452012-10-30 11:24:56 -05001235 nlsr->detailed_logging=0;
1236 nlsr->debugging=0;
1237
akmhoqueb77b95f2013-02-08 12:28:47 -06001238 //nlsr->lsdb_synch_interval = LSDB_SYNCH_INTERVAL;
akmhoqued79438d2012-08-27 13:31:42 -05001239 nlsr->interest_retry = INTEREST_RETRY;
1240 nlsr->interest_resend_time = INTEREST_RESEND_TIME;
akmhoqueda5b6832012-09-13 22:33:55 -05001241 nlsr->lsa_refresh_time=LSA_REFRESH_TIME;
1242 nlsr->router_dead_interval=ROUTER_DEAD_INTERVAL;
akmhoqueb77b95f2013-02-08 12:28:47 -06001243 nlsr->max_faces_per_prefix=MAX_FACES_PER_PREFIX;
akmhoqueffacaa82012-09-13 17:48:30 -05001244 nlsr->semaphor=NLSR_UNLOCKED;
akmhoque81c25e02012-09-10 14:50:33 -05001245
akmhoque95041802012-11-16 09:18:02 -06001246 nlsr->api_port=API_PORT;
1247
akmhoque7c234e02013-02-13 11:23:56 -06001248 nlsr->topo_prefix=(char *)calloc(strlen("/ndn/routing/nlsr")+1,sizeof(char));
akmhoqueb77b95f2013-02-08 12:28:47 -06001249 memcpy(nlsr->topo_prefix,"/ndn/routing/nlsr",strlen("/ndn/routing/nlsr"));
1250
akmhoque7c234e02013-02-13 11:23:56 -06001251 nlsr->slice_prefix=(char *)calloc(strlen("/ndn/routing/nlsr/LSA")+1,sizeof(char));
akmhoqueb77b95f2013-02-08 12:28:47 -06001252 memcpy(nlsr->slice_prefix,"/ndn/routing/nlsr/LSA",strlen("/ndn/routing/nlsr/LSA"));
1253
1254 nlsr->is_hyperbolic_calc=0;
1255 nlsr->cor_r=-1.0;
1256 nlsr->cor_theta=-1.0;
1257
1258 nlsr->tunnel_type=IPPROTO_UDP;
1259
akmhoque81c25e02012-09-10 14:50:33 -05001260 return 0;
akmhoque902d57e2012-08-17 09:24:38 -05001261}
1262
1263int
1264main(int argc, char *argv[])
1265{
Obaid Amin2a928a52013-02-20 11:06:51 -06001266 int res, ret;
1267 char *config_file;
akmhoquebfefef22012-09-26 10:09:34 -05001268 int daemon_mode=0;
akmhoque95041802012-11-16 09:18:02 -06001269 int port=0;
akmhoque902d57e2012-08-17 09:24:38 -05001270
akmhoque95041802012-11-16 09:18:02 -06001271 while ((res = getopt_long(argc, argv, "df:p:h", longopts, 0)) != -1)
akmhoque59980a52012-08-09 12:36:09 -05001272 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001273 switch (res)
akmhoque59980a52012-08-09 12:36:09 -05001274 {
1275 case 'd':
akmhoquebfefef22012-09-26 10:09:34 -05001276 daemon_mode = 1;
akmhoque59980a52012-08-09 12:36:09 -05001277 break;
1278 case 'f':
1279 config_file = optarg;
1280 break;
akmhoque95041802012-11-16 09:18:02 -06001281 case 'p':
1282 port = atoi(optarg);
1283 break;
akmhoque59980a52012-08-09 12:36:09 -05001284 case 'h':
1285 default:
1286 usage(argv[0]);
1287 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001288 }
akmhoque59980a52012-08-09 12:36:09 -05001289
Obaid Amin2a928a52013-02-20 11:06:51 -06001290 ret = init_nlsr();
1291 ON_ERROR_EXIT(ret);
akmhoque95041802012-11-16 09:18:02 -06001292
1293 if ( port !=0 )
1294 nlsr->api_port=port;
1295
akmhoque59980a52012-08-09 12:36:09 -05001296 readConfigFile(config_file);
akmhoqueb77b95f2013-02-08 12:28:47 -06001297
1298 ON_ERROR_DESTROY(check_config_validity());
1299
1300 print_adjacent_from_adl();
1301
akmhoquebfefef22012-09-26 10:09:34 -05001302 if ( daemon_mode == 1 )
1303 {
akmhoqueb77b95f2013-02-08 12:28:47 -06001304 nlsr->debugging=0;
akmhoquebfefef22012-09-26 10:09:34 -05001305 daemonize_nlsr();
1306 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001307
akmhoquebfefef22012-09-26 10:09:34 -05001308 startLogging(nlsr->logDir);
Obaid Amin2a928a52013-02-20 11:06:51 -06001309
akmhoque59980a52012-08-09 12:36:09 -05001310 nlsr->ccn=ccn_create();
akmhoque1771c412012-11-09 13:06:08 -06001311 int ccn_fd=ccn_connect(nlsr->ccn, NULL);
Obaid Amin2a928a52013-02-20 11:06:51 -06001312
akmhoque1771c412012-11-09 13:06:08 -06001313 if(ccn_fd == -1)
akmhoque03004e62012-09-06 01:12:28 -05001314 {
1315 fprintf(stderr,"Could not connect to ccnd\n");
akmhoquebfefef22012-09-26 10:09:34 -05001316 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Could not connect to ccnd\n");
akmhoque81c25e02012-09-10 14:50:33 -05001317 ON_ERROR_DESTROY(-1);
akmhoque03004e62012-09-06 01:12:28 -05001318 }
akmhoque1771c412012-11-09 13:06:08 -06001319
1320 init_api_server(ccn_fd);
akmhoqueb77b95f2013-02-08 12:28:47 -06001321
1322 res=create_sync_slice(nlsr->topo_prefix, nlsr->slice_prefix);
Obaid Amin2a928a52013-02-20 11:06:51 -06001323
akmhoqueb77b95f2013-02-08 12:28:47 -06001324 if(res<0)
1325 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001326 fprintf(stderr, "Can not create slice for prefix %s\n",
1327 nlsr->slice_prefix);
1328 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Can not create slice for"
1329 "prefix %s\n",nlsr->slice_prefix);
akmhoqueb77b95f2013-02-08 12:28:47 -06001330 ON_ERROR_DESTROY(res);
1331 }
akmhoque53f64222012-09-05 13:57:51 -05001332 struct ccn_charbuf *router_prefix;
akmhoque03004e62012-09-06 01:12:28 -05001333 router_prefix=ccn_charbuf_create();
1334 res=ccn_name_from_uri(router_prefix,nlsr->router_name);
akmhoque59980a52012-08-09 12:36:09 -05001335 if(res<0)
akmhoque03004e62012-09-06 01:12:28 -05001336 {
1337 fprintf(stderr, "Bad ccn URI: %s\n",nlsr->router_name);
Obaid Amin2a928a52013-02-20 11:06:51 -06001338 writeLogg(__FILE__,__FUNCTION__,__LINE__,
1339 "Bad ccn URI: %s\n", nlsr->router_name);
akmhoque81c25e02012-09-10 14:50:33 -05001340 ON_ERROR_DESTROY(res);
akmhoque03004e62012-09-06 01:12:28 -05001341 }
akmhoque59980a52012-08-09 12:36:09 -05001342
1343 ccn_name_append_str(router_prefix,"nlsr");
akmhoque03004e62012-09-06 01:12:28 -05001344 nlsr->in_interest.data=nlsr->router_name;
akmhoque59980a52012-08-09 12:36:09 -05001345 res=ccn_set_interest_filter(nlsr->ccn,router_prefix,&nlsr->in_interest);
1346 if ( res < 0 )
akmhoque03004e62012-09-06 01:12:28 -05001347 {
1348 fprintf(stderr,"Failed to register interest for router\n");
Obaid Amin2a928a52013-02-20 11:06:51 -06001349 writeLogg(__FILE__,__FUNCTION__,__LINE__,
1350 "Failed to register interest for router\n");
akmhoque81c25e02012-09-10 14:50:33 -05001351 ON_ERROR_DESTROY(res);
akmhoque03004e62012-09-06 01:12:28 -05001352 }
1353 ccn_charbuf_destroy(&router_prefix);
Obaid Amin2a928a52013-02-20 11:06:51 -06001354
akmhoque7b791452012-10-30 11:24:56 -05001355 if ( nlsr->debugging )
1356 printf("Router Name : %s\n",nlsr->router_name);
akmhoque9e9fc722012-09-26 14:03:25 -05001357 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Router Name : %s\n",nlsr->router_name);
akmhoque7b791452012-10-30 11:24:56 -05001358 if ( nlsr->debugging )
1359 printf("lsdb_version: %s\n",nlsr->lsdb->lsdb_version);
akmhoque9e9fc722012-09-26 14:03:25 -05001360 writeLogg(__FILE__,__FUNCTION__,__LINE__,"lsdb_version: %s\n",nlsr->lsdb->lsdb_version);
akmhoque59980a52012-08-09 12:36:09 -05001361
akmhoqueb77b95f2013-02-08 12:28:47 -06001362 add_faces_for_nbrs();
akmhoque53f64222012-09-05 13:57:51 -05001363 print_name_prefix_from_npl();
1364 print_adjacent_from_adl();
akmhoqueb77b95f2013-02-08 12:28:47 -06001365 build_and_install_name_lsas();
1366
akmhoqueb77b95f2013-02-08 12:28:47 -06001367 print_name_lsdb();
1368 if ( nlsr->cor_r != -1.0 && nlsr->cor_theta != -1.0)
1369 {
1370 build_and_install_cor_lsa();
1371 }
1372 write_name_lsdb_to_repo(nlsr->slice_prefix);
akmhoque53f64222012-09-05 13:57:51 -05001373
1374 nlsr->sched = ccn_schedule_create(nlsr, &ndn_rtr_ticker);
akmhoque184dde02013-02-14 15:53:24 -06001375 ccn_set_schedule(nlsr->ccn,nlsr->sched);
akmhoque03004e62012-09-06 01:12:28 -05001376 nlsr->event_send_info_interest = ccn_schedule_event(nlsr->sched, 1, &send_info_interest, NULL, 0);
akmhoqueffacaa82012-09-13 17:48:30 -05001377 nlsr->event = ccn_schedule_event(nlsr->sched, 60000000, &refresh_lsdb, NULL, 0);
Obaid Amin2a928a52013-02-20 11:06:51 -06001378
akmhoque0678c5d2013-02-18 11:03:31 -06001379 res=sync_monitor(nlsr->topo_prefix,nlsr->slice_prefix);
1380 ON_ERROR_DESTROY(res);
akmhoque1c9b92f2012-08-13 10:57:50 -05001381
akmhoque59980a52012-08-09 12:36:09 -05001382 while(1)
akmhoque29c1db52012-09-07 14:47:43 -05001383 {
akmhoqueffacaa82012-09-13 17:48:30 -05001384 if ( nlsr->semaphor == NLSR_UNLOCKED )
akmhoque29c1db52012-09-07 14:47:43 -05001385 {
akmhoqueffacaa82012-09-13 17:48:30 -05001386 if( nlsr->sched != NULL )
1387 {
akmhoque1771c412012-11-09 13:06:08 -06001388 long int micro_sec=ccn_schedule_run(nlsr->sched);
1389 res=nlsr_api_server_poll(micro_sec,ccn_fd);
1390 ON_ERROR_DESTROY(res);
akmhoqueffacaa82012-09-13 17:48:30 -05001391 }
1392 if(nlsr->ccn != NULL)
1393 {
Obaid Amin2a928a52013-02-20 11:06:51 -06001394 res = ccn_run(nlsr->ccn, 1);
akmhoqueffacaa82012-09-13 17:48:30 -05001395 }
1396 if (!(nlsr->sched && nlsr->ccn))
1397 {
1398 break;
1399 }
akmhoque29c1db52012-09-07 14:47:43 -05001400 }
1401
akmhoque59980a52012-08-09 12:36:09 -05001402 }
Obaid Amin2a928a52013-02-20 11:06:51 -06001403
akmhoque59980a52012-08-09 12:36:09 -05001404
akmhoque59980a52012-08-09 12:36:09 -05001405 return 0;
1406}
1407