blob: 19cf8938de0def78a0f4018e57fc4fefbdd58cf9 [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"
akmhoque03004e62012-09-06 01:12:28 -050022#include "nlsr_npl.h"
akmhoque8a5babe2012-08-16 17:39:33 -050023#include "nlsr_adl.h"
akmhoqued79438d2012-08-27 13:31:42 -050024#include "nlsr_lsdb.h"
akmhoque53f64222012-09-05 13:57:51 -050025#include "utility.h"
26
akmhoqued79438d2012-08-27 13:31:42 -050027int
28appendLifetime(struct ccn_charbuf *cb, int lifetime)
29{
30 unsigned char buf[sizeof(int32_t)];
31 int32_t dreck = lifetime << 12;
32 int pos = sizeof(int32_t);
33 int res = 0;
34 while (dreck > 0 && pos > 0)
35 {
36 pos--;
37 buf[pos] = dreck & 255;
38 dreck = dreck >> 8;
39 }
40 res |= ccnb_append_tagged_blob(cb, CCN_DTAG_InterestLifetime, buf+pos, sizeof(buf)-pos);
41 return res;
42}
akmhoque59980a52012-08-09 12:36:09 -050043
akmhoque53f64222012-09-05 13:57:51 -050044
45void
46get_nbr(struct name_prefix *nbr,struct ccn_closure *selfp, struct ccn_upcall_info *info)
47{
48
49 printf("get_nbr called\n");
50 int res,i;
51 int nlsr_position=0;
52 int name_comps=(int)info->interest_comps->n;
53 int len=0;
54
55 for(i=0;i<name_comps;i++)
56 {
57 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
58 if( res == 0)
59 {
60 nlsr_position=i;
61 break;
62 }
63 }
64
65
66 const unsigned char *comp_ptr1;
67 size_t comp_size;
68 for(i=0;i<nlsr_position;i++)
69 {
70 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,i,&comp_ptr1, &comp_size);
71 len+=1;
72 len+=(int)comp_size;
73 }
74 len++;
75
76 char *neighbor=(char *)malloc(len);
77 memset(neighbor,0,len);
78
79 for(i=0; i<nlsr_position;i++)
80 {
81 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,i,&comp_ptr1, &comp_size);
82 memcpy(neighbor+strlen(neighbor),"/",1);
83 memcpy(neighbor+strlen(neighbor),(char *)comp_ptr1,strlen((char *)comp_ptr1));
84
85 }
akmhoque53f64222012-09-05 13:57:51 -050086
87 nbr->name=(char *)malloc(strlen(neighbor)+1);
88 memcpy(nbr->name,neighbor,strlen(neighbor)+1);
89 nbr->length=strlen(neighbor)+1;
90
91 printf("Neighbor: %s Length: %d\n",nbr->name,nbr->length);
92
93
94}
95
96void
akmhoque03004e62012-09-06 01:12:28 -050097get_lsa_identifier(struct name_prefix *lsaId,struct ccn_closure *selfp, struct ccn_upcall_info *info, int offset)
akmhoque53f64222012-09-05 13:57:51 -050098{
99
akmhoque03004e62012-09-06 01:12:28 -0500100 printf("get_lsa_identifier called\n");
akmhoque53f64222012-09-05 13:57:51 -0500101 int res,i;
102 int nlsr_position=0;
103 int name_comps=(int)info->interest_comps->n;
104 int len=0;
105
106 for(i=0;i<name_comps;i++)
107 {
108 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
109 if( res == 0)
110 {
111 nlsr_position=i;
112 break;
113 }
114 }
115
116
117 const unsigned char *comp_ptr1;
118 size_t comp_size;
akmhoque03004e62012-09-06 01:12:28 -0500119 for(i=nlsr_position+3+offset;i<info->interest_comps->n-1;i++)
akmhoque53f64222012-09-05 13:57:51 -0500120 {
121 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,i,&comp_ptr1, &comp_size);
122 len+=1;
123 len+=(int)comp_size;
124 }
125 len++;
126
127 char *neighbor=(char *)malloc(len);
128 memset(neighbor,0,len);
129
akmhoque03004e62012-09-06 01:12:28 -0500130 for(i=nlsr_position+3+offset; i<info->interest_comps->n-1;i++)
akmhoque53f64222012-09-05 13:57:51 -0500131 {
132 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,i,&comp_ptr1, &comp_size);
133 memcpy(neighbor+strlen(neighbor),"/",1);
134 memcpy(neighbor+strlen(neighbor),(char *)comp_ptr1,strlen((char *)comp_ptr1));
135
136 }
akmhoque53f64222012-09-05 13:57:51 -0500137
138 lsaId->name=(char *)malloc(strlen(neighbor)+1);
139 memset(lsaId->name,0,strlen(neighbor)+1);
140 memcpy(lsaId->name,neighbor,strlen(neighbor)+1);
141 lsaId->length=strlen(neighbor)+1;
142
143 printf("LSA Identifier: %s Length: %d\n",lsaId->name,lsaId->length-1);
akmhoque03004e62012-09-06 01:12:28 -0500144
akmhoque53f64222012-09-05 13:57:51 -0500145
146}
147
akmhoque03004e62012-09-06 01:12:28 -0500148int
149get_ls_type(struct ccn_closure *selfp, struct ccn_upcall_info *info)
150{
151 int res,i;
152 int nlsr_position=0;
153 int name_comps=(int)info->interest_comps->n;
154
155 int ret=0;
156
157 for(i=0;i<name_comps;i++)
158 {
159 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
160 if( res == 0)
161 {
162 nlsr_position=i;
163 break;
164 }
165 }
166
167
168 const unsigned char *comp_ptr1;
169 size_t comp_size;
170 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+2,&comp_ptr1, &comp_size);
171
172 ret=atoi((char *)comp_ptr1);
173
174 return ret;
175
176}
177
178void
179get_lsdb_version(char *lsdb_version,struct ccn_closure *selfp, struct ccn_upcall_info *info )
180{
181 const unsigned char *comp_ptr1;
182 size_t comp_size;
183 ccn_name_comp_get(info->content_ccnb, info->content_comps,info->content_comps->n-2,&comp_ptr1, &comp_size);
184 memcpy(lsdb_version,(char *)comp_ptr1,(int)comp_size);
185
186}
187
188
189/* Call back function registered in ccnd to get all interest coming to NLSR application */
190
akmhoque59980a52012-08-09 12:36:09 -0500191enum ccn_upcall_res
192incoming_interest(struct ccn_closure *selfp,
193 enum ccn_upcall_kind kind, struct ccn_upcall_info *info)
194{
akmhoqueffacaa82012-09-13 17:48:30 -0500195
196 nlsr_lock();
197
akmhoque59980a52012-08-09 12:36:09 -0500198 switch (kind) {
199 case CCN_UPCALL_FINAL:
200 break;
201 case CCN_UPCALL_INTEREST:
akmhoque03004e62012-09-06 01:12:28 -0500202 // printing the name prefix for which it received interest
203 printf("Interest Received for name: ");
204 struct ccn_charbuf*c;
205 c=ccn_charbuf_create();
206 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name],0);
207 printf("%s\n",ccn_charbuf_as_string(c));
208 ccn_charbuf_destroy(&c);
209
akmhoque1c9b92f2012-08-13 10:57:50 -0500210 process_incoming_interest(selfp, info);
akmhoque03004e62012-09-06 01:12:28 -0500211
akmhoque59980a52012-08-09 12:36:09 -0500212 break;
akmhoque03004e62012-09-06 01:12:28 -0500213
akmhoque59980a52012-08-09 12:36:09 -0500214 default:
215 break;
216 }
akmhoque03004e62012-09-06 01:12:28 -0500217
akmhoqueffacaa82012-09-13 17:48:30 -0500218 nlsr_unlock();
219
akmhoque59980a52012-08-09 12:36:09 -0500220 return CCN_UPCALL_RESULT_OK;
221}
222
akmhoque03004e62012-09-06 01:12:28 -0500223/* Function for processing incoming interest and reply with content/NACK content */
akmhoque59980a52012-08-09 12:36:09 -0500224
akmhoqued79438d2012-08-27 13:31:42 -0500225void
akmhoque1c9b92f2012-08-13 10:57:50 -0500226process_incoming_interest(struct ccn_closure *selfp, struct ccn_upcall_info *info)
227{
228 printf("process_incoming_interest called \n");
akmhoque1c9b92f2012-08-13 10:57:50 -0500229 const unsigned char *comp_ptr1;
230 size_t comp_size;
231 int res,i;
232 int nlsr_position=0;
233 int name_comps=(int)info->interest_comps->n;
akmhoque53f64222012-09-05 13:57:51 -0500234
akmhoque1c9b92f2012-08-13 10:57:50 -0500235 for(i=0;i<name_comps;i++)
236 {
237 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
238 if( res == 0)
239 {
akmhoqueea3603e2012-08-13 11:24:09 -0500240 nlsr_position=i;
akmhoque1c9b92f2012-08-13 10:57:50 -0500241 break;
242 }
243 }
244
245 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
akmhoque53f64222012-09-05 13:57:51 -0500246
akmhoque1c9b92f2012-08-13 10:57:50 -0500247 printf("Det= %s \n",comp_ptr1);
248
akmhoqued79438d2012-08-27 13:31:42 -0500249 if(!strcmp((char *)comp_ptr1,"info"))
250 {
251 process_incoming_interest_info(selfp,info);
252 }
akmhoque53f64222012-09-05 13:57:51 -0500253 if(!strcmp((char *)comp_ptr1,"lsdb"))
254 {
255 process_incoming_interest_lsdb(selfp,info);
256 }
257 if(!strcmp((char *)comp_ptr1,"lsa"))
258 {
259 process_incoming_interest_lsa(selfp,info);
260 }
akmhoque53f64222012-09-05 13:57:51 -0500261}
262
263void
264process_incoming_interest_info(struct ccn_closure *selfp, struct ccn_upcall_info *info)
265{
266 printf("process_incoming_interest_info called \n");
akmhoque53f64222012-09-05 13:57:51 -0500267
akmhoque03004e62012-09-06 01:12:28 -0500268 printf("Sending Info Content back.....\n");
akmhoque53f64222012-09-05 13:57:51 -0500269 int res;
270 struct ccn_charbuf *data=ccn_charbuf_create();
271 struct ccn_charbuf *name=ccn_charbuf_create();
272 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
akmhoque03004e62012-09-06 01:12:28 -0500273
akmhoque53f64222012-09-05 13:57:51 -0500274 res=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]);
275 if (res >= 0)
276 {
277 sp.template_ccnb=ccn_charbuf_create();
278 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
279 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 10);
280 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
281 ccn_charbuf_append_closer(sp.template_ccnb);
282
283
284 char *raw_data=(char *)malloc(16);
285 memset(raw_data,0,16);
286 sprintf(raw_data,"%ld", nlsr->lsdb_synch_interval);
287
288 res= ccn_sign_content(nlsr->ccn, data, name, &sp, raw_data,strlen(raw_data));
289 if(res >= 0)
290 printf("Signing Content is successful \n");
291
292 res=ccn_put(nlsr->ccn,data->buf,data->length);
293 if(res >= 0)
294 printf("Sending Info Content is successful \n");
295
296 printf("Info Content sending done....\n");
297
298
299 struct name_prefix *nbr=(struct name_prefix * )malloc(sizeof(struct name_prefix *));
akmhoque03004e62012-09-06 01:12:28 -0500300 get_lsa_identifier(nbr,selfp,info,-1);
akmhoque53f64222012-09-05 13:57:51 -0500301 printf("Neighbor : %s Length : %d Status : %d\n",nbr->name,nbr->length,get_adjacent_status(nbr));
akmhoque03004e62012-09-06 01:12:28 -0500302
akmhoque53f64222012-09-05 13:57:51 -0500303
304 if( get_adjacent_status(nbr) == 0 && get_timed_out_number(nbr)>=nlsr->interest_retry )
305 {
306 send_info_interest_to_neighbor(nbr);
307 }
308
309 free(nbr);
310 free(raw_data);
311 ccn_charbuf_destroy(&sp.template_ccnb);
312 }
akmhoque03004e62012-09-06 01:12:28 -0500313
akmhoque53f64222012-09-05 13:57:51 -0500314 ccn_charbuf_destroy(&data);
akmhoque03004e62012-09-06 01:12:28 -0500315 ccn_charbuf_destroy(&name);
akmhoque53f64222012-09-05 13:57:51 -0500316
akmhoquebf1aa832012-08-13 13:26:59 -0500317}
318
319
320void
321process_incoming_interest_lsdb(struct ccn_closure *selfp, struct ccn_upcall_info *info)
322{
323 printf("process_incoming_interest_lsdb called \n");
akmhoque53f64222012-09-05 13:57:51 -0500324
325 int l,res;
akmhoquefce8cfc2012-08-14 14:00:33 -0500326 const unsigned char *exclbase;
akmhoque6d49e4d2012-08-14 13:49:30 -0500327 size_t size;
akmhoquefce8cfc2012-08-14 14:00:33 -0500328 struct ccn_buf_decoder decoder;
329 struct ccn_buf_decoder *d;
akmhoque53f64222012-09-05 13:57:51 -0500330 const unsigned char *comp;
331 int dbcmp=0;
akmhoque6d49e4d2012-08-14 13:49:30 -0500332
333 l = info->pi->offset[CCN_PI_E_Exclude] - info->pi->offset[CCN_PI_B_Exclude];
334 if (l > 0)
335 {
336 comp = NULL;
337 size = 0;
338 exclbase = info->interest_ccnb + info->pi->offset[CCN_PI_B_Exclude];
339 d = ccn_buf_decoder_start(&decoder, exclbase, l);
340 if (ccn_buf_match_dtag(d, CCN_DTAG_Exclude))
341 {
342 ccn_buf_advance(d);
343 if (ccn_buf_match_dtag(d, CCN_DTAG_Any))
344 ccn_buf_advance_past_element(d);
345 if (ccn_buf_match_dtag(d, CCN_DTAG_Component))
346 {
347 ccn_buf_advance(d);
348 ccn_buf_match_blob(d, &comp, &size);
akmhoquec9286692012-08-16 09:57:58 -0500349 ccn_buf_check_close(d);
akmhoque53f64222012-09-05 13:57:51 -0500350
351
akmhoque6d49e4d2012-08-14 13:49:30 -0500352 }
353 ccn_buf_check_close(d);
354 }
akmhoque6d49e4d2012-08-14 13:49:30 -0500355 if (comp != NULL)
akmhoque53f64222012-09-05 13:57:51 -0500356 {
357 printf("LSDB Version in Exclusion Filter is %s\n",comp);
akmhoque03004e62012-09-06 01:12:28 -0500358 printf("LSDB Version of own NLSR is: %s \n",nlsr->lsdb->lsdb_version);
359 dbcmp=strcmp(nlsr->lsdb->lsdb_version,(char *)comp);
akmhoque53f64222012-09-05 13:57:51 -0500360 }
akmhoque6d49e4d2012-08-14 13:49:30 -0500361 /* Now comp points to the start of your potential number, and size is its length */
362 }
akmhoque53f64222012-09-05 13:57:51 -0500363 else
akmhoquecb017752012-08-16 11:03:45 -0500364 {
akmhoque53f64222012-09-05 13:57:51 -0500365 printf("LSDB Version in Exclusion Filter is: None Added\n");
366 dbcmp=1;
akmhoquecb017752012-08-16 11:03:45 -0500367
368 }
369
akmhoqued79438d2012-08-27 13:31:42 -0500370 struct ccn_charbuf *data=ccn_charbuf_create();
akmhoque53f64222012-09-05 13:57:51 -0500371 struct ccn_charbuf *name=ccn_charbuf_create();
372 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
373
akmhoque03004e62012-09-06 01:12:28 -0500374 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]);
akmhoque887fc0c2012-08-27 15:06:06 -0500375
akmhoqued79438d2012-08-27 13:31:42 -0500376 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);
akmhoque53f64222012-09-05 13:57:51 -0500379 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
380 ccn_charbuf_append_closer(sp.template_ccnb);
akmhoqued79438d2012-08-27 13:31:42 -0500381
akmhoqued79438d2012-08-27 13:31:42 -0500382
akmhoque53f64222012-09-05 13:57:51 -0500383 if(dbcmp>0)
384 {
385 printf("Has Updated Database than Neighbor\n");
akmhoque03004e62012-09-06 01:12:28 -0500386 printf("Sending LSDB Summary of Updated LSDB Content...\n");
akmhoque53f64222012-09-05 13:57:51 -0500387
akmhoque03004e62012-09-06 01:12:28 -0500388 ccn_name_append_str(name,nlsr->lsdb->lsdb_version);
akmhoque53f64222012-09-05 13:57:51 -0500389
akmhoque03004e62012-09-06 01:12:28 -0500390 struct ccn_charbuf *lsdb_data=ccn_charbuf_create();
391 get_lsdb_summary(lsdb_data);
akmhoque53f64222012-09-05 13:57:51 -0500392
akmhoque03004e62012-09-06 01:12:28 -0500393 char *raw_data=ccn_charbuf_as_string(lsdb_data);
akmhoque53f64222012-09-05 13:57:51 -0500394
akmhoque03004e62012-09-06 01:12:28 -0500395 //printf("Content Data to be sent: %s \n",raw_data);
akmhoque53f64222012-09-05 13:57:51 -0500396
akmhoque29c1db52012-09-07 14:47:43 -0500397 if( nlsr->is_build_adj_lsa_sheduled == 1 || strlen((char *)raw_data) == 0 )
akmhoque53f64222012-09-05 13:57:51 -0500398 {
399 res= ccn_sign_content(nlsr->ccn, data, name, &sp, "WAIT" , strlen("WAIT"));
400 }
401 else
402 {
403 res= ccn_sign_content(nlsr->ccn, data, name, &sp, raw_data , strlen(raw_data));
404 }
405 if(res >= 0)
406 printf("Signing LSDB Summary of Updated LSDB Content is successful \n");
407
408 res=ccn_put(nlsr->ccn,data->buf,data->length);
409
410 if(res >= 0)
411 printf("Sending LSDB Summary of Updated LSDB Content is successful \n");
akmhoque03004e62012-09-06 01:12:28 -0500412
413 ccn_charbuf_destroy(&lsdb_data);
akmhoque53f64222012-09-05 13:57:51 -0500414 }
415 else
416 {
417 printf("Does not have Updated Database than Neighbor\n");
418
419 printf("Sending NACK Content.....\n");
akmhoque53f64222012-09-05 13:57:51 -0500420 res= ccn_sign_content(nlsr->ccn, data, name, &sp, "NACK", strlen("NACK"));
421 if(res >= 0)
422 printf("Signing NACK Content is successful \n");
423
424 res=ccn_put(nlsr->ccn,data->buf,data->length);
425
426 if(res >= 0)
427 printf("Sending NACK Content is successful \n");
428
429
430 }
akmhoqued79438d2012-08-27 13:31:42 -0500431
432 ccn_charbuf_destroy(&data);
akmhoqued79438d2012-08-27 13:31:42 -0500433 ccn_charbuf_destroy(&name);
434 ccn_charbuf_destroy(&sp.template_ccnb);
435
akmhoque03004e62012-09-06 01:12:28 -0500436
akmhoqued79438d2012-08-27 13:31:42 -0500437}
438
akmhoque03004e62012-09-06 01:12:28 -0500439
akmhoque53f64222012-09-05 13:57:51 -0500440void
441process_incoming_interest_lsa(struct ccn_closure *selfp, struct ccn_upcall_info *info)
akmhoque1c9b92f2012-08-13 10:57:50 -0500442{
akmhoque53f64222012-09-05 13:57:51 -0500443 printf("process_incoming_interest_lsa called \n");
akmhoque1c9b92f2012-08-13 10:57:50 -0500444
akmhoque53f64222012-09-05 13:57:51 -0500445 int res;
akmhoque1c9b92f2012-08-13 10:57:50 -0500446
akmhoque53f64222012-09-05 13:57:51 -0500447 struct name_prefix *lsaId=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
akmhoque03004e62012-09-06 01:12:28 -0500448 get_lsa_identifier(lsaId,selfp,info,0);
akmhoque1c9b92f2012-08-13 10:57:50 -0500449
akmhoque03004e62012-09-06 01:12:28 -0500450 printf("LSA Identifier: %s Length: %d\n",lsaId->name,lsaId->length);
451 int ls_type=get_ls_type(selfp, info);
akmhoque1c9b92f2012-08-13 10:57:50 -0500452
akmhoque53f64222012-09-05 13:57:51 -0500453 struct ccn_charbuf *lsa_data=ccn_charbuf_create();
454
akmhoque03004e62012-09-06 01:12:28 -0500455 if ( ls_type == LS_TYPE_NAME )
akmhoque1c9b92f2012-08-13 10:57:50 -0500456 {
akmhoque53f64222012-09-05 13:57:51 -0500457 printf("Interest Received for NAME LSA\n");
458 get_name_lsa_data(lsa_data,lsaId);
459 }
akmhoque03004e62012-09-06 01:12:28 -0500460 else if ( ls_type == LS_TYPE_ADJ )
akmhoque53f64222012-09-05 13:57:51 -0500461 {
462 printf("Interest Received for ADJ LSA\n");
463 get_adj_lsa_data(lsa_data,lsaId);
akmhoque1c9b92f2012-08-13 10:57:50 -0500464 }
465
akmhoque53f64222012-09-05 13:57:51 -0500466 char *rdata=ccn_charbuf_as_string(lsa_data);
467 char *raw_data=(char *)malloc(strlen(rdata)+1);
468 memset(raw_data,0,strlen(rdata)+1);
469 memcpy(raw_data,(char *)rdata,strlen(rdata)+1);
akmhoque03004e62012-09-06 01:12:28 -0500470 //printf("Content Data to be sent: %s\n",raw_data);
akmhoque1c9b92f2012-08-13 10:57:50 -0500471
akmhoque53f64222012-09-05 13:57:51 -0500472 struct ccn_charbuf *data=ccn_charbuf_create();
473 struct ccn_charbuf *name=ccn_charbuf_create();
474 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
akmhoque03004e62012-09-06 01:12:28 -0500475
akmhoque53f64222012-09-05 13:57:51 -0500476 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]);
akmhoque1c9b92f2012-08-13 10:57:50 -0500477
akmhoque53f64222012-09-05 13:57:51 -0500478 sp.template_ccnb=ccn_charbuf_create();
479 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
480 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 10);
481 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
482 ccn_charbuf_append_closer(sp.template_ccnb);
akmhoque1c9b92f2012-08-13 10:57:50 -0500483
akmhoque53f64222012-09-05 13:57:51 -0500484 res= ccn_sign_content(nlsr->ccn, data, name, &sp, raw_data , strlen(raw_data));
485 if(res >= 0)
486 printf("Signing LSA Content is successful \n");
487
488 res=ccn_put(nlsr->ccn,data->buf,data->length);
489 if(res >= 0)
490 printf("Sending LSA Content is successful \n");
491
akmhoque03004e62012-09-06 01:12:28 -0500492
493
akmhoque53f64222012-09-05 13:57:51 -0500494 ccn_charbuf_destroy(&data);
495 ccn_charbuf_destroy(&name);
496 ccn_charbuf_destroy(&sp.template_ccnb);
497 ccn_charbuf_destroy(&lsa_data);
498
499 free(raw_data);
500 free(lsaId);
akmhoque1c9b92f2012-08-13 10:57:50 -0500501}
502
akmhoque03004e62012-09-06 01:12:28 -0500503/* Call back function registered in ccnd to get all content coming to NLSR application */
504
akmhoque53f64222012-09-05 13:57:51 -0500505enum ccn_upcall_res incoming_content(struct ccn_closure* selfp,
506 enum ccn_upcall_kind kind, struct ccn_upcall_info* info)
akmhoqued79438d2012-08-27 13:31:42 -0500507{
508
akmhoqueffacaa82012-09-13 17:48:30 -0500509 nlsr_lock();
akmhoque03004e62012-09-06 01:12:28 -0500510
akmhoque53f64222012-09-05 13:57:51 -0500511 switch(kind) {
512 case CCN_UPCALL_FINAL:
513 break;
514 case CCN_UPCALL_CONTENT:
akmhoque03004e62012-09-06 01:12:28 -0500515 printf("Content Received for Name: ");
516 struct ccn_charbuf*c;
517 c=ccn_charbuf_create();
518 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E],0);
519 printf("%s\n",ccn_charbuf_as_string(c));
520 ccn_charbuf_destroy(&c);
521
522 process_incoming_content(selfp,info);
akmhoqued79438d2012-08-27 13:31:42 -0500523
akmhoque53f64222012-09-05 13:57:51 -0500524 break;
525 case CCN_UPCALL_INTEREST_TIMED_OUT:
akmhoque03004e62012-09-06 01:12:28 -0500526 printf("Interest Timed Out Received for Name: ");
527
528 struct ccn_charbuf*ito;
529 ito=ccn_charbuf_create();
530 ccn_uri_append(ito,info->interest_ccnb,info->pi->offset[CCN_PI_E],0);
531 printf("%s\n",ccn_charbuf_as_string(ito));
532 ccn_charbuf_destroy(&ito);
533
akmhoque53f64222012-09-05 13:57:51 -0500534 process_incoming_timed_out_interest(selfp,info);
akmhoqued79438d2012-08-27 13:31:42 -0500535
akmhoque53f64222012-09-05 13:57:51 -0500536 break;
537 default:
538 fprintf(stderr, "Unexpected response of kind %d\n", kind);
akmhoqueffacaa82012-09-13 17:48:30 -0500539 //return CCN_UPCALL_RESULT_ERR;
540 break;
akmhoque53f64222012-09-05 13:57:51 -0500541 }
akmhoqueffacaa82012-09-13 17:48:30 -0500542
543 nlsr_unlock();
akmhoqued79438d2012-08-27 13:31:42 -0500544
akmhoque53f64222012-09-05 13:57:51 -0500545 return CCN_UPCALL_RESULT_OK;
akmhoqued79438d2012-08-27 13:31:42 -0500546}
547
akmhoque03004e62012-09-06 01:12:28 -0500548
akmhoqued79438d2012-08-27 13:31:42 -0500549void
akmhoque53f64222012-09-05 13:57:51 -0500550process_incoming_content(struct ccn_closure *selfp, struct ccn_upcall_info* info)
akmhoqued79438d2012-08-27 13:31:42 -0500551{
akmhoque53f64222012-09-05 13:57:51 -0500552 printf("process_incoming_content called \n");
akmhoque53f64222012-09-05 13:57:51 -0500553
554 const unsigned char *comp_ptr1;
555 size_t comp_size;
556 int res,i;
557 int nlsr_position=0;
558 int name_comps=(int)info->interest_comps->n;
559
560 for(i=0;i<name_comps;i++)
561 {
562 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
563 if( res == 0)
564 {
565 nlsr_position=i;
566 break;
567 }
568 }
569
570 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
571
572 printf("Det= %s \n",comp_ptr1);
573
574 if(!strcmp((char *)comp_ptr1,"info"))
575 {
576 process_incoming_content_info(selfp,info);
577 }
578 if(!strcmp((char *)comp_ptr1,"lsdb"))
579 {
580 process_incoming_content_lsdb(selfp,info);
581 }
582 if(!strcmp((char *)comp_ptr1,"lsa"))
583 {
584 process_incoming_content_lsa(selfp,info);
585 }
akmhoque03004e62012-09-06 01:12:28 -0500586
akmhoque53f64222012-09-05 13:57:51 -0500587}
588
akmhoque03004e62012-09-06 01:12:28 -0500589
akmhoque53f64222012-09-05 13:57:51 -0500590void
591process_incoming_content_info(struct ccn_closure *selfp, struct ccn_upcall_info* info)
592{
593 printf("process_incoming_content_info called \n");
akmhoque03004e62012-09-06 01:12:28 -0500594
akmhoque53f64222012-09-05 13:57:51 -0500595 struct name_prefix *nbr=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
596 get_nbr(nbr,selfp,info);
akmhoque03004e62012-09-06 01:12:28 -0500597
akmhoque53f64222012-09-05 13:57:51 -0500598 printf("Info Content Received For Neighbor: %s Length:%d\n",nbr->name,nbr->length);
akmhoque03004e62012-09-06 01:12:28 -0500599
akmhoque53f64222012-09-05 13:57:51 -0500600
601 const unsigned char *ptr;
602 size_t length;
603 ccn_content_get_value(info->content_ccnb, info->pco->offset[CCN_PCO_E_Content]-info->pco->offset[CCN_PCO_B_Content], info->pco, &ptr, &length);
akmhoque03004e62012-09-06 01:12:28 -0500604 //printf("Content data: %s\n",ptr);
akmhoque53f64222012-09-05 13:57:51 -0500605
606 long int interval=atoi((char *)ptr);
607
608
akmhoque03004e62012-09-06 01:12:28 -0500609
akmhoque53f64222012-09-05 13:57:51 -0500610 update_adjacent_timed_out_zero_to_adl(nbr);
611 update_adjacent_status_to_adl(nbr,NBR_ACTIVE);
612 update_lsdb_synch_interval_to_adl(nbr,interval);
613 print_adjacent_from_adl();
614
akmhoque03004e62012-09-06 01:12:28 -0500615
616
akmhoque53f64222012-09-05 13:57:51 -0500617 if(!nlsr->is_build_adj_lsa_sheduled)
618 {
619 printf("Scheduling Build and Install Adj LSA...\n");
620 nlsr->event_build_adj_lsa = ccn_schedule_event(nlsr->sched, 100000, &build_and_install_adj_lsa, NULL, 0);
621 nlsr->is_build_adj_lsa_sheduled=1;
622 }
623 else
624 {
625 printf("Build and Install Adj LSA already scheduled\n");
626 }
627
akmhoque03004e62012-09-06 01:12:28 -0500628
akmhoque53f64222012-09-05 13:57:51 -0500629 free(nbr);
akmhoque03004e62012-09-06 01:12:28 -0500630
akmhoque53f64222012-09-05 13:57:51 -0500631
632}
633
akmhoque03004e62012-09-06 01:12:28 -0500634
akmhoque53f64222012-09-05 13:57:51 -0500635void
636process_incoming_content_lsdb(struct ccn_closure *selfp, struct ccn_upcall_info* info)
637{
638 printf("process_incoming_content_lsdb called \n");
639
akmhoque53f64222012-09-05 13:57:51 -0500640 const unsigned char *ptr;
641 size_t length;
642 ccn_content_get_value(info->content_ccnb, info->pco->offset[CCN_PCO_E_Content]-info->pco->offset[CCN_PCO_B_Content], info->pco, &ptr, &length);
akmhoque03004e62012-09-06 01:12:28 -0500643 //printf("Content data: %s\n",ptr);
akmhoque53f64222012-09-05 13:57:51 -0500644
645 if( (strcmp("NACK",(char *)ptr) != 0 ) && (strcmp("WAIT",(char *)ptr) != 0 ) )
646 {
647 struct name_prefix *nbr=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
648 get_nbr(nbr,selfp,info);
649
650 char *nl;
651 int num_element;
652 int i;
653 char *rem;
654 const char *sep="|";
655 char *orig_router;
656 char *lst;
657 int ls_type;
658 char *lsid;
659 long int ls_id;
akmhoque03004e62012-09-06 01:12:28 -0500660 char *orig_time;
akmhoque53f64222012-09-05 13:57:51 -0500661
662 nl=strtok_r((char *)ptr,sep,&rem);
663 num_element=atoi(nl);
664
665 for(i = 0 ; i < num_element ; i++)
666 {
667 orig_router=strtok_r(NULL,sep,&rem);
668 lst=strtok_r(NULL,sep,&rem);
669 ls_type=atoi(lst);
670 printf("Orig Router: %s ls Type: %d",orig_router,ls_type);
671
672 if(ls_type == LS_TYPE_NAME)
673 {
674 lsid=strtok_r(NULL,sep,&rem);
675 ls_id=atoi(lsid);
akmhoque03004e62012-09-06 01:12:28 -0500676 orig_time=strtok_r(NULL,sep,&rem);
677 printf(" LS Id: %ld Orig Time: %s\n",ls_id ,orig_time);
678 int is_new_name_lsa=check_is_new_name_lsa(orig_router,lst,lsid,orig_time);
679 if ( is_new_name_lsa == 1 )
680 {
681 printf("New NAME LSA.....\n");
682 send_interest_for_name_lsa(nbr,orig_router,lst,lsid);
683 }
684 else
685 {
686 printf("Name LSA already exists in LSDB\n");
687 }
akmhoque53f64222012-09-05 13:57:51 -0500688 }
689 else
690 {
akmhoque03004e62012-09-06 01:12:28 -0500691 orig_time=strtok_r(NULL,sep,&rem);
692 printf(" Orig Time: %s\n",orig_time);
693 int is_new_adj_lsa=check_is_new_adj_lsa(orig_router,lst,orig_time);
694 if ( is_new_adj_lsa == 1 )
695 {
696 printf("New ADJ LSA.....\n");
697 send_interest_for_adj_lsa(nbr,orig_router,lst);
698 }
699 else
700 {
701 printf("ADJ LSA already exists in LSDB\n");
702 }
akmhoque53f64222012-09-05 13:57:51 -0500703 }
akmhoque03004e62012-09-06 01:12:28 -0500704
akmhoque53f64222012-09-05 13:57:51 -0500705 }
akmhoque53f64222012-09-05 13:57:51 -0500706
akmhoque03004e62012-09-06 01:12:28 -0500707 char *lsdb_version=(char *)malloc(20);
708 memset(lsdb_version,0,20);
709 get_lsdb_version(lsdb_version,selfp,info);
710
akmhoque53f64222012-09-05 13:57:51 -0500711 printf("Old LSDB Version of Neighbor: %s is :%s\n",nbr->name,get_nbr_lsdb_version(nbr->name));
akmhoque03004e62012-09-06 01:12:28 -0500712 update_adjacent_lsdb_version_to_adl(nbr,lsdb_version);
akmhoque53f64222012-09-05 13:57:51 -0500713 printf("New LSDB Version of Neighbor: %s is :%s\n",nbr->name,get_nbr_lsdb_version(nbr->name));
akmhoque53f64222012-09-05 13:57:51 -0500714
akmhoque03004e62012-09-06 01:12:28 -0500715
716 free(lsdb_version);
akmhoque53f64222012-09-05 13:57:51 -0500717 free(nbr);
718 }
719 else if (strcmp("WAIT",(char *)ptr) == 0)
720 {
721 struct name_prefix *nbr=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
722 get_nbr(nbr,selfp,info);
723 long int interval=get_lsdb_synch_interval(nbr->name);
724 adjust_adjacent_last_lsdb_requested_to_adl(nbr->name,(long int)interval/2);
akmhoque03004e62012-09-06 01:12:28 -0500725
akmhoque53f64222012-09-05 13:57:51 -0500726
727 free(nbr);
728 }
729 else
730 {
731 printf("NACK Content Received\n");
732 }
akmhoque53f64222012-09-05 13:57:51 -0500733}
734
akmhoque03004e62012-09-06 01:12:28 -0500735
akmhoque53f64222012-09-05 13:57:51 -0500736void
737process_incoming_content_lsa(struct ccn_closure *selfp, struct ccn_upcall_info* info)
738{
739 printf("process_incoming_content_lsa called \n");
740
741 char *sep="|";
742 char *rem;
743 char *orig_router;
744 char *orl;
745 int orig_router_length;
746 char *lst;
747 int ls_type;
748 char *lsid;
749 long int ls_id;
750 char *isvld;
751 int isValid;
752 char *num_link;
753 int no_link;
754 char *np;
755 char *np_length;
756 int name_length;
757 char *data;
758 char *orig_time;
759
760 const unsigned char *ptr;
761 size_t length;
762 ccn_content_get_value(info->content_ccnb, info->pco->offset[CCN_PCO_E_Content]-info->pco->offset[CCN_PCO_B_Content], info->pco, &ptr, &length);
akmhoque03004e62012-09-06 01:12:28 -0500763 //printf("Content data Received: %s\n",ptr);
akmhoque53f64222012-09-05 13:57:51 -0500764
akmhoque29c1db52012-09-07 14:47:43 -0500765
766
767
768
769
akmhoque53f64222012-09-05 13:57:51 -0500770 printf("LSA Data\n");
771
772 if( strlen((char *) ptr ) > 0 )
773 {
774
775 orig_router=strtok_r((char *)ptr,sep,&rem);
776 orl=strtok_r(NULL,sep,&rem);
777 orig_router_length=atoi(orl);
778
779 printf(" Orig Router Name : %s\n",orig_router);
780 printf(" Orig Router Length: %d\n",orig_router_length);
781
782 lst=strtok_r(NULL,sep,&rem);
783 ls_type=atoi(lst);
784
785 printf(" LS Type : %d\n",ls_type);
786
akmhoque03004e62012-09-06 01:12:28 -0500787 if ( ls_type == LS_TYPE_NAME )
akmhoque53f64222012-09-05 13:57:51 -0500788 {
789 lsid=strtok_r(NULL,sep,&rem);
790 ls_id=atoi(lsid);
akmhoque03004e62012-09-06 01:12:28 -0500791 orig_time=strtok_r(NULL,sep,&rem);
akmhoque53f64222012-09-05 13:57:51 -0500792 isvld=strtok_r(NULL,sep,&rem);
793 isValid=atoi(isvld);
794 np=strtok_r(NULL,sep,&rem);
795 np_length=strtok_r(NULL,sep,&rem);
796 name_length=atoi(np_length);
akmhoque53f64222012-09-05 13:57:51 -0500797 printf(" LS ID : %ld\n",ls_id);
798 printf(" isValid : %d\n",isValid);
799 printf(" Name Prefix : %s\n",np);
akmhoque03004e62012-09-06 01:12:28 -0500800 printf(" Orig Time : %s\n",orig_time);
akmhoque53f64222012-09-05 13:57:51 -0500801 printf(" Name Prefix length: %d\n",name_length);
802
akmhoque03004e62012-09-06 01:12:28 -0500803 build_and_install_others_name_lsa(orig_router,ls_type,ls_id,orig_time,isValid,np);
804
akmhoque53f64222012-09-05 13:57:51 -0500805 }
akmhoque03004e62012-09-06 01:12:28 -0500806 else if ( ls_type == LS_TYPE_ADJ )
akmhoque53f64222012-09-05 13:57:51 -0500807 {
808 orig_time=strtok_r(NULL,sep,&rem);
809 num_link=strtok_r(NULL,sep,&rem);
810 no_link=atoi(num_link);
811 data=rem;
812
813 printf(" No Link : %d\n",no_link);
814 printf(" Data : %s\n",data);
815
816 build_and_install_others_adj_lsa(orig_router,ls_type,orig_time,no_link,data);
817 }
akmhoque53f64222012-09-05 13:57:51 -0500818 }
akmhoque53f64222012-09-05 13:57:51 -0500819}
820
akmhoque03004e62012-09-06 01:12:28 -0500821
akmhoque53f64222012-09-05 13:57:51 -0500822void
823process_incoming_timed_out_interest(struct ccn_closure* selfp, struct ccn_upcall_info* info)
824{
825 printf("process_incoming_timed_out_interest called \n");
akmhoque53f64222012-09-05 13:57:51 -0500826 int res,i;
827 int nlsr_position=0;
828 int name_comps=(int)info->interest_comps->n;
829
830 for(i=0;i<name_comps;i++)
831 {
832 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
833 if( res == 0)
834 {
835 nlsr_position=i;
836 break;
837 }
838 }
839
840 if(ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,nlsr_position+1,"info") == 0)
841 {
842 process_incoming_timed_out_interest_info(selfp,info);
843 }
akmhoque29c1db52012-09-07 14:47:43 -0500844 if(ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,nlsr_position+1,"lsdb") == 0)
845 {
846 process_incoming_timed_out_interest_lsdb(selfp,info);
847 }
848 if(ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,nlsr_position+1,"lsa") == 0)
849 {
850 process_incoming_timed_out_interest_lsa(selfp,info);
851 }
akmhoque53f64222012-09-05 13:57:51 -0500852}
853
854void
855process_incoming_timed_out_interest_info(struct ccn_closure* selfp, struct ccn_upcall_info* info)
856{
857 printf("process_incoming_timed_out_interest_info called \n");
858
859 struct name_prefix *nbr=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
860 get_nbr(nbr,selfp,info);
861
862 printf("Info Interest Timed Out for for Neighbor: %s Length:%d\n",nbr->name,nbr->length);
akmhoque03004e62012-09-06 01:12:28 -0500863
864
akmhoque53f64222012-09-05 13:57:51 -0500865 update_adjacent_timed_out_to_adl(nbr,1);
866 print_adjacent_from_adl();
867 int timed_out=get_timed_out_number(nbr);
akmhoque03004e62012-09-06 01:12:28 -0500868
akmhoque53f64222012-09-05 13:57:51 -0500869
870 if(timed_out<nlsr->interest_retry && timed_out>0) // use configured variables
871 {
872 printf("Neighbor: %s Info Interest Timed Out: %d times\n",nbr->name,timed_out);
873 send_info_interest_to_neighbor(nbr);
874 }
875 else
876 {
877 printf("Neighbor: %s Info Interest Timed Out: %d times\n",nbr->name,timed_out);
878 update_adjacent_status_to_adl(nbr,NBR_DOWN);
879 if(!nlsr->is_build_adj_lsa_sheduled)
880 {
881 nlsr->event_build_adj_lsa = ccn_schedule_event(nlsr->sched, 1000, &build_and_install_adj_lsa, NULL, 0);
882 nlsr->is_build_adj_lsa_sheduled=1;
883 }
884 }
885
886 free(nbr);
akmhoque03004e62012-09-06 01:12:28 -0500887
akmhoque53f64222012-09-05 13:57:51 -0500888
889}
890
akmhoque29c1db52012-09-07 14:47:43 -0500891void
892process_incoming_timed_out_interest_lsdb(struct ccn_closure* selfp, struct ccn_upcall_info* info)
893{
894 printf("process_incoming_timed_out_interest_lsdb called \n");
895}
896
897void
898process_incoming_timed_out_interest_lsa(struct ccn_closure* selfp, struct ccn_upcall_info* info)
899{
900 printf("process_incoming_timed_out_interest_lsa called \n");
901
902}
903
akmhoque03004e62012-09-06 01:12:28 -0500904int
akmhoque53f64222012-09-05 13:57:51 -0500905send_info_interest(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
906{
akmhoqueffacaa82012-09-13 17:48:30 -0500907 if(flags == CCN_SCHEDULE_CANCEL)
908 {
909 return -1;
910 }
911
912 nlsr_lock();
913
akmhoque53f64222012-09-05 13:57:51 -0500914 printf("send_info_interest called \n");
915 printf("\n");
akmhoqued79438d2012-08-27 13:31:42 -0500916
akmhoque53f64222012-09-05 13:57:51 -0500917 int adl_element,i;
akmhoque53f64222012-09-05 13:57:51 -0500918 struct ndn_neighbor *nbr;
919
920 struct hashtb_enumerator ee;
921 struct hashtb_enumerator *e = &ee;
922
923 hashtb_start(nlsr->adl, e);
924 adl_element=hashtb_n(nlsr->adl);
925
926 for(i=0;i<adl_element;i++)
927 {
928 nbr=e->data;
929 send_info_interest_to_neighbor(nbr->neighbor);
930 hashtb_next(e);
931 }
akmhoque53f64222012-09-05 13:57:51 -0500932 hashtb_end(e);
933
akmhoqueffacaa82012-09-13 17:48:30 -0500934 nlsr_unlock();
935
akmhoque53f64222012-09-05 13:57:51 -0500936 return 0;
937}
938
939void
940send_info_interest_to_neighbor(struct name_prefix *nbr)
941{
942 printf("send_info_interest_to_neighbor called \n");
akmhoqued79438d2012-08-27 13:31:42 -0500943
944 int res;
akmhoque53f64222012-09-05 13:57:51 -0500945 char info_str[5];
946 char nlsr_str[5];
akmhoque53f64222012-09-05 13:57:51 -0500947
akmhoqued79438d2012-08-27 13:31:42 -0500948 memset(&nlsr_str,0,5);
949 sprintf(nlsr_str,"nlsr");
950 memset(&info_str,0,5);
951 sprintf(info_str,"info");
952
akmhoque53f64222012-09-05 13:57:51 -0500953
954 struct ccn_charbuf *name;
akmhoqued79438d2012-08-27 13:31:42 -0500955 name=ccn_charbuf_create();
akmhoqued79438d2012-08-27 13:31:42 -0500956
akmhoque03004e62012-09-06 01:12:28 -0500957 char *int_name=(char *)malloc(strlen(nbr->name)+1+strlen(nlsr_str)+1+strlen(info_str)+strlen(nlsr->router_name)+1);
958 memset(int_name,0,strlen(nbr->name)+1+strlen(nlsr_str)+1+strlen(info_str)+strlen(nlsr->router_name)+1);
akmhoque53f64222012-09-05 13:57:51 -0500959 memcpy(int_name+strlen(int_name),nbr->name,strlen(nbr->name));
960 memcpy(int_name+strlen(int_name),"/",1);
961 memcpy(int_name+strlen(int_name),nlsr_str,strlen(nlsr_str));
962 memcpy(int_name+strlen(int_name),"/",1);
963 memcpy(int_name+strlen(int_name),info_str,strlen(info_str));
akmhoque03004e62012-09-06 01:12:28 -0500964 memcpy(int_name+strlen(int_name),nlsr->router_name,strlen(nlsr->router_name));
akmhoque53f64222012-09-05 13:57:51 -0500965
966
967 res=ccn_name_from_uri(name,int_name);
968 if ( res >=0 )
969 {
akmhoque53f64222012-09-05 13:57:51 -0500970 /* adding InterestLifeTime and InterestScope filter */
971
972 struct ccn_charbuf *templ;
973 templ = ccn_charbuf_create();
974
975 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
976 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
977 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque03004e62012-09-06 01:12:28 -0500978 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
979 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
980 ccn_charbuf_append(templ, "2", 1); //scope of interest: 2 (not further than next host)
981 ccn_charbuf_append_closer(templ); /* </Scope> */
akmhoque53f64222012-09-05 13:57:51 -0500982
983 appendLifetime(templ,nlsr->interest_resend_time);
984 ccn_charbuf_append_closer(templ); /* </Interest> */
985 /* Adding InterestLifeTime and InterestScope filter done */
986
987 printf("Sending info interest on name prefix : %s \n",int_name);
988
989 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
990
991 if ( res >= 0 )
992 printf("Info interest sending Successfull .... \n");
993 ccn_charbuf_destroy(&templ);
994 }
995 ccn_charbuf_destroy(&name);
996 free(int_name);
997
998}
999
1000
1001int
1002send_lsdb_interest(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
1003{
1004 printf("send_lsdb_interest called \n");
1005
Obaid Amin485277a2012-09-07 01:08:28 -04001006 if(flags == CCN_SCHEDULE_CANCEL)
akmhoque29c1db52012-09-07 14:47:43 -05001007 {
1008 return -1;
1009 }
Obaid Amin485277a2012-09-07 01:08:28 -04001010
akmhoqueffacaa82012-09-13 17:48:30 -05001011 nlsr_lock();
1012
akmhoque53f64222012-09-05 13:57:51 -05001013 int i, adl_element;
1014 struct ndn_neighbor *nbr;
1015
1016 struct hashtb_enumerator ee;
1017 struct hashtb_enumerator *e = &ee;
1018
1019 hashtb_start(nlsr->adl, e);
1020 adl_element=hashtb_n(nlsr->adl);
1021
1022 for(i=0;i<adl_element;i++)
1023 {
1024 nbr=e->data;
1025
1026 if(nbr->status == NBR_ACTIVE)
1027 {
1028 if(nbr->is_lsdb_send_interest_scheduled == 0)
1029 {
1030 long int time_diff=get_nbr_time_diff_lsdb_req(nbr->neighbor->name);
1031 printf("Time since last time LSDB requested : %ld Seconds for Neighbor: %s \n",time_diff,nbr->neighbor->name);
1032
1033 if(time_diff>=get_lsdb_synch_interval(nbr->neighbor->name))
1034 {
1035 nbr->is_lsdb_send_interest_scheduled=1;
1036 send_lsdb_interest_to_nbr(nbr->neighbor);
1037 }
1038 }
1039 }
1040 hashtb_next(e);
1041 }
1042
1043 hashtb_end(e);
1044 nlsr->event_send_lsdb_interest= ccn_schedule_event(nlsr->sched, 30000000, &send_lsdb_interest, NULL, 0);
1045
akmhoqueffacaa82012-09-13 17:48:30 -05001046 nlsr_unlock();
1047
akmhoque53f64222012-09-05 13:57:51 -05001048 return 0;
1049}
1050
1051void
1052send_lsdb_interest_to_nbr(struct name_prefix *nbr)
1053{
1054 printf("send_lsdb_interest_to_nbr called \n");
akmhoque03004e62012-09-06 01:12:28 -05001055
akmhoque53f64222012-09-05 13:57:51 -05001056 char *last_lsdb_version=get_nbr_lsdb_version(nbr->name);
1057
1058 if(last_lsdb_version !=NULL)
1059 {
1060 printf("Last LSDB Version: %s \n",last_lsdb_version);
1061
1062
1063 struct ccn_charbuf *name;
1064 int res;
akmhoque53f64222012-09-05 13:57:51 -05001065 char lsdb_str[5];
1066 char nlsr_str[5];
akmhoque03004e62012-09-06 01:12:28 -05001067
akmhoque53f64222012-09-05 13:57:51 -05001068 memset(&nlsr_str,0,5);
1069 sprintf(nlsr_str,"nlsr");
1070 memset(&lsdb_str,0,5);
1071 sprintf(lsdb_str,"lsdb");
1072 //make and send interest with exclusion filter as last_lsdb_version
1073 printf("Sending interest for name prefix:%s/%s/%s\n",nbr->name,nlsr_str,lsdb_str);
1074 name=ccn_charbuf_create();
1075 res=ccn_name_from_uri(name,nbr->name);
1076
1077 if( res >= 0)
1078 {
1079 ccn_name_append_str(name,nlsr_str);
1080 ccn_name_append_str(name,lsdb_str);
akmhoque53f64222012-09-05 13:57:51 -05001081 /* adding Exclusion filter */
1082
1083 struct ccn_charbuf *templ;
1084 templ = ccn_charbuf_create();
akmhoque03004e62012-09-06 01:12:28 -05001085
akmhoque53f64222012-09-05 13:57:51 -05001086 struct ccn_charbuf *c;
1087 c = ccn_charbuf_create();
akmhoque03004e62012-09-06 01:12:28 -05001088
akmhoque53f64222012-09-05 13:57:51 -05001089
1090 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1091 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1092 ccn_charbuf_append_closer(templ); /* </Name> */
1093 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
1094 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
1095 ccn_charbuf_reset(c);
1096 ccn_charbuf_putf(c, "%s", last_lsdb_version);
akmhoque03004e62012-09-06 01:12:28 -05001097
akmhoque53f64222012-09-05 13:57:51 -05001098 ccnb_append_tagged_blob(templ, CCN_DTAG_Component, c->buf, c->length);
1099 ccn_charbuf_append_closer(templ); /* </Exclude> */
1100 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1101 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1102 ccn_charbuf_append(templ, "2", 1);
1103 ccn_charbuf_append_closer(templ); /* </Scope> */
akmhoque03004e62012-09-06 01:12:28 -05001104
akmhoque53f64222012-09-05 13:57:51 -05001105 appendLifetime(templ,nlsr->interest_resend_time);
akmhoque03004e62012-09-06 01:12:28 -05001106
akmhoque53f64222012-09-05 13:57:51 -05001107 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque03004e62012-09-06 01:12:28 -05001108
1109
akmhoque53f64222012-09-05 13:57:51 -05001110 /* Adding Exclusion filter done */
akmhoque03004e62012-09-06 01:12:28 -05001111
akmhoque53f64222012-09-05 13:57:51 -05001112 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
1113
1114 if ( res >= 0 )
1115 {
1116 printf("Interest sending Successfull .... \n");
1117 update_adjacent_last_lsdb_requested_to_adl(nbr->name,get_current_time_sec());
1118
1119 }
1120 ccn_charbuf_destroy(&c);
1121 ccn_charbuf_destroy(&templ);
1122 }
1123 ccn_charbuf_destroy(&name);
1124 }
1125 set_is_lsdb_send_interest_scheduled_to_zero(nbr->name);
akmhoque53f64222012-09-05 13:57:51 -05001126}
1127
1128void
1129send_interest_for_name_lsa(struct name_prefix *nbr, char *orig_router, char *ls_type, char *ls_id)
1130{
1131 printf("send_interest_for_name_lsa called\n");
1132
1133 int res;
akmhoque53f64222012-09-05 13:57:51 -05001134 char lsa_str[5];
1135 char nlsr_str[5];
1136
akmhoque53f64222012-09-05 13:57:51 -05001137 memset(&nlsr_str,0,5);
1138 sprintf(nlsr_str,"nlsr");
1139 memset(&lsa_str,0,5);
1140 sprintf(lsa_str,"lsa");
1141
akmhoque03004e62012-09-06 01:12:28 -05001142 char *int_name=(char *)malloc(nbr->length + strlen(ls_type)+strlen(orig_router)+strlen(nlsr_str)+strlen(lsa_str)+3);
1143 memset(int_name,0,nbr->length +strlen(ls_type)+ strlen(orig_router)+strlen(nlsr_str)+strlen(lsa_str)+3);
akmhoque53f64222012-09-05 13:57:51 -05001144
1145 memcpy(int_name+strlen(int_name),nbr->name,nbr->length);
1146 memcpy(int_name+strlen(int_name),"/",1);
1147 memcpy(int_name+strlen(int_name),nlsr_str,strlen(nlsr_str));
1148 memcpy(int_name+strlen(int_name),"/",1);
1149 memcpy(int_name+strlen(int_name),lsa_str,strlen(lsa_str));
akmhoque03004e62012-09-06 01:12:28 -05001150 memcpy(int_name+strlen(int_name),"/",1);
1151 memcpy(int_name+strlen(int_name),ls_type,strlen(ls_type));
1152 memcpy(int_name+strlen(int_name),orig_router,strlen(orig_router));
akmhoque53f64222012-09-05 13:57:51 -05001153
akmhoque03004e62012-09-06 01:12:28 -05001154
akmhoque53f64222012-09-05 13:57:51 -05001155 struct ccn_charbuf *name;
1156 name=ccn_charbuf_create();
1157
1158
1159 res=ccn_name_from_uri(name,int_name);
1160 ccn_name_append_str(name,ls_type);
1161 ccn_name_append_str(name,ls_id);
akmhoque53f64222012-09-05 13:57:51 -05001162
1163
1164 /* adding InterestLifeTime and InterestScope filter */
1165
akmhoqued79438d2012-08-27 13:31:42 -05001166 struct ccn_charbuf *templ;
1167 templ = ccn_charbuf_create();
1168
akmhoqued79438d2012-08-27 13:31:42 -05001169 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1170 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1171 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque53f64222012-09-05 13:57:51 -05001172 //ccnb_tagged_putf(templ, CCN_DTAG_Scope, "%d", scope);
1173 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1174 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1175 ccn_charbuf_append(templ, "2", 1); //scope of interest: 2 (not further than next host)
1176 ccn_charbuf_append_closer(templ); /* </Scope> */
1177
1178 appendLifetime(templ,nlsr->interest_resend_time);
akmhoqued79438d2012-08-27 13:31:42 -05001179 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque53f64222012-09-05 13:57:51 -05001180 /* Adding InterestLifeTime and InterestScope filter done */
akmhoque03004e62012-09-06 01:12:28 -05001181
akmhoque53f64222012-09-05 13:57:51 -05001182 printf("Sending NAME LSA interest on name prefix : %s/%s/%s\n",int_name,ls_type,ls_id);
akmhoqued79438d2012-08-27 13:31:42 -05001183
akmhoqued79438d2012-08-27 13:31:42 -05001184 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
akmhoque53f64222012-09-05 13:57:51 -05001185
akmhoqued79438d2012-08-27 13:31:42 -05001186 if ( res >= 0 )
akmhoque53f64222012-09-05 13:57:51 -05001187 printf("NAME LSA interest sending Successfull .... \n");
1188
akmhoqued79438d2012-08-27 13:31:42 -05001189 ccn_charbuf_destroy(&templ);
1190 ccn_charbuf_destroy(&name);
akmhoque53f64222012-09-05 13:57:51 -05001191 free(int_name);
akmhoque03004e62012-09-06 01:12:28 -05001192
1193
akmhoqued79438d2012-08-27 13:31:42 -05001194}
akmhoque53f64222012-09-05 13:57:51 -05001195
1196void
1197send_interest_for_adj_lsa(struct name_prefix *nbr, char *orig_router, char *ls_type)
1198{
1199 printf("send_interest_for_adj_lsa called\n");
1200
1201 int res;
akmhoque53f64222012-09-05 13:57:51 -05001202 char lsa_str[5];
1203 char nlsr_str[5];
1204
akmhoque53f64222012-09-05 13:57:51 -05001205 memset(&nlsr_str,0,5);
1206 sprintf(nlsr_str,"nlsr");
1207 memset(&lsa_str,0,5);
1208 sprintf(lsa_str,"lsa");
1209
akmhoque29c1db52012-09-07 14:47:43 -05001210 char *int_name=(char *)malloc(nbr->length + strlen(ls_type)+strlen(orig_router)+strlen(nlsr_str)+strlen(lsa_str)+3+strlen(ls_type)+1);
1211 memset(int_name,0,nbr->length +strlen(ls_type)+ strlen(orig_router)+strlen(nlsr_str)+strlen(lsa_str)+3+strlen(ls_type)+1);
akmhoque53f64222012-09-05 13:57:51 -05001212
1213 memcpy(int_name+strlen(int_name),nbr->name,nbr->length);
1214 memcpy(int_name+strlen(int_name),"/",1);
1215 memcpy(int_name+strlen(int_name),nlsr_str,strlen(nlsr_str));
1216 memcpy(int_name+strlen(int_name),"/",1);
1217 memcpy(int_name+strlen(int_name),lsa_str,strlen(lsa_str));
akmhoque03004e62012-09-06 01:12:28 -05001218 memcpy(int_name+strlen(int_name),"/",1);
1219 memcpy(int_name+strlen(int_name),ls_type,strlen(ls_type));
akmhoque53f64222012-09-05 13:57:51 -05001220 memcpy(int_name+strlen(int_name),orig_router,strlen(orig_router));
akmhoque29c1db52012-09-07 14:47:43 -05001221 memcpy(int_name+strlen(int_name),"/",1);
1222 memcpy(int_name+strlen(int_name),ls_type,strlen(ls_type));
akmhoque03004e62012-09-06 01:12:28 -05001223
akmhoque53f64222012-09-05 13:57:51 -05001224 struct ccn_charbuf *name;
1225 name=ccn_charbuf_create();
akmhoque03004e62012-09-06 01:12:28 -05001226
akmhoque53f64222012-09-05 13:57:51 -05001227
1228 ccn_name_from_uri(name,int_name);
akmhoque03004e62012-09-06 01:12:28 -05001229
akmhoque53f64222012-09-05 13:57:51 -05001230 /* adding InterestLifeTime and InterestScope filter */
1231
1232 struct ccn_charbuf *templ;
1233 templ = ccn_charbuf_create();
1234
1235 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1236 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1237 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque53f64222012-09-05 13:57:51 -05001238 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1239 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1240 ccn_charbuf_append(templ, "2", 1); //scope of interest: 2 (not further than next host)
1241 ccn_charbuf_append_closer(templ); /* </Scope> */
1242
1243 appendLifetime(templ,nlsr->interest_resend_time);
1244 ccn_charbuf_append_closer(templ); /* </Interest> */
1245 /* Adding InterestLifeTime and InterestScope filter done */
akmhoque03004e62012-09-06 01:12:28 -05001246
akmhoque29c1db52012-09-07 14:47:43 -05001247 printf("Sending ADJ LSA interest on name prefix : %s\n",int_name);
akmhoque53f64222012-09-05 13:57:51 -05001248
1249 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
1250
1251 if ( res >= 0 )
akmhoque29c1db52012-09-07 14:47:43 -05001252 {
akmhoque53f64222012-09-05 13:57:51 -05001253 printf("ADJ LSA interest sending Successfull .... \n");
akmhoque29c1db52012-09-07 14:47:43 -05001254 }
akmhoque53f64222012-09-05 13:57:51 -05001255
akmhoque53f64222012-09-05 13:57:51 -05001256 ccn_charbuf_destroy(&templ);
1257 ccn_charbuf_destroy(&name);
1258 free(int_name);
akmhoque53f64222012-09-05 13:57:51 -05001259}