blob: 006692f790468c88a499bbde0eb4ad3ae1e60c8b [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");
akmhoque14b3f342012-09-14 10:39:02 -0500895
896 struct name_prefix *nbr=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
897 get_nbr(nbr,selfp,info);
898
899 printf("LSDB Interest Timed Out for for Neighbor: %s Length:%d\n",nbr->name,nbr->length);
900
901 int interst_timed_out_num=get_lsdb_interest_timed_out_number(nbr);
902
903 if( interst_timed_out_num < nlsr->interest_retry )
904 {
905 update_lsdb_interest_timed_out_to_adl(nbr,1);
906 }
907 else
908 {
909 update_lsdb_interest_timed_out_zero_to_adl(nbr);
910 update_adjacent_status_to_adl(nbr,NBR_DOWN);
911 if(!nlsr->is_build_adj_lsa_sheduled)
912 {
913 nlsr->event_build_adj_lsa = ccn_schedule_event(nlsr->sched, 1000, &build_and_install_adj_lsa, NULL, 0);
914 nlsr->is_build_adj_lsa_sheduled=1;
915 }
916 }
917 free(nbr->name);
918 free(nbr);
akmhoque29c1db52012-09-07 14:47:43 -0500919}
920
921void
922process_incoming_timed_out_interest_lsa(struct ccn_closure* selfp, struct ccn_upcall_info* info)
923{
924 printf("process_incoming_timed_out_interest_lsa called \n");
925
926}
927
akmhoque03004e62012-09-06 01:12:28 -0500928int
akmhoque53f64222012-09-05 13:57:51 -0500929send_info_interest(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
930{
akmhoqueffacaa82012-09-13 17:48:30 -0500931 if(flags == CCN_SCHEDULE_CANCEL)
932 {
933 return -1;
934 }
935
936 nlsr_lock();
937
akmhoque53f64222012-09-05 13:57:51 -0500938 printf("send_info_interest called \n");
939 printf("\n");
akmhoqued79438d2012-08-27 13:31:42 -0500940
akmhoque53f64222012-09-05 13:57:51 -0500941 int adl_element,i;
akmhoque53f64222012-09-05 13:57:51 -0500942 struct ndn_neighbor *nbr;
943
944 struct hashtb_enumerator ee;
945 struct hashtb_enumerator *e = &ee;
946
947 hashtb_start(nlsr->adl, e);
948 adl_element=hashtb_n(nlsr->adl);
949
950 for(i=0;i<adl_element;i++)
951 {
952 nbr=e->data;
953 send_info_interest_to_neighbor(nbr->neighbor);
954 hashtb_next(e);
955 }
akmhoque53f64222012-09-05 13:57:51 -0500956 hashtb_end(e);
957
akmhoqueffacaa82012-09-13 17:48:30 -0500958 nlsr_unlock();
959
akmhoque53f64222012-09-05 13:57:51 -0500960 return 0;
961}
962
963void
964send_info_interest_to_neighbor(struct name_prefix *nbr)
965{
966 printf("send_info_interest_to_neighbor called \n");
akmhoqued79438d2012-08-27 13:31:42 -0500967
968 int res;
akmhoque53f64222012-09-05 13:57:51 -0500969 char info_str[5];
970 char nlsr_str[5];
akmhoque53f64222012-09-05 13:57:51 -0500971
akmhoqued79438d2012-08-27 13:31:42 -0500972 memset(&nlsr_str,0,5);
973 sprintf(nlsr_str,"nlsr");
974 memset(&info_str,0,5);
975 sprintf(info_str,"info");
976
akmhoque53f64222012-09-05 13:57:51 -0500977
978 struct ccn_charbuf *name;
akmhoqued79438d2012-08-27 13:31:42 -0500979 name=ccn_charbuf_create();
akmhoqued79438d2012-08-27 13:31:42 -0500980
akmhoque03004e62012-09-06 01:12:28 -0500981 char *int_name=(char *)malloc(strlen(nbr->name)+1+strlen(nlsr_str)+1+strlen(info_str)+strlen(nlsr->router_name)+1);
982 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 -0500983 memcpy(int_name+strlen(int_name),nbr->name,strlen(nbr->name));
984 memcpy(int_name+strlen(int_name),"/",1);
985 memcpy(int_name+strlen(int_name),nlsr_str,strlen(nlsr_str));
986 memcpy(int_name+strlen(int_name),"/",1);
987 memcpy(int_name+strlen(int_name),info_str,strlen(info_str));
akmhoque03004e62012-09-06 01:12:28 -0500988 memcpy(int_name+strlen(int_name),nlsr->router_name,strlen(nlsr->router_name));
akmhoque53f64222012-09-05 13:57:51 -0500989
990
991 res=ccn_name_from_uri(name,int_name);
992 if ( res >=0 )
993 {
akmhoque53f64222012-09-05 13:57:51 -0500994 /* adding InterestLifeTime and InterestScope filter */
995
996 struct ccn_charbuf *templ;
997 templ = ccn_charbuf_create();
998
999 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1000 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1001 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque03004e62012-09-06 01:12:28 -05001002 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1003 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1004 ccn_charbuf_append(templ, "2", 1); //scope of interest: 2 (not further than next host)
1005 ccn_charbuf_append_closer(templ); /* </Scope> */
akmhoque53f64222012-09-05 13:57:51 -05001006
1007 appendLifetime(templ,nlsr->interest_resend_time);
1008 ccn_charbuf_append_closer(templ); /* </Interest> */
1009 /* Adding InterestLifeTime and InterestScope filter done */
1010
1011 printf("Sending info interest on name prefix : %s \n",int_name);
1012
1013 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
1014
1015 if ( res >= 0 )
1016 printf("Info interest sending Successfull .... \n");
1017 ccn_charbuf_destroy(&templ);
1018 }
1019 ccn_charbuf_destroy(&name);
1020 free(int_name);
1021
1022}
1023
1024
1025int
1026send_lsdb_interest(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
1027{
1028 printf("send_lsdb_interest called \n");
1029
Obaid Amin485277a2012-09-07 01:08:28 -04001030 if(flags == CCN_SCHEDULE_CANCEL)
akmhoque29c1db52012-09-07 14:47:43 -05001031 {
1032 return -1;
1033 }
Obaid Amin485277a2012-09-07 01:08:28 -04001034
akmhoqueffacaa82012-09-13 17:48:30 -05001035 nlsr_lock();
1036
akmhoque53f64222012-09-05 13:57:51 -05001037 int i, adl_element;
1038 struct ndn_neighbor *nbr;
1039
1040 struct hashtb_enumerator ee;
1041 struct hashtb_enumerator *e = &ee;
1042
1043 hashtb_start(nlsr->adl, e);
1044 adl_element=hashtb_n(nlsr->adl);
1045
1046 for(i=0;i<adl_element;i++)
1047 {
1048 nbr=e->data;
1049
1050 if(nbr->status == NBR_ACTIVE)
1051 {
1052 if(nbr->is_lsdb_send_interest_scheduled == 0)
1053 {
1054 long int time_diff=get_nbr_time_diff_lsdb_req(nbr->neighbor->name);
1055 printf("Time since last time LSDB requested : %ld Seconds for Neighbor: %s \n",time_diff,nbr->neighbor->name);
1056
akmhoque14b3f342012-09-14 10:39:02 -05001057 if( time_diff >= ( get_lsdb_synch_interval(nbr->neighbor->name) + get_nbr_random_time_component(nbr->neighbor->name) ) )
akmhoque53f64222012-09-05 13:57:51 -05001058 {
1059 nbr->is_lsdb_send_interest_scheduled=1;
1060 send_lsdb_interest_to_nbr(nbr->neighbor);
1061 }
1062 }
1063 }
1064 hashtb_next(e);
1065 }
1066
1067 hashtb_end(e);
1068 nlsr->event_send_lsdb_interest= ccn_schedule_event(nlsr->sched, 30000000, &send_lsdb_interest, NULL, 0);
1069
akmhoqueffacaa82012-09-13 17:48:30 -05001070 nlsr_unlock();
1071
akmhoque53f64222012-09-05 13:57:51 -05001072 return 0;
1073}
1074
1075void
1076send_lsdb_interest_to_nbr(struct name_prefix *nbr)
1077{
1078 printf("send_lsdb_interest_to_nbr called \n");
akmhoque03004e62012-09-06 01:12:28 -05001079
akmhoque53f64222012-09-05 13:57:51 -05001080 char *last_lsdb_version=get_nbr_lsdb_version(nbr->name);
1081
1082 if(last_lsdb_version !=NULL)
1083 {
1084 printf("Last LSDB Version: %s \n",last_lsdb_version);
1085
1086
1087 struct ccn_charbuf *name;
1088 int res;
akmhoque53f64222012-09-05 13:57:51 -05001089 char lsdb_str[5];
1090 char nlsr_str[5];
akmhoque03004e62012-09-06 01:12:28 -05001091
akmhoque53f64222012-09-05 13:57:51 -05001092 memset(&nlsr_str,0,5);
1093 sprintf(nlsr_str,"nlsr");
1094 memset(&lsdb_str,0,5);
1095 sprintf(lsdb_str,"lsdb");
1096 //make and send interest with exclusion filter as last_lsdb_version
1097 printf("Sending interest for name prefix:%s/%s/%s\n",nbr->name,nlsr_str,lsdb_str);
1098 name=ccn_charbuf_create();
1099 res=ccn_name_from_uri(name,nbr->name);
1100
1101 if( res >= 0)
1102 {
1103 ccn_name_append_str(name,nlsr_str);
1104 ccn_name_append_str(name,lsdb_str);
akmhoque53f64222012-09-05 13:57:51 -05001105 /* adding Exclusion filter */
1106
1107 struct ccn_charbuf *templ;
1108 templ = ccn_charbuf_create();
akmhoque03004e62012-09-06 01:12:28 -05001109
akmhoque53f64222012-09-05 13:57:51 -05001110 struct ccn_charbuf *c;
1111 c = ccn_charbuf_create();
akmhoque03004e62012-09-06 01:12:28 -05001112
akmhoque53f64222012-09-05 13:57:51 -05001113
1114 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1115 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1116 ccn_charbuf_append_closer(templ); /* </Name> */
1117 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
1118 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
1119 ccn_charbuf_reset(c);
1120 ccn_charbuf_putf(c, "%s", last_lsdb_version);
akmhoque03004e62012-09-06 01:12:28 -05001121
akmhoque53f64222012-09-05 13:57:51 -05001122 ccnb_append_tagged_blob(templ, CCN_DTAG_Component, c->buf, c->length);
1123 ccn_charbuf_append_closer(templ); /* </Exclude> */
1124 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1125 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1126 ccn_charbuf_append(templ, "2", 1);
1127 ccn_charbuf_append_closer(templ); /* </Scope> */
akmhoque03004e62012-09-06 01:12:28 -05001128
akmhoque53f64222012-09-05 13:57:51 -05001129 appendLifetime(templ,nlsr->interest_resend_time);
akmhoque03004e62012-09-06 01:12:28 -05001130
akmhoque53f64222012-09-05 13:57:51 -05001131 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque03004e62012-09-06 01:12:28 -05001132
1133
akmhoque53f64222012-09-05 13:57:51 -05001134 /* Adding Exclusion filter done */
akmhoque03004e62012-09-06 01:12:28 -05001135
akmhoque53f64222012-09-05 13:57:51 -05001136 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
1137
1138 if ( res >= 0 )
1139 {
1140 printf("Interest sending Successfull .... \n");
1141 update_adjacent_last_lsdb_requested_to_adl(nbr->name,get_current_time_sec());
1142
1143 }
1144 ccn_charbuf_destroy(&c);
1145 ccn_charbuf_destroy(&templ);
1146 }
1147 ccn_charbuf_destroy(&name);
1148 }
1149 set_is_lsdb_send_interest_scheduled_to_zero(nbr->name);
akmhoque53f64222012-09-05 13:57:51 -05001150}
1151
1152void
1153send_interest_for_name_lsa(struct name_prefix *nbr, char *orig_router, char *ls_type, char *ls_id)
1154{
1155 printf("send_interest_for_name_lsa called\n");
1156
1157 int res;
akmhoque53f64222012-09-05 13:57:51 -05001158 char lsa_str[5];
1159 char nlsr_str[5];
1160
akmhoque53f64222012-09-05 13:57:51 -05001161 memset(&nlsr_str,0,5);
1162 sprintf(nlsr_str,"nlsr");
1163 memset(&lsa_str,0,5);
1164 sprintf(lsa_str,"lsa");
1165
akmhoque03004e62012-09-06 01:12:28 -05001166 char *int_name=(char *)malloc(nbr->length + strlen(ls_type)+strlen(orig_router)+strlen(nlsr_str)+strlen(lsa_str)+3);
1167 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 -05001168
1169 memcpy(int_name+strlen(int_name),nbr->name,nbr->length);
1170 memcpy(int_name+strlen(int_name),"/",1);
1171 memcpy(int_name+strlen(int_name),nlsr_str,strlen(nlsr_str));
1172 memcpy(int_name+strlen(int_name),"/",1);
1173 memcpy(int_name+strlen(int_name),lsa_str,strlen(lsa_str));
akmhoque03004e62012-09-06 01:12:28 -05001174 memcpy(int_name+strlen(int_name),"/",1);
1175 memcpy(int_name+strlen(int_name),ls_type,strlen(ls_type));
1176 memcpy(int_name+strlen(int_name),orig_router,strlen(orig_router));
akmhoque53f64222012-09-05 13:57:51 -05001177
akmhoque03004e62012-09-06 01:12:28 -05001178
akmhoque53f64222012-09-05 13:57:51 -05001179 struct ccn_charbuf *name;
1180 name=ccn_charbuf_create();
1181
1182
1183 res=ccn_name_from_uri(name,int_name);
1184 ccn_name_append_str(name,ls_type);
1185 ccn_name_append_str(name,ls_id);
akmhoque53f64222012-09-05 13:57:51 -05001186
1187
1188 /* adding InterestLifeTime and InterestScope filter */
1189
akmhoqued79438d2012-08-27 13:31:42 -05001190 struct ccn_charbuf *templ;
1191 templ = ccn_charbuf_create();
1192
akmhoqued79438d2012-08-27 13:31:42 -05001193 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1194 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1195 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque53f64222012-09-05 13:57:51 -05001196 //ccnb_tagged_putf(templ, CCN_DTAG_Scope, "%d", scope);
1197 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1198 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1199 ccn_charbuf_append(templ, "2", 1); //scope of interest: 2 (not further than next host)
1200 ccn_charbuf_append_closer(templ); /* </Scope> */
1201
1202 appendLifetime(templ,nlsr->interest_resend_time);
akmhoqued79438d2012-08-27 13:31:42 -05001203 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque53f64222012-09-05 13:57:51 -05001204 /* Adding InterestLifeTime and InterestScope filter done */
akmhoque03004e62012-09-06 01:12:28 -05001205
akmhoque53f64222012-09-05 13:57:51 -05001206 printf("Sending NAME LSA interest on name prefix : %s/%s/%s\n",int_name,ls_type,ls_id);
akmhoqued79438d2012-08-27 13:31:42 -05001207
akmhoqued79438d2012-08-27 13:31:42 -05001208 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
akmhoque53f64222012-09-05 13:57:51 -05001209
akmhoqued79438d2012-08-27 13:31:42 -05001210 if ( res >= 0 )
akmhoque53f64222012-09-05 13:57:51 -05001211 printf("NAME LSA interest sending Successfull .... \n");
1212
akmhoqued79438d2012-08-27 13:31:42 -05001213 ccn_charbuf_destroy(&templ);
1214 ccn_charbuf_destroy(&name);
akmhoque53f64222012-09-05 13:57:51 -05001215 free(int_name);
akmhoque03004e62012-09-06 01:12:28 -05001216
1217
akmhoqued79438d2012-08-27 13:31:42 -05001218}
akmhoque53f64222012-09-05 13:57:51 -05001219
1220void
1221send_interest_for_adj_lsa(struct name_prefix *nbr, char *orig_router, char *ls_type)
1222{
1223 printf("send_interest_for_adj_lsa called\n");
1224
1225 int res;
akmhoque53f64222012-09-05 13:57:51 -05001226 char lsa_str[5];
1227 char nlsr_str[5];
1228
akmhoque53f64222012-09-05 13:57:51 -05001229 memset(&nlsr_str,0,5);
1230 sprintf(nlsr_str,"nlsr");
1231 memset(&lsa_str,0,5);
1232 sprintf(lsa_str,"lsa");
1233
akmhoque29c1db52012-09-07 14:47:43 -05001234 char *int_name=(char *)malloc(nbr->length + strlen(ls_type)+strlen(orig_router)+strlen(nlsr_str)+strlen(lsa_str)+3+strlen(ls_type)+1);
1235 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 -05001236
1237 memcpy(int_name+strlen(int_name),nbr->name,nbr->length);
1238 memcpy(int_name+strlen(int_name),"/",1);
1239 memcpy(int_name+strlen(int_name),nlsr_str,strlen(nlsr_str));
1240 memcpy(int_name+strlen(int_name),"/",1);
1241 memcpy(int_name+strlen(int_name),lsa_str,strlen(lsa_str));
akmhoque03004e62012-09-06 01:12:28 -05001242 memcpy(int_name+strlen(int_name),"/",1);
1243 memcpy(int_name+strlen(int_name),ls_type,strlen(ls_type));
akmhoque53f64222012-09-05 13:57:51 -05001244 memcpy(int_name+strlen(int_name),orig_router,strlen(orig_router));
akmhoque29c1db52012-09-07 14:47:43 -05001245 memcpy(int_name+strlen(int_name),"/",1);
1246 memcpy(int_name+strlen(int_name),ls_type,strlen(ls_type));
akmhoque03004e62012-09-06 01:12:28 -05001247
akmhoque53f64222012-09-05 13:57:51 -05001248 struct ccn_charbuf *name;
1249 name=ccn_charbuf_create();
akmhoque03004e62012-09-06 01:12:28 -05001250
akmhoque53f64222012-09-05 13:57:51 -05001251
1252 ccn_name_from_uri(name,int_name);
akmhoque03004e62012-09-06 01:12:28 -05001253
akmhoque53f64222012-09-05 13:57:51 -05001254 /* adding InterestLifeTime and InterestScope filter */
1255
1256 struct ccn_charbuf *templ;
1257 templ = ccn_charbuf_create();
1258
1259 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
1260 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
1261 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque53f64222012-09-05 13:57:51 -05001262 ccn_charbuf_append_tt(templ, CCN_DTAG_Scope, CCN_DTAG);
1263 ccn_charbuf_append_tt(templ, 1, CCN_UDATA);
1264 ccn_charbuf_append(templ, "2", 1); //scope of interest: 2 (not further than next host)
1265 ccn_charbuf_append_closer(templ); /* </Scope> */
1266
1267 appendLifetime(templ,nlsr->interest_resend_time);
1268 ccn_charbuf_append_closer(templ); /* </Interest> */
1269 /* Adding InterestLifeTime and InterestScope filter done */
akmhoque03004e62012-09-06 01:12:28 -05001270
akmhoque29c1db52012-09-07 14:47:43 -05001271 printf("Sending ADJ LSA interest on name prefix : %s\n",int_name);
akmhoque53f64222012-09-05 13:57:51 -05001272
1273 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
1274
1275 if ( res >= 0 )
akmhoque29c1db52012-09-07 14:47:43 -05001276 {
akmhoque53f64222012-09-05 13:57:51 -05001277 printf("ADJ LSA interest sending Successfull .... \n");
akmhoque29c1db52012-09-07 14:47:43 -05001278 }
akmhoque53f64222012-09-05 13:57:51 -05001279
akmhoque53f64222012-09-05 13:57:51 -05001280 ccn_charbuf_destroy(&templ);
1281 ccn_charbuf_destroy(&name);
1282 free(int_name);
akmhoque53f64222012-09-05 13:57:51 -05001283}