UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

cancel
Showing results for 
Search instead for 
Did you mean: 
Visitor shaker18
Visitor
4,149 Views
Registered: ‎03-02-2009

What's the problem with Packet Capture (using libpcap) in XPS ?

Hi everybody,

 

I'm working on an ML505 xilinx card and I try to use it for the capture of packets in network.

I have the famous code source of packets capture witch includes the "libpcap" librairy, I didn't find problems in understanding it or compiling it in Visual Studio or Devcpp ... but the problem is when I want to build in XPS a project witch uses this code as a source and the pcap.h as a header, I obtained those errors :

 

/cygdrive/c/ml505_bsb_std_ip/sw/standalone/UDPdump/src/udpdump.c: In function 'main':
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/UDPdump/src/udpdump.c:188: error: dereferencing pointer to incomplete type
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/UDPdump/src/udpdump.c: In function 'packet_handler':
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/UDPdump/src/udpdump.c:244: warning: assignment makes pointer from integer without a cast
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/UDPdump/src/udpdump.c:245: warning: incompatible implicit declaration of built-in function 'strftime'
make: *** [microblaze_0/code/hello.elf] Error 1
Done!

 

You see well that those errors are in relation with the code witch is completely true !!

I even tried to eliminate those lines :smileyhappy: or to shorten the code and I found new errors in relation with libpcap !!! :

 

/cygdrive/c/DOCUME~1/Gondi/LOCALS~1/Temp/cc4zLX4L.o: In function `main':
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:124: undefined reference to `pcap_findalldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:150: undefined reference to `pcap_freealldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:163: undefined reference to `pcap_open_live'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:171: undefined reference to `pcap_freealldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:171: undefined reference to `pcap_datalink'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:180: undefined reference to `pcap_freealldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:183: undefined reference to `pcap_compile'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:194: undefined reference to `pcap_freealldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:194: undefined reference to `pcap_setfilter'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:203: undefined reference to `pcap_freealldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:205: undefined reference to `pcap_freealldevs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:209: undefined reference to `pcap_loop'
/cygdrive/c/DOCUME~1/Gondi/LOCALS~1/Temp/cc4zLX4L.o: In function `packet_handler':
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:247: undefined reference to `ntohs'
/cygdrive/c/ml505_bsb_std_ip/sw/standalone/hello/src/hello.c:252: undefined reference to `ntohs'
collect2: ld returned 1 exit status
make: *** [microblaze_0/code/hello.elf] Error 1
Done!

 

 

Any one who know the answer ? I need a help.

0 Kudos
1 Reply
Visitor shaker18
Visitor
4,148 Views
Registered: ‎03-02-2009

Re: What's the problem with Packet Capture (using libpcap) in XPS ?

I don't know if I should give you the source code ...

 

#define HAVE_REMOTE

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "xparameters.h"
#include "pcap.h"
#include "memory_map.h"

/* 4 bytes IP address */
typedef struct ip_address
{
 u_char byte1;
 u_char byte2;
 u_char byte3;
 u_char byte4;
}ip_address;

/* IPv4 header */
typedef struct ip_header
{
 u_char ver_ihl;  // Version (4 bits) + Internet header length (4 bits)
 u_char tos;   // Type of service
 u_short tlen;   // Total length
 u_short identification; // Identification
 u_short flags_fo;  // Flags (3 bits) + Fragment offset (13 bits)
 u_char ttl;   // Time to live
 u_char proto;   // Protocol
 u_short crc;   // Header checksum
 ip_address saddr;  // Source address
 ip_address daddr;  // Destination address
 u_int op_pad;   // Option + Padding
}ip_header;

/* UDP header*/
typedef struct udp_header
{
 u_short sport;   // Source port
 u_short dport;   // Destination port
 u_short len;   // Datagram length
 u_short crc;   // Checksum
}udp_header;

typedef struct tcp_header
{
 u_short sport;   // Source port
 u_short dport;   // Destination port
 u_long seq;    // sequence number
 u_long ack;    // acknowledgement number
 u_short doffset;  // data offset (4 bits) + reserved (6 bits) + flags (6 bits)
 u_short wind;   // window
 u_short check;   // checksum
 u_short urgptr;   // urgent pointer
}tcp_header;

typedef struct connexion
{
 ip_address saddr;  // Source address
 ip_address daddr;  // Destination address
 int dur;    // Duration
 u_short sport;   // Source port
 u_short dport;   // Destination port
 time_t tstart;   // Time start
 int packets;   // Packet number
 //bool stat;    // Stat : connected or no;
 // duplication : 2nd connexion  !!!!
 
}connexion;
 
/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
void print_bin(char a);
int nb=0;

