🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72345

lpcap i 100% obciążenia procesora

#72345
From: Jarek
Date: Fri, 23 Sep 2011 09:33
78 lines
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-mail

Show 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