mirror of
https://github.com/zeek/zeek.git
synced 2025-10-17 05:58:20 +00:00
Merge remote-tracking branch 'origin/topic/robin/log-threads' into topic/bernhard/input-threads
(and move a little bit of functionality from ascii reader to backend) Conflicts: src/threading/Manager.cc
This commit is contained in:
commit
7076c64a5e
54 changed files with 594 additions and 1693 deletions
|
@ -1428,12 +1428,12 @@ int Manager::GetValueLength(const Value* val) {
|
|||
|
||||
case TYPE_ADDR:
|
||||
{
|
||||
switch ( val->val.addr_val->GetFamily() ) {
|
||||
case IPAddr::IPv4:
|
||||
length += 1*sizeof(uint32_t);
|
||||
switch ( val->val.addr_val.family ) {
|
||||
case IPv4:
|
||||
length += sizeof(val->val.addr_val.in.in4);
|
||||
break;
|
||||
case IPAddr::IPv6:
|
||||
length += 4*sizeof(uint32_t);
|
||||
case IPv6:
|
||||
length += sizeof(val->val.addr_val.in.in6);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
|
@ -1444,12 +1444,12 @@ int Manager::GetValueLength(const Value* val) {
|
|||
|
||||
case TYPE_SUBNET:
|
||||
{
|
||||
switch ( val->val.addr_val->GetFamily() ) {
|
||||
case IPAddr::IPv4:
|
||||
length += 1*sizeof(uint32_t)+sizeof(uint8_t);
|
||||
switch ( val->val.subnet_val.prefix.family ) {
|
||||
case IPv4:
|
||||
length += sizeof(val->val.subnet_val.prefix.in.in4)+sizeof(val->val.subnet_val.length);
|
||||
break;
|
||||
case IPAddr::IPv6:
|
||||
length += 4*sizeof(uint32_t)+sizeof(uint8_t);
|
||||
case IPv6:
|
||||
length += sizeof(val->val.subnet_val.prefix.in.in6)+sizeof(val->val.subnet_val.length);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
|
@ -1527,23 +1527,47 @@ int Manager::CopyValue(char *data, const int startpos, const Value* val) {
|
|||
|
||||
case TYPE_ADDR:
|
||||
{
|
||||
const uint32_t* bytes;
|
||||
int len = val->val.addr_val->GetBytes(&bytes) * sizeof(uint32_t);
|
||||
memcpy(data+startpos, (const char*) bytes, len);
|
||||
return len;
|
||||
break;
|
||||
}
|
||||
int length;
|
||||
switch ( val->val.addr_val.family ) {
|
||||
case IPv4:
|
||||
length = sizeof(val->val.addr_val.in.in4);
|
||||
memcpy(data + startpos, (const char*) &(val->val.addr_val.in.in4), length);
|
||||
break;
|
||||
case IPv6:
|
||||
length = sizeof(val->val.addr_val.in.in6);
|
||||
memcpy(data + startpos, (const char*) &(val->val.addr_val.in.in6), length);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
|
||||
return length;
|
||||
|
||||
case TYPE_SUBNET: {
|
||||
const uint32_t* bytes;
|
||||
int len = val->val.subnet_val->Prefix().GetBytes(&bytes) * sizeof(uint32_t);
|
||||
memcpy(data+startpos, (const char*) bytes, len);
|
||||
uint8_t prefixlen = val->val.subnet_val->Length();
|
||||
memcpy(data+startpos+len, (const char*) &(prefixlen), sizeof(uint8_t) );
|
||||
len += sizeof(uint8_t);
|
||||
return len;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case TYPE_SUBNET:
|
||||
{
|
||||
int length;
|
||||
switch ( val->val.subnet_val.prefix.family ) {
|
||||
case IPv4:
|
||||
length = sizeof(val->val.addr_val.in.in4);
|
||||
memcpy(data + startpos, (const char*) &(val->val.subnet_val.prefix.in.in4), length);
|
||||
break;
|
||||
case IPv6:
|
||||
length += sizeof(val->val.addr_val.in.in6);
|
||||
memcpy(data + startpos, (const char*) &(val->val.subnet_val.prefix.in.in4), length);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
int lengthlength = sizeof(val->val.subnet_val.length);
|
||||
memcpy(data + startpos + length , (const char*) &(val->val.subnet_val.length), lengthlength);
|
||||
length += lengthlength;
|
||||
return length;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case TYPE_TABLE: {
|
||||
int length = 0;
|
||||
|
@ -1648,11 +1672,42 @@ Val* Manager::ValueToVal(const Value* val, BroType* request_type) {
|
|||
break;
|
||||
|
||||
case TYPE_ADDR:
|
||||
return new AddrVal(*(val->val.addr_val));
|
||||
break;
|
||||
{
|
||||
IPAddr* addr;
|
||||
switch ( val->val.addr_val.family ) {
|
||||
case IPv4:
|
||||
addr = new IPAddr(val->val.addr_val.in.in4);
|
||||
break;
|
||||
case IPv6:
|
||||
addr = new IPAddr(val->val.addr_val.in.in6);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
AddrVal* addrval = new AddrVal(*addr);
|
||||
delete addr;
|
||||
return addrval;
|
||||
|
||||
}
|
||||
|
||||
case TYPE_SUBNET:
|
||||
return new SubNetVal(*(val->val.subnet_val));
|
||||
{
|
||||
IPAddr* addr;
|
||||
switch ( val->val.subnet_val.prefix.family ) {
|
||||
case IPv4:
|
||||
addr = new IPAddr(val->val.subnet_val.prefix.in.in4);
|
||||
break;
|
||||
case IPv6:
|
||||
addr = new IPAddr(val->val.subnet_val.prefix.in.in6);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
SubNetVal* subnetval = new SubNetVal(*addr, val->val.subnet_val.length);
|
||||
delete addr;
|
||||
return subnetval;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case TYPE_TABLE: {
|
||||
|
|
|
@ -273,5 +273,49 @@ bool ReaderBackend::DoHeartbeat(double network_time, double current_time)
|
|||
return true;
|
||||
}
|
||||
|
||||
TransportProto ReaderBackend::StringToProto(const string &proto) {
|
||||
if ( proto == "unknown" ) {
|
||||
return TRANSPORT_UNKNOWN;
|
||||
} else if ( proto == "tcp" ) {
|
||||
return TRANSPORT_TCP;
|
||||
} else if ( proto == "udp" ) {
|
||||
return TRANSPORT_UDP;
|
||||
} else if ( proto == "icmp" ) {
|
||||
return TRANSPORT_ICMP;
|
||||
}
|
||||
|
||||
Error(Fmt("Tried to parse invalid/unknown protocol: %s", proto.c_str()));
|
||||
|
||||
return TRANSPORT_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
// more or less verbose copy from IPAddr.cc -- which uses reporter
|
||||
Value::addr_t ReaderBackend::StringToAddr(const string &s) {
|
||||
Value::addr_t val;
|
||||
|
||||
if ( s.find(':') == std::string::npos ) // IPv4.
|
||||
{
|
||||
val.family = IPv4;
|
||||
|
||||
if ( inet_aton(s.c_str(), &(val.in.in4)) <= 0 ) {
|
||||
Error(Fmt("Bad addres: %s", s.c_str()));
|
||||
memset(&val.in.in4.s_addr, 0, sizeof(val.in.in4.s_addr));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
val.family = IPv6;
|
||||
if ( inet_pton(AF_INET6, s.c_str(), val.in.in6.s6_addr) <=0 )
|
||||
{
|
||||
Error(Fmt("Bad IP address: %s", s.c_str()));
|
||||
memset(val.in.in6.s6_addr, 0, sizeof(val.in.in6.s6_addr));
|
||||
}
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -267,6 +267,20 @@ protected:
|
|||
*/
|
||||
virtual bool DoHeartbeat(double network_time, double current_time);
|
||||
|
||||
/**
|
||||
* Utility function for Readers - convert a string into a TransportProto
|
||||
*
|
||||
* @param proto the transport protocol
|
||||
*/
|
||||
TransportProto StringToProto(const string &proto);
|
||||
|
||||
/**
|
||||
* Utility function for Readers - convert a string into a Value::addr_t
|
||||
*
|
||||
* @param addr containing an ipv4 or ipv6 address
|
||||
*/
|
||||
threading::Value::addr_t StringToAddr(const string &addr);
|
||||
|
||||
private:
|
||||
// Frontend that instantiated us. This object must not be access from
|
||||
// this class, it's running in a different thread!
|
||||
|
|
|
@ -245,23 +245,6 @@ bool Ascii::GetLine(string& str) {
|
|||
return false;
|
||||
}
|
||||
|
||||
TransportProto Ascii::StringToProto(const string &proto) {
|
||||
if ( proto == "unknown" ) {
|
||||
return TRANSPORT_UNKNOWN;
|
||||
} else if ( proto == "tcp" ) {
|
||||
return TRANSPORT_TCP;
|
||||
} else if ( proto == "udp" ) {
|
||||
return TRANSPORT_UDP;
|
||||
} else if ( proto == "icmp" ) {
|
||||
return TRANSPORT_ICMP;
|
||||
}
|
||||
|
||||
//assert(false);
|
||||
|
||||
reporter->Error("Tried to parse invalid/unknown protocol: %s", proto.c_str());
|
||||
|
||||
return TRANSPORT_UNKNOWN;
|
||||
}
|
||||
|
||||
Value* Ascii::EntryToVal(string s, FieldMapping field) {
|
||||
|
||||
|
@ -309,20 +292,22 @@ Value* Ascii::EntryToVal(string s, FieldMapping field) {
|
|||
break;
|
||||
|
||||
case TYPE_SUBNET: {
|
||||
int pos = s.find("/");
|
||||
size_t pos = s.find("/");
|
||||
if ( pos == s.npos ) {
|
||||
Error(Fmt("Invalid value for subnet: %s", s.c_str()));
|
||||
return false;
|
||||
}
|
||||
int width = atoi(s.substr(pos+1).c_str());
|
||||
string addr = s.substr(0, pos);
|
||||
|
||||
IPAddr a(addr);
|
||||
val->val.subnet_val = new IPPrefix(a, width);
|
||||
|
||||
val->val.subnet_val.prefix = StringToAddr(addr);
|
||||
val->val.subnet_val.length = width;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
case TYPE_ADDR: {
|
||||
val->val.addr_val = new IPAddr(s);
|
||||
case TYPE_ADDR:
|
||||
val->val.addr_val = StringToAddr(s);
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_TABLE:
|
||||
case TYPE_VECTOR:
|
||||
|
|
|
@ -67,8 +67,6 @@ private:
|
|||
|
||||
bool HasFilter(int id);
|
||||
|
||||
TransportProto StringToProto(const string &proto);
|
||||
|
||||
bool ReadHeader(bool useCached);
|
||||
threading::Value* EntryToVal(string s, FieldMapping type);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue