]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libpcap/pcap-dag.c
unbound: Vendor import 1.18.0
[FreeBSD/FreeBSD.git] / contrib / libpcap / pcap-dag.c
1 /*
2  * pcap-dag.c: Packet capture interface for Endace DAG cards.
3  *
4  * Authors: Richard Littin, Sean Irvine ({richard,sean}@reeltwo.com)
5  * Modifications: Jesper Peterson
6  *                Koryn Grant
7  *                Stephen Donnelly <stephen.donnelly@endace.com>
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif
13
14 #include <sys/param.h>                  /* optionally get BSD define */
15
16 #include <stdlib.h>
17 #include <string.h>
18 #include <errno.h>
19
20 #include "pcap-int.h"
21
22 #include <netinet/in.h>
23 #include <sys/mman.h>
24 #include <sys/socket.h>
25 #include <sys/types.h>
26 #include <unistd.h>
27
28 struct mbuf;            /* Squelch compiler warnings on some platforms for */
29 struct rtentry;         /* declarations in <net/if.h> */
30 #include <net/if.h>
31
32 #include "dagnew.h"
33 #include "dagapi.h"
34 #include "dagpci.h"
35 #include "dag_config_api.h"
36
37 #include "pcap-dag.h"
38
39 /*
40  * DAG devices have names beginning with "dag", followed by a number
41  * from 0 to DAG_MAX_BOARDS, then optionally a colon and a stream number
42  * from 0 to DAG_STREAM_MAX.
43  */
44 #ifndef DAG_MAX_BOARDS
45 #define DAG_MAX_BOARDS 32
46 #endif
47
48
49 #ifndef ERF_TYPE_AAL5
50 #define ERF_TYPE_AAL5               4
51 #endif
52
53 #ifndef ERF_TYPE_MC_HDLC
54 #define ERF_TYPE_MC_HDLC            5
55 #endif
56
57 #ifndef ERF_TYPE_MC_RAW
58 #define ERF_TYPE_MC_RAW             6
59 #endif
60
61 #ifndef ERF_TYPE_MC_ATM
62 #define ERF_TYPE_MC_ATM             7
63 #endif
64
65 #ifndef ERF_TYPE_MC_RAW_CHANNEL
66 #define ERF_TYPE_MC_RAW_CHANNEL     8
67 #endif
68
69 #ifndef ERF_TYPE_MC_AAL5
70 #define ERF_TYPE_MC_AAL5            9
71 #endif
72
73 #ifndef ERF_TYPE_COLOR_HDLC_POS
74 #define ERF_TYPE_COLOR_HDLC_POS     10
75 #endif
76
77 #ifndef ERF_TYPE_COLOR_ETH
78 #define ERF_TYPE_COLOR_ETH          11
79 #endif
80
81 #ifndef ERF_TYPE_MC_AAL2
82 #define ERF_TYPE_MC_AAL2            12
83 #endif
84
85 #ifndef ERF_TYPE_IP_COUNTER
86 #define ERF_TYPE_IP_COUNTER         13
87 #endif
88
89 #ifndef ERF_TYPE_TCP_FLOW_COUNTER
90 #define ERF_TYPE_TCP_FLOW_COUNTER   14
91 #endif
92
93 #ifndef ERF_TYPE_DSM_COLOR_HDLC_POS
94 #define ERF_TYPE_DSM_COLOR_HDLC_POS 15
95 #endif
96
97 #ifndef ERF_TYPE_DSM_COLOR_ETH
98 #define ERF_TYPE_DSM_COLOR_ETH      16
99 #endif
100
101 #ifndef ERF_TYPE_COLOR_MC_HDLC_POS
102 #define ERF_TYPE_COLOR_MC_HDLC_POS  17
103 #endif
104
105 #ifndef ERF_TYPE_AAL2
106 #define ERF_TYPE_AAL2               18
107 #endif
108
109 #ifndef ERF_TYPE_COLOR_HASH_POS
110 #define ERF_TYPE_COLOR_HASH_POS     19
111 #endif
112
113 #ifndef ERF_TYPE_COLOR_HASH_ETH
114 #define ERF_TYPE_COLOR_HASH_ETH     20
115 #endif
116
117 #ifndef ERF_TYPE_INFINIBAND
118 #define ERF_TYPE_INFINIBAND         21
119 #endif
120
121 #ifndef ERF_TYPE_IPV4
122 #define ERF_TYPE_IPV4               22
123 #endif
124
125 #ifndef ERF_TYPE_IPV6
126 #define ERF_TYPE_IPV6               23
127 #endif
128
129 #ifndef ERF_TYPE_RAW_LINK
130 #define ERF_TYPE_RAW_LINK           24
131 #endif
132
133 #ifndef ERF_TYPE_INFINIBAND_LINK
134 #define ERF_TYPE_INFINIBAND_LINK    25
135 #endif
136
137 #ifndef ERF_TYPE_META
138 #define ERF_TYPE_META               27
139 #endif
140
141 #ifndef ERF_TYPE_PAD
142 #define ERF_TYPE_PAD                48
143 #endif
144
145 #define ATM_CELL_SIZE           52
146 #define ATM_HDR_SIZE            4
147
148 /*
149  * A header containing additional MTP information.
150  */
151 #define MTP2_SENT_OFFSET                0       /* 1 byte */
152 #define MTP2_ANNEX_A_USED_OFFSET        1       /* 1 byte */
153 #define MTP2_LINK_NUMBER_OFFSET         2       /* 2 bytes */
154 #define MTP2_HDR_LEN                    4       /* length of the header */
155
156 #define MTP2_ANNEX_A_NOT_USED      0
157 #define MTP2_ANNEX_A_USED          1
158 #define MTP2_ANNEX_A_USED_UNKNOWN  2
159
160 /* SunATM pseudo header */
161 struct sunatm_hdr {
162         unsigned char   flags;          /* destination and traffic type */
163         unsigned char   vpi;            /* VPI */
164         unsigned short  vci;            /* VCI */
165 };
166
167 /*
168  * Private data for capturing on DAG devices.
169  */
170 struct pcap_dag {
171         struct pcap_stat stat;
172         u_char  *dag_mem_bottom;        /* DAG card current memory bottom pointer */
173         u_char  *dag_mem_top;   /* DAG card current memory top pointer */
174         int     dag_fcs_bits;   /* Number of checksum bits from link layer */
175         int     dag_flags;      /* Flags */
176         int     dag_stream;     /* DAG stream number */
177         int     dag_timeout;    /* timeout specified to pcap_open_live.
178                                  * Same as in linux above, introduce
179                                  * generally? */
180         dag_card_ref_t dag_ref; /* DAG Configuration/Status API card reference */
181         dag_component_t dag_root;       /* DAG CSAPI Root component */
182         attr_uuid_t drop_attr;  /* DAG Stream Drop Attribute handle, if available */
183         struct timeval required_select_timeout;
184                                 /* Timeout caller must use in event loops */
185 };
186
187 typedef struct pcap_dag_node {
188         struct pcap_dag_node *next;
189         pcap_t *p;
190         pid_t pid;
191 } pcap_dag_node_t;
192
193 static pcap_dag_node_t *pcap_dags = NULL;
194 static int atexit_handler_installed = 0;
195 static const unsigned short endian_test_word = 0x0100;
196
197 #define IS_BIGENDIAN() (*((unsigned char *)&endian_test_word))
198
199 #define MAX_DAG_PACKET 65536
200
201 static unsigned char TempPkt[MAX_DAG_PACKET];
202
203 #ifndef HAVE_DAG_LARGE_STREAMS_API
204 #define dag_attach_stream64(a, b, c, d) dag_attach_stream(a, b, c, d)
205 #define dag_get_stream_poll64(a, b, c, d, e) dag_get_stream_poll(a, b, c, d, e)
206 #define dag_set_stream_poll64(a, b, c, d, e) dag_set_stream_poll(a, b, c, d, e)
207 #define dag_size_t uint32_t
208 #endif
209
210 static int dag_stats(pcap_t *p, struct pcap_stat *ps);
211 static int dag_set_datalink(pcap_t *p, int dlt);
212 static int dag_get_datalink(pcap_t *p);
213 static int dag_setnonblock(pcap_t *p, int nonblock);
214
215 static void
216 delete_pcap_dag(const pcap_t *p)
217 {
218         pcap_dag_node_t *curr = NULL, *prev = NULL;
219
220         for (prev = NULL, curr = pcap_dags; curr != NULL && curr->p != p; prev = curr, curr = curr->next) {
221                 /* empty */
222         }
223
224         if (curr != NULL && curr->p == p) {
225                 if (prev != NULL) {
226                         prev->next = curr->next;
227                 } else {
228                         pcap_dags = curr->next;
229                 }
230         }
231 }
232
233 /*
234  * Performs a graceful shutdown of the DAG card, frees dynamic memory held
235  * in the pcap_t structure, and closes the file descriptor for the DAG card.
236  */
237
238 static void
239 dag_platform_cleanup(pcap_t *p)
240 {
241         struct pcap_dag *pd = p->priv;
242
243         if(dag_stop_stream(p->fd, pd->dag_stream) < 0)
244                 fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
245
246         if(dag_detach_stream(p->fd, pd->dag_stream) < 0)
247                 fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
248
249         if(pd->dag_ref != NULL) {
250                 dag_config_dispose(pd->dag_ref);
251                 /*
252                  * Note: we don't need to call close(p->fd) or
253                  * dag_close(p->fd), as dag_config_dispose(pd->dag_ref)
254                  * does this.
255                  *
256                  * Set p->fd to -1 to make sure that's not done.
257                  */
258                 p->fd = -1;
259                 pd->dag_ref = NULL;
260         }
261         delete_pcap_dag(p);
262         pcap_cleanup_live_common(p);
263 }
264
265 static void
266 atexit_handler(void)
267 {
268         while (pcap_dags != NULL) {
269                 if (pcap_dags->pid == getpid()) {
270                         if (pcap_dags->p != NULL)
271                                 dag_platform_cleanup(pcap_dags->p);
272                 } else {
273                         delete_pcap_dag(pcap_dags->p);
274                 }
275         }
276 }
277
278 static int
279 new_pcap_dag(pcap_t *p)
280 {
281         pcap_dag_node_t *node = NULL;
282
283         if ((node = malloc(sizeof(pcap_dag_node_t))) == NULL) {
284                 return -1;
285         }
286
287         if (!atexit_handler_installed) {
288                 atexit(atexit_handler);
289                 atexit_handler_installed = 1;
290         }
291
292         node->next = pcap_dags;
293         node->p = p;
294         node->pid = getpid();
295
296         pcap_dags = node;
297
298         return 0;
299 }
300
301 static unsigned int
302 dag_erf_ext_header_count(const uint8_t *erf, size_t len)
303 {
304         uint32_t hdr_num = 0;
305         uint8_t  hdr_type;
306
307         /* basic sanity checks */
308         if ( erf == NULL )
309                 return 0;
310         if ( len < 16 )
311                 return 0;
312
313         /* check if we have any extension headers */
314         if ( (erf[8] & 0x80) == 0x00 )
315                 return 0;
316
317         /* loop over the extension headers */
318         do {
319
320                 /* sanity check we have enough bytes */
321                 if ( len < (24 + (hdr_num * 8)) )
322                         return hdr_num;
323
324                 /* get the header type */
325                 hdr_type = erf[(16 + (hdr_num * 8))];
326                 hdr_num++;
327
328         } while ( hdr_type & 0x80 );
329
330         return hdr_num;
331 }
332
333 /*
334  *  Read at most max_packets from the capture stream and call the callback
335  *  for each of them. Returns the number of packets handled, -1 if an
336  *  error occurred, or -2 if we were told to break out of the loop.
337  */
338 static int
339 dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
340 {
341         struct pcap_dag *pd = p->priv;
342         unsigned int processed = 0;
343         unsigned int nonblocking = pd->dag_flags & DAGF_NONBLOCK;
344         unsigned int num_ext_hdr = 0;
345         unsigned int ticks_per_second;
346
347         /* Get the next bufferful of packets (if necessary). */
348         while (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size) {
349
350                 /*
351                  * Has "pcap_breakloop()" been called?
352                  */
353                 if (p->break_loop) {
354                         /*
355                          * Yes - clear the flag that indicates that
356                          * it has, and return -2 to indicate that
357                          * we were told to break out of the loop.
358                          */
359                         p->break_loop = 0;
360                         return -2;
361                 }
362
363                 /* dag_advance_stream() will block (unless nonblock is called)
364                  * until 64kB of data has accumulated.
365                  * If to_ms is set, it will timeout before 64kB has accumulated.
366                  * We wait for 64kB because processing a few packets at a time
367                  * can cause problems at high packet rates (>200kpps) due
368                  * to inefficiencies.
369                  * This does mean if to_ms is not specified the capture may 'hang'
370                  * for long periods if the data rate is extremely slow (<64kB/sec)
371                  * If non-block is specified it will return immediately. The user
372                  * is then responsible for efficiency.
373                  */
374                 if ( NULL == (pd->dag_mem_top = dag_advance_stream(p->fd, pd->dag_stream, &(pd->dag_mem_bottom))) ) {
375                      return -1;
376                 }
377
378                 if (nonblocking && (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size))
379                 {
380                         /* Pcap is configured to process only available packets, and there aren't any, return immediately. */
381                         return 0;
382                 }
383
384                 if(!nonblocking &&
385                    pd->dag_timeout &&
386                    (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size))
387                 {
388                         /* Blocking mode, but timeout set and no data has arrived, return anyway.*/
389                         return 0;
390                 }
391
392         }
393
394         /*
395          * Process the packets.
396          *
397          * This assumes that a single buffer of packets will have
398          * <= INT_MAX packets, so the packet count doesn't overflow.
399          */
400         while (pd->dag_mem_top - pd->dag_mem_bottom >= dag_record_size) {
401
402                 unsigned short packet_len = 0;
403                 int caplen = 0;
404                 struct pcap_pkthdr      pcap_header;
405
406                 dag_record_t *header = (dag_record_t *)(pd->dag_mem_bottom);
407
408                 u_char *dp = ((u_char *)header); /* + dag_record_size; */
409                 unsigned short rlen;
410
411                 /*
412                  * Has "pcap_breakloop()" been called?
413                  */
414                 if (p->break_loop) {
415                         /*
416                          * Yes - clear the flag that indicates that
417                          * it has, and return -2 to indicate that
418                          * we were told to break out of the loop.
419                          */
420                         p->break_loop = 0;
421                         return -2;
422                 }
423
424                 rlen = ntohs(header->rlen);
425                 if (rlen < dag_record_size)
426                 {
427                         pcap_strlcpy(p->errbuf, "dag_read: record too small",
428                             PCAP_ERRBUF_SIZE);
429                         return -1;
430                 }
431                 pd->dag_mem_bottom += rlen;
432
433                 /* Count lost packets. */
434                 switch((header->type & 0x7f)) {
435                         /* in these types the color value overwrites the lctr */
436                 case ERF_TYPE_COLOR_HDLC_POS:
437                 case ERF_TYPE_COLOR_ETH:
438                 case ERF_TYPE_DSM_COLOR_HDLC_POS:
439                 case ERF_TYPE_DSM_COLOR_ETH:
440                 case ERF_TYPE_COLOR_MC_HDLC_POS:
441                 case ERF_TYPE_COLOR_HASH_ETH:
442                 case ERF_TYPE_COLOR_HASH_POS:
443                         break;
444
445                 default:
446                         if ( (pd->drop_attr == kNullAttributeUuid) && (header->lctr) ) {
447                                 pd->stat.ps_drop += ntohs(header->lctr);
448                         }
449                 }
450
451                 if ((header->type & 0x7f) == ERF_TYPE_PAD) {
452                         continue;
453                 }
454
455                 num_ext_hdr = dag_erf_ext_header_count(dp, rlen);
456
457                 /* ERF encapsulation */
458                 /* The Extensible Record Format is not dropped for this kind of encapsulation,
459                  * and will be handled as a pseudo header by the decoding application.
460                  * The information carried in the ERF header and in the optional subheader (if present)
461                  * could be merged with the libpcap information, to offer a better decoding.
462                  * The packet length is
463                  * o the length of the packet on the link (header->wlen),
464                  * o plus the length of the ERF header (dag_record_size), as the length of the
465                  *   pseudo header will be adjusted during the decoding,
466                  * o plus the length of the optional subheader (if present).
467                  *
468                  * The capture length is header.rlen and the byte stuffing for alignment will be dropped
469                  * if the capture length is greater than the packet length.
470                  */
471                 if (p->linktype == DLT_ERF) {
472                         packet_len = ntohs(header->wlen) + dag_record_size;
473                         caplen = rlen;
474                         switch ((header->type & 0x7f)) {
475                         case ERF_TYPE_MC_AAL5:
476                         case ERF_TYPE_MC_ATM:
477                         case ERF_TYPE_MC_HDLC:
478                         case ERF_TYPE_MC_RAW_CHANNEL:
479                         case ERF_TYPE_MC_RAW:
480                         case ERF_TYPE_MC_AAL2:
481                         case ERF_TYPE_COLOR_MC_HDLC_POS:
482                                 packet_len += 4; /* MC header */
483                                 break;
484
485                         case ERF_TYPE_COLOR_HASH_ETH:
486                         case ERF_TYPE_DSM_COLOR_ETH:
487                         case ERF_TYPE_COLOR_ETH:
488                         case ERF_TYPE_ETH:
489                                 packet_len += 2; /* ETH header */
490                                 break;
491                         } /* switch type */
492
493                         /* Include ERF extension headers */
494                         packet_len += (8 * num_ext_hdr);
495
496                         if (caplen > packet_len) {
497                                 caplen = packet_len;
498                         }
499                 } else {
500                         /* Other kind of encapsulation according to the header Type */
501
502                         /* Skip over generic ERF header */
503                         dp += dag_record_size;
504                         /* Skip over extension headers */
505                         dp += 8 * num_ext_hdr;
506
507                         switch((header->type & 0x7f)) {
508                         case ERF_TYPE_ATM:
509                         case ERF_TYPE_AAL5:
510                                 if ((header->type & 0x7f) == ERF_TYPE_AAL5) {
511                                         packet_len = ntohs(header->wlen);
512                                         caplen = rlen - dag_record_size;
513                                 }
514                         case ERF_TYPE_MC_ATM:
515                                 if ((header->type & 0x7f) == ERF_TYPE_MC_ATM) {
516                                         caplen = packet_len = ATM_CELL_SIZE;
517                                         dp+=4;
518                                 }
519                         case ERF_TYPE_MC_AAL5:
520                                 if ((header->type & 0x7f) == ERF_TYPE_MC_AAL5) {
521                                         packet_len = ntohs(header->wlen);
522                                         caplen = rlen - dag_record_size - 4;
523                                         dp+=4;
524                                 }
525                                 /* Skip over extension headers */
526                                 caplen -= (8 * num_ext_hdr);
527
528                                 if ((header->type & 0x7f) == ERF_TYPE_ATM) {
529                                         caplen = packet_len = ATM_CELL_SIZE;
530                                 }
531                                 if (p->linktype == DLT_SUNATM) {
532                                         struct sunatm_hdr *sunatm = (struct sunatm_hdr *)dp;
533                                         unsigned long rawatm;
534
535                                         rawatm = ntohl(*((unsigned long *)dp));
536                                         sunatm->vci = htons((rawatm >>  4) & 0xffff);
537                                         sunatm->vpi = (rawatm >> 20) & 0x00ff;
538                                         sunatm->flags = ((header->flags.iface & 1) ? 0x80 : 0x00) |
539                                                 ((sunatm->vpi == 0 && sunatm->vci == htons(5)) ? 6 :
540                                                  ((sunatm->vpi == 0 && sunatm->vci == htons(16)) ? 5 :
541                                                   ((dp[ATM_HDR_SIZE] == 0xaa &&
542                                                     dp[ATM_HDR_SIZE+1] == 0xaa &&
543                                                     dp[ATM_HDR_SIZE+2] == 0x03) ? 2 : 1)));
544
545                                 } else if (p->linktype == DLT_ATM_RFC1483) {
546                                         packet_len -= ATM_HDR_SIZE;
547                                         caplen -= ATM_HDR_SIZE;
548                                         dp += ATM_HDR_SIZE;
549                                 } else
550                                         continue;
551                                 break;
552
553                         case ERF_TYPE_COLOR_HASH_ETH:
554                         case ERF_TYPE_DSM_COLOR_ETH:
555                         case ERF_TYPE_COLOR_ETH:
556                         case ERF_TYPE_ETH:
557                                 if ((p->linktype != DLT_EN10MB) &&
558                                     (p->linktype != DLT_DOCSIS))
559                                         continue;
560                                 packet_len = ntohs(header->wlen);
561                                 packet_len -= (pd->dag_fcs_bits >> 3);
562                                 caplen = rlen - dag_record_size - 2;
563                                 /* Skip over extension headers */
564                                 caplen -= (8 * num_ext_hdr);
565                                 if (caplen > packet_len) {
566                                         caplen = packet_len;
567                                 }
568                                 dp += 2;
569                                 break;
570
571                         case ERF_TYPE_COLOR_HASH_POS:
572                         case ERF_TYPE_DSM_COLOR_HDLC_POS:
573                         case ERF_TYPE_COLOR_HDLC_POS:
574                         case ERF_TYPE_HDLC_POS:
575                                 if ((p->linktype != DLT_CHDLC) &&
576                                     (p->linktype != DLT_PPP_SERIAL) &&
577                                     (p->linktype != DLT_FRELAY))
578                                         continue;
579                                 packet_len = ntohs(header->wlen);
580                                 packet_len -= (pd->dag_fcs_bits >> 3);
581                                 caplen = rlen - dag_record_size;
582                                 /* Skip over extension headers */
583                                 caplen -= (8 * num_ext_hdr);
584                                 if (caplen > packet_len) {
585                                         caplen = packet_len;
586                                 }
587                                 break;
588
589                         case ERF_TYPE_COLOR_MC_HDLC_POS:
590                         case ERF_TYPE_MC_HDLC:
591                                 if ((p->linktype != DLT_CHDLC) &&
592                                     (p->linktype != DLT_PPP_SERIAL) &&
593                                     (p->linktype != DLT_FRELAY) &&
594                                     (p->linktype != DLT_MTP2) &&
595                                     (p->linktype != DLT_MTP2_WITH_PHDR) &&
596                                     (p->linktype != DLT_LAPD))
597                                         continue;
598                                 packet_len = ntohs(header->wlen);
599                                 packet_len -= (pd->dag_fcs_bits >> 3);
600                                 caplen = rlen - dag_record_size - 4;
601                                 /* Skip over extension headers */
602                                 caplen -= (8 * num_ext_hdr);
603                                 if (caplen > packet_len) {
604                                         caplen = packet_len;
605                                 }
606                                 /* jump the MC_HDLC_HEADER */
607                                 dp += 4;
608 #ifdef DLT_MTP2_WITH_PHDR
609                                 if (p->linktype == DLT_MTP2_WITH_PHDR) {
610                                         /* Add the MTP2 Pseudo Header */
611                                         caplen += MTP2_HDR_LEN;
612                                         packet_len += MTP2_HDR_LEN;
613
614                                         TempPkt[MTP2_SENT_OFFSET] = 0;
615                                         TempPkt[MTP2_ANNEX_A_USED_OFFSET] = MTP2_ANNEX_A_USED_UNKNOWN;
616                                         *(TempPkt+MTP2_LINK_NUMBER_OFFSET) = ((header->rec.mc_hdlc.mc_header>>16)&0x01);
617                                         *(TempPkt+MTP2_LINK_NUMBER_OFFSET+1) = ((header->rec.mc_hdlc.mc_header>>24)&0xff);
618                                         memcpy(TempPkt+MTP2_HDR_LEN, dp, caplen);
619                                         dp = TempPkt;
620                                 }
621 #endif
622                                 break;
623
624                         case ERF_TYPE_IPV4:
625                                 if ((p->linktype != DLT_RAW) &&
626                                     (p->linktype != DLT_IPV4))
627                                         continue;
628                                 packet_len = ntohs(header->wlen);
629                                 caplen = rlen - dag_record_size;
630                                 /* Skip over extension headers */
631                                 caplen -= (8 * num_ext_hdr);
632                                 if (caplen > packet_len) {
633                                         caplen = packet_len;
634                                 }
635                                 break;
636
637                         case ERF_TYPE_IPV6:
638                                 if ((p->linktype != DLT_RAW) &&
639                                     (p->linktype != DLT_IPV6))
640                                         continue;
641                                 packet_len = ntohs(header->wlen);
642                                 caplen = rlen - dag_record_size;
643                                 /* Skip over extension headers */
644                                 caplen -= (8 * num_ext_hdr);
645                                 if (caplen > packet_len) {
646                                         caplen = packet_len;
647                                 }
648                                 break;
649
650                         /* These types have no matching 'native' DLT, but can be used with DLT_ERF above */
651                         case ERF_TYPE_MC_RAW:
652                         case ERF_TYPE_MC_RAW_CHANNEL:
653                         case ERF_TYPE_IP_COUNTER:
654                         case ERF_TYPE_TCP_FLOW_COUNTER:
655                         case ERF_TYPE_INFINIBAND:
656                         case ERF_TYPE_RAW_LINK:
657                         case ERF_TYPE_INFINIBAND_LINK:
658                         default:
659                                 /* Unhandled ERF type.
660                                  * Ignore rather than generating error
661                                  */
662                                 continue;
663                         } /* switch type */
664
665                 } /* ERF encapsulation */
666
667                 if (caplen > p->snapshot)
668                         caplen = p->snapshot;
669
670                 /* Run the packet filter if there is one. */
671                 if ((p->fcode.bf_insns == NULL) || pcap_filter(p->fcode.bf_insns, dp, packet_len, caplen)) {
672
673                         /* convert between timestamp formats */
674                         register unsigned long long ts;
675
676                         if (IS_BIGENDIAN()) {
677                                 ts = SWAPLL(header->ts);
678                         } else {
679                                 ts = header->ts;
680                         }
681
682                         switch (p->opt.tstamp_precision) {
683                         case PCAP_TSTAMP_PRECISION_NANO:
684                                 ticks_per_second = 1000000000;
685                                 break;
686                         case PCAP_TSTAMP_PRECISION_MICRO:
687                         default:
688                                 ticks_per_second = 1000000;
689                                 break;
690
691                         }
692                         pcap_header.ts.tv_sec = ts >> 32;
693                         ts = (ts & 0xffffffffULL) * ticks_per_second;
694                         ts += 0x80000000; /* rounding */
695                         pcap_header.ts.tv_usec = ts >> 32;
696                         if (pcap_header.ts.tv_usec >= ticks_per_second) {
697                                 pcap_header.ts.tv_usec -= ticks_per_second;
698                                 pcap_header.ts.tv_sec++;
699                         }
700
701                         /* Fill in our own header data */
702                         pcap_header.caplen = caplen;
703                         pcap_header.len = packet_len;
704
705                         /* Count the packet. */
706                         pd->stat.ps_recv++;
707
708                         /* Call the user supplied callback function */
709                         callback(user, &pcap_header, dp);
710
711                         /* Only count packets that pass the filter, for consistency with standard Linux behaviour. */
712                         processed++;
713                         if (processed == cnt && !PACKET_COUNT_IS_UNLIMITED(cnt))
714                         {
715                                 /* Reached the user-specified limit. */
716                                 return cnt;
717                         }
718                 }
719         }
720
721         return processed;
722 }
723
724 static int
725 dag_inject(pcap_t *p, const void *buf _U_, int size _U_)
726 {
727         pcap_strlcpy(p->errbuf, "Sending packets isn't supported on DAG cards",
728             PCAP_ERRBUF_SIZE);
729         return (-1);
730 }
731
732 /*
733  *  Get a handle for a live capture from the given DAG device.  Passing a NULL
734  *  device will result in a failure.  The promisc flag is ignored because DAG
735  *  cards are always promiscuous.  The to_ms parameter is used in setting the
736  *  API polling parameters.
737  *
738  *  snaplen is now also ignored, until we get per-stream slen support. Set
739  *  slen with appropriate DAG tool BEFORE pcap_activate().
740  *
741  *  See also pcap(3).
742  */
743 static int dag_activate(pcap_t* p)
744 {
745         struct pcap_dag *pd = p->priv;
746         char *s;
747         int n;
748         daginf_t* daginf;
749         char * newDev = NULL;
750         char * device = p->opt.device;
751         int ret;
752         dag_size_t mindata;
753         struct timeval maxwait;
754         struct timeval poll;
755
756         if (device == NULL) {
757                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "device is NULL");
758                 return PCAP_ERROR;
759         }
760
761         /* Initialize some components of the pcap structure. */
762         newDev = (char *)malloc(strlen(device) + 16);
763         if (newDev == NULL) {
764                 ret = PCAP_ERROR;
765                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
766                     errno, "Can't allocate string for device name");
767                 goto fail;
768         }
769
770         /* Parse input name to get dag device and stream number if provided */
771         if (dag_parse_name(device, newDev, strlen(device) + 16, &pd->dag_stream) < 0) {
772                 /*
773                  * XXX - it'd be nice if this indicated what was wrong
774                  * with the name.  Does this reliably set errno?
775                  * Should this return PCAP_ERROR_NO_SUCH_DEVICE in some
776                  * cases?
777                  */
778                 ret = PCAP_ERROR;
779                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
780                     errno, "dag_parse_name");
781                 goto fail;
782         }
783         device = newDev;
784
785         if (pd->dag_stream%2) {
786                 ret = PCAP_ERROR;
787                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "dag_parse_name: tx (even numbered) streams not supported for capture");
788                 goto fail;
789         }
790
791         /* setup device parameters */
792         if((pd->dag_ref = dag_config_init((char *)device)) == NULL) {
793                 /*
794                  * XXX - does this reliably set errno?
795                  */
796                 if (errno == ENOENT) {
797                         /*
798                          * There's nothing more to say, so clear
799                          * the error message.
800                          */
801                         ret = PCAP_ERROR_NO_SUCH_DEVICE;
802                         p->errbuf[0] = '\0';
803                 } else if (errno == EPERM || errno == EACCES) {
804                         ret = PCAP_ERROR_PERM_DENIED;
805                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
806                             "Attempt to open %s failed with %s - additional privileges may be required",
807                             device, (errno == EPERM) ? "EPERM" : "EACCES");
808                 } else {
809                         ret = PCAP_ERROR;
810                         pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
811                             errno, "dag_config_init %s", device);
812                 }
813                 goto fail;
814         }
815
816         if((p->fd = dag_config_get_card_fd(pd->dag_ref)) < 0) {
817                 /*
818                  * XXX - does this reliably set errno?
819                  */
820                 ret = PCAP_ERROR;
821                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
822                     errno, "dag_config_get_card_fd %s", device);
823                 goto failclose;
824         }
825
826         /* Open requested stream. Can fail if already locked or on error */
827         if (dag_attach_stream64(p->fd, pd->dag_stream, 0, 0) < 0) {
828                 ret = PCAP_ERROR;
829                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
830                     errno, "dag_attach_stream");
831                 goto failclose;
832         }
833
834         /* Try to find Stream Drop attribute */
835         pd->drop_attr = kNullAttributeUuid;
836         pd->dag_root = dag_config_get_root_component(pd->dag_ref);
837         if ( dag_component_get_subcomponent(pd->dag_root, kComponentStreamFeatures, 0) )
838         {
839                 pd->drop_attr = dag_config_get_indexed_attribute_uuid(pd->dag_ref, kUint32AttributeStreamDropCount, pd->dag_stream/2);
840         }
841
842         /* Set up default poll parameters for stream
843          * Can be overridden by pcap_set_nonblock()
844          */
845         if (dag_get_stream_poll64(p->fd, pd->dag_stream,
846                                 &mindata, &maxwait, &poll) < 0) {
847                 ret = PCAP_ERROR;
848                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
849                     errno, "dag_get_stream_poll");
850                 goto faildetach;
851         }
852
853         /* Use the poll time as the required select timeout for callers
854          * who are using select()/etc. in an event loop waiting for
855          * packets to arrive.
856          */
857         pd->required_select_timeout = poll;
858         p->required_select_timeout = &pd->required_select_timeout;
859
860         /*
861          * Turn a negative snapshot value (invalid), a snapshot value of
862          * 0 (unspecified), or a value bigger than the normal maximum
863          * value, into the maximum allowed value.
864          *
865          * If some application really *needs* a bigger snapshot
866          * length, we should just increase MAXIMUM_SNAPLEN.
867          */
868         if (p->snapshot <= 0 || p->snapshot > MAXIMUM_SNAPLEN)
869                 p->snapshot = MAXIMUM_SNAPLEN;
870
871         if (p->opt.immediate) {
872                 /* Call callback immediately.
873                  * XXX - is this the right way to p this?
874                  */
875                 mindata = 0;
876         } else {
877                 /* Amount of data to collect in Bytes before calling callbacks.
878                  * Important for efficiency, but can introduce latency
879                  * at low packet rates if to_ms not set!
880                  */
881                 mindata = 65536;
882         }
883
884         /* Obey opt.timeout (was to_ms) if supplied. This is a good idea!
885          * Recommend 10-100ms. Calls will time out even if no data arrived.
886          */
887         maxwait.tv_sec = p->opt.timeout/1000;
888         maxwait.tv_usec = (p->opt.timeout%1000) * 1000;
889
890         if (dag_set_stream_poll64(p->fd, pd->dag_stream,
891                                 mindata, &maxwait, &poll) < 0) {
892                 ret = PCAP_ERROR;
893                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
894                     errno, "dag_set_stream_poll");
895                 goto faildetach;
896         }
897
898         /* XXX Not calling dag_configure() to set slen; this is unsafe in
899          * multi-stream environments as the gpp config is global.
900          * Once the firmware provides 'per-stream slen' this can be supported
901          * again via the Config API without side-effects */
902 #if 0
903         /* set the card snap length to the specified snaplen parameter */
904         /* This is a really bad idea, as different cards have different
905          * valid slen ranges. Should fix in Config API. */
906         if (p->snapshot == 0 || p->snapshot > MAX_DAG_SNAPLEN) {
907                 p->snapshot = MAX_DAG_SNAPLEN;
908         } else if (snaplen < MIN_DAG_SNAPLEN) {
909                 p->snapshot = MIN_DAG_SNAPLEN;
910         }
911         /* snap len has to be a multiple of 4 */
912 #endif
913
914         if(dag_start_stream(p->fd, pd->dag_stream) < 0) {
915                 ret = PCAP_ERROR;
916                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
917                     errno, "dag_start_stream %s", device);
918                 goto faildetach;
919         }
920
921         /*
922          * Important! You have to ensure bottom is properly
923          * initialized to zero on startup, it won't give you
924          * a compiler warning if you make this mistake!
925          */
926         pd->dag_mem_bottom = 0;
927         pd->dag_mem_top = 0;
928
929         /*
930          * Find out how many FCS bits we should strip.
931          * First, query the card to see if it strips the FCS.
932          */
933         daginf = dag_info(p->fd);
934         if ((0x4200 == daginf->device_code) || (0x4230 == daginf->device_code)) {
935                 /* DAG 4.2S and 4.23S already strip the FCS.  Stripping the final word again truncates the packet. */
936                 pd->dag_fcs_bits = 0;
937
938                 /* Note that no FCS will be supplied. */
939                 p->linktype_ext = LT_FCS_DATALINK_EXT(0);
940         } else {
941                 /*
942                  * Start out assuming it's 32 bits.
943                  */
944                 pd->dag_fcs_bits = 32;
945
946                 /* Allow an environment variable to override. */
947                 if ((s = getenv("ERF_FCS_BITS")) != NULL) {
948                         if ((n = atoi(s)) == 0 || n == 16 || n == 32) {
949                                 pd->dag_fcs_bits = n;
950                         } else {
951                                 ret = PCAP_ERROR;
952                                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
953                                         "pcap_activate %s: bad ERF_FCS_BITS value (%d) in environment", device, n);
954                                 goto failstop;
955                         }
956                 }
957
958                 /*
959                  * Did the user request that they not be stripped?
960                  */
961                 if ((s = getenv("ERF_DONT_STRIP_FCS")) != NULL) {
962                         /* Yes.  Note the number of 16-bit words that will be
963                            supplied. */
964                         p->linktype_ext = LT_FCS_DATALINK_EXT(pd->dag_fcs_bits/16);
965
966                         /* And don't strip them. */
967                         pd->dag_fcs_bits = 0;
968                 }
969         }
970
971         pd->dag_timeout = p->opt.timeout;
972
973         p->linktype = -1;
974         if (dag_get_datalink(p) < 0) {
975                 ret = PCAP_ERROR;
976                 goto failstop;
977         }
978
979         p->bufsize = 0;
980
981         if (new_pcap_dag(p) < 0) {
982                 ret = PCAP_ERROR;
983                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
984                     errno, "new_pcap_dag %s", device);
985                 goto failstop;
986         }
987
988         /*
989          * "select()" and "poll()" don't work on DAG device descriptors.
990          */
991         p->selectable_fd = -1;
992
993         if (newDev != NULL) {
994                 free((char *)newDev);
995         }
996
997         p->read_op = dag_read;
998         p->inject_op = dag_inject;
999         p->setfilter_op = install_bpf_program;
1000         p->setdirection_op = NULL; /* Not implemented.*/
1001         p->set_datalink_op = dag_set_datalink;
1002         p->getnonblock_op = pcap_getnonblock_fd;
1003         p->setnonblock_op = dag_setnonblock;
1004         p->stats_op = dag_stats;
1005         p->cleanup_op = dag_platform_cleanup;
1006         pd->stat.ps_drop = 0;
1007         pd->stat.ps_recv = 0;
1008         pd->stat.ps_ifdrop = 0;
1009         return 0;
1010
1011 failstop:
1012         if (dag_stop_stream(p->fd, pd->dag_stream) < 0) {
1013                 fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
1014         }
1015
1016 faildetach:
1017         if (dag_detach_stream(p->fd, pd->dag_stream) < 0)
1018                 fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
1019
1020 failclose:
1021         dag_config_dispose(pd->dag_ref);
1022         /*
1023          * Note: we don't need to call close(p->fd) or dag_close(p->fd),
1024          * as dag_config_dispose(pd->dag_ref) does this.
1025          *
1026          * Set p->fd to -1 to make sure that's not done.
1027          */
1028         p->fd = -1;
1029         pd->dag_ref = NULL;
1030         delete_pcap_dag(p);
1031
1032 fail:
1033         pcap_cleanup_live_common(p);
1034         if (newDev != NULL) {
1035                 free((char *)newDev);
1036         }
1037
1038         return ret;
1039 }
1040
1041 pcap_t *dag_create(const char *device, char *ebuf, int *is_ours)
1042 {
1043         const char *cp;
1044         char *cpend;
1045         long devnum;
1046         pcap_t *p;
1047         long stream = 0;
1048
1049         /* Does this look like a DAG device? */
1050         cp = strrchr(device, '/');
1051         if (cp == NULL)
1052                 cp = device;
1053         /* Does it begin with "dag"? */
1054         if (strncmp(cp, "dag", 3) != 0) {
1055                 /* Nope, doesn't begin with "dag" */
1056                 *is_ours = 0;
1057                 return NULL;
1058         }
1059         /* Yes - is "dag" followed by a number from 0 to DAG_MAX_BOARDS-1 */
1060         cp += 3;
1061         devnum = strtol(cp, &cpend, 10);
1062         if (*cpend == ':') {
1063                 /* Followed by a stream number. */
1064                 stream = strtol(++cpend, &cpend, 10);
1065         }
1066
1067         if (cpend == cp || *cpend != '\0') {
1068                 /* Not followed by a number. */
1069                 *is_ours = 0;
1070                 return NULL;
1071         }
1072
1073         if (devnum < 0 || devnum >= DAG_MAX_BOARDS) {
1074                 /* Followed by a non-valid number. */
1075                 *is_ours = 0;
1076                 return NULL;
1077         }
1078
1079         if (stream <0 || stream >= DAG_STREAM_MAX) {
1080                 /* Followed by a non-valid stream number. */
1081                 *is_ours = 0;
1082                 return NULL;
1083         }
1084
1085         /* OK, it's probably ours. */
1086         *is_ours = 1;
1087
1088         p = PCAP_CREATE_COMMON(ebuf, struct pcap_dag);
1089         if (p == NULL)
1090                 return NULL;
1091
1092         p->activate_op = dag_activate;
1093
1094         /*
1095          * We claim that we support microsecond and nanosecond time
1096          * stamps.
1097          *
1098          * XXX Our native precision is 2^-32s, but libpcap doesn't support
1099          * power of two precisions yet. We can convert to either MICRO or NANO.
1100          */
1101         p->tstamp_precision_list = malloc(2 * sizeof(u_int));
1102         if (p->tstamp_precision_list == NULL) {
1103                 pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1104                     errno, "malloc");
1105                 pcap_close(p);
1106                 return NULL;
1107         }
1108         p->tstamp_precision_list[0] = PCAP_TSTAMP_PRECISION_MICRO;
1109         p->tstamp_precision_list[1] = PCAP_TSTAMP_PRECISION_NANO;
1110         p->tstamp_precision_count = 2;
1111         return p;
1112 }
1113
1114 static int
1115 dag_stats(pcap_t *p, struct pcap_stat *ps) {
1116         struct pcap_dag *pd = p->priv;
1117         uint32_t stream_drop;
1118         dag_err_t dag_error;
1119
1120         /*
1121          * Packet records received (ps_recv) are counted in dag_read().
1122          * Packet records dropped (ps_drop) are read from Stream Drop attribute if present,
1123          * otherwise integrate the ERF Header lctr counts (if available) in dag_read().
1124          * We are reporting that no records are dropped by the card/driver (ps_ifdrop).
1125          */
1126
1127         if(pd->drop_attr != kNullAttributeUuid) {
1128                 /* Note this counter is cleared at start of capture and will wrap at UINT_MAX.
1129                  * The application is responsible for polling ps_drop frequently enough
1130                  * to detect each wrap and integrate total drop with a wider counter */
1131                 if ((dag_error = dag_config_get_uint32_attribute_ex(pd->dag_ref, pd->drop_attr, &stream_drop)) == kDagErrNone) {
1132                         pd->stat.ps_drop = stream_drop;
1133                 } else {
1134                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "reading stream drop attribute: %s",
1135                                  dag_config_strerror(dag_error));
1136                         return -1;
1137                 }
1138         }
1139
1140         *ps = pd->stat;
1141
1142         return 0;
1143 }
1144
1145 /*
1146  * Add all DAG devices.
1147  */
1148 int
1149 dag_findalldevs(pcap_if_list_t *devlistp, char *errbuf)
1150 {
1151         char name[12];  /* XXX - pick a size */
1152         int c;
1153         char dagname[DAGNAME_BUFSIZE];
1154         int dagstream;
1155         int dagfd;
1156         dag_card_inf_t *inf;
1157         char *description;
1158         int stream, rxstreams;
1159
1160         /* Try all the DAGs 0-DAG_MAX_BOARDS */
1161         for (c = 0; c < DAG_MAX_BOARDS; c++) {
1162                 snprintf(name, 12, "dag%d", c);
1163                 if (-1 == dag_parse_name(name, dagname, DAGNAME_BUFSIZE, &dagstream))
1164                 {
1165                         (void) snprintf(errbuf, PCAP_ERRBUF_SIZE,
1166                             "dag: device name %s can't be parsed", name);
1167                         return (-1);
1168                 }
1169                 if ( (dagfd = dag_open(dagname)) >= 0 ) {
1170                         description = NULL;
1171                         if ((inf = dag_pciinfo(dagfd)))
1172                                 description = dag_device_name(inf->device_code, 1);
1173                         /*
1174                          * XXX - is there a way to determine whether
1175                          * the card is plugged into a network or not?
1176                          * If so, we should check that and set
1177                          * PCAP_IF_CONNECTION_STATUS_CONNECTED or
1178                          * PCAP_IF_CONNECTION_STATUS_DISCONNECTED.
1179                          *
1180                          * Also, are there notions of "up" and "running"?
1181                          */
1182                         if (add_dev(devlistp, name, 0, description, errbuf) == NULL) {
1183                                 /*
1184                                  * Failure.
1185                                  */
1186                                 return (-1);
1187                         }
1188                         rxstreams = dag_rx_get_stream_count(dagfd);
1189                         for(stream=0;stream<DAG_STREAM_MAX;stream+=2) {
1190                                 if (0 == dag_attach_stream64(dagfd, stream, 0, 0)) {
1191                                         dag_detach_stream(dagfd, stream);
1192
1193                                         snprintf(name,  10, "dag%d:%d", c, stream);
1194                                         if (add_dev(devlistp, name, 0, description, errbuf) == NULL) {
1195                                                 /*
1196                                                  * Failure.
1197                                                  */
1198                                                 return (-1);
1199                                         }
1200
1201                                         rxstreams--;
1202                                         if(rxstreams <= 0) {
1203                                                 break;
1204                                         }
1205                                 }
1206                         }
1207                         dag_close(dagfd);
1208                 }
1209
1210         }
1211         return (0);
1212 }
1213
1214 static int
1215 dag_set_datalink(pcap_t *p, int dlt)
1216 {
1217         p->linktype = dlt;
1218
1219         return (0);
1220 }
1221
1222 static int
1223 dag_setnonblock(pcap_t *p, int nonblock)
1224 {
1225         struct pcap_dag *pd = p->priv;
1226         dag_size_t mindata;
1227         struct timeval maxwait;
1228         struct timeval poll;
1229
1230         /*
1231          * Set non-blocking mode on the FD.
1232          * XXX - is that necessary?  If not, don't bother calling it,
1233          * and have a "dag_getnonblock()" function that looks at
1234          * "pd->dag_flags".
1235          */
1236         if (pcap_setnonblock_fd(p, nonblock) < 0)
1237                 return (-1);
1238
1239         if (dag_get_stream_poll64(p->fd, pd->dag_stream,
1240                                 &mindata, &maxwait, &poll) < 0) {
1241                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
1242                     errno, "dag_get_stream_poll");
1243                 return -1;
1244         }
1245
1246         /* Amount of data to collect in Bytes before calling callbacks.
1247          * Important for efficiency, but can introduce latency
1248          * at low packet rates if to_ms not set!
1249          */
1250         if(nonblock)
1251                 mindata = 0;
1252         else
1253                 mindata = 65536;
1254
1255         if (dag_set_stream_poll64(p->fd, pd->dag_stream,
1256                                 mindata, &maxwait, &poll) < 0) {
1257                 pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
1258                     errno, "dag_set_stream_poll");
1259                 return -1;
1260         }
1261
1262         if (nonblock) {
1263                 pd->dag_flags |= DAGF_NONBLOCK;
1264         } else {
1265                 pd->dag_flags &= ~DAGF_NONBLOCK;
1266         }
1267         return (0);
1268 }
1269
1270 static int
1271 dag_get_datalink(pcap_t *p)
1272 {
1273         struct pcap_dag *pd = p->priv;
1274         int index=0, dlt_index=0;
1275         uint8_t types[255];
1276
1277         memset(types, 0, 255);
1278
1279         if (p->dlt_list == NULL && (p->dlt_list = malloc(255*sizeof(*(p->dlt_list)))) == NULL) {
1280                 pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
1281                     errno, "malloc");
1282                 return (-1);
1283         }
1284
1285         p->linktype = 0;
1286
1287 #ifdef HAVE_DAG_GET_STREAM_ERF_TYPES
1288         /* Get list of possible ERF types for this card */
1289         if (dag_get_stream_erf_types(p->fd, pd->dag_stream, types, 255) < 0) {
1290                 pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
1291                     errno, "dag_get_stream_erf_types");
1292                 return (-1);
1293         }
1294
1295         while (types[index]) {
1296
1297 #elif defined HAVE_DAG_GET_ERF_TYPES
1298         /* Get list of possible ERF types for this card */
1299         if (dag_get_erf_types(p->fd, types, 255) < 0) {
1300                 pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
1301                     errno, "dag_get_erf_types");
1302                 return (-1);
1303         }
1304
1305         while (types[index]) {
1306 #else
1307         /* Check the type through a dagapi call. */
1308         types[index] = dag_linktype(p->fd);
1309
1310         {
1311 #endif
1312                 switch((types[index] & 0x7f)) {
1313
1314                 case ERF_TYPE_HDLC_POS:
1315                 case ERF_TYPE_COLOR_HDLC_POS:
1316                 case ERF_TYPE_DSM_COLOR_HDLC_POS:
1317                 case ERF_TYPE_COLOR_HASH_POS:
1318
1319                         if (p->dlt_list != NULL) {
1320                                 p->dlt_list[dlt_index++] = DLT_CHDLC;
1321                                 p->dlt_list[dlt_index++] = DLT_PPP_SERIAL;
1322                                 p->dlt_list[dlt_index++] = DLT_FRELAY;
1323                         }
1324                         if(!p->linktype)
1325                                 p->linktype = DLT_CHDLC;
1326                         break;
1327
1328                 case ERF_TYPE_ETH:
1329                 case ERF_TYPE_COLOR_ETH:
1330                 case ERF_TYPE_DSM_COLOR_ETH:
1331                 case ERF_TYPE_COLOR_HASH_ETH:
1332                         /*
1333                          * This is (presumably) a real Ethernet capture; give it a
1334                          * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so
1335                          * that an application can let you choose it, in case you're
1336                          * capturing DOCSIS traffic that a Cisco Cable Modem
1337                          * Termination System is putting out onto an Ethernet (it
1338                          * doesn't put an Ethernet header onto the wire, it puts raw
1339                          * DOCSIS frames out on the wire inside the low-level
1340                          * Ethernet framing).
1341                          */
1342                         if (p->dlt_list != NULL) {
1343                                 p->dlt_list[dlt_index++] = DLT_EN10MB;
1344                                 p->dlt_list[dlt_index++] = DLT_DOCSIS;
1345                         }
1346                         if(!p->linktype)
1347                                 p->linktype = DLT_EN10MB;
1348                         break;
1349
1350                 case ERF_TYPE_ATM:
1351                 case ERF_TYPE_AAL5:
1352                 case ERF_TYPE_MC_ATM:
1353                 case ERF_TYPE_MC_AAL5:
1354                         if (p->dlt_list != NULL) {
1355                                 p->dlt_list[dlt_index++] = DLT_ATM_RFC1483;
1356                                 p->dlt_list[dlt_index++] = DLT_SUNATM;
1357                         }
1358                         if(!p->linktype)
1359                                 p->linktype = DLT_ATM_RFC1483;
1360                         break;
1361
1362                 case ERF_TYPE_COLOR_MC_HDLC_POS:
1363                 case ERF_TYPE_MC_HDLC:
1364                         if (p->dlt_list != NULL) {
1365                                 p->dlt_list[dlt_index++] = DLT_CHDLC;
1366                                 p->dlt_list[dlt_index++] = DLT_PPP_SERIAL;
1367                                 p->dlt_list[dlt_index++] = DLT_FRELAY;
1368                                 p->dlt_list[dlt_index++] = DLT_MTP2;
1369                                 p->dlt_list[dlt_index++] = DLT_MTP2_WITH_PHDR;
1370                                 p->dlt_list[dlt_index++] = DLT_LAPD;
1371                         }
1372                         if(!p->linktype)
1373                                 p->linktype = DLT_CHDLC;
1374                         break;
1375
1376                 case ERF_TYPE_IPV4:
1377                         if (p->dlt_list != NULL) {
1378                                 p->dlt_list[dlt_index++] = DLT_RAW;
1379                                 p->dlt_list[dlt_index++] = DLT_IPV4;
1380                         }
1381                         if(!p->linktype)
1382                                 p->linktype = DLT_RAW;
1383                         break;
1384
1385                 case ERF_TYPE_IPV6:
1386                         if (p->dlt_list != NULL) {
1387                                 p->dlt_list[dlt_index++] = DLT_RAW;
1388                                 p->dlt_list[dlt_index++] = DLT_IPV6;
1389                         }
1390                         if(!p->linktype)
1391                                 p->linktype = DLT_RAW;
1392                         break;
1393
1394                 case ERF_TYPE_LEGACY:
1395                 case ERF_TYPE_MC_RAW:
1396                 case ERF_TYPE_MC_RAW_CHANNEL:
1397                 case ERF_TYPE_IP_COUNTER:
1398                 case ERF_TYPE_TCP_FLOW_COUNTER:
1399                 case ERF_TYPE_INFINIBAND:
1400                 case ERF_TYPE_RAW_LINK:
1401                 case ERF_TYPE_INFINIBAND_LINK:
1402                 case ERF_TYPE_META:
1403                 default:
1404                         /* Libpcap cannot deal with these types yet */
1405                         /* Add no 'native' DLTs, but still covered by DLT_ERF */
1406                         break;
1407
1408                 } /* switch */
1409                 index++;
1410         }
1411
1412         p->dlt_list[dlt_index++] = DLT_ERF;
1413
1414         p->dlt_count = dlt_index;
1415
1416         if(!p->linktype)
1417                 p->linktype = DLT_ERF;
1418
1419         return p->linktype;
1420 }
1421
1422 #ifdef DAG_ONLY
1423 /*
1424  * This libpcap build supports only DAG cards, not regular network
1425  * interfaces.
1426  */
1427
1428 /*
1429  * There are no regular interfaces, just DAG interfaces.
1430  */
1431 int
1432 pcap_platform_finddevs(pcap_if_list_t *devlistp _U_, char *errbuf)
1433 {
1434         return (0);
1435 }
1436
1437 /*
1438  * Attempts to open a regular interface fail.
1439  */
1440 pcap_t *
1441 pcap_create_interface(const char *device, char *errbuf)
1442 {
1443         snprintf(errbuf, PCAP_ERRBUF_SIZE,
1444             "This version of libpcap only supports DAG cards");
1445         return NULL;
1446 }
1447
1448 /*
1449  * Libpcap version string.
1450  */
1451 const char *
1452 pcap_lib_version(void)
1453 {
1454         return (PCAP_VERSION_STRING " (DAG-only)");
1455 }
1456 #endif