I removed the bit-fields that depended upon gcc's ability to use any type
authorgram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 8 Feb 1999 20:02:35 +0000 (20:02 +0000)
committergram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 8 Feb 1999 20:02:35 +0000 (20:02 +0000)
of variable as a bit field container. ANSI specs only allow unsigned ints
to host bit fields; IBM's C compiler is very ANSI-strict.

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

packet-atalk.c
packet-ip.c
packet-tcp.c
packet.h

index 9dbb64f0bf1bd021e14092837299218e776562ec..0c10c1ebaa48db45d4398fe9ae2c197d766562fe 100644 (file)
 
 extern packet_info pi;
 
-typedef struct _e_ddp {
+/* P = Padding, H = Hops, L = Len */
 #if BYTE_ORDER == BIG_ENDIAN
-  guint16      pad:2,hops:4,len:10;
+ /* PPHHHHLL LLLLLLLL */
+ #define ddp_hops(x)   ( ( x >> 10) & 0x3C )
+ #define ddp_len(x)            ( x & 0x03ff )
 #else
-  guint16      len:10,hops:4,pad:2;
+ /* LLLLLLLL PPHHHHLL*/
+ #define ddp_hops(x)   ( x & 0x3C )
+ #define ddp_len(x)            ( ntohs(x) & 0x03ff )
 #endif
+typedef struct _e_ddp {
+  guint16      hops_len; /* combines pad, hops, and len */
   guint16      sum,dnet,snet;
   guint8       dnode,snode;
   guint8       dport,sport;
@@ -94,8 +100,8 @@ dissect_ddp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
       "Datagram Delivery Protocol");
     ddp_tree = gtk_tree_new();
     add_subtree(ti, ddp_tree, ETT_IP);
-    add_item_to_tree(ddp_tree, offset,      1, "Hop count: %d", ddp.hops);
-    add_item_to_tree(ddp_tree, offset,     2, "Datagram length: %d", ddp.len);
+    add_item_to_tree(ddp_tree, offset,      1, "Hop count: %d", ddp_hops(ddp.hops_len));
+    add_item_to_tree(ddp_tree, offset,     2, "Datagram length: %d", ddp_len(ddp.hops_len));
     add_item_to_tree(ddp_tree, offset + 2,  2, "Checksum: %d",ddp.sum);
     add_item_to_tree(ddp_tree, offset + 4,  2, "Destination Net: %d",ddp.dnet);
     add_item_to_tree(ddp_tree, offset + 6,  2, "Source Net: %d",ddp.snet);
index 139abecc2c20c1f4c051b46b6eed44343308e525..53c9d1c8ac2777eea61cec8c437cc6c84c464235 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-ip.c
  * Routines for IP and miscellaneous IP protocol packet disassembly
  *
- * $Id: packet-ip.c,v 1.13 1998/12/29 04:05:35 gerald Exp $
+ * $Id: packet-ip.c,v 1.14 1999/02/08 20:02:34 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -411,7 +411,7 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
   iph.ip_off = ntohs(iph.ip_off);
   iph.ip_sum = ntohs(iph.ip_sum);
 
-  hlen = iph.ip_hl * 4;        /* IP header length, in bytes */
+  hlen = lo_nibble(iph.ip_v_hl) * 4;   /* IP header length, in bytes */
   
   switch (iph.ip_p) {
     case IP_PROTO_ICMP:
@@ -466,7 +466,7 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
     ti = add_item_to_tree(GTK_WIDGET(tree), offset, hlen, "Internet Protocol");
     ip_tree = gtk_tree_new();
     add_subtree(ti, ip_tree, ETT_IP);
-    add_item_to_tree(ip_tree, offset,      1, "Version: %d", iph.ip_v);
+    add_item_to_tree(ip_tree, offset,      1, "Version: %d", hi_nibble(iph.ip_v_hl));
     add_item_to_tree(ip_tree, offset,      1, "Header length: %d bytes", hlen); 
     tf = add_item_to_tree(ip_tree, offset +  1, 1, "Type of service: 0x%02x (%s)",
       iph.ip_tos, tos_str);
@@ -534,7 +534,7 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
   pi.destip = ip_to_str( (guint8 *) &iph.ip_dst);
   pi.ipproto = iph.ip_p;
   pi.iplen = iph.ip_len;
-  pi.iphdrlen = iph.ip_hl;
+  pi.iphdrlen = lo_nibble(iph.ip_v_hl);
   pi.ip_src = iph.ip_src;
 
   offset += hlen;
@@ -682,7 +682,7 @@ dissect_igmp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
   /* To do: check for runts, errs, etc. */
   cksum = ntohs(ih.igmp_cksum);
   
-  switch (ih.igmp_t) {
+  switch (lo_nibble(ih.igmp_v_t)) {
     case IGMP_M_QRY:
       strcpy(type_str, "Router query");
       break;
@@ -722,9 +722,9 @@ dissect_igmp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
     igmp_tree = gtk_tree_new();
     add_subtree(ti, igmp_tree, ETT_IGMP);
     add_item_to_tree(igmp_tree, offset,     1, "Version: %d",
-      ih.igmp_v);
+      hi_nibble(ih.igmp_v_t));
     add_item_to_tree(igmp_tree, offset    , 1, "Type: %d (%s)",
-      ih.igmp_t, type_str);
+      lo_nibble(ih.igmp_v_t), type_str);
     add_item_to_tree(igmp_tree, offset + 1, 1, "Unused: 0x%02x",
       ih.igmp_unused);
     add_item_to_tree(igmp_tree, offset + 2, 2, "Checksum: 0x%04x",
index acb26badf4349c80c510c1dae5908bf86ac8007c..1920b9ef785e184d5c7f42602d720211ffbc1302 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-tcp.c
  * Routines for TCP packet disassembly
  *
- * $Id: packet-tcp.c,v 1.13 1999/01/04 08:45:22 guy Exp $
+ * $Id: packet-tcp.c,v 1.14 1999/02/08 20:02:34 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -288,7 +288,7 @@ dissect_tcp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
     flags[fpos] = '\0';
   }
   
-  hlen = th.th_off * 4;  /* TCP header length, in bytes */
+  hlen = hi_nibble(th.th_off_x2) * 4;  /* TCP header length, in bytes */
 
   if (check_col(fd, COL_RES_SRC_PORT))
     col_add_str(fd, COL_RES_SRC_PORT, get_tcp_port(th.th_sport));
@@ -402,7 +402,7 @@ dissect_tcp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
   
   if( data_out_file ) {
     reassemble_tcp( th.th_seq, /* sequence number */
-        ( pi.iplen -( pi.iphdrlen * 4 )-( th.th_off * 4 ) ), /* length */
+        ( pi.iplen -( pi.iphdrlen * 4 )-( hi_nibble(th.th_off_x2) * 4 ) ), /* length */
         ( pd+offset ), /* data */
         ( th.th_flags & 0x02 ), /* is syn set? */
         pi.ip_src ); /* src ip */
index 226d0878b756f3dc4cd7251f86ca1b293d5934cb..90193e033307887ed78e1f74fa8b0cdd96c22f0b 100644 (file)
--- a/packet.h
+++ b/packet.h
@@ -1,7 +1,7 @@
 /* packet.h
  * Definitions for packet disassembly structures and routines
  *
- * $Id: packet.h,v 1.34 1999/01/28 21:29:36 gram Exp $
+ * $Id: packet.h,v 1.35 1999/02/08 20:02:33 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -51,6 +51,9 @@
                     (guint32)*((guint8 *)p+0)<<0)
 
 
+#define hi_nibble(b) ((b & 0xf0) >> 4)
+#define lo_nibble(b) (b & 0x0f)
+
 /* Useful when highlighting regions inside a dissect_*() function. With this
  * macro, you can highlight from the start of the packet to the end of the
  * frame. See dissect_data() for an example.
@@ -161,13 +164,7 @@ typedef struct _e_icmp {
 /* IGMP structs and definitions */
 
 typedef struct _e_igmp {
-#if BYTE_ORDER == BIG_ENDIAN
-  guint8  igmp_v:4;
-  guint8  igmp_t:4;
-#else /* Little endian */
-  guint8  igmp_t:4;
-  guint8  igmp_v:4;
-#endif
+  guint8  igmp_v_t; /* combines igmp_v and igmp_t */
   guint8  igmp_unused;
   guint16 igmp_cksum;
   guint32 igmp_gaddr;
@@ -185,13 +182,7 @@ typedef struct _e_igmp {
 /* IP structs and definitions */
 
 typedef struct _e_ip {
-#if BYTE_ORDER == BIG_ENDIAN
-  guint8  ip_v:4;
-  guint8  ip_hl:4;
-#else /* Little endian */
-  guint8  ip_hl:4;
-  guint8  ip_v:4;
-#endif
+  guint8  ip_v_hl; /* combines ip_v and ip_hl */
   guint8  ip_tos;
   guint16 ip_len;
   guint16 ip_id;
@@ -304,13 +295,7 @@ typedef struct _e_tcphdr {
   guint16 th_dport;
   guint32 th_seq;
   guint32 th_ack;
-#if BYTE_ORDER == LITTLE_ENDIAN
-  guint8  th_x2:4;
-  guint8  th_off:4;
-#else
-  guint8  th_off:4;
-  guint8  th_x2:4;
-#endif
+  guint8  th_off_x2; /* combines th_off and th_x2 */
   guint8  th_flags;
 #define TH_FIN  0x01
 #define TH_SYN  0x02