[svn] commit: r73 - in /experiments/jinmei-messageapi: dnsmessage-test.cc dnsname.hh iobuffer.hh rrset.cc rrset.hh
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Oct 7 23:18:54 UTC 2009
Author: jinmei
Date: Wed Oct 7 23:18:54 2009
New Revision: 73
Log:
merged Jeremy's additional hack:
- supported NS Rdata type
- receive/print response
Modified:
experiments/jinmei-messageapi/dnsmessage-test.cc
experiments/jinmei-messageapi/dnsname.hh
experiments/jinmei-messageapi/iobuffer.hh
experiments/jinmei-messageapi/rrset.cc
experiments/jinmei-messageapi/rrset.hh
Modified: experiments/jinmei-messageapi/dnsmessage-test.cc
==============================================================================
--- experiments/jinmei-messageapi/dnsmessage-test.cc (original)
+++ experiments/jinmei-messageapi/dnsmessage-test.cc Wed Oct 7 23:18:54 2009
@@ -35,11 +35,18 @@
return;
// Create Database
- map<string, string> a_db, aaaa_db;
- a_db.insert(pair<string,string>("www.jinmei.org", "149.20.54.162"));
- aaaa_db.insert(pair<string,string>("www.jinmei.org", "2001:4f8:3:36::162"));
- a_db.insert(pair<string,string>("www.isc.org", "149.20.64.42"));
- aaaa_db.insert(pair<string,string>("www.isc.org", "2001:4f8:0:2::d"));
+ typedef pair<string, string> dnskey_t;
+ map<dnskey_t, string> dnsdb;
+ dnsdb.insert(pair<dnskey_t, string>(dnskey_t("www.jinmei.org", "A"),
+ "149.20.54.162"));
+ dnsdb.insert(pair<dnskey_t, string>(dnskey_t("www.jinmei.org", "AAAA"),
+ "2001:4f8:3:36::162"));
+ dnsdb.insert(pair<dnskey_t, string>(dnskey_t("www.isc.org", "A"),
+ "149.20.64.42"));
+ dnsdb.insert(pair<dnskey_t, string>(dnskey_t("www.jinmei.org", "AAAA"),
+ "2001:4f8:0:2::d"));
+ dnsdb.insert(pair<dnskey_t, string>(dnskey_t("isc.org", "NS"),
+ "sfba.sns-pb.isc.org."));
int cc;
struct sockaddr_storage ss;
@@ -68,30 +75,30 @@
msg.set_aa(true);
RRSetPtr query = msg.get_section(SECTION_QUESTION)[0];
- map<string, string>::const_iterator it;
+ map<dnskey_t, string>::const_iterator it;
rdataptr_t rdatap;
- if (query->get_type() == RdataType::A) {
- it = a_db.find(query->get_name().to_text(true));
- if (it != a_db.end()) {
+ it = dnsdb.find(dnskey_t(query->get_name().to_text(true),
+ query->get_type().to_text()));
+ if (it != dnsdb.end()) {
+ // XXX: this code logic is clean. should revisit API.
+ if (query->get_type() == RdataType::A) {
rdatap = rdataptr_t(new ARdata(it->second));
+ } else if (query->get_type() == RdataType::AAAA) {
+ rdatap = rdataptr_t(new AAAARdata(it->second));
+ } else if (query->get_type() == RdataType::NS) {
+ rdatap = rdataptr_t(new NSRdata(it->second));
}
- } else if (query->get_type() == RdataType::AAAA) {
- it = aaaa_db.find(query->get_name().to_text(true));
- if (it != aaaa_db.end()) {
- rdatap = rdataptr_t(new AAAARdata(it->second));
- }
- }
- if (rdatap == NULL) {
- msg.set_rcode(Message::RCODE_NXDOMAIN);
- // should add SOA to the authority section, but not implemented.
- } else {
+
msg.set_rcode(Message::RCODE_NOERROR);
RRSet* rrset = new RRSet(query->get_name(), query->get_class(),
query->get_type(), TTL(3600));
rrset->add_rdata(rdatap);
msg.add_rrset(SECTION_ANSWER, RRSetPtr(rrset));
+ } else {
+ msg.set_rcode(Message::RCODE_NXDOMAIN);
+ // should add SOA to the authority section, but not implemented.
}
msg.to_wire();
@@ -164,10 +171,29 @@
msg.set_rd(true);
msg.add_question(Name(argv[0]), RdataClass::IN, RdataType(type_name));
msg.to_wire();
+ cout << "sending a query (" <<
+ boost::lexical_cast<string>(msg.get_iobuffer().get_size())
+ << " bytes):\n" << msg.to_text() << endl;
msg.get_iobuffer().send_to(s, *res->ai_addr, res->ai_addrlen);
- // print sent message
- cout << msg.to_text() << endl;
+ Message rmsg;
+ struct sockaddr_storage ss;
+ struct sockaddr* sa;
+ socklen_t sa_len;
+
+ sa_len = sizeof(ss);
+ sa = static_cast<struct sockaddr*>((void*)&ss);
+ if (rmsg.get_iobuffer().recv_from(s, sa, &sa_len) > 0) {
+ ISC::ConstResult result = rmsg.from_wire();
+
+ if (result != ISC::Result::Success) {
+ cerr << "parse failed: " << result->to_text() << endl;
+ } else {
+ cout << "received a response (" <<
+ boost::lexical_cast<string>(rmsg.get_iobuffer().get_size())
+ << " bytes):\n" << rmsg.to_text() << endl;
+ }
+ }
}
freeaddrinfo(res);
Modified: experiments/jinmei-messageapi/dnsname.hh
==============================================================================
--- experiments/jinmei-messageapi/dnsname.hh (original)
+++ experiments/jinmei-messageapi/dnsname.hh Wed Oct 7 23:18:54 2009
@@ -71,6 +71,7 @@
string to_text(bool omit_final_dot) const;
void to_wire(IOBuffer& r, NameCompressor& c) const;
const ISC::Result* from_wire(NameDecompressor& c, IOBuffer& iobuf);
+ size_t get_length() const { return (_length); }
unsigned int countlabels() const { return (_labels); }
NameComparisonResult fullcompare(const Name &other) const;
Name split(unsigned int first, unsigned int n) const;
Modified: experiments/jinmei-messageapi/iobuffer.hh
==============================================================================
--- experiments/jinmei-messageapi/iobuffer.hh (original)
+++ experiments/jinmei-messageapi/iobuffer.hh Wed Oct 7 23:18:54 2009
@@ -36,7 +36,7 @@
public:
virtual ~IOBuffer() {}
virtual void reserve(size_t len) = 0;
- virtual void write_data(const char *cp, size_t len) = 0;
+ virtual void write_data(const void *cp, size_t len) = 0;
virtual void write_uint32(uint32_t data) = 0;
virtual void write_uint16(uint16_t data) = 0;
virtual void write_uint16_at(uint16_t data, size_t pos) = 0;
@@ -61,8 +61,11 @@
{
_buf.resize(len);
}
- void write_data(const char *cp, size_t len)
- { _buf.insert(_buf.end(), cp, cp + len); }
+ void write_data(const void *data, size_t len)
+ {
+ const uint8_t* cp = static_cast<const uint8_t*>(cp);
+ _buf.insert(_buf.end(), cp, cp + len);
+ }
void write_uint32(uint32_t data)
{
data = htonl(data);
Modified: experiments/jinmei-messageapi/rrset.cc
==============================================================================
--- experiments/jinmei-messageapi/rrset.cc (original)
+++ experiments/jinmei-messageapi/rrset.cc Wed Oct 7 23:18:54 2009
@@ -48,7 +48,7 @@
return ("IN");
else if (_classval == 3)
return ("CHAOS");
- throw runtime_error("unexpected case");
+ throw runtime_error("unexpected class");
}
void
@@ -66,6 +66,8 @@
// should be rewritten in a cleaner way.
if (typestr == "A")
_typeval = 1;
+ else if (typestr == "NS")
+ _typeval = 2;
else if (typestr == "AAAA")
_typeval = 28;
else
@@ -77,9 +79,11 @@
{
if (_typeval == 1)
return ("A");
+ else if (_typeval == 2)
+ return ("NS");
else if (_typeval == 28)
return ("AAAA");
- throw runtime_error("unexpected case");
+ throw runtime_error("unexpected type");
}
void
@@ -89,6 +93,7 @@
}
const RdataType RdataType::A("A");
+const RdataType RdataType::NS("NS");
const RdataType RdataType::AAAA("AAAA");
// ...more to follow
@@ -105,18 +110,16 @@
}
void
-ARdata::from_wire(const string& wireData)
-{
- if (wireData.size() != sizeof(_addr))
- throw DNSInvalidWireRdata();
- memcpy(&_addr, wireData.data(), sizeof(_addr));
+ARdata::from_wire(IOBuffer& buffer, NameDecompressor& decompressor)
+{
+ //TBD
}
void
ARdata::to_wire(IOBuffer& buffer, NameCompressor& compressor) const
{
buffer.write_uint16(sizeof(_addr));
- buffer.write_data(static_cast<const char *>((void *)&_addr), sizeof(_addr));
+ buffer.write_data(&_addr, sizeof(_addr));
}
string
@@ -137,18 +140,16 @@
}
void
-AAAARdata::from_wire(const string& wireData)
-{
- if (wireData.size() != sizeof(_addr))
- throw DNSInvalidWireRdata();
- memcpy(&_addr, wireData.data(), sizeof(_addr));
+AAAARdata::from_wire(IOBuffer& buffer, NameDecompressor& decompressor)
+{
+ //TBD
}
void
AAAARdata::to_wire(IOBuffer& buffer, NameCompressor& compressor) const
{
buffer.write_uint16(sizeof(_addr));
- buffer.write_data(static_cast<const char *>((void *)&_addr), sizeof(_addr));
+ buffer.write_data(&_addr, sizeof(_addr));
}
string
@@ -160,6 +161,27 @@
throw runtime_error("unexpected inet_ntop() failure");
return (string(addrbuf));
+}
+
+void
+NSRdata::from_wire(IOBuffer& buffer, NameDecompressor& decompressor)
+{
+ //TBD
+}
+
+void
+NSRdata::to_wire(IOBuffer& buffer, NameCompressor& compressor) const
+{
+ // XXX: note that a complete implementation cannot be that simple
+ // because we need to disable compression for the NS name.
+ buffer.write_uint16(_nsname.get_length());
+ _nsname.to_wire(buffer, compressor);
+}
+
+string
+NSRdata::to_text() const
+{
+ return (_nsname.to_text(false));
}
void
Modified: experiments/jinmei-messageapi/rrset.hh
==============================================================================
--- experiments/jinmei-messageapi/rrset.hh (original)
+++ experiments/jinmei-messageapi/rrset.hh Wed Oct 7 23:18:54 2009
@@ -88,6 +88,7 @@
// (Some) Well-known Rdtype constants
static const RdataType A;
+ static const RdataType NS;
static const RdataType AAAA;
// more to follow...
@@ -126,7 +127,7 @@
virtual unsigned int count() const = 0;
virtual const RdataType& get_type() const = 0;
virtual string to_text() const = 0;
- virtual void from_wire(const string& wireData) = 0;
+ virtual void from_wire(IOBuffer& b, NameDecompressor& c) = 0;
virtual void to_wire(IOBuffer& b, NameCompressor& c) const = 0;
// need generic method for getting n-th field? c.f. ldns
// e.g. string getField(int n);
@@ -162,7 +163,7 @@
const RdataType& get_type() const { return (RdataType::A); }
static const RdataType& get_type_static() { return (RdataType::A); }
string to_text() const;
- void from_wire(const string& wireData);
+ void from_wire(IOBuffer& b, NameDecompressor& c);
void to_wire(IOBuffer& b, NameCompressor& c) const;
const struct in_addr& getAddress() const
{ return (_addr); }
@@ -176,6 +177,26 @@
struct in_addr _addr;
};
+class NSRdata : public Rdata {
+public:
+ NSRdata() {}
+ explicit NSRdata(const string& namestr) : _nsname(namestr) {}
+ explicit NSRdata(const Name& nsname) : _nsname(nsname) {}
+ unsigned int count() const { return (1); }
+ const RdataType& get_type() const { return (RdataType::NS); }
+ static const RdataType& get_type_static() { return (RdataType::NS); }
+ string to_text() const;
+ void from_wire(IOBuffer& b, NameDecompressor& c);
+ void to_wire(IOBuffer& b, NameCompressor& c) const;
+ const string get_nsname() const { return (_nsname.to_text(false)); }
+ bool operator==(const NSRdata &other) const
+ { return (_nsname == other._nsname); }
+ virtual bool operator!=(const NSRdata &other) const
+ { return !(*this == other); }
+private:
+ Name _nsname;
+};
+
class AAAARdata : public Rdata {
public:
AAAARdata() {}
@@ -186,7 +207,7 @@
const RdataType& get_type() const { return (RdataType::AAAA); }
static const RdataType& get_type_static()
{ return (RdataType::AAAA); }
- void from_wire(const string& wireData);
+ void from_wire(IOBuffer& b, NameDecompressor& c);
void to_wire(IOBuffer& b, NameCompressor& c) const;
const struct in6_addr& getAddress() const
{ return (_addr); }
@@ -200,7 +221,7 @@
struct in6_addr _addr;
};
-// add NSRdata, MXRdata, etc...
+// add MXRdata, etc...
// A set of RDATAs. This is a primary class internally used
// in our major software such as name servers.
More information about the bind10-changes
mailing list