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 1457