diff --git a/print-juniper.c b/print-juniper.c
index 1789fb5..e4bb77c 100644
--- a/print-juniper.c
+++ b/print-juniper.c
@@ -1,6 +1,6 @@
 /*     NetBSD: print-juniper.c,v 1.2 2007/07/24 11:53:45 drochner Exp        */
 
-/* 
+/*
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that: (1) source code
  * distributions retain the above copyright notice and this paragraph
@@ -16,21 +16,17 @@
  */
 
 #ifndef lint
-static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-juniper.c,v 1.34 2007-08-29 02:31:44 mcr Exp $ (LBL)";
 #else
 __RCSID("NetBSD: print-juniper.c,v 1.3 2007/07/25 06:31:32 dogcow Exp ");
 #endif
 
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <tcpdump-stdinc.h>
 
-#include <pcap.h>
-#include <stdio.h>
-
 #include "interface.h"
 #include "addrtoname.h"
 #include "extract.h"
@@ -87,8 +83,8 @@
     JUNIPER_EXT_TLV_IFD_MEDIATYPE = 3,
     JUNIPER_EXT_TLV_IFL_IDX = 4,
     JUNIPER_EXT_TLV_IFL_UNIT = 5,
-    JUNIPER_EXT_TLV_IFL_ENCAPS = 6, 
-    JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE = 7,  
+    JUNIPER_EXT_TLV_IFL_ENCAPS = 6,
+    JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE = 7,
     JUNIPER_EXT_TLV_TTP_IFL_ENCAPS = 8
 };
 
@@ -366,12 +362,12 @@
 };
 
 struct juniper_cookie_table_t {
-    u_int32_t pictype;		/* pic type */
-    u_int8_t  cookie_len;       /* cookie len */
+    uint32_t pictype;		/* pic type */
+    uint8_t  cookie_len;       /* cookie len */
     const char *s;		/* pic name */
 };
 
-static struct juniper_cookie_table_t juniper_cookie_table[] = {
+static const struct juniper_cookie_table_t juniper_cookie_table[] = {
 #ifdef DLT_JUNIPER_ATM1
     { DLT_JUNIPER_ATM1,  4, "ATM1"},
 #endif
@@ -409,17 +405,17 @@
 };
 
 struct juniper_l2info_t {
-    u_int32_t length;
-    u_int32_t caplen;
-    u_int32_t pictype;
-    u_int8_t direction;
-    u_int8_t header_len;
-    u_int8_t cookie_len;
-    u_int8_t cookie_type;
-    u_int8_t cookie[8];
-    u_int8_t bundle;
-    u_int16_t proto;
-    u_int8_t flags;
+    uint32_t length;
+    uint32_t caplen;
+    uint32_t pictype;
+    uint8_t direction;
+    uint8_t header_len;
+    uint8_t cookie_len;
+    uint8_t cookie_type;
+    uint8_t cookie[8];
+    uint8_t bundle;
+    uint16_t proto;
+    uint8_t flags;
 };
 
 #define LS_COOKIE_ID            0x54
@@ -446,52 +442,50 @@
     { 0, NULL}
 };
 
-int ip_heuristic_guess(register const u_char *, u_int);
-int juniper_ppp_heuristic_guess(register const u_char *, u_int);
-int juniper_read_tlv_value(const u_char *, u_int, u_int);
-static int juniper_parse_header (const u_char *, const struct pcap_pkthdr *, struct juniper_l2info_t *);
+static int ip_heuristic_guess(netdissect_options *, register const u_char *, u_int);
+static int juniper_ppp_heuristic_guess(netdissect_options *, register const u_char *, u_int);
+static int juniper_parse_header(netdissect_options *, const u_char *, const struct pcap_pkthdr *, struct juniper_l2info_t *);
 
 #ifdef DLT_JUNIPER_GGSN
 u_int
