diff --git a/src/Analyzer.h b/src/Analyzer.h index 86cfb0266b..7797e215fe 100644 --- a/src/Analyzer.h +++ b/src/Analyzer.h @@ -1,3 +1,4 @@ +// Main analyzer interface. #ifndef ANALYZER_H #define ANALYZER_H diff --git a/src/CompHash.cc b/src/CompHash.cc index 77a06976fb..ecd2543050 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -109,7 +109,7 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0, { uint32* kp = AlignAndPadType(kp0); uint32 bytes[4]; - v->AsAddr()->CopyIPv6(bytes); + v->AsAddr().CopyIPv6(bytes); kp[0] = bytes[0]; kp[1] = bytes[1]; kp[2] = bytes[2]; @@ -122,12 +122,12 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0, { uint32* kp = AlignAndPadType(kp0); uint32 bytes[4]; - v->AsSubNet()->Prefix().CopyIPv6(bytes); + v->AsSubNet().Prefix().CopyIPv6(bytes); kp[0] = bytes[0]; kp[1] = bytes[1]; kp[2] = bytes[2]; kp[3] = bytes[3]; - kp[4] = v->AsSubNet()->Length(); + kp[4] = v->AsSubNet().Length(); kp1 = reinterpret_cast(kp+5); } break; @@ -354,15 +354,15 @@ HashKey* CompositeHash::ComputeSingletonHash(const Val* v, int type_check) const case TYPE_INTERNAL_ADDR: { uint32 bytes[4]; - v->AsAddr()->CopyIPv6(bytes); + v->AsAddr().CopyIPv6(bytes); return new HashKey((void*)bytes, 4 * sizeof(uint32)); } case TYPE_INTERNAL_SUBNET: { uint32 bytes[5]; - v->AsSubNet()->Prefix().CopyIPv6(bytes); - bytes[4] = v->AsSubNet()->Length(); + v->AsSubNet().Prefix().CopyIPv6(bytes); + bytes[4] = v->AsSubNet().Length(); return new HashKey((void*)bytes, 5 * sizeof(uint32)); } diff --git a/src/ConnCompressor.cc b/src/ConnCompressor.cc index b6bcc789b3..ee194c607f 100644 --- a/src/ConnCompressor.cc +++ b/src/ConnCompressor.cc @@ -660,8 +660,8 @@ const IP_Hdr* ConnCompressor::PendingConnToPacket(const PendingConn* c) IPAddr ip1(IPAddr::IPv6, c->key.ip1, IPAddr::Network); IPAddr ip2(IPAddr::IPv6, c->key.ip2, IPAddr::Network); - if ( ip1.family() == IPAddr::IPv6 || - ip2.family() == IPAddr::IPv6 ) + if ( ip1.GetFamily() == IPAddr::IPv6 || + ip2.GetFamily() == IPAddr::IPv6 ) reporter->InternalError("IPv6 snuck into connection compressor"); else { diff --git a/src/DCE_RPC.cc b/src/DCE_RPC.cc index a8a81813b7..88cdb48e80 100644 --- a/src/DCE_RPC.cc +++ b/src/DCE_RPC.cc @@ -137,7 +137,8 @@ static bool is_mapped_dce_rpc_endpoint(const dce_rpc_endpoint_addr& addr) bool is_mapped_dce_rpc_endpoint(const ConnID* id, TransportProto proto) { - if ( id->dst_addr.family() == IPAddr::IPv6 ) + if ( id->dst_addr.GetFamily() == IPAddr::IPv6 ) + // TODO: Does the protocol support v6 addresses? #773 return false; dce_rpc_endpoint_addr addr; diff --git a/src/DCE_RPC.h b/src/DCE_RPC.h index 481e7f37a3..acdbf1637d 100644 --- a/src/DCE_RPC.h +++ b/src/DCE_RPC.h @@ -65,7 +65,7 @@ struct dce_rpc_endpoint_addr { { static char buf[128]; snprintf(buf, sizeof(buf), "%s/%d/%s", - addr->AsString().c_str(), port, + addr.AsString().c_str(), port, proto == TRANSPORT_TCP ? "tcp" : (proto == TRANSPORT_UDP ? "udp" : "?")); diff --git a/src/DNS_Mgr.cc b/src/DNS_Mgr.cc index d0c562da37..2234ccbb10 100644 --- a/src/DNS_Mgr.cc +++ b/src/DNS_Mgr.cc @@ -347,13 +347,13 @@ void DNS_Mapping::Save(FILE* f) const { fprintf(f, "%.0f %d %s %d %s %d\n", creation_time, req_host != 0, req_host ? req_host : - IPAddr(IPAddr::IPv4, &req_addr, IPAddr::Network)->AsString()->c_str(), + IPAddr(IPAddr::IPv4, &req_addr, IPAddr::Network).AsString().c_str(), failed, (names && names[0]) ? names[0] : "*", num_addrs); for ( int i = 0; i < num_addrs; ++i ) fprintf(f, "%s\n", - IPAddr(IPAddr::IPv4, &addrs[i], IPAddr::Network)->AsString().c_str()); + IPAddr(IPAddr::IPv4, &addrs[i], IPAddr::Network).AsString().c_str()); } @@ -518,7 +518,7 @@ Val* DNS_Mgr::LookupAddr(uint32 addr) case DNS_FORCE: reporter->FatalError("can't find DNS entry for %s in cache", - IPAddr(IPAddr::IPv4, &addr, IPAddr::Network)->AsString().c_str()); + IPAddr(IPAddr::IPv4, &addr, IPAddr::Network).AsString().c_str()); return 0; case DNS_DEFAULT: @@ -787,13 +787,13 @@ ListVal* DNS_Mgr::AddrListDelta(ListVal* al1, ListVal* al2) for ( int i = 0; i < al1->Length(); ++i ) { - const IPAddr* al1_i = al1->Index(i)->AsAddr(); + const IPAddr& al1_i = al1->Index(i)->AsAddr(); int j; for ( j = 0; j < al2->Length(); ++j ) { - const IPAddr* al2_j = al2->Index(j)->AsAddr(); - if ( *al1_i == *al2_j ) + const IPAddr& al2_j = al2->Index(j)->AsAddr(); + if ( al1_i == al2_j ) break; } @@ -809,8 +809,8 @@ void DNS_Mgr::DumpAddrList(FILE* f, ListVal* al) { for ( int i = 0; i < al->Length(); ++i ) { - const IPAddr* al_i = al->Index(i)->AsAddr(); - fprintf(f, "%s%s", i > 0 ? "," : "", al_i->AsString().c_str()); + const IPAddr& al_i = al->Index(i)->AsAddr(); + fprintf(f, "%s%s", i > 0 ? "," : "", al_i.AsString().c_str()); } } diff --git a/src/Desc.cc b/src/Desc.cc index df49d84ba2..12b4a524eb 100644 --- a/src/Desc.cc +++ b/src/Desc.cc @@ -157,18 +157,6 @@ void ODesc::Add(double d) } } -void ODesc::Add(const IPAddr& addr) - { - string s = addr->AsString(); - AddBytes(s.c_str()); - } - -void ODesc::Add(const IPPrefix& prefix) - { - string s = prefix->AsString(); - AddBytes(s.c_str()); - } - void ODesc::AddCS(const char* s) { int n = strlen(s); diff --git a/src/Desc.h b/src/Desc.h index c633f2d812..9f8d7ab109 100644 --- a/src/Desc.h +++ b/src/Desc.h @@ -6,7 +6,9 @@ #include #include #include + #include "BroString.h" +#include "IPAddr.h" typedef enum { DESC_READABLE, @@ -68,13 +70,14 @@ public: void Add(const char* s, int do_indent=1); void AddN(const char* s, int len) { AddBytes(s, len); } + void Add(const string& s) { AddBytes(s.data(), s.size()); } void Add(int i); void Add(uint32 u); void Add(int64 i); void Add(uint64 u); void Add(double d); - void Add(const IPAddr& addr); - void Add(const IPPrefix& prefix); + void Add(const IPAddr& addr) { Add(addr.AsString()); } + void Add(const IPPrefix& prefix) { Add(prefix.AsString()); } // Add s as a counted string. void AddCS(const char* s); diff --git a/src/Expr.cc b/src/Expr.cc index 60e9cdb4ba..46590493a8 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -4493,7 +4493,7 @@ Val* InExpr::Fold(Val* v1, Val* v2) const if ( v1->Type()->Tag() == TYPE_ADDR && v2->Type()->Tag() == TYPE_SUBNET ) - return new Val(v2->AsSubNetVal().Contains(v1->AsAddr()), TYPE_BOOL); + return new Val(v2->AsSubNetVal()->Contains(v1->AsAddr()), TYPE_BOOL); TableVal* vt = v2->AsTableVal(); if ( vt->Lookup(v1, false) ) diff --git a/src/IPAddr.cc b/src/IPAddr.cc index 7d306e1b2d..b378f58473 100644 --- a/src/IPAddr.cc +++ b/src/IPAddr.cc @@ -90,7 +90,7 @@ void IPAddr::Init(const std::string& s) string IPAddr::AsString() const { - if ( family() == IPv4 ) + if ( GetFamily() == IPv4 ) { char s[INET_ADDRSTRLEN]; @@ -131,7 +131,7 @@ IPPrefix::IPPrefix(const in6_addr& in6, uint8_t length) IPPrefix::IPPrefix(const IPAddr& addr, uint8_t length) : prefix(addr) { - if ( prefix.family() == IPAddr::IPv4 ) + if ( prefix.GetFamily() == IPAddr::IPv4 ) { if ( length > 32 ) reporter->InternalError("Bad IPAddr(v4) IPPrefix length : %d", @@ -152,27 +152,15 @@ IPPrefix::IPPrefix(const IPAddr& addr, uint8_t length) prefix.Mask(this->length); } -IPPrefix::IPPrefix(const std::string& s, uint8_t length) - : prefix(s), length(length) - { - if ( prefix.family() == IPAddr::IPv4 && length > 32 ) - reporter->InternalError("Bad string IPPrefix length : %d", length); - - else if ( prefix.family() == IPAddr::IPv6 && length > 128 ) - reporter->InternalError("Bad string IPPrefix length : %d", length); - - prefix.Mask(this->length); - } - string IPPrefix::AsString() const { char l[16]; - if ( prefix.family() == IPAddr::IPv4 ) + if ( prefix.GetFamily() == IPAddr::IPv4 ) modp_uitoa10(length - 96, l); else modp_uitoa10(length, l); - return prefix->AsString() +"/" + l; + return prefix.AsString() +"/" + l; } diff --git a/src/IPAddr.h b/src/IPAddr.h index 07891fcee0..d9774b4ba4 100644 --- a/src/IPAddr.h +++ b/src/IPAddr.h @@ -114,7 +114,7 @@ public: /** * Returns the address' family. */ - Family family() const + Family GetFamily() const { if ( memcmp(in6.s6_addr, v4_mapped_prefix, 12) == 0 ) return IPv4; @@ -132,7 +132,7 @@ public: */ bool IsMulticast() const { - if ( family() == IPv4 ) + if ( GetFamily() == IPv4 ) return in6.s6_addr[12] == 224; else return in6.s6_addr[0] == 0xff; @@ -143,7 +143,7 @@ public: */ bool IsBroadcast() const { - if ( family() == IPv4 ) + if ( GetFamily() == IPv4 ) return ((in6.s6_addr[12] == 0xff) && (in6.s6_addr[13] == 0xff) && (in6.s6_addr[14] == 0xff) && (in6.s6_addr[15] == 0xff)); else @@ -162,9 +162,9 @@ public: * @return The number of 32-bit words the raw representation uses. This * will be 1 for an IPv4 address and 4 for an IPv6 address. */ - int GetBytes(const uint32_t* const * bytes) const + int GetBytes(const uint32_t** bytes) const { - if ( family() == IPv4 ) + if ( GetFamily() == IPv4 ) { *bytes = (uint32_t*) &in6.s6_addr[12]; return 1; @@ -306,7 +306,7 @@ inline IPAddr::IPAddr(Family family, const uint32_t* bytes, ByteOrder order) inline bool IPAddr::IsLoopback() const { - if ( family() == IPv4 ) + if ( GetFamily() == IPv4 ) return in6.s6_addr[12] == 127; else @@ -327,6 +327,12 @@ inline bool IPAddr::IsLoopback() const class IPPrefix { public: + + /** + * Constructs a prefix 0/0. + */ + IPPrefix() : length(0) {} + /** * Constructs a prefix instance from an IPv4 address and a prefix * length. @@ -356,16 +362,6 @@ public: */ IPPrefix(const IPAddr& addr, uint8_t length); - /** - * Constructs a prefix instance from IP string representation and length. - * - * @param s String containing an IP address as either a dotted IPv4 - * address or a hex IPv6 address. - * - * @param length The prefix length in the range from 0 to 128 - */ - IPPrefix(const std::string& s, uint8_t length); - /** * Copy constructor. */ @@ -389,7 +385,7 @@ public: */ uint8_t Length() const { - return prefix.family() == IPAddr::IPv4 ? length - 96 : length; + return prefix.GetFamily() == IPAddr::IPv4 ? length - 96 : length; } /** @@ -398,6 +394,16 @@ public: */ uint8_t LengthIPv6() const { return length; } + /** Returns true if the given address is part of the prefix. + * + * @param addr The address to test. + */ + bool Contains(const IPAddr& addr) const + { + IPAddr p(addr); + p.Mask(length); + return p == prefix; + } /** * Assignment operator. */ diff --git a/src/LogMgr.cc b/src/LogMgr.cc index 9c7f38b55d..9d397325be 100644 --- a/src/LogMgr.cc +++ b/src/LogMgr.cc @@ -200,7 +200,7 @@ bool LogVal::Read(SerializationFormat* fmt) case TYPE_SUBNET: { IPPrefix prefix; - if ( ! fmt->Read(&prefix), "subnet" ) + if ( ! fmt->Read(&prefix, "subnet") ) return false; val.subnet_val = new IPPrefix(prefix); @@ -210,10 +210,10 @@ bool LogVal::Read(SerializationFormat* fmt) case TYPE_ADDR: { IPAddr addr; - if ( ! fmt->Read(&addr), "net" ) + if ( ! fmt->Read(&addr, "net") ) return false; - val.addr_val = new IPAddr(prefix); + val.addr_val = new IPAddr(addr); return true; } diff --git a/src/RemoteSerializer.cc b/src/RemoteSerializer.cc index 5dc7a715c7..d59374ad7c 100644 --- a/src/RemoteSerializer.cc +++ b/src/RemoteSerializer.cc @@ -680,7 +680,7 @@ RemoteSerializer::PeerID RemoteSerializer::Connect(const IPAddr& ip, if ( ! initialized ) reporter->InternalError("remote serializer not initialized"); - if ( ip.family() == IPAddr::IPv6 ) + if ( ip.GetFamily() == IPAddr::IPv6 ) Error("inter-Bro communication not supported over IPv6"); const uint32* bytes; @@ -1237,7 +1237,7 @@ bool RemoteSerializer::Listen(const IPAddr& ip, uint16 port, bool expect_ssl) if ( ! initialized ) reporter->InternalError("remote serializer not initialized"); - if ( ip.family() == IPAddr::IPv6 ) + if ( ip.GetFamily() == IPAddr::IPv6 ) Error("inter-Bro communication not supported over IPv6"); const uint32* bytes; diff --git a/src/RuleMatcher.cc b/src/RuleMatcher.cc index b7138ee388..685e35bade 100644 --- a/src/RuleMatcher.cc +++ b/src/RuleMatcher.cc @@ -1071,7 +1071,7 @@ static bool val_to_maskedval(Val* v, maskedvalue_list* append_to) const uint32* n; uint32 m[4]; v->AsSubNet().Prefix().GetBytes(&n); - v->AsSubNetVal().Mask().CopyIPv6(m); + v->AsSubNetVal()->Mask().CopyIPv6(m); for ( unsigned int i = 0; i < 4; ++i ) m[i] = ntohl(m[i]); @@ -1079,7 +1079,7 @@ static bool val_to_maskedval(Val* v, maskedvalue_list* append_to) bool is_v4_mask = m[0] == 0xffffffff && m[1] == m[0] && m[2] == m[0]; - if ( v->AsSubNet().Prefix().family() == IPAddr::IPv4 && + if ( v->AsSubNet().Prefix().GetFamily() == IPAddr::IPv4 && is_v4_mask ) { mval->val = ntohl(*n); diff --git a/src/SerializationFormat.cc b/src/SerializationFormat.cc index c88e2979b8..ee1fd8fe44 100644 --- a/src/SerializationFormat.cc +++ b/src/SerializationFormat.cc @@ -232,11 +232,29 @@ bool BinarySerializationFormat::Read(string* v, const char* tag) bool BinarySerializationFormat::Read(IPAddr* addr, const char* tag) { - string s; - if ( ! Read(&s, tag) ) + int n = 0; + if ( ! Read(&n, "addr-len") ) return false; - *addr = IPAddr(s); + if ( n != 1 && n != 4 ) + return false; + + uint32_t raw[4]; + + for ( int i = 0; i < n; ++i ) + { + uint32_t i = 0; + if ( ! Read(&i, "addr-part") ) + return false; + + raw[n] = htonl(i); + } + + if ( n == 1 ) + *addr = IPAddr(IPAddr::IPv4, raw, IPAddr::Network); + else + *addr = IPAddr(IPAddr::IPv6, raw, IPAddr::Network); + return true; } @@ -323,12 +341,26 @@ bool BinarySerializationFormat::Write(const string& s, const char* tag) bool BinarySerializationFormat::Write(const IPAddr& addr, const char* tag) { - return Write(addr.AsString()); + const uint32_t* raw; + int n = addr.GetBytes(&raw); + + assert(n == 1 || n == 4); + + if ( ! Write(n, "addr-len") ) + return false; + + for ( int i = 0; i < n; ++i ) + { + if ( ! Write(ntohl(raw[i]), "addr-part") ) + return false; + } + + return true; } bool BinarySerializationFormat::Write(const IPPrefix& prefix, const char* tag) { - return Write(addr.AsString(), tag) && Write(prefix->Length(), tag); + return Write(prefix.Prefix(), "prefix") && Write(prefix.Length(), "width"); } bool BinarySerializationFormat::WriteOpenTag(const char* tag) @@ -421,6 +453,18 @@ bool XMLSerializationFormat::Read(string* s, const char* tag) return false; } +bool XMLSerializationFormat::Read(IPAddr* addr, const char* tag) + { + reporter->InternalError("no reading of xml"); + return false; + } + +bool XMLSerializationFormat::Read(IPPrefix* prefix, const char* tag) + { + reporter->InternalError("no reading of xml"); + return false; + } + bool XMLSerializationFormat::Write(char v, const char* tag) { return WriteElem(tag, "char", &v, 1); @@ -501,6 +545,18 @@ bool XMLSerializationFormat::Write(const char* buf, int len, const char* tag) return WriteElem(tag, "string", buf, len); } +bool XMLSerializationFormat::Write(const IPAddr& addr, const char* tag) + { + reporter->InternalError("XML output of addresses not implemented"); + return false; + } + +bool XMLSerializationFormat::Write(const IPPrefix& prefix, const char* tag) + { + reporter->InternalError("XML output of prefixes not implemented"); + return false; + } + bool XMLSerializationFormat::WriteEncodedString(const char* s, int len) { while ( len-- ) diff --git a/src/SerializationFormat.h b/src/SerializationFormat.h index c6dd1e86b0..f5eb77c608 100644 --- a/src/SerializationFormat.h +++ b/src/SerializationFormat.h @@ -94,6 +94,8 @@ public: virtual bool Read(double* d, const char* tag); virtual bool Read(char** str, int* len, const char* tag); virtual bool Read(string* s, const char* tag); + virtual bool Read(IPAddr* addr, const char* tag); + virtual bool Read(IPPrefix* prefix, const char* tag); virtual bool Write(int v, const char* tag); virtual bool Write(uint16 v, const char* tag); virtual bool Write(uint32 v, const char* tag); @@ -105,6 +107,8 @@ public: virtual bool Write(const char* s, const char* tag); virtual bool Write(const char* buf, int len, const char* tag); virtual bool Write(const string& s, const char* tag); + virtual bool Write(const IPAddr& addr, const char* tag); + virtual bool Write(const IPPrefix& prefix, const char* tag); virtual bool WriteOpenTag(const char* tag); virtual bool WriteCloseTag(const char* tag); virtual bool WriteSeparator(); @@ -127,6 +131,8 @@ public: virtual bool Write(const char* s, const char* tag); virtual bool Write(const char* buf, int len, const char* tag); virtual bool Write(const string& s, const char* tag); + virtual bool Write(const IPAddr& addr, const char* tag); + virtual bool Write(const IPPrefix& prefix, const char* tag); virtual bool WriteOpenTag(const char* tag); virtual bool WriteCloseTag(const char* tag); virtual bool WriteSeparator(); @@ -142,6 +148,8 @@ public: virtual bool Read(double* d, const char* tag); virtual bool Read(char** str, int* len, const char* tag); virtual bool Read(string* s, const char* tag); + virtual bool Read(IPAddr* addr, const char* tag); + virtual bool Read(IPPrefix* prefix, const char* tag); private: // Encodes non-printable characters. diff --git a/src/Serializer.h b/src/Serializer.h index 93581d83ce..45575f7fa0 100644 --- a/src/Serializer.h +++ b/src/Serializer.h @@ -69,6 +69,8 @@ public: { return format->Read(const_cast(str), len, tag); } bool Read(string* s, const char* tag); + bool Read(IPAddr* a, const char* tag) { return format->Read(a, tag); } + bool Read(IPPrefix* p, const char* tag) { return format->Read(p, tag); } bool Write(const char* s, const char* tag) { return format->Write(s, tag); } @@ -76,6 +78,8 @@ public: { return format->Write(buf, len, tag); } bool Write(const string& s, const char* tag) { return format->Write(s.data(), s.size(), tag); } + bool Write(const IPAddr& a, const char* tag) { return format->Write(a, tag); } + bool Write(const IPPrefix& p, const char* tag) { return format->Write(p, tag); } bool WriteOpenTag(const char* tag) { return format->WriteOpenTag(tag); } diff --git a/src/Val.cc b/src/Val.cc index 0e49dca030..e42dfbd36e 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -861,18 +861,16 @@ AddrVal::AddrVal(const char* text) : Val(TYPE_ADDR) val.addr_val = new IPAddr(text); } -#if 0 AddrVal::AddrVal(uint32 addr) : Val(TYPE_ADDR) { // ### perhaps do gethostbyaddr here? val.addr_val = new IPAddr(IPAddr::IPv4, &addr, IPAddr::Network); } -AddrVal::AddrVal(const uint32* addr) : Val(TYPE_ADDR) +AddrVal::AddrVal(const uint32 addr[4]) : Val(TYPE_ADDR) { val.addr_val = new IPAddr(IPAddr::IPv6, addr, IPAddr::Network); } -#endif AddrVal::AddrVal(const IPAddr& addr) : Val(TYPE_ADDR) { @@ -891,7 +889,7 @@ unsigned int AddrVal::MemoryAllocation() const Val* AddrVal::SizeVal() const { - if ( val.addr_val->family() == IPAddr::IPv4 ) + if ( val.addr_val->GetFamily() == IPAddr::IPv4 ) return new Val(32, TYPE_COUNT); else return new Val(128, TYPE_COUNT); @@ -965,7 +963,6 @@ void SubNetVal::ValDescribe(ODesc* d) const d->Add(string(*val.subnet_val).c_str()); } -#if 0 IPAddr SubNetVal::Mask() const { if ( val.subnet_val->Length() == 0 ) @@ -995,19 +992,6 @@ IPAddr SubNetVal::Mask() const return rval; } -bool SubNetVal::Contains(const uint32 addr) const - { - IPAddr a(IPAddr::IPv4, &addr, IPAddr::Network); - return val.subnet_val->Contains(a); - } - -bool SubNetVal::Contains(const uint32* addr) const - { - IPAddr a(IPAddr::IPv6, addr, IPAddr::Network); - return val.subnet_val->Contains(a); - } -#endif - bool SubNetVal::Contains(const IPAddr& addr) const { IPAddr a(addr); diff --git a/src/Val.h b/src/Val.h index e987726601..415996d97a 100644 --- a/src/Val.h +++ b/src/Val.h @@ -261,17 +261,17 @@ public: ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern) ACCESSOR(TYPE_VECTOR, vector*, vector_val, AsVector) - IPPrefix* AsSubNet() + const IPPrefix& AsSubNet() { CHECK_TAG(type->Tag(), TYPE_SUBNET, "Val::SubNet", type_name) - return val.subnet_val; + return *val.subnet_val; } - IPAddr* AsAddr() + const IPAddr& AsAddr() { if ( type->Tag() != TYPE_ADDR ) BadTag("Val::AsAddr", type_name(type->Tag())); - return val.addr_val; + return *val.addr_val; } // Gives fast access to the bits of something that is one of @@ -562,10 +562,8 @@ public: Val* SizeVal() const; // Constructor for address already in network order. -#if 0 - AddrVal(uint32 addr); - AddrVal(const uint32* addr); -#endif + AddrVal(uint32 addr); // IPv4. + AddrVal(const uint32 addr[4]); // IPv6. AddrVal(const IPAddr& addr); unsigned int MemoryAllocation() const; @@ -583,10 +581,8 @@ class SubNetVal : public Val { public: SubNetVal(const char* text); SubNetVal(const char* text, int width); -#if 0 - SubNetVal(uint32 addr, int width); - SubNetVal(const uint32* addr, int width); -#endif + SubNetVal(uint32 addr, int width); // IPv4. + SubNetVal(const uint32 addr[4], int width); // IPv6. SubNetVal(const IPAddr& addr, int width); ~SubNetVal(); @@ -594,11 +590,7 @@ public: const IPAddr& Prefix() const { return val.subnet_val->Prefix(); } int Width() const { return val.subnet_val->Length(); } -#if 0 IPAddr Mask() const; - bool Contains(const uint32 addr) const; - bool Contains(const uint32* addr) const; -#endif bool Contains(const IPAddr& addr) const; diff --git a/src/bro.bif b/src/bro.bif index cc3c2f335c..1d2f0674ad 100644 --- a/src/bro.bif +++ b/src/bro.bif @@ -181,7 +181,7 @@ static void do_fmt(const char*& fmt, Val* v, ODesc* d) const IPAddr& u = v->AsAddr(); const uint32* net_order_u; - int len = u->GetBytes(&net_order_u); + int len = u.GetBytes(&net_order_u); if ( len == 4 ) { @@ -1963,7 +1963,7 @@ function do_profiling%(%) : any ## Returns: True if *ip* belongs to a local interface. function is_local_interface%(ip: addr%) : bool %{ - if ( ip->AsAddr()->IsLoopback() ) + if ( ip->AsAddr().IsLoopback() ) return new Val(1, TYPE_BOOL); list addrs; @@ -2054,7 +2054,7 @@ function gethostname%(%) : string ## Returns: true if *a* is an IPv4 address, else false. function is_v4_addr%(a: addr%): bool %{ - if ( a->AsAddr()->family() == IPAddr::IPv4 ) + if ( a->AsAddr().GetFamily() == IPAddr::IPv4 ) return new Val(1, TYPE_BOOL); else return new Val(0, TYPE_BOOL); @@ -2067,7 +2067,7 @@ function is_v4_addr%(a: addr%): bool ## Returns: true if *a* is an IPv6 address, else false. function is_v6_addr%(a: addr%): bool %{ - if ( a->AsAddr().Family() == IPAddr::IPv6 ) + if ( a->AsAddr().GetFamily() == IPAddr::IPv6 ) return new Val(1, TYPE_BOOL); else return new Val(0, TYPE_BOOL); @@ -2091,7 +2091,7 @@ function addr_to_counts%(a: addr%): index_vec %{ VectorVal* rval = new VectorVal(new VectorType(base_type(TYPE_COUNT))); const uint32* bytes; - int len = a->AsAddr()->GetBytes(&bytes); + int len = a->AsAddr().GetBytes(&bytes); for ( int i = 0; i < len; ++i ) rval->Assign(i, new Val(ntohl(bytes[i]), TYPE_COUNT), 0); @@ -2446,7 +2446,7 @@ function ptr_name_to_addr%(s: string%): addr function addr_to_ptr_name%(a: addr%): string %{ const uint32* addr; - int len = a->AsAddr()->GetBytes(&addr); + int len = a->AsAddr().GetBytes(&addr); if ( len == 1 ) { @@ -2564,7 +2564,7 @@ static Val* parse_eftp(const char* line) { string s(line); IPAddr tmp(s); - uint32* bytes; + const uint32* bytes; tmp.GetBytes(&bytes); addr = *bytes; if ( addr == 0 ) @@ -2672,7 +2672,7 @@ function parse_ftp_epsv%(str: string%): ftp_port function fmt_ftp_port%(a: addr, p: port%): string %{ const uint32* addr; - int len = a->AsAddr()->GetBytes(&addr); + int len = a->AsAddr().GetBytes(&addr); if ( len == 1 ) { uint32 a = ntohl(addr[0]); @@ -3441,7 +3441,7 @@ function lookup_addr%(host: addr%) : string frame->SetDelayed(); trigger->Hold(); - if ( host->AsAddr().Family() != IPAddr::IPv4 ) + if ( host->AsAddr().GetFamily() != IPAddr::IPv4 ) { // FIXME: This is a temporary work-around until we get this // fixed. We warn the user once, and always trigger a timeout. @@ -3567,7 +3567,7 @@ function lookup_location%(a: addr%) : geo_location } #ifdef HAVE_GEOIP_COUNTRY_EDITION_V6 - if ( geoip_v6 && a->AsAddr().Family() == IPAddr::IPv6 ) + if ( geoip_v6 && a->AsAddr().GetFamily() == IPAddr::IPv6 ) { const uint32* bytes; a->AsAddr().GetBytes(&bytes); @@ -3581,7 +3581,7 @@ function lookup_location%(a: addr%) : geo_location else #endif - if ( geoip && a->AsAddr().Family() == IPAddr::IPv4 ) + if ( geoip && a->AsAddr().GetFamily() == IPAddr::IPv4 ) { const uint32* bytes; a->AsAddr().GetBytes(&bytes); @@ -3664,7 +3664,7 @@ function lookup_asn%(a: addr%) : count { // IPv6 support showed up in 1.4.5. #ifdef HAVE_GEOIP_COUNTRY_EDITION_V6 - if ( a->AsAddr()->family() == IPAddr::IPv6 ) + if ( a->AsAddr().GetFamily() == IPAddr::IPv6 ) { const uint32* bytes; a->AsAddr().GetBytes(&bytes); @@ -3675,7 +3675,7 @@ function lookup_asn%(a: addr%) : count else #endif - if ( a->AsAddr().Family() == IPAddr::IPv4 ) + if ( a->AsAddr().GetFamily() == IPAddr::IPv4 ) { const uint32* bytes; a->AsAddr().GetBytes(&bytes); @@ -5402,7 +5402,7 @@ function preserve_prefix%(a: addr, width: count%): any AnonymizeIPAddr* ip_anon = ip_anonymizer[PREFIX_PRESERVING_A50]; if ( ip_anon ) { - if ( a->AsAddr().Family() == IPAddr::IPv6 ) + if ( a->AsAddr().GetFamily() == IPAddr::IPv6 ) builtin_error("preserve_prefix() not supported for IPv6 addresses"); else { @@ -5431,13 +5431,13 @@ function preserve_subnet%(a: subnet%): any AnonymizeIPAddr* ip_anon = ip_anonymizer[PREFIX_PRESERVING_A50]; if ( ip_anon ) { - if ( a->AsSubNet()->Prefix().Family() == IPAddr::IPv6 ) + if ( a->AsSubNet().Prefix().GetFamily() == IPAddr::IPv6 ) builtin_error("preserve_subnet() not supported for IPv6 addresses"); else { const uint32* bytes; a->AsSubNet().Prefix().GetBytes(&bytes); - ip_anon->PreservePrefix(*bytes, a->AsSubNet()->Length()); + ip_anon->PreservePrefix(*bytes, a->AsSubNet().Length()); } } @@ -5467,7 +5467,7 @@ function anonymize_addr%(a: addr, cl: IPAddrAnonymizationClass%): addr if ( anon_class < 0 || anon_class >= NUM_ADDR_ANONYMIZATION_CLASSES ) builtin_error("anonymize_addr(): invalid ip addr anonymization class"); - if ( a->AsAddr().Family() == IPAddr::IPv6 ) + if ( a->AsAddr().GetFamily() == IPAddr::IPv6 ) { builtin_error("anonymize_addr() not supported for IPv6 addresses"); return 0;