[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