|
From: <xb...@us...> - 2012-12-08 20:38:42
|
Revision: 1511
http://scstudio.svn.sourceforge.net/scstudio/?rev=1511&view=rev
Author: xborza
Date: 2012-12-08 20:38:34 +0000 (Sat, 08 Dec 2012)
Log Message:
-----------
corrected memory leaks (one is in pcap library)
chcek "tests/pcap" for pcap files
works on my Ubuntu...
Modified Paths:
--------------
trunk/src/data/pcap/application_layer.cpp
trunk/src/data/pcap/application_layer.h
trunk/src/data/pcap/ethernet_layer.cpp
trunk/src/data/pcap/flow.cpp
trunk/src/data/pcap/flow_stats.cpp
trunk/src/data/pcap/flow_stats.h
trunk/src/data/pcap/packet.h
trunk/src/data/pcap/pcap_handler.cpp
trunk/src/data/pcap/pcap_handler.h
trunk/src/data/pcap/pcap_load.cpp
trunk/src/data/pcap/pcap_settings.cpp
trunk/src/data/pcap/pcap_settings.h
trunk/src/data/pcap/protocols.h
trunk/src/data/pcap/transport_layer.cpp
trunk/src/data/pcap/transport_layer.h
trunk/tests/pcap/CMakeLists.txt
trunk/tests/pcap/pcap_test.cpp
Added Paths:
-----------
trunk/third-party-sw/pcap/pcap/
Modified: trunk/src/data/pcap/application_layer.cpp
===================================================================
--- trunk/src/data/pcap/application_layer.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/application_layer.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -118,15 +118,22 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void http_message_init(HttpMessage* message)
+void http_message_init(HttpMessagePtr message)
{
- memset(message,0,sizeof(*message));
+ //memset(message,0,sizeof(*message));
+ message->num_headers = 0;
+ message->body_called = false;
+ message->message_begin = false;
+ message->message_complete = false;
+ message->headers_complete = false;
+ message->status_code = 0;
+ message->data_size = 0;
message->type = UNKNOWN;
message->last_header_element = NOTHING;
}
// intilialise callback in settings
-void HttpPacket::set_http_settings(http_parser_settings* settings)
+void HttpPacket::set_http_settings(http_parser_settings_ptr settings)
{
settings->on_url = request_uri_cb;
settings->on_header_field = header_field_cb;
@@ -142,11 +149,12 @@
int HttpPacket::header_field_cb(http_parser *parser, const char *field, size_t len)
{
- HttpMessage* m = http_parsers[ports].message;
+ HttpMessagePtr m = http_parsers[ports].message;
if(m->last_header_element != FIELD){
// //New header started.Copy current name,value buffers to header list and allocate new buffer for new name
HttpHeader new_header;
new_header.value_len = 0;
+ new_header.value = "";
new_header.field_len = len;
new_header.field.assign(field,len);
m->headers.push_back(new_header);
@@ -164,7 +172,7 @@
int HttpPacket::header_value_cb(http_parser *parser, const char *value, size_t len)
{
- HttpMessage* m = http_parsers[ports].message;
+ HttpMessagePtr m = http_parsers[ports].message;
if(m->last_header_element != VALUE){
// Value for current header started. Allocate new buffer and copy callback data to it
@@ -232,7 +240,7 @@
int HttpPacket::message_begin_cb (http_parser *parser)
{
- http_parsers[ports].message->message_begin = true;
+ http_parsers[ports].message->message_begin = true;
return 0;
}
@@ -246,7 +254,7 @@
/////////////////////////////////////////////// HTTP CLASS //////////////////////////////////////////////////////////////
bool HttpPacket::set_settings;
-http_parser_settings* HttpPacket::settings;
+http_parser_settings_ptr HttpPacket::settings;
HttpSettings* HttpPacket::http_settings;
Ports HttpPacket::ports;
@@ -258,31 +266,35 @@
// set HTTP_PARSER_SETTINGS
if(!set_settings)
{
- settings = new http_parser_settings();
+ settings = http_parser_settings_ptr(new http_parser_settings());
set_http_settings(settings);
set_settings = true;
}
-
+ // set user defined settings
if(http_settings == NULL)
http_settings = http_set;
ports = p;
this->data_size = data_size;
- char buffer[80*1024];
+ char buffer[80*1024] = {0};
size_t nparsed;
bool is_new_packet = false;
bool erno = false;
// put data in buffer
- strncpy(buffer, (char*)data,80*1024);
+ if(data_size < 80*1024)
+ strncpy(buffer, (char*)data,data_size);
+ else
+ strncpy(buffer,(char*)data,80*1024-1);
if(http_parsers.find(ports) == http_parsers.end())
{
is_new_packet = true;
- parser = (http_parser*)malloc(sizeof(http_parser));
- http_parser_init(parser,HTTP_BOTH);
+ parser = http_parser_ptr(new http_parser());
+
+ http_parser_init(boost::get_pointer<http_parser>(parser),HTTP_BOTH);
// init message for parser
- HttpMessage* msg = new HttpMessage();
+ HttpMessagePtr msg(new HttpMessage());
http_message_init(msg);
// init pack for parser and message
http_parsers.insert(std::make_pair(ports,HttpParsePack(parser,msg)));
@@ -291,7 +303,6 @@
{ // check, if need reset parser and message
if(http_parsers[ports].message->message_complete)
{
- std::cout << "EEEE\n";
is_new_packet = true;
http_message_init(http_parsers[ports].message);
//http_parser_init(http_parsers[ports].parser,HTTP_BOTH);
@@ -299,20 +310,20 @@
parser = http_parsers[ports].parser;
}
// execute parser
- parser->data = (char*)data;
- nparsed = http_parser_execute(parser, settings, buffer, data_size);
- if (parser->upgrade){
- /* handle new protocol */
- std::cout << ">> NEW PROTO? <<\n";
+ parser->data = (char*)data;
+
+ nparsed = http_parser_execute(boost::get_pointer<http_parser>(parser), boost::get_pointer<http_parser_settings>(settings), buffer, data_size);
+ if (parser->upgrade){
+ erno = false;
}
- else if(nparsed != data_size){ // parser neprebehol do konca, neviem ci to je cely paket
+ else if(nparsed != data_size){ // parser neprebehol do konca, neviem ci to je cely paket
erno = true;
}
// set version, type and method or status code here
- HttpMessage* m = http_parsers[ports].message;
+ HttpMessagePtr m = http_parsers[ports].message;
m->data_size = data_size;
- if(m->type == UNKNOWN)
+ if(m->type == UNKNOWN)
{
// set version,method, status code, it
std::stringstream ver_string;
@@ -343,10 +354,10 @@
{
}
-void HttpPacket::set_http_part(HttpMessage* m,bool is_segment)
+void HttpPacket::set_http_part(HttpMessagePtr m,bool is_segment)
{
if(!is_segment){
- m->part = ONE_PACK_MSG;
+ m->part = ONE_PACK_MSG;
}
else
{
@@ -378,7 +389,7 @@
return label;
}
-void HttpPacket::set_label(HttpMessage* m)
+void HttpPacket::set_label(HttpMessagePtr m)
{
std::stringstream ss;
@@ -408,7 +419,7 @@
label = ss.str();
}
-HttpMessage* HttpPacket::get_http_message()
+HttpMessagePtr HttpPacket::get_http_message()
{
return http_parsers[ports].message;
}
@@ -483,7 +494,9 @@
ss << "SIP ";
if(!ok_parsed)
+ { ss << "not correct parsed";
return ss.str();
+ }
if(settings->show_version)
ss << "\\" << osip_message_get_version(sip) << " ";
Modified: trunk/src/data/pcap/application_layer.h
===================================================================
--- trunk/src/data/pcap/application_layer.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/application_layer.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -69,6 +69,8 @@
Ports get_ports();
};
+typedef boost::shared_ptr<DnsPacket> DnsPacketPtr;
+
/////////////////////////////////////////////// FOR HTTP_PARSING /////////////////////////////////////////////////
typedef enum {
@@ -130,22 +132,26 @@
bool message_complete;
};
+typedef boost::shared_ptr<HttpMessage> HttpMessagePtr;
+typedef boost::shared_ptr<http_parser> http_parser_ptr;
+typedef boost::shared_ptr<http_parser_settings>http_parser_settings_ptr;
+
// initialise HttpMessage for parser
-void http_message_init(HttpMessage* message);
+void http_message_init(HttpMessagePtr message);
struct HttpParsePack{ // parser had message, where it stores data
- http_parser* parser;
- HttpMessage* message;
+ http_parser_ptr parser;
+ HttpMessagePtr message;
HttpParsePack(){}
- HttpParsePack(http_parser* p,HttpMessage* m)
+ HttpParsePack(http_parser_ptr p,HttpMessagePtr m)
{
parser = p;
message = m;
}
-
};
+
class HttpPacket : public Packet
{
private:
@@ -153,20 +159,22 @@
u_short data_size;
static Ports ports;
+ // user defined settings
static HttpSettings* http_settings;
- http_parser* parser;
+ http_parser_ptr parser;
std::string label;
bool is_segment;
+ // http_parser settings from http_parser.h
static bool set_settings;
- static http_parser_settings* settings;
+ static http_parser_settings_ptr settings;
HttpPart part;
- void set_label(HttpMessage* msg);
- void set_http_part(HttpMessage* msg,bool is_segment);
+ void set_label(HttpMessagePtr msg);
+ void set_http_part(HttpMessagePtr msg,bool is_segment);
// initialise settings for parser
- void set_http_settings(http_parser_settings* settings);
+ void set_http_settings(http_parser_settings_ptr settings);
public:
// One parser per tcp connection <i, Parser+messageToStoreData>
@@ -181,20 +189,22 @@
short get_proto();
short get_upper_proto();
std::string get_upper_proto_name();
- std::string get_message();
+ std::string get_message();
Ports get_ports();
- HttpMessage* get_http_message();
+ HttpMessagePtr get_http_message();
//callbacks for parser
- static int header_field_cb(http_parser *parser, const char *field, size_t len);
- static int header_value_cb(http_parser *parser, const char *value, size_t len);
- static int request_uri_cb(http_parser *parser, const char *url, size_t len);
- static int headers_complete_cb (http_parser *parser);
- static int message_complete_cb (http_parser *parser);
- static int message_begin_cb (http_parser *parser);
- static int body_cb (http_parser *parser, const char *body, size_t len);
+ static int header_field_cb(http_parser* parser, const char *field, size_t len);
+ static int header_value_cb(http_parser* parser, const char *value, size_t len);
+ static int request_uri_cb(http_parser* parser, const char *url, size_t len);
+ static int headers_complete_cb (http_parser* parser);
+ static int message_complete_cb (http_parser* parser);
+ static int message_begin_cb (http_parser* parser);
+ static int body_cb (http_parser* parser, const char *body, size_t len);
};
+typedef boost::shared_ptr<HttpPacket> HttpPacketPtr;
+
///////////////////////////////////////////////////// FOR SIP ///////////////////////////////////////////////////////////////////////////
class SipPacket : public Packet
{
@@ -220,6 +230,10 @@
Ports get_ports();
};
+typedef boost::shared_ptr<SipPacket> SipPacketPtr;
+
+////////////////////////////////////////////////////////NOT IMPLEMENTED APPLICATION LAYER PACKETS///////////////////////////////////////////////////////////////////
+
class AppPacket : public Packet
{
u_char* data;
@@ -240,4 +254,6 @@
Ports get_ports();
};
+typedef boost::shared_ptr<AppPacket> AppPacketPtr;
+
#endif
Modified: trunk/src/data/pcap/ethernet_layer.cpp
===================================================================
--- trunk/src/data/pcap/ethernet_layer.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/ethernet_layer.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -82,7 +82,7 @@
std::string EthernetPacket::get_message()
{
- return "ETHERNET";
+ return "Ethernet II.";
}
Ports EthernetPacket::get_ports()
Modified: trunk/src/data/pcap/flow.cpp
===================================================================
--- trunk/src/data/pcap/flow.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/flow.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -13,7 +13,8 @@
FlowControl::~FlowControl()
{
- delete time_flow;
+ if(time_flow != NULL)
+ delete time_flow;
}
flow_output FlowControl::get_begin_flowout(msg_id m_id,int pckt_id,double time)
Modified: trunk/src/data/pcap/flow_stats.cpp
===================================================================
--- trunk/src/data/pcap/flow_stats.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/flow_stats.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -32,7 +32,7 @@
return result;
}
}
- else // can parse, but I don't need higher --> I get transport protocol from IP, IP from Ethernet ...
+ else // can parse, but I don't need higher --> I get transport protocol from IP layer, IP from Ethernet layer
{
result.level = (FlowLevel)(packet_level + 1);
result.proto = packet->get_upper_proto();
@@ -40,8 +40,8 @@
return result;
}
}
- else // { > } ON Transport parse layer // I don't now what I exactly need
- {
+ else // { > } ON Transport parse layer // ON this layer I can apply APP_PROTO || TRANS_PROTO(IF not apply data! else trans proto get from net_layer) || PORT FLOW
+ { // LINK LAYER -> use default pcaket_level == f_settings->level
switch(f_settings->level)
{
case(APP_PROTO_FLOW): // check it there are application data
@@ -72,7 +72,7 @@
if(!(settings->is_aggregation_active(agr_level))) // this aggregation is not active
return result;
- result.level = agr_level;
+ result.level = agr_level;
result.ports = packet->get_ports();
TcpPacket* tcp_p = NULL;
@@ -89,7 +89,7 @@
result.http_msg = http_p->get_http_message();
break;
case SIP_RTP_STREAM :
- result.explicit_flush = sip_flush;
+ result.explicit_flush = sip_flush;
break;
default : break;
}
Modified: trunk/src/data/pcap/flow_stats.h
===================================================================
--- trunk/src/data/pcap/flow_stats.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/flow_stats.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -36,12 +36,10 @@
Ports ports;
// for some additional informations in SMART FLOW
- union
- {
- HttpMessage* http_msg; // for HTTP
- TcpFlowItem* tcp_flow_item; // for TCP
- bool explicit_flush; // for sip
- };
+ HttpMessagePtr http_msg; // for HTTP
+ TcpFlowItemPtr tcp_flow_item; // for TCP
+ bool explicit_flush; // for sip
+
// how much data was sent?
short data_size; // B
Modified: trunk/src/data/pcap/packet.h
===================================================================
--- trunk/src/data/pcap/packet.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/packet.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -29,8 +29,8 @@
class Packet
{
public:
- virtual ~Packet(){};
- virtual u_short get_data_size() = 0;
+ virtual ~Packet(){}
+ virtual u_short get_data_size() = 0;
virtual u_char* get_upper_data() = 0;
virtual u_short get_upper_data_size() = 0;
virtual short get_proto() = 0;
@@ -41,4 +41,4 @@
};
-#endif
\ No newline at end of file
+#endif
Modified: trunk/src/data/pcap/pcap_handler.cpp
===================================================================
--- trunk/src/data/pcap/pcap_handler.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/pcap_handler.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -49,7 +49,10 @@
PcapHandler::~PcapHandler()
{
-
+ if(this->flow_control != NULL)
+ {
+ delete this->flow_control;
+ }
}
MscPtr PcapHandler::getMsc(){
@@ -124,7 +127,7 @@
// Add absolute time
i.insert(MscTimeInterval<double>(time));
- new_e->add_absolut_time(i); // if there are relative times, it's only help time and should be removed [ its in abs_time_events]
+ new_e->add_absolut_time(i); // if there are relative times, it's only help time and should be removed [ it's in abs_time_events]
abs_time_events.push_back(new_e);
}
@@ -144,12 +147,14 @@
std::cout << "Key " << id << " not in events map\n";
return 1;
}
- // remove from map
+
+ EventPtr e1 = event_iter->second;
+ EventPtr e2 = mes_id.destin_pair.second->get_last()->add_event();
+
+ // remove from map -- handle boost
+ event_iter->second = NULL;
events_map.erase(id);
- EventPtr e1 = event_iter->second;
- EventPtr e2 = mes_id.destin_pair.second->get_last()->add_event();
-
add_new_message(e1,e2,msg_end.label,msg_end.time,false);
return 0;
}
@@ -200,7 +205,7 @@
dst_e->add_absolut_time(i);
abs_time_events.push_back(dst_e);
- if(set_all_times /*|| settings->time_format == REL_TIME*/) // else it was set in flow_event allready
+ if(set_all_times)
{
src_e->add_absolut_time(i);
abs_time_events.push_back(src_e);
@@ -251,35 +256,36 @@
instance_iter = instance_map.find(address);
if(instance_iter == instance_map.end())
- {
- InstancePtr inst = NULL;
- return std::make_pair(-1,inst);
- }
+ {
+ InstancePtr inst = NULL;
+ return std::make_pair(-1,inst);
+ }
else return instance_iter->second;
}
-void PcapHandler::packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data){
+void PcapHandler::packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
+{
handStruct* hands = (handStruct*)param;
- PcapHandler* pcap = hands->pcap;
packet_id++; // increase with every packet
- //std::cout << "Packet " << packet_id << "\n";
-
timeval pom_timestamp; // in user set data units
double timestamp;
+
//initialise ZERO TIMESTAMP
- if(zero_time.tv_sec == 0)
+ if(zero_time.tv_sec == 0 && zero_time.tv_usec == 0)
{
zero_time.tv_sec = header->ts.tv_sec;
zero_time.tv_usec = header->ts.tv_usec;
}
+
//get relative timestamp in microseconds
pom_timestamp.tv_sec = header->ts.tv_sec - zero_time.tv_sec;
pom_timestamp.tv_usec = header->ts.tv_usec - zero_time.tv_usec;
- timestamp = settings->timeval_to_double(pom_timestamp);
+ // two succesive times can't be equal --> change number of decimal digits
+ timestamp = settings->timeval_to_double(pom_timestamp);
std::stringstream all_info;
@@ -341,8 +347,8 @@
case ARP:
net_p = new ArpPacket(eth_p->get_upper_data(),eth_p->get_upper_data_size());
arp_p = (ArpPacket*)net_p;
- source = arp_p->get_src_address();
- destination = arp_p->get_dst_address();
+ //source = arp_p->get_src_address();
+ //destination = arp_p->get_dst_address();
break;
default:
net_p = new NetPacket(eth_p->get_upper_data(),eth_p->get_upper_data_size(),eth_p->get_upper_proto());
@@ -365,7 +371,7 @@
delete net_p;
return;
}
- all_info <<"I"<< settings->get_message_label(packet_id,net_p,all_info.str(),false) << "I";
+ all_info <<" I "<< settings->get_message_label(packet_id,net_p,all_info.str(),false);
// ------------------- TRANSPORT LAYER ----------------------------------------------------
Ports ports;
@@ -410,7 +416,7 @@
delete trans_p;
return;
}
- all_info <<"I"<< settings->get_message_label(packet_id,trans_p,all_info.str(),false);
+ all_info <<" I "<< settings->get_message_label(packet_id,trans_p,all_info.str(),false);
// -------------- APPLICATION LAYER -----------------------------------------------------------
Packet* app_p = NULL;
@@ -418,7 +424,7 @@
switch(trans_p->get_upper_proto())
{
case(HTTP):
- app_p = new HttpPacket(trans_p->get_upper_data(),trans_p->get_upper_data_size(),ports,settings->adv_settings->http_settings);
+ app_p = new HttpPacket(trans_p->get_upper_data(),trans_p->get_upper_data_size(),ports,settings->adv_settings->http_settings);
sp_data = fill_specdata(settings,app_p,NO_FLOW,HTTP_AGGR);
break;
case(SIP):
@@ -435,7 +441,7 @@
if(is_udp && (ports.src % 2 == 0) && (ports.dst % 2 == 0) && ((trans_p->get_upper_data())[0] & 0x80) && trans_p->get_upper_data_size() < 250)
{
app_p = new AppPacket(trans_p->get_upper_data(),trans_p->get_upper_data_size(),ports,RTP);
- sp_data = fill_specdata(settings,app_p,NO_FLOW,SIP_RTP_STREAM,false);
+ sp_data = fill_specdata(settings,app_p,NO_FLOW,SIP_RTP_STREAM,false); //aggreg RTP stream
}
else
{
@@ -443,18 +449,18 @@
sp_data = fill_specdata(settings,app_p,NO_FLOW,NO_AGGR);
}
break;
- }
- if(settings->parse_layer == APP_LAYER) // parsed all !!!
- {
- label = settings->get_message_label(packet_id,app_p,all_info.str(),true);
- delete eth_p;
- delete net_p;
- delete trans_p;
- delete app_p;
- hands->pcap->diagram_update(packet_id,source,destination,label,timestamp,sp_data);
- return;
- }
- //pcap_breakloop(hands->handle);
+ }
+ if(settings->parse_layer == APP_LAYER) // parsed all !!!
+ {
+ label = settings->get_message_label(packet_id,app_p,all_info.str(),true);
+ delete eth_p;
+ delete net_p;
+ delete trans_p;
+ delete app_p;
+ hands->pcap->diagram_update(packet_id,source,destination,label,timestamp,sp_data);
+ return;
+ }
+ //pcap_breakloop(hands->handle);
}
Modified: trunk/src/data/pcap/pcap_handler.h
===================================================================
--- trunk/src/data/pcap/pcap_handler.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/pcap_handler.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -46,8 +46,8 @@
void last_diagram_update();
void diagram_update(int pckt_id,std::string src,std::string dst,std::string label,double timestamp = 0,SpecData flow_data = SpecData());
void add_new_message(EventPtr src_e,EventPtr dst_e,std::string label,double timestamp = 0,bool set_all_times = true);
- num_inst_pair create_instance(std::string address);
- num_inst_pair get_num_inst(std::string address);
+ num_inst_pair create_instance(std::string address);
+ num_inst_pair get_num_inst(std::string address);
};
typedef struct handStruct{
Modified: trunk/src/data/pcap/pcap_load.cpp
===================================================================
--- trunk/src/data/pcap/pcap_load.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/pcap_load.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -26,7 +26,6 @@
std::vector<MscPtr> Pcap::load_msc(const std::string &filename)
{
- std::vector<MscPtr> result;
PcapSettings* settings = new PcapSettings();
settings->load_registry();
@@ -40,7 +39,6 @@
settings->validate_settings();
-int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
@@ -55,15 +53,15 @@
// OPEN OFFLINE MODE
if((adhandle = pcap_open_offline(filename.c_str(),errbuf)) == NULL)
{
- std::cerr << "ERROR: Cannot open pcap file >" << filename << " < , wrong name!\n";
+ print_report(RS_ERROR, stringize() << "Cannot open pcap file '" << TOWSTRING(filename) << "'. ");
return result;
}
/* Check the link layer. We support only Ethernet for simplicity. */
if(pcap_datalink(adhandle) != DLT_EN10MB)
{
- std::cerr << "This program works only on Ethernet networks.\n";
- return result;
+ print_report(RS_ERROR,stringize() << "Pcap works only on Ethernet networks" );
+ return result;
}
/* If the interface is without addresses we suppose to be in a C class network */
@@ -72,31 +70,35 @@
//compile the filter
if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
{
- std::cerr << "\nUnable to compile the packet filter:" << packet_filter << " Check the syntax.\n";
+ print_report(RS_ERROR,stringize() << "Unable to compile the packet filter:" << TOWSTRING(packet_filter) << " Check the syntax.");
return result;
}
//set the filter
if (pcap_setfilter(adhandle, &fcode)<0)
{
- std::cerr << "\nError setting the filter.\n";
+ print_report(RS_ERROR,stringize() << "Error setting the filter");
return result;
}
//---------------------------------------------------------------------------------------------
- PcapHandler* pcapCon = new PcapHandler(settings);
+ PcapHandler* pcapHandler = new PcapHandler(settings);
//---------------------------------------------------------------------------------------------
handStruct hands;
- hands.pcap = pcapCon;
+ hands.pcap = pcapHandler;
hands.handle = adhandle;
- pcap_loop(adhandle, 0, PcapHandler::packet_handler, (u_char*)&hands);
+ pcap_loop(adhandle, 0, PcapHandler::packet_handler, (u_char*)&hands);
// for aggregation buffer flush
hands.pcap->last_diagram_update();
result.push_back(hands.pcap->getMsc());
- delete settings;
- delete pcapCon;
+ pcap_freecode(&fcode);
+ pcap_close(adhandle);
+
+ delete settings;
+ delete pcapHandler;
+
return result;
}
Modified: trunk/src/data/pcap/pcap_settings.cpp
===================================================================
--- trunk/src/data/pcap/pcap_settings.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/pcap_settings.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -1,40 +1,10 @@
#include "pcap_settings.h"
#include <iostream>
-#include <math.h>
-double round(double x, int prec)
+double round(double num, int prec)
{
- double power = 1.0;
- int i;
-
- if (prec > 0)
- {
- for (i = 0; i < prec; i++)
- {
- power *= 10.0;
- }
- }
- else if (prec < 0)
- {
- for (i = 0; i < prec; i++)
- {
- power /= 10.0;
- }
- }
-
- if(x > 0)
- {
- x = floor(x * power + 0.5) / power;
- }
- else if(x < 0)
- {
- x = ceil(x * power - 0.5) / power;
- }
-
- if (x == -0)
- x = 0;
-
-return x;
+ double result = floor((num * pow(10,prec) + 0.5)) / pow(10,prec);
+ return result;
}
void PcapSettings::validate_settings()
@@ -108,16 +78,16 @@
double PcapSettings::timeval_to_double(timeval ts)
{
- double result;
+ double result,pom;
switch(time_unit)
{
- case SECONDS: result = ts.tv_sec + (double)ts.tv_usec/1000000; break;
- case MILISECONDS: result = ts.tv_sec*1000 + (double)ts.tv_usec/1000; break;
- case MICROSECONDS: result = ts.tv_sec*1000000 + (double)ts.tv_usec; break;
+ case SECONDS: pom = ts.tv_sec + (double)ts.tv_usec/1000000; result = round(pom,6); break;
+ case MILISECONDS: pom = ts.tv_sec*1000 + (double)ts.tv_usec/1000; result = round(pom,3); break;
+ case MICROSECONDS: pom = ts.tv_sec*1000000 + (double)ts.tv_usec; result = pom; break;
default : break;
}
- result = round(result,3);
- return result;
+ //std::cout << std::fixed << std::setprecision(9) << result << "\n";
+ return result;
}
double PcapSettings::bytes_to_user_unit(u_short bytes)
@@ -125,8 +95,8 @@
double result;
if(data_unit == BITS)
result = bytes*8;
- else
- result = bytes/data_unit;
+ else
+ result = bytes/data_unit;
result = round(result,2);
return result;
Modified: trunk/src/data/pcap/pcap_settings.h
===================================================================
--- trunk/src/data/pcap/pcap_settings.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/pcap_settings.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -2,11 +2,14 @@
#define PCAP_SETTINGS_INCLUDED
#include <stdlib.h>
+#include <ios>
#include <pcap.h>
+#include <math.h>
#include "packet.h"
#include <boost/shared_ptr.hpp>
#include "data/configurator.h"
#include <sstream>
+#include <iomanip>
double round(double x, int prec);
@@ -157,7 +160,7 @@
typedef enum
{
- LINK_LAYER = 0,
+ LINK_LAYER = 0,
NET_LAYER,
TRANSPORT_LAYER,
APP_LAYER
@@ -170,26 +173,14 @@
} TimeFormat;
// SET THE FILTER
-static const char* sip_filter = "(tcp || udp) && (port 5060 || port 5061)";
+/*static const char* sip_filter = "(tcp || udp) && (port 5060 || port 5061)";
static const char* tcp_filter = "tcp";
static const char* http_filter = "tcp port 80";
static const char* no_filter = "";
-static const char* naive_rtp_filter = "udp[1] & 1 != 1 && udp[3] & 1 != 1 && udp[8] & 0x80 == 0x80 && length < 250";
+static const char* naive_rtp_filter = "udp[1] & 1 != 1 && udp[3] & 1 != 1 && udp[8] & 0x80 == 0x80 && length < 250";*/
-
-// config provider
-class PcapConfigProvider : public ConfigProvider
-{
-public:
- virtual long get_config_long(const std::wstring& section, const std::wstring& parameter, long def = 0) const
- { return def; }
- virtual float get_config_float(const std::wstring& section, const std::wstring& parameter, float def = 0.0f) const
- { return def; }
-};
-
class PcapSettings : public ConfigReader
{
- PcapConfigProvider pcp;
public:
bool show_timestamps;
@@ -207,24 +198,22 @@
PcapSettings() // not set pointer to other settings [view,advanced,flow]
{
- set_config_provider(&pcp);
show_timestamps = true;
time_unit = MILISECONDS;
time_format = ABS_TIME;
data_unit = BYTES;
- pcap_filter = no_filter;
+ pcap_filter = "";
parse_layer = NET_LAYER;
ignore_packets = false;
}
PcapSettings(ViewSettings* view_set,AdvancedSettings* adv_set,AggregSettings* flow_set = NULL)
{
- set_config_provider(&pcp);
show_timestamps = true;
time_unit = MILISECONDS;
time_format = ABS_TIME;
data_unit = BYTES;
- pcap_filter = no_filter;
+ pcap_filter = "";
parse_layer = APP_LAYER;
ignore_packets = false;
flow_settings = NULL;
@@ -237,7 +226,7 @@
void validate_settings();
double bytes_to_user_unit(u_short bytes);
- double timeval_to_double(timeval ts);
+ double timeval_to_double(timeval ts);
std::string get_message_label(int packet_id,Packet* packet,std::string all_info,bool append_all_info);
bool is_aggregation_active();
bool is_aggregation_active(FlowLevel level);
@@ -251,4 +240,4 @@
};
-#endif
\ No newline at end of file
+#endif
Modified: trunk/src/data/pcap/protocols.h
===================================================================
--- trunk/src/data/pcap/protocols.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/protocols.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -51,9 +51,9 @@
static std::string get_hex(int value)
{
- std::stringstream ss;
- ss << std::hex << value;
- return ss.str();
+ std::stringstream ss;
+ ss << std::hex << value;
+ return ss.str();
}
#define GET_NET_NAME(type) (type < 0 || (net_names.find(type) == net_names.end()) ? get_hex(type) : (net_names.find(type))->second)
@@ -202,8 +202,8 @@
static const std::map<int,const char*> ports_names = boost::assign::map_list_of
(20,"FTP_T") // File Transfer Protocol - data transfer
- (21,"FTP_C") // File Transfer Protocol - control (command)
- (22,"SSH") // Secure Shell
+ (21,"FTP_C") // File Transfer Protocol - control (command)
+ (22,"SSH") // Secure Shell
(23,"TELNET") // Tellenet remote login service
(25,"SMTP") // Simple mail trnasfer protocol
(53,"DNS") // Domain name system
@@ -232,4 +232,4 @@
#define GET_PORT_NAME(port) (port < 0 || (ports_names.find(port) == ports_names.end()) ? boost::lexical_cast<std::string>(port) : (ports_names.find(port))->second)
-#endif
\ No newline at end of file
+#endif
Modified: trunk/src/data/pcap/transport_layer.cpp
===================================================================
--- trunk/src/data/pcap/transport_layer.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/transport_layer.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -54,7 +54,7 @@
segment = (data_contains && !first_packet && seq_item.data && seq_item.last_ack_num == ack_num);
is_segment_ack = (!data_contains && !first_packet && !seq_item.data && seq_item.last_seq_num == seq_num);
// create message for FLOW
- tcp_flow_item = new TcpFlowItem(flags,data_contains,segment,is_segment_ack,seq_num,ack_num);
+ tcp_flow_item = TcpFlowItemPtr(new TcpFlowItem(flags,data_contains,segment,is_segment_ack,seq_num,ack_num));
if(flags.count(SYN) == 1 && flags.count(ACK) == 1)
{
@@ -85,7 +85,7 @@
}
-TcpFlowItem* TcpPacket::get_tcp_flow_item()
+TcpFlowItemPtr TcpPacket::get_tcp_flow_item()
{
return tcp_flow_item;
}
Modified: trunk/src/data/pcap/transport_layer.h
===================================================================
--- trunk/src/data/pcap/transport_layer.h 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/src/data/pcap/transport_layer.h 2012-12-08 20:38:34 UTC (rev 1511)
@@ -56,7 +56,8 @@
SeqItem(){}
- SeqItem(bpf_u_int32 seq, bpf_u_int32 ack,std::set<TcpFlag> flags,bool data_contains,bool direction){
+ SeqItem(bpf_u_int32 seq, bpf_u_int32 ack,std::set<TcpFlag> flags,bool data_contains,bool direction)
+ {
init_seq_num = last_seq_num = seq;
init_ack_num = last_ack_num = ack;
last_flags = flags;
@@ -86,6 +87,8 @@
}
};
+typedef boost::shared_ptr<TcpFlowItem> TcpFlowItemPtr;
+
// TCP HEADER
typedef struct TcpHdr
{
@@ -99,18 +102,18 @@
u_char data_off:4; // data offset
u_char reserved:4; // reserved
#else
- u_char reserved:4; // reserved
+ u_char reserved:4; // reserved
u_char data_off:4; // data offset = tells where the data begins (in 32-bits words)
#endif
- u_char fin :1; //Finish Flag
- u_char syn :1; //Synchronise Flag
- u_char rst :1; //Reset Flag
- u_char psh :1; //Push Flag
- u_char ack :1; //Acknowledgement Flag
- u_char urg :1; //Urgent Flag
- u_char ecn :1; //ECN-Echo Flag
- u_char cwr :1; //Congestion Window Reduced Flag
+ u_char fin :1; //Finish Flag
+ u_char syn :1; //Synchronise Flag
+ u_char rst :1; //Reset Flag
+ u_char psh :1; //Push Flag
+ u_char ack :1; //Acknowledgement Flag
+ u_char urg :1; //Urgent Flag
+ u_char ecn :1; //ECN-Echo Flag
+ u_char cwr :1; //Congestion Window Reduced Flag
u_short window; // Flowing window (16 bits)
u_short crc; // Checksum (16 bits)
@@ -133,7 +136,7 @@
*/
bool segment;
bool is_segment_ack; // ack flag for segment acknowledgment
- TcpFlowItem* tcp_flow_item;
+ TcpFlowItemPtr tcp_flow_item;
static TcpSettings* tcp_settings;
//map of unique TCP CONNECTIONS and std::pair<Source port,<initial Seq and Ack>>
@@ -153,8 +156,8 @@
std::string get_message();
Ports get_ports();
- TcpFlowItem* get_tcp_flow_item();
- std::set<TcpFlag> get_flag();
+ TcpFlowItemPtr get_tcp_flow_item();
+ std::set<TcpFlag> get_flag();
};
////////////////////////////////////////// UDP ////////////////////////////////////////////
Modified: trunk/tests/pcap/CMakeLists.txt
===================================================================
--- trunk/tests/pcap/CMakeLists.txt 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/tests/pcap/CMakeLists.txt 2012-12-08 20:38:34 UTC (rev 1511)
@@ -1,9 +1,8 @@
FIND_PACKAGE(PythonInterp REQUIRED)
-ADD_EXECUTABLE(pcap_test
+ADD_EXECUTABLE(pcap_test
pcap_test.cpp
)
-
INCLUDE_DIRECTORIES(${PCAP_INCLUDE_DIR} ${OSIP_ROOT}/include ${HTTP_ROOT})
TARGET_LINK_LIBRARIES(pcap_test
@@ -13,19 +12,3 @@
scZ120
)
-#GET_TARGET_PROPERTY(MEMBERSHIP_TEST_EXECUTABLE membership_test LOCATION)
-# Replace the "$(IntDir)", "$(OutDir)", or "$(CONFIGURATION)"
-# depending on the generator being used with the test-time variable.
-#STRING(REGEX REPLACE "\\$\\(.*\\)" "\${CTEST_CONFIGURATION_TYPE}"
-# MEMBERSHIP_TEST_EXECUTABLE "")
-
-#partial membership
-#ADD_TEST("membership_test-0-partial_mem_easy_pat1.mpr"
-# ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/tests/membership/membership_diff.py"
-# "./membership_test" "${CMAKE_CURRENT_SOURCE_DIR}/partial_mem_easy.mpr"
-# "${CMAKE_CURRENT_SOURCE_DIR}/partial_mem_easy_pat1.mpr" 1 "A")
-
-#ADD_MEMBER_TEST(test_hmsc01.mpr test_bmsc01.mpr 1)
-#ADD_MEMBER_TEST(test_hmsc02.mpr test_bmsc02.mpr 0)
-#ADD_MEMBER_TEST(test_hmsc03.mpr test_bmsc03.mpr 1)
-#ADD_MEMBER_TEST(test_hmsc04.mpr test_bmsc04.mpr 0)
Modified: trunk/tests/pcap/pcap_test.cpp
===================================================================
--- trunk/tests/pcap/pcap_test.cpp 2012-12-06 19:40:09 UTC (rev 1510)
+++ trunk/tests/pcap/pcap_test.cpp 2012-12-08 20:38:34 UTC (rev 1511)
@@ -21,7 +21,7 @@
#include <iostream>
#include <fstream>
#include <boost/lexical_cast.hpp>
-#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include "data/Z120/z120.h"
@@ -49,20 +49,20 @@
PcapSettings* get_settings(const std::string &filename)
{
PcapSettings* settings = new PcapSettings();
- boost::property_tree::ptree pt;
- boost::property_tree::ini_parser::read_ini(filename, pt);
- // read general settings
- settings->pcap_filter = pt.get<std::string>("GeneralSettings.PcapFilter");
- settings->parse_layer = (ParseLayer)pt.get<int>("GeneralSettings.ParseLayer");
- settings->show_timestamps = pt.get<bool>("GeneralSettings.ShowTimestamps");
- settings->time_format = (TimeFormat)pt.get<int>("GeneralSettings.TimeFormat");
- settings->time_unit = pt.get<int>("GeneralSettings.TimeUnit");
- settings->data_unit = pt.get<int>("GeneralSettings.DataUnit");
-
- // read view settings
- ViewSettings* view_set = new ViewSettings();
- view_set->show_all_layers_info = pt.get<bool>("ViewSettings.AllLayersInfo");
- view_set->ignore_packets = pt.get<bool>("ViewSettings.IgnorePackets");
+ boost::property_tree::ptree pt;
+ boost::property_tree::ini_parser::read_ini(filename, pt);
+ // read general settings
+ settings->pcap_filter = pt.get<std::string>("GeneralSettings.PcapFilter");
+ settings->parse_layer = (ParseLayer)pt.get<int>("GeneralSettings.ParseLayer");
+ settings->show_timestamps = pt.get<bool>("GeneralSettings.ShowTimestamps");
+ settings->time_format = (TimeFormat)pt.get<int>("GeneralSettings.TimeFormat");
+ settings->time_unit = pt.get<int>("GeneralSettings.TimeUnit");
+ settings->data_unit = pt.get<int>("GeneralSettings.DataUnit");
+
+ // read view settings
+ ViewSettings* view_set = new ViewSettings();
+ view_set->show_all_layers_info = pt.get<bool>("ViewSettings.AllLayersInfo");
+ view_set->ignore_packets = pt.get<bool>("ViewSettings.IgnorePackets");
view_set->show_data_size = pt.get<bool>("ViewSettings.DataSize");
view_set->show_packets_numbers = pt.get<bool>("ViewSettings.PacketNumber");
view_set->show_upper_proto = pt.get<bool>("ViewSettings.EncapsulatedProto");
@@ -113,7 +113,6 @@
return 1;
}
- std::ofstream outFile;
Pcap pcap;
Z120 z120;
@@ -122,9 +121,9 @@
int errors = 0;
- //PcapSettings* settings;
- //settings = get_settings(argv[1]);
- std::vector<MscPtr> msc = pcap.load_msc(argv[2]/*,settings*/);
+ PcapSettings* settings;
+ settings = get_settings(argv[1]);
+ std::vector<MscPtr> msc = pcap.load_msc(argv[2],settings);
char *path = strdup(argv[2]);
char *filename = extract_filename(path);
@@ -142,8 +141,8 @@
}
}
- //free(path);
- // free(filename);
+ free(path);
+ //free(filename);
return errors;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|