blob: 9698b10fd48dd5023b91358d20dc0906e279b2d1 [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"
24
25enum ccn_upcall_res
26incoming_interest(struct ccn_closure *selfp,
27 enum ccn_upcall_kind kind, struct ccn_upcall_info *info)
28{
29
30 switch (kind) {
31 case CCN_UPCALL_FINAL:
32 break;
33 case CCN_UPCALL_INTEREST:
34 // printing the name prefix for which it received interest
35 printf("Interest Received for name: ");
36 struct ccn_charbuf*c;
37 c=ccn_charbuf_create();
38 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
39 //ccn_name_chop(c,NULL,-1);
40 printf("%s\n",ccn_charbuf_as_string(c));
41 ccn_charbuf_destroy(&c);
42
akmhoque1c9b92f2012-08-13 10:57:50 -050043 process_incoming_interest(selfp, info);
akmhoque59980a52012-08-09 12:36:09 -050044
45 /*
46 struct ccn_charbuf *data=ccn_charbuf_create();
47 struct ccn_charbuf *name=ccn_charbuf_create();
48 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
49
50 ccn_charbuf_append(name, info->interest_ccnb + info->pi->offset[CCN_PI_B_Name],
51 info->pi->offset[CCN_PI_E_Name] - info->pi->offset[CCN_PI_B_Name]);
52
53 sp.template_ccnb=ccn_charbuf_create();
54 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
55 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 1010);
56 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
57 ccn_charbuf_append_closer(sp.template_ccnb);
58
59 res= ccn_sign_content(ospfndn->ccn, data, name, &sp, "hello", strlen("hello"));
60 res=ccn_put(ospfndn->ccn,data->buf,data->length);
61 ccn_charbuf_destroy(&data);
62
63 */
64 break;
65
66 default:
67 break;
68 }
69
70 return CCN_UPCALL_RESULT_OK;
71}
72
73
74enum ccn_upcall_res incoming_content(struct ccn_closure* selfp,
75 enum ccn_upcall_kind kind, struct ccn_upcall_info* info)
76{
77
78
79 switch(kind) {
80 case CCN_UPCALL_FINAL:
81 break;
82 case CCN_UPCALL_CONTENT:
83 printf("Content Received for name: ");
84 struct ccn_charbuf*c;
85 c=ccn_charbuf_create();
86 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E],0);
87 printf("%s\n",ccn_charbuf_as_string(c));
88 ccn_charbuf_destroy(&c);
89
akmhoquecb017752012-08-16 11:03:45 -050090 printf("Content Received for name: ");
91 struct ccn_charbuf*cc;
92 cc=ccn_charbuf_create();
93 ccn_uri_append(cc,info->content_ccnb,info->pco->offset[CCN_PCO_E],0);
94 printf("%s\n",ccn_charbuf_as_string(cc));
95 ccn_charbuf_destroy(&cc);
96
97 process_incoming_content(selfp, info);
98
akmhoque59980a52012-08-09 12:36:09 -050099 break;
100 case CCN_UPCALL_INTEREST_TIMED_OUT:
akmhoquecb017752012-08-16 11:03:45 -0500101 printf("Interest timed out \n");
102 struct ccn_charbuf*ic;
103 ic=ccn_charbuf_create();
104 ccn_uri_append(ic,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
105 printf("%s\n",ccn_charbuf_as_string(ic));
106 ccn_charbuf_destroy(&ic);
107 process_incoming_timed_out_interest(selfp,info);
akmhoque59980a52012-08-09 12:36:09 -0500108
akmhoque59980a52012-08-09 12:36:09 -0500109 break;
110 default:
111 fprintf(stderr, "Unexpected response of kind %d\n", kind);
112 return CCN_UPCALL_RESULT_ERR;
113 }
114
115 return CCN_UPCALL_RESULT_OK;
116}
akmhoque61fe4472012-08-10 10:13:34 -0500117
akmhoquecb017752012-08-16 11:03:45 -0500118
119void
120process_incoming_content(struct ccn_closure* selfp, struct ccn_upcall_info* info)
121{
122 printf("process_incoming_content called \n");
123
akmhoque638c20a2012-08-16 11:57:48 -0500124 struct ccn_charbuf*c;
125 c=ccn_charbuf_create();
akmhoquedde7e322012-08-16 13:57:06 -0500126 //ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
127 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
akmhoque638c20a2012-08-16 11:57:48 -0500128 printf("%s\n",ccn_charbuf_as_string(c));
129 ccn_charbuf_destroy(&c);
130
131 const unsigned char *comp_ptr1;
132 size_t comp_size;
133 int res,i;
134 int nlsr_position=0;
135 int name_comps=(int)info->interest_comps->n;
136
137 for(i=0;i<name_comps;i++)
138 {
139 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
140 if( res == 0)
141 {
142 nlsr_position=i;
143 break;
144 }
145 }
146
147 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
148
149
150 printf("Det= %s \n",comp_ptr1);
151
152 if(!strcmp((char *)comp_ptr1,"lsdb"))
153 {
154 process_incoming_content_lsdb(selfp,info);
155 }
156
157}
158
159
160void
161process_incoming_content_lsdb(struct ccn_closure* selfp, struct ccn_upcall_info* info)
162{
163 printf("process_incoming_content_lsdb called \n");
164
165 const unsigned char *content_data;
166 size_t length;
167 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);
168
akmhoquedde7e322012-08-16 13:57:06 -0500169
170 if ( !strcmp((char *)content_data,"NACK"))
171 {
172 printf("NACK received for LSDB request. Do nothing \n");
173 }
174 else
175 {
176 // Do the LSDB processing here
177
178 }
akmhoque638c20a2012-08-16 11:57:48 -0500179
180
akmhoquecb017752012-08-16 11:03:45 -0500181}
182
183
184void
185process_incoming_timed_out_interest(struct ccn_closure* selfp, struct ccn_upcall_info* info)
186{
187 printf("process_incoming_timed_out_interest called \n");
188
akmhoquedde7e322012-08-16 13:57:06 -0500189 struct ccn_charbuf*c;
190 c=ccn_charbuf_create();
191 //ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
192 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
193 printf("%s\n",ccn_charbuf_as_string(c));
194 ccn_charbuf_destroy(&c);
195
196 const unsigned char *comp_ptr1;
197 size_t comp_size;
198 int res,i;
199 int nlsr_position=0;
200 int name_comps=(int)info->interest_comps->n;
201
202 for(i=0;i<name_comps;i++)
203 {
204 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
205 if( res == 0)
206 {
207 nlsr_position=i;
208 break;
209 }
210 }
211
212 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
213
214
215 printf("Det= %s \n",comp_ptr1);
216
217 if(!strcmp((char *)comp_ptr1,"lsdb"))
218 {
219 process_incoming_timed_out_interest_lsdb(selfp,info);
220 }
akmhoquecb017752012-08-16 11:03:45 -0500221}
222
223
akmhoque1c9b92f2012-08-13 10:57:50 -0500224void
akmhoquedde7e322012-08-16 13:57:06 -0500225process_incoming_timed_out_interest_lsdb(struct ccn_closure* selfp, struct ccn_upcall_info* info)
226{
227 printf("process_incoming_timed_out_interest_lsdb called \n");
228
229
230 int res,i;
231 int nlsr_position=0;
232 int name_comps=(int)info->interest_comps->n;
233
234 //const unsigned char *comp_ptr1;
235 //size_t comp_size;
236
237 for(i=0;i<name_comps;i++)
238 {
239 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
240 if( res == 0)
241 {
242 nlsr_position=i;
243 break;
244 }
245 }
246
247
248 struct ccn_charbuf*c;
249 c=ccn_charbuf_create();
250 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
251 printf("%s\n",ccn_charbuf_as_string(c));
252 ccn_charbuf_destroy(&c);
253
254
255}
256
257void
akmhoque1c9b92f2012-08-13 10:57:50 -0500258process_incoming_interest(struct ccn_closure *selfp, struct ccn_upcall_info *info)
259{
260 printf("process_incoming_interest called \n");
261
262
263 struct ccn_charbuf*c;
264 c=ccn_charbuf_create();
265 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
266 printf("%s\n",ccn_charbuf_as_string(c));
267 ccn_charbuf_destroy(&c);
268
269 const unsigned char *comp_ptr1;
270 size_t comp_size;
271 int res,i;
272 int nlsr_position=0;
273 int name_comps=(int)info->interest_comps->n;
274
275 for(i=0;i<name_comps;i++)
276 {
277 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
akmhoque7ec636a2012-08-16 14:07:56 -0500278
279
280 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,i,&comp_ptr1, &comp_size);
281 printf("%s \n",comp_ptr1);
282
akmhoque1c9b92f2012-08-13 10:57:50 -0500283 if( res == 0)
284 {
akmhoqueea3603e2012-08-13 11:24:09 -0500285 nlsr_position=i;
akmhoque1c9b92f2012-08-13 10:57:50 -0500286 break;
287 }
288 }
289
290 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
291
292
293 printf("Det= %s \n",comp_ptr1);
294
295 if(!strcmp((char *)comp_ptr1,"lsdb"))
296 {
akmhoquebf1aa832012-08-13 13:26:59 -0500297 process_incoming_interest_lsdb(selfp,info);
akmhoque1c9b92f2012-08-13 10:57:50 -0500298 }
akmhoquebf1aa832012-08-13 13:26:59 -0500299
300
301}
302
303
304void
305process_incoming_interest_lsdb(struct ccn_closure *selfp, struct ccn_upcall_info *info)
306{
307 printf("process_incoming_interest_lsdb called \n");
308
akmhoquecb017752012-08-16 11:03:45 -0500309 int l, res;
akmhoquefce8cfc2012-08-14 14:00:33 -0500310 const unsigned char *exclbase;
akmhoque6d49e4d2012-08-14 13:49:30 -0500311 size_t size;
akmhoquefce8cfc2012-08-14 14:00:33 -0500312 struct ccn_buf_decoder decoder;
313 struct ccn_buf_decoder *d;
314 const unsigned char *comp;
315
akmhoque6d49e4d2012-08-14 13:49:30 -0500316
317 l = info->pi->offset[CCN_PI_E_Exclude] - info->pi->offset[CCN_PI_B_Exclude];
318 if (l > 0)
319 {
320 comp = NULL;
321 size = 0;
322 exclbase = info->interest_ccnb + info->pi->offset[CCN_PI_B_Exclude];
323 d = ccn_buf_decoder_start(&decoder, exclbase, l);
324 if (ccn_buf_match_dtag(d, CCN_DTAG_Exclude))
325 {
326 ccn_buf_advance(d);
327 if (ccn_buf_match_dtag(d, CCN_DTAG_Any))
328 ccn_buf_advance_past_element(d);
329 if (ccn_buf_match_dtag(d, CCN_DTAG_Component))
330 {
331 ccn_buf_advance(d);
332 ccn_buf_match_blob(d, &comp, &size);
akmhoquec9286692012-08-16 09:57:58 -0500333 ccn_buf_check_close(d);
334
335
akmhoque6d49e4d2012-08-14 13:49:30 -0500336 }
337 ccn_buf_check_close(d);
338 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500339 //if (d->decoder.state < 0)
340 //printf("Parse Failed\n");
akmhoque6d49e4d2012-08-14 13:49:30 -0500341 if (comp != NULL)
akmhoque37e3adf2012-08-14 15:52:50 -0500342 printf("Number in Exclusion Filter is %s\n",comp);
akmhoque6d49e4d2012-08-14 13:49:30 -0500343
344 /* Now comp points to the start of your potential number, and size is its length */
345 }
346
akmhoque07dd8cc2012-08-16 10:23:01 -0500347 int dbcmp=strncmp(nlsr->lsdb->version,(char *)comp,16);
akmhoque898d4aa2012-08-16 10:26:15 -0500348
349 printf (" dbcmp = %d \n",dbcmp);
350
akmhoque07dd8cc2012-08-16 10:23:01 -0500351 if(dbcmp > 0)
akmhoquecb017752012-08-16 11:03:45 -0500352 {
akmhoque898d4aa2012-08-16 10:26:15 -0500353 printf("Has Updated database (Older: %s New: %s)\n",comp,nlsr->lsdb->version);
akmhoquecb017752012-08-16 11:03:45 -0500354 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500355 else
akmhoquecb017752012-08-16 11:03:45 -0500356 {
akmhoque898d4aa2012-08-16 10:26:15 -0500357 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 -0500358 printf("Sending NACK Content back.....\n");
akmhoque07dd8cc2012-08-16 10:23:01 -0500359
akmhoquecb017752012-08-16 11:03:45 -0500360 struct ccn_charbuf *data=ccn_charbuf_create();
361 struct ccn_charbuf *name=ccn_charbuf_create();
362 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
363
akmhoque638c20a2012-08-16 11:57:48 -0500364 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]);
akmhoquef9fffe72012-08-16 14:01:28 -0500365 ccn_name_append_str(name,"0000000000000001");
akmhoquecb017752012-08-16 11:03:45 -0500366
367 sp.template_ccnb=ccn_charbuf_create();
368 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
369 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 10);
370 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
371 ccn_charbuf_append_closer(sp.template_ccnb);
372
373 res= ccn_sign_content(nlsr->ccn, data, name, &sp, "NACK", strlen("NACK"));
akmhoquedde7e322012-08-16 13:57:06 -0500374 if(res >= 0)
375 printf("Signing Content is successful \n");
376
akmhoquecb017752012-08-16 11:03:45 -0500377 res=ccn_put(nlsr->ccn,data->buf,data->length);
akmhoquebf11b1d2012-08-16 11:11:17 -0500378
379 if(res >= 0)
380 printf("Sending NACK Content is successful \n");
381
akmhoquecb017752012-08-16 11:03:45 -0500382 ccn_charbuf_destroy(&data);
383 ccn_charbuf_destroy(&sp.template_ccnb);
384
385 }
386
akmhoque1c9b92f2012-08-13 10:57:50 -0500387}
388
389int
390send_lsdb_interest(struct ccn_schedule *sched, void *clienth,
391 struct ccn_scheduled_event *ev, int flags)
392{
393
394 struct ccn_charbuf *name;
395 long int rnum;
396 char rnumstr[20];
akmhoqueea3603e2012-08-13 11:24:09 -0500397 char lsdb_str[5];
398 char nlsr_str[5];
akmhoque1c9b92f2012-08-13 10:57:50 -0500399
400 int res,i;
401 int adl_element;
402
403 rnum=random();
404 memset(&rnumstr,0,20);
405 sprintf(rnumstr,"%ld",rnum);
akmhoqueea3603e2012-08-13 11:24:09 -0500406 memset(&nlsr_str,0,5);
407 sprintf(nlsr_str,"nlsr");
408 memset(&lsdb_str,0,5);
409 sprintf(lsdb_str,"lsdb");
410
akmhoque1c9b92f2012-08-13 10:57:50 -0500411
412 struct ndn_neighbor *nbr;
413
414 struct hashtb_enumerator ee;
415 struct hashtb_enumerator *e = &ee;
416
417 hashtb_start(nlsr->adl, e);
418 adl_element=hashtb_n(nlsr->adl);
akmhoque07dd8cc2012-08-16 10:23:01 -0500419 //int mynumber=15;
akmhoque1c9b92f2012-08-13 10:57:50 -0500420
421 for(i=0;i<adl_element;i++)
422 {
423 nbr=e->data;
akmhoqueea3603e2012-08-13 11:24:09 -0500424 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 -0500425 name=ccn_charbuf_create();
426 res=ccn_name_from_uri(name,nbr->neighbor->name);
akmhoqueea3603e2012-08-13 11:24:09 -0500427 ccn_name_append_str(name,nlsr_str);
428 ccn_name_append_str(name,lsdb_str);
akmhoque1c9b92f2012-08-13 10:57:50 -0500429 ccn_name_append_str(name,rnumstr);
430
akmhoque6d49e4d2012-08-14 13:49:30 -0500431 /* adding Exclusion filter */
akmhoquebf1aa832012-08-13 13:26:59 -0500432
akmhoque6d49e4d2012-08-14 13:49:30 -0500433 struct ccn_charbuf *templ;
434 templ = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500435
akmhoque6d49e4d2012-08-14 13:49:30 -0500436 struct ccn_charbuf *c;
437 c = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500438
439
440 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
441 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
442 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque6d49e4d2012-08-14 13:49:30 -0500443 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
444 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
445 ccn_charbuf_reset(c);
akmhoque07dd8cc2012-08-16 10:23:01 -0500446 //ccn_charbuf_putf(c, "%u", (unsigned)mynumber);
447 ccn_charbuf_putf(c, "%s", nbr->last_lsdb_version);
akmhoque6d49e4d2012-08-14 13:49:30 -0500448 ccnb_append_tagged_blob(templ, CCN_DTAG_Component, c->buf, c->length);
449 ccn_charbuf_append_closer(templ); /* </Exclude> */
akmhoque7f337272012-08-14 15:16:30 -0500450 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque37e3adf2012-08-14 15:52:50 -0500451
akmhoque6d49e4d2012-08-14 13:49:30 -0500452
453 /* Adding Exclusion filter done */
454
akmhoque7f337272012-08-14 15:16:30 -0500455 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
456
akmhoque1c9b92f2012-08-13 10:57:50 -0500457 if ( res >= 0 )
458 printf("Interest sending Successfull .... \n");
akmhoque37e3adf2012-08-14 15:52:50 -0500459 ccn_charbuf_destroy(&c);
akmhoque7f337272012-08-14 15:16:30 -0500460 ccn_charbuf_destroy(&templ);
akmhoque1c9b92f2012-08-13 10:57:50 -0500461 ccn_charbuf_destroy(&name);
462
463 hashtb_next(e);
464 }
465
466 hashtb_end(e);
467
akmhoquebf11b1d2012-08-16 11:11:17 -0500468 nlsr->event_send_lsdb_interest = ccn_schedule_event(nlsr->sched, 60000000, &send_lsdb_interest, NULL, 0);
akmhoque1c9b92f2012-08-13 10:57:50 -0500469
470 return 0;
471
472}
473