RNAME##RecordContent(const string& zoneData); \
static void report(void); \
static void unreport(void); \
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr); \
- static DNSRecordContent* make(const string& zonedata); \
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr); \
+ static std::shared_ptr<DNSRecordContent> make(const string& zonedata); \
string getZoneRepresentation(bool noDot=false) const override; \
void toPacket(DNSPacketWriter& pw) override; \
uint16_t getType() const override { return QType::RNAME; } \
{
public:
includeboilerplate(LUA)
- string getCode();
+ string getCode() const;
uint16_t d_type;
string d_code;
};
{
public:
includeboilerplate(SPF)
+ const std::string& getText() const
+ {
+ return d_text;
+ }
private:
string d_text;
public:
includeboilerplate(PTR)
explicit PTRRecordContent(const DNSName& content) : d_content(content){}
+ const DNSName& getContent() const { return d_content; }
private:
DNSName d_content;
};
struct soatimes d_st;
};
+class NSECBitmap
+{
+public:
+ NSECBitmap(): d_bitset(nullptr)
+ {
+ }
+ NSECBitmap(const NSECBitmap& rhs): d_set(rhs.d_set)
+ {
+ if (rhs.d_bitset) {
+ d_bitset = std::unique_ptr<std::bitset<nbTypes>>(new std::bitset<nbTypes>(*(rhs.d_bitset)));
+ }
+ }
+ NSECBitmap& operator=(const NSECBitmap& rhs)
+ {
+ d_set = rhs.d_set;
+
+ if (rhs.d_bitset) {
+ d_bitset = std::unique_ptr<std::bitset<nbTypes>>(new std::bitset<nbTypes>(*(rhs.d_bitset)));
+ }
+
+ return *this;
+ }
+ NSECBitmap(NSECBitmap&& rhs): d_bitset(std::move(rhs.d_bitset)), d_set(std::move(rhs.d_set))
+ {
+ }
+ bool isSet(uint16_t type) const
+ {
+ if (d_bitset) {
+ return d_bitset->test(type);
+ }
+ return d_set.count(type);
+ }
+ void set(uint16_t type)
+ {
+ if (!d_bitset) {
+ if (d_set.size() >= 200) {
+ migrateToBitSet();
+ }
+ }
+ if (d_bitset) {
+ d_bitset->set(type);
+ }
+ else {
+ d_set.insert(type);
+ }
+ }
+ size_t count() const
+ {
+ if (d_bitset) {
+ return d_bitset->count();
+ }
+ else {
+ return d_set.size();
+ }
+ }
+
+ void fromPacket(PacketReader& pr);
+ void toPacket(DNSPacketWriter& pw);
+ std::string getZoneRepresentation() const;
+
+ static constexpr size_t const nbTypes = 65536;
+
+private:
+
+ void migrateToBitSet()
+ {
+ d_bitset = std::unique_ptr<std::bitset<nbTypes>>(new std::bitset<nbTypes>());
+ for (const auto& type : d_set) {
+ d_bitset->set(type);
+ }
+ d_set.clear();
+ }
+ /* using a dynamic set is very efficient for a small number of
+ types covered (~200), but uses a lot of memory (up to 3MB)
+ when there are a lot of them.
+ So we start with the set, but allocate and switch to a bitset
+ if the number of covered types increases a lot */
+ std::unique_ptr<std::bitset<nbTypes>> d_bitset;
+ std::set<uint16_t> d_set;
+};
+
class NSECRecordContent : public DNSRecordContent
{
public:
{}
NSECRecordContent(const string& content, const string& zone=""); //FIXME400: DNSName& zone?
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& content);
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr);
+ static std::shared_ptr<DNSRecordContent> make(const string& content);
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) override;
uint16_t getType() const override
{
return QType::NSEC;
}
+ bool isSet(uint16_t type) const
+ {
+ return d_bitmap.isSet(type);
+ }
+ void set(uint16_t type)
+ {
+ d_bitmap.set(type);
+ }
+ void set(const NSECBitmap& bitmap)
+ {
+ d_bitmap = bitmap;
+ }
+ size_t numberOfTypesSet() const
+ {
+ return d_bitmap.count();
+ }
+
DNSName d_next;
- std::set<uint16_t> d_set;
private:
+ NSECBitmap d_bitmap;
};
class NSEC3RecordContent : public DNSRecordContent
{}
NSEC3RecordContent(const string& content, const string& zone=""); //FIXME400: DNSName& zone?
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& content);
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr);
+ static std::shared_ptr<DNSRecordContent> make(const string& content);
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) override;
uint16_t d_iterations{0};
string d_salt;
string d_nexthash;
- std::set<uint16_t> d_set;
uint16_t getType() const override
{
return QType::NSEC3;
}
-
+ bool isSet(uint16_t type) const
+ {
+ return d_bitmap.isSet(type);
+ }
+ void set(uint16_t type)
+ {
+ d_bitmap.set(type);
+ }
+ void set(const NSECBitmap& bitmap)
+ {
+ d_bitmap = bitmap;
+ }
+ size_t numberOfTypesSet() const
+ {
+ return d_bitmap.count();
+ }
private:
+ NSECBitmap d_bitmap;
};
{}
NSEC3PARAMRecordContent(const string& content, const string& zone=""); // FIXME400: DNSName& zone?
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& content);
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr);
+ static std::shared_ptr<DNSRecordContent> make(const string& content);
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) override;
{}
LOCRecordContent(const string& content, const string& zone="");
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& content);
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr);
+ static std::shared_ptr<DNSRecordContent> make(const string& content);
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) override;
private:
};
-
-class WKSRecordContent : public DNSRecordContent
-{
-public:
- static void report(void);
- WKSRecordContent()
- {}
- WKSRecordContent(const string& content, const string& zone=""); // FIXME400: DNSName& zone?
-
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& content);
- string getZoneRepresentation(bool noDot=false) const override;
- void toPacket(DNSPacketWriter& pw) override;
-
- uint32_t d_ip{0};
- std::bitset<65535> d_services;
-private:
-};
-
class EUI48RecordContent : public DNSRecordContent
{
public:
EUI48RecordContent() {};
static void report(void);
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& zone); // FIXME400: DNSName& zone?
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr);
+ static std::shared_ptr<DNSRecordContent> make(const string& zone); // FIXME400: DNSName& zone?
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) override;
uint16_t getType() const override { return QType::EUI48; }
public:
EUI64RecordContent() {};
static void report(void);
- static DNSRecordContent* make(const DNSRecord &dr, PacketReader& pr);
- static DNSRecordContent* make(const string& zone); // FIXME400: DNSName& zone?
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr);
+ static std::shared_ptr<DNSRecordContent> make(const string& zone); // FIXME400: DNSName& zone?
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) override;
uint16_t getType() const override { return QType::EUI64; }
};
#define boilerplate(RNAME, RTYPE) \
-RNAME##RecordContent::DNSRecordContent* RNAME##RecordContent::make(const DNSRecord& dr, PacketReader& pr) \
+std::shared_ptr<RNAME##RecordContent::DNSRecordContent> RNAME##RecordContent::make(const DNSRecord& dr, PacketReader& pr) \
{ \
- return new RNAME##RecordContent(dr, pr); \
+ return std::make_shared<RNAME##RecordContent>(dr, pr); \
} \
\
RNAME##RecordContent::RNAME##RecordContent(const DNSRecord& dr, PacketReader& pr) \
xfrPacket(pr); \
} \
\
-RNAME##RecordContent::DNSRecordContent* RNAME##RecordContent::make(const string& zonedata) \
+std::shared_ptr<RNAME##RecordContent::DNSRecordContent> RNAME##RecordContent::make(const string& zonedata) \
{ \
- return new RNAME##RecordContent(zonedata); \
+ return std::make_shared<RNAME##RecordContent>(zonedata); \
} \
\
void RNAME##RecordContent::toPacket(DNSPacketWriter& pw) \
void reportOtherTypes();
void reportAllTypes();
ComboAddress getAddr(const DNSRecord& dr, uint16_t defport=0);
+void checkHostnameCorrectness(const DNSResourceRecord& rr);
#endif