blob: 6d6a56c6e3edaa733d179483606882bcd92e1b4d [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
akmhoque0a44edc2012-08-21 10:20:06 -0400355 int db_version=atoi((char *)comp);
356 int dbcmp=db_version- nlsr->lsdb->version;
357
358 //int dbcmp=strncmp(nlsr->lsdb->version,(char *)comp,16);
akmhoque898d4aa2012-08-16 10:26:15 -0500359
akmhoque0a44edc2012-08-21 10:20:06 -0400360 //printf (" dbcmp = %d \n",dbcmp);
akmhoque898d4aa2012-08-16 10:26:15 -0500361
akmhoque07dd8cc2012-08-16 10:23:01 -0500362 if(dbcmp > 0)
akmhoquecb017752012-08-16 11:03:45 -0500363 {
akmhoque0a44edc2012-08-21 10:20:06 -0400364 printf("Has Updated database (Older: %s New: %ld)\n",comp,nlsr->lsdb->version);
akmhoquecb017752012-08-16 11:03:45 -0500365 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500366 else
akmhoquecb017752012-08-16 11:03:45 -0500367 {
akmhoque0a44edc2012-08-21 10:20:06 -0400368 printf("Data base is not updated than the older one (Older: %s New: %ld)\n",comp,nlsr->lsdb->version);
akmhoquecb017752012-08-16 11:03:45 -0500369 printf("Sending NACK Content back.....\n");
akmhoque07dd8cc2012-08-16 10:23:01 -0500370
akmhoquecb017752012-08-16 11:03:45 -0500371 struct ccn_charbuf *data=ccn_charbuf_create();
372 struct ccn_charbuf *name=ccn_charbuf_create();
373 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
374
akmhoque638c20a2012-08-16 11:57:48 -0500375 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 -0500376 //ccn_name_append_str(name,"0000000000000001");
akmhoquecb017752012-08-16 11:03:45 -0500377
378 sp.template_ccnb=ccn_charbuf_create();
379 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
380 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 10);
381 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
382 ccn_charbuf_append_closer(sp.template_ccnb);
383
384 res= ccn_sign_content(nlsr->ccn, data, name, &sp, "NACK", strlen("NACK"));
akmhoquedde7e322012-08-16 13:57:06 -0500385 if(res >= 0)
386 printf("Signing Content is successful \n");
387
akmhoquecb017752012-08-16 11:03:45 -0500388 res=ccn_put(nlsr->ccn,data->buf,data->length);
akmhoquebf11b1d2012-08-16 11:11:17 -0500389
390 if(res >= 0)
391 printf("Sending NACK Content is successful \n");
392
akmhoquecb017752012-08-16 11:03:45 -0500393 ccn_charbuf_destroy(&data);
394 ccn_charbuf_destroy(&sp.template_ccnb);
395
396 }
397
akmhoque1c9b92f2012-08-13 10:57:50 -0500398}
399
400int
401send_lsdb_interest(struct ccn_schedule *sched, void *clienth,
402 struct ccn_scheduled_event *ev, int flags)
403{
404
405 struct ccn_charbuf *name;
406 long int rnum;
407 char rnumstr[20];
akmhoqueea3603e2012-08-13 11:24:09 -0500408 char lsdb_str[5];
409 char nlsr_str[5];
akmhoque1c9b92f2012-08-13 10:57:50 -0500410
411 int res,i;
412 int adl_element;
413
414 rnum=random();
415 memset(&rnumstr,0,20);
416 sprintf(rnumstr,"%ld",rnum);
akmhoqueea3603e2012-08-13 11:24:09 -0500417 memset(&nlsr_str,0,5);
418 sprintf(nlsr_str,"nlsr");
419 memset(&lsdb_str,0,5);
420 sprintf(lsdb_str,"lsdb");
421
akmhoque1c9b92f2012-08-13 10:57:50 -0500422
423 struct ndn_neighbor *nbr;
424
425 struct hashtb_enumerator ee;
426 struct hashtb_enumerator *e = &ee;
427
428 hashtb_start(nlsr->adl, e);
429 adl_element=hashtb_n(nlsr->adl);
akmhoque07dd8cc2012-08-16 10:23:01 -0500430 //int mynumber=15;
akmhoque1c9b92f2012-08-13 10:57:50 -0500431
432 for(i=0;i<adl_element;i++)
433 {
434 nbr=e->data;
akmhoque1d7343f2012-08-21 10:46:35 -0400435 printf("Sending interest for name prefix:%s/%s/%s\n",nbr->neighbor->name,nlsr_str,lsdb_str);
akmhoque1c9b92f2012-08-13 10:57:50 -0500436 name=ccn_charbuf_create();
akmhoque1d7343f2012-08-21 10:46:35 -0400437 res=ccn_name_from_uri(name,nbr->neighbor->name);
akmhoqueea3603e2012-08-13 11:24:09 -0500438 ccn_name_append_str(name,nlsr_str);
439 ccn_name_append_str(name,lsdb_str);
akmhoque3b38ee72012-08-21 09:36:02 -0400440 //ccn_name_append_str(name,rnumstr);
akmhoque1c9b92f2012-08-13 10:57:50 -0500441
akmhoque6d49e4d2012-08-14 13:49:30 -0500442 /* adding Exclusion filter */
akmhoquebf1aa832012-08-13 13:26:59 -0500443
akmhoque6d49e4d2012-08-14 13:49:30 -0500444 struct ccn_charbuf *templ;
445 templ = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500446
akmhoque6d49e4d2012-08-14 13:49:30 -0500447 struct ccn_charbuf *c;
448 c = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500449
450
451 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
452 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
453 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque6d49e4d2012-08-14 13:49:30 -0500454 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
455 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
456 ccn_charbuf_reset(c);
akmhoque07dd8cc2012-08-16 10:23:01 -0500457 //ccn_charbuf_putf(c, "%u", (unsigned)mynumber);
akmhoque3b38ee72012-08-21 09:36:02 -0400458 //ccn_charbuf_putf(c, "%s", nbr->last_lsdb_version);
459 ccn_charbuf_putf(c, "%ld", nbr->last_lsdb_version);
akmhoque6d49e4d2012-08-14 13:49:30 -0500460 ccnb_append_tagged_blob(templ, CCN_DTAG_Component, c->buf, c->length);
461 ccn_charbuf_append_closer(templ); /* </Exclude> */
akmhoque7f337272012-08-14 15:16:30 -0500462 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque37e3adf2012-08-14 15:52:50 -0500463
akmhoque6d49e4d2012-08-14 13:49:30 -0500464
465 /* Adding Exclusion filter done */
466
akmhoque7f337272012-08-14 15:16:30 -0500467 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
468
akmhoque1c9b92f2012-08-13 10:57:50 -0500469 if ( res >= 0 )
470 printf("Interest sending Successfull .... \n");
akmhoque37e3adf2012-08-14 15:52:50 -0500471 ccn_charbuf_destroy(&c);
akmhoque7f337272012-08-14 15:16:30 -0500472 ccn_charbuf_destroy(&templ);
akmhoque1c9b92f2012-08-13 10:57:50 -0500473 ccn_charbuf_destroy(&name);
474
akmhoque1d7343f2012-08-21 10:46:35 -0400475 hashtb_next(e);
akmhoque1c9b92f2012-08-13 10:57:50 -0500476 }
477
478 hashtb_end(e);
479
akmhoquebf11b1d2012-08-16 11:11:17 -0500480 nlsr->event_send_lsdb_interest = ccn_schedule_event(nlsr->sched, 60000000, &send_lsdb_interest, NULL, 0);
akmhoque1c9b92f2012-08-13 10:57:50 -0500481
482 return 0;
483
484}
485