blob: 49bda4aebca4ac7f4d93c01b2906282bf50e6401 [file] [log] [blame]
akmhoque59980a52012-08-09 12:36:09 -05001#include<stdio.h>
2#include<string.h>
3#include<stdlib.h>
4#include <unistd.h>
5#include <getopt.h>
6#include <sys/time.h>
7#include <assert.h>
8#ifdef HAVE_CONFIG_H
9#include <config.h>
10#endif
11
12
13#include <ccn/ccn.h>
14#include <ccn/uri.h>
15#include <ccn/keystore.h>
16#include <ccn/signing.h>
17#include <ccn/schedule.h>
18#include <ccn/hashtb.h>
19
20#include "nlsr.h"
21#include "nlsr_ndn.h"
22#include "utility.h"
akmhoque8a5babe2012-08-16 17:39:33 -050023#include "nlsr_adl.h"
akmhoque902d57e2012-08-17 09:24:38 -050024#include "nlsr_lsdb.h"
akmhoque59980a52012-08-09 12:36:09 -050025
26
27struct option longopts[] =
28{
29 { "daemon", no_argument, NULL, 'd'},
30 { "config_file", required_argument, NULL, 'f'},
31 { "help", no_argument, NULL, 'h'},
32 { 0 }
33};
34
35static int
36usage(char *progname)
37{
38
39 printf("Usage: %s [OPTIONS...]\n\
40 NDN routing....\n\
41 -d, --daemon Run in daemon mode\n\
42 -f, --config_file Specify configuration file name\n\
43 -h, --help Display this help message\n", progname);
44
45 exit(1);
46}
47
48void ndn_rtr_gettime(const struct ccn_gettime *self, struct ccn_timeval *result)
49{
50 struct timeval now = {0};
51 gettimeofday(&now, 0);
52 result->s = now.tv_sec;
53 result->micros = now.tv_usec;
54}
55
56static struct ccn_gettime ndn_rtr_ticker = {
57 "timer",
58 &ndn_rtr_gettime,
59 1000000,
60 NULL
61};
62
63void
64process_command_router_name(char *command)
65{
66 if(command==NULL)
67 {
68 printf(" Wrong Command Format ( router-name /router/name )\n");
69 return;
70 }
71 char *rem;
72 const char *sep=" \t\n";
73 char *rtr_name;
74
75 rtr_name=strtok_r(command,sep,&rem);
76 if(rtr_name==NULL)
77 {
78 printf(" Wrong Command Format ( router-name /router/name )\n");
79 return;
80 }
81 nlsr->router_name=(char *)malloc(strlen(rtr_name)+1);
82 memcpy(nlsr->router_name,rtr_name,strlen(rtr_name)+1);
83 printf("Router Name: %s\n",nlsr->router_name);
84}
85
86void
87process_command_ccnname(char *command)
88{
89
90 if(command==NULL)
91 {
92 printf(" Wrong Command Format ( ccnname /name/prefix)\n");
93 return;
94 }
95 char *rem;
96 const char *sep=" \t\n";
97 char *name_prefix;
98 name_prefix=strtok_r(command,sep,&rem);
99 if(name_prefix==NULL)
100 {
101 printf(" Wrong Command Format ( ccnname /name/prefix/ )\n");
102 return;
103 }
104
105 printf("Name Prefix: %s \n",name_prefix);
akmhoque28c45022012-08-09 15:38:02 -0500106
107 struct name_prefix *np=(struct name_prefix *)malloc(sizeof(struct name_prefix *));
108 np->name=(char *)malloc(strlen(name_prefix)+1);
109 memcpy(np->name,name_prefix,strlen(name_prefix)+1);
110 np->length=strlen(name_prefix)+1;
111
112 add_name_prefix_to_npl(np);
113 /* Debugging Purpose */
114 print_name_prefix_from_npl();
115
116 free(np->name);
117 free(np);
118
119
akmhoque59980a52012-08-09 12:36:09 -0500120}
121
122void
123process_command_ccnneighbor(char *command)
124{
125 if(command==NULL)
126 {
akmhoque28c45022012-08-09 15:38:02 -0500127 printf(" Wrong Command Format ( ccnneighbor router_name faceX)\n");
akmhoque59980a52012-08-09 12:36:09 -0500128 return;
129 }
130 char *rem;
131 const char *sep=" \t\n";
akmhoque28c45022012-08-09 15:38:02 -0500132 char *rtr_name,*face;
akmhoque59980a52012-08-09 12:36:09 -0500133
akmhoque28c45022012-08-09 15:38:02 -0500134 rtr_name=strtok_r(command,sep,&rem);
135 if(rtr_name==NULL)
akmhoque59980a52012-08-09 12:36:09 -0500136 {
akmhoque28c45022012-08-09 15:38:02 -0500137 printf(" Wrong Command Format ( ccnneighbor router_name faceX)\n");
akmhoque59980a52012-08-09 12:36:09 -0500138 return;
139 }
140
141 face=strtok_r(NULL,sep,&rem);
142 if(face==NULL)
143 {
akmhoque28c45022012-08-09 15:38:02 -0500144 printf(" Wrong Command Format ( ccnneighbor router_name faceX)\n");
akmhoque59980a52012-08-09 12:36:09 -0500145 return;
146 }
147
akmhoque28c45022012-08-09 15:38:02 -0500148 printf("Router: %s face: %s\n",rtr_name,face);
149 int face_id;
150 int res;
151 res=sscanf(face,"face%d",&face_id);
152
153 if(res != 1 )
154 {
155 printf(" Wrong Command Format ( ccnneighbor router_name faceX) where X is integer\n");
156 return;
157 }
158
159 struct ndn_neighbor *nbr=(struct ndn_neighbor *)malloc(sizeof(struct ndn_neighbor*));
160 nbr->neighbor=(struct name_prefix *)malloc(sizeof(struct name_prefix *));
161 nbr->neighbor->name=(char *)malloc(strlen(rtr_name)+1);
162 memcpy(nbr->neighbor->name,rtr_name,strlen(rtr_name)+1);
akmhoque8a5babe2012-08-16 17:39:33 -0500163 nbr->neighbor->length=strlen(rtr_name);
akmhoque28c45022012-08-09 15:38:02 -0500164 nbr->face=face_id;
akmhoque386081b2012-08-10 10:53:21 -0500165 nbr->status=0;
166
167
akmhoque28c45022012-08-09 15:38:02 -0500168
169 add_adjacent_to_adl(nbr);
170 print_adjacent_from_adl();
171
172 free(nbr->neighbor->name);
173 free(nbr->neighbor);
174 free(nbr);
akmhoque59980a52012-08-09 12:36:09 -0500175
176}
177
178void
179process_conf_command(char *command)
180{
181 const char *separators=" \t\n";
182 char *remainder=NULL;
183 char *cmd_type=NULL;
184
185 if(command==NULL || strlen(command)==0 || command[0]=='!')
186 return;
187
188 cmd_type=strtok_r(command,separators,&remainder);
189
190 if(!strcmp(cmd_type,"router-name") )
191 {
192 process_command_router_name(remainder);
193 }
194 else if(!strcmp(cmd_type,"ccnneighbor") )
195 {
196 process_command_ccnneighbor(remainder);
197 }
198 else if(!strcmp(cmd_type,"ccnname") )
199 {
200 process_command_ccnname(remainder);
201 }
202 else
203 {
204 printf("Wrong configuration Command %s \n",cmd_type);
205 }
206}
207
208int
209readConfigFile(const char *filename)
210{
211 FILE *cfg;
212 char buf[1024];
213 int len;
214
215 cfg=fopen(filename, "r");
216
217 if(cfg == NULL)
218 {
219 printf("\nConfiguration File does not exists\n");
220 exit(1);
221 }
222
223 while(fgets((char *)buf, sizeof(buf), cfg))
224 {
225 len=strlen(buf);
226 if(buf[len-1] == '\n')
227 buf[len-1]='\0';
228 process_conf_command(buf);
229 }
230
231 fclose(cfg);
232
233 return 0;
234}
235
akmhoque28c45022012-08-09 15:38:02 -0500236void
237add_name_prefix_to_npl(struct name_prefix *np)
238{
239
240
241 printf("\nadd_name_prefix called\n");
242 printf("Name Prefix: %s and length: %d \n",np->name,np->length);
243
244 struct name_prefix *hnp=(struct name_prefix *)malloc(sizeof(struct name_prefix *));
245
246 struct hashtb_enumerator ee;
247 struct hashtb_enumerator *e = &ee;
248 int res;
249
250 hashtb_start(nlsr->npl, e);
251 res = hashtb_seek(e, np->name, strlen(np->name), 0);
akmhoque2852a222012-08-21 12:09:00 -0400252
akmhoquee7c4b6d2012-08-21 12:30:25 -0400253 if(res == HT_NEW_ENTRY)
254 {
akmhoque2852a222012-08-21 12:09:00 -0400255
akmhoquee7c4b6d2012-08-21 12:30:25 -0400256 hnp = e->data;
257 hnp->name=(char *)malloc(np->length);
258 memcpy(hnp->name,np->name,np->length);
259 hnp->length=np->length;
260 }
261
262 hashtb_end(e);
akmhoque28c45022012-08-09 15:38:02 -0500263
akmhoque28c45022012-08-09 15:38:02 -0500264
265 printf("\n");
266
267}
268
269void
270print_name_prefix_from_npl(void)
271{
272 printf("print_name_prefix_from_npl called \n");
273 int i, npl_element;
274 struct name_prefix *np;
275
276 struct hashtb_enumerator ee;
277 struct hashtb_enumerator *e = &ee;
278
279 hashtb_start(nlsr->npl, e);
280 npl_element=hashtb_n(nlsr->npl);
281
282 for(i=0;i<npl_element;i++)
283 {
284 np=e->data;
285 printf("Name Prefix: %s and Length: %d \n",np->name,np->length);
286 hashtb_next(e);
287 }
288
289 hashtb_end(e);
290
291 printf("\n");
292}
293
akmhoque28c45022012-08-09 15:38:02 -0500294
akmhoque386081b2012-08-10 10:53:21 -0500295void
296nlsr_destroy( void )
297{
298
299 /* Destroying every hash table attached to each neighbor in ADL before destorying ADL */
300
301 int i, element;
302 struct ndn_neighbor *nbr;
303
304 struct hashtb_enumerator ee;
305 struct hashtb_enumerator *e = &ee;
306
307 hashtb_start(nlsr->adl, e);
308 element=hashtb_n(nlsr->adl);
309
310 for(i=0;i<element;i++)
311 {
312 nbr=e->data;
313 hashtb_destroy(&nbr->lsa_update_queue);
314 hashtb_next(e);
315 }
316 hashtb_end(e);
317
318
akmhoque6dc9a242012-08-21 11:23:57 -0400319
akmhoque386081b2012-08-10 10:53:21 -0500320 hashtb_destroy(&nlsr->adl);
321 hashtb_destroy(&nlsr->npl);
322 ccn_schedule_destroy(&nlsr->sched);
323 ccn_destroy(&nlsr->ccn);
324 free(nlsr);
325
326}
327
akmhoque902d57e2012-08-17 09:24:38 -0500328void
329init_nlsr(void)
akmhoque59980a52012-08-09 12:36:09 -0500330{
akmhoque59980a52012-08-09 12:36:09 -0500331 struct hashtb_param param_adl = {0};
332 struct hashtb_param param_npl = {0};
akmhoque902d57e2012-08-17 09:24:38 -0500333
334 struct hashtb_param param_adj_lsdb = {0};
335 struct hashtb_param param_name_lsdb = {0};
akmhoque59980a52012-08-09 12:36:09 -0500336
337 nlsr=(struct nlsr *)malloc(sizeof(struct nlsr));
338
akmhoque28c45022012-08-09 15:38:02 -0500339 nlsr->adl=hashtb_create(sizeof(struct ndn_neighbor), &param_adl);
akmhoque8c50d0d2012-08-09 13:38:03 -0500340 nlsr->npl = hashtb_create(sizeof(struct name_prefix), &param_npl);
akmhoque59980a52012-08-09 12:36:09 -0500341 nlsr->in_interest.p = &incoming_interest;
342 nlsr->in_content.p = &incoming_content;
akmhoque07dd8cc2012-08-16 10:23:01 -0500343
344 nlsr->lsdb=(struct linkStateDatabase *)malloc(sizeof(struct linkStateDatabase *));
akmhoquef6432c22012-08-21 13:18:05 -0400345 //nlsr->lsdb->version=(char *)malloc(16);
346 //nlsr->lsdb->version="0000000000000000";
347 nlsr->lsdb->version=0;
akmhoque07dd8cc2012-08-16 10:23:01 -0500348
akmhoque902d57e2012-08-17 09:24:38 -0500349 nlsr->lsdb->adj_lsdb = hashtb_create(sizeof(struct adj_lsa), &param_adj_lsdb);
350 nlsr->lsdb->name_lsdb = hashtb_create(sizeof(struct name_lsa), &param_name_lsdb);
351
akmhoque59980a52012-08-09 12:36:09 -0500352 nlsr->is_synch_init=1;
akmhoquec9286692012-08-16 09:57:58 -0500353 nlsr->nlsa_id=0;
akmhoque59980a52012-08-09 12:36:09 -0500354
akmhoque902d57e2012-08-17 09:24:38 -0500355}
356
357int
358main(int argc, char *argv[])
359{
360 int res;
361 char *config_file;
akmhoque2852a222012-08-21 12:09:00 -0400362 //int daemon_mode;
akmhoque59980a52012-08-09 12:36:09 -0500363 struct ccn_charbuf *router_prefix;
akmhoque902d57e2012-08-17 09:24:38 -0500364
365 init_nlsr();
akmhoque59980a52012-08-09 12:36:09 -0500366
367 while ((res = getopt_long(argc, argv, "df:h", longopts, 0)) != -1)
368 {
369 switch (res)
370 {
371 case 'd':
akmhoque2852a222012-08-21 12:09:00 -0400372 //daemon_mode = 1;
akmhoque59980a52012-08-09 12:36:09 -0500373 break;
374 case 'f':
375 config_file = optarg;
376 break;
377 case 'h':
378 default:
379 usage(argv[0]);
380 }
381 }
382
383 readConfigFile(config_file);
384
385 nlsr->ccn=ccn_create();
386 if(ccn_connect(nlsr->ccn, NULL) == -1)
387 {
388 fprintf(stderr,"Could not connect to ccnd\n");
389 exit(1);
390 }
391 router_prefix=ccn_charbuf_create();
392 res=ccn_name_from_uri(router_prefix,nlsr->router_name);
393 if(res<0)
394 {
395 fprintf(stderr, "Bad ccn URI: %s\n",nlsr->router_name);
396 exit(1);
397 }
398
399 ccn_name_append_str(router_prefix,"nlsr");
400 nlsr->in_interest.data=nlsr->router_name;
401 res=ccn_set_interest_filter(nlsr->ccn,router_prefix,&nlsr->in_interest);
402 if ( res < 0 )
403 {
404 fprintf(stderr,"Failed to register interest for router\n");
405 exit(1);
406 }
407
408 nlsr->sched = ccn_schedule_create(nlsr, &ndn_rtr_ticker);
409
akmhoquec9286692012-08-16 09:57:58 -0500410 nlsr->event_send_lsdb_interest = ccn_schedule_event(nlsr->sched, 1000000, &send_lsdb_interest, NULL, 0);
akmhoque1c9b92f2012-08-13 10:57:50 -0500411
akmhoque59980a52012-08-09 12:36:09 -0500412 while(1)
413 {
414 ccn_schedule_run(nlsr->sched);
415 res = ccn_run(nlsr->ccn, 500);
416
417 }
akmhoque59980a52012-08-09 12:36:09 -0500418
akmhoque386081b2012-08-10 10:53:21 -0500419 nlsr_destroy();
akmhoque59980a52012-08-09 12:36:09 -0500420
421 return 0;
422}
423