support for NS, TXT, NDNCERT, FH
diff --git a/src/iterative-query.cpp b/src/iterative-query.cpp
index 989634a..2f4da51 100644
--- a/src/iterative-query.cpp
+++ b/src/iterative-query.cpp
@@ -22,86 +22,87 @@
namespace ndns {
IterativeQuery::IterativeQuery(const Query& query)
-: m_step(IterativeQuery::NSQuery)
-, m_tryNum(0)
-, m_tryMax(2)
-, m_query(query)
-, m_finishedLabelNum(0)
-, m_rrLabelLen(1)
-, m_authZoneIndex(0)
+ : m_step(IterativeQuery::NSQuery)
+ , m_tryNum(0)
+ , m_tryMax(2)
+ , m_query(query)
+ , m_finishedLabelNum(0)
+ , m_lastFinishedLabelNum(0)
+ , m_rrLabelLen(1)
+ , m_authZoneIndex(0)
{
}
-
-bool
-IterativeQuery::doTimeout()
+bool IterativeQuery::doTimeout()
{
abort();
return false;
}
-void
-IterativeQuery::abort(){
- std::cout<<(*this);
- std::cout<<std::endl;
-}
+void IterativeQuery::abort()
+ {
+ std::cout<<"Abort the Resolving"<<std::endl;
+ std::cout << (*this);
+ std::cout << std::endl;
+ }
-void
-IterativeQuery::doData(Data& data)
+void IterativeQuery::doData(Data& data)
{
- std::cout<<"[* -> *] resolve Data: "<<data.getName().toUri()<<std::endl;
+ std::cout << "[* -> *] resolve Data: " << data.getName().toUri() << std::endl;
Response re;
re.fromData(data);
- std::cout<<re<<std::endl;
+ std::cout << re << std::endl;
- if (re.getResponseType() == Response::UNKNOWN)
- {
- std::cout<<"[* !! *] unknown content type and exit";
+ if (re.getResponseType() == Response::UNKNOWN) {
+ std::cout << "[* !! *] unknown content type and exit";
m_step = Abort;
abort();
return;
- }
- else if (re.getResponseType() == Response::NDNS_Nack)
- {
- if (m_step == NSQuery) {
- //In fact, there are two different situations
- //1st: /net/ndnsim/DNS/www/NS is nacked
- //2st: /net/DNS/ndnsim/www/NS is nacked
- m_step = RRQuery;
+ } else if (re.getResponseType() == Response::NDNS_Nack) {
+ if (m_step == NSQuery) {
+ //In fact, there are two different situations
+ //1st: /net/ndnsim/DNS/www/NS is nacked
+ //2st: /net/DNS/ndnsim/www/NS is nacked
+ m_step = RRQuery;
- } else if (m_step == RRQuery)
- {
- m_step = AnswerStub;
+ if (m_query.getRrType() == RR::NDNCERT && m_rrLabelLen == 1) {
+ //here working for KSK and NDNCERT when get a Nack
+ //e.g., /net/ndnsim/ksk-1, ksk-1 returns nack, but it should query /net
+
+ Name dstLabel = m_query.getRrLabel();
+ Name label = dstLabel.getSubName(m_finishedLabelNum, m_rrLabelLen);
+ if (boost::starts_with(label.toUri(), "/ksk") || boost::starts_with(label.toUri(), "/KSK")) {
+ m_finishedLabelNum = m_lastFinishedLabelNum;
+ }
+
}
- m_lastResponse = re;
- }
- else if (re.getResponseType() == Response::NDNS_Auth)
- { // need more specific info
- m_rrLabelLen += 1;
+ } else if (m_step == RRQuery) {
+ m_step = AnswerStub;
+ }
- }
- else if (re.getResponseType() == Response::NDNS_Resp)
- {// get the intermediate answer
+ m_lastResponse = re;
+ } else if (re.getResponseType() == Response::NDNS_Auth) { // need more specific info
+ m_rrLabelLen += 1;
+ } else if (re.getResponseType() == Response::NDNS_Resp) { // get the intermediate answer
if (m_step == NSQuery) {
//do nothing, step NSQuery
+ m_lastFinishedLabelNum = m_finishedLabelNum;
m_finishedLabelNum += m_rrLabelLen;
m_rrLabelLen = 1;
m_authZoneIndex = 0;
m_lastResponse = re;
- } else if (m_step == RRQuery)
- { // final resolver gets result back
+ } else if (m_step == RRQuery) { // final resolver gets result back
m_step = AnswerStub;
m_lastResponse = re;
}
- std::cout<<"get RRs: "<<m_lastResponse.getStringRRs()<<std::endl;
+ std::cout << "get RRs: " << m_lastResponse.getStringRRs() << std::endl;
}
}
-const Interest
-IterativeQuery::toLatestInterest()
+const Interest IterativeQuery::toLatestInterest()
{
Query query = Query();
Name dstLabel = m_query.getRrLabel();
@@ -111,23 +112,25 @@
Name label;
if (m_step == RRQuery) {
label = dstLabel.getSubName(m_finishedLabelNum);
- }
- else {
+ } else {
label = dstLabel.getSubName(m_finishedLabelNum, m_rrLabelLen);
}
query.setAuthorityZone(authZone);
query.setRrLabel(label);
- if (m_step == NSQuery)
- {
+ if (m_step == NSQuery) {
query.setRrType(RR::NS);
query.setQueryType(Query::QUERY_DNS);
- } else if (m_step == RRQuery)
- {
+ } else if (m_step == RRQuery) {
query.setRrType(m_query.getRrType());
- query.setQueryType(Query::QUERY_DNS);
- } else if (m_step == AnswerStub)
- {
+ if (m_query.getRrType() == RR::NDNCERT) {
+ query.setQueryType(Query::QUERY_KEY);
+ query.setQueryType(Query::QUERY_DNS);
+ } else {
+ query.setQueryType(Query::QUERY_DNS);
+ }
+
+ } else if (m_step == AnswerStub) {
query.setRrType(m_query.getRrType());
query.setQueryType(Query::QUERY_DNS);
}