First commit:CPP
diff --git a/adjacent.cpp b/adjacent.cpp
new file mode 100644
index 0000000..8f7fa6d
--- /dev/null
+++ b/adjacent.cpp
@@ -0,0 +1,24 @@
+#include<iostream>
+#include<string>
+
+#include "adjacent.hpp"
+
+using namespace std;
+
+Adjacent::Adjacent(const string& an, int cf, double lc, int s, int iton){
+	adjacentName=an;
+	connectingFace=cf;
+	linkCost=lc;
+	status=s;
+	interestTimedOutNo=iton;
+}
+
+std::ostream&
+operator << (std::ostream &os, Adjacent &adj){
+	cout<<"Adjacent : "<< adj.getAdjacentName()	<< endl;
+	cout<<"Connecting Face: "<<adj.getConnectingFace()<<endl;
+	cout<<"Link Cost: "<<adj.getLinkCost()<<endl;
+	cout<<"Status: "<<adj.getStatus()<<endl;
+	cout<<"Interest Timed out: "<<adj.getInterestTimedOutNo()<<endl;
+	return os;
+}
diff --git a/adjacent.hpp b/adjacent.hpp
new file mode 100644
index 0000000..09eef16
--- /dev/null
+++ b/adjacent.hpp
@@ -0,0 +1,79 @@
+#ifndef ADJACENT_HPP
+#define ADJACENT_HPP
+
+using namespace std;
+
+class Adjacent{
+
+	public:
+		Adjacent()
+			:adjacentName()
+			,connectingFace(0)
+			,linkCost(0.0)
+			,status(0)
+			,interestTimedOutNo(0)
+		{
+		}
+
+		Adjacent(const string& an)
+			:connectingFace(0)
+			,linkCost(0.0)
+			,status(0)
+			,interestTimedOutNo(0)
+		{
+			adjacentName=an;
+		}
+
+		Adjacent(const string& an, int cf, double lc, int s, int iton);	
+
+		string getAdjacentName(){
+			return adjacentName;
+		}
+
+		void setAdjacentName(const string& an){
+			adjacentName=an;
+		}
+
+		int getConnectingFace(){
+			return connectingFace;
+		}
+		 
+		void getConnectingFace(int cf){
+			connectingFace=cf;
+		}
+
+		double getLinkCost(){
+			return linkCost;
+		}
+
+		void setLinkCost(double lc){
+			linkCost=lc;
+		}
+
+		int getStatus(){
+			return status;
+		}
+
+		void setStatus(int s){
+			status=s;
+		}
+
+		int getInterestTimedOutNo(){
+			return interestTimedOutNo;
+		}
+
+		void setInterestTimedOutNo(int iton){
+			interestTimedOutNo=iton;
+		}
+	private:
+		string adjacentName;
+		int connectingFace;
+		double linkCost;
+		int status;
+		int interestTimedOutNo;
+};
+
+std::ostream&
+operator << (std::ostream &os, Adjacent &adj);
+
+#endif
diff --git a/adl.cpp b/adl.cpp
new file mode 100644
index 0000000..f8969e1
--- /dev/null
+++ b/adl.cpp
@@ -0,0 +1,76 @@
+#include<iostream>
+#include<algorithm>
+
+#include "adl.hpp"
+#include "adjacent.hpp"
+
+Adl::Adl(){
+}
+
+Adl::~Adl(){
+
+}
+
+static bool
+adjacent_compare(Adjacent& adj1, Adjacent& adj2){
+	return adj1.getAdjacentName()==adj2.getAdjacentName();
+}
+
+int
+Adl::insert(Adjacent& adj){
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+	if ( it != adjList.end() ){
+		return -1;
+	}
+	adjList.push_back(adj);
+	return 0;
+}
+int
+Adl::updateAdjacentStatus(string adjName, int s){
+	Adjacent adj(adjName);
+	
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it == adjList.end()){
+		return -1;
+	}
+
+	(*it).setStatus(s);
+	return 0;
+	
+
+}
+
+int 
+Adl::updateAdjacentLinkCost(string adjName, double lc){
+	Adjacent adj(adjName);
+	
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it == adjList.end()){
+		return -1;
+	}
+
+	(*it).setLinkCost(lc);
+	return 0;
+
+}
+
+std::list<Adjacent> 
+Adl::getAdjList(){
+	return adjList;
+}
+
+// used for debugging purpose
+void
+Adl::printAdl(){
+	for( std::list<Adjacent>::iterator it=adjList.begin(); it!= adjList.end() ; it++){
+		cout<< (*it) <<endl;
+	}
+}
diff --git a/adl.hpp b/adl.hpp
new file mode 100644
index 0000000..1547407
--- /dev/null
+++ b/adl.hpp
@@ -0,0 +1,26 @@
+#ifndef ADL_HPP
+#define ADL_HPP
+
+#include <ndn-cpp-dev/face.hpp>
+#include "adjacent.hpp"
+#include<list>
+
+using namespace std;
+
+class Adl{
+
+public:
+	Adl();
+	~Adl();
+	int insert(Adjacent& adj);
+	int updateAdjacentStatus(string adjName, int s);
+	int updateAdjacentLinkCost(string adjName, double lc);	
+	void printAdl();
+	std::list<Adjacent> getAdjList();
+
+
+private:	
+	std::list< Adjacent > adjList;
+};	
+
+#endif
diff --git a/conf_param.cpp b/conf_param.cpp
new file mode 100644
index 0000000..14696e3
--- /dev/null
+++ b/conf_param.cpp
@@ -0,0 +1,33 @@
+#include<iostream>
+#include "conf_param.hpp"
+
+using namespace std;
+
+ostream&
+operator << (ostream &os, ConfParameter& cfp){
+	os  <<"Router Name: "<< cfp.getRouterName()<<endl;
+    os  <<"Site Name: "<< cfp.getSiteName()<<endl;
+    os  <<"Network: "<< cfp.getNetwork()<<endl;
+
+    os  <<"Router Prefix: "<< cfp.getRouterPrefix()<<endl;
+
+    os  <<"ChronoSync sync Prifex: "<< cfp.getChronosyncSyncPrefix()<<endl;
+ 
+    os  <<"Interest Retry number: "<< cfp.getInterestRetryNumber()<<endl;
+    os  <<"Interest Resend second: "<< cfp.getInterestResendTime()<<endl;
+	os  <<"Info Interest Interval: "<<cfp.getInfoInterestInterval()<<endl;
+    os  <<"LSA refresh time: "<< cfp.getLsaRefreshTime()<<endl;
+       
+    os  <<"Max Faces Per Prefix: "<< cfp.getMaxFacesPerPrefix()<<endl;
+    os  <<"Log Dir: "<< cfp.getLogDir()<<endl;
+    os  <<"Detalied logging: "<< cfp.getDetailedLogging()<<endl;
+    os  <<"Debugging: "<< cfp.getDebugging()<<endl;
+
+    os  <<"Hyperbolic ROuting: "<< cfp.getIsHyperbolicCalc()<<endl;
+    os  <<"Hyp R: "<< cfp.getCorR()<<endl;
+    os  <<"Hyp theta: "<< cfp.getCorTheta()<<endl;
+
+	os  <<"Tunnel Type: "<< cfp.getTunnelType()<<endl;
+
+	return os;
+}
diff --git a/conf_param.hpp b/conf_param.hpp
new file mode 100644
index 0000000..69d2eff
--- /dev/null
+++ b/conf_param.hpp
@@ -0,0 +1,225 @@
+#ifndef CONF_PARAM_HPP
+#define CONF_PARAM_HPP
+
+#include<iostream>
+
+using namespace std;
+
+class ConfParameter{
+	
+	public:
+		ConfParameter()
+			:chronosyncSyncPrefix("ndn/nlsr/sync")
+			,chronosyncLsaPrefix("/ndn/nlsr/LSA")
+		{
+			adjBuildFlag=0;
+        		adjBuildCount=0;
+        		isBuildAdjLsaSheduled=0;
+        		isRouteCalculationScheduled=0;
+			isRoutingTableCalculating=0;
+        		isStrictHierchicalKeyCheck=0;
+
+			interestRetryNumber=3;
+			interestResendTime=5;
+			infoInterestInterval=60;
+			lsaRefreshTime=1800;
+			routerDeadInterval=3600;
+			maxFacesPerPrefix=0;
+			tunnelType=0;
+			detailedLogging=0;
+        		debugging=0;
+			isHyperbolicCalc=0;
+			
+			
+		}
+
+		void setRouterName(const string& rn){  
+			routerName=rn;
+		}
+
+		string getRouterName(){
+			return routerName;
+		}
+
+		void setSiteName(const string& sn){  
+			siteName=sn;
+		}
+
+		string getSiteName(){
+			return siteName;
+		}
+
+		void setNetwork(const string& nn){  
+			network=nn;
+		}
+
+		string getNetwork(){
+			return network;
+		}
+
+		void buildRouterPrefix(){
+			routerPrefix="/"+network+"/"+siteName+"/"+routerName;
+		}
+		
+		string getRouterPrefix(){
+			return routerPrefix;
+		}
+
+		void setInterestRetryNumber(int irn){
+			interestRetryNumber=irn;
+		}
+
+		int getInterestRetryNumber(){
+			return interestRetryNumber;
+		}
+
+		void setInterestResendTime(int irt){
+			interestResendTime=irt;
+		}
+
+		int getInterestResendTime(){
+			return interestResendTime;
+		}
+
+		void setLsaRefreshTime(int lrt){
+			lsaRefreshTime=lrt;
+			routerDeadInterval=2*lsaRefreshTime;
+		}
+
+		int getLsaRefreshTime(){
+			return lsaRefreshTime;
+		}
+
+		void setRouterDeadInterval(int rdt){
+			routerDeadInterval=rdt;
+		}
+
+		long int setRouterDeadInterval(){
+			return routerDeadInterval;
+		}
+
+		void setMaxFacesPerPrefix(int mfpp){
+			maxFacesPerPrefix=mfpp;
+		}
+
+		int getMaxFacesPerPrefix(){
+			return maxFacesPerPrefix;
+		}
+
+		void setLogDir(string ld){
+			logDir=ld;
+		}
+		
+		string getLogDir(){
+			return logDir;
+		}
+
+		void setDetailedLogging(int dl){
+			detailedLogging=dl;		
+		}
+
+		int getDetailedLogging(){
+			return detailedLogging;
+		}
+
+		void setDebugging(int d){
+			debugging=d;
+		}
+		
+		int getDebugging(){
+			return debugging;
+		}
+
+		void setIsHyperbolicCalc(int ihc){
+			isHyperbolicCalc=ihc;
+		}
+
+		int getIsHyperbolicCalc(){
+			return isHyperbolicCalc;
+		}
+
+		void setCorR(double cr){
+			corR=cr;
+		}
+
+		double getCorR(){
+			return corR;
+		}
+
+		void setCorTheta(double ct){
+			corTheta=ct;
+		}
+
+		double getCorTheta(){
+			return corTheta;
+		}
+
+		void setTunnelType(int tt){
+			tunnelType=tt;
+		}
+
+		int getTunnelType(){
+			return tunnelType;
+		}
+
+		void setChronosyncSyncPrefix(const string& csp){
+			chronosyncSyncPrefix=csp;
+		} 
+
+		string getChronosyncSyncPrefix(){
+			return chronosyncSyncPrefix;
+		}
+
+		int getInfoInterestInterval(){
+			return infoInterestInterval;
+		}
+
+		void setInfoInterestInterval(int iii){
+			infoInterestInterval=iii;
+		}
+
+	private:
+        string routerName;
+        string siteName;
+        string network;
+
+        string routerPrefix;
+        string lsaRouterPrefix;
+
+        string chronosyncSyncPrefix;
+        string chronosyncLsaPrefix;             
+
+        int interestRetryNumber;
+        int interestResendTime;
+		int infoInterestInterval;
+        int lsaRefreshTime;
+        int routerDeadInterval;
+        
+        int maxFacesPerPrefix;
+        string logDir;
+        string logFile;
+        int detailedLogging;
+        int debugging;
+
+        int isHyperbolicCalc;
+        double corR;
+        double corTheta;
+
+		int tunnelType;
+
+		int adjBuildFlag;
+        long int adjBuildCount;
+        int isBuildAdjLsaSheduled;
+        int isRouteCalculationScheduled;
+
+        int isRoutingTableCalculating;
+        int isStrictHierchicalKeyCheck;
+
+        
+
+};
+
+std::ostream&
+operator << (std::ostream &os, ConfParameter &cfp);
+
+#endif
diff --git a/conf_processor.cpp b/conf_processor.cpp
new file mode 100644
index 0000000..e3be824
--- /dev/null
+++ b/conf_processor.cpp
@@ -0,0 +1,367 @@
+#include<iostream>
+#include<fstream>
+#include<string>
+#include<cstdlib>
+#include <sstream>
+
+#include "conf_processor.hpp"
+#include "conf_param.hpp"
+#include "nlsr_tokenizer.hpp"
+#include "adjacent.hpp"
+
+
+using namespace std;
+
+int 
+ConfFileProcessor::processConfFile(nlsr& pnlsr){
+	int ret=0;
+
+	if ( !confFileName.empty()){
+		std::ifstream inputFile(confFileName.c_str());
+		for( string line; getline( inputFile, line ); ){
+    			if (!line.empty() ){
+				if(line[0]!= '#' && line[0]!='!'){
+					ret=processConfCommand(pnlsr, line);	
+					if( ret == -1 ){
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	return ret;
+}
+
+
+int 
+ConfFileProcessor::processConfCommand(nlsr& pnlsr, string command){
+	int ret=0;
+	nlsrTokenizer nt(command," ");
+	if( (nt.getFirstToken() == "network")){
+		ret=processConfCommandNetwork(pnlsr,nt.getRestOfLine());		
+    }
+	else if( (nt.getFirstToken() == "site-name")){
+     	ret=processConfCommandSiteName(pnlsr,nt.getRestOfLine());   		
+    }
+	else if ( (nt.getFirstToken() == "router-name")){
+		ret=processConfCommandRouterName(pnlsr,nt.getRestOfLine());
+	}
+	else if( (nt.getFirstToken() == "ndnneighbor") ){
+        ret=processConfCommandNdnNeighbor(pnlsr, nt.getRestOfLine());    
+    }
+	else if( (nt.getFirstToken() == "link-cost")){
+      	ret=processConfCommandLinkCost(pnlsr, nt.getRestOfLine());          
+ 	} 
+	else if( (nt.getFirstToken() == "ndnname") ){
+ 		ret=processConfCommandNdnName(pnlsr, nt.getRestOfLine());
+	}
+	else if( (nt.getFirstToken() == "interest-retry-num")){
+		processConfCommandInterestRetryNumber(pnlsr,nt.getRestOfLine());
+	}
+	else if( (nt.getFirstToken() == "interest-resend-time")){
+    		processConfCommandInterestResendTime(pnlsr,nt.getRestOfLine());
+    }
+	else if( (nt.getFirstToken() == "lsa-refresh-time")){
+    		processConfCommandLsaRefreshTime(pnlsr,nt.getRestOfLine());    		
+	}
+	else if( (nt.getFirstToken() == "max-faces-per-prefix")){
+    		processConfCommandMaxFacesPerPrefix(pnlsr,nt.getRestOfLine());	
+	}
+	else if( (nt.getFirstToken() == "logdir")){
+    		processConfCommandLogDir(pnlsr,nt.getRestOfLine());
+	}
+	else if( (nt.getFirstToken() == "detailed-logging") ){
+    		processConfCommandDetailedLogging(pnlsr,nt.getRestOfLine());
+    }
+    else if( (nt.getFirstToken() == "debugging") ){
+    		processConfCommandDebugging(pnlsr,nt.getRestOfLine());    		
+    }
+    else if( (nt.getFirstToken() == "chronosync-sync-prefix") ){
+    		processConfCommandChronosyncSyncPrefix(pnlsr,nt.getRestOfLine());    		
+    }
+    else if( (nt.getFirstToken() == "hyperbolic-cordinate") ){
+     	processConfCommandHyperbolicCordinate(pnlsr,nt.getRestOfLine());   		
+    }
+    else if( (nt.getFirstToken() == "hyperbolic-routing")){
+    		processConfCommandIsHyperbolicCalc(pnlsr,nt.getRestOfLine());    		
+    }
+    else if( (nt.getFirstToken() == "tunnel-type")){
+     	processConfCommandTunnelType(pnlsr,nt.getRestOfLine());   		
+    }
+    else {
+    		cout << "Wrong configuration Command: "<< nt.getFirstToken()<<endl;
+    }
+
+	return ret;
+}
+
+int
+ConfFileProcessor::processConfCommandNetwork(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Network can not be null or empty :( !"<<endl;
+		return -1;
+	}else{
+		if(command[command.size()-1] == '/' ){
+			command.erase(command.size() - 1);
+		}
+		if(command[0] == '/' ){
+			command.erase(0,1);
+		}
+		pnlsr.confParam.setNetwork(command);
+	}
+	return 0;
+}
+
+int 
+ConfFileProcessor::processConfCommandSiteName(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<"Site name can not be null or empty :( !"<<endl;
+		return -1;
+	}else{
+		if(command[command.size()-1] == '/' ){
+			command.erase(command.size() - 1);
+		}
+		if(command[0] == '/' ){
+			command.erase(0,1);
+		}
+		pnlsr.confParam.setSiteName(command);
+	}
+	return 0;
+}
+
+int 
+ConfFileProcessor::processConfCommandRouterName(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Router name can not be null or empty :( !"<<endl;
+		return -1;
+	}else{
+		if(command[command.size()-1] == '/' ){
+			command.erase(command.size() - 1);
+		}
+		if(command[0] == '/' ){
+			command.erase(0,1);
+		}
+		pnlsr.confParam.setRouterName(command);
+	}
+	return 0;
+}
+
+int 
+ConfFileProcessor::processConfCommandInterestRetryNumber(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [interest-retry-num n]"<<endl;
+	}else{
+		int irn;
+		stringstream ss(command.c_str());
+		ss>>irn;
+		if ( irn >=1 && irn <=5){
+			pnlsr.confParam.setInterestRetryNumber(irn);
+		}
+	}
+	return 0;
+}
+
+int 
+ConfFileProcessor::processConfCommandInterestResendTime(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [interest-resend-time s]"<<endl;
+	}else{
+		int irt;
+		stringstream ss(command.c_str());
+		ss>>irt;
+		if( irt>=1 && irt <=20){
+			pnlsr.confParam.setInterestResendTime(irt);
+		}
+	}
+	return 0;
+}
+
+int 
+ConfFileProcessor::processConfCommandLsaRefreshTime(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [interest-resend-time s]"<<endl;
+	}else{
+		int lrt;
+		stringstream ss(command.c_str());
+		ss>>lrt;
+		if ( lrt>= 240 && lrt<=7200){
+			pnlsr.confParam.setLsaRefreshTime(lrt);
+		}
+	}
+	return 0;
+}
+
+int 
+ConfFileProcessor::processConfCommandMaxFacesPerPrefix(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [max-faces-per-prefix n]"<<endl;
+	}else{
+		int mfpp;
+		stringstream ss(command.c_str());
+		ss>>mfpp;
+		if ( mfpp>=0 && mfpp<=60){
+			pnlsr.confParam.setMaxFacesPerPrefix(mfpp);
+		}
+	}
+	return 0;
+}
+
+int
+ConfFileProcessor::processConfCommandTunnelType(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [tunnel-type tcp/udp]!"<<endl;
+	}else{
+		if(command == "tcp" || command == "TCP" ){
+			pnlsr.confParam.setTunnelType(1);
+		}
+		else if(command == "udp" || command == "UDP"){
+			pnlsr.confParam.setTunnelType(0);
+		}else{
+			cerr <<" Wrong command format ! [tunnel-type tcp/udp]!"<<endl;
+		}
+	}
+	return 0;
+}
+
+int
+ConfFileProcessor::processConfCommandChronosyncSyncPrefix(nlsr& pnlsr, 
+																string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [chronosync-sync-prefix name/prefix]!"<<endl;
+	}else{
+		pnlsr.confParam.setChronosyncSyncPrefix(command);
+	}
+	return 0;
+}
+
+
+int
+ConfFileProcessor::processConfCommandLogDir(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [log-dir /path/to/log/dir]!"<<endl;
+	}else{
+		pnlsr.confParam.setLogDir(command);
+	}
+	return 0;
+}
+
+int
+ConfFileProcessor::processConfCommandDebugging(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [debugging on/of]!"<<endl;
+	}else{
+		if(command == "on" || command == "ON" ){
+			pnlsr.confParam.setDebugging(1);
+		}
+		else if(command == "off" || command == "off"){
+			pnlsr.confParam.setDebugging(0);
+		}else{
+			cerr <<" Wrong command format ! [debugging on/off]!"<<endl;
+		}
+	}
+	return 0;
+}
+
+int
+ConfFileProcessor::processConfCommandDetailedLogging(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [detailed-logging on/off]!"<<endl;
+	}else{
+		if(command == "on" || command == "ON" ){
+			pnlsr.confParam.setDetailedLogging(1);
+		}
+		else if(command == "off" || command == "off"){
+			pnlsr.confParam.setDetailedLogging(0);
+		}else{
+			cerr <<" Wrong command format ! [detailed-logging on/off]!"<<endl;
+		}
+	}
+	return 0;
+}
+
+int
+ConfFileProcessor::processConfCommandIsHyperbolicCalc(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [hyperbolic-routing on/off/dry-run]!"<<endl;
+	}else{
+		if(command == "on" || command == "ON" ){
+			pnlsr.confParam.setIsHyperbolicCalc(1);
+		}
+		else if(command == "dry-run" || command == "DRY-RUN"){
+			pnlsr.confParam.setIsHyperbolicCalc(2);
+		}
+		else if(command == "off" || command == "off"){
+			pnlsr.confParam.setIsHyperbolicCalc(0);
+		}else{
+			cerr <<" Wrong command format ! [hyperbolic-routing on/off/dry-run]!"<<endl;
+		}
+	}
+	return 0;
+}
+
+int
+ConfFileProcessor::processConfCommandHyperbolicCordinate(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [hyperbolic-cordinate r 0]!"<<endl;
+		if (pnlsr.confParam.getIsHyperbolicCalc() > 0 ){
+			return -1;
+		}
+	}else{
+		nlsrTokenizer nt(command," ");
+		stringstream ssr(nt.getFirstToken().c_str());
+		stringstream sst(nt.getRestOfLine().c_str());
+		
+		double r,theta;
+		ssr>>r;
+		sst>>theta;
+		
+		pnlsr.confParam.setCorR(r);
+		pnlsr.confParam.setCorTheta(theta);
+	}
+	return 0;
+}
+
+
+int 
+ConfFileProcessor::processConfCommandNdnNeighbor(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [ndnneighbor /nbr/name/]!"<<endl;
+	}else{
+		nlsrTokenizer nt(command," ");
+		Adjacent adj(nt.getFirstToken(),0,0.0,0,0);
+		pnlsr.adl.insert(adj);
+	}
+	return 0;	
+}
+
+int 
+ConfFileProcessor::processConfCommandNdnName(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [ndnname name/prefix]!"<<endl;
+	}else{
+		pnlsr.npl.insertIntoNpl(command);
+	}
+	return 0;
+}
+
+
+int 
+ConfFileProcessor::processConfCommandLinkCost(nlsr& pnlsr, string command){
+	if(command.empty() ){
+		cerr <<" Wrong command format ! [link-cost nbr/name cost]!"<<endl;
+		if (pnlsr.confParam.getIsHyperbolicCalc() > 0 ){
+			return -1;
+		}
+	}else{
+		nlsrTokenizer nt(command," ");
+		stringstream sst(nt.getRestOfLine().c_str());
+		
+		double cost;
+		sst>>cost;
+		
+		pnlsr.adl.updateAdjacentLinkCost(nt.getFirstToken(),cost);
+	}
+	return 0;
+}
+
diff --git a/conf_processor.hpp b/conf_processor.hpp
new file mode 100644
index 0000000..1a1ff8a
--- /dev/null
+++ b/conf_processor.hpp
@@ -0,0 +1,46 @@
+#ifndef CONF_PROCESSOR_HPP
+#define CONF_PROCESSOR_HPP
+
+#include "nlsr.hpp" 
+
+using namespace std;
+
+class ConfFileProcessor{
+	public:
+		ConfFileProcessor()
+			:confFileName()
+		{
+		}
+		ConfFileProcessor(const string& cfile){ 
+			confFileName=cfile;
+		}
+
+		int processConfFile(nlsr& pnlsr);
+		int processConfCommand(nlsr& pnlsr, string command);
+		int processConfCommandNetwork(nlsr& pnlsr, string command);
+		int processConfCommandSiteName(nlsr& pnlsr, string command);
+		int processConfCommandRouterName(nlsr& pnlsr, string command);
+		int processConfCommandInterestRetryNumber(nlsr& pnlsr, string command);
+		int processConfCommandInterestResendTime(nlsr& pnlsr, string command);
+		int processConfCommandLsaRefreshTime(nlsr& pnlsr, string command);
+		int processConfCommandMaxFacesPerPrefix(nlsr& pnlsr, string command);
+		int processConfCommandTunnelType(nlsr& pnlsr, string command);
+
+		int processConfCommandChronosyncSyncPrefix(nlsr& pnlsr, string command);
+		int processConfCommandLogDir(nlsr& pnlsr, string command);
+		int processConfCommandDebugging(nlsr& pnlsr, string command);
+		int processConfCommandDetailedLogging(nlsr& pnlsr, string command);
+		int processConfCommandIsHyperbolicCalc(nlsr& pnlsr, string command);
+
+		int processConfCommandHyperbolicCordinate(nlsr& pnlsr, string command);
+
+		int processConfCommandNdnNeighbor(nlsr& pnlsr, string command);
+		int processConfCommandNdnName(nlsr& pnlsr, string command);
+		int processConfCommandLinkCost(nlsr& pnlsr, string command);
+		
+
+	private:
+		string confFileName;
+};
+
+#endif
diff --git a/nlsr.cpp b/nlsr.cpp
new file mode 100644
index 0000000..248382e
--- /dev/null
+++ b/nlsr.cpp
@@ -0,0 +1,155 @@
+#include <ndn-cpp-dev/face.hpp>
+#include <ndn-cpp-dev/security/key-chain.hpp>
+#include <ndn-cpp-dev/util/scheduler.hpp>
+
+#include <cstdlib>
+
+#include "nlsr.hpp"
+#include "conf_processor.hpp"
+#include "conf_param.hpp"
+#include "nlsr_tokenizer.hpp"
+#include "adl.hpp"
+#include "adjacent.hpp"
+
+
+using namespace ndn;
+using namespace std;
+
+void 
+nlsr::processInterest(const ptr_lib::shared_ptr<const Name> &name, 
+							const ptr_lib::shared_ptr<const Interest> &interest)
+{
+
+	cout << "<< I: " << *interest << endl;
+    
+    Data data(ndn::Name(interest->getName()).append("testApp").appendVersion());
+    data.setFreshnessPeriod(1000); // 10 sec
+
+    data.setContent((const uint8_t*)"HELLO KITTY", sizeof("HELLO KITTY"));
+
+    kChain.sign(data);
+
+    cout << ">> D: " << data << endl;
+    nlsrFace.put(data);
+}
+
+void
+nlsr::nlsrRegistrationFailed(const ptr_lib::shared_ptr<const Name>&)
+{
+	cerr << "ERROR: Failed to register prefix in local hub's daemon" << endl;
+    nlsrFace.shutdown();
+}
+
+void
+nlsr::processContent(const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
+								 const ndn::ptr_lib::shared_ptr<ndn::Data> &data)
+{
+
+	cout << "I: " << interest->toUri() << endl;
+  	cout << "D: " << data->getName().toUri() << endl;
+	cout << "Data Content: " << data->getContent() << endl;
+
+}
+
+void
+nlsr::processInterestTimedOut(
+				const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest)
+{
+	cout << "Timed out interest : " << interest->getName().toUri() << endl;
+	string intName=	interest->getName().toUri();
+	cout << intName <<endl;
+	nlsrTokenizer nt(intName,"/");
+	string chkString("info");
+	if( nt.doesTokenExist(chkString) ){
+		string nbr=nt.getTokenString(0,nt.getTokenPosition(chkString)-1);
+		cout<<"Neighbor :"<<nbr<<endl;
+	}
+
+}
+
+void
+nlsr::setInterestFilterNlsr(const string& name){
+	nlsrFace.setInterestFilter(name,
+                        	func_lib::bind(&nlsr::processInterest, this, _1, _2),
+                        func_lib::bind(&nlsr::nlsrRegistrationFailed, this, _1));
+}
+
+void
+nlsr::expressInterest(const string& interestNamePrefix, int scope, int seconds)
+{
+	Interest i((ndn::Name(interestNamePrefix)));
+    //i.setScope(scope);
+    i.setInterestLifetime(seconds*1000);
+    i.setMustBeFresh(true);
+
+	nlsrFace.expressInterest(i,
+                          ndn::func_lib::bind(&nlsr::processContent, this, _1, _2),
+                          ndn::func_lib::bind(&nlsr::processInterestTimedOut, this, _1));
+
+}
+
+
+void
+nlsr::scheduleInfoInterest(int seconds){
+	scheduler.scheduleEvent(ndn::time::seconds(seconds),
+							ndn::bind(&nlsr::sendScheduledInfoInterest, this,seconds));
+}
+
+void
+nlsr::sendScheduledInfoInterest(int seconds){
+
+	std::list<Adjacent> adjList=adl.getAdjList();
+	for(std::list<Adjacent>::iterator it	=adjList.begin(); it!= adjList.end(); ++it){
+		string adjName=(*it).getAdjacentName()+"/"+"info"+confParam.getRouterPrefix();
+		expressInterest(	adjName,2,confParam.getInterestResendTime());
+	}
+
+	scheduleInfoInterest(confParam.getInfoInterestInterval());
+}
+
+void
+nlsr::startEventLoop(){
+	nlsrFace.processEvents();
+}
+
+int 
+nlsr::usage(const string& progname){
+
+        cout << "Usage: " << progname << " [OPTIONS...]"<<endl;
+        cout << "   NDN routing...." << endl;
+        cout << "       -d, --daemon        Run in daemon mode" << endl;
+        cout << "       -f, --config_file   Specify configuration file name" <<endl;
+        cout << "       -p, --api_port      port where api client will connect" <<endl;
+        cout << "       -h, --help          Display this help message" << endl;
+
+        exit(EXIT_FAILURE);
+}
+
+int 
+main(){
+
+	nlsr nlsr;
+	nlsr.setConfFileName("nlsr.conf");
+	ConfFileProcessor cfp(nlsr.getConfFileName());
+	cfp.processConfFile(nlsr);
+	nlsr.confParam.buildRouterPrefix();
+/* debugging purpose start */
+	cout <<	nlsr.confParam ;
+	nlsr.adl.printAdl();
+	nlsr.npl.printNpl();
+/* debugging purpose end */
+	nlsr.setInterestFilterNlsr("/ndn/memphis.edu/cs/pollux/");
+	
+	nlsr.scheduleInfoInterest(1);
+
+	
+	
+
+	try{
+		nlsr.startEventLoop();
+	}catch(std::exception &e) {
+    		std::cerr << "ERROR: " << e.what() << std::endl;
+	}
+
+	return 0;
+}
diff --git a/nlsr.hpp b/nlsr.hpp
new file mode 100644
index 0000000..c9f1032
--- /dev/null
+++ b/nlsr.hpp
@@ -0,0 +1,81 @@
+#ifndef NLSR_HPP
+#define NLSR_HPP
+
+#include <ndn-cpp-dev/face.hpp>
+#include <ndn-cpp-dev/security/key-chain.hpp>
+#include <ndn-cpp-dev/util/scheduler.hpp>
+
+#include "conf_param.hpp"
+#include "adl.hpp"
+#include "npl.hpp"
+
+
+using namespace ndn;
+using namespace std;
+
+class nlsr
+{
+	public:
+	nlsr()
+		: io(ndn::make_shared<boost::asio::io_service>())
+        , nlsrFace(io)
+		, scheduler(*io)
+		, configFileName()	
+		, confParam()
+		, adl()
+		, npl()
+	{
+		isDaemonProcess=false;
+		configFileName="nlsr.conf";	
+	}
+
+	void processInterest(const ptr_lib::shared_ptr<const Name> &name, 
+							const ptr_lib::shared_ptr<const Interest> &interest);
+	void processContent(const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
+								 const ndn::ptr_lib::shared_ptr<ndn::Data> &data);
+	void nlsrRegistrationFailed(const ptr_lib::shared_ptr<const Name>&);
+	void processInterestTimedOut(const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest);
+
+	void setInterestFilterNlsr(const string& name);
+
+	void expressInterest(const string& interestNamePrefix, int scope, int seconds);
+
+	//void scheduleSomeInterest(const string& interestName);
+
+	void sendScheduledInfoInterest(int seconds);
+	void scheduleInfoInterest(int seconds);
+
+	void startEventLoop();
+	
+	int usage(const string& progname);
+
+	string getConfFileName(){
+		return configFileName;
+	}
+
+	void setConfFileName(const string& fileName){
+		configFileName=fileName;
+	}
+
+	bool isSetDaemonProcess(){
+		return isDaemonProcess;
+	}
+
+	void setIsDaemonProcess(bool value){
+		isDaemonProcess=value;
+	}
+
+	ConfParameter confParam;
+	Adl adl;
+	Npl npl;
+	private:
+	ndn::shared_ptr<boost::asio::io_service> io;
+	ndn::Scheduler scheduler;
+	ndn::Face nlsrFace;
+	ndn::KeyChain kChain;
+	bool isDaemonProcess;
+	string configFileName;
+
+};
+
+#endif
diff --git a/nlsr_params.hpp b/nlsr_params.hpp
new file mode 100644
index 0000000..a5f11c5
--- /dev/null
+++ b/nlsr_params.hpp
@@ -0,0 +1,12 @@
+#ifndef NLSR_PARAMS_HPP
+#define NLSR_PARAMS_HPP
+
+class nlsrParams{
+
+	
+
+
+
+};
+
+#endif
diff --git a/nlsr_tokenizer.cpp b/nlsr_tokenizer.cpp
new file mode 100644
index 0000000..7c82ecd
--- /dev/null
+++ b/nlsr_tokenizer.cpp
@@ -0,0 +1,114 @@
+#include <iostream>
+#include <boost/tokenizer.hpp>
+#include <boost/algorithm/string.hpp>
+#include <string>
+#include <algorithm>
+
+#include "nlsr_tokenizer.hpp"
+
+using namespace std;
+using namespace boost;
+
+void 
+nlsrTokenizer::makeToken(){
+	char_separator<char> sep(seps.c_str());
+	tokenizer< char_separator<char> >tokens(originalString, sep);
+	tokenizer< char_separator<char> >::iterator tok_iter = tokens.begin();
+	
+	string ft(*tok_iter);
+	firstToken=ft;
+	++tok_iter;
+
+	for ( ;tok_iter != tokens.end(); ++tok_iter){
+		string oneToken(*tok_iter);
+		this->insertToken(oneToken);
+		restOfTheLine+=oneToken;
+		restOfTheLine+=seps;
+  	}
+
+	trim(restOfTheLine);
+}
+
+void 
+nlsrTokenizer::insertToken(const string& token){
+	tokenList.push_back(token);
+}
+
+int 
+nlsrTokenizer::getTokenPosition(string& token){
+	int pos=-1;
+	int i=1;
+
+	for(std::list<string>::iterator it=tokenList.begin();it!=tokenList.end();it++){
+		if( (*it) == token ){
+			break;
+		}
+		i++;
+	}
+
+	if( i < tokenList.size() ){
+		pos=i;
+	}
+
+	return pos;
+}
+
+string 
+nlsrTokenizer::getTokenString(int from , int to){
+	string returnString;
+	if ( from >=0 && to < tokenList.size()){
+		int i=1;
+		for(std::list<string>::iterator it=tokenList.begin();
+													it!=tokenList.end();it++){
+			if( i >= from && i<= to ){
+				string oneToken((*it));
+				returnString+=seps;
+				returnString+=oneToken;
+				
+			}
+			i++;
+		}
+	}
+
+	trim(returnString);
+	return returnString;
+}
+
+string 
+nlsrTokenizer::getTokenString(int from){
+	string returnString;
+	if ( from >=0 && from < tokenList.size()){
+		int i=1;
+		for(std::list<string>::iterator it=tokenList.begin();
+													it!=tokenList.end();it++){
+			if( i >= from){
+				string oneToken((*it));
+				returnString+=seps;
+				returnString+=oneToken;
+				
+			}
+			i++;
+		}
+	}
+
+	trim(returnString);
+	return returnString;
+}
+
+static bool
+tokenCompare(string& s1, string& s2){
+	return s1==s2;
+}
+
+bool
+nlsrTokenizer::doesTokenExist(string token){
+	std::list<string >::iterator it = std::find_if( tokenList.begin(), 
+								tokenList.end(),	
+   								bind(&tokenCompare, _1 , token));
+
+	if( it != tokenList.end() ){
+		return true;
+	}
+
+	return false;
+}
diff --git a/nlsr_tokenizer.hpp b/nlsr_tokenizer.hpp
new file mode 100644
index 0000000..9363462
--- /dev/null
+++ b/nlsr_tokenizer.hpp
@@ -0,0 +1,59 @@
+#ifndef NLSR_TOKENIZER_HPP
+#define NLSR_TOKENIZER_HPP
+
+#include <iostream>
+#include <boost/tokenizer.hpp>
+#include <boost/algorithm/string.hpp>
+#include <string>
+#include <list>
+#include <ndn-cpp-dev/face.hpp>
+
+using namespace std;
+using namespace boost;
+
+class nlsrTokenizer{
+	public:
+		nlsrTokenizer(const string& inputString)
+			:firstToken(),
+			 restOfTheLine()	
+		{
+			seps = " ";
+			originalString = inputString;
+			makeToken();
+		}
+
+		nlsrTokenizer(const string& inputString, const string& separator)
+			:firstToken(),
+			 restOfTheLine()	
+		{
+			seps = separator;
+			originalString = inputString;
+			makeToken();
+		}
+		
+		string getFirstToken(){
+			return firstToken;
+		}
+
+		string getRestOfLine(){
+			return restOfTheLine;
+		}
+
+		int getTokenPosition(string& token);
+		string getTokenString(int from , int to);
+		string getTokenString(int from);
+		bool doesTokenExist(string token);
+
+	private:
+
+		void makeToken();
+		void insertToken(const string& token);
+	
+		string seps;
+		string originalString;
+		string firstToken;
+		string restOfTheLine;
+		std::list<string> tokenList;
+};
+
+#endif
diff --git a/npl.cpp b/npl.cpp
new file mode 100644
index 0000000..df898d4
--- /dev/null
+++ b/npl.cpp
@@ -0,0 +1,41 @@
+#include<iostream>
+#include<algorithm>
+
+#include "npl.hpp"
+
+using namespace std;
+
+Npl::Npl(){
+
+}
+
+Npl::~Npl(){
+
+}
+
+static bool
+nameCompare(string& s1, string& s2){
+	return s1==s2;
+}
+
+int
+Npl::insertIntoNpl(string& name){
+	std::list<string >::iterator it = std::find_if( nameList.begin(), 
+								nameList.end(),	
+   								bind(&nameCompare, _1 , name));
+
+	if( it != nameList.end() ){
+		return -1;
+	}
+
+	nameList.push_back(name);
+	return 0;
+
+}
+
+void
+Npl::printNpl(){
+	for( std::list<string>::iterator it=nameList.begin(); it != nameList.end(); it++){
+		cout<<"Name : "<<(*it)<<endl;
+	}
+}
diff --git a/npl.hpp b/npl.hpp
new file mode 100644
index 0000000..da4bda7
--- /dev/null
+++ b/npl.hpp
@@ -0,0 +1,24 @@
+#ifndef NPL_HPP
+#define NPL_HPP
+
+#include<list>
+#include<string>
+#include <ndn-cpp-dev/face.hpp>
+
+using namespace std;
+
+class Npl{
+	
+public:
+	Npl();
+	~Npl();
+
+	int insertIntoNpl(string& name);
+	void printNpl();
+
+private:
+	std::list<string> nameList;
+
+};
+
+#endif