main()
{
 pcap_if_t *alldevs;
 pcap_if_t *d;
 int inum;
 int i=0;
 pcap_t *adhandle;
 char errbuf[PCAP_ERRBUF_SIZE];
 u_int netmask;
 char packet_filter[] = "ip and tcp";
 struct bpf_program fcode;
 
 /* Retrieve the device list */
 if(pcap_findalldevs(&alldevs, errbuf) == -1)
 {
  fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
  exit(1);
 }
 
 /* Print the list */
 for(d=alldevs; d; d=d->next)
 {
  printf("%d. %s", ++i, d->name);
  if (d->description)
   printf(" (%s)\n", d->description);
  else
   printf(" (No description available)\n");
 }

 if(i==0)
 {
  printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
  return -1;
 }
 
 printf("Enter the interface number (1-%d):",i);
 scanf("%d", &inum);
 
 /* Check if the user specified a valid adapter */
 if(inum < 1 || inum > i)
 {
  printf("\nAdapter number out of range.\n");
  
  /* Free the device list */
  pcap_freealldevs(alldevs);
  return -1;
 }

 /* Jump to the selected adapter */
 for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
 
 /* Open the adapter */
 if ((adhandle= pcap_open_live(d->name, // name of the device
        65536,   // portion of the packet to capture.
           // 65536 grants that the whole packet will be captured on all the MACs.
        1,    // promiscuous mode (nonzero means promiscuous)
        1000,   // read timeout
        errbuf   // error buffer
        )) == NULL)
 {
  fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
  /* Free the device list */
  pcap_freealldevs(alldevs);
  return -1;
 }
 
 /* Check the link layer. We support only Ethernet for simplicity. */
 if(pcap_datalink(adhandle) != DLT_EN10MB)
 {
  fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
  /* Free the device list */
  pcap_freealldevs(alldevs);
  return -1;
 }
 
 if(d->addresses != NULL)
  /* Retrieve the mask of the first address of the interface */
  netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
 else
  /* If the interface is without addresses we suppose to be in a C class network */
  netmask=0xffffff;


 //compile the filter
 if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
 {
  fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
  /* Free the device list */
  pcap_freealldevs(alldevs);
  return -1;
 }
 
 //set the filter
 if (pcap_setfilter(adhandle, &fcode)<0)
 {
  fprintf(stderr,"\nError setting the filter.\n");
  /* Free the device list */
  pcap_freealldevs(alldevs);
  return -1;
 }
 
 printf("\nlistening on %s...\n", d->description);
 
 /* At this point, we don't need any more the device list. Free it */
 pcap_freealldevs(alldevs);
 
 /* start the capture */
   pcap_loop(adhandle, 0, packet_handler, NULL);
 return 0;
}

/* Callback function invoked by libpcap for every incoming packet */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
 struct tm *ltime;
 char timestr[16];
 ip_header *ih;
 udp_header *uh;
 u_int ip_len;
 u_short sport,dport;
 time_t local_tv_sec;
 
 tcp_header *th;
 connexion *con;
 
 int i,k=16;
 u_short a;
 
 //packets number
 nb++;

 /* convert the timestamp to readable format */
 local_tv_sec = header->ts.tv_sec;
 ltime=localtime(&local_tv_sec);
 strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
 
 printf("packet %d at :",nb);
 /* print timestamp and length of the packet */
 printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);

 /* retireve the position of the ip header */
 ih = (ip_header *) (pkt_data +
  14); //length of ethernet header

 /* retireve the position of the tcp (or udp) header */
 ip_len = (ih->ver_ihl & 0xf) * 4;
 
 //uh = (udp_header *) ((u_char*)ih + ip_len); //for udp header
 
 th = (tcp_header *) ((u_char*)ih + ip_len);  //for tcp header
 printf("protocol is: %.2x \n", ih->proto);
  
 /* convert from network byte order to host byte order */
 sport = ntohs( th->sport );
 dport = ntohs( th->dport );
 
 //printf("ack is : %.2x \n", th->ack);
 //printf("seq num is : %.2x \n", th->seq);
 a=th->doffset;
 printf("offset is : %.2x \n", a);
  
 for (i=k-1;i>=0;i--) {
  printf("%c",(a&(1<<i))?'1':'0');
  
  }
 printf("\n");
 
 //print_bin(char th->doffset);

 /* print ip addresses and udp ports */
 printf("%d.%d.%d.%d/%d -> %d.%d.%d.%d/%d\n", //j'ai remplacé . par / pour les ports
  ih->saddr.byte1,
  ih->saddr.byte2,
  ih->saddr.byte3,
  ih->saddr.byte4,
  sport,
  ih->daddr.byte1,
  ih->daddr.byte2,
  ih->daddr.byte3,
  ih->daddr.byte4,
  dport);
}

0 Kudos