-juniper_ggsn_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_ggsn_print(netdissect_options *ndo,
+                   const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
         struct juniper_ggsn_header {
-            u_int8_t svc_id;
-            u_int8_t flags_len;
-            u_int8_t proto;
-            u_int8_t flags;
-            u_int8_t vlan_id[2];
-            u_int8_t res[2];
+            uint8_t svc_id;
+            uint8_t flags_len;
+            uint8_t proto;
+            uint8_t flags;
+            uint8_t vlan_id[2];
+            uint8_t res[2];
         };
         const struct juniper_ggsn_header *gh;
 
         l2info.pictype = DLT_JUNIPER_GGSN;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         gh = (struct juniper_ggsn_header *)&l2info.cookie;
 
-        if (eflag) {
-            printf("proto %s (%u), vlan %u: ",
+        if (ndo->ndo_eflag) {
+            ND_PRINT((ndo, "proto %s (%u), vlan %u: ",
                    tok2str(juniper_protocol_values,"Unknown",gh->proto),
                    gh->proto,
-                   EXTRACT_16BITS(&gh->vlan_id[0]));
+                   EXTRACT_16BITS(&gh->vlan_id[0])));
         }
 
         switch (gh->proto) {
         case JUNIPER_PROTO_IPV4:
-            ip_print(gndo, p, l2info.length);
+            ip_print(ndo, p, l2info.length);
             break;
-#ifdef INET6
         case JUNIPER_PROTO_IPV6:
-            ip6_print(gndo, p, l2info.length);
+            ip6_print(ndo, p, l2info.length);
             break;
-#endif /* INET6 */
         default:
-            if (!eflag)
-                printf("unknown GGSN proto (%u)", gh->proto);
+            if (!ndo->ndo_eflag)
+                ND_PRINT((ndo, "unknown GGSN proto (%u)", gh->proto));
         }
 
         return l2info.header_len;
@@ -500,22 +494,23 @@
 
 #ifdef DLT_JUNIPER_ES
 u_int
-juniper_es_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_es_print(netdissect_options *ndo,
+                 const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
         struct juniper_ipsec_header {
-            u_int8_t sa_index[2];
-            u_int8_t ttl;
-            u_int8_t type;
-            u_int8_t spi[4];
-            u_int8_t src_ip[4];
-            u_int8_t dst_ip[4];
+            uint8_t sa_index[2];
+            uint8_t ttl;
+            uint8_t type;
+            uint8_t spi[4];
+            uint8_t src_ip[4];
+            uint8_t dst_ip[4];
         };
         u_int rewrite_len,es_type_bundle;
         const struct juniper_ipsec_header *ih;
 
         l2info.pictype = DLT_JUNIPER_ES;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
@@ -532,70 +527,72 @@
         case JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE:
             rewrite_len = 16;
             es_type_bundle = 0;
+            break;
         default:
-            printf("ES Invalid type %u, length %u",
+            ND_PRINT((ndo, "ES Invalid type %u, length %u",
                    ih->type,
-                   l2info.length);
+                   l2info.length));
             return l2info.header_len;
         }
 
         l2info.length-=rewrite_len;
         p+=rewrite_len;
 
-        if (eflag) {
+        if (ndo->ndo_eflag) {
             if (!es_type_bundle) {
-                printf("ES SA, index %u, ttl %u type %s (%u), spi %u, Tunnel %s > %s, length %u\n", 
+                ND_PRINT((ndo, "ES SA, index %u, ttl %u type %s (%u), spi %u, Tunnel %s > %s, length %u\n",
                        EXTRACT_16BITS(&ih->sa_index),
-                       ih->ttl, 
+                       ih->ttl,
                        tok2str(juniper_ipsec_type_values,"Unknown",ih->type),
                        ih->type,
                        EXTRACT_32BITS(&ih->spi),
-                       ipaddr_string(&ih->src_ip),
-                       ipaddr_string(&ih->dst_ip),
-                       l2info.length);
+                       ipaddr_string(ndo, &ih->src_ip),
+                       ipaddr_string(ndo, &ih->dst_ip),
+                       l2info.length));
             } else {
-                printf("ES SA, index %u, ttl %u type %s (%u), length %u\n", 
+                ND_PRINT((ndo, "ES SA, index %u, ttl %u type %s (%u), length %u\n",
                        EXTRACT_16BITS(&ih->sa_index),
-                       ih->ttl, 
+                       ih->ttl,
                        tok2str(juniper_ipsec_type_values,"Unknown",ih->type),
                        ih->type,
-                       l2info.length);
+                       l2info.length));
             }
         }
 
-        ip_print(gndo, p, l2info.length);
+        ip_print(ndo, p, l2info.length);
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_MONITOR
 u_int
-juniper_monitor_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_monitor_print(netdissect_options *ndo,
+                      const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
         struct juniper_monitor_header {
-            u_int8_t pkt_type;
-            u_int8_t padding;
-            u_int8_t iif[2];
-            u_int8_t service_id[4];
+            uint8_t pkt_type;
+            uint8_t padding;
+            uint8_t iif[2];
+            uint8_t service_id[4];
         };
         const struct juniper_monitor_header *mh;
 
         l2info.pictype = DLT_JUNIPER_MONITOR;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         mh = (struct juniper_monitor_header *)p;
 
-        if (eflag)
-            printf("service-id %u, iif %u, pkt-type %u: ",
+        if (ndo->ndo_eflag)
+            ND_PRINT((ndo, "service-id %u, iif %u, pkt-type %u: ",
                    EXTRACT_32BITS(&mh->service_id),
                    EXTRACT_16BITS(&mh->iif),
-                   mh->pkt_type);
+                   mh->pkt_type));
 
         /* no proto field - lets guess by first byte of IP header*/
-        ip_heuristic_guess(p, l2info.length);
+        ip_heuristic_guess (ndo, p, l2info.length);
 
         return l2info.header_len;
 }
@@ -603,33 +600,34 @@
 
 #ifdef DLT_JUNIPER_SERVICES
 u_int
-juniper_services_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_services_print(netdissect_options *ndo,
+                       const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
         struct juniper_services_header {
-            u_int8_t svc_id;
-            u_int8_t flags_len;
-            u_int8_t svc_set_id[2];
-            u_int8_t dir_iif[4];
+            uint8_t svc_id;
+            uint8_t flags_len;
+            uint8_t svc_set_id[2];
+            uint8_t dir_iif[4];
         };
         const struct juniper_services_header *sh;
 
         l2info.pictype = DLT_JUNIPER_SERVICES;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         sh = (struct juniper_services_header *)p;
 
-        if (eflag)
-            printf("service-id %u flags 0x%02x service-set-id 0x%04x iif %u: ",
+        if (ndo->ndo_eflag)
+            ND_PRINT((ndo, "service-id %u flags 0x%02x service-set-id 0x%04x iif %u: ",
                    sh->svc_id,
                    sh->flags_len,
                    EXTRACT_16BITS(&sh->svc_set_id),
-                   EXTRACT_24BITS(&sh->dir_iif[1]));
+                   EXTRACT_24BITS(&sh->dir_iif[1])));
 
         /* no proto field - lets guess by first byte of IP header*/
-        ip_heuristic_guess(p, l2info.length);
+        ip_heuristic_guess (ndo, p, l2info.length);
 
         return l2info.header_len;
 }
@@ -637,98 +635,104 @@
 
 #ifdef DLT_JUNIPER_PPPOE
 u_int
-juniper_pppoe_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_pppoe_print(netdissect_options *ndo,
+                    const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_PPPOE;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         /* this DLT contains nothing but raw ethernet frames */
-        ether_print(gndo, p, l2info.length, l2info.caplen, NULL, NULL);
+        ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_ETHER
 u_int
-juniper_ether_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_ether_print(netdissect_options *ndo,
+                    const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_ETHER;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         /* this DLT contains nothing but raw Ethernet frames */
-        ether_print(gndo, p, l2info.length, l2info.caplen, NULL, NULL);
+        ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_PPP
 u_int
-juniper_ppp_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_ppp_print(netdissect_options *ndo,
+                  const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_PPP;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         /* this DLT contains nothing but raw ppp frames */
-        ppp_print(p, l2info.length);
+        ppp_print(ndo, p, l2info.length);
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_FRELAY
 u_int
-juniper_frelay_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_frelay_print(netdissect_options *ndo,
+                     const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_FRELAY;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         /* this DLT contains nothing but raw frame-relay frames */
-        fr_print(p, l2info.length);
+        fr_print(ndo, p, l2info.length);
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_CHDLC
 u_int
-juniper_chdlc_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_chdlc_print(netdissect_options *ndo,
+                    const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_CHDLC;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
         /* this DLT contains nothing but raw c-hdlc frames */
-        chdlc_print(p, l2info.length);
+        chdlc_print(ndo, p, l2info.length);
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_PPPOE_ATM
 u_int
-juniper_pppoe_atm_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_pppoe_atm_print(netdissect_options *ndo,
+                        const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
-	u_int16_t extracted_ethertype;
+	uint16_t extracted_ethertype;
 
         l2info.pictype = DLT_JUNIPER_PPPOE_ATM;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
@@ -736,33 +740,34 @@
         extracted_ethertype = EXTRACT_16BITS(p);
         /* this DLT contains nothing but raw PPPoE frames,
          * prepended with a type field*/
-        if (ethertype_print(gndo, extracted_ethertype,
+        if (ethertype_print(ndo, extracted_ethertype,
                               p+ETHERTYPE_LEN,
                               l2info.length-ETHERTYPE_LEN,
                               l2info.caplen-ETHERTYPE_LEN) == 0)
             /* ether_type not known, probably it wasn't one */
-            printf("unknown ethertype 0x%04x", extracted_ethertype);
-        
+            ND_PRINT((ndo, "unknown ethertype 0x%04x", extracted_ethertype));
+
         return l2info.header_len;
 }
 #endif
 
 #ifdef DLT_JUNIPER_MLPPP
 u_int
-juniper_mlppp_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_mlppp_print(netdissect_options *ndo,
+                    const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_MLPPP;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         /* suppress Bundle-ID if frame was captured on a child-link
          * best indicator if the cookie looks like a proto */
-        if (eflag &&
+        if (ndo->ndo_eflag &&
             EXTRACT_16BITS(&l2info.cookie) != PPP_OSI &&
             EXTRACT_16BITS(&l2info.cookie) !=  (PPP_ADDRESS << 8 | PPP_CONTROL))
-            printf("Bundle-ID %u: ",l2info.bundle);
+            ND_PRINT((ndo, "Bundle-ID %u: ", l2info.bundle));
 
         p+=l2info.header_len;
 
@@ -773,20 +778,18 @@
              * -> this must be incoming IS-IS over PPP
              */
             if (l2info.cookie[4] == (JUNIPER_LSQ_COOKIE_RE|JUNIPER_LSQ_COOKIE_DIR))
-                ppp_print(p, l2info.length);
+                ppp_print(ndo, p, l2info.length);
             else
-                ip_print(gndo, p, l2info.length);
+                ip_print(ndo, p, l2info.length);
             return l2info.header_len;
-#ifdef INET6
         case JUNIPER_LSQ_L3_PROTO_IPV6:
-            ip6_print(gndo, p,l2info.length);
+            ip6_print(ndo, p,l2info.length);
             return l2info.header_len;
-#endif
         case JUNIPER_LSQ_L3_PROTO_MPLS:
-            mpls_print(p,l2info.length);
+            mpls_print(ndo, p, l2info.length);
             return l2info.header_len;
         case JUNIPER_LSQ_L3_PROTO_ISO:
-            isoclns_print(p,l2info.length,l2info.caplen);
+            isoclns_print(ndo, p, l2info.length, l2info.caplen);
             return l2info.header_len;
         default:
             break;
@@ -795,11 +798,11 @@
         /* zero length cookie ? */
         switch (EXTRACT_16BITS(&l2info.cookie)) {
         case PPP_OSI:
-            ppp_print(p-2,l2info.length+2);
+            ppp_print(ndo, p - 2, l2info.length + 2);
             break;
         case (PPP_ADDRESS << 8 | PPP_CONTROL): /* fall through */
         default:
-            ppp_print(p,l2info.length);
+            ppp_print(ndo, p, l2info.length);
             break;
         }
 
@@ -810,19 +813,20 @@
 
 #ifdef DLT_JUNIPER_MFR
 u_int
-juniper_mfr_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_mfr_print(netdissect_options *ndo,
+                  const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_MFR;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
-        
+
         p+=l2info.header_len;
 
         /* child-link ? */
         if (l2info.cookie_len == 0) {
-            mfr_print(p,l2info.length);
+            mfr_print(ndo, p, l2info.length);
             return l2info.header_len;
         }
 
@@ -830,18 +834,16 @@
         if (l2info.cookie_len == AS_PIC_COOKIE_LEN) {
             switch(l2info.proto) {
             case JUNIPER_LSQ_L3_PROTO_IPV4:
-                ip_print(gndo, p, l2info.length);
+                ip_print(ndo, p, l2info.length);
                 return l2info.header_len;
-#ifdef INET6
             case JUNIPER_LSQ_L3_PROTO_IPV6:
-                ip6_print(gndo, p,l2info.length);
+                ip6_print(ndo, p,l2info.length);
                 return l2info.header_len;
-#endif
             case JUNIPER_LSQ_L3_PROTO_MPLS:
-                mpls_print(p,l2info.length);
+                mpls_print(ndo, p, l2info.length);
                 return l2info.header_len;
             case JUNIPER_LSQ_L3_PROTO_ISO:
-                isoclns_print(p,l2info.length,l2info.caplen);
+                isoclns_print(ndo, p, l2info.length, l2info.caplen);
                 return l2info.header_len;
             default:
                 break;
@@ -850,19 +852,20 @@
         }
 
         /* suppress Bundle-ID if frame was captured on a child-link */
-        if (eflag && EXTRACT_32BITS(l2info.cookie) != 1) printf("Bundle-ID %u, ",l2info.bundle);
+        if (ndo->ndo_eflag && EXTRACT_32BITS(l2info.cookie) != 1)
+            ND_PRINT((ndo, "Bundle-ID %u, ", l2info.bundle));
         switch (l2info.proto) {
         case (LLCSAP_ISONS<<8 | LLCSAP_ISONS):
-            isoclns_print(p+1, l2info.length-1, l2info.caplen-1);
+            isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
             break;
         case (LLC_UI<<8 | NLPID_Q933):
         case (LLC_UI<<8 | NLPID_IP):
         case (LLC_UI<<8 | NLPID_IP6):
             /* pass IP{4,6} to the OSI layer for proper link-layer printing */
-            isoclns_print(p-1, l2info.length+1, l2info.caplen+1); 
+            isoclns_print(ndo, p - 1, l2info.length + 1, l2info.caplen + 1);
             break;
         default:
-            printf("unknown protocol 0x%04x, length %u",l2info.proto, l2info.length);
+            ND_PRINT((ndo, "unknown protocol 0x%04x, length %u", l2info.proto, l2info.length));
         }
 
         return l2info.header_len;
@@ -871,31 +874,33 @@
 
 #ifdef DLT_JUNIPER_MLFR
 u_int
-juniper_mlfr_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_mlfr_print(netdissect_options *ndo,
+                   const struct pcap_pkthdr *h, register const u_char *p)
 {
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_MLFR;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
 
         /* suppress Bundle-ID if frame was captured on a child-link */
-        if (eflag && EXTRACT_32BITS(l2info.cookie) != 1) printf("Bundle-ID %u, ",l2info.bundle);
+        if (ndo->ndo_eflag && EXTRACT_32BITS(l2info.cookie) != 1)
+            ND_PRINT((ndo, "Bundle-ID %u, ", l2info.bundle));
         switch (l2info.proto) {
         case (LLC_UI):
         case (LLC_UI<<8):
-            isoclns_print(p, l2info.length, l2info.caplen);
+            isoclns_print(ndo, p, l2info.length, l2info.caplen);
             break;
         case (LLC_UI<<8 | NLPID_Q933):
         case (LLC_UI<<8 | NLPID_IP):
         case (LLC_UI<<8 | NLPID_IP6):
             /* pass IP{4,6} to the OSI layer for proper link-layer printing */
-            isoclns_print(p-1, l2info.length+1, l2info.caplen+1);
+            isoclns_print(ndo, p - 1, l2info.length + 1, l2info.caplen + 1);
             break;
         default:
-            printf("unknown protocol 0x%04x, length %u",l2info.proto, l2info.length);
+            ND_PRINT((ndo, "unknown protocol 0x%04x, length %u", l2info.proto, l2info.length));
         }
 
         return l2info.header_len;
@@ -912,38 +917,39 @@
 
 #ifdef DLT_JUNIPER_ATM1
 u_int
-juniper_atm1_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_atm1_print(netdissect_options *ndo,
+                   const struct pcap_pkthdr *h, register const u_char *p)
 {
-        u_int16_t extracted_ethertype;
+        uint16_t extracted_ethertype;
 
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_ATM1;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
 
         if (l2info.cookie[0] == 0x80) { /* OAM cell ? */
-            oam_print(p,l2info.length,ATM_OAM_NOHEC);
+            oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
             return l2info.header_len;
         }
 
         if (EXTRACT_24BITS(p) == 0xfefe03 || /* NLPID encaps ? */
             EXTRACT_24BITS(p) == 0xaaaa03) { /* SNAP encaps ? */
 
-            if (llc_print(p, l2info.length, l2info.caplen, NULL, NULL,
+            if (llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL,
                           &extracted_ethertype) != 0)
                 return l2info.header_len;
         }
 
         if (p[0] == 0x03) { /* Cisco style NLPID encaps ? */
-            isoclns_print(p + 1, l2info.length - 1, l2info.caplen - 1);
+            isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
             /* FIXME check if frame was recognized */
             return l2info.header_len;
         }
 
-        if(ip_heuristic_guess(p, l2info.length) != 0) /* last try - vcmux encaps ? */
+        if (ip_heuristic_guess(ndo, p, l2info.length) != 0) /* last try - vcmux encaps ? */
             return l2info.header_len;
 
 	return l2info.header_len;
@@ -960,47 +966,48 @@
 
 #ifdef DLT_JUNIPER_ATM2
 u_int
-juniper_atm2_print(const struct pcap_pkthdr *h, register const u_char *p)
+juniper_atm2_print(netdissect_options *ndo,
+                   const struct pcap_pkthdr *h, register const u_char *p)
 {
-        u_int16_t extracted_ethertype;
+        uint16_t extracted_ethertype;
 
         struct juniper_l2info_t l2info;
 
         l2info.pictype = DLT_JUNIPER_ATM2;
-        if(juniper_parse_header(p, h, &l2info) == 0)
+        if (juniper_parse_header(ndo, p, h, &l2info) == 0)
             return l2info.header_len;
 
         p+=l2info.header_len;
 
         if (l2info.cookie[7] & ATM2_PKT_TYPE_MASK) { /* OAM cell ? */
-            oam_print(p,l2info.length,ATM_OAM_NOHEC);
+            oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
             return l2info.header_len;
         }
 
         if (EXTRACT_24BITS(p) == 0xfefe03 || /* NLPID encaps ? */
             EXTRACT_24BITS(p) == 0xaaaa03) { /* SNAP encaps ? */
 
-            if (llc_print(p, l2info.length, l2info.caplen, NULL, NULL,
+            if (llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL,
                           &extracted_ethertype) != 0)
                 return l2info.header_len;
         }
 
         if (l2info.direction != JUNIPER_BPF_PKT_IN && /* ether-over-1483 encaps ? */
             (EXTRACT_32BITS(l2info.cookie) & ATM2_GAP_COUNT_MASK)) {
-            ether_print(gndo, p, l2info.length, l2info.caplen, NULL, NULL);
+            ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
             return l2info.header_len;
         }
 
         if (p[0] == 0x03) { /* Cisco style NLPID encaps ? */
-            isoclns_print(p + 1, l2info.length - 1, l2info.caplen - 1);
+            isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
             /* FIXME check if frame was recognized */
             return l2info.header_len;
         }
 
-        if(juniper_ppp_heuristic_guess(p, l2info.length) != 0) /* PPPoA vcmux encaps ? */
+        if(juniper_ppp_heuristic_guess(ndo, p, l2info.length) != 0) /* PPPoA vcmux encaps ? */
             return l2info.header_len;
 
-        if(ip_heuristic_guess(p, l2info.length) != 0) /* last try - vcmux encaps ? */
+        if (ip_heuristic_guess(ndo, p, l2info.length) != 0) /* last try - vcmux encaps ? */
             return l2info.header_len;
 
 	return l2info.header_len;
@@ -1010,9 +1017,10 @@
 
 /* try to guess, based on all PPP protos that are supported in
  * a juniper router if the payload data is encapsulated using PPP */
-int
-juniper_ppp_heuristic_guess(register const u_char *p, u_int length) {
-
+static int
+juniper_ppp_heuristic_guess(netdissect_options *ndo,
+                            register const u_char *p, u_int length)
+{
     switch(EXTRACT_16BITS(p)) {
     case PPP_IP :
     case PPP_OSI :
@@ -1029,7 +1037,7 @@
     case PPP_IPV6 :
     case PPP_IPV6CP :
 #endif
-        ppp_print(p, length);
+        ppp_print(ndo, p, length);
         break;
 
     default:
@@ -1039,9 +1047,10 @@
     return 1; /* we printed a ppp packet */
 }
 
-int
-ip_heuristic_guess(register const u_char *p, u_int length) {
-
+static int
+ip_heuristic_guess(netdissect_options *ndo,
+                   register const u_char *p, u_int length)
+{
     switch(p[0]) {
     case 0x45:
     case 0x46:
@@ -1054,9 +1063,8 @@
     case 0x4d:
     case 0x4e:
     case 0x4f:
-	    ip_print(gndo, p, length);
+	    ip_print(ndo, p, length);
 	    break;
-#ifdef INET6
     case 0x60:
     case 0x61:
     case 0x62:
@@ -1073,9 +1081,8 @@
     case 0x6d:
     case 0x6e:
     case 0x6f:
-        ip6_print(gndo, p, length);
+        ip6_print(ndo, p, length);
         break;
-#endif
     default:
         return 0; /* did not find a ip header */
         break;
@@ -1083,9 +1090,9 @@
     return 1; /* we printed an v4/v6 packet */
 }
 
-int
-juniper_read_tlv_value(const u_char *p, u_int tlv_type, u_int tlv_len) {
-
+static int
+juniper_read_tlv_value(const u_char *p, u_int tlv_type, u_int tlv_len)
+{
    int tlv_value;
 
    /* TLVs < 128 are little endian encoded */
@@ -1131,12 +1138,13 @@
 }
 
 static int
-juniper_parse_header (const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info) {
-
-    struct juniper_cookie_table_t *lp = juniper_cookie_table;
+juniper_parse_header(netdissect_options *ndo,
+                     const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info)
+{
+    const struct juniper_cookie_table_t *lp = juniper_cookie_table;
     u_int idx, jnx_ext_len, jnx_header_len = 0;
-    u_int8_t tlv_type,tlv_len;
-    u_int32_t control_word;
+    uint8_t tlv_type,tlv_len;
+    uint32_t control_word;
     int tlv_value;
     const u_char *tptr;
 
@@ -1148,24 +1156,24 @@
 
     l2info->length = h->len;
     l2info->caplen = h->caplen;
-    TCHECK2(p[0],4);
+    ND_TCHECK2(p[0], 4);
     l2info->flags = p[3];
     l2info->direction = p[3]&JUNIPER_BPF_PKT_IN;
-    
-    if (EXTRACT_24BITS(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */
-        printf("no magic-number found!");
-        return 0;
-    } 
 
-    if (eflag) /* print direction */
-        printf("%3s ",tok2str(juniper_direction_values,"---",l2info->direction));
+    if (EXTRACT_24BITS(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */
+        ND_PRINT((ndo, "no magic-number found!"));
+        return 0;
+    }
+
+    if (ndo->ndo_eflag) /* print direction */
+        ND_PRINT((ndo, "%3s ", tok2str(juniper_direction_values, "---", l2info->direction)));
 
     /* magic number + flags */
     jnx_header_len = 4;
 
-    if (vflag>1)
-        printf("\n\tJuniper PCAP Flags [%s]",
-               bittok2str(jnx_flag_values, "none", l2info->flags));
+    if (ndo->ndo_vflag > 1)
+        ND_PRINT((ndo, "\n\tJuniper PCAP Flags [%s]",
+               bittok2str(jnx_flag_values, "none", l2info->flags)));
 
     /* extensions present ?  - calculate how much bytes to skip */
     if ((l2info->flags & JUNIPER_BPF_EXT ) == JUNIPER_BPF_EXT ) {
@@ -1173,36 +1181,35 @@
         tptr = p+jnx_header_len;
 
         /* ok to read extension length ? */
-        TCHECK2(tptr[0], 2);
+        ND_TCHECK2(tptr[0], 2);
         jnx_ext_len = EXTRACT_16BITS(tptr);
         jnx_header_len += 2;
         tptr +=2;
-        
+
         /* nail up the total length -
          * just in case something goes wrong
          * with TLV parsing */
         jnx_header_len += jnx_ext_len;
-        
-        if (vflag>1)
-            printf(", PCAP Extension(s) total length %u",
-                   jnx_ext_len);
-        
-        TCHECK2(tptr[0], jnx_ext_len);
+
+        if (ndo->ndo_vflag > 1)
+            ND_PRINT((ndo, ", PCAP Extension(s) total length %u", jnx_ext_len));
+
+        ND_TCHECK2(tptr[0], jnx_ext_len);
         while (jnx_ext_len > JUNIPER_EXT_TLV_OVERHEAD) {
             tlv_type = *(tptr++);
             tlv_len = *(tptr++);
             tlv_value = 0;
-            
+
             /* sanity check */
             if (tlv_type == 0 || tlv_len == 0)
                 break;
-            
-            if (vflag>1)
-                printf("\n\t  %s Extension TLV #%u, length %u, value ",
+
+            if (ndo->ndo_vflag > 1)
+                ND_PRINT((ndo, "\n\t  %s Extension TLV #%u, length %u, value ",
                        tok2str(jnx_ext_tlv_values,"Unknown",tlv_type),
                        tlv_type,
-                       tlv_len);
-            
+                       tlv_len));
+
             tlv_value = juniper_read_tlv_value(tptr, tlv_type, tlv_len);
             switch (tlv_type) {
             case JUNIPER_EXT_TLV_IFD_NAME:
@@ -1211,19 +1218,19 @@
             case JUNIPER_EXT_TLV_IFD_MEDIATYPE:
             case JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE:
                 if (tlv_value != -1) {
-                    if (vflag>1)
-                        printf("%s (%u)",
+                    if (ndo->ndo_vflag > 1)
+                        ND_PRINT((ndo, "%s (%u)",
                                tok2str(juniper_ifmt_values, "Unknown", tlv_value),
-                               tlv_value);
+                               tlv_value));
                 }
                 break;
             case JUNIPER_EXT_TLV_IFL_ENCAPS:
             case JUNIPER_EXT_TLV_TTP_IFL_ENCAPS:
                 if (tlv_value != -1) {
-                    if (vflag>1)
-                        printf("%s (%u)",
+                    if (ndo->ndo_vflag > 1)
+                        ND_PRINT((ndo, "%s (%u)",
                                tok2str(juniper_ifle_values, "Unknown", tlv_value),
-                               tlv_value);
+                               tlv_value));
                 }
                 break;
             case JUNIPER_EXT_TLV_IFL_IDX: /* fall through */
@@ -1231,35 +1238,36 @@
             case JUNIPER_EXT_TLV_IFD_IDX:
             default:
                 if (tlv_value != -1) {
-                    if (vflag>1)
-                        printf("%u",tlv_value);
+                    if (ndo->ndo_vflag > 1)
+                        ND_PRINT((ndo, "%u", tlv_value));
                 }
                 break;
             }
-            
+
             tptr+=tlv_len;
             jnx_ext_len -= tlv_len+JUNIPER_EXT_TLV_OVERHEAD;
         }
-        
-        if (vflag>1)
-            printf("\n\t-----original packet-----\n\t");
-    } 
-    
-    if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {            
-        if (eflag)
-            printf("no-L2-hdr, ");
+
+        if (ndo->ndo_vflag > 1)
+            ND_PRINT((ndo, "\n\t-----original packet-----\n\t"));
+    }
+
+    if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {
+        if (ndo->ndo_eflag)
+            ND_PRINT((ndo, "no-L2-hdr, "));
 
         /* there is no link-layer present -
          * perform the v4/v6 heuristics
          * to figure out what it is
          */
-        TCHECK2(p[jnx_header_len+4],1);
-        if(ip_heuristic_guess(p+jnx_header_len+4,l2info->length-(jnx_header_len+4)) == 0)
-            printf("no IP-hdr found!");
+        ND_TCHECK2(p[jnx_header_len + 4], 1);
+        if (ip_heuristic_guess(ndo, p + jnx_header_len + 4,
+                               l2info->length - (jnx_header_len + 4)) == 0)
+            ND_PRINT((ndo, "no IP-hdr found!"));
 
         l2info->header_len=jnx_header_len+4;
         return 0; /* stop parsing the output further */
-        
+
     }
     l2info->header_len = jnx_header_len;
     p+=l2info->header_len;
@@ -1281,7 +1289,7 @@
                 l2info->cookie_type = AS_COOKIE_ID;
                 l2info->cookie_len = 8;
                 break;
-            
+
             default:
                 l2info->bundle = l2info->cookie[0];
                 break;
@@ -1300,25 +1308,25 @@
             l2info->length -= l2info->cookie_len;
             l2info->caplen -= l2info->cookie_len;
 
-            if (eflag)
-                printf("%s-PIC, cookie-len %u",
+            if (ndo->ndo_eflag)
+                ND_PRINT((ndo, "%s-PIC, cookie-len %u",
                        lp->s,
-                       l2info->cookie_len);
+                       l2info->cookie_len));
 
             if (l2info->cookie_len > 0) {
-                TCHECK2(p[0],l2info->cookie_len);
-                if (eflag)
-                    printf(", cookie 0x");
+                ND_TCHECK2(p[0], l2info->cookie_len);
+                if (ndo->ndo_eflag)
+                    ND_PRINT((ndo, ", cookie 0x"));
                 for (idx = 0; idx < l2info->cookie_len; idx++) {
                     l2info->cookie[idx] = p[idx]; /* copy cookie data */
-                    if (eflag) printf("%02x",p[idx]);
+                    if (ndo->ndo_eflag) ND_PRINT((ndo, "%02x", p[idx]));
                 }
             }
 
-            if (eflag) printf(": "); /* print demarc b/w L2/L3*/
-            
+            if (ndo->ndo_eflag) ND_PRINT((ndo, ": ")); /* print demarc b/w L2/L3*/
 
-            l2info->proto = EXTRACT_16BITS(p+l2info->cookie_len); 
+
+            l2info->proto = EXTRACT_16BITS(p+l2info->cookie_len);
             break;
         }
         ++lp;
@@ -1335,7 +1343,7 @@
             break;
         case AS_COOKIE_ID:
             l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
-            l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;            
+            l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
             break;
         default:
             l2info->bundle = l2info->cookie[0];
@@ -1348,7 +1356,7 @@
         switch (l2info->cookie_type) {
         case LS_COOKIE_ID:
             l2info->bundle = l2info->cookie[1];
-            l2info->proto = EXTRACT_16BITS(p);        
+            l2info->proto = EXTRACT_16BITS(p);
             l2info->header_len += 2;
             l2info->length -= 2;
             l2info->caplen -= 2;
@@ -1371,7 +1379,7 @@
         switch (l2info->cookie_type) {
         case LS_COOKIE_ID:
             l2info->bundle = l2info->cookie[1];
-            l2info->proto = EXTRACT_16BITS(p);        
+            l2info->proto = EXTRACT_16BITS(p);
             l2info->header_len += 2;
             l2info->length -= 2;
             l2info->caplen -= 2;
@@ -1388,7 +1396,7 @@
 #endif
 #ifdef DLT_JUNIPER_ATM2
     case DLT_JUNIPER_ATM2:
-        TCHECK2(p[0],4);
+        ND_TCHECK2(p[0], 4);
         /* ATM cell relay control word present ? */
         if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {
             control_word = EXTRACT_32BITS(p);
@@ -1402,9 +1410,9 @@
             default:
                 break;
             }
-            
-            if (eflag)
-                printf("control-word 0x%08x ", control_word);
+
+            if (ndo->ndo_eflag)
+                ND_PRINT((ndo, "control-word 0x%08x ", control_word));
         }
         break;
 #endif
@@ -1434,16 +1442,16 @@
 #endif
 
     default:
-        printf("Unknown Juniper DLT_ type %u: ", l2info->pictype);
+        ND_PRINT((ndo, "Unknown Juniper DLT_ type %u: ", l2info->pictype));
         break;
     }
-    
-    if (eflag > 1)
-        printf("hlen %u, proto 0x%04x, ",l2info->header_len,l2info->proto);
+
+    if (ndo->ndo_eflag > 1)
+        ND_PRINT((ndo, "hlen %u, proto 0x%04x, ", l2info->header_len, l2info->proto));
 
     return 1; /* everything went ok so far. continue parsing */
  trunc:
-    printf("[|juniper_hdr], length %u",h->len);
+    ND_PRINT((ndo, "[|juniper_hdr], length %u", h->len));
     return 0;
 }
 
