+
+static int
+dag_get_datalink(pcap_t *p)
+{
+ int linktype = -1;
+
+ /* Check the type through a dagapi call.
+ */
+ switch(dag_linktype(p->fd)) {
+ case TYPE_HDLC_POS: {
+ dag_record_t *record;
+
+ /* peek at the first available record to see if it is PPP */
+ while ((p->md.dag_mem_top - p->md.dag_mem_bottom) < (dag_record_size + 4)) {
+ p->md.dag_mem_top = dag_offset(p->fd, &(p->md.dag_mem_bottom), 0);
+ }
+ record = (dag_record_t *)(p->md.dag_mem_base + p->md.dag_mem_bottom);
+
+ if ((ntohl(record->rec.pos.hdlc) & 0xffff0000) == 0xff030000) {
+ linktype = DLT_PPP_SERIAL;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_PPP_SERIAL)\n", linktype);
+ } else {
+ linktype = DLT_CHDLC;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_CHDLC)\n", linktype);
+ }
+ break;
+ }
+ case TYPE_ETH:
+ linktype = DLT_EN10MB;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_EN10MB)\n", linktype);
+ break;
+ case TYPE_ATM:
+ linktype = DLT_ATM_RFC1483;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_ATM_RFC1483)\n", linktype);
+ break;
+ case TYPE_LEGACY:
+ linktype = DLT_NULL;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_NULL)\n", linktype);
+ break;
+ default:
+ fprintf(stderr, "Unknown DAG linktype %d\n", dag_linktype(p->fd));
+ break;
+ }
+
+ return linktype;
+}