Lines Matching +full:pd +full:- +full:node

2  * pcap-dag.c: Packet capture interface for Endace DAG cards.
18 #include "pcap-int.h"
35 #include "pcap-dag.h"
218 for (prev = NULL, curr = pcap_dags; curr != NULL && curr->p != p; prev = curr, curr = curr->next) { in delete_pcap_dag()
222 if (curr != NULL && curr->p == p) { in delete_pcap_dag()
224 prev->next = curr->next; in delete_pcap_dag()
226 pcap_dags = curr->next; in delete_pcap_dag()
239 struct pcap_dag *pd = p->priv; in dag_platform_cleanup() local
241 if(dag_stop_stream(p->fd, pd->dag_stream) < 0) in dag_platform_cleanup()
244 if(dag_detach_stream(p->fd, pd->dag_stream) < 0) in dag_platform_cleanup()
247 if(pd->dag_ref != NULL) { in dag_platform_cleanup()
248 dag_config_dispose(pd->dag_ref); in dag_platform_cleanup()
250 * Note: we don't need to call close(p->fd) or in dag_platform_cleanup()
251 * dag_close(p->fd), as dag_config_dispose(pd->dag_ref) in dag_platform_cleanup()
254 * Set p->fd to -1 to make sure that's not done. in dag_platform_cleanup()
256 p->fd = -1; in dag_platform_cleanup()
257 pd->dag_ref = NULL; in dag_platform_cleanup()
267 if (pcap_dags->pid == getpid()) { in atexit_handler()
268 if (pcap_dags->p != NULL) in atexit_handler()
269 dag_platform_cleanup(pcap_dags->p); in atexit_handler()
271 delete_pcap_dag(pcap_dags->p); in atexit_handler()
279 pcap_dag_node_t *node = NULL; in new_pcap_dag() local
281 if ((node = malloc(sizeof(pcap_dag_node_t))) == NULL) { in new_pcap_dag()
282 return -1; in new_pcap_dag()
290 node->next = pcap_dags; in new_pcap_dag()
291 node->p = p; in new_pcap_dag()
292 node->pid = getpid(); in new_pcap_dag()
294 pcap_dags = node; in new_pcap_dag()
333 * for each of them. Returns the number of packets handled, -1 if an
334 * error occurred, or -2 if we were told to break out of the loop.
339 struct pcap_dag *pd = p->priv; in dag_read() local
341 unsigned int nonblocking = pd->dag_flags & DAGF_NONBLOCK; in dag_read()
346 while (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size) { in dag_read()
351 if (p->break_loop) { in dag_read()
353 * Yes - clear the flag that indicates that in dag_read()
354 * it has, and return -2 to indicate that in dag_read()
357 p->break_loop = 0; in dag_read()
358 return -2; in dag_read()
369 * If non-block is specified it will return immediately. The user in dag_read()
372 …if ( NULL == (pd->dag_mem_top = dag_advance_stream(p->fd, pd->dag_stream, &(pd->dag_mem_bottom))) … in dag_read()
373 return -1; in dag_read()
376 if (nonblocking && (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size)) in dag_read()
383 pd->dag_timeout && in dag_read()
384 (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size)) in dag_read()
398 while (pd->dag_mem_top - pd->dag_mem_bottom >= dag_record_size) { in dag_read()
404 dag_record_t *header = (dag_record_t *)(pd->dag_mem_bottom); in dag_read()
412 if (p->break_loop) { in dag_read()
414 * Yes - clear the flag that indicates that in dag_read()
415 * it has, and return -2 to indicate that in dag_read()
418 p->break_loop = 0; in dag_read()
419 return -2; in dag_read()
422 rlen = ntohs(header->rlen); in dag_read()
425 pcapint_strlcpy(p->errbuf, "dag_read: record too small", in dag_read()
427 return -1; in dag_read()
429 pd->dag_mem_bottom += rlen; in dag_read()
432 switch((header->type & 0x7f)) { in dag_read()
444 if ( (pd->drop_attr == kNullAttributeUuid) && (header->lctr) ) { in dag_read()
445 pd->stat.ps_drop += ntohs(header->lctr); in dag_read()
449 if ((header->type & 0x7f) == ERF_TYPE_PAD) { in dag_read()
461 * o the length of the packet on the link (header->wlen), in dag_read()
469 if (p->linktype == DLT_ERF) { in dag_read()
470 packet_len = ntohs(header->wlen) + dag_record_size; in dag_read()
472 switch ((header->type & 0x7f)) { in dag_read()
505 switch((header->type & 0x7f)) { in dag_read()
508 if ((header->type & 0x7f) == ERF_TYPE_AAL5) { in dag_read()
509 packet_len = ntohs(header->wlen); in dag_read()
510 caplen = rlen - dag_record_size; in dag_read()
513 if ((header->type & 0x7f) == ERF_TYPE_MC_ATM) { in dag_read()
518 if ((header->type & 0x7f) == ERF_TYPE_MC_AAL5) { in dag_read()
519 packet_len = ntohs(header->wlen); in dag_read()
520 caplen = rlen - dag_record_size - 4; in dag_read()
524 caplen -= (8 * num_ext_hdr); in dag_read()
526 if ((header->type & 0x7f) == ERF_TYPE_ATM) { in dag_read()
529 if (p->linktype == DLT_SUNATM) { in dag_read()
534 sunatm->vci = htons((rawatm >> 4) & 0xffff); in dag_read()
535 sunatm->vpi = (rawatm >> 20) & 0x00ff; in dag_read()
536 sunatm->flags = ((header->flags.iface & 1) ? 0x80 : 0x00) | in dag_read()
537 ((sunatm->vpi == 0 && sunatm->vci == htons(5)) ? 6 : in dag_read()
538 ((sunatm->vpi == 0 && sunatm->vci == htons(16)) ? 5 : in dag_read()
543 } else if (p->linktype == DLT_ATM_RFC1483) { in dag_read()
544 packet_len -= ATM_HDR_SIZE; in dag_read()
545 caplen -= ATM_HDR_SIZE; in dag_read()
555 if ((p->linktype != DLT_EN10MB) && in dag_read()
556 (p->linktype != DLT_DOCSIS)) in dag_read()
558 packet_len = ntohs(header->wlen); in dag_read()
559 packet_len -= (pd->dag_fcs_bits >> 3); in dag_read()
560 caplen = rlen - dag_record_size - 2; in dag_read()
562 caplen -= (8 * num_ext_hdr); in dag_read()
573 if ((p->linktype != DLT_CHDLC) && in dag_read()
574 (p->linktype != DLT_PPP_SERIAL) && in dag_read()
575 (p->linktype != DLT_FRELAY)) in dag_read()
577 packet_len = ntohs(header->wlen); in dag_read()
578 packet_len -= (pd->dag_fcs_bits >> 3); in dag_read()
579 caplen = rlen - dag_record_size; in dag_read()
581 caplen -= (8 * num_ext_hdr); in dag_read()
589 if ((p->linktype != DLT_CHDLC) && in dag_read()
590 (p->linktype != DLT_PPP_SERIAL) && in dag_read()
591 (p->linktype != DLT_FRELAY) && in dag_read()
592 (p->linktype != DLT_MTP2) && in dag_read()
593 (p->linktype != DLT_MTP2_WITH_PHDR) && in dag_read()
594 (p->linktype != DLT_LAPD)) in dag_read()
596 packet_len = ntohs(header->wlen); in dag_read()
597 packet_len -= (pd->dag_fcs_bits >> 3); in dag_read()
598 caplen = rlen - dag_record_size - 4; in dag_read()
600 caplen -= (8 * num_ext_hdr); in dag_read()
607 if (p->linktype == DLT_MTP2_WITH_PHDR) { in dag_read()
614 *(TempPkt+MTP2_LINK_NUMBER_OFFSET) = ((header->rec.mc_hdlc.mc_header>>16)&0x01); in dag_read()
615 *(TempPkt+MTP2_LINK_NUMBER_OFFSET+1) = ((header->rec.mc_hdlc.mc_header>>24)&0xff); in dag_read()
623 if ((p->linktype != DLT_RAW) && in dag_read()
624 (p->linktype != DLT_IPV4)) in dag_read()
626 packet_len = ntohs(header->wlen); in dag_read()
627 caplen = rlen - dag_record_size; in dag_read()
629 caplen -= (8 * num_ext_hdr); in dag_read()
636 if ((p->linktype != DLT_RAW) && in dag_read()
637 (p->linktype != DLT_IPV6)) in dag_read()
639 packet_len = ntohs(header->wlen); in dag_read()
640 caplen = rlen - dag_record_size; in dag_read()
642 caplen -= (8 * num_ext_hdr); in dag_read()
665 if (caplen > p->snapshot) in dag_read()
666 caplen = p->snapshot; in dag_read()
669 if ((p->fcode.bf_insns == NULL) || pcapint_filter(p->fcode.bf_insns, dp, packet_len, caplen)) { in dag_read()
675 ts = SWAPLL(header->ts); in dag_read()
677 ts = header->ts; in dag_read()
680 switch (p->opt.tstamp_precision) { in dag_read()
695 pcap_header.ts.tv_usec -= ticks_per_second; in dag_read()
704 pd->stat.ps_recv++; in dag_read()
713 /* Reached the user-specified limit. */ in dag_read()
725 pcapint_strlcpy(p->errbuf, "Sending packets isn't supported on DAG cards", in dag_inject()
727 return (-1); in dag_inject()
736 * snaplen is now also ignored, until we get per-stream slen support. Set
743 struct pcap_dag *pd = p->priv; in dag_activate() local
748 char * device = p->opt.device; in dag_activate()
755 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "device is NULL"); in dag_activate()
763 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
769 if (dag_parse_name(device, newDev, strlen(device) + 16, &pd->dag_stream) < 0) { in dag_activate()
771 * XXX - it'd be nice if this indicated what was wrong in dag_activate()
777 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
783 if (pd->dag_stream%2) { in dag_activate()
785 …snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "dag_parse_name: tx (even numbered) streams not supported fo… in dag_activate()
790 if((pd->dag_ref = dag_config_init((char *)device)) == NULL) { in dag_activate()
792 * XXX - does this reliably set errno? in dag_activate()
800 p->errbuf[0] = '\0'; in dag_activate()
803 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
804 "Attempt to open %s failed with %s - additional privileges may be required", in dag_activate()
808 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
814 if((p->fd = dag_config_get_card_fd(pd->dag_ref)) < 0) { in dag_activate()
816 * XXX - does this reliably set errno? in dag_activate()
819 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
825 if (dag_attach_stream64(p->fd, pd->dag_stream, 0, 0) < 0) { in dag_activate()
827 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
833 pd->drop_attr = kNullAttributeUuid; in dag_activate()
834 pd->dag_root = dag_config_get_root_component(pd->dag_ref); in dag_activate()
835 if ( dag_component_get_subcomponent(pd->dag_root, kComponentStreamFeatures, 0) ) in dag_activate()
837pd->drop_attr = dag_config_get_indexed_attribute_uuid(pd->dag_ref, kUint32AttributeStreamDropCount… in dag_activate()
843 if (dag_get_stream_poll64(p->fd, pd->dag_stream, in dag_activate()
846 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
855 pd->required_select_timeout = poll; in dag_activate()
856 p->required_select_timeout = &pd->required_select_timeout; in dag_activate()
866 if (p->snapshot <= 0 || p->snapshot > MAXIMUM_SNAPLEN) in dag_activate()
867 p->snapshot = MAXIMUM_SNAPLEN; in dag_activate()
869 if (p->opt.immediate) { in dag_activate()
871 * XXX - is this the right way to p this? in dag_activate()
883 * Recommend 10-100ms. Calls will time out even if no data arrived. in dag_activate()
885 maxwait.tv_sec = p->opt.timeout/1000; in dag_activate()
886 maxwait.tv_usec = (p->opt.timeout%1000) * 1000; in dag_activate()
888 if (dag_set_stream_poll64(p->fd, pd->dag_stream, in dag_activate()
891 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
897 * multi-stream environments as the gpp config is global. in dag_activate()
898 * Once the firmware provides 'per-stream slen' this can be supported in dag_activate()
899 * again via the Config API without side-effects */ in dag_activate()
904 if (p->snapshot == 0 || p->snapshot > MAX_DAG_SNAPLEN) { in dag_activate()
905 p->snapshot = MAX_DAG_SNAPLEN; in dag_activate()
907 p->snapshot = MIN_DAG_SNAPLEN; in dag_activate()
912 if(dag_start_stream(p->fd, pd->dag_stream) < 0) { in dag_activate()
914 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
924 pd->dag_mem_bottom = 0; in dag_activate()
925 pd->dag_mem_top = 0; in dag_activate()
931 daginf = dag_info(p->fd); in dag_activate()
932 if ((0x4200 == daginf->device_code) || (0x4230 == daginf->device_code)) { in dag_activate()
934 pd->dag_fcs_bits = 0; in dag_activate()
937 p->linktype_ext = LT_FCS_DATALINK_EXT(0); in dag_activate()
942 pd->dag_fcs_bits = 32; in dag_activate()
947 pd->dag_fcs_bits = n; in dag_activate()
950 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
960 /* Yes. Note the number of 16-bit words that will be in dag_activate()
962 p->linktype_ext = LT_FCS_DATALINK_EXT(pd->dag_fcs_bits/16); in dag_activate()
965 pd->dag_fcs_bits = 0; in dag_activate()
969 pd->dag_timeout = p->opt.timeout; in dag_activate()
971 p->linktype = -1; in dag_activate()
977 p->bufsize = 0; in dag_activate()
981 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_activate()
989 p->selectable_fd = -1; in dag_activate()
995 p->read_op = dag_read; in dag_activate()
996 p->inject_op = dag_inject; in dag_activate()
997 p->setfilter_op = pcapint_install_bpf_program; in dag_activate()
998 p->setdirection_op = NULL; /* Not implemented.*/ in dag_activate()
999 p->set_datalink_op = dag_set_datalink; in dag_activate()
1000 p->getnonblock_op = pcapint_getnonblock_fd; in dag_activate()
1001 p->setnonblock_op = dag_setnonblock; in dag_activate()
1002 p->stats_op = dag_stats; in dag_activate()
1003 p->cleanup_op = dag_platform_cleanup; in dag_activate()
1004 pd->stat.ps_drop = 0; in dag_activate()
1005 pd->stat.ps_recv = 0; in dag_activate()
1006 pd->stat.ps_ifdrop = 0; in dag_activate()
1010 if (dag_stop_stream(p->fd, pd->dag_stream) < 0) { in dag_activate()
1015 if (dag_detach_stream(p->fd, pd->dag_stream) < 0) in dag_activate()
1019 dag_config_dispose(pd->dag_ref); in dag_activate()
1021 * Note: we don't need to call close(p->fd) or dag_close(p->fd), in dag_activate()
1022 * as dag_config_dispose(pd->dag_ref) does this. in dag_activate()
1024 * Set p->fd to -1 to make sure that's not done. in dag_activate()
1026 p->fd = -1; in dag_activate()
1027 pd->dag_ref = NULL; in dag_activate()
1057 /* Yes - is "dag" followed by a number from 0 to DAG_MAX_BOARDS-1 */ in dag_create()
1072 /* Followed by a non-valid number. */ in dag_create()
1078 /* Followed by a non-valid stream number. */ in dag_create()
1090 p->activate_op = dag_activate; in dag_create()
1096 * XXX Our native precision is 2^-32s, but libpcap doesn't support in dag_create()
1099 p->tstamp_precision_list = malloc(2 * sizeof(u_int)); in dag_create()
1100 if (p->tstamp_precision_list == NULL) { in dag_create()
1106 p->tstamp_precision_list[0] = PCAP_TSTAMP_PRECISION_MICRO; in dag_create()
1107 p->tstamp_precision_list[1] = PCAP_TSTAMP_PRECISION_NANO; in dag_create()
1108 p->tstamp_precision_count = 2; in dag_create()
1114 struct pcap_dag *pd = p->priv; in dag_stats() local
1125 if(pd->drop_attr != kNullAttributeUuid) { in dag_stats()
1129 …if ((dag_error = dag_config_get_uint32_attribute_ex(pd->dag_ref, pd->drop_attr, &stream_drop)) == … in dag_stats()
1130 pd->stat.ps_drop = stream_drop; in dag_stats()
1132 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "reading stream drop attribute: %s", in dag_stats()
1134 return -1; in dag_stats()
1138 *ps = pd->stat; in dag_stats()
1149 char name[12]; /* XXX - pick a size */ in dag_findalldevs()
1158 /* Try all the DAGs 0-DAG_MAX_BOARDS */ in dag_findalldevs()
1161 if (-1 == dag_parse_name(name, dagname, DAGNAME_BUFSIZE, &dagstream)) in dag_findalldevs()
1165 return (-1); in dag_findalldevs()
1170 description = dag_device_name(inf->device_code, 1); in dag_findalldevs()
1172 * XXX - is there a way to determine whether in dag_findalldevs()
1184 return (-1); in dag_findalldevs()
1196 return (-1); in dag_findalldevs()
1199 rxstreams--; in dag_findalldevs()
1215 p->linktype = dlt; in dag_set_datalink()
1223 struct pcap_dag *pd = p->priv; in dag_setnonblock() local
1229 * Set non-blocking mode on the FD. in dag_setnonblock()
1230 * XXX - is that necessary? If not, don't bother calling it, in dag_setnonblock()
1232 * "pd->dag_flags". in dag_setnonblock()
1235 return (-1); in dag_setnonblock()
1237 if (dag_get_stream_poll64(p->fd, pd->dag_stream, in dag_setnonblock()
1239 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_setnonblock()
1241 return -1; in dag_setnonblock()
1253 if (dag_set_stream_poll64(p->fd, pd->dag_stream, in dag_setnonblock()
1255 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in dag_setnonblock()
1257 return -1; in dag_setnonblock()
1261 pd->dag_flags |= DAGF_NONBLOCK; in dag_setnonblock()
1263 pd->dag_flags &= ~DAGF_NONBLOCK; in dag_setnonblock()
1271 struct pcap_dag *pd = p->priv; local
1277 if (p->dlt_list == NULL && (p->dlt_list = malloc(255*sizeof(*(p->dlt_list)))) == NULL) {
1278 pcapint_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
1280 return (-1);
1283 p->linktype = 0;
1287 if (dag_get_stream_erf_types(p->fd, pd->dag_stream, types, 255) < 0) {
1288 pcapint_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
1290 return (-1);
1297 if (dag_get_erf_types(p->fd, types, 255) < 0) {
1298 pcapint_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
1300 return (-1);
1306 types[index] = dag_linktype(p->fd);
1316 p->dlt_list[dlt_index++] = DLT_CHDLC;
1317 p->dlt_list[dlt_index++] = DLT_PPP_SERIAL;
1318 p->dlt_list[dlt_index++] = DLT_FRELAY;
1319 if(!p->linktype)
1320 p->linktype = DLT_CHDLC;
1329 * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so
1334 * DOCSIS frames out on the wire inside the low-level
1337 p->dlt_list[dlt_index++] = DLT_EN10MB;
1338 p->dlt_list[dlt_index++] = DLT_DOCSIS;
1339 if(!p->linktype)
1340 p->linktype = DLT_EN10MB;
1347 p->dlt_list[dlt_index++] = DLT_ATM_RFC1483;
1348 p->dlt_list[dlt_index++] = DLT_SUNATM;
1349 if(!p->linktype)
1350 p->linktype = DLT_ATM_RFC1483;
1355 p->dlt_list[dlt_index++] = DLT_CHDLC;
1356 p->dlt_list[dlt_index++] = DLT_PPP_SERIAL;
1357 p->dlt_list[dlt_index++] = DLT_FRELAY;
1358 p->dlt_list[dlt_index++] = DLT_MTP2;
1359 p->dlt_list[dlt_index++] = DLT_MTP2_WITH_PHDR;
1360 p->dlt_list[dlt_index++] = DLT_LAPD;
1361 if(!p->linktype)
1362 p->linktype = DLT_CHDLC;
1366 p->dlt_list[dlt_index++] = DLT_RAW;
1367 p->dlt_list[dlt_index++] = DLT_IPV4;
1368 if(!p->linktype)
1369 p->linktype = DLT_RAW;
1373 p->dlt_list[dlt_index++] = DLT_RAW;
1374 p->dlt_list[dlt_index++] = DLT_IPV6;
1375 if(!p->linktype)
1376 p->linktype = DLT_RAW;
1397 p->dlt_list[dlt_index++] = DLT_ERF;
1399 p->dlt_count = dlt_index;
1401 if(!p->linktype)
1402 p->linktype = DLT_ERF;
1404 return p->linktype;
1439 return (PCAP_VERSION_STRING " (DAG-only)");