blob: 73ced99ef1db26d83b0df5d5412290c3bb740bc0 [file] [log] [blame]
akmhoque59980a52012-08-09 12:36:09 -05001#include<stdio.h>
2#include<string.h>
3#include<stdlib.h>
4#include <unistd.h>
5#include <getopt.h>
6#include <sys/time.h>
7#include <assert.h>
8#ifdef HAVE_CONFIG_H
9#include <config.h>
10#endif
11
12
13#include <ccn/ccn.h>
14#include <ccn/uri.h>
15#include <ccn/keystore.h>
16#include <ccn/signing.h>
17#include <ccn/schedule.h>
18#include <ccn/hashtb.h>
akmhoque7f337272012-08-14 15:16:30 -050019#include <ccn/bloom.h>
akmhoque59980a52012-08-09 12:36:09 -050020
21#include "nlsr.h"
22#include "nlsr_ndn.h"
23#include "utility.h"
24
25enum ccn_upcall_res
26incoming_interest(struct ccn_closure *selfp,
27 enum ccn_upcall_kind kind, struct ccn_upcall_info *info)
28{
29
30 switch (kind) {
31 case CCN_UPCALL_FINAL:
32 break;
33 case CCN_UPCALL_INTEREST:
34 // printing the name prefix for which it received interest
35 printf("Interest Received for name: ");
36 struct ccn_charbuf*c;
37 c=ccn_charbuf_create();
38 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
39 //ccn_name_chop(c,NULL,-1);
40 printf("%s\n",ccn_charbuf_as_string(c));
41 ccn_charbuf_destroy(&c);
42
akmhoque1c9b92f2012-08-13 10:57:50 -050043 process_incoming_interest(selfp, info);
akmhoque59980a52012-08-09 12:36:09 -050044
45 /*
46 struct ccn_charbuf *data=ccn_charbuf_create();
47 struct ccn_charbuf *name=ccn_charbuf_create();
48 struct ccn_signing_params sp=CCN_SIGNING_PARAMS_INIT;
49
50 ccn_charbuf_append(name, info->interest_ccnb + info->pi->offset[CCN_PI_B_Name],
51 info->pi->offset[CCN_PI_E_Name] - info->pi->offset[CCN_PI_B_Name]);
52
53 sp.template_ccnb=ccn_charbuf_create();
54 ccn_charbuf_append_tt(sp.template_ccnb,CCN_DTAG_SignedInfo, CCN_DTAG);
55 ccnb_tagged_putf(sp.template_ccnb, CCN_DTAG_FreshnessSeconds, "%ld", 1010);
56 sp.sp_flags |= CCN_SP_TEMPL_FRESHNESS;
57 ccn_charbuf_append_closer(sp.template_ccnb);
58
59 res= ccn_sign_content(ospfndn->ccn, data, name, &sp, "hello", strlen("hello"));
60 res=ccn_put(ospfndn->ccn,data->buf,data->length);
61 ccn_charbuf_destroy(&data);
62
63 */
64 break;
65
66 default:
67 break;
68 }
69
70 return CCN_UPCALL_RESULT_OK;
71}
72
73
74enum ccn_upcall_res incoming_content(struct ccn_closure* selfp,
75 enum ccn_upcall_kind kind, struct ccn_upcall_info* info)
76{
77
78
79 switch(kind) {
80 case CCN_UPCALL_FINAL:
81 break;
82 case CCN_UPCALL_CONTENT:
83 printf("Content Received for name: ");
84 struct ccn_charbuf*c;
85 c=ccn_charbuf_create();
86 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E],0);
87 printf("%s\n",ccn_charbuf_as_string(c));
88 ccn_charbuf_destroy(&c);
89
90 //process_incoming_content(selfp, info);
91 break;
92 case CCN_UPCALL_INTEREST_TIMED_OUT:
93 /* printf("Interest timed out \n");
94
95 const unsigned char *comp_ptr;
96 size_t comp_size;
97 int res;
98
99 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,2,&comp_ptr, &comp_size);
100
101 printf("Parsed Interest: %s size: %d Size of name prefix: %d\n",comp_ptr,(int)comp_size,(int)info->interest_comps->n);
102 */
103
104 //process_timed_out_interest(selfp,info);
105 break;
106 default:
107 fprintf(stderr, "Unexpected response of kind %d\n", kind);
108 return CCN_UPCALL_RESULT_ERR;
109 }
110
111 return CCN_UPCALL_RESULT_OK;
112}
akmhoque61fe4472012-08-10 10:13:34 -0500113
akmhoque1c9b92f2012-08-13 10:57:50 -0500114void
115process_incoming_interest(struct ccn_closure *selfp, struct ccn_upcall_info *info)
116{
117 printf("process_incoming_interest called \n");
118
119
120 struct ccn_charbuf*c;
121 c=ccn_charbuf_create();
122 ccn_uri_append(c,info->interest_ccnb,info->pi->offset[CCN_PI_E_Name]-info->pi->offset[CCN_PI_B_Name],0);
123 printf("%s\n",ccn_charbuf_as_string(c));
124 ccn_charbuf_destroy(&c);
125
126 const unsigned char *comp_ptr1;
127 size_t comp_size;
128 int res,i;
129 int nlsr_position=0;
130 int name_comps=(int)info->interest_comps->n;
131
132 for(i=0;i<name_comps;i++)
133 {
134 res=ccn_name_comp_strcmp(info->interest_ccnb,info->interest_comps,i,"nlsr");
135 if( res == 0)
136 {
akmhoqueea3603e2012-08-13 11:24:09 -0500137 nlsr_position=i;
akmhoque1c9b92f2012-08-13 10:57:50 -0500138 break;
139 }
140 }
141
142 res=ccn_name_comp_get(info->interest_ccnb, info->interest_comps,nlsr_position+1,&comp_ptr1, &comp_size);
143
144
145 printf("Det= %s \n",comp_ptr1);
146
147 if(!strcmp((char *)comp_ptr1,"lsdb"))
148 {
akmhoquebf1aa832012-08-13 13:26:59 -0500149 process_incoming_interest_lsdb(selfp,info);
akmhoque1c9b92f2012-08-13 10:57:50 -0500150 }
akmhoquebf1aa832012-08-13 13:26:59 -0500151
152
153}
154
155
156void
157process_incoming_interest_lsdb(struct ccn_closure *selfp, struct ccn_upcall_info *info)
158{
159 printf("process_incoming_interest_lsdb called \n");
160
akmhoque6d49e4d2012-08-14 13:49:30 -0500161 int l;
akmhoquefce8cfc2012-08-14 14:00:33 -0500162 const unsigned char *exclbase;
akmhoque6d49e4d2012-08-14 13:49:30 -0500163 size_t size;
akmhoquefce8cfc2012-08-14 14:00:33 -0500164 struct ccn_buf_decoder decoder;
165 struct ccn_buf_decoder *d;
166 const unsigned char *comp;
167
akmhoque6d49e4d2012-08-14 13:49:30 -0500168
169 l = info->pi->offset[CCN_PI_E_Exclude] - info->pi->offset[CCN_PI_B_Exclude];
170 if (l > 0)
171 {
172 comp = NULL;
173 size = 0;
174 exclbase = info->interest_ccnb + info->pi->offset[CCN_PI_B_Exclude];
175 d = ccn_buf_decoder_start(&decoder, exclbase, l);
176 if (ccn_buf_match_dtag(d, CCN_DTAG_Exclude))
177 {
178 ccn_buf_advance(d);
179 if (ccn_buf_match_dtag(d, CCN_DTAG_Any))
180 ccn_buf_advance_past_element(d);
181 if (ccn_buf_match_dtag(d, CCN_DTAG_Component))
182 {
183 ccn_buf_advance(d);
184 ccn_buf_match_blob(d, &comp, &size);
akmhoquec9286692012-08-16 09:57:58 -0500185 ccn_buf_check_close(d);
186
187
akmhoque6d49e4d2012-08-14 13:49:30 -0500188 }
189 ccn_buf_check_close(d);
190 }
akmhoque07dd8cc2012-08-16 10:23:01 -0500191 //if (d->decoder.state < 0)
192 //printf("Parse Failed\n");
akmhoque6d49e4d2012-08-14 13:49:30 -0500193 if (comp != NULL)
akmhoque37e3adf2012-08-14 15:52:50 -0500194 printf("Number in Exclusion Filter is %s\n",comp);
akmhoque6d49e4d2012-08-14 13:49:30 -0500195
196 /* Now comp points to the start of your potential number, and size is its length */
197 }
198
akmhoque07dd8cc2012-08-16 10:23:01 -0500199 int dbcmp=strncmp(nlsr->lsdb->version,(char *)comp,16);
akmhoque898d4aa2012-08-16 10:26:15 -0500200
201 printf (" dbcmp = %d \n",dbcmp);
202
akmhoque07dd8cc2012-08-16 10:23:01 -0500203 if(dbcmp > 0)
akmhoque898d4aa2012-08-16 10:26:15 -0500204 printf("Has Updated database (Older: %s New: %s)\n",comp,nlsr->lsdb->version);
akmhoque07dd8cc2012-08-16 10:23:01 -0500205 else
akmhoque898d4aa2012-08-16 10:26:15 -0500206 printf("Data base is not updated than the older one (Older: %s New: %s)\n",comp,nlsr->lsdb->version);
akmhoque07dd8cc2012-08-16 10:23:01 -0500207
akmhoque6d49e4d2012-08-14 13:49:30 -0500208
209
akmhoque1c9b92f2012-08-13 10:57:50 -0500210}
211
212int
213send_lsdb_interest(struct ccn_schedule *sched, void *clienth,
214 struct ccn_scheduled_event *ev, int flags)
215{
216
217 struct ccn_charbuf *name;
218 long int rnum;
219 char rnumstr[20];
akmhoqueea3603e2012-08-13 11:24:09 -0500220 char lsdb_str[5];
221 char nlsr_str[5];
akmhoque1c9b92f2012-08-13 10:57:50 -0500222
223 int res,i;
224 int adl_element;
225
226 rnum=random();
227 memset(&rnumstr,0,20);
228 sprintf(rnumstr,"%ld",rnum);
akmhoqueea3603e2012-08-13 11:24:09 -0500229 memset(&nlsr_str,0,5);
230 sprintf(nlsr_str,"nlsr");
231 memset(&lsdb_str,0,5);
232 sprintf(lsdb_str,"lsdb");
233
akmhoque1c9b92f2012-08-13 10:57:50 -0500234
235 struct ndn_neighbor *nbr;
236
237 struct hashtb_enumerator ee;
238 struct hashtb_enumerator *e = &ee;
239
240 hashtb_start(nlsr->adl, e);
241 adl_element=hashtb_n(nlsr->adl);
akmhoque07dd8cc2012-08-16 10:23:01 -0500242 //int mynumber=15;
akmhoque1c9b92f2012-08-13 10:57:50 -0500243
244 for(i=0;i<adl_element;i++)
245 {
246 nbr=e->data;
akmhoqueea3603e2012-08-13 11:24:09 -0500247 printf("Sending interest for name prefix:%s/%s/%s/%s\n",nbr->neighbor->name,nlsr_str,lsdb_str,rnumstr);
akmhoque1c9b92f2012-08-13 10:57:50 -0500248 name=ccn_charbuf_create();
249 res=ccn_name_from_uri(name,nbr->neighbor->name);
akmhoqueea3603e2012-08-13 11:24:09 -0500250 ccn_name_append_str(name,nlsr_str);
251 ccn_name_append_str(name,lsdb_str);
akmhoque1c9b92f2012-08-13 10:57:50 -0500252 ccn_name_append_str(name,rnumstr);
253
akmhoque6d49e4d2012-08-14 13:49:30 -0500254 /* adding Exclusion filter */
akmhoquebf1aa832012-08-13 13:26:59 -0500255
akmhoque6d49e4d2012-08-14 13:49:30 -0500256 struct ccn_charbuf *templ;
257 templ = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500258
akmhoque6d49e4d2012-08-14 13:49:30 -0500259 struct ccn_charbuf *c;
260 c = ccn_charbuf_create();
akmhoque7f337272012-08-14 15:16:30 -0500261
262
263 ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG);
264 ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG);
265 ccn_charbuf_append_closer(templ); /* </Name> */
akmhoque6d49e4d2012-08-14 13:49:30 -0500266 ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG);
267 ccnb_tagged_putf(templ, CCN_DTAG_Any, "");
268 ccn_charbuf_reset(c);
akmhoque07dd8cc2012-08-16 10:23:01 -0500269 //ccn_charbuf_putf(c, "%u", (unsigned)mynumber);
270 ccn_charbuf_putf(c, "%s", nbr->last_lsdb_version);
akmhoque6d49e4d2012-08-14 13:49:30 -0500271 ccnb_append_tagged_blob(templ, CCN_DTAG_Component, c->buf, c->length);
272 ccn_charbuf_append_closer(templ); /* </Exclude> */
akmhoque7f337272012-08-14 15:16:30 -0500273 ccn_charbuf_append_closer(templ); /* </Interest> */
akmhoque37e3adf2012-08-14 15:52:50 -0500274
akmhoque6d49e4d2012-08-14 13:49:30 -0500275
276 /* Adding Exclusion filter done */
277
akmhoque7f337272012-08-14 15:16:30 -0500278 res=ccn_express_interest(nlsr->ccn,name,&(nlsr->in_content),templ);
279
akmhoque1c9b92f2012-08-13 10:57:50 -0500280 if ( res >= 0 )
281 printf("Interest sending Successfull .... \n");
akmhoque37e3adf2012-08-14 15:52:50 -0500282 ccn_charbuf_destroy(&c);
akmhoque7f337272012-08-14 15:16:30 -0500283 ccn_charbuf_destroy(&templ);
akmhoque1c9b92f2012-08-13 10:57:50 -0500284 ccn_charbuf_destroy(&name);
285
286 hashtb_next(e);
287 }
288
289 hashtb_end(e);
290
akmhoquec9286692012-08-16 09:57:58 -0500291 nlsr->event_send_lsdb_interest = ccn_schedule_event(nlsr->sched, 300000000, &send_lsdb_interest, NULL, 0);
akmhoque1c9b92f2012-08-13 10:57:50 -0500292
293 return 0;
294
295}
296