blob: 2d775aea8332129dfc6e855f4a4fb5d5a0acc05c [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);
akmhoque8a5babe2012-08-16 17:39:33 -0500259 ccn_charbuf_append_string(nbr,"/");
260 ccn_charbuf_append_string(nbr,(const char *)comp_ptr1);
261 }
262
263 ccn_charbuf_append_string(nbr,"\0");
264 printf("Interest Timed out for Neighbor: %s\n",ccn_charbuf_as_string(nbr));
265
266 update_adjacent_status_to_adl(nbr,1);
267
268 ccn_charbuf_destroy(&nbr);
akmhoquedde7e322012-08-16 13:57:06 -0500269}
270
271void
akmhoque1c9b92f2012-08-13 10:57:50 -0500272process_incoming_interest(struct ccn_closure *selfp, struct ccn_upcall_info *info)
273{
274 printf("process_incoming_interest called \n");
275
276
277 struct ccn_charbuf*c;
278 c=ccn_charbuf_create();
279 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
280 printf("%s\n",ccn_charbuf_as_string(c));
281 ccn_charbuf_destroy(&c);
282
283 const unsigned char *comp_ptr1;
284 size_t comp_size;
285 int res,i;
286 int nlsr_position=0;
287 int name_comps=(int)info->interest_comps->n;
288
289 for(i=0;i<name_comps;i++)
290 {
291 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
292 if( res == 0)
293 {
akmhoqueea3603e2012-08-13 11:24:09 -0500294 nlsr_position=i;
akmhoque1c9b92f2012-08-13 10:57:50 -0500295 break;
296 }
297 }
298
299 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
akmhoquee0789862012-08-16 14:23:32 -0500300
akmhoque1c9b92f2012-08-13 10:57:50 -0500301 printf("Det= %s \n",comp_ptr1);
302
303 if(!strcmp((char *)comp_ptr1,"lsdb"))
304 {
akmhoquebf1aa832012-08-13 13:26:59 -0500305 process_incoming_interest_lsdb(selfp,info);
akmhoque1c9b92f2012-08-13 10:57:50 -0500306 }
akmhoquebf1aa832012-08-13 13:26:59 -0500307
308
309}
310
311
312void
313process_incoming_interest_lsdb(struct ccn_closure *selfp, struct ccn_upcall_info *info)
314{
315 printf("process_incoming_interest_lsdb called \n");
316
akmhoquecb017752012-08-16 11:03:45 -0500317 int l, res;
akmhoquefce8cfc2012-08-14 14:00:33 -0500318 const unsigned char *exclbase;
akmhoque6d49e4d2012-08-14 13:49:30 -0500319 size_t size;
akmhoquefce8cfc2012-08-14 14:00:33 -0500320 struct ccn_buf_decoder decoder;
321 struct ccn_buf_decoder *d;
322 const unsigned char *comp;
323
akmhoque6d49e4d2012-08-14 13:49:30 -0500324
325 l = info->pi->offset[CCN_PI_E_Exclude] - info->pi->offset[CCN_PI_B_Exclude];
326 if (l > 0)
327 {
328 comp = NULL;
329 size = 0;
330 exclbase = info->interest_ccnb + info->pi->offset[CCN_PI_B_Exclude];
331 d = ccn_buf_decoder_start(&decoder, exclbase, l);
332 if (ccn_buf_match_dtag(d, CCN_DTAG_Exclude))
333 {
334 ccn_buf_advance(d);
335 if (ccn_buf_match_dtag(d, CCN_DTAG_Any))
336 ccn_buf_advance_past_element(d);
337 if (ccn_buf_match_dtag(d, CCN_DTAG_Component))
338 {
339 ccn_buf_advance(d);
340 ccn_buf_match_blob(d, &comp, &size);
akmhoquec9286692012-08-16 09:57:58 -0500341 ccn_buf_check_close(d);
342
343
akmhoque6d49e4d2012-08-14 13:49:30 -0500344 }
345 ccn_buf_check_close(d);
346 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500347 //if (d->decoder.state < 0)
348 //printf("Parse Failed\n");
akmhoque6d49e4d2012-08-14 13:49:30 -0500349 if (comp != NULL)
akmhoque37e3adf2012-08-14 15:52:50 -0500350 printf("Number in Exclusion Filter is %s\n",comp);
akmhoque6d49e4d2012-08-14 13:49:30 -0500351
352 /* Now comp points to the start of your potential number, and size is its length */
353 }
354
akmhoque07dd8cc2012-08-16 10:23:01 -0500355 int dbcmp=strncmp(nlsr->lsdb->version,(char *)comp,16);
akmhoque898d4aa2012-08-16 10:26:15 -0500356
357 printf (" dbcmp = %d \n",dbcmp);
358
akmhoque07dd8cc2012-08-16 10:23:01 -0500359 if(dbcmp > 0)
akmhoquecb017752012-08-16 11:03:45 -0500360 {
akmhoque898d4aa2012-08-16 10:26:15 -0500361 printf("Has Updated database (Older: %s New: %s)\n",comp,nlsr->lsdb->version);
akmhoquecb017752012-08-16 11:03:45 -0500362 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500363 else
akmhoquecb017752012-08-16 11:03:45 -0500364 {
akmhoque898d4aa2012-08-16 10:26:15 -0500365 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 -0500366 printf("Sending NACK Content back.....\n");
akmhoque07dd8cc2012-08-16 10:23:01 -0500367
akmhoquecb017752012-08-16 11:03:45 -0500368 struct ccn_charbuf *data=ccn_charbuf_create();
369 struct ccn_charbuf *name=ccn_charbuf_create();
370 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
371
akmhoque638c20a2012-08-16 11:57:48 -0500372 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 -0500373 //ccn_name_append_str(name,"0000000000000001");
akmhoquecb017752012-08-16 11:03:45 -0500374
375 sp.template_ccnb=ccn_charbuf_create();
376 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
377 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 10);
378 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
379 ccn_charbuf_append_closer(sp.template_ccnb);
380
381 res= ccn_sign_content(nlsr->ccn, data, name, &sp, "NACK", strlen("NACK"));
akmhoquedde7e322012-08-16 13:57:06 -0500382 if(res >= 0)
383 printf("Signing Content is successful \n");
384
akmhoquecb017752012-08-16 11:03:45 -0500385 res=ccn_put(nlsr->ccn,data->buf,data->length);
akmhoquebf11b1d2012-08-16 11:11:17 -0500386
387 if(res >= 0)
388 printf("Sending NACK Content is successful \n");
389
akmhoquecb017752012-08-16 11:03:45 -0500390 ccn_charbuf_destroy(&data);
391 ccn_charbuf_destroy(&sp.template_ccnb);
392
393 }
394
akmhoque1c9b92f2012-08-13 10:57:50 -0500395}
396
397int
398send_lsdb_interest(struct ccn_schedule *sched, void *clienth,
399 struct ccn_scheduled_event *ev, int flags)
400{
401
402 struct ccn_charbuf *name;
403 long int rnum;
404 char rnumstr[20];
akmhoqueea3603e2012-08-13 11:24:09 -0500405 char lsdb_str[5];
406 char nlsr_str[5];
akmhoque1c9b92f2012-08-13 10:57:50 -0500407
408 int res,i;
409 int adl_element;
410
411 rnum=random();
412 memset(&rnumstr,0,20);
413 sprintf(rnumstr,"%ld",rnum);
akmhoqueea3603e2012-08-13 11:24:09 -0500414 memset(&nlsr_str,0,5);
415 sprintf(nlsr_str,"nlsr");
416 memset(&lsdb_str,0,5);
417 sprintf(lsdb_str,"lsdb");
418
akmhoque1c9b92f2012-08-13 10:57:50 -0500419
420 struct ndn_neighbor *nbr;
421
422 struct hashtb_enumerator ee;
423 struct hashtb_enumerator *e = &ee;
424
425 hashtb_start(nlsr->adl, e);
426 adl_element=hashtb_n(nlsr->adl);
akmhoque07dd8cc2012-08-16 10:23:01 -0500427 //int mynumber=15;
akmhoque1c9b92f2012-08-13 10:57:50 -0500428
429 for(i=0;i<adl_element;i++)
430 {
431 nbr=e->data;
akmhoque3b38ee72012-08-21 09:36:02 -0400432 printf("Sending interest for name prefix:%s/%s/%s\n",nbr->neighbor->name,nlsr_str,lsdb_str);
akmhoque1c9b92f2012-08-13 10:57:50 -0500433 name=ccn_charbuf_create();
434 res=ccn_name_from_uri(name,nbr->neighbor->name);
akmhoqueea3603e2012-08-13 11:24:09 -0500435 ccn_name_append_str(name,nlsr_str);
436 ccn_name_append_str(name,lsdb_str);
akmhoque3b38ee72012-08-21 09:36:02 -0400437 //ccn_name_append_str(name,rnumstr);
akmhoque1c9b92f2012-08-13 10:57:50 -0500438
akmhoque6d49e4d2012-08-14 13:49:30 -0500439 /* adding Exclusion filter */
akmhoquebf1aa832012-08-13 13:26:59 -0500440
akmhoque6d49e4d2012-08-14 13:49:30 -0500441 struct ccn_charbuf *templ;
442 templ = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500443
akmhoque6d49e4d2012-08-14 13:49:30 -0500444 struct ccn_charbuf *c;
445 c = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500446
447
448 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
449 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
450 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque6d49e4d2012-08-14 13:49:30 -0500451 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
452 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
453 ccn_charbuf_reset(c);
akmhoque07dd8cc2012-08-16 10:23:01 -0500454 //ccn_charbuf_putf(c, "%u", (unsigned)mynumber);
akmhoque3b38ee72012-08-21 09:36:02 -0400455 //ccn_charbuf_putf(c, "%s", nbr->last_lsdb_version);
456 ccn_charbuf_putf(c, "%ld", 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