Article View: pl.comp.os.linux.programowanie
Article #72345lpcap i 100% obciążenia procesora
From: Jarek
Date: Fri, 23 Sep 2011 09:33
Date: Fri, 23 Sep 2011 09:33
78 lines
3146 bytes
3146 bytes
Witam
Chciałem napisać swojego "tcpdumpa" przy pomocy biblioteki lpcap ale co
bym nie robił (z filtrami lub bez) mam 100% obciążenia procesora.
Odpalony na tej samej maszynie tcpdump w postaci: "tcpdump -i eth1 -n"
bez dodatkowych filtrów daje 16% obciążenia, a z filtrem "tcpdump -i
eth1 -n port 25 and tcp[13] == 2" 0%.
Poniżej okrojone do najważniejszego źródło programu, procedura
my_callback() okrojona do postaci jak poniżej i niestety wciąż mam 100%
zajętości procesora.
Komp to 4 rdzeniowy Intel(R) Xeon(R) CPU E5420 @ 2.50GHz, pracuje jako
router i forwarduje 300Mbps ruchu w obu kierunkach z natem i innymi
pierdołami - aczkolwiek nie powinno to mieć znaczenia skoro sam tcpdump
śmiga.
pozdrawiam
Jarek
void my_callback(u_char *args,const struct pcap_pkthdr* pkthdr,const
u_char* packet)
{
}
int main(int argc, char **argv)
{
char *dev="eth1";
char buff[80];
char *filter=NULL;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
struct bpf_program fp; /* hold compiled program */
bpf_u_int32 maskp; /* subnet mask */
bpf_u_int32 netp; /* ip */
u_char* args = NULL;
int a=0, b, c, options;
int pkt_count=1, output_count=MAXCOUNT;
....
if(filter!=NULL)
printf("Dumping %d packets from %s with filter
\"%s\"\n",pkt_count, dev,fi
else
printf("Dumping %d packets from %s\n",pkt_count, dev);
pcap_lookupnet(dev,&netp,&maskp,errbuf);
/* open device for reading. NOTE: defaulting to
* promiscuous mode*/
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf); exit(1);
}
...
if(filter!=NULL)
{
/* Lets try and compile the program.. non-optimized */
if(pcap_compile(descr,&fp,filter,0,netp) == -1)
{ fprintf(stderr,"Error calling pcap_compile\n"); exit(1); }
/* set the compiled program as the filter */
if(pcap_setfilter(descr,&fp) == -1)
{ fprintf(stderr,"Error setting filter\n"); exit(1); }
}
/* ... and loop */
pcap_loop(descr,pkt_count,my_callback,NULL);
return 0;
}
Technical Details
Message-ID:
<j5hjsi$pl2$1@mx1.internetia.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!not-for-mail From: Jarek <jarek@fake.address.from.pl> Newsgroups: pl.comp.os.linux.programowanie Subject: lpcap i 100% obciążenia procesora Date: Fri, 23 Sep 2011 11:33:38 +0200 Organization: Netia S.A. Lines: 78 Message-ID: <j5hjsi$pl2$1@mx1.internetia.pl> NNTP-Posting-Host: host227.net81.citysat.com.pl Mime-Version: 1.0 X-Trace: mx1.internetia.pl 1316770514 26274 81.210.63.227 (23 Sep 2011 09:35:14 GMT) X-Complaints-To: abuse@inetia.pl NNTP-Posting-Date: Fri, 23 Sep 2011 09:35:14 +0000 (UTC) X-Tech-Contact: usenet@internetia.pl User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20110902 Thunderbird/6.0.2 X-Server-Info: http://www.internetia.pl/ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit