From Oleg Kostenko:
[obnox/wireshark/wip.git] / epan / packet_info.h
index 90200bdc80b19565b3171af53b4a1ff0dad0ca1c..28b392ee10a7d725314d690a62aac9132348309d 100644 (file)
@@ -1,10 +1,10 @@
 /* packet_info.h
  * Definitions for packet info structures and routines
  *
- * $Id: packet_info.h,v 1.38 2003/12/29 22:44:50 guy Exp $
+ * $Id$
  *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  *
  * This program is free software; you can redistribute it and/or
 
 #include "frame_data.h"
 #include "tvbuff.h"
-
-/* Types of addresses Ethereal knows about. */
-typedef enum {
-  AT_NONE,             /* no link-layer address */
-  AT_ETHER,            /* MAC (Ethernet, 802.x, FDDI) address */
-  AT_IPv4,             /* IPv4 */
-  AT_IPv6,             /* IPv6 */
-  AT_IPX,              /* IPX */
-  AT_SNA,              /* SNA */
-  AT_ATALK,            /* Appletalk DDP */
-  AT_VINES,            /* Banyan Vines */
-  AT_OSI,              /* OSI NSAP */
-  AT_ARCNET,           /* ARCNET */
-  AT_FC,                /* Fibre Channel */
-  AT_SS7PC,             /* SS7 Point Code */
-  AT_STRINGZ            /* null-terminated string */
-} address_type;
-
-typedef struct _address {
-  address_type  type;          /* type of address */
-  int           len;           /* length of address, in bytes */
-  const guint8 *data;          /* bytes that constitute address */
-} address;
-
-#define        SET_ADDRESS(addr, addr_type, addr_len, addr_data) { \
-       (addr)->type = (addr_type); \
-       (addr)->len = (addr_len); \
-       (addr)->data = (addr_data); \
-       }
-
-/*
- * Given two addresses, return
- *  0 if the addresses are equal,
- *  a positive number if addr1>addr2 in some nondefined metric,
- *  a negative number if addr1<addr2 in some nondefined metric
- */
-#define CMP_ADDRESS(addr1, addr2) \
-       (       ((addr1)->type > (addr2)->type)?1:      \
-               ((addr1)->type < (addr2)->type)?-1:     \
-               ((addr1)->len  > (addr2)->len) ?1:      \
-               ((addr1)->len  < (addr2)->len) ?-1:     \
-               memcmp((addr1)->data, (addr2)->data, (addr1)->len)\
-       )
-
-/*
- * Given two addresses, return "true" if they're equal, "false" otherwise.
- * Addresses are equal only if they have the same type; if the type is
- * AT_NONE, they are then equal, otherwise they must have the same
- * amount of data and the data must be the same.
- */
-#define ADDRESSES_EQUAL(addr1, addr2)                                  \
-       (                                                               \
-        (addr1)->type == (addr2)->type &&                              \
-        (                                                              \
-         (addr1)->type == AT_NONE ||                                   \
-         (                                                             \
-          (addr1)->len == (addr2)->len &&                              \
-          memcmp((addr1)->data, (addr2)->data, (addr1)->len) == 0      \
-         )                                                             \
-        )                                                              \
-       )
-
-/*
- * Copy an address, allocating a new buffer for the address data.
- */
-#define COPY_ADDRESS(to, from) { \
-       guint8 *COPY_ADDRESS_data; \
-       (to)->type = (from)->type; \
-       (to)->len = (from)->len; \
-       COPY_ADDRESS_data = g_malloc((from)->len); \
-       memcpy(COPY_ADDRESS_data, (from)->data, (from)->len); \
-       (to)->data = COPY_ADDRESS_data; \
-       }
-
-/* Types of port numbers Ethereal knows about. */
-typedef enum {
-  PT_NONE,             /* no port number */
-  PT_SCTP,             /* SCTP */
-  PT_TCP,              /* TCP */
-  PT_UDP,              /* UDP */
-  PT_IPX,              /* IPX sockets */
-  PT_NCP,              /* NCP connection */
-  PT_EXCHG,     /* Fibre Channel exchange */
-  PT_DDP,               /* DDP AppleTalk connection */
-  PT_SBCCS              /* FICON */
-} port_type;
-
-/* Types of circuit IDs Ethereal knows about. */
-typedef enum {
-  CT_NONE,             /* no port number */
-  CT_DLCI,             /* Frame Relay DLCI */
-  CT_ISDN,             /* ISDN channel number */
-  CT_X25               /* X.25 logical channel number */
-  /* Could also have ATM VPI/VCI pairs */
-} circuit_type;
+#include "address.h"
 
 #define P2P_DIR_UNKNOWN        -1
 #define P2P_DIR_SENT   0
 #define P2P_DIR_RECV   1
 
+#define MTP2_ANNEX_A_USED_UNKNOWN -1
+#define MTP2_ANNEX_A_NOT_USED      0
+#define MTP2_ANNEX_A_USED          1
+
 #define PINFO_SOF_FIRST_FRAME   0x1
 #define PINFO_SOF_SOFF          0x2
 #define PINFO_EOF_LAST_FRAME    0x80
 #define PINFO_EOF_INVALID       0x40
