]> git.pld-linux.org Git - packages/libpcap.git/blob - libpcap-pf_ring.patch
- release 4
[packages/libpcap.git] / libpcap-pf_ring.patch
1 --- Makefile.in.org     2007-06-10 22:02:36.594026862 +0000
2 +++ Makefile.in 2007-06-10 22:03:08.811408859 +0000
3 @@ -58,7 +58,7 @@
4  
5  # Standard CFLAGS
6  CFLAGS = $(CCOPT) $(INCLS) $(DEFS)
7 -CFLAGS_SHAREDLIB = -shared -Wl,-soname,$(SOLIBRARY).$(MAJ)
8 +CFLAGS_SHAREDLIB = -shared -Wl,-soname,$(SOLIBRARY).$(MAJ) -lpfring
9  
10  INSTALL = @INSTALL@
11  INSTALL_PROGRAM = @INSTALL_PROGRAM@
12 --- pcap-int.h_ 2005-07-07 06:56:04.000000000 +0000
13 +++ pcap-int.h  2006-01-11 17:47:18.000000000 +0000
14 @@ -51,6 +51,11 @@
15  #include <io.h>
16  #endif
17  
18 +#ifdef HAVE_PF_RING
19 +#define HAVE_PCAP
20 +#include "pfring.h"
21 +#endif
22 +
23  /*
24   * Savefile
25   */
26 @@ -185,6 +190,10 @@
27         u_int *dlt_list;
28  
29         struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */
30 +
31 +#ifdef HAVE_PF_RING
32 +  pfring *ring;
33 +#endif
34  };
35  
36  /*
37 --- pcap-linux.c_       2005-08-16 04:25:26.000000000 +0000
38 +++ pcap-linux.c        2007-04-09 22:42:47.000000000 +0000
39 @@ -72,6 +72,7 @@
40   *     shorter, on the wire, than the IP header said it should have been.
41   */
42  
43 +#define HAVE_PF_RING
44  
45  #ifdef HAVE_CONFIG_H
46  #include "config.h"
47 @@ -270,6 +271,19 @@
48         handle->snapshot        = snaplen;
49         handle->md.timeout      = to_ms;
50  
51 +#ifdef HAVE_PF_RING
52 +       handle->ring = pfring_open((char*)device, promisc);
53 +
54 +       if(handle->ring != NULL) {
55 +         handle->fd = handle->ring->fd;
56 +         handle->bufsize = handle->snapshot;
57 +         handle->linktype = DLT_EN10MB;
58 +         handle->offset = 2;
59 +
60 +         /* printf("Open HAVE_PF_RING(%s)\n", device); */
61 +       } else {
62 +         /* printf("Open HAVE_PF_RING(%s) failed. Fallback to pcap\n", device); */
63 +#endif
64         /*
65          * NULL and "any" are special devices which give us the hint to
66          * monitor all devices.
67 @@ -406,6 +420,9 @@
68                 }
69                 handle->bufsize = handle->snapshot;
70         }
71 +#ifdef HAVE_PF_RING
72 +       }
73 +#endif
74  
75         /* Allocate the buffer */
76  
77 @@ -472,6 +489,47 @@
78         int                     packet_len, caplen;
79         struct pcap_pkthdr      pcap_header;
80  
81 +#ifdef HAVE_PF_RING
82 +       if(handle->ring) {
83 + retry:          
84 +
85 +         if (handle->break_loop) {
86 +           /*
87 +            * Yes - clear the flag that indicates that it
88 +            * has, and return -2 as an indication that we
89 +            * were told to break out of the loop.
90 +            *
91 +            * Patch courtesy of Michael Stiller <ms@2scale.net>
92 +            */
93 +           handle->break_loop = 0;
94 +           return -2;
95 +          }
96 +
97 +         packet_len = pfring_recv(handle->ring, (char*)handle->buffer,
98 +                                   handle->bufsize,
99 +                                   (struct pfring_pkthdr*)&pcap_header,
100 +                                   1 /* wait_for_incoming_packet */);
101 +          if (packet_len > 0) {
102 +           bp = handle->buffer;
103 +           packet_len = pcap_header.len;
104 +           caplen = pcap_header.caplen;        /* ensure that our capture length does not exceed our snapshot length */
105 +
106 +           if (caplen > handle->snapshot)
107 +             caplen = handle->snapshot;
108 +           if (caplen > handle->bufsize)       /* sanity check and prevent buffer overruns, paranoia in the extreme */
109 +             caplen = handle->bufsize; 
110 +
111 +           pcap_header.caplen = caplen;        /* reset our header capture length for the callee! */
112 +           
113 +           goto pfring_pcap_read_packet;
114 +          } else if (packet_len == -1 && errno == EINTR)
115 +            goto retry;
116 +         else
117 +           return(-1);    
118 +       }
119 +       
120 +#endif
121 +
122  #ifdef HAVE_PF_PACKET_SOCKETS
123         /*
124          * If this is a cooked device, leave extra room for a
125 @@ -632,6 +691,10 @@
126         }
127  #endif
128  
129 +#ifdef HAVE_PF_RING
130 + pfring_pcap_read_packet:
131 +#endif
132 +
133         /*
134          * XXX: According to the kernel source we should get the real
135          * packet len if calling recvfrom with MSG_TRUNC set. It does
136 @@ -678,8 +741,8 @@
137                 }
138         }
139  
140 +#ifndef HAVE_PF_RING
141         /* Fill in our own header data */
142 -
143         if (ioctl(handle->fd, SIOCGSTAMP, &pcap_header.ts) == -1) {
144                 snprintf(handle->errbuf, sizeof(handle->errbuf),
145                          "SIOCGSTAMP: %s", pcap_strerror(errno));
146 @@ -687,6 +750,7 @@
147         }
148         pcap_header.caplen      = caplen;
149         pcap_header.len         = packet_len;
150 +#endif
151  
152         /*
153          * Count the packet.
154 @@ -1701,6 +1765,13 @@
155         struct pcap     *p, *prevp;
156         struct ifreq    ifr;
157  
158 +#ifdef HAVE_PF_RING
159 +       if(handle->ring) {
160 +         pfring_close(handle->ring);
161 +         return;
162 +       }
163 +#endif
164 +
165         if (handle->md.clear_promisc) {
166                 /*
167                  * We put the interface into promiscuous mode; take
168 @@ -2140,7 +2211,13 @@
169          * the filtering done in userland even if it could have been
170          * done in the kernel.
171          */
172 -       if (setsockopt(handle->fd, SOL_SOCKET, SO_ATTACH_FILTER,
173 +       if (setsockopt(handle->fd, 
174 +#ifdef HAVE_PF_RING
175 +                      0,
176 +#else
177 +                      SOL_SOCKET, 
178 +#endif
179 +                      SO_ATTACH_FILTER,
180                        &total_fcode, sizeof(total_fcode)) == 0) {
181                 char drain[1];
182  
183 @@ -2149,6 +2226,7 @@
184                  */
185                 total_filter_on = 1;
186  
187 +#ifndef HAVE_PF_RING
188                 /*
189                  * Save the socket's current mode, and put it in
190                  * non-blocking mode; we drain it by reading packets
191 @@ -2171,12 +2249,19 @@
192                                 return -2;
193                         }
194                 }
195 +#endif
196         }
197  
198         /*
199          * Now attach the new filter.
200          */
201 -       ret = setsockopt(handle->fd, SOL_SOCKET, SO_ATTACH_FILTER,
202 +       ret = setsockopt(handle->fd, 
203 +#ifdef HAVE_PF_RING
204 +                      0,
205 +#else
206 +                      SOL_SOCKET, 
207 +#endif
208 +                        SO_ATTACH_FILTER,
209                          fcode, sizeof(*fcode));
210         if (ret == -1 && total_filter_on) {
211                 /*
212 @@ -2213,3 +2298,9 @@
213                                    &dummy, sizeof(dummy));
214  }
215  #endif
216 +
217 +#ifdef HAVE_PF_RING
218 +int pcap_set_cluster(pfring *ring, u_int clusterId) { return(pfring_set_cluster(ring, clusterId)); }
219 +int pcap_remove_from_cluster(pfring *ring)          { return(pfring_remove_from_cluster(ring));    }
220 +int pcap_set_reflector(pfring *ring, char *reflectorDevice) { return(pfring_set_reflector(ring, reflectorDevice)); }
221 +#endif
This page took 0.055994 seconds and 3 git commands to generate.