blob: ab4369708193398ec0263b23cb59ebd59a001545 [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>
akmhoque7f337272012-08-14 15:16:30 -050019#include <ccn/bloom.h>
akmhoque59980a52012-08-09 12:36:09 -050020
21#include "nlsr.h"
22#include "nlsr_ndn.h"
23#include "utility.h"
akmhoque8a5babe2012-08-16 17:39:33 -050024#include "nlsr_adl.h"
akmhoque59980a52012-08-09 12:36:09 -050025
26enum ccn_upcall_res
27incoming_interest(struct ccn_closure *selfp,
28 enum ccn_upcall_kind kind, struct ccn_upcall_info *info)
29{
30
31 switch (kind) {
32 case CCN_UPCALL_FINAL:
33 break;
34 case CCN_UPCALL_INTEREST:
35 // printing the name prefix for which it received interest
36 printf("Interest Received for name: ");
37 struct ccn_charbuf*c;
38 c=ccn_charbuf_create();
39 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
40 //ccn_name_chop(c,NULL,-1);
41 printf("%s\n",ccn_charbuf_as_string(c));
42 ccn_charbuf_destroy(&c);
43
akmhoque1c9b92f2012-08-13 10:57:50 -050044 process_incoming_interest(selfp, info);
akmhoque59980a52012-08-09 12:36:09 -050045
46 /*
47 struct ccn_charbuf *data=ccn_charbuf_create();
48 struct ccn_charbuf *name=ccn_charbuf_create();
49 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
50
51 ccn_charbuf_append(name, info->interest_ccnb + info->pi->offset[CCN_PI_B_Name],
52 info->pi->offset[CCN_PI_E_Name] - info->pi->offset[CCN_PI_B_Name]);
53
54 sp.template_ccnb=ccn_charbuf_create();
55 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
56 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 1010);
57 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
58 ccn_charbuf_append_closer(sp.template_ccnb);
59
60 res= ccn_sign_content(ospfndn->ccn, data, name, &sp, "hello", strlen("hello"));
61 res=ccn_put(ospfndn->ccn,data->buf,data->length);
62 ccn_charbuf_destroy(&data);
63
64 */
65 break;
66
67 default:
68 break;
69 }
70
71 return CCN_UPCALL_RESULT_OK;
72}
73
74
75enum ccn_upcall_res incoming_content(struct ccn_closure* selfp,
76 enum ccn_upcall_kind kind, struct ccn_upcall_info* info)
77{
78
79
80 switch(kind) {
81 case CCN_UPCALL_FINAL:
82 break;
83 case CCN_UPCALL_CONTENT:
84 printf("Content Received for name: ");
85 struct ccn_charbuf*c;
86 c=ccn_charbuf_create();
87 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E],0);
88 printf("%s\n",ccn_charbuf_as_string(c));
89 ccn_charbuf_destroy(&c);
akmhoquecb017752012-08-16 11:03:45 -050090
91 process_incoming_content(selfp, info);
92
akmhoque59980a52012-08-09 12:36:09 -050093 break;
94 case CCN_UPCALL_INTEREST_TIMED_OUT:
akmhoquecb017752012-08-16 11:03:45 -050095 printf("Interest timed out \n");
96 struct ccn_charbuf*ic;
97 ic=ccn_charbuf_create();
98 ccn_uri_append(ic,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
99 printf("%s\n",ccn_charbuf_as_string(ic));
100 ccn_charbuf_destroy(&ic);
101 process_incoming_timed_out_interest(selfp,info);
akmhoque59980a52012-08-09 12:36:09 -0500102
akmhoque59980a52012-08-09 12:36:09 -0500103 break;
104 default:
105 fprintf(stderr, "Unexpected response of kind %d\n", kind);
106 return CCN_UPCALL_RESULT_ERR;
107 }
108
109 return CCN_UPCALL_RESULT_OK;
110}
akmhoque61fe4472012-08-10 10:13:34 -0500111
akmhoquecb017752012-08-16 11:03:45 -0500112
113void
114process_incoming_content(struct ccn_closure* selfp, struct ccn_upcall_info* info)
115{
116 printf("process_incoming_content called \n");
117
akmhoque638c20a2012-08-16 11:57:48 -0500118 struct ccn_charbuf*c;
119 c=ccn_charbuf_create();
akmhoquedde7e322012-08-16 13:57:06 -0500120 //ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
121 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
akmhoque638c20a2012-08-16 11:57:48 -0500122 printf("%s\n",ccn_charbuf_as_string(c));
123 ccn_charbuf_destroy(&c);
124
125 const unsigned char *comp_ptr1;
126 size_t comp_size;
127 int res,i;
128 int nlsr_position=0;
129 int name_comps=(int)info->interest_comps->n;
130
131 for(i=0;i<name_comps;i++)
132 {
133 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
134 if( res == 0)
135 {
136 nlsr_position=i;
137 break;
138 }
139 }
140
141 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
142
143
144 printf("Det= %s \n",comp_ptr1);
145
146 if(!strcmp((char *)comp_ptr1,"lsdb"))
147 {
148 process_incoming_content_lsdb(selfp,info);
149 }
150
151}
152
153
154void
155process_incoming_content_lsdb(struct ccn_closure* selfp, struct ccn_upcall_info* info)
156{
157 printf("process_incoming_content_lsdb called \n");
158
159 const unsigned char *content_data;
160 size_t length;
161 ccn_content_get_value(info->content_ccnb, info->pco->offset[CCN_PCO_E_Content]-info->pco->offset[CCN_PCO_B_Content], info->pco, &content_data, &length);
162
akmhoquedde7e322012-08-16 13:57:06 -0500163
164 if ( !strcmp((char *)content_data,"NACK"))
165 {
166 printf("NACK received for LSDB request. Do nothing \n");
167 }
168 else
169 {
170 // Do the LSDB processing here
171
akmhoque8a5babe2012-08-16 17:39:33 -0500172 const unsigned char *comp_ptr1;
173 size_t comp_size;
174 int res;
175
176 res=ccn_name_comp_get(info->content_ccnb, info->content_comps,info->interest_comps->n-1,&comp_ptr1, &comp_size);
177 printf("Received Database Version: %s \n",(char *)comp_ptr1);
178
akmhoquedde7e322012-08-16 13:57:06 -0500179 }
akmhoque638c20a2012-08-16 11:57:48 -0500180
akmhoque8a5babe2012-08-16 17:39:33 -0500181
akmhoque638c20a2012-08-16 11:57:48 -0500182
akmhoquecb017752012-08-16 11:03:45 -0500183}
184
185
186void
187process_incoming_timed_out_interest(struct ccn_closure* selfp, struct ccn_upcall_info* info)
188{
189 printf("process_incoming_timed_out_interest called \n");
190
akmhoquedde7e322012-08-16 13:57:06 -0500191 struct ccn_charbuf*c;
192 c=ccn_charbuf_create();
193 //ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
194 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
195 printf("%s\n",ccn_charbuf_as_string(c));
196 ccn_charbuf_destroy(&c);
197
198 const unsigned char *comp_ptr1;
199 size_t comp_size;
200 int res,i;
201 int nlsr_position=0;
202 int name_comps=(int)info->interest_comps->n;
203
204 for(i=0;i<name_comps;i++)
205 {
206 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
207 if( res == 0)
208 {
209 nlsr_position=i;
210 break;
211 }
212 }
213
214 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
215
216
217 printf("Det= %s \n",comp_ptr1);
218
219 if(!strcmp((char *)comp_ptr1,"lsdb"))
220 {
221 process_incoming_timed_out_interest_lsdb(selfp,info);
222 }
akmhoquecb017752012-08-16 11:03:45 -0500223}
224
225
akmhoque1c9b92f2012-08-13 10:57:50 -0500226void
akmhoquedde7e322012-08-16 13:57:06 -0500227process_incoming_timed_out_interest_lsdb(struct ccn_closure* selfp, struct ccn_upcall_info* info)
228{
229 printf("process_incoming_timed_out_interest_lsdb called \n");
230
231
232 int res,i;
233 int nlsr_position=0;
234 int name_comps=(int)info->interest_comps->n;
235
236 //const unsigned char *comp_ptr1;
237 //size_t comp_size;
238
239 for(i=0;i<name_comps;i++)
240 {
241 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
242 if( res == 0)
243 {
244 nlsr_position=i;
245 break;
246 }
247 }
248
249
akmhoque8a5babe2012-08-16 17:39:33 -0500250 struct ccn_charbuf *nbr;
251 nbr=ccn_charbuf_create();
252
akmhoquedde7e322012-08-16 13:57:06 -0500253
akmhoque8a5babe2012-08-16 17:39:33 -0500254 const unsigned char *comp_ptr1;
255 size_t comp_size;
256 for(i=0;i<nlsr_position;i++)
257 {
258 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,i,&comp_ptr1, &comp_size);
259 //printf("%s \n",comp_ptr1);
260 ccn_charbuf_append_string(nbr,"/");
261 ccn_charbuf_append_string(nbr,(const char *)comp_ptr1);
262 }
263
264 ccn_charbuf_append_string(nbr,"\0");
265 printf("Interest Timed out for Neighbor: %s\n",ccn_charbuf_as_string(nbr));
266
267 update_adjacent_status_to_adl(nbr,1);
268
269 ccn_charbuf_destroy(&nbr);
akmhoquedde7e322012-08-16 13:57:06 -0500270}
271
272void
akmhoque1c9b92f2012-08-13 10:57:50 -0500273process_incoming_interest(struct ccn_closure *selfp, struct ccn_upcall_info *info)
274{
275 printf("process_incoming_interest called \n");
276
277
278 struct ccn_charbuf*c;
279 c=ccn_charbuf_create();
280 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
281 printf("%s\n",ccn_charbuf_as_string(c));
282 ccn_charbuf_destroy(&c);
283
284 const unsigned char *comp_ptr1;
285 size_t comp_size;
286 int res,i;
287 int nlsr_position=0;
288 int name_comps=(int)info->interest_comps->n;
289
290 for(i=0;i<name_comps;i++)
291 {
292 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
293 if( res == 0)
294 {
akmhoqueea3603e2012-08-13 11:24:09 -0500295 nlsr_position=i;
akmhoque1c9b92f2012-08-13 10:57:50 -0500296 break;
297 }
298 }
299
300 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
akmhoquee0789862012-08-16 14:23:32 -0500301
akmhoque1c9b92f2012-08-13 10:57:50 -0500302 printf("Det= %s \n",comp_ptr1);
303
304 if(!strcmp((char *)comp_ptr1,"lsdb"))
305 {
akmhoquebf1aa832012-08-13 13:26:59 -0500306 process_incoming_interest_lsdb(selfp,info);
akmhoque1c9b92f2012-08-13 10:57:50 -0500307 }
akmhoquebf1aa832012-08-13 13:26:59 -0500308
309
310}
311
312
313void
314process_incoming_interest_lsdb(struct ccn_closure *selfp, struct ccn_upcall_info *info)
315{
316 printf("process_incoming_interest_lsdb called \n");
317
akmhoquecb017752012-08-16 11:03:45 -0500318 int l, res;
akmhoquefce8cfc2012-08-14 14:00:33 -0500319 const unsigned char *exclbase;
akmhoque6d49e4d2012-08-14 13:49:30 -0500320 size_t size;
akmhoquefce8cfc2012-08-14 14:00:33 -0500321 struct ccn_buf_decoder decoder;
322 struct ccn_buf_decoder *d;
323 const unsigned char *comp;
324
akmhoque6d49e4d2012-08-14 13:49:30 -0500325
326 l = info->pi->offset[CCN_PI_E_Exclude] - info->pi->offset[CCN_PI_B_Exclude];
327 if (l > 0)
328 {
329 comp = NULL;
330 size = 0;
331 exclbase = info->interest_ccnb + info->pi->offset[CCN_PI_B_Exclude];
332 d = ccn_buf_decoder_start(&decoder, exclbase, l);
333 if (ccn_buf_match_dtag(d, CCN_DTAG_Exclude))
334 {
335 ccn_buf_advance(d);
336 if (ccn_buf_match_dtag(d, CCN_DTAG_Any))
337 ccn_buf_advance_past_element(d);
338 if (ccn_buf_match_dtag(d, CCN_DTAG_Component))
339 {
340 ccn_buf_advance(d);
341 ccn_buf_match_blob(d, &comp, &size);
akmhoquec9286692012-08-16 09:57:58 -0500342 ccn_buf_check_close(d);
343
344
akmhoque6d49e4d2012-08-14 13:49:30 -0500345 }
346 ccn_buf_check_close(d);
347 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500348 //if (d->decoder.state < 0)
349 //printf("Parse Failed\n");
akmhoque6d49e4d2012-08-14 13:49:30 -0500350 if (comp != NULL)
akmhoque37e3adf2012-08-14 15:52:50 -0500351 printf("Number in Exclusion Filter is %s\n",comp);
akmhoque6d49e4d2012-08-14 13:49:30 -0500352
353 /* Now comp points to the start of your potential number, and size is its length */
354 }
355
akmhoque07dd8cc2012-08-16 10:23:01 -0500356 int dbcmp=strncmp(nlsr->lsdb->version,(char *)comp,16);
akmhoque898d4aa2012-08-16 10:26:15 -0500357
358 printf (" dbcmp = %d \n",dbcmp);
359
akmhoque07dd8cc2012-08-16 10:23:01 -0500360 if(dbcmp > 0)
akmhoquecb017752012-08-16 11:03:45 -0500361 {
akmhoque898d4aa2012-08-16 10:26:15 -0500362 printf("Has Updated database (Older: %s New: %s)\n",comp,nlsr->lsdb->version);
akmhoquecb017752012-08-16 11:03:45 -0500363 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500364 else
akmhoquecb017752012-08-16 11:03:45 -0500365 {
akmhoque898d4aa2012-08-16 10:26:15 -0500366 printf("Data base is not updated than the older one (Older: %s New: %s)\n",comp,nlsr->lsdb->version);
akmhoquecb017752012-08-16 11:03:45 -0500367 printf("Sending NACK Content back.....\n");
akmhoque07dd8cc2012-08-16 10:23:01 -0500368
akmhoquecb017752012-08-16 11:03:45 -0500369 struct ccn_charbuf *data=ccn_charbuf_create();
370 struct ccn_charbuf *name=ccn_charbuf_create();
371 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
372
akmhoque638c20a2012-08-16 11:57:48 -0500373 ccn_charbuf_append(name, info->interest_ccnb + info->pi->offset[CCN_PI_B_Name],info->pi->offset[CCN_PI_E_Name] - info->pi->offset[CCN_PI_B_Name]);
akmhoque8a5babe2012-08-16 17:39:33 -0500374 //ccn_name_append_str(name,"0000000000000001");
akmhoquecb017752012-08-16 11:03:45 -0500375
376 sp.template_ccnb=ccn_charbuf_create();
377 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
378 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 10);
379 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
380 ccn_charbuf_append_closer(sp.template_ccnb);
381
382 res= ccn_sign_content(nlsr->ccn, data, name, &sp, "NACK", strlen("NACK"));
akmhoquedde7e322012-08-16 13:57:06 -0500383 if(res >= 0)
384 printf("Signing Content is successful \n");
385
akmhoquecb017752012-08-16 11:03:45 -0500386 res=ccn_put(nlsr->ccn,data->buf,data->length);
akmhoquebf11b1d2012-08-16 11:11:17 -0500387
388 if(res >= 0)
389 printf("Sending NACK Content is successful \n");
390
akmhoquecb017752012-08-16 11:03:45 -0500391 ccn_charbuf_destroy(&data);
392 ccn_charbuf_destroy(&sp.template_ccnb);
393
394 }
395
akmhoque1c9b92f2012-08-13 10:57:50 -0500396}
397
398int
399send_lsdb_interest(struct ccn_schedule *sched, void *clienth,
400 struct ccn_scheduled_event *ev, int flags)
401{
402
403 struct ccn_charbuf *name;
404 long int rnum;
405 char rnumstr[20];
akmhoqueea3603e2012-08-13 11:24:09 -0500406 char lsdb_str[5];
407 char nlsr_str[5];
akmhoque1c9b92f2012-08-13 10:57:50 -0500408
409 int res,i;
410 int adl_element;
411
412 rnum=random();
413 memset(&rnumstr,0,20);
414 sprintf(rnumstr,"%ld",rnum);
akmhoqueea3603e2012-08-13 11:24:09 -0500415 memset(&nlsr_str,0,5);
416 sprintf(nlsr_str,"nlsr");
417 memset(&lsdb_str,0,5);
418 sprintf(lsdb_str,"lsdb");
419
akmhoque1c9b92f2012-08-13 10:57:50 -0500420
421 struct ndn_neighbor *nbr;
422
423 struct hashtb_enumerator ee;
424 struct hashtb_enumerator *e = &ee;
425
426 hashtb_start(nlsr->adl, e);
427 adl_element=hashtb_n(nlsr->adl);
akmhoque07dd8cc2012-08-16 10:23:01 -0500428 //int mynumber=15;
akmhoque1c9b92f2012-08-13 10:57:50 -0500429
430 for(i=0;i<adl_element;i++)
431 {
432 nbr=e->data;
akmhoqueea3603e2012-08-13 11:24:09 -0500433 printf("Sending interest for name prefix:%s/%s/%s/%s\n",nbr->neighbor->name,nlsr_str,lsdb_str,rnumstr);
akmhoque1c9b92f2012-08-13 10:57:50 -0500434 name=ccn_charbuf_create();
435 res=ccn_name_from_uri(name,nbr->neighbor->name);
akmhoqueea3603e2012-08-13 11:24:09 -0500436 ccn_name_append_str(name,nlsr_str);
437 ccn_name_append_str(name,lsdb_str);
akmhoque1c9b92f2012-08-13 10:57:50 -0500438 ccn_name_append_str(name,rnumstr);
439
akmhoque6d49e4d2012-08-14 13:49:30 -0500440 /* adding Exclusion filter */
akmhoquebf1aa832012-08-13 13:26:59 -0500441
akmhoque6d49e4d2012-08-14 13:49:30 -0500442 struct ccn_charbuf *templ;
443 templ = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500444
akmhoque6d49e4d2012-08-14 13:49:30 -0500445 struct ccn_charbuf *c;
446 c = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500447
448
449 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
450 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
451 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque6d49e4d2012-08-14 13:49:30 -0500452 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
453 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
454 ccn_charbuf_reset(c);
akmhoque07dd8cc2012-08-16 10:23:01 -0500455 //ccn_charbuf_putf(c, "%u", (unsigned)mynumber);
456 ccn_charbuf_putf(c, "%s", nbr->last_lsdb_version);
akmhoque6d49e4d2012-08-14 13:49:30 -0500457 ccnb_append_tagged_blob(templ, CCN_DTAG_Component, c->buf, c->length);
458 ccn_charbuf_append_closer(templ); /* </Exclude> */
akmhoque7f337272012-08-14 15:16:30 -0500459 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque37e3adf2012-08-14 15:52:50 -0500460
akmhoque6d49e4d2012-08-14 13:49:30 -0500461
462 /* Adding Exclusion filter done */
463
akmhoque7f337272012-08-14 15:16:30 -0500464 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
465
akmhoque1c9b92f2012-08-13 10:57:50 -0500466 if ( res >= 0 )
467 printf("Interest sending Successfull .... \n");
akmhoque37e3adf2012-08-14 15:52:50 -0500468 ccn_charbuf_destroy(&c);
akmhoque7f337272012-08-14 15:16:30 -0500469 ccn_charbuf_destroy(&templ);
akmhoque1c9b92f2012-08-13 10:57:50 -0500470 ccn_charbuf_destroy(&name);
471
472 hashtb_next(e);
473 }
474
475 hashtb_end(e);
476
akmhoquebf11b1d2012-08-16 11:11:17 -0500477 nlsr->event_send_lsdb_interest = ccn_schedule_event(nlsr->sched, 60000000, &send_lsdb_interest, NULL, 0);
akmhoque1c9b92f2012-08-13 10:57:50 -0500478
479 return 0;
480
481}
482