+#define MAX_NUMBER_OF_PPIDS     2
 
 typedef struct _packet_info {
   const char *current_proto;   /* name of protocol currently being dissected */
@@ -149,7 +60,7 @@ typedef struct _packet_info {
   guint32 ipxptype;            /* IPX packet type, if this is an IPX packet */
   circuit_type ctype;          /* type of circuit, for protocols with a VC identifier */
   guint32 circuit_id;          /* circuit ID, for protocols with a VC identifier */
-  char   *noreassembly_reason;  /* reason why reassembly wasn't done, if any */
+  const char *noreassembly_reason;  /* reason why reassembly wasn't done, if any */
   gboolean fragmented;         /* TRUE if the protocol is only a fragment */
   gboolean in_error_pkt;       /* TRUE if we're inside an {ICMP,CLNP,...} error packet */
   port_type ptype;             /* type of the following two port numbers */
@@ -178,13 +89,13 @@ typedef struct _packet_info {
   guint16 want_pdu_tracking;   /* >0 if the subdissector has specified
                                   a value in 'bytes_until_next_pdu'.
                                   When a dissector detects that the next PDU
-                                  will start beyond the start of the next 
-                                  segment, it can set this value to 2 
-                                  and 'bytes_until_next_pdu' to the number of 
-                                  bytes beyond the next segment where the 
+                                  will start beyond the start of the next
+                                  segment, it can set this value to 2
+                                  and 'bytes_until_next_pdu' to the number of
+                                  bytes beyond the next segment where the
                                   next PDU starts.
 
-                                  If the protocol dissector below this 
+                                  If the protocol dissector below this
                                   one is capable of PDU tracking it can
                                   use this hint to detect PDUs that starts
                                   unaligned to the segment boundaries.
@@ -192,7 +103,7 @@ typedef struct _packet_info {
                                   (some) protocols to detect when a new PDU
                                   starts in the middle of a tcp segment.
 
-                                  There is intelligence in the glue between 
+                                  There is intelligence in the glue between
                                   dissector layers to make sure that this
                                   request is only passed down to the protocol
                                   immediately below the current one and not
@@ -200,10 +111,13 @@ typedef struct _packet_info {
                                */
   guint32 bytes_until_next_pdu;
 
-                                   
+
   int     iplen;
   int     iphdrlen;
-  int    p2p_dir;
+  int    p2p_dir;              /* Packet was captured as an 
+                                       outbound (P2P_DIR_SENT) 
+                                       inbound (P2P_DIR_RECV) 
+                                       unknown (P2P_DIR_UNKNOWN) */
   guint16 oxid;                 /* next 2 fields reqd to identify fibre */
   guint16 rxid;                 /* channel conversations */
   guint8  r_ctl;                /* R_CTL field in Fibre Channel Protocol */
@@ -216,7 +130,40 @@ typedef struct _packet_info {
   guint16 src_idx;              /* Source port index (Cisco MDS-specific) */
   guint16 dst_idx;              /* Dest port index (Cisco MDS-specific) */
   guint16 vsan;                 /* Fibre channel/Cisco MDS-specific */
+
+  /* Extra data for DCERPC handling and tracking of context ids */
+  guint16 dcectxid;             /* Context ID (DCERPC-specific) */
+  int     dcetransporttype;     /* Transport type
+                                 * Value -1 means "not a DCERPC packet"
+                                 */
+  guint16 dcetransportsalt;    /* fid: if transporttype==DCE_CN_TRANSPORT_SMBPIPE */
+
+  /* Extra data for handling of decryption of GSSAPI wrapped tvbuffs.
+     Caller sets decrypt_gssapi_tvb if this service is requested.
+     If gssapi_encrypted_tvb is NULL, then the rest of the tvb data following
+     the gssapi blob itself is decrypted othervise the gssapi_encrypted_tvb
+     tvb will be decrypted (DCERPC has the data before the gssapi blob)
+     If, on return, gssapi_data_encrypted is FALSE, the wrapped tvbuff
+     was signed (i.e., an encrypted signature was present, to check
+     whether the data was modified by a man in the middle) but not sealed
+     (i.e., the data itself wasn't encrypted).
+  */
+#define DECRYPT_GSSAPI_NORMAL  1
+#define DECRYPT_GSSAPI_DCE     2
+  guint16 decrypt_gssapi_tvb;
+  tvbuff_t *gssapi_wrap_tvb;
+  tvbuff_t *gssapi_encrypted_tvb;
+  tvbuff_t *gssapi_decrypted_tvb;
+  gboolean gssapi_data_encrypted;
+  guint32 ppid[MAX_NUMBER_OF_PPIDS]; /* The first NUMBER_OF_PPIDS PPIDS which are present
+                                      * in the SCTP packet
+                                      */
   void    *private_data;       /* pointer to data passed from one dissector to another */
+  GString *layer_names;        /* layers of each protocol */
+  guint16 link_number;
+  gchar   annex_a_used;
+  guint16 profinet_type;       /* the type of PROFINET packet (0: not a PROFINET packet) */
 } packet_info;
 
 #endif /* __PACKET_INFO_H__ */