blob: e465457558e0cadc13e69146538d3373e35825cb [file] [log] [blame]
akmhoquef1161eb2012-08-21 09:37:21 -04001#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"
akmhoque03004e62012-09-06 01:12:28 -050021#include "nlsr_ndn.h"
akmhoquef1161eb2012-08-21 09:37:21 -040022#include "nlsr_lsdb.h"
akmhoquef71d9082012-08-22 12:51:53 -040023#include "utility.h"
akmhoque03004e62012-09-06 01:12:28 -050024#include "nlsr_npl.h"
akmhoque53f64222012-09-05 13:57:51 -050025#include "nlsr_adl.h"
akmhoque29c1db52012-09-07 14:47:43 -050026#include "nlsr_route.h"
akmhoque3560cb62012-09-09 10:52:30 -050027#include "nlsr_npt.h"
akmhoqueb77b95f2013-02-08 12:28:47 -060028#include "nlsr_sync.h"
akmhoque438b07e2012-08-21 10:13:57 -040029
akmhoquef71d9082012-08-22 12:51:53 -040030void
akmhoque53f64222012-09-05 13:57:51 -050031set_new_lsdb_version(void)
akmhoquef71d9082012-08-22 12:51:53 -040032{
akmhoque03004e62012-09-06 01:12:28 -050033 char *time_stamp=(char *)malloc(20);
34 memset(time_stamp,0,20);
35 get_current_timestamp_micro(time_stamp);
akmhoquef71d9082012-08-22 12:51:53 -040036
akmhoque03004e62012-09-06 01:12:28 -050037 free(nlsr->lsdb->lsdb_version);
38 nlsr->lsdb->lsdb_version=(char *)malloc(strlen(time_stamp)+1);
39 memset(nlsr->lsdb->lsdb_version,0,strlen(time_stamp)+1);
40 memcpy(nlsr->lsdb->lsdb_version,time_stamp,strlen(time_stamp)+1);
41
42 free(time_stamp);
akmhoque53f64222012-09-05 13:57:51 -050043
akmhoquef71d9082012-08-22 12:51:53 -040044}
45
akmhoque03004e62012-09-06 01:12:28 -050046void
47make_name_lsa_key(char *key, char *orig_router, int ls_type, long int ls_id)
48{
49
akmhoque03004e62012-09-06 01:12:28 -050050 char lst[2];
51 memset(lst,0,2);
52 sprintf(lst,"%d",ls_type);
53
54 char lsid[10];
55 memset(lsid,0,10);
56 sprintf(lsid,"%ld",ls_id);
57
58 memcpy(key+strlen(key),orig_router,strlen(orig_router));
59 memcpy(key+strlen(key),"/",1);
60 memcpy(key+strlen(key),lst,strlen(lst));
61 memcpy(key+strlen(key),"/",1);
62 memcpy(key+strlen(key),lsid,strlen(lsid));
akmhoque03004e62012-09-06 01:12:28 -050063
akmhoqueb77b95f2013-02-08 12:28:47 -060064 if ( nlsr->debugging )
65 printf("name LSA Key: %s\n", key);
66}
67
68
69void
70make_name_lsa_prefix_for_repo(char *key, char *orig_router, int ls_type, long int ls_id,char *orig_time,char *slice_prefix)
71{
72 sprintf(key,"%s%s/lsType.%d/lsId.%ld/%s",slice_prefix, orig_router, ls_type, ls_id, orig_time);
73
74 if ( nlsr->debugging )
75 printf("Name LSA prefix for repo content: %s\n",key);
76}
77
78void
79make_adj_lsa_prefix_for_repo(char *key, char *orig_router, int ls_type, char *orig_time,char *slice_prefix)
80{
81
82 sprintf(key,"%s%s/lsType.%d/%s",slice_prefix,orig_router,ls_type, orig_time );
83
84 if ( nlsr->debugging )
85 printf("Name LSA prefix for repo content:%s\n",key);
86}
87
88void
89make_cor_lsa_prefix_for_repo(char *key, char *orig_router, int ls_type, char *orig_time,char *slice_prefix)
90{
91
92 sprintf(key,"%s%s/lsType.%d/%s",slice_prefix,orig_router,ls_type, orig_time );
93
94 if ( nlsr->debugging )
95 printf("Cor LSA prefix for repo content:%s\n",key);
akmhoque03004e62012-09-06 01:12:28 -050096}
akmhoque53f64222012-09-05 13:57:51 -050097
akmhoquef71d9082012-08-22 12:51:53 -040098void
akmhoque53f64222012-09-05 13:57:51 -050099build_and_install_name_lsas(void)
akmhoquef71d9082012-08-22 12:51:53 -0400100{
akmhoque7b791452012-10-30 11:24:56 -0500101 if ( nlsr->debugging )
102 printf("build_and_install_name_lsas called \n");
103 if ( nlsr->detailed_logging )
104 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_and_install_name_lsas called\n");
akmhoquef71d9082012-08-22 12:51:53 -0400105
akmhoquef71d9082012-08-22 12:51:53 -0400106 int i, npl_element;
akmhoque3171d652012-11-13 11:44:33 -0600107 struct name_prefix_list_entry *npe;
akmhoquef71d9082012-08-22 12:51:53 -0400108
109 struct hashtb_enumerator ee;
110 struct hashtb_enumerator *e = &ee;
111
112 hashtb_start(nlsr->npl, e);
113 npl_element=hashtb_n(nlsr->npl);
114
115 for(i=0;i<npl_element;i++)
116 {
akmhoque3171d652012-11-13 11:44:33 -0600117 npe=e->data;
akmhoque53f64222012-09-05 13:57:51 -0500118 struct nlsa *name_lsa=(struct nlsa *)malloc(sizeof( struct nlsa ));
akmhoque3171d652012-11-13 11:44:33 -0600119 build_name_lsa(name_lsa,npe->np);
akmhoque03004e62012-09-06 01:12:28 -0500120
akmhoquef71d9082012-08-22 12:51:53 -0400121 install_name_lsa(name_lsa);
akmhoque3171d652012-11-13 11:44:33 -0600122 update_nlsa_id_for_name_in_npl(npe->np,name_lsa->header->ls_id);
akmhoque03004e62012-09-06 01:12:28 -0500123 free(name_lsa->header->orig_router->name);
124 free(name_lsa->header->orig_router);
125 free(name_lsa->header);
126 free(name_lsa->name_prefix->name);
127 free(name_lsa->name_prefix);
akmhoquef71d9082012-08-22 12:51:53 -0400128 free(name_lsa);
akmhoquef71d9082012-08-22 12:51:53 -0400129 hashtb_next(e);
130 }
131
akmhoque53f64222012-09-05 13:57:51 -0500132 hashtb_end(e);
akmhoque3171d652012-11-13 11:44:33 -0600133
134 print_name_prefix_from_npl();
135
136}
137
138void
139build_and_install_single_name_lsa(struct name_prefix *np)
140{
141 if ( nlsr->debugging )
142 printf("build_and_install_single_name_lsa called \n");
143 if ( nlsr->detailed_logging )
144 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_and_install_single_name_lsa called\n");
145
146 struct nlsa *name_lsa=(struct nlsa *)malloc(sizeof( struct nlsa ));
147 build_name_lsa(name_lsa,np);
148
149 install_name_lsa(name_lsa);
150 update_nlsa_id_for_name_in_npl(np,name_lsa->header->ls_id);
151
152 free(name_lsa->header->orig_router->name);
153 free(name_lsa->header->orig_router);
154 free(name_lsa->header);
155 free(name_lsa->name_prefix->name);
156 free(name_lsa->name_prefix);
157 free(name_lsa);
158
159 print_name_prefix_from_npl();
akmhoquef71d9082012-08-22 12:51:53 -0400160
akmhoquef71d9082012-08-22 12:51:53 -0400161}
162
akmhoque53f64222012-09-05 13:57:51 -0500163void
164build_name_lsa(struct nlsa *name_lsa, struct name_prefix *np)
165{
akmhoque53f64222012-09-05 13:57:51 -0500166 name_lsa->header=(struct nlsa_header *)malloc(sizeof(struct nlsa_header ));
167 name_lsa->header->ls_type=LS_TYPE_NAME;
168
akmhoque03004e62012-09-06 01:12:28 -0500169 char *time_stamp=(char *)malloc(20);
170 memset(time_stamp,0,20);
171 get_current_timestamp_micro(time_stamp);
akmhoque53f64222012-09-05 13:57:51 -0500172
akmhoque03004e62012-09-06 01:12:28 -0500173 name_lsa->header->orig_time=(char *)malloc(strlen(time_stamp)+1); //free
akmhoque53f64222012-09-05 13:57:51 -0500174 memset(name_lsa->header->orig_time,0,strlen(time_stamp)+1);
175 memcpy(name_lsa->header->orig_time,time_stamp,strlen(time_stamp)+1);
akmhoque03004e62012-09-06 01:12:28 -0500176
177 free(time_stamp);
akmhoque53f64222012-09-05 13:57:51 -0500178
179 name_lsa->header->ls_id=++nlsr->nlsa_id;
180 name_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
akmhoque03004e62012-09-06 01:12:28 -0500181 name_lsa->header->orig_router->name=(char *)malloc(strlen(nlsr->router_name)+1);
182 memset(name_lsa->header->orig_router->name,0,strlen(nlsr->router_name)+1);
183 memcpy(name_lsa->header->orig_router->name,nlsr->router_name,strlen(nlsr->router_name)+1);
184 name_lsa->header->orig_router->length=strlen(nlsr->router_name)+1;
akmhoque53f64222012-09-05 13:57:51 -0500185 name_lsa->header->isValid=1;
186
187
188 name_lsa->name_prefix=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
189 name_lsa->name_prefix->name=(char *)malloc(np->length);
190 memcpy(name_lsa->name_prefix->name,np->name,np->length);
191 name_lsa->name_prefix->length=np->length;
192
193}
194
akmhoque53f64222012-09-05 13:57:51 -0500195void
196install_name_lsa(struct nlsa *name_lsa)
197{
akmhoque53f64222012-09-05 13:57:51 -0500198
akmhoqueffacaa82012-09-13 17:48:30 -0500199 char *time_stamp=(char *)malloc(20);
200 memset(time_stamp,0,20);
201 get_current_timestamp_micro(time_stamp);
akmhoqueffacaa82012-09-13 17:48:30 -0500202
203
204 char lst[2];
205 memset(lst,0,2);
206 sprintf(lst,"%d",name_lsa->header->ls_type);
207
208 char lsid[10];
209 memset(lsid,0,10);
210 sprintf(lsid,"%ld",name_lsa->header->ls_id);
akmhoque03004e62012-09-06 01:12:28 -0500211
212
akmhoqueffacaa82012-09-13 17:48:30 -0500213 char *key=(char *)malloc(strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
214 memset(key,0,strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
akmhoque03004e62012-09-06 01:12:28 -0500215
216
akmhoque3171d652012-11-13 11:44:33 -0600217 make_name_lsa_key(key, name_lsa->header->orig_router->name,name_lsa->header->ls_type,name_lsa->header->ls_id);
218 if ( nlsr->debugging )
219 printf("Key:%s Length:%d\n",key,(int)strlen(key));
220 if ( nlsr->detailed_logging )
221 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Key:%s Length:%d\n",key,(int)strlen(key));
222
akmhoque53f64222012-09-05 13:57:51 -0500223
akmhoqueffacaa82012-09-13 17:48:30 -0500224 struct nlsa *new_name_lsa=(struct nlsa*)malloc(sizeof(struct nlsa )); //free
akmhoque53f64222012-09-05 13:57:51 -0500225
akmhoqueffacaa82012-09-13 17:48:30 -0500226 struct hashtb_enumerator ee;
227 struct hashtb_enumerator *e = &ee;
228 int res;
akmhoque53f64222012-09-05 13:57:51 -0500229
akmhoqueffacaa82012-09-13 17:48:30 -0500230 hashtb_start(nlsr->lsdb->name_lsdb, e);
231 res = hashtb_seek(e, key, strlen(key), 0);
akmhoque53f64222012-09-05 13:57:51 -0500232
akmhoqueffacaa82012-09-13 17:48:30 -0500233 if(res == HT_NEW_ENTRY )
akmhoque3560cb62012-09-09 10:52:30 -0500234 {
akmhoqueffacaa82012-09-13 17:48:30 -0500235
akmhoque7b791452012-10-30 11:24:56 -0500236 if ( nlsr->debugging )
237 printf("New Name LSA... Adding to LSDB\n");
238 if ( nlsr->detailed_logging )
239 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Name LSA... Adding to LSDB\n");
240
241
akmhoqueffacaa82012-09-13 17:48:30 -0500242 new_name_lsa = e->data;
243
244 new_name_lsa->header=(struct nlsa_header *)malloc(sizeof(struct nlsa_header )); //free
245 new_name_lsa->header->ls_type=name_lsa->header->ls_type;
246
247 new_name_lsa->header->orig_time=(char *)malloc(strlen(name_lsa->header->orig_time)+1);
248 memset(new_name_lsa->header->orig_time,0,strlen(name_lsa->header->orig_time)+1);
249 memcpy(new_name_lsa->header->orig_time,name_lsa->header->orig_time,strlen(name_lsa->header->orig_time)+1);
250
251 new_name_lsa->header->ls_id=name_lsa->header->ls_id;
252 new_name_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix )); //free
253 new_name_lsa->header->orig_router->name=(char *)malloc(name_lsa->header->orig_router->length);
254 memcpy(new_name_lsa->header->orig_router->name,name_lsa->header->orig_router->name,name_lsa->header->orig_router->length);
255 new_name_lsa->header->orig_router->length=name_lsa->header->orig_router->length;
256 new_name_lsa->header->isValid=name_lsa->header->isValid;
257
258
259 new_name_lsa->name_prefix=(struct name_prefix *)malloc(sizeof(struct name_prefix )); //free
260 new_name_lsa->name_prefix->name=(char *)malloc(name_lsa->name_prefix->length);
261 memcpy(new_name_lsa->name_prefix->name,name_lsa->name_prefix->name,name_lsa->name_prefix->length);
262 new_name_lsa->name_prefix->length=name_lsa->name_prefix->length;
263
akmhoque7b791452012-10-30 11:24:56 -0500264 if ( nlsr->debugging )
265 {
266 printf("New Name LSA Added....\n");
267 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
268 }
269 if ( nlsr->detailed_logging )
270 {
271 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Name LSA Added....\n");
272 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
273 }
akmhoqueffacaa82012-09-13 17:48:30 -0500274 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -0500275 if ( nlsr->debugging )
276 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
277 if ( nlsr->detailed_logging )
278 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
akmhoqueffacaa82012-09-13 17:48:30 -0500279
akmhoque9e9fc722012-09-26 14:03:25 -0500280
akmhoquede61ba92012-09-20 22:19:12 -0500281 int num_next_hop=get_number_of_next_hop(new_name_lsa->header->orig_router->name);
akmhoquede61ba92012-09-20 22:19:12 -0500282 if ( num_next_hop < 0 )
akmhoque3560cb62012-09-09 10:52:30 -0500283 {
akmhoquede61ba92012-09-20 22:19:12 -0500284 int check=add_npt_entry(new_name_lsa->header->orig_router->name,new_name_lsa->name_prefix->name,NO_NEXT_HOP,NULL,NULL);
akmhoqueffacaa82012-09-13 17:48:30 -0500285 if ( check == HT_NEW_ENTRY )
286 {
akmhoque7b791452012-10-30 11:24:56 -0500287 if ( nlsr->debugging )
288 printf("Added in npt \n");
289 if ( nlsr->detailed_logging )
290 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Added in npt \n");
akmhoqueffacaa82012-09-13 17:48:30 -0500291 }
akmhoque3560cb62012-09-09 10:52:30 -0500292 }
akmhoqueffacaa82012-09-13 17:48:30 -0500293 else
akmhoque3560cb62012-09-09 10:52:30 -0500294 {
akmhoquede61ba92012-09-20 22:19:12 -0500295 int *faces=malloc(num_next_hop*sizeof(int));
296 int *route_costs=malloc(num_next_hop*sizeof(int));
297 int next_hop=get_next_hop(new_name_lsa->header->orig_router->name,faces,route_costs);
akmhoque7b791452012-10-30 11:24:56 -0500298 if ( nlsr->debugging )
299 {
300 printf("Printing from install_name_lsa \n");
301 int j;
302 for(j=0;j<num_next_hop;j++)
303 printf("Face: %d Route Cost: %d \n",faces[j],route_costs[j]);
304 }
305 if ( nlsr->detailed_logging )
306 {
307 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Printing from install_name_lsa \n");
308 int j;
309 for(j=0;j<num_next_hop;j++)
310 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Face: %d Route Cost: %d \n",faces[j],route_costs[j]);
311 }
akmhoquede61ba92012-09-20 22:19:12 -0500312 int check=add_npt_entry(new_name_lsa->header->orig_router->name,new_name_lsa->name_prefix->name,next_hop,faces,route_costs);
akmhoqueffacaa82012-09-13 17:48:30 -0500313 if ( check == HT_NEW_ENTRY )
314 {
akmhoque7b791452012-10-30 11:24:56 -0500315 if ( nlsr->debugging )
316 printf("Added in npt \n");
317 if ( nlsr->detailed_logging )
318 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Added in npt \n");
akmhoqueffacaa82012-09-13 17:48:30 -0500319 }
akmhoquede61ba92012-09-20 22:19:12 -0500320 free(faces);
321 free(route_costs);
akmhoqueffacaa82012-09-13 17:48:30 -0500322
akmhoque3560cb62012-09-09 10:52:30 -0500323 }
akmhoquede61ba92012-09-20 22:19:12 -0500324
akmhoque9e9fc722012-09-26 14:03:25 -0500325 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
326 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding name lsa\n");
327 write_log_for_name_lsa(new_name_lsa);
328 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
akmhoqueffacaa82012-09-13 17:48:30 -0500329
akmhoquede61ba92012-09-20 22:19:12 -0500330 free(time_stamp);
akmhoqueffacaa82012-09-13 17:48:30 -0500331
332 }
333 else if(res == HT_OLD_ENTRY)
334 {
335 new_name_lsa=e->data;
akmhoque14b3f342012-09-14 10:39:02 -0500336 if(strcmp(name_lsa->header->orig_time,new_name_lsa->header->orig_time)<0)
akmhoqueffacaa82012-09-13 17:48:30 -0500337 {
akmhoque7b791452012-10-30 11:24:56 -0500338 if ( nlsr->debugging )
339 printf("Older Adj LSA. Discarded... \n");
340 if ( nlsr->detailed_logging )
341 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Older Adj LSA. Discarded...\n");
akmhoque14b3f342012-09-14 10:39:02 -0500342 }
343 else if( strcmp(name_lsa->header->orig_time,new_name_lsa->header->orig_time) == 0 )
344 {
akmhoque7b791452012-10-30 11:24:56 -0500345 if ( nlsr->debugging )
346 printf("Duplicate Adj LSA. Discarded... \n");
347 if ( nlsr->detailed_logging )
348 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Duplicate Adj LSA. Discarded...\n");
akmhoqueffacaa82012-09-13 17:48:30 -0500349 }
350 else
351 {
352 if ( name_lsa->header->isValid == 0 )
353 {
354 // have to call to delete npt table entry
akmhoque3cced642012-09-24 16:20:20 -0500355 delete_npt_entry_by_router_and_name_prefix(new_name_lsa->header->orig_router->name,new_name_lsa->name_prefix->name);
akmhoqueffacaa82012-09-13 17:48:30 -0500356
357 if ( strcmp(name_lsa->header->orig_router->name,nlsr->router_name)!= 0)
358 {
akmhoque9e9fc722012-09-26 14:03:25 -0500359 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
360 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting name lsa\n");
361 write_log_for_name_lsa(new_name_lsa);
362 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
363
akmhoqueffacaa82012-09-13 17:48:30 -0500364 hashtb_delete(e);
akmhoque7b791452012-10-30 11:24:56 -0500365 if ( nlsr->debugging )
366 printf("isValid bit not set for Router %s so LSA Deleted from LSDB\n",name_lsa->header->orig_router->name);
367 if ( nlsr->detailed_logging )
368 writeLogg(__FILE__,__FUNCTION__,__LINE__,"isValid bit not set for Router %s so LSA Deleted from LSDB\n",name_lsa->header->orig_router->name);
akmhoqueffacaa82012-09-13 17:48:30 -0500369 }
370 else
371 {
372 new_name_lsa->header->isValid=name_lsa->header->isValid;
373 free(new_name_lsa->header->orig_time);
374 new_name_lsa->header->orig_time=(char *)malloc(strlen(name_lsa->header->orig_time)+1);
375 memset(new_name_lsa->header->orig_time,0,strlen(name_lsa->header->orig_time)+1);
376 memcpy(new_name_lsa->header->orig_time,name_lsa->header->orig_time,strlen(name_lsa->header->orig_time)+1);
377 }
akmhoque7b791452012-10-30 11:24:56 -0500378 if ( nlsr->debugging )
379 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
380 if ( nlsr->detailed_logging )
381 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
akmhoqueffacaa82012-09-13 17:48:30 -0500382 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -0500383 if ( nlsr->debugging )
384 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
385 if ( nlsr->detailed_logging )
386 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
akmhoqueffacaa82012-09-13 17:48:30 -0500387 }
388 else
389 {
390 int is_npt_update=0;
391 if ( strcmp(new_name_lsa->name_prefix->name,name_lsa->name_prefix->name) != 0 )
392 {
393 is_npt_update=1;
akmhoque3cced642012-09-24 16:20:20 -0500394 delete_npt_entry_by_router_and_name_prefix(new_name_lsa->header->orig_router->name,new_name_lsa->name_prefix->name);
akmhoqueffacaa82012-09-13 17:48:30 -0500395 }
396
397 // copying LSA content with header
akmhoque9e9fc722012-09-26 14:03:25 -0500398 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
399 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting name lsa\n");
400 write_log_for_name_lsa(new_name_lsa);
401 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
402
akmhoqueffacaa82012-09-13 17:48:30 -0500403
404 free(new_name_lsa->header->orig_time);
405 new_name_lsa->header->orig_time=(char *)malloc(strlen(name_lsa->header->orig_time)+1);
406 memset(new_name_lsa->header->orig_time,0,strlen(name_lsa->header->orig_time)+1);
407 memcpy(new_name_lsa->header->orig_time,name_lsa->header->orig_time,strlen(name_lsa->header->orig_time)+1);
408
409 new_name_lsa->header->isValid=name_lsa->header->isValid;
410
411 free(new_name_lsa->name_prefix->name);
412 free(new_name_lsa->name_prefix);
413 new_name_lsa->name_prefix=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
414 new_name_lsa->name_prefix->name=(char *)malloc(name_lsa->name_prefix->length);
415 memcpy(new_name_lsa->name_prefix->name,name_lsa->name_prefix->name,name_lsa->name_prefix->length);
416 new_name_lsa->name_prefix->length=name_lsa->name_prefix->length;
417
akmhoque9e9fc722012-09-26 14:03:25 -0500418
419 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
420 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding name lsa\n");
421 write_log_for_name_lsa(new_name_lsa);
422 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
423
akmhoque7b791452012-10-30 11:24:56 -0500424 if ( nlsr->debugging )
425 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
426 if ( nlsr->detailed_logging )
427 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
428
akmhoqueffacaa82012-09-13 17:48:30 -0500429 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -0500430
431 if ( nlsr->debugging )
432 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
433 if ( nlsr->detailed_logging )
434 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
435
akmhoqueffacaa82012-09-13 17:48:30 -0500436
437 if( is_npt_update == 1 )
438 {
akmhoquede61ba92012-09-20 22:19:12 -0500439 //struct hashtb *face_list;
440 int num_next_hop=get_number_of_next_hop(new_name_lsa->header->orig_router->name);
441 if ( num_next_hop < 0 )
akmhoqueffacaa82012-09-13 17:48:30 -0500442 {
akmhoquede61ba92012-09-20 22:19:12 -0500443
444 int check=add_npt_entry(new_name_lsa->header->orig_router->name,new_name_lsa->name_prefix->name,NO_NEXT_HOP,NULL,NULL);
akmhoqueffacaa82012-09-13 17:48:30 -0500445 if ( check == HT_NEW_ENTRY )
446 {
akmhoque7b791452012-10-30 11:24:56 -0500447 if ( nlsr->debugging )
448 printf("Added in npt \n");
449 if ( nlsr->detailed_logging )
450 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Added in npt \n");
akmhoqueffacaa82012-09-13 17:48:30 -0500451 }
452 }
453 else
454 {
akmhoquede61ba92012-09-20 22:19:12 -0500455 int *faces=malloc(num_next_hop*sizeof(int));
456 int *route_costs=malloc(num_next_hop*sizeof(int));
457 int next_hop=get_next_hop(new_name_lsa->header->orig_router->name,faces,route_costs);
akmhoque7b791452012-10-30 11:24:56 -0500458
459 if ( nlsr->debugging )
460 {
461 printf("Printing from install_name_lsa \n");
462 int j;
463 for(j=0;j<num_next_hop;j++)
akmhoquede61ba92012-09-20 22:19:12 -0500464 printf("Face: %d Route Cost: %d \n",faces[j],route_costs[j]);
akmhoque7b791452012-10-30 11:24:56 -0500465 }
466 if ( nlsr->detailed_logging )
467 {
468 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Printing from install_name_lsa \n");
469 int j;
470 for(j=0;j<num_next_hop;j++)
471 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Face: %d Route Cost: %d \n",faces[j],route_costs[j]);
472 }
473
akmhoquede61ba92012-09-20 22:19:12 -0500474
475 int check=add_npt_entry(new_name_lsa->header->orig_router->name,new_name_lsa->name_prefix->name,next_hop,faces,route_costs);
akmhoqueffacaa82012-09-13 17:48:30 -0500476 if ( check == HT_NEW_ENTRY )
477 {
akmhoque7b791452012-10-30 11:24:56 -0500478 if ( nlsr->debugging )
479 printf("Added in npt \n");
480 if ( nlsr->detailed_logging )
481 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Added in npt \n");
akmhoqueffacaa82012-09-13 17:48:30 -0500482 }
akmhoquede61ba92012-09-20 22:19:12 -0500483 free(faces);
484 free(route_costs);
485
akmhoqueffacaa82012-09-13 17:48:30 -0500486 }
akmhoquede61ba92012-09-20 22:19:12 -0500487
akmhoqueffacaa82012-09-13 17:48:30 -0500488 }
489 }
490 }
491
akmhoque3560cb62012-09-09 10:52:30 -0500492 }
akmhoque53f64222012-09-05 13:57:51 -0500493
akmhoqueffacaa82012-09-13 17:48:30 -0500494 hashtb_end(e);
akmhoque53f64222012-09-05 13:57:51 -0500495
akmhoqueffacaa82012-09-13 17:48:30 -0500496 free(key);
akmhoque53f64222012-09-05 13:57:51 -0500497}
498
akmhoque9e9fc722012-09-26 14:03:25 -0500499void
500write_log_for_name_lsa(struct nlsa *name_lsa)
501{
502
503 writeLogg(__FILE__,__FUNCTION__,__LINE__,"-----------Name LSA Content---------------\n");
504 writeLogg(__FILE__,__FUNCTION__,__LINE__," Origination Router: %s\n",name_lsa->header->orig_router->name);
505 writeLogg(__FILE__,__FUNCTION__,__LINE__," Origination Router Length: %d\n",name_lsa->header->orig_router->length);
akmhoque34b99f92012-09-27 12:24:27 -0500506 writeLogg(__FILE__,__FUNCTION__,__LINE__," LS Type: %d\n",name_lsa->header->ls_type);
507 writeLogg(__FILE__,__FUNCTION__,__LINE__," LS Id: %ld\n",name_lsa->header->ls_id);
508 writeLogg(__FILE__,__FUNCTION__,__LINE__," Origination Time: %s\n",name_lsa->header->orig_time);
509 writeLogg(__FILE__,__FUNCTION__,__LINE__," Is Valid: %d\n",name_lsa->header->isValid);
akmhoque9e9fc722012-09-26 14:03:25 -0500510 writeLogg(__FILE__,__FUNCTION__,__LINE__," LSA Data \n");
511 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name Prefix: %s\n",name_lsa->name_prefix->name);
512 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name Prefix Length: %d\n",name_lsa->name_prefix->length);
513 writeLogg(__FILE__,__FUNCTION__,__LINE__,"\n");
514}
akmhoque53f64222012-09-05 13:57:51 -0500515
akmhoque03004e62012-09-06 01:12:28 -0500516void
517print_name_lsa(struct nlsa *name_lsa)
akmhoque53f64222012-09-05 13:57:51 -0500518{
akmhoque53f64222012-09-05 13:57:51 -0500519
akmhoque7b791452012-10-30 11:24:56 -0500520 if ( nlsr->debugging )
521 {
522 printf("-----------Name LSA Content---------------\n");
523 printf(" Origination Router : %s\n",name_lsa->header->orig_router->name);
524 printf(" Origination Router Length: %d\n",name_lsa->header->orig_router->length);
525 printf(" LS Type : %d\n",name_lsa->header->ls_type);
526 printf(" LS Id : %ld\n",name_lsa->header->ls_id);
527 printf(" Origination Time : %s\n",name_lsa->header->orig_time);
528 printf(" Is Valid : %d\n",name_lsa->header->isValid);
529 printf(" LSA Data \n");
530 printf(" Name Prefix: : %s\n",name_lsa->name_prefix->name);
531 printf(" Name Prefix Length : %d\n",name_lsa->name_prefix->length);
532
533 printf("\n");
534 }
akmhoquef71d9082012-08-22 12:51:53 -0400535}
536
537void
538print_name_lsdb(void)
539{
akmhoque7b791452012-10-30 11:24:56 -0500540 if ( nlsr->debugging )
541 printf("print_name_lsdb called \n");
akmhoque53f64222012-09-05 13:57:51 -0500542 int i, name_lsdb_element;
akmhoquef71d9082012-08-22 12:51:53 -0400543 struct nlsa *name_lsa;
544
545 struct hashtb_enumerator ee;
546 struct hashtb_enumerator *e = &ee;
547
548 hashtb_start(nlsr->lsdb->name_lsdb, e);
akmhoque53f64222012-09-05 13:57:51 -0500549 name_lsdb_element=hashtb_n(nlsr->lsdb->name_lsdb);
akmhoquef71d9082012-08-22 12:51:53 -0400550
akmhoque53f64222012-09-05 13:57:51 -0500551 for(i=0;i<name_lsdb_element;i++)
akmhoquef71d9082012-08-22 12:51:53 -0400552 {
akmhoque7b791452012-10-30 11:24:56 -0500553 if ( nlsr->debugging )
554 printf("-----------Name LSA (%d)---------------\n",i+1);
akmhoquef71d9082012-08-22 12:51:53 -0400555 name_lsa=e->data;
akmhoque53f64222012-09-05 13:57:51 -0500556 print_name_lsa(name_lsa);
akmhoquef71d9082012-08-22 12:51:53 -0400557 hashtb_next(e);
558 }
559
560 hashtb_end(e);
561
akmhoque3171d652012-11-13 11:44:33 -0600562 if ( nlsr->debugging )
563 printf("\n");
564 if ( nlsr->detailed_logging )
565 writeLogg(__FILE__,__FUNCTION__,__LINE__,"\n");
akmhoque53f64222012-09-05 13:57:51 -0500566}
567
akmhoque03004e62012-09-06 01:12:28 -0500568
569void
570build_and_install_others_name_lsa(char *orig_router,int ls_type,long int ls_id,char *orig_time, int isValid,char *np)
akmhoque53f64222012-09-05 13:57:51 -0500571{
akmhoque7b791452012-10-30 11:24:56 -0500572 if ( nlsr->debugging )
573 printf("build_and_install_others_name_lsa called \n");
574 if ( nlsr->detailed_logging )
575 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_and_install_others_name_lsa called \n");
akmhoque53f64222012-09-05 13:57:51 -0500576
akmhoque03004e62012-09-06 01:12:28 -0500577 struct nlsa *name_lsa=(struct nlsa *)malloc(sizeof( struct nlsa ));
578 build_others_name_lsa(name_lsa,orig_router,ls_type,ls_id,orig_time, isValid,np);
579 print_name_lsa(name_lsa);
580 install_name_lsa(name_lsa);
581 print_name_lsdb();
akmhoquede61ba92012-09-20 22:19:12 -0500582 print_npt();
akmhoque53f64222012-09-05 13:57:51 -0500583
akmhoque03004e62012-09-06 01:12:28 -0500584 free(name_lsa->header->orig_router->name);
585 free(name_lsa->header->orig_router);
586 free(name_lsa->header);
587 free(name_lsa->name_prefix->name);
588 free(name_lsa->name_prefix);
589 free(name_lsa);
akmhoque53f64222012-09-05 13:57:51 -0500590
591}
592
593void
akmhoque03004e62012-09-06 01:12:28 -0500594build_others_name_lsa(struct nlsa *name_lsa, char *orig_router,int ls_type,long int ls_id,char *orig_time, int isValid,char *np)
akmhoque53f64222012-09-05 13:57:51 -0500595{
akmhoque7b791452012-10-30 11:24:56 -0500596 if ( nlsr->debugging )
597 printf("build_others_name_lsa called\n");
598 if ( nlsr->detailed_logging )
599 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_others_name_lsa called \n");
akmhoque53f64222012-09-05 13:57:51 -0500600
akmhoque03004e62012-09-06 01:12:28 -0500601 name_lsa->header=(struct nlsa_header *)malloc(sizeof(struct nlsa_header ));
602 name_lsa->header->ls_type=LS_TYPE_NAME;
akmhoque53f64222012-09-05 13:57:51 -0500603
akmhoque03004e62012-09-06 01:12:28 -0500604 name_lsa->header->orig_time=(char *)malloc(strlen(orig_time)+1);
605 memset(name_lsa->header->orig_time,0,strlen(orig_time)+1);
606 memcpy(name_lsa->header->orig_time,orig_time,strlen(orig_time)+1);
akmhoque53f64222012-09-05 13:57:51 -0500607
akmhoque03004e62012-09-06 01:12:28 -0500608 name_lsa->header->ls_id=ls_id;
609 name_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
610 name_lsa->header->orig_router->name=(char *)malloc(strlen(orig_router)+1);
611 memset(name_lsa->header->orig_router->name,0,strlen(orig_router)+1);
612 memcpy(name_lsa->header->orig_router->name,orig_router,strlen(orig_router)+1);
613 name_lsa->header->orig_router->length=strlen(orig_router)+1;
614 name_lsa->header->isValid=isValid;
akmhoque53f64222012-09-05 13:57:51 -0500615
akmhoque03004e62012-09-06 01:12:28 -0500616 name_lsa->name_prefix=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
617 name_lsa->name_prefix->name=(char *)malloc(strlen(np)+1);
618 memset(name_lsa->name_prefix->name,0,strlen(np)+1);
619 memcpy(name_lsa->name_prefix->name,np,strlen(np)+1);
620 name_lsa->name_prefix->length=strlen(np)+1;
akmhoquef71d9082012-08-22 12:51:53 -0400621}
akmhoqued79438d2012-08-27 13:31:42 -0500622
623
akmhoqueb77b95f2013-02-08 12:28:47 -0600624void
625make_cor_lsa_key(char *key,struct clsa *cor_lsa)
626{
627 memcpy(key+strlen(key),cor_lsa->header->orig_router->name,cor_lsa->header->orig_router->length);
628 memcpy(key+strlen(key),"/",1);
629 char ls_type[2];
630 sprintf(ls_type,"%d",cor_lsa->header->ls_type);
631 memcpy(key+strlen(key),ls_type,strlen(ls_type));
632 key[strlen(key)]='\0';
633}
akmhoqueffacaa82012-09-13 17:48:30 -0500634
635
akmhoque53f64222012-09-05 13:57:51 -0500636void
637make_adj_lsa_key(char *key,struct alsa *adj_lsa)
akmhoqued79438d2012-08-27 13:31:42 -0500638{
akmhoque53f64222012-09-05 13:57:51 -0500639 memcpy(key+strlen(key),adj_lsa->header->orig_router->name,adj_lsa->header->orig_router->length);
640 memcpy(key+strlen(key),"/",1);
641 char ls_type[2];
642 sprintf(ls_type,"%d",adj_lsa->header->ls_type);
643 memcpy(key+strlen(key),ls_type,strlen(ls_type));
644 key[strlen(key)]='\0';
645}
646
akmhoque03004e62012-09-06 01:12:28 -0500647int
648build_and_install_adj_lsa(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
649{
akmhoqueffacaa82012-09-13 17:48:30 -0500650 if(flags == CCN_SCHEDULE_CANCEL)
651 {
652 return -1;
653 }
654
655 nlsr_lock();
656
akmhoque7b791452012-10-30 11:24:56 -0500657 if ( nlsr->debugging )
658 printf("build_and_install_adj_lsa called \n");
659 if ( nlsr->detailed_logging )
660 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_and_install_adj_lsa called \n");
661
662 if ( nlsr->debugging )
663 printf("adj_build_flag = %d \n",nlsr->adj_build_flag);
664 if ( nlsr->detailed_logging )
665 writeLogg(__FILE__,__FUNCTION__,__LINE__,"adj_build_flag = %d \n",nlsr->adj_build_flag);
akmhoque03004e62012-09-06 01:12:28 -0500666
667 if(nlsr->adj_build_flag > 0)
668 {
akmhoque7b791452012-10-30 11:24:56 -0500669 if ( nlsr->debugging )
670 printf("is_adj_lsa_build = %d \n",is_adj_lsa_build());
671 if ( nlsr->detailed_logging )
672 writeLogg(__FILE__,__FUNCTION__,__LINE__,"is_adj_lsa_build = %d \n",is_adj_lsa_build());
673
akmhoque03004e62012-09-06 01:12:28 -0500674 if ( is_adj_lsa_build()> 0)
675 {
676 struct alsa *adj_lsa=(struct alsa *)malloc(sizeof( struct alsa ));
677 build_adj_lsa(adj_lsa);
678 install_adj_lsa(adj_lsa);
679
akmhoqueb77b95f2013-02-08 12:28:47 -0600680 char lst[2];
681 memset(lst,0,2);
682 sprintf(lst,"%d",LS_TYPE_ADJ);
683
684 char *repo_key=(char *)malloc(strlen(nlsr->slice_prefix)+strlen(adj_lsa->header->orig_time)+strlen(adj_lsa->header->orig_router->name) + strlen(lst) + 5+15);
685 memset(repo_key, 0, strlen(nlsr->slice_prefix)+strlen(adj_lsa->header->orig_time)+strlen(adj_lsa->header->orig_router->name) + strlen(lst) + 5+15);
686 make_adj_lsa_prefix_for_repo(repo_key, adj_lsa->header->orig_router->name,LS_TYPE_ADJ,adj_lsa->header->orig_time,nlsr->slice_prefix);
687
688 if ( nlsr->debugging )
689 printf("Adj LSA Repo Key: %s \n",repo_key);
690
691 char *key=(char *)malloc(adj_lsa->header->orig_router->length+2+2);
692 memset(key,0,adj_lsa->header->orig_router->length+2+2);
693 make_adj_lsa_key(key,adj_lsa);
694 if ( nlsr->debugging )
695 printf("Adj LSA: %s \n",key);
696
697 struct name_prefix *lsaid=(struct name_prefix *)malloc(sizeof(struct name_prefix));
698 lsaid->name=(char *)malloc(strlen(key)+1);
699 memset(lsaid->name, 0, strlen(key)+1);
700 memcpy(lsaid->name,key,strlen(key));
701 lsaid->length=strlen(key)+1;
702
703
704 write_adj_lsa_to_repo(repo_key, lsaid);
705
706 free(key);
707 free(repo_key);
708 free(lsaid->name);
709 free(lsaid);
710
711
712
akmhoque03004e62012-09-06 01:12:28 -0500713 free(adj_lsa->header->orig_router->name);
714 free(adj_lsa->header->orig_router);
715 free(adj_lsa->header->orig_time);
716 free(adj_lsa->header);
717 free(adj_lsa->body);
718 free(adj_lsa);
719 nlsr->adj_build_flag=0;
720 print_adj_lsdb();
721 }
722 else
723 {
akmhoque7b791452012-10-30 11:24:56 -0500724 if ( nlsr->debugging )
725 printf("Can not build adj LSA now\n");
726 if ( nlsr->detailed_logging )
727 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Can not build adj LSA now\n");
akmhoque03004e62012-09-06 01:12:28 -0500728 }
729 }
730 nlsr->is_build_adj_lsa_sheduled=0;
akmhoqueffacaa82012-09-13 17:48:30 -0500731
732 nlsr_unlock();
733
akmhoque03004e62012-09-06 01:12:28 -0500734 return 0;
735}
736
737
738void
739build_adj_lsa(struct alsa * adj_lsa)
740{
akmhoque7b791452012-10-30 11:24:56 -0500741 if ( nlsr->debugging )
742 printf("build_adj_lsa called \n");
743 if ( nlsr->detailed_logging )
744 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_adj_lsa called \n");
akmhoque03004e62012-09-06 01:12:28 -0500745
746 int no_link=no_active_nbr();
akmhoque7b791452012-10-30 11:24:56 -0500747
akmhoque03004e62012-09-06 01:12:28 -0500748 adj_lsa->header=(struct alsa_header *)malloc(sizeof(struct alsa_header ));
749 adj_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
750 adj_lsa->header->orig_router->name=(char *)malloc(strlen(nlsr->router_name)+1);
751 memset(adj_lsa->header->orig_router->name,0,strlen(nlsr->router_name)+1);
752 memcpy(adj_lsa->header->orig_router->name,nlsr->router_name,strlen(nlsr->router_name)+1);
753 adj_lsa->header->orig_router->length=strlen(nlsr->router_name)+1;
754
755 adj_lsa->header->ls_type=(unsigned)LS_TYPE_ADJ;
756
757 char *time_stamp=(char *)malloc(20);
758 memset(time_stamp,0,20);
759 get_current_timestamp_micro(time_stamp);
760
761 adj_lsa->header->orig_time=(char *)malloc(strlen(time_stamp)+1);
762 memset(adj_lsa->header->orig_time,0,strlen(time_stamp)+1);
763 memcpy(adj_lsa->header->orig_time,time_stamp,strlen(time_stamp)+1);
764 free(time_stamp);
765
akmhoque03004e62012-09-06 01:12:28 -0500766 adj_lsa->no_link=no_link;
akmhoque03004e62012-09-06 01:12:28 -0500767
768
769 struct ccn_charbuf *c=ccn_charbuf_create();
770 get_active_nbr_adj_data(c);
771 char *data=ccn_charbuf_as_string(c);
772
773 adj_lsa->body=(char *)malloc(strlen(data)+1);
774 memset(adj_lsa->body,0,strlen(data)+1);
775 memcpy(adj_lsa->body,(char *)data,strlen(data)+1);
776 ccn_charbuf_destroy(&c);
777
akmhoque03004e62012-09-06 01:12:28 -0500778 nlsr->adj_build_count++;
779
780
781}
782
783
akmhoque53f64222012-09-05 13:57:51 -0500784void
785install_adj_lsa(struct alsa * adj_lsa)
786{
akmhoqued79438d2012-08-27 13:31:42 -0500787
akmhoque7b791452012-10-30 11:24:56 -0500788 if ( nlsr->debugging )
789 printf("install_adj_lsa called \n");
790 if ( nlsr->detailed_logging )
791 writeLogg(__FILE__,__FUNCTION__,__LINE__,"install_adj_lsa called \n");
792
akmhoque03004e62012-09-06 01:12:28 -0500793
akmhoqueffacaa82012-09-13 17:48:30 -0500794 char *time_stamp=(char *)malloc(20);
795 memset(time_stamp,0,20);
796 get_current_timestamp_micro(time_stamp);
akmhoque53f64222012-09-05 13:57:51 -0500797
akmhoqueffacaa82012-09-13 17:48:30 -0500798
799 char *key=(char *)malloc(adj_lsa->header->orig_router->length+2+2);
800 memset(key,0,adj_lsa->header->orig_router->length+2);
801 make_adj_lsa_key(key,adj_lsa);
akmhoqueffacaa82012-09-13 17:48:30 -0500802
803 struct alsa *new_adj_lsa=(struct alsa*)malloc(sizeof(struct alsa ));
804
805 struct hashtb_enumerator ee;
806 struct hashtb_enumerator *e = &ee;
807 int res;
808
809 hashtb_start(nlsr->lsdb->adj_lsdb, e);
810 res = hashtb_seek(e, key, strlen(key), 0);
akmhoque53f64222012-09-05 13:57:51 -0500811
akmhoque03004e62012-09-06 01:12:28 -0500812
akmhoque53f64222012-09-05 13:57:51 -0500813
akmhoque62c0c192012-09-24 07:49:25 -0500814 if(res == HT_NEW_ENTRY)
akmhoque53f64222012-09-05 13:57:51 -0500815 {
akmhoque62c0c192012-09-24 07:49:25 -0500816 if ( adj_lsa->no_link > 0)
817 {
akmhoque3171d652012-11-13 11:44:33 -0600818 if ( nlsr->debugging )
819 printf("New ADJ LSA... Adding to LSDB\n");
820 if ( nlsr->detailed_logging )
821 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New ADJ LSA... Adding to LSDB\n");
akmhoque62c0c192012-09-24 07:49:25 -0500822 new_adj_lsa = e->data;
akmhoque53f64222012-09-05 13:57:51 -0500823
akmhoque62c0c192012-09-24 07:49:25 -0500824 new_adj_lsa->header=(struct alsa_header *)malloc(sizeof(struct alsa_header ));
825 new_adj_lsa->header->ls_type=adj_lsa->header->ls_type;
826 new_adj_lsa->header->orig_time=(char *)malloc(strlen(adj_lsa->header->orig_time)+1);
827 memcpy(new_adj_lsa->header->orig_time,adj_lsa->header->orig_time,strlen(adj_lsa->header->orig_time)+1);
akmhoqueffacaa82012-09-13 17:48:30 -0500828
akmhoque62c0c192012-09-24 07:49:25 -0500829 new_adj_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
830 new_adj_lsa->header->orig_router->name=(char *)malloc(adj_lsa->header->orig_router->length);
831 memcpy(new_adj_lsa->header->orig_router->name,adj_lsa->header->orig_router->name,adj_lsa->header->orig_router->length);
832 new_adj_lsa->header->orig_router->length=adj_lsa->header->orig_router->length;
akmhoque53f64222012-09-05 13:57:51 -0500833
akmhoque62c0c192012-09-24 07:49:25 -0500834 new_adj_lsa->no_link=adj_lsa->no_link;
akmhoqueffacaa82012-09-13 17:48:30 -0500835
akmhoque62c0c192012-09-24 07:49:25 -0500836 new_adj_lsa->body=(char *)malloc(strlen(adj_lsa->body)+1);
837 memset(new_adj_lsa->body,0,strlen(adj_lsa->body)+1);
838 memcpy(new_adj_lsa->body,adj_lsa->body,strlen(adj_lsa->body)+1);
839
840 add_next_hop_router(new_adj_lsa->header->orig_router->name);
841 add_next_hop_from_lsa_adj_body(new_adj_lsa->body,new_adj_lsa->no_link);
akmhoque9e9fc722012-09-26 14:03:25 -0500842
843 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
844 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding adj lsa\n");
845 write_log_for_adj_lsa(new_adj_lsa);
846 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
akmhoque62c0c192012-09-24 07:49:25 -0500847 }
848 else
849 {
850 hashtb_delete(e);
851 }
akmhoque53f64222012-09-05 13:57:51 -0500852
akmhoque7b791452012-10-30 11:24:56 -0500853 if ( nlsr->debugging )
854 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
855 if ( nlsr->detailed_logging )
856 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
857
akmhoque53f64222012-09-05 13:57:51 -0500858 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -0500859
860 if ( nlsr->debugging )
861 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
862 if ( nlsr->detailed_logging )
863 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
864
akmhoqueffacaa82012-09-13 17:48:30 -0500865 }
866 else if(res == HT_OLD_ENTRY)
867 {
868 new_adj_lsa = e->data;
869 if(strcmp(adj_lsa->header->orig_time,new_adj_lsa->header->orig_time)<=0)
870 {
akmhoque7b791452012-10-30 11:24:56 -0500871 if ( nlsr->debugging )
872 printf("Older/Duplicate Adj LSA. Discarded...\n");
873 if ( nlsr->detailed_logging )
874 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Older/Duplicate Adj LSA. Discarded...\n");
akmhoqueffacaa82012-09-13 17:48:30 -0500875 }
876 else
877 {
akmhoqueffacaa82012-09-13 17:48:30 -0500878
akmhoque62c0c192012-09-24 07:49:25 -0500879 if ( adj_lsa->no_link > 0)
880 {
akmhoque9e9fc722012-09-26 14:03:25 -0500881 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
882 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting adj lsa\n");
883 write_log_for_adj_lsa(new_adj_lsa);
884 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
akmhoqueffacaa82012-09-13 17:48:30 -0500885
akmhoque62c0c192012-09-24 07:49:25 -0500886 free(new_adj_lsa->header->orig_time);
887 new_adj_lsa->header->orig_time=(char *)malloc(strlen(adj_lsa->header->orig_time)+1);
888 memcpy(new_adj_lsa->header->orig_time,adj_lsa->header->orig_time,strlen(adj_lsa->header->orig_time)+1);
889
890 new_adj_lsa->no_link=adj_lsa->no_link;
akmhoqueffacaa82012-09-13 17:48:30 -0500891
akmhoque62c0c192012-09-24 07:49:25 -0500892 new_adj_lsa->body=(char *)malloc(strlen(adj_lsa->body)+1);
893 memset(new_adj_lsa->body,0,strlen(adj_lsa->body)+1);
894 memcpy(new_adj_lsa->body,adj_lsa->body,strlen(adj_lsa->body)+1);
akmhoqueffacaa82012-09-13 17:48:30 -0500895
akmhoque62c0c192012-09-24 07:49:25 -0500896 add_next_hop_from_lsa_adj_body(new_adj_lsa->body,new_adj_lsa->no_link);
akmhoque9e9fc722012-09-26 14:03:25 -0500897
898 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
899 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding adj lsa\n");
900 write_log_for_adj_lsa(new_adj_lsa);
901 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
akmhoque62c0c192012-09-24 07:49:25 -0500902 }
903 else
904 {
akmhoque9e9fc722012-09-26 14:03:25 -0500905 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
906 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting adj lsa\n");
907 write_log_for_adj_lsa(new_adj_lsa);
908 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
909
akmhoque62c0c192012-09-24 07:49:25 -0500910 hashtb_delete(e);
911 }
akmhoque7b791452012-10-30 11:24:56 -0500912
913 if ( nlsr->debugging )
914 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
915 if ( nlsr->detailed_logging )
916 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
917
akmhoqueffacaa82012-09-13 17:48:30 -0500918 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -0500919
920 if ( nlsr->debugging )
921 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
922 if ( nlsr->detailed_logging )
923 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
akmhoqueffacaa82012-09-13 17:48:30 -0500924 }
925
926 }
927 hashtb_end(e);
928
929 if ( !nlsr->is_route_calculation_scheduled )
930 {
931 nlsr->event_calculate_route = ccn_schedule_event(nlsr->sched, 1000000, &route_calculate, NULL, 0);
932 nlsr->is_route_calculation_scheduled=1;
akmhoque53f64222012-09-05 13:57:51 -0500933 }
934
akmhoque03004e62012-09-06 01:12:28 -0500935
akmhoqueffacaa82012-09-13 17:48:30 -0500936 free(key);
937
938 free(time_stamp);
akmhoque53f64222012-09-05 13:57:51 -0500939}
940
941void
akmhoque9e9fc722012-09-26 14:03:25 -0500942write_log_for_adj_lsa_body(const char *body, int no_link)
943{
944 int i=0;
945 char *lsa_data=(char *)malloc(strlen(body)+1);
946 memset( lsa_data,0,strlen(body)+1);
947 memcpy(lsa_data,body,strlen(body)+1);
948 char *sep="|";
949 char *rem;
950 char *rtr_id;
951 char *length;
952 char *face;
953 char *metric;
954
955 if(no_link >0 )
956 {
957 rtr_id=strtok_r(lsa_data,sep,&rem);
958 length=strtok_r(NULL,sep,&rem);
959 face=strtok_r(NULL,sep,&rem);
960 metric=strtok_r(NULL,sep,&rem);
961
962 writeLogg(__FILE__,__FUNCTION__,__LINE__," Link %d \n",i+1);
akmhoque34b99f92012-09-27 12:24:27 -0500963 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adjacent Router: %s \n",rtr_id);
964 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adjacent Router Length: %s \n",length);
965 writeLogg(__FILE__,__FUNCTION__,__LINE__," Connecting Face: %s \n",face);
966 writeLogg(__FILE__,__FUNCTION__,__LINE__," Metric: %s \n",metric);
akmhoque9e9fc722012-09-26 14:03:25 -0500967
968
969 for(i=1;i<no_link;i++)
970 {
971 rtr_id=strtok_r(NULL,sep,&rem);
972 length=strtok_r(NULL,sep,&rem);
973 face=strtok_r(NULL,sep,&rem);
974 metric=strtok_r(NULL,sep,&rem);
975 writeLogg(__FILE__,__FUNCTION__,__LINE__," Link %d \n",i+1);
akmhoque34b99f92012-09-27 12:24:27 -0500976 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adjacent Router: %s \n",rtr_id);
977 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adjacent Router Length: %s \n",length);
978 writeLogg(__FILE__,__FUNCTION__,__LINE__," Connecting Face: %s \n",face);
979 writeLogg(__FILE__,__FUNCTION__,__LINE__," Metric: %s \n",metric);
akmhoque9e9fc722012-09-26 14:03:25 -0500980
981 }
982 }
983
984 free(lsa_data);
985}
986
987
988void
989write_log_for_adj_lsa(struct alsa * adj_lsa)
990{
991 writeLogg(__FILE__,__FUNCTION__,__LINE__,"-----------Adj LSA Content---------------\n");
akmhoque34b99f92012-09-27 12:24:27 -0500992 writeLogg(__FILE__,__FUNCTION__,__LINE__," Origination Router: %s\n",adj_lsa->header->orig_router->name);
993 writeLogg(__FILE__,__FUNCTION__,__LINE__," Origination Router Length: %d\n",adj_lsa->header->orig_router->length);
994 writeLogg(__FILE__,__FUNCTION__,__LINE__," LS Type: %d\n",adj_lsa->header->ls_type);
995 writeLogg(__FILE__,__FUNCTION__,__LINE__," Origination Time: %s\n",adj_lsa->header->orig_time);
akmhoque9e9fc722012-09-26 14:03:25 -0500996 writeLogg(__FILE__,__FUNCTION__,__LINE__," Lsa Data:\n");
akmhoque34b99f92012-09-27 12:24:27 -0500997 writeLogg(__FILE__,__FUNCTION__,__LINE__," No of Link: %d\n",adj_lsa->no_link);
akmhoque9e9fc722012-09-26 14:03:25 -0500998
999 write_log_for_adj_lsa_body(adj_lsa->body,adj_lsa->no_link);
1000
1001 writeLogg(__FILE__,__FUNCTION__,__LINE__,"\n");
1002
1003}
1004
1005void
akmhoque53f64222012-09-05 13:57:51 -05001006print_adj_lsa_body(const char *body, int no_link)
1007{
1008 int i=0;
1009 char *lsa_data=(char *)malloc(strlen(body)+1);
1010 memset( lsa_data,0,strlen(body)+1);
1011 memcpy(lsa_data,body,strlen(body)+1);
1012 char *sep="|";
1013 char *rem;
1014 char *rtr_id;
1015 char *length;
1016 char *face;
1017 char *metric;
1018
akmhoque53f64222012-09-05 13:57:51 -05001019 if(no_link >0 )
1020 {
1021 rtr_id=strtok_r(lsa_data,sep,&rem);
1022 length=strtok_r(NULL,sep,&rem);
1023 face=strtok_r(NULL,sep,&rem);
1024 metric=strtok_r(NULL,sep,&rem);
1025
akmhoqueb77b95f2013-02-08 12:28:47 -06001026 if ( nlsr->debugging ) {
1027 printf(" Link %d \n",i+1);
1028 printf(" Neighbor : %s \n",rtr_id);
1029 printf(" Neighbor Length : %s \n",length);
1030 printf(" Connecting Face : %s \n",face);
1031 printf(" Metric : %s \n",metric);
1032 }
akmhoque53f64222012-09-05 13:57:51 -05001033
1034 for(i=1;i<no_link;i++)
1035 {
1036 rtr_id=strtok_r(NULL,sep,&rem);
1037 length=strtok_r(NULL,sep,&rem);
1038 face=strtok_r(NULL,sep,&rem);
1039 metric=strtok_r(NULL,sep,&rem);
1040 printf(" Link %d \n",i+1);
1041 printf(" Neighbor : %s \n",rtr_id);
1042 printf(" Neighbor Length : %s \n",length);
1043 printf(" Connecting Face : %s \n",face);
1044 printf(" Metric : %s \n",metric);
1045
1046 }
1047 }
1048
1049 free(lsa_data);
1050}
1051
1052void
1053print_adj_lsa(struct alsa * adj_lsa)
1054{
akmhoque7b791452012-10-30 11:24:56 -05001055 if ( nlsr->debugging )
1056 {
1057 printf("-----------ADJ LSA Content---------------\n");
1058 printf(" Origination Router : %s\n",adj_lsa->header->orig_router->name);
1059 printf(" Origination Router Length: %d\n",adj_lsa->header->orig_router->length);
1060 printf(" LS Type : %d\n",adj_lsa->header->ls_type);
1061 printf(" Origination Time : %s\n",adj_lsa->header->orig_time);
1062 printf(" Lsa Data:\n");
1063 printf(" No of Link : %d\n",adj_lsa->no_link);
akmhoque53f64222012-09-05 13:57:51 -05001064
akmhoque7b791452012-10-30 11:24:56 -05001065 print_adj_lsa_body(adj_lsa->body,adj_lsa->no_link);
1066 printf("\n");
1067 }
akmhoque53f64222012-09-05 13:57:51 -05001068
1069}
1070
1071void
1072print_adj_lsdb(void)
1073{
akmhoque7b791452012-10-30 11:24:56 -05001074 if ( nlsr->debugging )
1075 printf("print_name_lsdb called \n");
akmhoque53f64222012-09-05 13:57:51 -05001076 int i, adj_lsdb_element;
1077 struct alsa *adj_lsa;
1078
1079 struct hashtb_enumerator ee;
1080 struct hashtb_enumerator *e = &ee;
1081
1082 hashtb_start(nlsr->lsdb->adj_lsdb, e);
1083 adj_lsdb_element=hashtb_n(nlsr->lsdb->adj_lsdb);
1084
1085 for(i=0;i<adj_lsdb_element;i++)
1086 {
akmhoque7b791452012-10-30 11:24:56 -05001087 if ( nlsr->debugging )
1088 printf("-----------Adj LSA (%d)---------------\n",i+1);
akmhoque53f64222012-09-05 13:57:51 -05001089 adj_lsa=e->data;
1090 print_adj_lsa(adj_lsa);
1091 hashtb_next(e);
1092 }
1093
1094 hashtb_end(e);
1095
akmhoque3171d652012-11-13 11:44:33 -06001096 if ( nlsr->debugging )
1097 printf("\n");
1098 if ( nlsr->detailed_logging )
1099 writeLogg(__FILE__,__FUNCTION__,__LINE__,"\n");
akmhoque53f64222012-09-05 13:57:51 -05001100}
1101
1102void
akmhoque03004e62012-09-06 01:12:28 -05001103build_and_install_others_adj_lsa(char *orig_router,int ls_type,char *orig_time, int no_link,char *data)
akmhoque53f64222012-09-05 13:57:51 -05001104{
akmhoque7b791452012-10-30 11:24:56 -05001105 if ( nlsr->debugging )
1106 printf("build_and_install_others_adj_lsa called \n");
1107 if ( nlsr->detailed_logging )
1108 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_and_install_others_adj_lsa called \n");
akmhoque03004e62012-09-06 01:12:28 -05001109 struct alsa *adj_lsa=(struct alsa *)malloc(sizeof( struct alsa ));
1110 build_others_adj_lsa(adj_lsa,orig_router,ls_type,orig_time,no_link,data);
akmhoque03004e62012-09-06 01:12:28 -05001111 install_adj_lsa(adj_lsa);
1112
akmhoque53f64222012-09-05 13:57:51 -05001113
akmhoque03004e62012-09-06 01:12:28 -05001114 free(adj_lsa->header->orig_router->name);
1115 free(adj_lsa->header->orig_router);
1116 free(adj_lsa->header->orig_time);
1117 free(adj_lsa->header);
1118 free(adj_lsa->body);
1119 free(adj_lsa);
akmhoque53f64222012-09-05 13:57:51 -05001120
akmhoque03004e62012-09-06 01:12:28 -05001121 print_adj_lsdb();
akmhoque53f64222012-09-05 13:57:51 -05001122
akmhoque53f64222012-09-05 13:57:51 -05001123}
1124
akmhoque03004e62012-09-06 01:12:28 -05001125
akmhoque53f64222012-09-05 13:57:51 -05001126void
akmhoque03004e62012-09-06 01:12:28 -05001127build_others_adj_lsa(struct alsa *adj_lsa,char *orig_router,int ls_type,char *orig_time,int no_link,char *data)
akmhoque53f64222012-09-05 13:57:51 -05001128{
akmhoque7b791452012-10-30 11:24:56 -05001129 if ( nlsr->debugging )
1130 printf("build_others_adj_lsa called \n");
1131 if ( nlsr->detailed_logging )
1132 writeLogg(__FILE__,__FUNCTION__,__LINE__,"build_others_adj_lsa called \n");
akmhoque53f64222012-09-05 13:57:51 -05001133
akmhoque03004e62012-09-06 01:12:28 -05001134 /*Filling Up Header Data */
1135 adj_lsa->header=(struct alsa_header *)malloc(sizeof(struct alsa_header ));
1136 adj_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
1137 adj_lsa->header->orig_router->name=(char *)malloc(strlen(orig_router)+1);
1138 memset(adj_lsa->header->orig_router->name,0,strlen(orig_router)+1);
1139 memcpy(adj_lsa->header->orig_router->name,orig_router,strlen(orig_router)+1);
akmhoque53f64222012-09-05 13:57:51 -05001140
akmhoque03004e62012-09-06 01:12:28 -05001141 adj_lsa->header->orig_router->length=strlen(orig_router)+1;
akmhoque53f64222012-09-05 13:57:51 -05001142
akmhoque53f64222012-09-05 13:57:51 -05001143
akmhoque03004e62012-09-06 01:12:28 -05001144 adj_lsa->header->ls_type=(unsigned)LS_TYPE_ADJ;
akmhoque53f64222012-09-05 13:57:51 -05001145
akmhoque03004e62012-09-06 01:12:28 -05001146 adj_lsa->header->orig_time=(char *)malloc(strlen(orig_time)+1);
1147 memset(adj_lsa->header->orig_time,0,strlen(orig_time)+1);
1148 memcpy(adj_lsa->header->orig_time,orig_time,strlen(orig_time)+1);
akmhoque53f64222012-09-05 13:57:51 -05001149
akmhoque03004e62012-09-06 01:12:28 -05001150 adj_lsa->no_link=no_link;
akmhoque53f64222012-09-05 13:57:51 -05001151
akmhoque03004e62012-09-06 01:12:28 -05001152 adj_lsa->body=(char *)malloc(strlen(data)+1);
1153 memset(adj_lsa->body,0,strlen(data)+1);
1154 memcpy(adj_lsa->body,(char *)data,strlen(data)+1);
akmhoque53f64222012-09-05 13:57:51 -05001155
akmhoque53f64222012-09-05 13:57:51 -05001156}
1157
akmhoque03004e62012-09-06 01:12:28 -05001158
akmhoque53f64222012-09-05 13:57:51 -05001159long int
1160get_name_lsdb_num_element(void)
1161{
1162 long int num_element;
1163
1164
1165 struct hashtb_enumerator ee;
1166 struct hashtb_enumerator *e = &ee;
1167
1168 hashtb_start(nlsr->lsdb->name_lsdb, e);
1169 num_element=hashtb_n(nlsr->lsdb->name_lsdb);
1170 hashtb_end(e);
1171
1172 return num_element;
1173}
1174
1175long int
1176get_adj_lsdb_num_element(void)
1177{
1178 long int num_element;
1179
1180
1181 struct hashtb_enumerator ee;
1182 struct hashtb_enumerator *e = &ee;
1183
1184 hashtb_start(nlsr->lsdb->adj_lsdb, e);
1185 num_element=hashtb_n(nlsr->lsdb->adj_lsdb);
1186 hashtb_end(e);
1187
1188 return num_element;
akmhoqued79438d2012-08-27 13:31:42 -05001189}
akmhoque03004e62012-09-06 01:12:28 -05001190
akmhoque03004e62012-09-06 01:12:28 -05001191
1192int
1193check_is_new_name_lsa(char *orig_router,char *lst,char *lsid,char *orig_time)
1194{
1195 int ret=0;
1196 struct ccn_charbuf *key=ccn_charbuf_create();
1197 ccn_charbuf_append_string(key,orig_router);
1198 ccn_charbuf_append_string(key,"/");
1199 ccn_charbuf_append_string(key,lst);
1200 ccn_charbuf_append_string(key,"/");
1201 ccn_charbuf_append_string(key,lsid);
1202
1203 int res;
1204 struct nlsa *name_lsa;
1205
1206 struct hashtb_enumerator ee;
1207 struct hashtb_enumerator *e = &ee;
1208
1209 hashtb_start(nlsr->lsdb->name_lsdb, e);
1210 res = hashtb_seek(e, ccn_charbuf_as_string(key), key->length, 0);
1211
1212 if( res == HT_NEW_ENTRY )
1213 {
1214 hashtb_delete(e);
1215 ret=1;
1216
1217 }
1218 else if(res == HT_OLD_ENTRY)
1219 {
1220 name_lsa=e->data;
1221 if( strcmp ( orig_time , name_lsa->header->orig_time ) > 0 )
1222 {
1223 ret=1;
1224 }
1225 }
1226
1227 hashtb_end(e);
1228
1229 ccn_charbuf_destroy(&key);
1230
1231 return ret;
1232}
1233
1234int
1235check_is_new_adj_lsa(char *orig_router,char *lst,char *orig_time)
1236{
1237 int ret=0;
1238 struct ccn_charbuf *key=ccn_charbuf_create();
1239 ccn_charbuf_append_string(key,orig_router);
1240 ccn_charbuf_append_string(key,"/");
1241 ccn_charbuf_append_string(key,lst);
1242
1243 int res;
1244 struct alsa *adj_lsa;
1245
1246 struct hashtb_enumerator ee;
1247 struct hashtb_enumerator *e = &ee;
1248
1249 hashtb_start(nlsr->lsdb->adj_lsdb, e);
1250 res = hashtb_seek(e, ccn_charbuf_as_string(key), key->length, 0);
1251
1252 if( res == HT_NEW_ENTRY )
1253 {
1254 hashtb_delete(e);
1255 ret=1;
1256
1257 }
1258 else if(res == HT_OLD_ENTRY)
1259 {
1260 adj_lsa=e->data;
1261 if( strcmp ( orig_time , adj_lsa->header->orig_time ) > 0 )
1262 {
1263 ret=1;
1264 }
1265 }
1266
1267 hashtb_end(e);
1268
1269 ccn_charbuf_destroy(&key);
1270
1271 return ret;
1272}
1273
akmhoqueb77b95f2013-02-08 12:28:47 -06001274int
1275check_is_new_cor_lsa(char *orig_router,char *lst,char *orig_time)
1276{
1277 int ret=0;
1278 struct ccn_charbuf *key=ccn_charbuf_create();
1279 ccn_charbuf_append_string(key,orig_router);
1280 ccn_charbuf_append_string(key,"/");
1281 ccn_charbuf_append_string(key,lst);
1282
1283 int res;
1284 struct clsa *cor_lsa;
1285
1286 struct hashtb_enumerator ee;
1287 struct hashtb_enumerator *e = &ee;
1288
1289 hashtb_start(nlsr->lsdb->cor_lsdb, e);
1290 res = hashtb_seek(e, ccn_charbuf_as_string(key), key->length, 0);
1291
1292 if( res == HT_NEW_ENTRY )
1293 {
1294 hashtb_delete(e);
1295 ret=1;
1296
1297 }
1298 else if(res == HT_OLD_ENTRY)
1299 {
1300 cor_lsa=e->data;
1301 if( strcmp ( orig_time , cor_lsa->header->orig_time ) > 0 )
1302 {
1303 ret=1;
1304 }
1305 }
1306
1307 hashtb_end(e);
1308
1309 ccn_charbuf_destroy(&key);
1310
1311 return ret;
1312}
1313
akmhoque03004e62012-09-06 01:12:28 -05001314void
1315get_name_lsa_data(struct ccn_charbuf *lsa_data, struct name_prefix *lsaId)
1316{
akmhoque7b791452012-10-30 11:24:56 -05001317 if ( nlsr->debugging )
1318 printf("get_name_lsa_data called \n");
1319 if ( nlsr->detailed_logging )
1320 writeLogg(__FILE__,__FUNCTION__,__LINE__,"get_name_lsa_data called \n");
akmhoque03004e62012-09-06 01:12:28 -05001321
1322 struct nlsa *name_lsa=(struct nlsa*)malloc(sizeof(struct nlsa ));
1323
1324 struct hashtb_enumerator ee;
1325 struct hashtb_enumerator *e = &ee;
1326 int res;
1327
1328 hashtb_start(nlsr->lsdb->name_lsdb, e);
1329 res = hashtb_seek(e, lsaId->name, lsaId->length-1, 0);
1330
1331 if( res == HT_OLD_ENTRY )
1332 {
1333 name_lsa=e->data;
akmhoqueb77b95f2013-02-08 12:28:47 -06001334
akmhoque7b791452012-10-30 11:24:56 -05001335 if ( nlsr->debugging )
1336 printf("NAME LSA found \n");
1337 if ( nlsr->detailed_logging )
1338 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Name LSA found \n");
akmhoque03004e62012-09-06 01:12:28 -05001339
1340 ccn_charbuf_append_string(lsa_data,name_lsa->header->orig_router->name);
1341 ccn_charbuf_append_string(lsa_data,"|");
1342
1343 char *temp_length=(char *)malloc(20);
1344 memset(temp_length,0,20);
1345 sprintf(temp_length,"%d",name_lsa->header->orig_router->length);
1346 ccn_charbuf_append_string(lsa_data,temp_length);
1347 free(temp_length);
1348 ccn_charbuf_append_string(lsa_data,"|");
1349
1350 char *temp_ltype=(char *)malloc(20);
1351 memset(temp_ltype,0,20);
1352 sprintf(temp_ltype,"%d",name_lsa->header->ls_type);
1353 ccn_charbuf_append_string(lsa_data,temp_ltype);
1354 free(temp_ltype);
1355 ccn_charbuf_append_string(lsa_data,"|");
1356
1357 char *temp_lsid=(char *)malloc(20);
1358 memset(temp_lsid,0,20);
1359 sprintf(temp_lsid,"%ld",name_lsa->header->ls_id);
1360 ccn_charbuf_append_string(lsa_data,temp_lsid);
1361 free(temp_lsid);
1362 ccn_charbuf_append_string(lsa_data,"|");
1363
1364 ccn_charbuf_append_string(lsa_data,name_lsa->header->orig_time);
1365 ccn_charbuf_append_string(lsa_data,"|");
1366
1367 char *temp_valid=(char *)malloc(20);
1368 memset(temp_valid,0,20);
1369 sprintf(temp_valid,"%d",name_lsa->header->isValid);
1370 ccn_charbuf_append_string(lsa_data,temp_valid);
1371 free(temp_valid);
1372 ccn_charbuf_append_string(lsa_data,"|");
1373
1374 ccn_charbuf_append_string(lsa_data,name_lsa->name_prefix->name);
1375 ccn_charbuf_append_string(lsa_data,"|");
1376
1377 char *temp_npl=(char *)malloc(20);
1378 memset(temp_npl,0,20);
1379 sprintf(temp_npl,"%d",name_lsa->name_prefix->length);
1380 ccn_charbuf_append_string(lsa_data,temp_npl);
1381 free(temp_npl);
1382 ccn_charbuf_append_string(lsa_data,"|");
1383
1384 }
1385 else if(res == HT_NEW_ENTRY)
1386 {
1387 hashtb_delete(e);
1388 }
1389
1390 hashtb_end(e);
1391}
1392
1393void
1394get_adj_lsa_data(struct ccn_charbuf *lsa_data,struct name_prefix *lsaId)
1395{
akmhoque7b791452012-10-30 11:24:56 -05001396 if ( nlsr->debugging )
1397 printf("get_adj_lsa_data called \n");
1398 if ( nlsr->detailed_logging )
1399 writeLogg(__FILE__,__FUNCTION__,__LINE__,"get_adj_lsa_data called \n");
akmhoque03004e62012-09-06 01:12:28 -05001400
1401 struct alsa *adj_lsa=(struct alsa*)malloc(sizeof(struct alsa ));
1402
1403 struct hashtb_enumerator ee;
1404 struct hashtb_enumerator *e = &ee;
1405 int res;
1406
1407 hashtb_start(nlsr->lsdb->adj_lsdb, e);
1408 res = hashtb_seek(e, lsaId->name, lsaId->length-1, 0);
1409
1410 if( res == HT_OLD_ENTRY )
1411 {
1412 adj_lsa=e->data;
akmhoque7b791452012-10-30 11:24:56 -05001413
1414 if ( nlsr->debugging )
1415 printf("Adj LSA found \n");
1416 if ( nlsr->detailed_logging )
1417 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Adj LSA found \n");
akmhoque03004e62012-09-06 01:12:28 -05001418
1419 ccn_charbuf_append_string(lsa_data,adj_lsa->header->orig_router->name);
1420 ccn_charbuf_append_string(lsa_data,"|");
1421
1422 char *temp_length=(char *)malloc(20);
1423 memset(temp_length,0,20);
1424 sprintf(temp_length,"%d",adj_lsa->header->orig_router->length);
1425 ccn_charbuf_append_string(lsa_data,temp_length);
akmhoque03004e62012-09-06 01:12:28 -05001426 ccn_charbuf_append_string(lsa_data,"|");
akmhoqueb77b95f2013-02-08 12:28:47 -06001427 free(temp_length);
akmhoque03004e62012-09-06 01:12:28 -05001428
1429 char *temp_ltype=(char *)malloc(20);
1430 memset(temp_ltype,0,20);
1431 sprintf(temp_ltype,"%d",adj_lsa->header->ls_type);
1432 ccn_charbuf_append_string(lsa_data,temp_ltype);
akmhoque03004e62012-09-06 01:12:28 -05001433 ccn_charbuf_append_string(lsa_data,"|");
akmhoqueb77b95f2013-02-08 12:28:47 -06001434 free(temp_ltype);
akmhoque03004e62012-09-06 01:12:28 -05001435
1436 ccn_charbuf_append_string(lsa_data,adj_lsa->header->orig_time);
1437 ccn_charbuf_append_string(lsa_data,"|");
1438
1439 char *temp_nl=(char *)malloc(20);
1440 memset(temp_nl,0,20);
1441 sprintf(temp_nl,"%d",adj_lsa->no_link);
1442 ccn_charbuf_append_string(lsa_data,temp_nl);
akmhoque03004e62012-09-06 01:12:28 -05001443 ccn_charbuf_append_string(lsa_data,"|");
akmhoqueb77b95f2013-02-08 12:28:47 -06001444 free(temp_nl);
akmhoque03004e62012-09-06 01:12:28 -05001445
1446 ccn_charbuf_append_string(lsa_data,adj_lsa->body);
1447
1448
1449 }
1450 else if(res == HT_NEW_ENTRY)
1451 {
1452 hashtb_delete(e);
1453 }
1454
1455 hashtb_end(e);
1456}
akmhoqueffacaa82012-09-13 17:48:30 -05001457
akmhoque3171d652012-11-13 11:44:33 -06001458void
1459make_name_lsa_invalid(struct name_prefix *np,int ls_type, long int ls_id)
1460{
1461
1462 if ( nlsr->debugging )
1463 printf("make_name_lsa_invalid called \n");
1464 if ( nlsr->detailed_logging )
1465 writeLogg(__FILE__,__FUNCTION__,__LINE__,"make_name_lsa_invalid called \n");
1466
1467
1468 char lst[2];
1469 memset(lst,0,2);
1470 sprintf(lst,"%d",ls_type);
1471
1472 char lsid[10];
1473 memset(lsid,0,10);
1474 sprintf(lsid,"%ld",ls_id);
1475
1476
1477 char *key=(char *)malloc(strlen(np->name)+1+strlen(lst)+1+strlen(lsid)+1);
1478 memset(key,0,strlen(np->name)+1+strlen(lst)+1+strlen(lsid)+1);
1479
1480
1481 make_name_lsa_key(key, np->name,ls_type,ls_id);
akmhoqueb77b95f2013-02-08 12:28:47 -06001482
1483 if ( nlsr->debugging )
1484 printf("Key:%s Length:%d\n",key,(int)strlen(key));
akmhoque3171d652012-11-13 11:44:33 -06001485
1486 struct nlsa *nlsa;
1487
1488 struct hashtb_enumerator ee;
1489 struct hashtb_enumerator *e = &ee;
1490
1491 int res;
1492
1493 hashtb_start(nlsr->lsdb->name_lsdb, e);
1494 res = hashtb_seek(e, key,strlen(key) , 0);
1495
1496 if( res == HT_OLD_ENTRY )
1497 {
1498 nlsa=e->data;
1499
1500 nlsa->header->isValid=0;
1501
1502 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
1503 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting name lsa\n");
1504 write_log_for_name_lsa(nlsa);
1505 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
1506
1507 hashtb_delete(e);
1508 }
1509 else if( res == HT_NEW_ENTRY )
1510 {
1511 hashtb_delete(e);
1512 }
1513 hashtb_end(e);
1514
1515 if ( nlsr->debugging )
1516 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1517 if ( nlsr->detailed_logging )
1518 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1519
1520 set_new_lsdb_version();
1521
1522 if ( nlsr->debugging )
1523 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1524 if ( nlsr->detailed_logging )
1525 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1526
1527}
1528
akmhoqueda5b6832012-09-13 22:33:55 -05001529int
1530delete_name_lsa(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
1531{
akmhoqueb77b95f2013-02-08 12:28:47 -06001532
akmhoque7b791452012-10-30 11:24:56 -05001533 if ( nlsr->debugging )
1534 printf("delete_name_lsa called \n");
1535 if ( nlsr->detailed_logging )
1536 writeLogg(__FILE__,__FUNCTION__,__LINE__,"delete_name_lsa called \n");
akmhoqueda5b6832012-09-13 22:33:55 -05001537
1538 if(flags == CCN_SCHEDULE_CANCEL)
1539 {
1540 return -1;
1541 }
1542
1543
1544
1545 nlsr_lock();
1546
akmhoque7b791452012-10-30 11:24:56 -05001547 if ( nlsr->debugging )
1548 printf("LSA Key: %s \n",(char *)ev->evdata);
1549 if ( nlsr->detailed_logging )
1550 writeLogg(__FILE__,__FUNCTION__,__LINE__,"LSA Key: %s \n",(char *)ev->evdata);
akmhoqueda5b6832012-09-13 22:33:55 -05001551
1552 struct nlsa *nlsa;
1553
1554 struct hashtb_enumerator ee;
1555 struct hashtb_enumerator *e = &ee;
1556
1557 int res;
1558
1559 hashtb_start(nlsr->lsdb->name_lsdb, e);
1560 res = hashtb_seek(e, (char *)ev->evdata, strlen((char *)ev->evdata), 0);
1561
1562 if( res == HT_OLD_ENTRY )
1563 {
1564 nlsa=e->data;
akmhoque3cced642012-09-24 16:20:20 -05001565 delete_npt_entry_by_router_and_name_prefix(nlsa->header->orig_router->name, nlsa->name_prefix->name);
akmhoque9e9fc722012-09-26 14:03:25 -05001566
1567 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
1568 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting name lsa\n");
1569 write_log_for_name_lsa(nlsa);
1570 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
1571
akmhoqueda5b6832012-09-13 22:33:55 -05001572 hashtb_delete(e);
1573 }
akmhoque3cced642012-09-24 16:20:20 -05001574 else if( res == HT_NEW_ENTRY )
akmhoqueda5b6832012-09-13 22:33:55 -05001575 {
akmhoqueda5b6832012-09-13 22:33:55 -05001576 hashtb_delete(e);
1577 }
1578 hashtb_end(e);
1579
akmhoque7b791452012-10-30 11:24:56 -05001580 if ( nlsr->debugging )
1581 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1582 if ( nlsr->detailed_logging )
1583 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1584
akmhoqueda5b6832012-09-13 22:33:55 -05001585 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -05001586
1587 if ( nlsr->debugging )
1588 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1589 if ( nlsr->detailed_logging )
1590 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
akmhoqueda5b6832012-09-13 22:33:55 -05001591
akmhoqueda5b6832012-09-13 22:33:55 -05001592 nlsr_unlock();
1593
1594 return 0;
1595}
1596
1597int
1598delete_adj_lsa(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
1599{
akmhoque7b791452012-10-30 11:24:56 -05001600 if ( nlsr->debugging )
1601 printf("delete_adj_lsa called \n");
1602 if ( nlsr->detailed_logging )
1603 writeLogg(__FILE__,__FUNCTION__,__LINE__,"delete_adj_lsa called \n");
akmhoqueda5b6832012-09-13 22:33:55 -05001604
1605 if(flags == CCN_SCHEDULE_CANCEL)
1606 {
1607 return -1;
1608 }
1609 nlsr_lock();
1610
akmhoque7b791452012-10-30 11:24:56 -05001611 if ( nlsr->debugging )
1612 printf("LSA Key: %s \n",(char *)ev->evdata);
1613 if ( nlsr->detailed_logging )
1614 writeLogg(__FILE__,__FUNCTION__,__LINE__,"LSA Key: %s \n",(char *)ev->evdata);
akmhoqueda5b6832012-09-13 22:33:55 -05001615
akmhoque9e9fc722012-09-26 14:03:25 -05001616 struct alsa *alsa;
akmhoqueda5b6832012-09-13 22:33:55 -05001617 struct hashtb_enumerator ee;
1618 struct hashtb_enumerator *e = &ee;
1619 int res;
1620
1621 hashtb_start(nlsr->lsdb->adj_lsdb, e);
1622 res = hashtb_seek(e, (char *)ev->evdata, strlen((char *)ev->evdata), 0);
1623
1624 if( res == HT_OLD_ENTRY )
1625 {
akmhoque9e9fc722012-09-26 14:03:25 -05001626 alsa=e->data;
1627 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
1628 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting adj lsa\n");
1629 write_log_for_adj_lsa(alsa);
1630 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
1631
akmhoqueda5b6832012-09-13 22:33:55 -05001632 hashtb_delete(e);
1633 }
1634 else if( res == HT_OLD_ENTRY )
1635 {
1636 hashtb_delete(e);
1637 }
1638 hashtb_end(e);
1639
akmhoque7b791452012-10-30 11:24:56 -05001640 if ( nlsr->debugging )
1641 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1642 if ( nlsr->detailed_logging )
1643 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1644
akmhoqueda5b6832012-09-13 22:33:55 -05001645 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -05001646
1647 if ( nlsr->debugging )
1648 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1649 if ( nlsr->detailed_logging )
1650 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1651
akmhoqueda5b6832012-09-13 22:33:55 -05001652
1653 if ( !nlsr->is_route_calculation_scheduled)
1654 {
1655 nlsr->event_calculate_route = ccn_schedule_event(nlsr->sched, 1000000, &route_calculate, NULL, 0);
1656 nlsr->is_route_calculation_scheduled=1;
1657 }
1658
akmhoqueda5b6832012-09-13 22:33:55 -05001659 nlsr_unlock();
1660
1661 return 0;
1662}
1663
akmhoqueffacaa82012-09-13 17:48:30 -05001664void
1665refresh_name_lsdb(void)
1666{
akmhoque7b791452012-10-30 11:24:56 -05001667 if ( nlsr->debugging )
1668 printf("refresh_name_lsdb called \n");
1669 if ( nlsr->detailed_logging )
1670 writeLogg(__FILE__,__FUNCTION__,__LINE__,"refresh_name_lsdb called \n");
akmhoqueffacaa82012-09-13 17:48:30 -05001671
1672 char *time_stamp=(char *)malloc(20);
1673 memset(time_stamp,0,20);
1674 get_current_timestamp_micro(time_stamp);
1675
1676 long int lsa_life_time;
1677
1678 int i, name_lsdb_element;
1679 struct nlsa *name_lsa;
1680
1681 struct hashtb_enumerator ee;
1682 struct hashtb_enumerator *e = &ee;
1683
1684 hashtb_start(nlsr->lsdb->name_lsdb, e);
1685 name_lsdb_element=hashtb_n(nlsr->lsdb->name_lsdb);
1686
1687 for(i=0;i<name_lsdb_element;i++)
1688 {
1689 name_lsa=e->data;
1690
1691 lsa_life_time=get_time_diff(time_stamp,name_lsa->header->orig_time);
akmhoque7b791452012-10-30 11:24:56 -05001692 if ( nlsr->debugging )
1693 printf("LSA Life Time: %ld \n",lsa_life_time);
1694 if ( nlsr->detailed_logging )
1695 writeLogg(__FILE__,__FUNCTION__,__LINE__,"LSA Life Time: %ld \n",lsa_life_time);
akmhoqueda5b6832012-09-13 22:33:55 -05001696
1697 if ( strcmp(name_lsa->header->orig_router->name,nlsr->router_name) == 0)
1698 {
1699 if ( lsa_life_time > nlsr->lsa_refresh_time )
1700 {
akmhoque14b3f342012-09-14 10:39:02 -05001701 if ( name_lsa->header->isValid == NAME_LSA_VALID )
1702 {
akmhoque7b791452012-10-30 11:24:56 -05001703 if ( nlsr->debugging )
1704 printf("Own Name LSA need to be refrshed\n");
1705 if ( nlsr->detailed_logging )
1706 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Own Name LSA need to be refrshed\n");
akmhoquea98c2142012-10-25 15:22:24 -05001707
1708 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
1709 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting name lsa\n");
1710 write_log_for_name_lsa(name_lsa);
1711 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
1712
1713
akmhoque14b3f342012-09-14 10:39:02 -05001714 char *current_time_stamp=(char *)malloc(20);
1715 memset(current_time_stamp,0,20);
1716 get_current_timestamp_micro(current_time_stamp);
akmhoqueda5b6832012-09-13 22:33:55 -05001717
akmhoque14b3f342012-09-14 10:39:02 -05001718 free(name_lsa->header->orig_time);
1719 name_lsa->header->orig_time=(char *)malloc(strlen(current_time_stamp)+1); //free
1720 memset(name_lsa->header->orig_time,0,strlen(current_time_stamp)+1);
1721 memcpy(name_lsa->header->orig_time,current_time_stamp,strlen(current_time_stamp)+1);
akmhoquea98c2142012-10-25 15:22:24 -05001722
1723 writeLogg(__FILE__,__FUNCTION__,__LINE__," Name-LSA\n");
1724 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding name lsa\n");
1725 write_log_for_name_lsa(name_lsa);
1726 writeLogg(__FILE__,__FUNCTION__,__LINE__," name_lsa_end\n");
akmhoqueda5b6832012-09-13 22:33:55 -05001727
akmhoque14b3f342012-09-14 10:39:02 -05001728 free(current_time_stamp);
1729 }
1730 else
1731 {
1732 char lst[2];
1733 memset(lst,0,2);
1734 sprintf(lst,"%d",name_lsa->header->ls_type);
1735
1736 char lsid[10];
1737 memset(lsid,0,10);
1738 sprintf(lsid,"%ld",name_lsa->header->ls_id);
1739
1740
1741 char *key=(char *)malloc(strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
1742 memset(key,0,strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
1743
1744
1745 make_name_lsa_key(key, name_lsa->header->orig_router->name,name_lsa->header->ls_type,name_lsa->header->ls_id);
akmhoque14b3f342012-09-14 10:39:02 -05001746
1747 nlsr->event = ccn_schedule_event(nlsr->sched, 10, &delete_name_lsa, (void *)key, 0);
1748 }
akmhoqueda5b6832012-09-13 22:33:55 -05001749
akmhoque7b791452012-10-30 11:24:56 -05001750 if ( nlsr->debugging )
1751 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1752 if ( nlsr->detailed_logging )
1753 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1754
akmhoqueda5b6832012-09-13 22:33:55 -05001755 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -05001756
1757 if ( nlsr->debugging )
1758 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1759 if ( nlsr->detailed_logging )
1760 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1761
1762
akmhoqueda5b6832012-09-13 22:33:55 -05001763
1764 print_name_lsdb();
akmhoqueda5b6832012-09-13 22:33:55 -05001765 }
1766 }
1767 else
1768 {
1769 if ( lsa_life_time > nlsr->router_dead_interval )
1770 {
akmhoque7b791452012-10-30 11:24:56 -05001771 if ( nlsr->debugging )
1772 printf("Others Name LSA need to be deleted\n");
1773 if ( nlsr->detailed_logging )
1774 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Others Name LSA need to be deleted\n");
akmhoqueda5b6832012-09-13 22:33:55 -05001775
1776 char lst[2];
1777 memset(lst,0,2);
1778 sprintf(lst,"%d",name_lsa->header->ls_type);
1779
1780 char lsid[10];
1781 memset(lsid,0,10);
1782 sprintf(lsid,"%ld",name_lsa->header->ls_id);
1783
1784
1785 char *key=(char *)malloc(strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
1786 memset(key,0,strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
1787
1788
1789 make_name_lsa_key(key, name_lsa->header->orig_router->name,name_lsa->header->ls_type,name_lsa->header->ls_id);
akmhoqueda5b6832012-09-13 22:33:55 -05001790
1791 nlsr->event = ccn_schedule_event(nlsr->sched, 10, &delete_name_lsa, (void *)key, 0);
akmhoqueda5b6832012-09-13 22:33:55 -05001792 }
1793 }
akmhoqueffacaa82012-09-13 17:48:30 -05001794
1795 hashtb_next(e);
1796 }
1797
1798 hashtb_end(e);
1799
1800 free(time_stamp);
akmhoqueda5b6832012-09-13 22:33:55 -05001801
akmhoqueffacaa82012-09-13 17:48:30 -05001802
1803}
1804
akmhoqueda5b6832012-09-13 22:33:55 -05001805void
akmhoqueffacaa82012-09-13 17:48:30 -05001806refresh_adj_lsdb(void)
1807{
akmhoqueffacaa82012-09-13 17:48:30 -05001808
akmhoque7b791452012-10-30 11:24:56 -05001809 if ( nlsr->debugging )
1810 printf("refresh_adj_lsdb called \n");
1811 if ( nlsr->detailed_logging )
1812 writeLogg(__FILE__,__FUNCTION__,__LINE__,"refresh_adj_lsdb called \n");
akmhoqueda5b6832012-09-13 22:33:55 -05001813
akmhoqueffacaa82012-09-13 17:48:30 -05001814 char *time_stamp=(char *)malloc(20);
1815 memset(time_stamp,0,20);
1816 get_current_timestamp_micro(time_stamp);
1817
1818 long int lsa_life_time;
1819
1820 int i, adj_lsdb_element;
1821 struct alsa *adj_lsa;
1822
1823 struct hashtb_enumerator ee;
1824 struct hashtb_enumerator *e = &ee;
1825
1826 hashtb_start(nlsr->lsdb->adj_lsdb, e);
1827 adj_lsdb_element=hashtb_n(nlsr->lsdb->adj_lsdb);
1828
1829 for(i=0;i<adj_lsdb_element;i++)
1830 {
1831 adj_lsa=e->data;
1832
akmhoqueb77b95f2013-02-08 12:28:47 -06001833 lsa_life_time=get_time_diff(time_stamp,adj_lsa->header->orig_time);
akmhoque7b791452012-10-30 11:24:56 -05001834
1835 if ( nlsr->debugging )
1836 printf("LSA Life Time: %ld \n",lsa_life_time);
1837 if ( nlsr->detailed_logging )
1838 writeLogg(__FILE__,__FUNCTION__,__LINE__,"LSA Life Time: %ld \n",lsa_life_time);
akmhoqueffacaa82012-09-13 17:48:30 -05001839
akmhoqueda5b6832012-09-13 22:33:55 -05001840 if ( strcmp(adj_lsa->header->orig_router->name,nlsr->router_name) == 0)
1841 {
1842 if ( lsa_life_time > nlsr->lsa_refresh_time )
1843 {
akmhoque7b791452012-10-30 11:24:56 -05001844 if ( nlsr->debugging )
1845 printf("Own Adj LSA need to be refrshed\n");
1846 if ( nlsr->detailed_logging )
1847 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Own Adj LSA need to be refrshed\n");
akmhoqueda5b6832012-09-13 22:33:55 -05001848
akmhoquea98c2142012-10-25 15:22:24 -05001849 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
1850 writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting adj lsa\n");
1851 write_log_for_adj_lsa(adj_lsa);
1852 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
1853
akmhoqueda5b6832012-09-13 22:33:55 -05001854 char *current_time_stamp=(char *)malloc(20);
1855 memset(current_time_stamp,0,20);
1856 get_current_timestamp_micro(current_time_stamp);
1857
1858 free(adj_lsa->header->orig_time);
1859 adj_lsa->header->orig_time=(char *)malloc(strlen(current_time_stamp)+1); //free
1860 memset(adj_lsa->header->orig_time,0,strlen(current_time_stamp)+1);
1861 memcpy(adj_lsa->header->orig_time,current_time_stamp,strlen(current_time_stamp)+1);
1862
1863 free(current_time_stamp);
1864
akmhoquea98c2142012-10-25 15:22:24 -05001865 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
1866 writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding adj lsa\n");
1867 write_log_for_adj_lsa(adj_lsa);
1868 writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
akmhoqueda5b6832012-09-13 22:33:55 -05001869
akmhoque7b791452012-10-30 11:24:56 -05001870 if ( nlsr->debugging )
1871 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1872 if ( nlsr->detailed_logging )
1873 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1874
akmhoqueda5b6832012-09-13 22:33:55 -05001875 set_new_lsdb_version();
akmhoque7b791452012-10-30 11:24:56 -05001876
1877 if ( nlsr->debugging )
1878 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1879 if ( nlsr->detailed_logging )
1880 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
akmhoqueda5b6832012-09-13 22:33:55 -05001881
1882 print_adj_lsdb();
1883 }
1884 }
1885 else
1886 {
1887 if ( lsa_life_time > nlsr->router_dead_interval )
1888 {
akmhoque7b791452012-10-30 11:24:56 -05001889
1890 if ( nlsr->debugging )
1891 printf("Others Adj LSA need to be deleted\n");
1892 if ( nlsr->detailed_logging )
1893 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Others Adj LSA need to be deleted\n");
akmhoqueda5b6832012-09-13 22:33:55 -05001894
1895 char *key=(char *)malloc(adj_lsa->header->orig_router->length+2+2);
1896 memset(key,0,adj_lsa->header->orig_router->length+2);
1897 make_adj_lsa_key(key,adj_lsa);
akmhoqueb77b95f2013-02-08 12:28:47 -06001898
akmhoqueda5b6832012-09-13 22:33:55 -05001899 nlsr->event = ccn_schedule_event(nlsr->sched, 10, &delete_adj_lsa, (void *)key, 0);
1900 }
1901 }
1902
1903
1904
akmhoqueffacaa82012-09-13 17:48:30 -05001905 hashtb_next(e);
1906 }
1907
1908 hashtb_end(e);
1909
1910 free(time_stamp);
akmhoqueffacaa82012-09-13 17:48:30 -05001911}
1912
akmhoqueb77b95f2013-02-08 12:28:47 -06001913
1914void
1915refresh_cor_lsdb(void)
1916{
1917
1918 if ( nlsr->debugging )
1919 printf("refresh_cor_lsdb called \n");
1920 if ( nlsr->detailed_logging )
1921 writeLogg(__FILE__,__FUNCTION__,__LINE__,"refresh_cor_lsdb called \n");
1922
1923 char *time_stamp=(char *)malloc(20);
1924 memset(time_stamp,0,20);
1925 get_current_timestamp_micro(time_stamp);
1926
1927 long int lsa_life_time;
1928
1929 int i, cor_lsdb_element;
1930 struct clsa *cor_lsa;
1931
1932 struct hashtb_enumerator ee;
1933 struct hashtb_enumerator *e = &ee;
1934
1935 hashtb_start(nlsr->lsdb->cor_lsdb, e);
1936 cor_lsdb_element=hashtb_n(nlsr->lsdb->cor_lsdb);
1937
1938 for(i=0;i<cor_lsdb_element;i++)
1939 {
1940 cor_lsa=e->data;
1941
1942 lsa_life_time=get_time_diff(time_stamp,cor_lsa->header->orig_time);
1943
1944 if ( nlsr->debugging )
1945 printf("LSA Life Time: %ld \n",lsa_life_time);
1946 if ( nlsr->detailed_logging )
1947 writeLogg(__FILE__,__FUNCTION__,__LINE__,"LSA Life Time: %ld \n",lsa_life_time);
1948
1949 if ( strcmp(cor_lsa->header->orig_router->name,nlsr->router_name) == 0)
1950 {
1951 if ( lsa_life_time > nlsr->lsa_refresh_time )
1952 {
1953 if ( nlsr->debugging )
1954 printf("Own Cor LSA need to be refrshed\n");
1955 if ( nlsr->detailed_logging )
1956 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Own Cor LSA need to be refrshed\n");
1957
1958 //writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
1959 //writeLogg(__FILE__,__FUNCTION__,__LINE__," Deleting adj lsa\n");
1960 //write_log_for_adj_lsa(adj_lsa);
1961 //writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
1962
1963 char *current_time_stamp=(char *)malloc(20);
1964 memset(current_time_stamp,0,20);
1965 get_current_timestamp_micro(current_time_stamp);
1966
1967 free(cor_lsa->header->orig_time);
1968 cor_lsa->header->orig_time=(char *)malloc(strlen(current_time_stamp)+1); //free
1969 memset(cor_lsa->header->orig_time,0,strlen(current_time_stamp)+1);
1970 memcpy(cor_lsa->header->orig_time,current_time_stamp,strlen(current_time_stamp)+1);
1971
1972 free(current_time_stamp);
1973
1974 //writeLogg(__FILE__,__FUNCTION__,__LINE__," Adj-LSA\n");
1975 //writeLogg(__FILE__,__FUNCTION__,__LINE__," Adding adj lsa\n");
1976 //write_log_for_adj_lsa(adj_lsa);
1977 //writeLogg(__FILE__,__FUNCTION__,__LINE__," adj_lsa_end\n");
1978
1979 if ( nlsr->debugging )
1980 printf("Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1981 if ( nlsr->detailed_logging )
1982 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Old Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1983
1984 set_new_lsdb_version();
1985
1986 if ( nlsr->debugging )
1987 printf("New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1988 if ( nlsr->detailed_logging )
1989 writeLogg(__FILE__,__FUNCTION__,__LINE__,"New Version Number of LSDB: %s \n",nlsr->lsdb->lsdb_version);
1990
1991 print_adj_lsdb();
1992 }
1993 }
1994 else
1995 {
1996 if ( lsa_life_time > nlsr->router_dead_interval )
1997 {
1998
1999 if ( nlsr->debugging )
2000 printf("Others Adj LSA need to be deleted\n");
2001 if ( nlsr->detailed_logging )
2002 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Others Adj LSA need to be deleted\n");
2003
2004 hashtb_delete(e);
2005 i++;
2006 }
2007 }
2008
2009
2010
2011 hashtb_next(e);
2012 }
2013
2014 hashtb_end(e);
2015
2016 free(time_stamp);
2017}
2018
akmhoqueffacaa82012-09-13 17:48:30 -05002019int
2020refresh_lsdb(struct ccn_schedule *sched, void *clienth, struct ccn_scheduled_event *ev, int flags)
2021{
2022 if(flags == CCN_SCHEDULE_CANCEL)
2023 {
2024 return -1;
2025 }
2026
2027 nlsr_lock();
akmhoqueda5b6832012-09-13 22:33:55 -05002028
akmhoque7b791452012-10-30 11:24:56 -05002029 if ( nlsr->debugging )
2030 printf("refresh_lsdb called\n");
2031 if ( nlsr->detailed_logging )
2032 writeLogg(__FILE__,__FUNCTION__,__LINE__,"refresh_lsdb called\n");
akmhoqueffacaa82012-09-13 17:48:30 -05002033
2034 refresh_name_lsdb();
2035 refresh_adj_lsdb();
akmhoqueb77b95f2013-02-08 12:28:47 -06002036 refresh_cor_lsdb();
akmhoqueffacaa82012-09-13 17:48:30 -05002037
akmhoqueffacaa82012-09-13 17:48:30 -05002038 nlsr->event = ccn_schedule_event(nlsr->sched, 60000000, &refresh_lsdb, NULL, 0);
akmhoqueda5b6832012-09-13 22:33:55 -05002039
akmhoqueffacaa82012-09-13 17:48:30 -05002040 nlsr_unlock();
2041 return 0;
2042}
akmhoqueb77b95f2013-02-08 12:28:47 -06002043
2044void
2045write_adj_lsa_to_repo(char *repo_content_prefix, struct name_prefix *lsa_id)
2046{
2047 if ( nlsr->debugging )
2048 printf("write_adj_lsa_to_repo called\n");
2049 if ( nlsr->debugging )
2050 printf("Content Prefix: %s\n",repo_content_prefix);
2051
2052 struct ccn_charbuf *lsa_data=ccn_charbuf_create();
2053 get_adj_lsa_data(lsa_data,lsa_id);
2054 if ( nlsr->debugging )
2055 printf("Adj LSA Data: %s \n",ccn_charbuf_as_string(lsa_data));
2056
2057 write_data_to_repo(ccn_charbuf_as_string(lsa_data), repo_content_prefix);
2058
2059 ccn_charbuf_destroy(&lsa_data);
2060}
2061
2062void
2063write_name_lsa_to_repo(char *repo_content_prefix, struct name_prefix *lsa_id)
2064{
2065 if ( nlsr->debugging )
2066 printf("write_name_lsa_to_repo called\n");
2067 if ( nlsr->debugging )
2068 printf("Content Prefix: %s\n",repo_content_prefix);
2069
2070 struct ccn_charbuf *lsa_data=ccn_charbuf_create();
2071 get_name_lsa_data(lsa_data,lsa_id);
2072
2073 if ( nlsr->debugging )
2074 printf("Name LSA Data: %s \n",ccn_charbuf_as_string(lsa_data));
2075
2076 write_data_to_repo(ccn_charbuf_as_string(lsa_data), repo_content_prefix);
2077
2078 ccn_charbuf_destroy(&lsa_data);
2079}
2080
2081
2082void
2083write_name_lsdb_to_repo(char *slice_prefix)
2084{
2085 int i, name_lsdb_element;
2086
2087 struct nlsa *name_lsa;
2088 struct hashtb_enumerator ee;
2089 struct hashtb_enumerator *e = &ee;
2090
2091 hashtb_start(nlsr->lsdb->name_lsdb, e);
2092 name_lsdb_element=hashtb_n(nlsr->lsdb->name_lsdb);
2093
2094 for(i=0;i<name_lsdb_element;i++)
2095 {
2096 name_lsa=e->data;
2097
2098 char lst[2];
2099 memset(lst,0,2);
2100 sprintf(lst,"%d",name_lsa->header->ls_type);
2101
2102 char lsid[10];
2103 memset(lsid,0,10);
2104 sprintf(lsid,"%ld",name_lsa->header->ls_id);
2105
2106
2107 char *key=(char *)malloc(strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
2108 memset(key,0,strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1);
2109
2110
2111 make_name_lsa_key(key, name_lsa->header->orig_router->name,name_lsa->header->ls_type,name_lsa->header->ls_id);
2112
2113 if ( nlsr->debugging )
2114 printf("Name LSA Key: %s \n",key);
2115
2116
2117 char *repo_key=(char *)malloc(strlen(slice_prefix)+1+strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1+strlen(name_lsa->header->orig_time)+1+15);
2118 memset(repo_key,0,strlen(slice_prefix)+1+strlen(name_lsa->header->orig_router->name)+1+strlen(lst)+1+strlen(lsid)+1+strlen(name_lsa->header->orig_time)+1+15);
2119 make_name_lsa_prefix_for_repo(repo_key, name_lsa->header->orig_router->name,name_lsa->header->ls_type,name_lsa->header->ls_id,name_lsa->header->orig_time,slice_prefix);
2120
2121 if ( nlsr->debugging )
2122 printf("Name LSA Repo Key: %s \n",repo_key);
2123
2124 struct name_prefix *lsaid=(struct name_prefix *)malloc(sizeof(struct name_prefix));
2125 lsaid->name=(char *)malloc(strlen(key)+1);
2126 memset(lsaid->name, 0, strlen(key)+1);
2127 memcpy(lsaid->name,key,strlen(key));
2128 lsaid->length=strlen(key)+1;
2129
2130
2131 write_name_lsa_to_repo(repo_key, lsaid);
2132
2133 free(key);
2134 free(repo_key);
2135 free(lsaid->name);
2136 free(lsaid);
2137
2138 hashtb_next(e);
2139 }
2140
2141 hashtb_end(e);
2142
2143
2144}
2145
2146void
2147print_cor_lsa(struct clsa *cor_lsa)
2148{
2149 if ( nlsr->debugging )
2150 {
2151 printf("-----------Cor LSA Content---------------\n");
2152 printf(" Origination Router : %s\n",cor_lsa->header->orig_router->name);
2153 printf(" Origination Router Length: %d\n",cor_lsa->header->orig_router->length);
2154 printf(" LS Type : %d\n",cor_lsa->header->ls_type);
2155 printf(" Origination Time : %s\n",cor_lsa->header->orig_time);
2156 printf(" LSA Data \n");
2157 printf(" Cor R: : %f\n",cor_lsa->cor_r);
2158 printf(" Cor Theta : %f\n",cor_lsa->cor_theta);
2159
2160 printf("\n");
2161 }
2162}
2163
2164void
2165print_cor_lsdb()
2166{
2167
2168 if ( nlsr->debugging )
2169 printf("print_cor_lsdb called \n");
2170
2171 struct hashtb_enumerator ee;
2172 struct hashtb_enumerator *e = &ee;
2173
2174 int i=1;
2175
2176 for (hashtb_start(nlsr->lsdb->cor_lsdb, e); e->key != NULL; hashtb_next(e))
2177 {
2178 if ( nlsr->debugging )
2179 printf("-----------Cor LSA (%d)---------------\n",i);
2180 struct clsa *cor_lsa=e->data;
2181 print_cor_lsa(cor_lsa);
2182 i++;
2183 }
2184 hashtb_end(e);
2185
2186 if ( nlsr->debugging )
2187 printf("\n");
2188 if ( nlsr->detailed_logging )
2189 writeLogg(__FILE__,__FUNCTION__,__LINE__,"\n");
2190}
2191
2192void
2193install_cor_lsa(struct clsa *cor_lsa)
2194{
2195 if ( nlsr->debugging )
2196 printf("install_cor_lsa called \n");
2197 if ( nlsr->detailed_logging )
2198 writeLogg(__FILE__,__FUNCTION__,__LINE__,"install_cor_lsa called \n");
2199
2200
2201 char *time_stamp=(char *)malloc(20);
2202 memset(time_stamp,0,20);
2203 get_current_timestamp_micro(time_stamp);
2204
2205
2206 char *key=(char *)malloc(cor_lsa->header->orig_router->length+2+2);
2207 memset(key,0,cor_lsa->header->orig_router->length+2);
2208 make_cor_lsa_key(key,cor_lsa);
2209
2210 if ( nlsr->debugging )
2211 printf("Cor LSA key: %s \n",key);
2212
2213 struct hashtb_enumerator ee;
2214 struct hashtb_enumerator *e = &ee;
2215 int res;
2216
2217 hashtb_start(nlsr->lsdb->cor_lsdb, e);
2218 res = hashtb_seek(e, key, strlen(key), 0);
2219
2220 if ( res == HT_NEW_ENTRY )
2221 {
2222 if ( nlsr->debugging )
2223 printf("New Cor LSA... \n");
2224
2225 struct clsa *new_cor_lsa=(struct clsa *)malloc(sizeof( struct clsa ));
2226 new_cor_lsa=e->data;
2227 new_cor_lsa->header=(struct alsa_header *)malloc(sizeof(struct alsa_header ));
2228
2229 new_cor_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
2230 new_cor_lsa->header->orig_router->name=(char *)malloc(strlen(cor_lsa->header->orig_router->name)+1);
2231 memset(new_cor_lsa->header->orig_router->name,0,strlen(cor_lsa->header->orig_router->name)+1);
2232 memcpy(new_cor_lsa->header->orig_router->name,cor_lsa->header->orig_router->name,strlen(cor_lsa->header->orig_router->name)+1);
2233 new_cor_lsa->header->orig_router->length=cor_lsa->header->orig_router->length;
2234
2235 new_cor_lsa->header->orig_time=(char *)malloc(strlen(cor_lsa->header->orig_time)+1); //free
2236 memset(new_cor_lsa->header->orig_time,0,strlen(cor_lsa->header->orig_time)+1);
2237 memcpy(new_cor_lsa->header->orig_time,cor_lsa->header->orig_time,strlen(cor_lsa->header->orig_time)+1);
2238
2239 new_cor_lsa->header->ls_type=cor_lsa->header->ls_type;
2240
2241 new_cor_lsa->cor_r=cor_lsa->cor_r;
2242 new_cor_lsa->cor_theta=cor_lsa->cor_theta;
2243 }
2244 else if ( res == HT_OLD_ENTRY )
2245 {
2246 if ( nlsr->debugging )
2247 printf("Cor LSA exists (Old)... \n");
2248 }
2249 hashtb_end(e);
2250
2251 free(key);
2252
2253}
2254
2255void
2256build_cor_lsa(struct clsa *cor_lsa, double cor_r, double cor_theta)
2257{
2258 cor_lsa->header=(struct alsa_header *)malloc(sizeof(struct alsa_header ));
2259 cor_lsa->header->ls_type=LS_TYPE_COR;
2260
2261 char *time_stamp=(char *)malloc(20);
2262 memset(time_stamp,0,20);
2263 get_current_timestamp_micro(time_stamp);
2264
2265 cor_lsa->header->orig_time=(char *)malloc(strlen(time_stamp)+1); //free
2266 memset(cor_lsa->header->orig_time,0,strlen(time_stamp)+1);
2267 memcpy(cor_lsa->header->orig_time,time_stamp,strlen(time_stamp)+1);
2268 free(time_stamp);
2269
2270 cor_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
2271 cor_lsa->header->orig_router->name=(char *)malloc(strlen(nlsr->router_name)+1);
2272 memset(cor_lsa->header->orig_router->name,0,strlen(nlsr->router_name)+1);
2273 memcpy(cor_lsa->header->orig_router->name,nlsr->router_name,strlen(nlsr->router_name)+1);
2274 cor_lsa->header->orig_router->length=strlen(nlsr->router_name)+1;
2275
2276 cor_lsa->cor_r=cor_r;
2277 cor_lsa->cor_theta=cor_theta;
2278
2279}
2280
2281void
2282build_others_cor_lsa(struct clsa *cor_lsa,char *orig_router, int ls_type,char *orig_time, double cor_r, double cor_theta)
2283{
2284 cor_lsa->header=(struct alsa_header *)malloc(sizeof(struct alsa_header ));
2285 cor_lsa->header->ls_type=ls_type;
2286
2287 cor_lsa->header->orig_time=(char *)malloc(strlen(orig_time)+1);
2288 memset(cor_lsa->header->orig_time,0,strlen(orig_time)+1);
2289 memcpy(cor_lsa->header->orig_time,orig_time,strlen(orig_time)+1);
2290
2291 cor_lsa->header->orig_router=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
2292 cor_lsa->header->orig_router->name=(char *)malloc(strlen(orig_router)+1);
2293 memset(cor_lsa->header->orig_router->name,0,strlen(orig_router)+1);
2294 memcpy(cor_lsa->header->orig_router->name,orig_router,strlen(orig_router)+1);
2295 cor_lsa->header->orig_router->length=strlen(orig_router)+1;
2296
2297 cor_lsa->cor_r=cor_r;
2298 cor_lsa->cor_theta=cor_theta;
2299
2300}
2301
2302void
2303build_and_install_others_cor_lsa(char *orig_router,int ls_type,char *orig_time, double cor_r, double cor_theta)
2304{
2305 struct clsa *cor_lsa=(struct clsa *)malloc(sizeof( struct clsa ));
2306 build_others_cor_lsa(cor_lsa,orig_router,ls_type, orig_time, cor_r, cor_theta);
2307 install_cor_lsa(cor_lsa);
2308
2309 print_cor_lsdb();
2310
2311 free(cor_lsa->header->orig_router);
2312 free(cor_lsa->header->orig_time);
2313 free(cor_lsa->header);
2314 free(cor_lsa);
2315
2316}
2317
2318
2319void
2320build_and_install_cor_lsa()
2321{
2322
2323
2324
2325 struct clsa *cor_lsa=(struct clsa *)malloc(sizeof( struct clsa ));
2326
2327 build_cor_lsa(cor_lsa,nlsr->cor_r,nlsr->cor_theta);
2328 install_cor_lsa(cor_lsa);
2329
2330 write_cor_lsa_to_repo(cor_lsa);
2331
2332 print_cor_lsdb();
2333
2334 free(cor_lsa->header->orig_router);
2335 free(cor_lsa->header->orig_time);
2336 free(cor_lsa->header);
2337 free(cor_lsa);
2338
2339}
2340
2341void
2342get_cor_lsa_data(struct ccn_charbuf *lsa_data,char *cor_lsa_key)
2343{
2344 if ( nlsr->debugging )
2345 printf("get_cor_lsa_data called \n");
2346 if ( nlsr->detailed_logging )
2347 writeLogg(__FILE__,__FUNCTION__,__LINE__,"get_adj_lsa_data called \n");
2348
2349 struct clsa *cor_lsa=(struct clsa*)malloc(sizeof(struct clsa ));
2350
2351 struct hashtb_enumerator ee;
2352 struct hashtb_enumerator *e = &ee;
2353 int res;
2354
2355 hashtb_start(nlsr->lsdb->cor_lsdb, e);
2356 res = hashtb_seek(e, cor_lsa_key, strlen(cor_lsa_key), 0);
2357
2358 if( res == HT_OLD_ENTRY )
2359 {
2360 cor_lsa=e->data;
2361
2362 if ( nlsr->debugging )
2363 printf("Cor LSA found \n");
2364 if ( nlsr->detailed_logging )
2365 writeLogg(__FILE__,__FUNCTION__,__LINE__,"Cor LSA found \n");
2366
2367 ccn_charbuf_append_string(lsa_data,cor_lsa->header->orig_router->name);
2368 ccn_charbuf_append_string(lsa_data,"|");
2369
2370 char *temp_length=(char *)malloc(20);
2371 memset(temp_length,0,20);
2372 sprintf(temp_length,"%d",cor_lsa->header->orig_router->length);
2373 ccn_charbuf_append_string(lsa_data,temp_length);
2374 ccn_charbuf_append_string(lsa_data,"|");
2375 free(temp_length);
2376
2377 char *temp_ltype=(char *)malloc(20);
2378 memset(temp_ltype,0,20);
2379 sprintf(temp_ltype,"%d",cor_lsa->header->ls_type);
2380 ccn_charbuf_append_string(lsa_data,temp_ltype);
2381 ccn_charbuf_append_string(lsa_data,"|");
2382 free(temp_ltype);
2383
2384 ccn_charbuf_append_string(lsa_data,cor_lsa->header->orig_time);
2385 ccn_charbuf_append_string(lsa_data,"|");
2386
2387 char *cor_r=(char *)malloc(20);
2388 memset(cor_r,0,20);
2389 sprintf(cor_r,"%f",cor_lsa->cor_r);
2390 ccn_charbuf_append_string(lsa_data,cor_r);
2391 ccn_charbuf_append_string(lsa_data,"|");
2392 free(cor_r);
2393
2394 char *cor_theta=(char *)malloc(20);
2395 memset(cor_theta,0,20);
2396 sprintf(cor_theta,"%f",cor_lsa->cor_theta);
2397 ccn_charbuf_append_string(lsa_data,cor_theta);
2398 ccn_charbuf_append_string(lsa_data,"|");
2399 free(cor_theta);
2400
2401 }
2402 else if(res == HT_NEW_ENTRY)
2403 {
2404 hashtb_delete(e);
2405 }
2406
2407 hashtb_end(e);
2408}
2409
2410void
2411write_cor_lsa_to_repo(struct clsa *cor_lsa)
2412{
2413
2414
2415 if ( nlsr->debugging )
2416 printf("write_cor_lsa_to_repo called\n");
2417
2418
2419 char *key=(char *)malloc(cor_lsa->header->orig_router->length+2+2);
2420 memset(key,0,cor_lsa->header->orig_router->length+2+2);
2421 make_cor_lsa_key(key,cor_lsa);
2422
2423 struct ccn_charbuf *lsa_data=ccn_charbuf_create();
2424 get_cor_lsa_data(lsa_data,key);
2425
2426 if ( nlsr->debugging )
2427 printf("Cor LSA Data: %s \n",ccn_charbuf_as_string(lsa_data));
2428 char *lst=(char *)malloc(20);
2429 memset(lst,0,20);
2430 sprintf(lst,"%d",cor_lsa->header->ls_type);
2431 char *repo_key=(char *)malloc(strlen(nlsr->slice_prefix)+strlen(cor_lsa->header->orig_time)+strlen(cor_lsa->header->orig_router->name) + strlen(lst) + 5+15);
2432 memset(repo_key, 0, strlen(nlsr->slice_prefix)+strlen(cor_lsa->header->orig_time)+strlen(cor_lsa->header->orig_router->name) + strlen(lst) + 5+15);
2433 make_cor_lsa_prefix_for_repo(repo_key, cor_lsa->header->orig_router->name,LS_TYPE_COR,cor_lsa->header->orig_time,nlsr->slice_prefix);
2434
2435 if ( nlsr->debugging )
2436 printf("Cor LSA Repo Key: %s \n",repo_key);
2437
2438 write_data_to_repo(ccn_charbuf_as_string(lsa_data), repo_key);
2439
2440
2441
2442 free(lst);
2443 free(key);
2444 free(repo_key);
2445 ccn_charbuf_destroy(&lsa_data);
2446}
2447
2448void
2449make_cor_lsa_key_by_router_name(char *key,char *router_name)
2450{
2451 memcpy(key+strlen(key),router_name,strlen(router_name));
2452 memcpy(key+strlen(key),"/",1);
2453 char ls_type[2];
2454 sprintf(ls_type,"%d",LS_TYPE_COR);
2455 memcpy(key+strlen(key),ls_type,strlen(ls_type));
2456 key[strlen(key)]='\0';
2457}
2458
2459
2460double
2461get_hyperbolic_r(char *router)
2462{
2463 double ret=-1.0;
2464 char *cor_lsa_key=(char *)calloc(strlen(router)+4,sizeof(char));
2465 make_cor_lsa_key_by_router_name(cor_lsa_key,router);
2466
2467
2468 struct clsa *cor_lsa;
2469 struct hashtb_enumerator ee;
2470 struct hashtb_enumerator *e = &ee;
2471 int res;
2472
2473 hashtb_start(nlsr->lsdb->cor_lsdb, e);
2474 res = hashtb_seek(e, cor_lsa_key, strlen(cor_lsa_key), 0);
2475
2476 if ( res == HT_OLD_ENTRY)
2477 {
2478 cor_lsa=e->data;
2479 ret=cor_lsa->cor_r;
2480 }
2481 else if(res == HT_NEW_ENTRY)
2482 {
2483 hashtb_delete(e);
2484 }
2485
2486 hashtb_end(e);
2487
2488 free(cor_lsa_key);
2489 return ret;
2490}
2491
2492double
2493get_hyperbolic_theta(char *router)
2494{
2495 double ret=-1.0;
2496 char *cor_lsa_key=(char *)calloc(strlen(router)+4,sizeof(char));
2497 make_cor_lsa_key_by_router_name(cor_lsa_key,router);
2498
2499 struct clsa *cor_lsa;
2500 struct hashtb_enumerator ee;
2501 struct hashtb_enumerator *e = &ee;
2502 int res;
2503
2504 hashtb_start(nlsr->lsdb->cor_lsdb, e);
2505 res = hashtb_seek(e, cor_lsa_key, strlen(cor_lsa_key), 0);
2506
2507 if ( res == HT_OLD_ENTRY)
2508 {
2509 cor_lsa=e->data;
2510 ret=cor_lsa->cor_theta;
2511 }
2512 else if(res == HT_NEW_ENTRY)
2513 {
2514 hashtb_delete(e);
2515 }
2516
2517 hashtb_end(e);
2518
2519 free(cor_lsa_key);
2520 return ret;
2521}