else
dr.d_place=DNSRecord::Additional;
+ unsigned int recordStartPos=pr.d_pos;
+
string label=pr.getLabel();
pr.getDnsrecordheader(ah);
dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr));
d_answers.push_back(make_pair(dr, pr.d_pos));
+
+ if(dr.d_type == QType::TSIG && dr.d_class == 0xff)
+ d_tsigPos = recordStartPos + sizeof(struct dnsheader);
}
#if 0
throw runtime_error("Unknown DNS type '"+name+"'");
}
- static const string NumberToType(uint16_t num)
+ static const string NumberToType(uint16_t num, uint16_t classnum=1)
{
- if(!getNamemap().count(make_pair(1,num)))
+ if(!getNamemap().count(make_pair(classnum,num)))
return "#" + lexical_cast<string>(num);
// throw runtime_error("Unknown DNS type with numerical id "+lexical_cast<string>(num));
- return getNamemap()[make_pair(1,num)];
+ return getNamemap()[make_pair(classnum,num)];
}
explicit DNSRecordContent(uint16_t type) : d_qtype(type)
};
//! This class can be used to parse incoming packets, and is copyable
-class MOADNSParser
+class MOADNSParser : public boost::noncopyable
{
public:
//! Parse from a string
- MOADNSParser(const string& buffer)
+ MOADNSParser(const string& buffer) : d_tsigPos(0)
{
init(buffer.c_str(), (unsigned int)buffer.size());
}
//! Parse from a pointer and length
- MOADNSParser(const char *packet, unsigned int len)
+ MOADNSParser(const char *packet, unsigned int len) : d_tsigPos(0)
{
init(packet, len);
}
return pr;
}
-
+ uint16_t getTSIGPos()
+ {
+ return d_tsigPos;
+ }
private:
void getDnsrecordheader(struct dnsrecordheader &ah);
void init(const char *packet, unsigned int len);
vector<uint8_t> d_content;
+ uint16_t d_tsigPos;
};
string simpleCompress(const string& label, const string& root="");
dnsheader* getHeader();
void getRecords(string& records);
+ const vector<uint8_t>& getRecordBeingWritten() { return d_record; }
private:
- vector<uint8_t>& d_content;
+ vector <uint8_t>& d_content;
vector <uint8_t> d_record;
string d_qname;
uint16_t d_qtype, d_qclass;