Add support for LocalTalk Link Access Protocol.
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 30 Nov 2001 07:14:22 +0000 (07:14 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 30 Nov 2001 07:14:22 +0000 (07:14 +0000)
Rename WTAP_ENCAP_PRISM to WTAP_ENCAP_PRISM_HEADER, to match
DLT_PRISM_HEADER.

Add in missing capture support for WTAP_ENCAP_PRISM_HEADER when
capturing with "pcap_open_live()" rather than reading the capture from a
pipe.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@4299 f5534014-38df-0310-8fa8-9805f1628bb7

capture.c
packet-atalk.c
packet-atalk.h
packet-prism.c
wiretap/libpcap.c
wiretap/wtap.c
wiretap/wtap.h

index 8f4749df6d00cf62908e9f5e9780f35eadf7b5a1..e485b1fd4f640f9f7f11fb86dfea874a6175e4bb 100644 (file)
--- a/capture.c
+++ b/capture.c
@@ -1,7 +1,7 @@
 /* capture.c
  * Routines for packet capture windows
  *
- * $Id: capture.c,v 1.160 2001/11/28 07:11:07 guy Exp $
+ * $Id: capture.c,v 1.161 2001/11/30 07:14:20 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 #include "wiretap/libpcap.h"
 #include "wiretap/wtap.h"
 
+#include "packet-atalk.h"
 #include "packet-clip.h"
 #include "packet-eth.h"
 #include "packet-fddi.h"
@@ -1158,7 +1159,7 @@ pipe_dispatch(int fd, loop_data *ld, struct pcap_hdr *hdr)
     case WTAP_ENCAP_FDDI_BITSWAPPED:
       capture_fddi(pd, whdr.caplen, &ld->counts);
       break;
-    case WTAP_ENCAP_PRISM:
+    case WTAP_ENCAP_PRISM_HEADER:
       capture_prism(pd, 0, whdr.caplen, &ld->counts);
       break;
     case WTAP_ENCAP_TOKEN_RING:
@@ -1182,6 +1183,9 @@ pipe_dispatch(int fd, loop_data *ld, struct pcap_hdr *hdr)
     case WTAP_ENCAP_CHDLC:
       capture_chdlc(pd, 0, whdr.caplen, &ld->counts);
       break;
+    case WTAP_ENCAP_LOCALTALK:
+      capture_llap(pd, whdr.caplen, &ld->counts);
+      break;
     /* XXX - FreeBSD may append 4-byte ATM pseudo-header to DLT_ATM_RFC1483,
        with LLC header following; we should implement it at some
        point. */
@@ -1879,6 +1883,9 @@ capture_pcap_cb(u_char *user, const struct pcap_pkthdr *phdr,
     case WTAP_ENCAP_FDDI_BITSWAPPED:
       capture_fddi(pd, phdr->len, &ld->counts);
       break;
+    case WTAP_ENCAP_PRISM_HEADER:
+      capture_prism(pd, 0, phdr->len, &ld->counts);
+      break;
     case WTAP_ENCAP_TOKEN_RING:
       capture_tr(pd, 0, phdr->len, &ld->counts);
       break;
@@ -1897,6 +1904,9 @@ capture_pcap_cb(u_char *user, const struct pcap_pkthdr *phdr,
     case WTAP_ENCAP_LINUX_ATM_CLIP:
       capture_clip(pd, phdr->len, &ld->counts);
       break;
+    case WTAP_ENCAP_LOCALTALK:
+      capture_llap(pd, phdr->len, &ld->counts);
+      break;
     /* XXX - FreeBSD may append 4-byte ATM pseudo-header to DLT_ATM_RFC1483,
        with LLC header following; we should implement it at some
        point. */
index 28cadc24734c76b20dda89fd2aedd099e6e676ef..4664ab8fd18dd73c94adfff7b1124203ea1f749f 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-atalk.c
  * Routines for Appletalk packet disassembly (DDP, currently).
  *
- * $Id: packet-atalk.c,v 1.56 2001/11/26 01:03:35 hagbard Exp $
+ * $Id: packet-atalk.c,v 1.57 2001/11/30 07:14:20 guy Exp $
  *
  * Simon Wilkinson <sxw@dcs.ed.ac.uk>
  *
 #include "aftypes.h"
 #include "atalk-utils.h"
 
+static int proto_llap = -1;
+static int hf_llap_dst = -1;
+static int hf_llap_src = -1;
+static int hf_llap_type = -1;
+
 static int proto_ddp = -1;
 static int hf_ddp_hopcount = -1;
 static int hf_ddp_len = -1;
@@ -81,12 +86,15 @@ static gint ett_nbp_node = -1;
 static gint ett_rtmp = -1;
 static gint ett_rtmp_tuple = -1;
 static gint ett_ddp = -1;
+static gint ett_llap = -1;
 static gint ett_pstring = -1;
 
 static dissector_table_t ddp_dissector_table;
 
 static dissector_handle_t data_handle;
 
+#define DDP_SHORT_HEADER_SIZE 5
+
 /*
  * P = Padding, H = Hops, L = Len
  *
@@ -358,7 +366,66 @@ dissect_nbp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
 }
 
 static void
-dissect_ddp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+dissect_ddp_short(tvbuff_t *tvb, packet_info *pinfo, guint8 dnode,
+                 guint8 snode, proto_tree *tree)
+{
+  guint16 len;
+  guint8  dport;
+  guint8  sport;
+  guint8  type;
+  proto_tree *ddp_tree = NULL;
+  proto_item *ti;
+  static struct atalk_ddp_addr src, dst;
+  tvbuff_t   *new_tvb;
+
+  if (check_col(pinfo->fd, COL_PROTOCOL))
+    col_set_str(pinfo->fd, COL_PROTOCOL, "DDP");
+  if (check_col(pinfo->fd, COL_INFO))
+    col_clear(pinfo->fd, COL_INFO);
+
+  if (tree) {
+    ti = proto_tree_add_item(tree, proto_ddp, tvb, 0, DDP_SHORT_HEADER_SIZE,
+                            FALSE);
+    ddp_tree = proto_item_add_subtree(ti, ett_ddp);
+  }
+  len = tvb_get_ntohs(tvb, 0);
+  if (tree)
+      proto_tree_add_uint(ddp_tree, hf_ddp_len, tvb, 0, 2, len);
+  dport = tvb_get_guint8(tvb, 2);
+  if (tree)
+    proto_tree_add_uint(ddp_tree, hf_ddp_dst_socket, tvb, 2, 1, dport);
+  sport = tvb_get_guint8(tvb, 3);
+  if (tree)
+    proto_tree_add_uint(ddp_tree, hf_ddp_src_socket, tvb, 3, 1, sport);
+  type = tvb_get_guint8(tvb, 4);
+  
+  src.net = 0;
+  src.node = snode;
+  src.port = sport;
+  dst.net = 0;
+  dst.node = dnode;
+  dst.port = dport;
+  SET_ADDRESS(&pinfo->net_src, AT_ATALK, sizeof src, (guint8 *)&src);
+  SET_ADDRESS(&pinfo->src, AT_ATALK, sizeof src, (guint8 *)&src);
+  SET_ADDRESS(&pinfo->net_dst, AT_ATALK, sizeof dst, (guint8 *)&dst);
+  SET_ADDRESS(&pinfo->dst, AT_ATALK, sizeof dst, (guint8 *)&dst);
+
+  if (check_col(pinfo->fd, COL_INFO)) {
+    col_add_str(pinfo->fd, COL_INFO,
+      val_to_str(type, op_vals, "Unknown DDP protocol (%02x)"));
+  }
+  if (tree)
+    proto_tree_add_uint(ddp_tree, hf_ddp_type, tvb, 4, 1, type);
+  
+  new_tvb = tvb_new_subset(tvb, DDP_SHORT_HEADER_SIZE, -1, -1);
+
+  if (!dissector_try_port(ddp_dissector_table, type, new_tvb, pinfo, tree))
+    call_dissector(data_handle,new_tvb, pinfo, tree);
+}
+
+static void
+dissect_ddp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
   e_ddp       ddp;
   proto_tree *ddp_tree;
   proto_item *ti;
@@ -423,9 +490,91 @@ dissect_ddp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
     call_dissector(data_handle,new_tvb, pinfo, tree);
 }
 
+static const value_string llap_type_vals[] = {
+  {0x01, "Short DDP"},
+  {0x02, "DDP" },
+  {0x81, "Enquiry"},
+  {0x82, "Acknowledgement"},
+  {0x84, "RTS"},
+  {0x85, "CTS"},
+  {0, NULL}
+};
+
+void
+capture_llap(const u_char *pd, int len, packet_counts *ld)
+{
+  ld->other++;
+}
+
+static void
+dissect_llap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+  guint8 dnode;
+  guint8 snode;
+  guint8 type;
+  proto_tree *llap_tree = NULL;
+  proto_item *ti;
+  tvbuff_t   *new_tvb;
+
+  if (check_col(pinfo->fd, COL_PROTOCOL))
+    col_set_str(pinfo->fd, COL_PROTOCOL, "LLAP");
+  if (check_col(pinfo->fd, COL_INFO))
+    col_clear(pinfo->fd, COL_INFO);
+
+  if (tree) {
+    ti = proto_tree_add_item(tree, proto_llap, tvb, 0, 3, FALSE);
+    llap_tree = proto_item_add_subtree(ti, ett_llap);
+  }
+
+  dnode = tvb_get_guint8(tvb, 0);
+  if (tree)  
+    proto_tree_add_uint(llap_tree, hf_llap_dst, tvb, 0, 1, dnode);
+  snode = tvb_get_guint8(tvb, 1);
+  if (tree)
+    proto_tree_add_uint(llap_tree, hf_llap_src, tvb, 1, 1, snode);
+  type = tvb_get_guint8(tvb, 2);
+  if (check_col(pinfo->fd, COL_INFO)) {
+    col_add_str(pinfo->fd, COL_INFO,
+      val_to_str(type, llap_type_vals, "Unknown LLAP type (%02x)"));
+  }
+  if (tree)
+    proto_tree_add_uint(llap_tree, hf_llap_type, tvb, 2, 1, type);
+  
+  new_tvb = tvb_new_subset(tvb, 3, -1, -1);
+
+  if (proto_is_protocol_enabled(proto_ddp)) {
+    pinfo->current_proto = "DDP";
+    switch (type) {
+
+    case 0x01:
+      dissect_ddp_short(new_tvb, pinfo, dnode, snode, tree);
+      return;
+
+    case 0x02:
+      dissect_ddp(new_tvb, pinfo, tree);
+      return;
+    }
+  }
+  call_dissector(data_handle,new_tvb, pinfo, tree);
+}
+
 void
 proto_register_atalk(void)
 {
+  static hf_register_info hf_llap[] = {
+    { &hf_llap_dst,
+      { "Destination Node",    "llap.dst",     FT_UINT8,  BASE_DEC, NULL, 0x0,
+       "", HFILL }},
+
+    { &hf_llap_src,
+      { "Source Node",         "llap.src",     FT_UINT8,  BASE_DEC, NULL, 0x0,
+       "", HFILL }},
+
+    { &hf_llap_type,
+      { "Type",                        "llap.type",    FT_UINT8,  BASE_HEX, VALS(llap_type_vals), 0x0,
+       "", HFILL }},
+  };
+
   static hf_register_info hf_ddp[] = {
     { &hf_ddp_hopcount,
       { "Hop count",           "ddp.hopcount", FT_UINT8,  BASE_DEC, NULL, 0x0,
@@ -533,6 +682,7 @@ proto_register_atalk(void)
 
 
   static gint *ett[] = {
+       &ett_llap,
        &ett_ddp,
        &ett_nbp,
        &ett_nbp_info,
@@ -542,6 +692,9 @@ proto_register_atalk(void)
        &ett_rtmp_tuple
   };
 
+  proto_llap = proto_register_protocol("LocalTalk Link Access Protocol", "LLAP", "llap");
+  proto_register_field_array(proto_llap, hf_llap, array_length(hf_llap));
+
   proto_ddp = proto_register_protocol("Datagram Delivery Protocol", "DDP", "ddp");
   proto_register_field_array(proto_ddp, hf_ddp, array_length(hf_ddp));
 
@@ -568,5 +721,6 @@ proto_reg_handoff_atalk(void)
   dissector_add("ddp.type", DDP_NBP, dissect_nbp, proto_nbp);
   dissector_add("ddp.type", DDP_RTMPREQ, dissect_rtmp_request, proto_rtmp);
   dissector_add("ddp.type", DDP_RTMPDATA, dissect_rtmp_data, proto_rtmp);
+  dissector_add("wtap_encap", WTAP_ENCAP_LOCALTALK, dissect_llap, proto_llap);
   data_handle = find_dissector("data");
 }
index b3eabdc2205d3121994fa2702047d6793b895d98..ca5f10d4d4d5c764f94b81cf2c2ed6b9db14759a 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-atalk.h
  * Definitions for Appletalk packet disassembly (DDP, currently).
  *
- * $Id: packet-atalk.h,v 1.6 2000/11/17 06:02:20 guy Exp $
+ * $Id: packet-atalk.h,v 1.7 2001/11/30 07:14:20 guy Exp $
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -48,4 +48,6 @@ struct atalk_ddp_addr {
  */
 extern gchar *atalk_addr_to_str(const struct atalk_ddp_addr *addrp);
 
+extern void capture_llap(const u_char *pd, int len, packet_counts *ld);
+
 #endif
index 6435d8535df11493b156773ed33a579e90179a28..3e478d0411c9c1b34aa2a03e77e085631be833bf 100644 (file)
@@ -9,7 +9,7 @@
  *
  * By Tim Newsham
  *
- * $Id: packet-prism.c,v 1.2 2001/11/28 19:59:24 guy Exp $
+ * $Id: packet-prism.c,v 1.3 2001/11/30 07:14:20 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -205,5 +205,5 @@ proto_reg_handoff_prism(void)
     /* handle for 802.11 dissector */
     ieee80211_handle = find_dissector("wlan");
 
-    dissector_add("wtap_encap", WTAP_ENCAP_PRISM, dissect_prism, proto_prism);
+    dissector_add("wtap_encap", WTAP_ENCAP_PRISM_HEADER, dissect_prism, proto_prism);
 }
index 19df0d8abb00753d5cfb33a59fa49eceecb3ff8d..88175f72f82c01f30b7d77ef715b3af03e752cec 100644 (file)
@@ -1,6 +1,6 @@
 /* libpcap.c
  *
- * $Id: libpcap.c,v 1.60 2001/11/28 07:11:10 guy Exp $
+ * $Id: libpcap.c,v 1.61 2001/11/30 07:14:22 guy Exp $
  *
  * Wiretap Library
  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
@@ -364,8 +364,10 @@ static const struct {
         */
        { 113,          WTAP_ENCAP_SLL },       /* Linux cooked capture */
 
+       { 114,          WTAP_ENCAP_LOCALTALK }, /* Localtalk */
+
        { 118,          WTAP_ENCAP_CISCO_IOS },
-       { 119,          WTAP_ENCAP_PRISM },     /* Prism monitor mode hdr */
+       { 119,          WTAP_ENCAP_PRISM_HEADER }, /* Prism monitor mode hdr */
 };
 #define NUM_PCAP_ENCAPS (sizeof pcap_to_wtap_map / sizeof pcap_to_wtap_map[0])
 
index 4cf4cba64014ebe998720c8bc384b24f2d56778e..75f3f403262eb92504fcfea9e235a0b2d19dcb02 100644 (file)
@@ -1,6 +1,6 @@
 /* wtap.c
  *
- * $Id: wtap.c,v 1.57 2001/11/28 07:11:10 guy Exp $
+ * $Id: wtap.c,v 1.58 2001/11/30 07:14:22 guy Exp $
  *
  * Wiretap Library
  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
@@ -128,7 +128,10 @@ static const struct encap_type_info {
        /* WTAP_ENCAP_CISCO_IOS */
        { "Cisco IOS internal", "ios" },
 
-       /* WTAP_ENCAP_PRISM */
+       /* WTAP_ENCAP_LOCALTALK */
+       { "Localtalk", "ltalk" },
+
+       /* WTAP_ENCAP_PRISM_HEADER */
        { "IEEE 802.11 plus Prism II monitor mode header", "prism" },
 };
 
index 2be3ff1bc5bba20f53679bea06c8ae41815ebeaf..6ea5c84f3def65a20a10886594b4a434234fd6d8 100644 (file)
@@ -1,6 +1,6 @@
 /* wtap.h
  *
- * $Id: wtap.h,v 1.95 2001/11/28 07:11:11 guy Exp $
+ * $Id: wtap.h,v 1.96 2001/11/30 07:14:22 guy Exp $
  *
  * Wiretap Library
  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
 #define WTAP_ENCAP_FRELAY                      20
 #define WTAP_ENCAP_CHDLC                       21
 #define WTAP_ENCAP_CISCO_IOS                   22
-#define WTAP_ENCAP_PRISM                       23
+#define WTAP_ENCAP_LOCALTALK                   23
+#define WTAP_ENCAP_PRISM_HEADER                        24
 
 /* last WTAP_ENCAP_ value + 1 */
-#define WTAP_NUM_ENCAP_TYPES                   24
+#define WTAP_NUM_ENCAP_TYPES                   25
 
 /* File types that can be read by wiretap.
    We support writing some many of these file types, too, so we