#include "mgenEvent.h" #include "mgen.h" // for Mgen::SCRIPT_LINE_MAX #include #include #include #include // for toupper() MgenBaseEvent::MgenBaseEvent(Category theCategory) : category(theCategory), event_time(-1.0), prev(NULL), next(NULL) { } MgenEvent::MgenEvent() : MgenBaseEvent(MGEN), flow_id(0), event_type(INVALID_TYPE), src_port(0), protocol(INVALID_PROTOCOL), tos(0), ttl(255), option_mask(0) { interface_name[0] = '\0'; flow_label = 0; } const StringMapper MgenEvent::TYPE_LIST[] = { {"ON", ON}, {"MOD", MOD}, {"OFF", OFF}, {"XXXX", INVALID_TYPE} }; MgenEvent::Type MgenEvent::GetTypeFromString(const char* string) { // Make comparison case-insensitive char upperString[16]; unsigned int len = strlen(string); len = len < 15 ? len : 15; unsigned int i; for (i =0 ; i < len; i++) upperString[i] = toupper(string[i]); upperString[i] = '\0'; const StringMapper* m = TYPE_LIST; unsigned matchCount = 0; Type eventType = INVALID_TYPE; while (INVALID_TYPE != (*m).key) { if (!strncmp(upperString, (*m).string, len)) { matchCount++; eventType = ((Type)((*m).key)); } m++; } if (matchCount > 1) { DMSG(0, "MgenEvent::GetTypeFromString() Error: ambiguous event type\n"); return INVALID_TYPE; } else { return eventType; } } // end MgenEvent::GetTypeFromString() const StringMapper MgenBaseEvent::PROTOCOL_LIST[] = { {"UDP", UDP}, {"TCP", TCP}, {"SINK", SINK}, {"XXX", INVALID_PROTOCOL} }; MgenBaseEvent::Protocol MgenBaseEvent::GetProtocolFromString(const char* string) { // Make comparison case-insensitive char upperString[16]; unsigned int len = strlen(string); len = len < 15 ? len : 15; unsigned int i; for (i =0 ; i < len; i++) upperString[i] = toupper(string[i]); upperString[i] = '\0'; unsigned int matchCount = 0; Protocol protocolType = INVALID_PROTOCOL; const StringMapper* m = PROTOCOL_LIST; while (INVALID_PROTOCOL != (*m).key) { if (!strncmp(upperString, (*m).string, len)) { protocolType = ((Protocol)((*m).key)); matchCount++; } m++; } if (matchCount > 1) { DMSG(0, "Event::GetProtocolFromString() Error: ambiguous protocol\n"); return INVALID_PROTOCOL; } else { return protocolType; } } // end MgenBaseEvent::GetProtocolFromString() const char* MgenBaseEvent::GetStringFromProtocol(MgenBaseEvent::Protocol protocol) { const StringMapper* m = PROTOCOL_LIST; while (INVALID_PROTOCOL != (*m).key) { if (protocol == (*m).key) return (*m).string; } return "UNKNOWN"; } // end MgenBaseEvent::GetStringFromProtocol() const StringMapper MgenEvent::OPTION_LIST[] = { {"PROTOCOL", PROTOCOL}, {"DST", DST}, {"SRC", SRC}, {"PATTERN", PATTERN}, {"TOS", TOS}, {"RSVP", RSVP}, {"INTERFACE", INTERFACE}, {"TTL", TTL}, {"SEQUENCE", SEQUENCE}, {"LABEL",LABEL}, {"TXBUFFER",TXBUFFER}, {"XXXX", INVALID_OPTION} }; const unsigned int MgenEvent::ON_REQUIRED_OPTIONS = (MgenEvent::PROTOCOL | MgenEvent::DST | MgenEvent::PATTERN); MgenEvent::Option MgenEvent::GetOptionFromString(const char* string) { // Make comparison case-insensitive char upperString[16]; unsigned int len = strlen(string); len = len < 15 ? len : 15; unsigned int i; for (i =0 ; i < len; i++) upperString[i] = toupper(string[i]); upperString[i] = '\0'; unsigned int matchCount = 0; Option optionType = INVALID_OPTION; const StringMapper* m = OPTION_LIST; while (INVALID_OPTION != (*m).key) { if (!strncmp(upperString, (*m).string, len)) { optionType = ((Option)((*m).key)); matchCount++; } m++; } if (matchCount > 1) { DMSG(0, "MgenEvent::GetOptionFromString() Error: ambiguous option\n"); return INVALID_OPTION; } else { return optionType; } } // end MgenEvent::GetOptionFromString() const char* MgenEvent::GetStringFromOption(Option option) { const StringMapper* m = OPTION_LIST; while (INVALID_OPTION != m->key) { if (option == (Option)(m->key)) return m->string; else m++; } return "INVALID"; } // end MgenEvent::GetStringFromOption() bool MgenEvent::InitFromString(const char* string) { // format: