NLSR with CCN Sync
diff --git a/nlsr-sync-0.0/macbook.conf b/nlsr-sync-0.0/macbook.conf
index 19b6c30..b22c00a 100755
--- a/nlsr-sync-0.0/macbook.conf
+++ b/nlsr-sync-0.0/macbook.conf
@@ -1,10 +1,10 @@
 #----configuration file for macbook----------
 #
 router-name /ndn/memphis.edu/netlab/macbook/
-ccnneighbor /ndn/memphis.edu/dunhall/castor face9
+ccnneighbor /ndn/memphis.edu/netlab/maia face11
 ccnneighbor /ndn/memphis.edu/pollux face38
-ccnname /ndn/memphis.edu/patterson
-ccnname /ndn/memphis.edu/houston/
+ccnname /ndn/memphis.edu/macbook/patterson
+ccnname /ndn/memphis.edu/macbook/houston/
 #------lsdb-synch-interval-----
 lsdb-synch-interval 350
 interest-retry 2 
@@ -12,6 +12,6 @@
 lsa-refresh-time 600
 router-dead-interval 900
 multi-path-face-num 2 
-#debug on
+debug on
 
 logdir /Users/akmhoque/NLSR2.0
diff --git a/nlsr-sync-0.0/nlsr.c b/nlsr-sync-0.0/nlsr.c
index e3b43ae..cbf34b3 100755
--- a/nlsr-sync-0.0/nlsr.c
+++ b/nlsr-sync-0.0/nlsr.c
@@ -1067,8 +1067,8 @@
 	//write_data_to_repo();
 
 	nlsr->sched = ccn_schedule_create(nlsr, &ndn_rtr_ticker);
-	//nlsr->event_send_info_interest = ccn_schedule_event(nlsr->sched, 1, &send_info_interest, NULL, 0);
-	//nlsr->event = ccn_schedule_event(nlsr->sched, 60000000, &refresh_lsdb, NULL, 0);
+	nlsr->event_send_info_interest = ccn_schedule_event(nlsr->sched, 1, &send_info_interest, NULL, 0);
+	nlsr->event = ccn_schedule_event(nlsr->sched, 60000000, &refresh_lsdb, NULL, 0);
 
 	
 	while(1)
diff --git a/nlsr-sync-0.0/nlsr_lsdb.c b/nlsr-sync-0.0/nlsr_lsdb.c
index d6d24ae..5fc8833 100755
--- a/nlsr-sync-0.0/nlsr_lsdb.c
+++ b/nlsr-sync-0.0/nlsr_lsdb.c
@@ -69,9 +69,6 @@
 make_name_lsa_prefix_for_repo(char *key, char *orig_router, int ls_type, long int ls_id,char *orig_time,char *slice_prefix)
 {
 	
-	
-	//printf("Orig Router: %s LS Type: %d LS Id: %ld\n",orig_router,ls_type,ls_id);
-
 	char lst[2];
 	memset(lst,0,2);
 	sprintf(lst,"%d",ls_type);	
@@ -88,7 +85,22 @@
 	memcpy(key+strlen(key),orig_time,strlen(orig_time));
 	memcpy(key+strlen(key),orig_router,strlen(orig_router));
 	
-	//printf("Key: %s\n",key);
+}
+
+void 
+make_adj_lsa_prefix_for_repo(char *key, char *orig_router, int ls_type, char *orig_time,char *slice_prefix)
+{
+	
+	char lst[2];
+	memset(lst,0,2);
+	sprintf(lst,"%d",ls_type);	
+	memcpy(key+strlen(key),slice_prefix,strlen(slice_prefix));
+	memcpy(key+strlen(key),"/",1);
+	memcpy(key+strlen(key),lst,strlen(lst));
+	memcpy(key+strlen(key),"/",1);
+	memcpy(key+strlen(key),orig_time,strlen(orig_time));
+	memcpy(key+strlen(key),orig_router,strlen(orig_router));
+	
 }
 
 void 
@@ -668,6 +680,32 @@
 			build_adj_lsa(adj_lsa);
 			install_adj_lsa(adj_lsa);
 
+			char lst[2];
+			memset(lst,2,0);
+			sprintf(lst,"%d",LS_TYPE_ADJ);			
+
+			char *repo_con_name=(char *)malloc(strlen(nlsr->slice_prefix)+strlen(adj_lsa->header->orig_time)+strlen(adj_lsa->header->orig_router->name) + strlen(lst) + 5);
+			memset(repo_con_name,strlen(nlsr->slice_prefix)+strlen(adj_lsa->header->orig_time)+strlen(adj_lsa->header->orig_router->name) + strlen(lst) + 5,0);	
+			make_adj_lsa_prefix_for_repo(repo_con_name, adj_lsa->header->orig_router->name,LS_TYPE_ADJ,adj_lsa->header->orig_time,nlsr->slice_prefix);
+
+			printf("Adj LSA Repo Key: %s \n",repo_con_name);
+			
+			char *key=(char *)malloc(adj_lsa->header->orig_router->length+2+2);
+			memset(key,0,adj_lsa->header->orig_router->length+2);
+			make_adj_lsa_key(key,adj_lsa);
+
+			struct name_prefix *lsaid=(struct name_prefix *)malloc(sizeof(struct name_prefix));
+			lsaid->name=(char *)malloc(strlen(key)+1);
+			memset(lsaid->name,strlen(key)+1,0);
+			memcpy(lsaid->name,key,strlen(key));
+			lsaid->length=strlen(key)+1;
+
+		
+			//write_adj_lsa_to_repo(repo_key, lsaid);
+			
+			//free(key);
+			//free(repo_con_name);
+
 			free(adj_lsa->header->orig_router->name);
 			free(adj_lsa->header->orig_router);
 			free(adj_lsa->header->orig_time);
@@ -741,11 +779,11 @@
 
 
 
-	if( !nlsr->is_send_lsdb_interest_scheduled )
+	/*if( !nlsr->is_send_lsdb_interest_scheduled )
 	{	
 		nlsr->event_send_lsdb_interest= ccn_schedule_event(nlsr->sched, 1000, &send_lsdb_interest, NULL, 0);
 		nlsr->is_send_lsdb_interest_scheduled=1;
-	}
+	}*/
 
 	nlsr->adj_build_count++;
 
@@ -2022,6 +2060,21 @@
 }
 
 void
+write_adj_lsa_to_repo(char *repo_content_prefix, struct name_prefix *lsa_id)
+{
+	printf("Content Preifx: %s\n",repo_content_prefix);
+
+	
+	struct ccn_charbuf *lsa_data=ccn_charbuf_create();		
+	get_adj_lsa_data(lsa_data,lsa_id);
+	printf("Name LSA Data: %s \n",ccn_charbuf_as_string(lsa_data));	
+
+	write_data_to_repo(ccn_charbuf_as_string(lsa_data), repo_content_prefix);
+
+	ccn_charbuf_destroy(&lsa_data);
+}
+
+void
 write_name_lsa_to_repo(char *repo_content_prefix, struct name_prefix *lsa_id)
 {
 	printf("Content Preifx: %s\n",repo_content_prefix);
diff --git a/nlsr-sync-0.0/nlsr_lsdb.h b/nlsr-sync-0.0/nlsr_lsdb.h
index 4e8a8d1..32972d9 100755
--- a/nlsr-sync-0.0/nlsr_lsdb.h
+++ b/nlsr-sync-0.0/nlsr_lsdb.h
@@ -87,5 +87,6 @@
 void write_name_lsdb_to_repo(char *slice_prefix);
 void write_name_lsa_to_repo(char *repo_content_prefix, struct name_prefix *lsa_id);
 void make_name_lsa_prefix_for_repo(char *key, char *orig_router, int ls_type, long int ls_id,char *orig_time,char *slice_prefix);
+void write_adj_lsa_to_repo(char *repo_content_prefix, struct name_prefix *lsa_id);
 
 #endif
diff --git a/nlsr-sync-0.0/nlsr_ndn.c b/nlsr-sync-0.0/nlsr_ndn.c
index 9af0a05..5e5c082 100755
--- a/nlsr-sync-0.0/nlsr_ndn.c
+++ b/nlsr-sync-0.0/nlsr_ndn.c
@@ -731,14 +731,14 @@
 	{
 		process_incoming_content_info(selfp,info);
 	}
-	if(!strcmp((char *)comp_ptr1,"lsdb"))
+	/*if(!strcmp((char *)comp_ptr1,"lsdb"))
 	{
 		process_incoming_content_lsdb(selfp,info);
 	}
 	if(!strcmp((char *)comp_ptr1,"lsa"))
 	{
 		process_incoming_content_lsa(selfp,info);
-	}
+	}*/
 
 }
 
