#include "netdissect-stdinc.h"
-#ifdef __bsdi__
-#include <net/slcompress.h>
-#include <net/if_ppp.h>
-#endif
-
#include "netdissect.h"
#include "extract.h"
#include "addrtoname.h"
ndo->ndo_ll_hdr_len += hdrlen;
}
-
-#define PPP_BSDI_HDRLEN 24
-
-/* BSD/OS specific PPP printer */
-void
-ppp_bsdos_if_print(netdissect_options *ndo,
- const struct pcap_pkthdr *h _U_, const u_char *p _U_)
-{
- u_int hdrlength;
-#ifdef __bsdi__
- u_int length = h->len;
- u_int caplen = h->caplen;
- uint16_t ptype;
- uint8_t llhl;
- const u_char *q;
- u_int i;
-
- ndo->ndo_protocol = "ppp_bsdos";
- if (caplen < PPP_BSDI_HDRLEN) {
- nd_print_trunc(ndo);
- ndo->ndo_ll_hdr_len += caplen;
- return;
- }
-
- hdrlength = 0;
-
-#if 0
- if (GET_U_1(p) == PPP_ADDRESS &&
- GET_U_1(p + 1) == PPP_CONTROL) {
- if (ndo->ndo_eflag)
- ND_PRINT("%02x %02x ", GET_U_1(p),
- GET_U_1(p + 1));
- p += 2;
- hdrlength = 2;
- }
-
- if (ndo->ndo_eflag)
- ND_PRINT("%u ", length);
- /* Retrieve the protocol type */
- if (GET_U_1(p) & 01) {
- /* Compressed protocol field */
- ptype = GET_U_1(p);
- if (ndo->ndo_eflag)
- ND_PRINT("%02x ", ptype);
- p++;
- hdrlength += 1;
- } else {
- /* Un-compressed protocol field */
- ptype = GET_BE_U_2(p);
- if (ndo->ndo_eflag)
- ND_PRINT("%04x ", ptype);
- p += 2;
- hdrlength += 2;
- }
-#else
- ptype = 0; /*XXX*/
- if (ndo->ndo_eflag)
- ND_PRINT("%c ", GET_U_1(p + SLC_DIR) ? 'O' : 'I');
- llhl = GET_U_1(p + SLC_LLHL);
- if (llhl) {
- /* link level header */
- struct ppp_header *ph;
-
- q = p + SLC_BPFHDRLEN;
- ph = (struct ppp_header *)q;
- if (ph->phdr_addr == PPP_ADDRESS
- && ph->phdr_ctl == PPP_CONTROL) {
- if (ndo->ndo_eflag)
- ND_PRINT("%02x %02x ", GET_U_1(q),
- GET_U_1(q + 1));
- ptype = GET_BE_U_2(&ph->phdr_type);
- if (ndo->ndo_eflag && (ptype == PPP_VJC || ptype == PPP_VJNC)) {
- ND_PRINT("%s ", tok2str(ppptype2str,
- "proto-#%u", ptype));
- }
- } else {
- if (ndo->ndo_eflag) {
- ND_PRINT("LLH=[");
- for (i = 0; i < llhl; i++)
- ND_PRINT("%02x", GET_U_1(q + i));
- ND_PRINT("] ");
- }
- }
- }
- if (ndo->ndo_eflag)
- ND_PRINT("%u ", length);
- if (GET_U_1(p + SLC_CHL)) {
- q = p + SLC_BPFHDRLEN + llhl;
-
- switch (ptype) {
- case PPP_VJC:
- ptype = vjc_print(ndo, q, ptype);
- hdrlength = PPP_BSDI_HDRLEN;
- p += hdrlength;
- switch (ptype) {
- case PPP_IP:
- ip_print(ndo, p, length);
- break;
- case PPP_IPV6:
- ip6_print(ndo, p, length);
- break;
- case PPP_MPLS_UCAST:
- case PPP_MPLS_MCAST:
- mpls_print(ndo, p, length);
- break;
- }
- goto printx;
- case PPP_VJNC:
- ptype = vjc_print(ndo, q, ptype);
- hdrlength = PPP_BSDI_HDRLEN;
- p += hdrlength;
- switch (ptype) {
- case PPP_IP:
- ip_print(ndo, p, length);
- break;
- case PPP_IPV6:
- ip6_print(ndo, p, length);
- break;
- case PPP_MPLS_UCAST:
- case PPP_MPLS_MCAST:
- mpls_print(ndo, p, length);
- break;
- }
- goto printx;
- default:
- if (ndo->ndo_eflag) {
- ND_PRINT("CH=[");
- for (i = 0; i < llhl; i++)
- ND_PRINT("%02x",
- GET_U_1(q + i));
- ND_PRINT("] ");
- }
- break;
- }
- }
-
- hdrlength = PPP_BSDI_HDRLEN;
-#endif
-
- length -= hdrlength;
- p += hdrlength;
-
- switch (ptype) {
- case PPP_IP:
- ip_print(p, length);
- break;
- case PPP_IPV6:
- ip6_print(ndo, p, length);
- break;
- case PPP_MPLS_UCAST:
- case PPP_MPLS_MCAST:
- mpls_print(ndo, p, length);
- break;
- default:
- ND_PRINT("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype));
- }
-
-printx:
-#else /* __bsdi */
- hdrlength = 0;
-#endif /* __bsdi__ */
- ndo->ndo_ll_hdr_len += hdrlength;
-}