diff --git a/nlsr-sync-0.0/nlsr_sync.c b/nlsr-sync-0.0/nlsr_sync.c
index 3839f67..e89fcb8 100644
--- a/nlsr-sync-0.0/nlsr_sync.c
+++ b/nlsr-sync-0.0/nlsr_sync.c
@@ -28,6 +28,7 @@
 #include "nlsr.h"
 #include "nlsr_sync.h"
 #include "nlsr_lsdb.h"
+#include "utility.h"
 
 int 
 get_lsa_position(struct ccn_charbuf * ccnb, struct ccn_indexbuf *comps)
@@ -173,6 +174,101 @@
 	return (char *)ptr;
 }
 
+void 
+process_incoming_sync_content_lsa(char *content_data)
+{
+
+
+	if ( nlsr->debugging )
+		printf("process_incoming_sync_content_lsa called \n");
+	//if ( nlsr->detailed_logging )
+		//writeLogg(__FILE__,__FUNCTION__,__LINE__,"process_incoming_content_lsa called \n");	
+
+	char *sep="|";
+	char *rem;
+	char *orig_router;
+	char *orl;
+	int orig_router_length;
+	char *lst;
+	int ls_type;
+	char *lsid;
+	long int ls_id;
+	char *isvld;
+	int isValid;
+	char *num_link;
+	int no_link;
+	char *np;
+	char *np_length;
+	int name_length;
+	char *data;
+	char *orig_time;
+
+	
+	if ( nlsr->debugging )
+		printf("LSA Data \n");
+	//if ( nlsr->detailed_logging )
+	//	writeLogg(__FILE__,__FUNCTION__,__LINE__,"LSA Data\n");	
+
+	if( strlen(content_data ) > 0 )
+	{
+
+		orig_router=strtok_r((char *)content_data,sep,&rem);
+		orl=strtok_r(NULL,sep,&rem);
+		orig_router_length=atoi(orl);
+
+		if ( nlsr->debugging )
+		{
+			printf("	Orig Router Name  : %s\n",orig_router);
+			printf("	Orig Router Length: %d\n",orig_router_length);
+		}
+
+		lst=strtok_r(NULL,sep,&rem);		
+		ls_type=atoi(lst);
+
+		if ( nlsr->debugging )
+			printf("	LS Type  : %d\n",ls_type);
+
+		if ( ls_type == LS_TYPE_NAME )
+		{
+			lsid=strtok_r(NULL,sep,&rem);
+			ls_id=atoi(lsid);
+			orig_time=strtok_r(NULL,sep,&rem);
+			isvld=strtok_r(NULL,sep,&rem);
+			isValid=atoi(isvld);
+			np=strtok_r(NULL,sep,&rem);
+			np_length=strtok_r(NULL,sep,&rem);
+			name_length=atoi(np_length);
+			if ( nlsr->debugging )
+			{
+				printf("	LS ID  : %ld\n",ls_id);
+				printf("	isValid  : %d\n",isValid);
+				printf("	Name Prefix : %s\n",np);
+				printf("	Orig Time   : %s\n",orig_time);
+				printf("	Name Prefix length: %d\n",name_length);
+			}
+
+			build_and_install_others_name_lsa(orig_router,ls_type,ls_id,orig_time,isValid,np);
+
+			print_name_lsdb();
+
+		}
+		else if ( ls_type == LS_TYPE_ADJ )
+		{
+			orig_time=strtok_r(NULL,sep,&rem);
+			num_link=strtok_r(NULL,sep,&rem);
+			no_link=atoi(num_link);
+			data=rem;
+
+			if ( nlsr->debugging )
+			{
+				printf("	No Link  : %d\n",no_link);
+				printf("	Data  : %s\n",data);
+			}
+			build_and_install_others_adj_lsa(orig_router,ls_type,orig_time,no_link,data);
+		}
+	}
+}
+
 void
 process_content_from_sync(struct ccn_charbuf *content_name, struct ccn_indexbuf *components)
 {
@@ -186,6 +282,10 @@
 	int ls_type;
 	long int ls_id=0;
 
+	char *time_stamp=(char *)malloc(20);
+	memset(time_stamp,0,20);
+	get_current_timestamp_micro(time_stamp);
+
 	struct ccn_charbuf *uri = ccn_charbuf_create();
 	ccn_uri_append(uri, content_name->buf, content_name->length, 0);	
 
@@ -195,28 +295,40 @@
 
 	res=ccn_name_comp_get(content_name->buf, components,lsa_position+1,&lst, &comp_size);
 	
-	printf("Ls Type: %s\n",lst);
+	//printf("Ls Type: %s\n",lst);
 	ls_type=atoi((char *)lst);
 	if(ls_type == LS_TYPE_NAME)
 	{
+		
 		res=ccn_name_comp_get(content_name->buf, components,lsa_position+2,&lsid, &comp_size);
 		ls_id=atoi((char *)lsid);
 		res=ccn_name_comp_get(content_name->buf, components,lsa_position+3,&origtime, &comp_size);
 		get_name_part(orig_router,content_name,components,3);
-		printf("Ls ID: %s\nOrig Time: %s\nOrig Router: %s\n",lsid,origtime,orig_router->name);
 
-		int is_new_name_lsa=check_is_new_name_lsa(orig_router->name,(char *)lst,(char *)lsid,(char *)origtime);
-		if ( is_new_name_lsa == 1 )
+		int lsa_life_time=get_time_diff(time_stamp,(char *)origtime);
+
+		//printf("Ls ID: %s\nOrig Time: %s\nOrig Router: %s\n",lsid,origtime,orig_router->name);
+
+		if ( (strcmp((char *)orig_router,nlsr->router_name) == 0 && lsa_life_time < nlsr->lsa_refresh_time) || (strcmp((char *)orig_router,nlsr->router_name) != 0 && lsa_life_time < nlsr->router_dead_interval) )
 		{
-			printf("New NAME LSA.....\n");	
-			char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
-			printf("Content Data: %s \n",content_data);
+			int is_new_name_lsa=check_is_new_name_lsa(orig_router->name,(char *)lst,(char *)lsid,(char *)origtime);
+			if ( is_new_name_lsa == 1 )
+			{
+				printf("New NAME LSA.....\n");	
+				char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
+				printf("Content Data: %s \n",content_data);
+				process_incoming_sync_content_lsa(content_data);
+			}
+			else 
+			{
+				printf("Name LSA / Newer Name LSA already xists in LSDB\n");
+				char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
+				printf("Content Data: %s \n",content_data);
+			}
 		}
 		else 
 		{
-			printf("Name LSA / Newer Name LSA already xists in LSDB\n");
-			char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
-			printf("Content Data: %s \n",content_data);
+			printf("Lsa is older than Router LSA refresh time/ Dead Interval\n");
 		}
 	}
 	else if(ls_type == LS_TYPE_ADJ)
@@ -224,22 +336,33 @@
 		res=ccn_name_comp_get(content_name->buf, components,lsa_position+2,&origtime, &comp_size);
 		get_name_part(orig_router,content_name,components,2);
 		printf("Orig Time: %s\nOrig Router: %s\n",origtime,orig_router->name);
-	
-		int is_new_adj_lsa=check_is_new_adj_lsa(orig_router->name,(char *)lst,(char *)origtime);
-		if ( is_new_adj_lsa == 1 )
-		{
-			printf("New Adj LSA.....\n");	
-			char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
-			printf("Content Data: %s \n",content_data);			
-		}
-		else
-		{
 
-			printf("Adj LSA / Newer Adj LSA already exists in LSDB\n");
-			char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
-			printf("Content Data: %s \n",content_data);
-		}
+		int lsa_life_time=get_time_diff(time_stamp,(char *)origtime);
 
+		//printf("Ls ID: %s\nOrig Time: %s\nOrig Router: %s\n",lsid,origtime,orig_router->name);
+
+		if ( (strcmp((char *)orig_router,nlsr->router_name) == 0 && lsa_life_time < nlsr->lsa_refresh_time) || (strcmp((char *)orig_router,nlsr->router_name) != 0 && lsa_life_time < nlsr->router_dead_interval) )	
+		{
+			int is_new_adj_lsa=check_is_new_adj_lsa(orig_router->name,(char *)lst,(char *)origtime);
+			if ( is_new_adj_lsa == 1 )
+			{
+				printf("New Adj LSA.....\n");	
+				char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
+				printf("Content Data: %s \n",content_data);
+				process_incoming_sync_content_lsa(content_data);			
+			}
+			else
+			{
+
+				printf("Adj LSA / Newer Adj LSA already exists in LSDB\n");
+				char *content_data=get_content_by_content_name(ccn_charbuf_as_string(uri));
+				printf("Content Data: %s \n",content_data);
+			}
+		}
+		else 
+		{
+			printf("Lsa is older than Router LSA refresh time/ Dead Interval\n");
+		}
 	}
 
 	ccn_charbuf_destroy(&uri);