wireshark/wireshark-corosync-packet-dissector.patch

2787 lines
112 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Index: wireshark-1.4.1/epan/dissectors/Makefile.common
===================================================================
--- wireshark-1.4.1.orig/epan/dissectors/Makefile.common
+++ wireshark-1.4.1/epan/dissectors/Makefile.common
@@ -307,6 +307,8 @@ DISSECTOR_SRC = \
packet-collectd.c \
packet-componentstatus.c \
packet-cops.c \
+ packet-corosync-totemnet.c \
+ packet-corosync-totemsrp.c \
packet-cosine.c \
packet-cpfi.c \
packet-cpha.c \
Index: wireshark-1.4.1/epan/dissectors/packet-corosync-totemnet.c
===================================================================
--- /dev/null
+++ wireshark-1.4.1/epan/dissectors/packet-corosync-totemnet.c
@@ -0,0 +1,1274 @@
+/* packet-corosync-totemnet.c
+ * Routines for the lowest level(encryption/decryption) protocol used in Corosync cluster engine
+ * Copyright 2009 2010 Masatake YAMATO <yamato@redhat.com>
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * $Id:$
+ *
+ * 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
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <epan/packet.h>
+#include <epan/prefs.h>
+#include <epan/crypt/crypt-sha1.h>
+
+#include "packet-corosync-totemsrp.h"
+
+/* This dissector deals packets defined in totemnet.c of corosync
+ cluster engine. In the totemnet.c the packet is encrypted and decrypted
+ with LibTomCrypt. This dissector tries decrypting the packet with
+ the library and sha1 functions in wireshark. */
+
+
+/* crypto.h */
+
+/* About LibTomCrypt:
+ * ---------------------------------------------------------------------
+ * LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.com
+ */
+
+/*
+ * Modifications in packet-corosync-totemnet.c done by Masatake YAMATO
+ * ---------------------------------------------------------------------
+ *
+ * - added `corocrypto' as symbol prefix to some symbols, and
+ * - added `static' modifier to functions and symbols to narrow the scope.
+ *
+ */
+struct sober128_prng {
+ unsigned long R[17], /* Working storage for the shift register */
+ initR[17], /* saved register contents */
+ konst, /* key dependent constant */
+ sbuf; /* partial word encryption buffer */
+
+ int nbuf, /* number of part-word stream bits buffered */
+ flag, /* first add_entropy call or not? */
+ set; /* did we call add_entropy to set key? */
+
+};
+
+static int corocrypto_sober128_start(struct sober128_prng *prng);
+static int corocrypto_sober128_add_entropy(const unsigned char *buf, unsigned long len, struct sober128_prng *prng);
+static unsigned long corocrypto_sober128_read(unsigned char *buf, unsigned long len, struct sober128_prng *prng);
+
+
+/*
+ * Dissector body
+ */
+
+#define PORT_COROSYNC_TOTEMNET 5405
+
+/* Forward declaration we need below */
+void proto_reg_handoff_corosync_totemnet(void);
+
+/* Initialize the protocol and registered fields */
+static int proto_corosync_totemnet = -1;
+
+/* field of struct security_header */
+static int hf_corosync_totemnet_security_header_hash_digest = -1;
+static int hf_corosync_totemnet_security_header_salt = -1;
+
+/* configurable parameters */
+static guint corosync_totemnet_port = PORT_COROSYNC_TOTEMNET;
+static gchar* corosync_totemnet_private_key = NULL;
+
+/* Initialize the subtree pointers */
+static gint ett_corosync_totemnet_security_header = -1;
+
+
+#define HMAC_HASH_SIZE 20
+#define SALT_SIZE 16
+
+
+
+static int
+dissect_corosync_totemnet_security_header(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree)
+{
+ proto_item *item;
+ proto_tree *tree;
+
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "COROSYNC/TOTEMNET");
+
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ if (parent_tree)
+ {
+ item = proto_tree_add_item(parent_tree, proto_corosync_totemnet, tvb, 0,
+ -1, FALSE);
+ tree = proto_item_add_subtree(item, ett_corosync_totemnet_security_header);
+
+ proto_tree_add_item(tree,
+ hf_corosync_totemnet_security_header_hash_digest,
+ tvb, 0, HMAC_HASH_SIZE, FALSE);
+ proto_tree_add_item(tree,
+ hf_corosync_totemnet_security_header_salt,
+ tvb, HMAC_HASH_SIZE, SALT_SIZE, FALSE);
+
+ }
+ return HMAC_HASH_SIZE + SALT_SIZE;
+}
+
+/* About totemnet.c of corosync cluster engine:
+ *
+ * dissect_corosynec_totemnet_with_decryption() is derived from
+ * totemnet.c in corosync.
+ *
+ * ---------------------------------------------------------------------
+ * Copyright (c) 2005 MontaVista Software, Inc.
+ * Copyright (c) 2006-2007 Red Hat, Inc.
+ * Copyright (c) 2006 Sun Microsystems, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Steven Dake (sdake@redhat.com)
+
+ * This software licensed under BSD license, the text of which follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of the MontaVista Software, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+static int
+dissect_corosynec_totemnet_with_decryption(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree)
+{
+ unsigned char keys[48];
+ struct sober128_prng keygen_prng_state;
+ struct sober128_prng stream_prng_state;
+ unsigned char *hmac_key = &keys[32];
+ unsigned char *cipher_key = &keys[16];
+ unsigned char *initial_vector = &keys[0];
+ unsigned char digest_comparison[HMAC_HASH_SIZE];
+
+
+ guint8 *io_base;
+ guint io_len;
+
+#define PRIVATE_KEY_LEN_MAX 256
+ gchar private_key[PRIVATE_KEY_LEN_MAX];
+ unsigned int private_key_len;
+ unsigned char* hash_digest;
+ unsigned char* salt;
+
+
+ io_len = tvb_length(tvb);
+ if (io_len < HMAC_HASH_SIZE + SALT_SIZE)
+ return 0;
+
+ io_base = tvb_memdup(tvb, 0, io_len);
+ hash_digest = io_base;
+ salt = io_base + HMAC_HASH_SIZE;
+
+
+ memset(private_key, 0, sizeof(private_key));
+
+ private_key_len = (strlen(corosync_totemnet_private_key)+4) & 0xFC;
+ if (private_key_len > PRIVATE_KEY_LEN_MAX)
+ private_key_len = PRIVATE_KEY_LEN_MAX;
+ g_strlcpy(private_key, corosync_totemnet_private_key, private_key_len);
+
+
+ /*
+ * Generate MAC, CIPHER, IV keys from private key
+ */
+ memset (keys, 0, sizeof(keys));
+ corocrypto_sober128_start (&keygen_prng_state);
+ corocrypto_sober128_add_entropy(private_key,
+ private_key_len, &keygen_prng_state);
+ corocrypto_sober128_add_entropy (salt, SALT_SIZE, &keygen_prng_state);
+ corocrypto_sober128_read (keys, sizeof (keys), &keygen_prng_state);
+
+ /*
+ * Setup stream cipher
+ */
+ corocrypto_sober128_start (&stream_prng_state);
+ corocrypto_sober128_add_entropy (cipher_key, 16, &stream_prng_state);
+ corocrypto_sober128_add_entropy (initial_vector, 16, &stream_prng_state);
+
+ /*
+ * Authenticate contents of message
+ */
+ sha1_hmac(hmac_key, 16,
+ io_base + HMAC_HASH_SIZE, io_len - HMAC_HASH_SIZE,
+ digest_comparison);
+
+ if (memcmp (digest_comparison, hash_digest, HMAC_HASH_SIZE) != 0)
+ {
+ g_free(io_base);
+ return 0;
+ }
+
+
+ /*
+ * Decrypt the contents of the message with the cipher key
+ */
+
+ corocrypto_sober128_read (io_base + HMAC_HASH_SIZE + SALT_SIZE,
+ io_len - (HMAC_HASH_SIZE + SALT_SIZE),
+ &stream_prng_state);
+
+
+ /*
+ * Dissect the decrypted data
+ */
+ {
+ tvbuff_t *decrypted_tvb;
+ tvbuff_t *next_tvb;
+
+
+ decrypted_tvb = tvb_new_real_data(io_base, io_len, io_len);
+ tvb_set_free_cb(decrypted_tvb, g_free);
+
+ tvb_set_child_real_data_tvbuff(tvb, decrypted_tvb);
+ add_new_data_source(pinfo, decrypted_tvb, "Decrypted Data");
+
+
+ dissect_corosync_totemnet_security_header(decrypted_tvb, pinfo, parent_tree);
+
+ next_tvb = tvb_new_subset(decrypted_tvb,
+ HMAC_HASH_SIZE + SALT_SIZE,
+ io_len - (HMAC_HASH_SIZE + SALT_SIZE),
+ io_len - (HMAC_HASH_SIZE + SALT_SIZE));
+
+
+ return dissect_corosync_totemsrp(next_tvb, pinfo, parent_tree) + HMAC_HASH_SIZE + SALT_SIZE;
+ }
+}
+
+static int
+dissect_corosynec_totemnet(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree)
+{
+ if (corosync_totemnet_private_key)
+ {
+ int r;
+
+ r = dissect_corosynec_totemnet_with_decryption(tvb, pinfo, parent_tree);
+
+ if (r > 0)
+ return r;
+ }
+ return dissect_corosync_totemsrp(tvb, pinfo, parent_tree);
+}
+
+
+void
+proto_register_corosync_totemnet(void)
+{
+ module_t *corosync_totemnet_module;
+
+ static hf_register_info hf[] = {
+ { &hf_corosync_totemnet_security_header_hash_digest,
+ { "Hash digest", "corosync_totemnet.security_header_hash_digest",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemnet_security_header_salt,
+ { "Salt", "corosync_totemnet.security_header_salt",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ };
+
+ static gint *ett_corosync_totemnet[] = {
+ &ett_corosync_totemnet_security_header,
+ };
+
+ proto_corosync_totemnet = proto_register_protocol("Totemnet Layer of Corosync Cluster Engine",
+ "COROSYNC/TOTEMNET", "corosync_totemnet");
+ proto_register_field_array(proto_corosync_totemnet, hf, array_length(hf));
+ proto_register_subtree_array(ett_corosync_totemnet, array_length(ett_corosync_totemnet));
+
+ corosync_totemnet_module = prefs_register_protocol(proto_corosync_totemnet,
+ proto_reg_handoff_corosync_totemnet);
+
+ prefs_register_uint_preference(corosync_totemnet_module, "udp.port",
+ "UDP Port",
+ "Set the UDP port for totem ring protocol implemented in corosync cluster engine",
+ 10,
+ &corosync_totemnet_port);
+ /* tserong@novell.com: private key as a string doesn't work for
+ * secauth with /etc/corosync/authkey, so leaving this out until
+ * we come up with a better solution
+ prefs_register_string_preference(corosync_totemnet_module, "private_key",
+ "Private key",
+ "Key to decrypt the communications on corosync cluster engine",
+ (const gchar **)&corosync_totemnet_private_key);
+ */
+}
+
+void
+proto_reg_handoff_corosync_totemnet(void)
+{
+ static gboolean register_dissector = FALSE;
+
+ static int port = 0;
+
+ static dissector_handle_t corosync_totemnet_handle;
+
+ if (register_dissector)
+ {
+ dissector_delete("udp.port", port, corosync_totemnet_handle);
+ }
+ else
+ {
+ corosync_totemnet_handle = new_create_dissector_handle(dissect_corosynec_totemnet,
+ proto_corosync_totemnet);
+ register_dissector = TRUE;
+ }
+
+ port = corosync_totemnet_port;
+ dissector_add("udp.port", port, corosync_totemnet_handle);
+}
+
+
+
+/* crypto.c */
+
+/* About LibTomCrypt:
+ * ---------------------------------------------------------------------
+ * LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.com
+ */
+#define CONST64(n) n ## ULL
+
+typedef unsigned long ulong32;
+typedef unsigned long long ulong64;
+
+#ifdef WORDS_BIGENDIAN
+#define ENDIAN_BIG
+#else
+#define ENDIAN_LITTLE
+#endif
+
+#if defined(__WORDSIZE)
+#if __WORDSIZE == 64
+#define ENDIAN_64BITWORD
+#endif
+#if __WORDSIZE == 32
+#define ENDIAN_32BITWORD
+#endif
+#else
+/* XXX need to find a better default
+ */
+#define ENDIAN_32BITWORD
+#endif
+
+/* ---- HELPER MACROS ---- */
+#ifdef ENDIAN_NEUTRAL
+
+#define STORE32L(x, y) \
+ { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD32L(x, y) \
+ { x = ((unsigned long)((y)[3] & 255)<<24) | \
+ ((unsigned long)((y)[2] & 255)<<16) | \
+ ((unsigned long)((y)[1] & 255)<<8) | \
+ ((unsigned long)((y)[0] & 255)); }
+
+#define STORE64L(x, y) \
+ { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
+ (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
+ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD64L(x, y) \
+ { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
+ (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
+ (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
+ (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
+
+#define STORE32H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
+ (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
+
+#define LOAD32H(x, y) \
+ { x = ((unsigned long)((y)[0] & 255)<<24) | \
+ ((unsigned long)((y)[1] & 255)<<16) | \
+ ((unsigned long)((y)[2] & 255)<<8) | \
+ ((unsigned long)((y)[3] & 255)); }
+
+#define STORE64H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
+ (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
+ (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
+ (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
+
+#define LOAD64H(x, y) \
+ { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
+ (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
+ (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
+ (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
+
+#endif /* ENDIAN_NEUTRAL */
+
+#ifdef ENDIAN_LITTLE
+
+#define STORE32H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
+ (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
+
+#define LOAD32H(x, y) \
+ { x = ((unsigned long)((y)[0] & 255)<<24) | \
+ ((unsigned long)((y)[1] & 255)<<16) | \
+ ((unsigned long)((y)[2] & 255)<<8) | \
+ ((unsigned long)((y)[3] & 255)); }
+
+#define STORE64H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
+ (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
+ (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
+ (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
+
+#define LOAD64H(x, y) \
+ { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
+ (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
+ (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
+ (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
+
+#ifdef ENDIAN_32BITWORD
+
+#define STORE32L(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32L(x, y) \
+ memcpy(&(x), y, 4);
+
+#define STORE64L(x, y) \
+ { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
+ (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
+ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD64L(x, y) \
+ { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
+ (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
+ (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
+ (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
+
+#else /* 64-bit words then */
+
+#define STORE32L(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32L(x, y) \
+ { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
+
+#define STORE64L(x, y) \
+ { ulong64 __t = (x); memcpy(y, &__t, 8); }
+
+#define LOAD64L(x, y) \
+ { memcpy(&(x), y, 8); }
+
+#endif /* ENDIAN_64BITWORD */
+
+#endif /* ENDIAN_LITTLE */
+
+#ifdef ENDIAN_BIG
+#define STORE32L(x, y) \
+ { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD32L(x, y) \
+ { x = ((unsigned long)((y)[3] & 255)<<24) | \
+ ((unsigned long)((y)[2] & 255)<<16) | \
+ ((unsigned long)((y)[1] & 255)<<8) | \
+ ((unsigned long)((y)[0] & 255)); }
+
+#define STORE64L(x, y) \
+ { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
+ (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
+ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD64L(x, y) \
+ { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
+ (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
+ (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
+ (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
+
+#ifdef ENDIAN_32BITWORD
+
+#define STORE32H(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32H(x, y) \
+ memcpy(&(x), y, 4);
+
+#define STORE64H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
+ (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
+ (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
+ (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
+
+#define LOAD64H(x, y) \
+ { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
+ (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
+ (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
+ (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
+
+#else /* 64-bit words then */
+
+#define STORE32H(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32H(x, y) \
+ { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
+
+#define STORE64H(x, y) \
+ { ulong64 __t = (x); memcpy(y, &__t, 8); }
+
+#define LOAD64H(x, y) \
+ { memcpy(&(x), y, 8); }
+
+#endif /* ENDIAN_64BITWORD */
+#endif /* ENDIAN_BIG */
+
+#define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
+ ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
+
+#if defined(__GNUC__) && defined(__i386__) && !defined(INTEL_CC)
+
+static inline unsigned long ROL(unsigned long word, int i)
+{
+ __asm__("roll %%cl,%0"
+ :"=r" (word)
+ :"0" (word),"c" (i));
+ return word;
+}
+
+static inline unsigned long ROR(unsigned long word, int i)
+{
+ __asm__("rorl %%cl,%0"
+ :"=r" (word)
+ :"0" (word),"c" (i));
+ return word;
+}
+
+#else
+
+/* rotates the hard way */
+#define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
+#define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
+
+#endif
+
+#define ROL64(x, y) \
+ ( (((x)<<((ulong64)(y)&63)) | \
+ (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
+
+#define ROR64(x, y) \
+ ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
+ ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
+
+#undef MAX
+#undef MIN
+#define MAX(x, y) ( ((x)>(y))?(x):(y) )
+#define MIN(x, y) ( ((x)<(y))?(x):(y) )
+
+/* extract a byte portably */
+#define byte(x, n) (((x) >> (8 * (n))) & 255)
+
+#define CONST64(n) n ## ULL
+
+
+/*
+ * The mycrypt_macros.h file
+ */
+
+/* ---- HELPER MACROS ---- */
+#ifdef ENDIAN_NEUTRAL
+
+#define STORE32L(x, y) \
+ { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD32L(x, y) \
+ { x = ((unsigned long)((y)[3] & 255)<<24) | \
+ ((unsigned long)((y)[2] & 255)<<16) | \
+ ((unsigned long)((y)[1] & 255)<<8) | \
+ ((unsigned long)((y)[0] & 255)); }
+
+#define STORE64L(x, y) \
+ { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
+ (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
+ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD64L(x, y) \
+ { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
+ (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
+ (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
+ (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
+
+#define STORE32H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
+ (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
+
+#define LOAD32H(x, y) \
+ { x = ((unsigned long)((y)[0] & 255)<<24) | \
+ ((unsigned long)((y)[1] & 255)<<16) | \
+ ((unsigned long)((y)[2] & 255)<<8) | \
+ ((unsigned long)((y)[3] & 255)); }
+
+#define STORE64H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
+ (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
+ (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
+ (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
+
+#define LOAD64H(x, y) \
+ { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
+ (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
+ (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
+ (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
+
+#endif /* ENDIAN_NEUTRAL */
+
+#ifdef ENDIAN_LITTLE
+
+#define STORE32H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
+ (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
+
+#define LOAD32H(x, y) \
+ { x = ((unsigned long)((y)[0] & 255)<<24) | \
+ ((unsigned long)((y)[1] & 255)<<16) | \
+ ((unsigned long)((y)[2] & 255)<<8) | \
+ ((unsigned long)((y)[3] & 255)); }
+
+#define STORE64H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
+ (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
+ (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
+ (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
+
+#define LOAD64H(x, y) \
+ { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
+ (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
+ (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
+ (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
+
+#ifdef ENDIAN_32BITWORD
+
+#define STORE32L(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32L(x, y) \
+ memcpy(&(x), y, 4);
+
+#define STORE64L(x, y) \
+ { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
+ (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
+ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD64L(x, y) \
+ { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
+ (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
+ (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
+ (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
+
+#else /* 64-bit words then */
+
+#define STORE32L(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32L(x, y) \
+ { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
+
+#define STORE64L(x, y) \
+ { ulong64 __t = (x); memcpy(y, &__t, 8); }
+
+#define LOAD64L(x, y) \
+ { memcpy(&(x), y, 8); }
+
+#endif /* ENDIAN_64BITWORD */
+
+#endif /* ENDIAN_LITTLE */
+
+#ifdef ENDIAN_BIG
+#define STORE32L(x, y) \
+ { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD32L(x, y) \
+ { x = ((unsigned long)((y)[3] & 255)<<24) | \
+ ((unsigned long)((y)[2] & 255)<<16) | \
+ ((unsigned long)((y)[1] & 255)<<8) | \
+ ((unsigned long)((y)[0] & 255)); }
+
+#define STORE64L(x, y) \
+ { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
+ (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
+ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
+ (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
+
+#define LOAD64L(x, y) \
+ { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
+ (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
+ (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
+ (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
+
+#ifdef ENDIAN_32BITWORD
+
+#define STORE32H(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32H(x, y) \
+ memcpy(&(x), y, 4);
+
+#define STORE64H(x, y) \
+ { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
+ (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
+ (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
+ (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
+
+#define LOAD64H(x, y) \
+ { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
+ (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
+ (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
+ (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
+
+#else /* 64-bit words then */
+
+#define STORE32H(x, y) \
+ { unsigned long __t = (x); memcpy(y, &__t, 4); }
+
+#define LOAD32H(x, y) \
+ { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
+
+#define STORE64H(x, y) \
+ { ulong64 __t = (x); memcpy(y, &__t, 8); }
+
+#define LOAD64H(x, y) \
+ { memcpy(&(x), y, 8); }
+
+#endif /* ENDIAN_64BITWORD */
+#endif /* ENDIAN_BIG */
+
+#define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
+ ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
+
+
+#define ROL64(x, y) \
+ ( (((x)<<((ulong64)(y)&63)) | \
+ (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
+
+#define ROR64(x, y) \
+ ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
+ ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
+
+#undef MAX
+#undef MIN
+#define MAX(x, y) ( ((x)>(y))?(x):(y) )
+#define MIN(x, y) ( ((x)<(y))?(x):(y) )
+
+/* extract a byte portably */
+#define byte(x, n) (((x) >> (8 * (n))) & 255)
+
+/* $Id: s128multab.h 213 2003-12-16 04:27:12Z ggr $ */
+/* @(#)TuringMultab.h 1.3 (QUALCOMM) 02/09/03 */
+/* Multiplication table for Turing using 0xD02B4367 */
+
+static const ulong32 Multab[256] = {
+ 0x00000000, 0xD02B4367, 0xED5686CE, 0x3D7DC5A9,
+ 0x97AC41D1, 0x478702B6, 0x7AFAC71F, 0xAAD18478,
+ 0x631582EF, 0xB33EC188, 0x8E430421, 0x5E684746,
+ 0xF4B9C33E, 0x24928059, 0x19EF45F0, 0xC9C40697,
+ 0xC62A4993, 0x16010AF4, 0x2B7CCF5D, 0xFB578C3A,
+ 0x51860842, 0x81AD4B25, 0xBCD08E8C, 0x6CFBCDEB,
+ 0xA53FCB7C, 0x7514881B, 0x48694DB2, 0x98420ED5,
+ 0x32938AAD, 0xE2B8C9CA, 0xDFC50C63, 0x0FEE4F04,
+ 0xC154926B, 0x117FD10C, 0x2C0214A5, 0xFC2957C2,
+ 0x56F8D3BA, 0x86D390DD, 0xBBAE5574, 0x6B851613,
+ 0xA2411084, 0x726A53E3, 0x4F17964A, 0x9F3CD52D,
+ 0x35ED5155, 0xE5C61232, 0xD8BBD79B, 0x089094FC,
+ 0x077EDBF8, 0xD755989F, 0xEA285D36, 0x3A031E51,
+ 0x90D29A29, 0x40F9D94E, 0x7D841CE7, 0xADAF5F80,
+ 0x646B5917, 0xB4401A70, 0x893DDFD9, 0x59169CBE,
+ 0xF3C718C6, 0x23EC5BA1, 0x1E919E08, 0xCEBADD6F,
+ 0xCFA869D6, 0x1F832AB1, 0x22FEEF18, 0xF2D5AC7F,
+ 0x58042807, 0x882F6B60, 0xB552AEC9, 0x6579EDAE,
+ 0xACBDEB39, 0x7C96A85E, 0x41EB6DF7, 0x91C02E90,
+ 0x3B11AAE8, 0xEB3AE98F, 0xD6472C26, 0x066C6F41,
+ 0x09822045, 0xD9A96322, 0xE4D4A68B, 0x34FFE5EC,
+ 0x9E2E6194, 0x4E0522F3, 0x7378E75A, 0xA353A43D,
+ 0x6A97A2AA, 0xBABCE1CD, 0x87C12464, 0x57EA6703,
+ 0xFD3BE37B, 0x2D10A01C, 0x106D65B5, 0xC04626D2,
+ 0x0EFCFBBD, 0xDED7B8DA, 0xE3AA7D73, 0x33813E14,
+ 0x9950BA6C, 0x497BF90B, 0x74063CA2, 0xA42D7FC5,
+ 0x6DE97952, 0xBDC23A35, 0x80BFFF9C, 0x5094BCFB,
+ 0xFA453883, 0x2A6E7BE4, 0x1713BE4D, 0xC738FD2A,
+ 0xC8D6B22E, 0x18FDF149, 0x258034E0, 0xF5AB7787,
+ 0x5F7AF3FF, 0x8F51B098, 0xB22C7531, 0x62073656,
+ 0xABC330C1, 0x7BE873A6, 0x4695B60F, 0x96BEF568,
+ 0x3C6F7110, 0xEC443277, 0xD139F7DE, 0x0112B4B9,
+ 0xD31DD2E1, 0x03369186, 0x3E4B542F, 0xEE601748,
+ 0x44B19330, 0x949AD057, 0xA9E715FE, 0x79CC5699,
+ 0xB008500E, 0x60231369, 0x5D5ED6C0, 0x8D7595A7,
+ 0x27A411DF, 0xF78F52B8, 0xCAF29711, 0x1AD9D476,
+ 0x15379B72, 0xC51CD815, 0xF8611DBC, 0x284A5EDB,
+ 0x829BDAA3, 0x52B099C4, 0x6FCD5C6D, 0xBFE61F0A,
+ 0x7622199D, 0xA6095AFA, 0x9B749F53, 0x4B5FDC34,
+ 0xE18E584C, 0x31A51B2B, 0x0CD8DE82, 0xDCF39DE5,
+ 0x1249408A, 0xC26203ED, 0xFF1FC644, 0x2F348523,
+ 0x85E5015B, 0x55CE423C, 0x68B38795, 0xB898C4F2,
+ 0x715CC265, 0xA1778102, 0x9C0A44AB, 0x4C2107CC,
+ 0xE6F083B4, 0x36DBC0D3, 0x0BA6057A, 0xDB8D461D,
+ 0xD4630919, 0x04484A7E, 0x39358FD7, 0xE91ECCB0,
+ 0x43CF48C8, 0x93E40BAF, 0xAE99CE06, 0x7EB28D61,
+ 0xB7768BF6, 0x675DC891, 0x5A200D38, 0x8A0B4E5F,
+ 0x20DACA27, 0xF0F18940, 0xCD8C4CE9, 0x1DA70F8E,
+ 0x1CB5BB37, 0xCC9EF850, 0xF1E33DF9, 0x21C87E9E,
+ 0x8B19FAE6, 0x5B32B981, 0x664F7C28, 0xB6643F4F,
+ 0x7FA039D8, 0xAF8B7ABF, 0x92F6BF16, 0x42DDFC71,
+ 0xE80C7809, 0x38273B6E, 0x055AFEC7, 0xD571BDA0,
+ 0xDA9FF2A4, 0x0AB4B1C3, 0x37C9746A, 0xE7E2370D,
+ 0x4D33B375, 0x9D18F012, 0xA06535BB, 0x704E76DC,
+ 0xB98A704B, 0x69A1332C, 0x54DCF685, 0x84F7B5E2,
+ 0x2E26319A, 0xFE0D72FD, 0xC370B754, 0x135BF433,
+ 0xDDE1295C, 0x0DCA6A3B, 0x30B7AF92, 0xE09CECF5,
+ 0x4A4D688D, 0x9A662BEA, 0xA71BEE43, 0x7730AD24,
+ 0xBEF4ABB3, 0x6EDFE8D4, 0x53A22D7D, 0x83896E1A,
+ 0x2958EA62, 0xF973A905, 0xC40E6CAC, 0x14252FCB,
+ 0x1BCB60CF, 0xCBE023A8, 0xF69DE601, 0x26B6A566,
+ 0x8C67211E, 0x5C4C6279, 0x6131A7D0, 0xB11AE4B7,
+ 0x78DEE220, 0xA8F5A147, 0x958864EE, 0x45A32789,
+ 0xEF72A3F1, 0x3F59E096, 0x0224253F, 0xD20F6658,
+};
+
+/* $Id: s128sbox.h 213 2003-12-16 04:27:12Z ggr $ */
+/* Sbox for SOBER-128 */
+/*
+ * This is really the combination of two SBoxes; the least significant
+ * 24 bits comes from:
+ * 8->32 Sbox generated by Millan et. al. at Queensland University of
+ * Technology. See: E. Dawson, W. Millan, L. Burnett, G. Carter,
+ * "On the Design of 8*32 S-boxes". Unpublished report, by the
+ * Information Systems Research Centre,
+ * Queensland University of Technology, 1999.
+ *
+ * The most significant 8 bits are the Skipjack "F table", which can be
+ * found at http://csrc.nist.gov/CryptoToolkit/skipjack/skipjack.pdf .
+ * In this optimised table, though, the intent is to XOR the word from
+ * the table selected by the high byte with the input word. Thus, the
+ * high byte is actually the Skipjack F-table entry XORED with its
+ * table index.
+ */
+static const ulong32 Sbox[256] = {
+ 0xa3aa1887, 0xd65e435c, 0x0b65c042, 0x800e6ef4,
+ 0xfc57ee20, 0x4d84fed3, 0xf066c502, 0xf354e8ae,
+ 0xbb2ee9d9, 0x281f38d4, 0x1f829b5d, 0x735cdf3c,
+ 0x95864249, 0xbc2e3963, 0xa1f4429f, 0xf6432c35,
+ 0xf7f40325, 0x3cc0dd70, 0x5f973ded, 0x9902dc5e,
+ 0xda175b42, 0x590012bf, 0xdc94d78c, 0x39aab26b,
+ 0x4ac11b9a, 0x8c168146, 0xc3ea8ec5, 0x058ac28f,
+ 0x52ed5c0f, 0x25b4101c, 0x5a2db082, 0x370929e1,
+ 0x2a1843de, 0xfe8299fc, 0x202fbc4b, 0x833915dd,
+ 0x33a803fa, 0xd446b2de, 0x46233342, 0x4fcee7c3,
+ 0x3ad607ef, 0x9e97ebab, 0x507f859b, 0xe81f2e2f,
+ 0xc55b71da, 0xd7e2269a, 0x1339c3d1, 0x7ca56b36,
+ 0xa6c9def2, 0xb5c9fc5f, 0x5927b3a3, 0x89a56ddf,
+ 0xc625b510, 0x560f85a7, 0xace82e71, 0x2ecb8816,
+ 0x44951e2a, 0x97f5f6af, 0xdfcbc2b3, 0xce4ff55d,
+ 0xcb6b6214, 0x2b0b83e3, 0x549ea6f5, 0x9de041af,
+ 0x792f1f17, 0xf73b99ee, 0x39a65ec0, 0x4c7016c6,
+ 0x857709a4, 0xd6326e01, 0xc7b280d9, 0x5cfb1418,
+ 0xa6aff227, 0xfd548203, 0x506b9d96, 0xa117a8c0,
+ 0x9cd5bf6e, 0xdcee7888, 0x61fcfe64, 0xf7a193cd,
+ 0x050d0184, 0xe8ae4930, 0x88014f36, 0xd6a87088,
+ 0x6bad6c2a, 0x1422c678, 0xe9204de7, 0xb7c2e759,
+ 0x0200248e, 0x013b446b, 0xda0d9fc2, 0x0414a895,
+ 0x3a6cc3a1, 0x56fef170, 0x86c19155, 0xcf7b8a66,
+ 0x551b5e69, 0xb4a8623e, 0xa2bdfa35, 0xc4f068cc,
+ 0x573a6acd, 0x6355e936, 0x03602db9, 0x0edf13c1,
+ 0x2d0bb16d, 0x6980b83c, 0xfeb23763, 0x3dd8a911,
+ 0x01b6bc13, 0xf55579d7, 0xf55c2fa8, 0x19f4196e,
+ 0xe7db5476, 0x8d64a866, 0xc06e16ad, 0xb17fc515,
+ 0xc46feb3c, 0x8bc8a306, 0xad6799d9, 0x571a9133,
+ 0x992466dd, 0x92eb5dcd, 0xac118f50, 0x9fafb226,
+ 0xa1b9cef3, 0x3ab36189, 0x347a19b1, 0x62c73084,
+ 0xc27ded5c, 0x6c8bc58f, 0x1cdde421, 0xed1e47fb,
+ 0xcdcc715e, 0xb9c0ff99, 0x4b122f0f, 0xc4d25184,
+ 0xaf7a5e6c, 0x5bbf18bc, 0x8dd7c6e0, 0x5fb7e420,
+ 0x521f523f, 0x4ad9b8a2, 0xe9da1a6b, 0x97888c02,
+ 0x19d1e354, 0x5aba7d79, 0xa2cc7753, 0x8c2d9655,
+ 0x19829da1, 0x531590a7, 0x19c1c149, 0x3d537f1c,
+ 0x50779b69, 0xed71f2b7, 0x463c58fa, 0x52dc4418,
+ 0xc18c8c76, 0xc120d9f0, 0xafa80d4d, 0x3b74c473,
+ 0xd09410e9, 0x290e4211, 0xc3c8082b, 0x8f6b334a,
+ 0x3bf68ed2, 0xa843cc1b, 0x8d3c0ff3, 0x20e564a0,
+ 0xf8f55a4f, 0x2b40f8e7, 0xfea7f15f, 0xcf00fe21,
+ 0x8a6d37d6, 0xd0d506f1, 0xade00973, 0xefbbde36,
+ 0x84670fa8, 0xfa31ab9e, 0xaedab618, 0xc01f52f5,
+ 0x6558eb4f, 0x71b9e343, 0x4b8d77dd, 0x8cb93da6,
+ 0x740fd52d, 0x425412f8, 0xc5a63360, 0x10e53ad0,
+ 0x5a700f1c, 0x8324ed0b, 0xe53dc1ec, 0x1a366795,
+ 0x6d549d15, 0xc5ce46d7, 0xe17abe76, 0x5f48e0a0,
+ 0xd0f07c02, 0x941249b7, 0xe49ed6ba, 0x37a47f78,
+ 0xe1cfffbd, 0xb007ca84, 0xbb65f4da, 0xb59f35da,
+ 0x33d2aa44, 0x417452ac, 0xc0d674a7, 0x2d61a46a,
+ 0xdc63152a, 0x3e12b7aa, 0x6e615927, 0xa14fb118,
+ 0xa151758d, 0xba81687b, 0xe152f0b3, 0x764254ed,
+ 0x34c77271, 0x0a31acab, 0x54f94aec, 0xb9e994cd,
+ 0x574d9e81, 0x5b623730, 0xce8a21e8, 0x37917f0b,
+ 0xe8a9b5d6, 0x9697adf8, 0xf3d30431, 0x5dcac921,
+ 0x76b35d46, 0xaa430a36, 0xc2194022, 0x22bca65e,
+ 0xdaec70ba, 0xdfaea8cc, 0x777bae8b, 0x242924d5,
+ 0x1f098a5a, 0x4b396b81, 0x55de2522, 0x435c1cb8,
+ 0xaeb8fe1d, 0x9db3c697, 0x5b164f83, 0xe0c16376,
+ 0xa319224c, 0xd0203b35, 0x433ac0fe, 0x1466a19a,
+ 0x45f0b24f, 0x51fda998, 0xc0d52d71, 0xfa0896a8,
+ 0xf9e6053f, 0xa4b0d300, 0xd499cbcc, 0xb95e3d40,
+};
+
+
+/* Implementation of SOBER-128 by Tom St Denis.
+ * Based on s128fast.c reference code supplied by Greg Rose of QUALCOMM.
+ */
+
+/* don't change these... */
+#define N 17
+#define FOLD N /* how many iterations of folding to do */
+#define INITKONST 0x6996c53a /* value of KONST to use during key loading */
+#define KEYP 15 /* where to insert key words */
+#define FOLDP 4 /* where to insert non-linear feedback */
+
+#define B(x,i) ((unsigned char)(((x) >> (8*i)) & 0xFF))
+
+static ulong32 BYTE2WORD(unsigned char *b)
+{
+ ulong32 t;
+ LOAD32L(t, b);
+ return t;
+}
+
+#define WORD2BYTE(w, b) STORE32L(b, w)
+
+static void XORWORD(ulong32 w, unsigned char *b)
+{
+ ulong32 t;
+ LOAD32L(t, b);
+ t ^= w;
+ STORE32L(t, b);
+}
+
+/* give correct offset for the current position of the register,
+ * where logically R[0] is at position "zero".
+ */
+#define OFF(zero, i) (((zero)+(i)) % N)
+
+/* step the LFSR */
+/* After stepping, "zero" moves right one place */
+#define STEP(R,z) \
+ R[OFF(z,0)] = R[OFF(z,15)] ^ R[OFF(z,4)] ^ (R[OFF(z,0)] << 8) ^ Multab[(R[OFF(z,0)] >> 24) & 0xFF];
+
+static void cycle(ulong32 *R)
+{
+ ulong32 t;
+ int i;
+
+ STEP(R,0);
+ t = R[0];
+ for (i = 1; i < N; ++i) {
+ R[i-1] = R[i];
+ }
+ R[N-1] = t;
+}
+
+/* Return a non-linear function of some parts of the register.
+ */
+#define NLFUNC(c,z) \
+{ \
+ t = c->R[OFF(z,0)] + c->R[OFF(z,16)]; \
+ t ^= Sbox[(t >> 24) & 0xFF]; \
+ t = ROR(t, 8); \
+ t = ((t + c->R[OFF(z,1)]) ^ c->konst) + c->R[OFF(z,6)]; \
+ t ^= Sbox[(t >> 24) & 0xFF]; \
+ t = t + c->R[OFF(z,13)]; \
+}
+
+static ulong32 nltap(struct sober128_prng *c)
+{
+ ulong32 t;
+ NLFUNC(c, 0);
+ return t;
+}
+
+/* initialise to known state
+ */
+int corocrypto_sober128_start(struct sober128_prng *c)
+{
+ int i;
+
+ /* Register initialised to Fibonacci numbers */
+ c->R[0] = 1;
+ c->R[1] = 1;
+ for (i = 2; i < N; ++i) {
+ c->R[i] = c->R[i-1] + c->R[i-2];
+ }
+ c->konst = INITKONST;
+
+ /* next add_entropy will be the key */
+ c->flag = 1;
+ c->set = 0;
+
+ return 0;
+}
+
+/* Save the current register state
+ */
+static void s128_savestate(struct sober128_prng *c)
+{
+ int i;
+ for (i = 0; i < N; ++i) {
+ c->initR[i] = c->R[i];
+ }
+}
+
+/* initialise to previously saved register state
+ */
+static void s128_reloadstate(struct sober128_prng *c)
+{
+ int i;
+
+ for (i = 0; i < N; ++i) {
+ c->R[i] = c->initR[i];
+ }
+}
+
+/* Initialise "konst"
+ */
+static void s128_genkonst(struct sober128_prng *c)
+{
+ ulong32 newkonst;
+
+ do {
+ cycle(c->R);
+ newkonst = nltap(c);
+ } while ((newkonst & 0xFF000000) == 0);
+ c->konst = newkonst;
+}
+
+/* Load key material into the register
+ */
+#define ADDKEY(k) \
+ c->R[KEYP] += (k);
+
+#define XORNL(nl) \
+ c->R[FOLDP] ^= (nl);
+
+/* nonlinear diffusion of register for key */
+#define DROUND(z) STEP(c->R,z); NLFUNC(c,(z+1)); c->R[OFF((z+1),FOLDP)] ^= t;
+static void s128_diffuse(struct sober128_prng *c)
+{
+ ulong32 t;
+ /* relies on FOLD == N == 17! */
+ DROUND(0);
+ DROUND(1);
+ DROUND(2);
+ DROUND(3);
+ DROUND(4);
+ DROUND(5);
+ DROUND(6);
+ DROUND(7);
+ DROUND(8);
+ DROUND(9);
+ DROUND(10);
+ DROUND(11);
+ DROUND(12);
+ DROUND(13);
+ DROUND(14);
+ DROUND(15);
+ DROUND(16);
+}
+
+static int corocrypto_sober128_add_entropy(const unsigned char *buf, unsigned long len, struct sober128_prng *c)
+{
+ ulong32 i, k;
+
+
+ if (c->flag == 1) {
+ /* this is the first call to the add_entropy so this input is the key */
+ /* len must be multiple of 4 bytes */
+ assert ((len & 3) == 0);
+
+ for (i = 0; i < len; i += 4) {
+ k = BYTE2WORD((unsigned char *)&buf[i]);
+ ADDKEY(k);
+ cycle(c->R);
+ XORNL(nltap(c));
+ }
+
+ /* also fold in the length of the key */
+ ADDKEY(len);
+
+ /* now diffuse */
+ s128_diffuse(c);
+
+ s128_genkonst(c);
+ s128_savestate(c);
+ c->nbuf = 0;
+ c->flag = 0;
+ c->set = 1;
+ } else {
+ /* ok we are adding an IV then... */
+ s128_reloadstate(c);
+
+ /* len must be multiple of 4 bytes */
+ assert ((len & 3) == 0);
+
+ for (i = 0; i < len; i += 4) {
+ k = BYTE2WORD((unsigned char *)&buf[i]);
+ ADDKEY(k);
+ cycle(c->R);
+ XORNL(nltap(c));
+ }
+
+ /* also fold in the length of the key */
+ ADDKEY(len);
+
+ /* now diffuse */
+ s128_diffuse(c);
+ c->nbuf = 0;
+ }
+
+ return 0;
+}
+
+/* XOR pseudo-random bytes into buffer
+ */
+#define SROUND(z) STEP(c->R,z); NLFUNC(c,(z+1)); XORWORD(t, buf+(z*4));
+
+static unsigned long corocrypto_sober128_read(unsigned char *buf, unsigned long nbytes, struct sober128_prng *c)
+{
+ ulong32 t, tlen;
+
+ t = 0;
+ tlen = nbytes;
+
+ /* handle any previously buffered bytes */
+ while (c->nbuf != 0 && nbytes != 0) {
+ *buf++ ^= c->sbuf & 0xFF;
+ c->sbuf >>= 8;
+ c->nbuf -= 8;
+ --nbytes;
+ }
+
+#ifndef SMALL_CODE
+ /* do lots at a time, if there's enough to do */
+ while (nbytes >= N*4) {
+ SROUND(0);
+ SROUND(1);
+ SROUND(2);
+ SROUND(3);
+ SROUND(4);
+ SROUND(5);
+ SROUND(6);
+ SROUND(7);
+ SROUND(8);
+ SROUND(9);
+ SROUND(10);
+ SROUND(11);
+ SROUND(12);
+ SROUND(13);
+ SROUND(14);
+ SROUND(15);
+ SROUND(16);
+ buf += 4*N;
+ nbytes -= 4*N;
+ }
+#endif
+
+ /* do small or odd size buffers the slow way */
+ while (4 <= nbytes) {
+ cycle(c->R);
+ t = nltap(c);
+ XORWORD(t, buf);
+ buf += 4;
+ nbytes -= 4;
+ }
+
+ /* handle any trailing bytes */
+ if (nbytes != 0) {
+ cycle(c->R);
+ c->sbuf = nltap(c);
+ c->nbuf = 32;
+ while (c->nbuf != 0 && nbytes != 0) {
+ *buf++ ^= c->sbuf & 0xFF;
+ c->sbuf >>= 8;
+ c->nbuf -= 8;
+ --nbytes;
+ }
+ }
+
+ return tlen;
+}
+
+/* packet-corosync-totemnet.c ends here */
Index: wireshark-1.4.1/epan/dissectors/packet-corosync-totemsrp.c
===================================================================
--- /dev/null
+++ wireshark-1.4.1/epan/dissectors/packet-corosync-totemsrp.c
@@ -0,0 +1,1379 @@
+/* packet-corosync-totemsrp.c
+ * Dissectors for totem single ring protocol implementated in corosync cluster engine
+ * Copyright 2007 2009 2010 Masatake YAMATO <yamato@redhat.com>
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * $Id$
+ *
+ * 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
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Fields description are taken from
+
+ 1. "The Totem Single-Ring Ordering and Membership Protocol"
+ Y.AMIR, L.E.MOSER, P.M.MELLIAR-SMITH, D.A.AGARWAL, P.CIARFELLA */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <epan/packet.h>
+
+#include "packet-corosync-totemsrp.h"
+
+
+/* Forward declaration we need below */
+void proto_reg_handoff_corosync_totemsrp(void);
+
+/* Initialize the protocol and registered fields */
+static int proto_corosync_totemsrp = -1;
+
+static heur_dissector_list_t heur_subdissector_list;
+
+/* fields for struct message_header */
+static int hf_corosync_totemsrp_message_header_type = -1;
+static int hf_corosync_totemsrp_message_header_encapsulated = -1;
+static int hf_corosync_totemsrp_message_header_endian_detector = -1;
+static int hf_corosync_totemsrp_message_header_nodeid = -1;
+
+/* fields for struct orf_token */
+static int hf_corosync_totemsrp_orf_token = -1;
+static int hf_corosync_totemsrp_orf_token_seq = -1;
+static int hf_corosync_totemsrp_orf_token_token_seq = -1;
+static int hf_corosync_totemsrp_orf_token_aru = -1;
+static int hf_corosync_totemsrp_orf_token_aru_addr = -1;
+static int hf_corosync_totemsrp_orf_token_backlog = -1;
+static int hf_corosync_totemsrp_orf_token_fcc = -1;
+static int hf_corosync_totemsrp_orf_token_retrnas_flg = -1;
+static int hf_corosync_totemsrp_orf_token_rtr_list_entries = -1;
+
+/* field for struct memb_ring_id */
+static int hf_corosync_totemsrp_memb_ring_id = -1;
+static int hf_corosync_totemsrp_memb_ring_id_seq = -1;
+
+/* field for struct totem_ip_address */
+static int hf_corosync_totemsrp_ip_address = -1;
+static int hf_corosync_totemsrp_ip_address_nodeid = -1;
+static int hf_corosync_totemsrp_ip_address_family = -1;
+static int hf_corosync_totemsrp_ip_address_addr = -1;
+static int hf_corosync_totemsrp_ip_address_addr4 = -1;
+static int hf_corosync_totemsrp_ip_address_addr4_padding = -1;
+static int hf_corosync_totemsrp_ip_address_addr6 = -1;
+
+/* field of struct mcast */
+static int hf_corosync_totemsrp_mcast = -1;
+static int hf_corosync_totemsrp_mcast_seq = -1;
+static int hf_corosync_totemsrp_mcast_this_seqno = -1;
+static int hf_corosync_totemsrp_mcast_node_id = -1;
+static int hf_corosync_totemsrp_mcast_system_from = -1;
+static int hf_corosync_totemsrp_mcast_guarantee = -1;
+
+/* field of struct memb_merge_detect */
+static int hf_corosync_totemsrp_memb_merge_detect = -1;
+
+/* field of struct struct srp_addr */
+static int hf_corosync_totemsrp_srp_addr = -1;
+
+/* field of struct rtr_item */
+static int hf_corosync_totemsrp_rtr_item = -1;
+static int hf_corosync_totemsrp_rtr_item_seq = -1;
+
+/* field of struct memb_join */
+static int hf_corosync_totemsrp_memb_join = -1;
+static int hf_corosync_totemsrp_memb_join_proc_list_entries = -1;
+static int hf_corosync_totemsrp_memb_join_failed_list_entries = -1;
+static int hf_corosync_totemsrp_memb_join_ring_seq = -1;
+
+/* field of struct memb_commit_token */
+static int hf_corosync_totemsrp_memb_commit_token = -1;
+static int hf_corosync_totemsrp_memb_commit_token_token_seq = -1;
+static int hf_corosync_totemsrp_memb_commit_token_retrans_flg = -1;
+static int hf_corosync_totemsrp_memb_commit_token_memb_index = -1;
+static int hf_corosync_totemsrp_memb_commit_token_addr_entries = -1;
+
+/* field of struct memb_commit_token_memb_entry */
+static int hf_corosync_totemsrp_memb_commit_token_memb_entry = -1;
+static int hf_corosync_totemsrp_memb_commit_token_memb_entry_aru = -1;
+static int hf_corosync_totemsrp_memb_commit_token_memb_entry_high_delivered = -1;
+static int hf_corosync_totemsrp_memb_commit_token_memb_entry_received_flg = -1;
+
+/* field of struct token_hold_cancel */
+static int hf_corosync_totemsrp_token_hold_cancel = -1;
+
+/* Initialize the subtree pointers */
+static gint ett_corosync_totemsrp = -1;
+static gint ett_corosync_totemsrp_orf_token = -1;
+static gint ett_corosync_totemsrp_memb_ring_id = -1;
+static gint ett_corosync_totemsrp_ip_address = -1;
+static gint ett_corosync_totemsrp_mcast = -1;
+static gint ett_corosync_totemsrp_memb_merge_detect = -1;
+static gint ett_corosync_totemsrp_srp_addr = -1;
+static gint ett_corosync_totemsrp_rtr_item = -1;
+static gint ett_corosync_totemsrp_memb_join = -1;
+static gint ett_corosync_totemsrp_memb_commit_token = -1;
+static gint ett_corosync_totemsrp_memb_commit_token_memb_entry = -1;
+static gint ett_corosync_totemsrp_token_hold_cancel = -1;
+static gint ett_corosync_totemsrp_memb_join_proc_list = -1;
+static gint ett_corosync_totemsrp_memb_join_failed_list = -1;
+
+
+/*
+ * Value strings
+ */
+#define COROSYNC_TOTEMSRP_MESSAGE_TYPE_ORF_TOKEN 0
+#define COROSYNC_TOTEMSRP_MESSAGE_TYPE_MCAST 1
+#define COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_MERGE_DETECT 2
+#define COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_JOIN 3
+#define COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_COMMIT_TOKEN 4
+#define COROSYNC_TOTEMSRP_MESSAGE_TYPE_TOKEN_HOLD_CANCEL 5
+
+static const value_string corosync_totemsrp_message_header_type[] = {
+ { COROSYNC_TOTEMSRP_MESSAGE_TYPE_ORF_TOKEN, "orf" },
+ { COROSYNC_TOTEMSRP_MESSAGE_TYPE_MCAST, "multicast message" },
+ { COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_MERGE_DETECT, "merge rings" },
+ { COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_JOIN, "join message" },
+ { COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_COMMIT_TOKEN, "commit token" },
+ { COROSYNC_TOTEMSRP_MESSAGE_TYPE_TOKEN_HOLD_CANCEL, "cancel" },
+ { 0, NULL }
+};
+
+#define COROSYNC_TOTEMSRP_MESSAGE_ENCAPSULATED 1
+#define COROSYNC_TOTEMSRP_MESSAGE_NOT_ENCAPSULATED 2
+
+static const value_string corosync_totemsrp_message_header_encapsulated[] = {
+ { 0, "not mcast message" },
+ { COROSYNC_TOTEMSRP_MESSAGE_ENCAPSULATED, "encapsulated" },
+ { COROSYNC_TOTEMSRP_MESSAGE_NOT_ENCAPSULATED, "not encapsulated" },
+ { 0, NULL }
+};
+
+
+static const value_string corosync_totemsrp_ip_address_family[] = {
+ { AF_INET, "AF_INET" },
+ { AF_INET6, "AF_INET6" },
+ { 0, NULL }
+};
+
+static guint16 corosync_totemsrp_get_guint16(tvbuff_t* tvb, gint offset, gboolean little_endian);
+
+static guint32 corosync_totemsrp_get_guint32(tvbuff_t* tvb, gint offset, gboolean little_endian);
+static gint32 corosync_totemsrp_get_gint32 (tvbuff_t* tvb, gint offset, gboolean little_endian);
+
+
+#define COROSYNC_TOTEMSRP_ENDIAN_LOCAL {0xff, 0x22}
+
+
+#define COROSYNC_TOTEMSRP_SRP_ADDR_INTERFACE_MAX 2
+
+struct corosync_totemsrp_info {
+ void* original_private_data;
+ gboolean little_endian;
+ proto_tree* master_tree;
+};
+
+static int
+dissect_corosync_totemsrp_ip_address(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian,
+ gboolean print_interface,
+ guint interface,
+ guint *nodeid)
+{
+ int original_offset;
+ proto_tree *tree;
+ proto_item *item;
+
+ guint16 family;
+ gint hf;
+ gint len;
+
+ if ((length - offset) < corosync_totemsrp_ip_address_length)
+ return 0;
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_ip_address, tvb, offset,
+ corosync_totemsrp_ip_address_length, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_ip_address);
+
+ proto_item_append_text(item, " (");
+ if (print_interface)
+ proto_item_append_text(item, "interface: %u; ", interface);
+
+
+ offset += 0;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_ip_address_nodeid,
+ tvb, offset, 4, little_endian);
+ {
+ guint nid;
+
+ nid = corosync_totemsrp_get_guint32(tvb, offset, little_endian);
+ proto_item_append_text(item, "node: %u", nid);
+ if (nodeid)
+ *nodeid = nid;
+ }
+ proto_item_append_text(item, ")");
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_ip_address_family,
+ tvb, offset, 2, little_endian);
+ family = corosync_totemsrp_get_guint16(tvb, offset, little_endian);
+
+ offset += 2;
+ switch (family)
+ {
+ case AF_INET:
+ hf = hf_corosync_totemsrp_ip_address_addr4;
+ len = 4;
+ break;
+ case AF_INET6:
+ hf = hf_corosync_totemsrp_ip_address_addr6;
+ len = COROSYNC_TOTEMSRP_IP_ADDRLEN;
+ break;
+ default:
+ hf = hf_corosync_totemsrp_ip_address_addr;
+ len = COROSYNC_TOTEMSRP_IP_ADDRLEN;
+ break;
+ }
+ proto_tree_add_item(tree,
+ hf,
+ tvb, offset, len, FALSE);
+ offset += len;
+
+ if (len != COROSYNC_TOTEMSRP_IP_ADDRLEN) {
+ gint padding_len;
+
+ padding_len = (COROSYNC_TOTEMSRP_IP_ADDRLEN - len);
+ proto_tree_add_item (tree,
+ hf_corosync_totemsrp_ip_address_addr4_padding,
+ tvb, offset, padding_len, FALSE);
+ offset += padding_len;
+ }
+
+
+ return offset - original_offset;
+
+ pinfo = pinfo;
+}
+
+static int
+dissect_corosync_totemsrp_memb_ring_id(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+ guint nodeid;
+
+ if ((length - offset) < corosync_totemsrp_memb_ring_id_length) {
+ fprintf(stderr, "We have: %d, expected: %lu\n",
+ (length - offset),
+ corosync_totemsrp_memb_ring_id_length);
+ return 0;
+ }
+ original_offset = offset;
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_memb_ring_id, tvb, offset,
+ corosync_totemsrp_memb_ring_id_length, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_memb_ring_id);
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_ip_address(tvb, pinfo, tree,
+ length, offset,
+ little_endian,
+ FALSE, -1,
+ &nodeid);
+
+ if (sub_length == 0)
+ goto out;
+ proto_item_append_text(item, " (node: %u)", nodeid);
+
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_ring_id_seq,
+ tvb, offset, 8, little_endian);
+
+ offset += 8;
+out:
+ return offset - original_offset;
+}
+
+static int
+dissect_corosync_totemsrp_rtr_list(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+#define corosync_totemsrp_rtr_list_length (corosync_totemsrp_memb_ring_id_length + 4)
+ if ((length - offset) < corosync_totemsrp_rtr_list_length)
+ return 0;
+ original_offset = offset;
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_rtr_item, tvb, offset,
+ corosync_totemsrp_rtr_list_length, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_rtr_item);
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_rtr_item_seq,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+out:
+ return (offset - original_offset);
+}
+
+static int
+dissect_corosync_totemsrp_orf_token(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+ gint32 rtr_list_entries;
+ gint32 i;
+
+#define corosync_totemsrp_orf_token_length ( 4 \
+ + 4 \
+ + 4 \
+ + 4 \
+ + corosync_totemsrp_memb_ring_id_length \
+ + 4 \
+ + 4 \
+ + 4 \
+ + 4)
+ if ((length - offset) < corosync_totemsrp_orf_token_length)
+ return 0;
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_orf_token, tvb, offset,
+ -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_orf_token);
+
+ offset += 0;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_seq,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_token_seq,
+ tvb, offset, 4, little_endian);
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_aru,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_aru_addr,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_backlog,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_fcc,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_retrnas_flg,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_orf_token_rtr_list_entries,
+ tvb, offset, 4, little_endian);
+
+
+
+ rtr_list_entries = corosync_totemsrp_get_gint32(tvb, offset, little_endian);
+ if ((length - offset) < (rtr_list_entries * corosync_totemsrp_rtr_list_length) )
+ goto out;
+
+ offset += 4;
+ for (i = 0; i < rtr_list_entries; i++) {
+ sub_length = dissect_corosync_totemsrp_rtr_list(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+ offset += sub_length;
+ }
+out:
+ return offset - original_offset;
+
+ pinfo = pinfo;
+}
+
+static int
+dissect_corosync_totemsrp_srp_addr(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ int hf,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+#define corosync_totemsrp_srp_addr_length (corosync_totemsrp_ip_address_length * COROSYNC_TOTEMSRP_SRP_ADDR_INTERFACE_MAX)
+ if ((length - offset) < corosync_totemsrp_srp_addr_length)
+ return 0;
+ original_offset = offset;
+
+ item = proto_tree_add_item(parent_tree, hf? hf: hf_corosync_totemsrp_srp_addr, tvb, offset,
+ corosync_totemsrp_srp_addr_length, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_srp_addr);
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_ip_address(tvb, pinfo, tree,
+ length, offset,
+ little_endian,
+ TRUE, 0,
+ NULL);
+ if (sub_length == 0)
+ goto out;
+
+
+ offset += sub_length;
+ sub_length = dissect_corosync_totemsrp_ip_address(tvb, pinfo, tree,
+ length, offset,
+ little_endian,
+ TRUE, 1,
+ NULL);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+out:
+ return (offset - original_offset);
+}
+
+static int
+dissect_corosync_totemsrp_mcast (tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+
+#define corosync_totemsrp_mcast_length (corosync_totemsrp_srp_addr_length \
+ + 4 \
+ + 4 \
+ + corosync_totemsrp_memb_ring_id_length \
+ + 4 \
+ + 4)
+ if ((length - offset) < corosync_totemsrp_mcast_length) {
+ return 0;
+ }
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_mcast, tvb, offset,
+ -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_mcast);
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_srp_addr(tvb, pinfo, tree,
+ length, offset,
+ hf_corosync_totemsrp_mcast_system_from,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_mcast_seq,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_mcast_this_seqno,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_mcast_node_id,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_mcast_guarantee,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+
+ {
+ gint len, reported_len;
+ tvbuff_t *next_tvb;
+ struct corosync_totemsrp_info* info;
+
+ len = tvb_length_remaining(tvb, offset);
+ reported_len = tvb_reported_length_remaining(tvb, offset);
+
+ next_tvb = tvb_new_subset(tvb, offset, len, reported_len);
+
+ info = (struct corosync_totemsrp_info*)pinfo->private_data;
+ if (dissector_try_heuristic(heur_subdissector_list,
+ next_tvb,
+ pinfo,
+ info->master_tree))
+ offset = length ;
+ }
+
+out:
+ return (offset - original_offset);
+}
+
+
+static int
+dissect_corosync_totemsrp_memb_merge_detect(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+#define corosync_totemsrp_memb_merge_detect_length (corosync_totemsrp_srp_addr_length + corosync_totemsrp_memb_ring_id_length)
+ if ((length - offset) < corosync_totemsrp_memb_merge_detect_length) {
+ return 0;
+ }
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_memb_merge_detect, tvb, offset,
+ -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_memb_merge_detect);
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_srp_addr(tvb, pinfo, tree,
+ length, offset,
+ 0,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+out:
+ return (offset - original_offset);
+}
+
+static int
+dissect_corosync_totemsrp_memb_join(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+ guint32 proc_list_entries;
+ proto_tree *proc_tree;
+ proto_item *proc_item;
+
+ guint32 failed_list_entries;
+ proto_tree *failed_tree;
+ proto_item *failed_item;
+
+ guint i;
+
+
+#define corosync_totemsrp_memb_join_length ( corosync_totemsrp_srp_addr_length \
+ + 4 \
+ + 4 \
+ + 8)
+ if ((length - offset) < corosync_totemsrp_memb_join_length)
+ return 0;
+
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_memb_join, tvb, offset,
+ -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_memb_join);
+
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_srp_addr(tvb, pinfo, tree,
+ length, offset,
+ 0,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proc_item = proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_join_proc_list_entries,
+ tvb, offset, 4, little_endian);
+ proc_list_entries = corosync_totemsrp_get_guint32(tvb, offset, little_endian);
+
+ offset += 4;
+ failed_item = proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_join_failed_list_entries,
+ tvb, offset, 4, little_endian);
+ failed_list_entries = corosync_totemsrp_get_guint32(tvb, offset, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_join_ring_seq,
+ tvb, offset, 8, little_endian);
+
+ offset += 8;
+ proc_tree = proto_item_add_subtree(proc_item, ett_corosync_totemsrp_memb_join_proc_list);
+ for (i = 0; i < proc_list_entries; i++) {
+ sub_length = dissect_corosync_totemsrp_srp_addr(tvb, pinfo, proc_tree,
+ length, offset,
+ 0,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+ offset += sub_length;
+ }
+
+ failed_tree = proto_item_add_subtree(failed_item, ett_corosync_totemsrp_memb_join_failed_list);
+ for (i = 0; i < failed_list_entries; i++) {
+ sub_length = dissect_corosync_totemsrp_srp_addr(tvb, pinfo, failed_tree,
+ length, offset,
+ 0,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+ offset += sub_length;
+ }
+
+out:
+ return (offset - original_offset);
+}
+
+static int
+dissect_corosync_totemsrp_memb_commit_token_memb_entry(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+
+#define corosync_totemsrp_memb_commit_token_memb_entry_length ( corosync_totemsrp_memb_ring_id_length \
+ + 4 \
+ + 4 \
+ + 4 )
+ if ((length - offset) < corosync_totemsrp_memb_commit_token_memb_entry_length)
+ return 0;
+ original_offset = offset;
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_memb_commit_token_memb_entry,
+ tvb, offset,
+ corosync_totemsrp_memb_commit_token_memb_entry_length, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_memb_commit_token_memb_entry);
+
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_memb_entry_aru,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_memb_entry_high_delivered,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_memb_entry_received_flg,
+ tvb, offset, 4, little_endian);
+
+
+ offset += 4;
+out:
+ return (offset - original_offset);
+}
+
+static int
+dissect_corosync_totemsrp_memb_commit_token(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+ gint32 addr_entries;
+ gint i;
+
+#define corosync_totemsrp_memb_commit_token_length ( 4 \
+ + corosync_totemsrp_memb_ring_id_length \
+ + 4 \
+ + 4 \
+ + 4)
+ if ((length - offset) < corosync_totemsrp_memb_commit_token_length)
+ return 0;
+
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_memb_commit_token,
+ tvb, offset, -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_memb_commit_token);
+
+
+ offset += 0;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_token_seq,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_retrans_flg,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_memb_index,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_memb_commit_token_addr_entries,
+ tvb, offset, 4, little_endian);
+ addr_entries = corosync_totemsrp_get_gint32(tvb, offset, little_endian);
+
+
+ offset += 4;
+ if ((length - offset) < ((corosync_totemsrp_srp_addr_length
+ * addr_entries)
+ + (corosync_totemsrp_memb_commit_token_memb_entry_length
+ * addr_entries)))
+ goto out;
+
+ for (i = 0; i < addr_entries; i++) {
+ sub_length = dissect_corosync_totemsrp_srp_addr(tvb, pinfo, tree,
+ length, offset,
+ 0,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+ offset += sub_length;
+ }
+
+ for (i = 0; i < addr_entries; i++) {
+ sub_length = dissect_corosync_totemsrp_memb_commit_token_memb_entry(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+ offset += sub_length;
+ }
+
+out:
+ return (offset - original_offset);
+}
+
+static int
+dissect_corosync_totemsrp_token_hold_cancel(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree,
+ guint length, int offset,
+ gboolean little_endian)
+{
+ int original_offset;
+ int sub_length;
+ proto_tree *tree;
+ proto_item *item;
+
+#define corosync_totemsrp_token_hold_cancel_length ( corosync_totemsrp_memb_ring_id_length )
+ if ((length - offset) < corosync_totemsrp_token_hold_cancel_length)
+ return 0;
+
+ original_offset = offset;
+
+
+ item = proto_tree_add_item(parent_tree, hf_corosync_totemsrp_token_hold_cancel, tvb, offset,
+ -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp_token_hold_cancel);
+
+
+ offset += 0;
+ sub_length = dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, tree,
+ length, offset,
+ little_endian);
+ if (sub_length == 0)
+ goto out;
+
+ offset += sub_length;
+out:
+ return (offset - original_offset);
+}
+
+int
+dissect_corosync_totemsrp(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *parent_tree)
+{
+ proto_item *item;
+ proto_tree *tree;
+ guint length;
+ int offset;
+
+
+ guint8 message_header__type;
+ guint8 message_header__encapsulated;
+
+ union EndianDetector {
+ guint16 f;
+ guint8 b[2];
+ } message_header__endian_detector;
+ guint8 endian_expect[2] = COROSYNC_TOTEMSRP_ENDIAN_LOCAL;
+
+ gboolean little_endian;
+
+ struct corosync_totemsrp_info info;
+
+
+
+ /* Check that there's enough data */
+ length = tvb_length(tvb);
+ if (length < 1 + 1 + 2 + 4)
+ return 0;
+
+ /* message header */
+ message_header__type = tvb_get_guint8(tvb, 0);
+ if (message_header__type > 5)
+ return 0;
+
+ message_header__encapsulated = tvb_get_guint8(tvb, 1);
+ if (
+ /*
+ There is a version of corosync which encapsulated is not initialized.
+ The packet sent from the version of corosync, this dissector could not
+ recognize it as corosync packet. So I put special condition here:
+ don't check encapsulated field if the packet type is MESSAGE_TYPE_TOKEN_HOLD_CANCEL.
+
+ ------------------------------------------------------------------------
+ r2660 | sdake | 2010-02-19 05:08:39 +0900 (Fri, 19 Feb 2010) | 3 lines
+
+ Patch to set unset value in token hold cancel structure as to not crash
+ wireshark.
+
+ ------------------------------------------------------------------------
+ Index: exec/totemsrp.c
+ ===================================================================
+ --- exec/totemsrp.c (revision 2659)
+ +++ exec/totemsrp.c (revision 2660)
+ @@ -2627,6 +2627,7 @@
+
+ token_hold_cancel.header.type = MESSAGE_TYPE_TOKEN_HOLD_CANCEL;
+ token_hold_cancel.header.endian_detector = ENDIAN_LOCAL;
+ + token_hold_cancel.header.encapsulated = 0;
+ token_hold_cancel.header.nodeid = instance->my_id.addr[0].nodeid;
+ memcpy (&token_hold_cancel.ring_id, &instance->my_ring_id,
+ sizeof (struct memb_ring_id));
+ */
+ (message_header__type != COROSYNC_TOTEMSRP_MESSAGE_TYPE_TOKEN_HOLD_CANCEL)
+ && message_header__encapsulated > 2)
+ return 0;
+
+ /* message_header -- byte order checking */
+ tvb_memcpy(tvb, &message_header__endian_detector.f, 2, 2);
+
+ if ((message_header__endian_detector.b[0] == endian_expect[1])
+ && (message_header__endian_detector.b[1] == endian_expect[0]))
+ little_endian = TRUE;
+ else if ((message_header__endian_detector.b[0] == endian_expect[0])
+ && (message_header__endian_detector.b[1] == endian_expect[1]))
+ little_endian = FALSE;
+ else
+ return 0;
+
+ info.little_endian = little_endian;
+ info.original_private_data = pinfo->private_data;
+ info.master_tree = parent_tree;
+ pinfo->private_data = &info;
+
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "COROSYNC/TOTEMSRP");
+
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_clear(pinfo->cinfo, COL_INFO);
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_set_str(pinfo->cinfo, COL_INFO,
+ "COROSYNC/TOTEMSRP");
+
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_set_str(pinfo->cinfo, COL_INFO,
+ val_to_str(message_header__type,
+ corosync_totemsrp_message_header_type,
+ "packet-corosync-totemsrp.c internal bug"));
+
+ if (parent_tree) {
+ offset = 0;
+
+ item = proto_tree_add_item(parent_tree, proto_corosync_totemsrp, tvb, offset,
+ -1, little_endian);
+ tree = proto_item_add_subtree(item, ett_corosync_totemsrp);
+
+ offset += 0;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_message_header_type,
+ tvb, offset, 1, little_endian);
+ offset += 1;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_message_header_encapsulated,
+ tvb, offset, 1, little_endian);
+
+ offset += 1;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_message_header_endian_detector,
+ tvb, offset, 2, little_endian);
+
+ offset += 2;
+ proto_tree_add_item(tree,
+ hf_corosync_totemsrp_message_header_nodeid,
+ tvb, offset, 4, little_endian);
+
+ offset += 4;
+
+ switch (message_header__type) {
+ case COROSYNC_TOTEMSRP_MESSAGE_TYPE_ORF_TOKEN:
+ dissect_corosync_totemsrp_orf_token(tvb, pinfo, tree, length, offset,
+ little_endian);
+ break;
+ case COROSYNC_TOTEMSRP_MESSAGE_TYPE_MCAST:
+ dissect_corosync_totemsrp_mcast(tvb, pinfo, tree, length, offset,
+ little_endian);
+ break;
+ case COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_MERGE_DETECT:
+ dissect_corosync_totemsrp_memb_merge_detect(tvb, pinfo, tree, length, offset,
+ little_endian);
+ break;
+ case COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_JOIN:
+ dissect_corosync_totemsrp_memb_join(tvb, pinfo, tree, length, offset,
+ little_endian);
+ break;
+ case COROSYNC_TOTEMSRP_MESSAGE_TYPE_MEMB_COMMIT_TOKEN:
+ dissect_corosync_totemsrp_memb_commit_token(tvb, pinfo, tree, length, offset,
+ little_endian);
+ break;
+ case COROSYNC_TOTEMSRP_MESSAGE_TYPE_TOKEN_HOLD_CANCEL:
+ dissect_corosync_totemsrp_token_hold_cancel(tvb, pinfo, tree, length, offset,
+ little_endian);
+ break;
+ default:
+ break;
+ }
+ }
+
+ pinfo->private_data = info.original_private_data;
+ return tvb_length(tvb);
+}
+
+void
+proto_register_corosync_totemsrp(void)
+{
+ static hf_register_info hf[] = {
+ /* message_header */
+ { &hf_corosync_totemsrp_message_header_type,
+ { "Type", "corosync_totemsrp.message_header.type",
+ FT_INT8, BASE_DEC, VALS(corosync_totemsrp_message_header_type), 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_message_header_encapsulated,
+ { "Encapsulated", "corosync_totemsrp.message_header.encapsulated",
+ FT_INT8, BASE_DEC, VALS(corosync_totemsrp_message_header_encapsulated), 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_message_header_endian_detector,
+ { "Endian detector", "corosync_totemsrp.message_header.endian_detector",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_message_header_nodeid,
+ { "Node ID", "corosync_totemsrp.message_header.nodeid",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* orf_token */
+ { &hf_corosync_totemsrp_orf_token,
+ { "Ordering, Reliability, Flow (ORF) control Token", "corosync_totemsrp.orf_token",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_orf_token_seq,
+ { "Sequence number allowing recognition of redundant copies of the token", "corosync_totemsrp.orf_token.seq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_orf_token_token_seq,
+ { "The largest sequence number", "corosync_totemsrp.orf_token.seq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "The largest sequence number of any message "
+ "that has been broadcast on the ring"
+ "[1]" ,
+ HFILL }},
+ { &hf_corosync_totemsrp_orf_token_aru,
+ { "Sequnce number all received up to", "corosync_totemsrp.orf_token.aru",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_orf_token_aru_addr,
+ { "ID of node setting ARU", "corosync_totemsrp.orf_token.aru_addr",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_orf_token_backlog,
+ { "Backlog", "corosync_totemsrp.orf_token.backlog",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "The sum of the number of new message waiting to be transmitted by each processor on the ring "
+ "at the time at which that processor forwarded the token during the previous rotation"
+ "[1]",
+ HFILL }},
+ { &hf_corosync_totemsrp_orf_token_fcc,
+ { "FCC",
+ "corosync_totemsrp.orf_token.fcc",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "A count of the number of messages broadcast by all processors "
+ "during the previous rotation of the token"
+ "[1]",
+ HFILL }},
+ { &hf_corosync_totemsrp_orf_token_retrnas_flg,
+ { "Retransmission flag", "corosync_totemsrp.orf_token.retrans_flg",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_orf_token_rtr_list_entries,
+ { "The number of retransmission list entries", "corosync_totemsrp.orf_token.rtr_list_entries",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* memb_ring_id */
+ { &hf_corosync_totemsrp_memb_ring_id,
+ { "Member ring id", "corosync_totemsrp.memb_ring_id",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_memb_ring_id_seq,
+ { "Squence in member ring id", "corosync_totemsrp.memb_ring_id.seq",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* totem_ip_address */
+ { &hf_corosync_totemsrp_ip_address,
+ { "Node IP address", "corosync_totemsrp.ip_address",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_ip_address_nodeid,
+ { "Node ID", "corosync_totemsrp.ip_address.nodeid",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_ip_address_family,
+ { "Address family", "corosync_totemsrp.ip_address.family",
+ FT_UINT16, BASE_DEC, VALS(corosync_totemsrp_ip_address_family), 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_ip_address_addr,
+ { "Address", "corosync_totemsrp.ip_address.addr",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_ip_address_addr4,
+ { "Address", "corosync_totemsrp.ip_address.addr4",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_ip_address_addr4_padding,
+ { "Address padding", "corosync_totemsrp.ip_address.addr4_padding",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_ip_address_addr6,
+ { "Address", "corosync_totemsrp.ip_address.addr6",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* mcast */
+ { &hf_corosync_totemsrp_mcast,
+ { "ring ordered multicast message", "corosync_totemsrp.mcast",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_mcast_seq,
+ {"Multicast sequence number", "corosync_totemsrp.mcast.seq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_mcast_this_seqno,
+ {"This Sequence number", "corosync_totemsrp.mcast.this_seqno",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_mcast_node_id,
+ {"Node id(unused?)", "corosync_totemsrp.mcast.node_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_mcast_system_from,
+ {"System from address", "corosync_totemsrp.mcast.system_from",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_corosync_totemsrp_mcast_guarantee,
+ {"Guarantee", "corosync_totemsrp.mcast.guarantee",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* memb_merge_detect */
+ { &hf_corosync_totemsrp_memb_merge_detect,
+ { "Merge rings if there are available rings", "corosync_totemsrp.memb_merge_detect",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* srp_addr */
+ { &hf_corosync_totemsrp_srp_addr,
+ {"Single Ring Protocol Address", "corosync_totemsrp.srp_addr",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* rtr_item */
+ { &hf_corosync_totemsrp_rtr_item,
+ {"Retransmission Item", "corosync_totemsrp.rtr_item",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_corosync_totemsrp_rtr_item_seq,
+ {"Sequence of Retransmission Item", "corosync_totemsrp.rtr_item.seq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ /* memb_join */
+ { &hf_corosync_totemsrp_memb_join,
+ {"Membership join message", "corosync_totemsrp.memb_join",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_join_proc_list_entries,
+ {"The number of processor list entries ", "corosync_totemsrp.memb_join.proc_list_entries",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_join_failed_list_entries,
+ {"The number of failed list entries ", "corosync_totemsrp.memb_join.failed_list_entries",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_join_ring_seq,
+ {"Ring sequence number", "corosync_totemsrp.memb_join.ring_seq",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+
+ /* memb_commit_token */
+ { &hf_corosync_totemsrp_memb_commit_token,
+ {"Membership commit token", "corosync_totemsrp.memb_commit_token",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_token_seq,
+ {"Token sequence", "corosync_totemsrp.memb_commit_token.token_seq",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_retrans_flg,
+ {"Retransmission flag", "corosync_totemsrp.memb_commit_token.retrans_flg",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_memb_index,
+ {"Member index", "corosync_totemsrp.memb_commit_token.memb_index",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_addr_entries,
+ {"The number of address entries", "corosync_totemsrp.memb_commit_token.addr_entries",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+
+ /* memb_commit_token_memb_entry */
+ { &hf_corosync_totemsrp_memb_commit_token_memb_entry,
+ { "Membership entry", "corosync_totemsrp.memb_commit_token_memb_entry",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_memb_entry_aru,
+ {"Sequnce number all received up to", "corosync_totemsrp.memb_commit_token_memb_entry.aru",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_memb_entry_high_delivered,
+ {"High delivered", "corosync_totemsrp.memb_commit_token_memb_entry.high_delivered",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ { &hf_corosync_totemsrp_memb_commit_token_memb_entry_received_flg,
+ {"Received flag", "corosync_totemsrp.memb_commit_token_memb_entry.received_flg",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+
+ /* token_hold_canel */
+ { &hf_corosync_totemsrp_token_hold_cancel,
+ {"Hold cancel token", "corosync_totemsrp.token_hold_canel",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}},
+ };
+
+ static gint *ett[] = {
+ &ett_corosync_totemsrp,
+ &ett_corosync_totemsrp_orf_token,
+ &ett_corosync_totemsrp_memb_ring_id,
+ &ett_corosync_totemsrp_ip_address,
+ &ett_corosync_totemsrp_mcast,
+ &ett_corosync_totemsrp_memb_merge_detect,
+ &ett_corosync_totemsrp_srp_addr,
+ &ett_corosync_totemsrp_rtr_item,
+ &ett_corosync_totemsrp_memb_join,
+ &ett_corosync_totemsrp_memb_commit_token,
+ &ett_corosync_totemsrp_memb_commit_token_memb_entry,
+ &ett_corosync_totemsrp_token_hold_cancel,
+ &ett_corosync_totemsrp_memb_join_proc_list,
+ &ett_corosync_totemsrp_memb_join_failed_list
+
+ };
+
+ proto_corosync_totemsrp = proto_register_protocol("Totem Single Ring Protocol implemented in Corosync Cluster Engine",
+ "COROSYNC/TOTEMSRP", "corosync_totemsrp");
+ proto_register_field_array(proto_corosync_totemsrp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ register_heur_dissector_list("corosync_totemsrp.mcast", &heur_subdissector_list);
+}
+
+
+/* Some code copyed from packet-dlm3.c. */
+void
+proto_reg_handoff_corosync_totemsrp(void)
+{
+ /* Nothing to be done.
+ dissect_corosync_totemsrp is directly called from corosync_totemnet dissector. */
+}
+
+
+
+static guint16
+corosync_totemsrp_get_guint16(tvbuff_t* tvb, gint offset, gboolean little_endian)
+{
+ return (little_endian? tvb_get_letohs: tvb_get_ntohs)(tvb, offset);
+}
+
+
+static guint32
+corosync_totemsrp_get_guint32(tvbuff_t* tvb, gint offset, gboolean little_endian)
+{
+ return (little_endian? tvb_get_letohl: tvb_get_ntohl)(tvb, offset);
+}
+
+static gint32
+corosync_totemsrp_get_gint32 (tvbuff_t* tvb, gint offset, gboolean little_endian)
+{
+ union {
+ guint32 u;
+ gint32 i;
+ } v;
+
+ v.u = corosync_totemsrp_get_guint32(tvb, offset, little_endian);
+ return v.i;
+}
+
+
+
+
+gboolean
+corosync_totemsrp_is_little_endian(packet_info *pinfo)
+{
+ struct corosync_totemsrp_info* info;
+
+
+ info = (struct corosync_totemsrp_info*)pinfo->private_data;
+ return info->little_endian;
+}
+
+int
+corosync_totemsrp_dissect_memb_ring_id(tvbuff_t *tvb,
+ packet_info *pinfo,
+ proto_tree *parent_tree,
+ guint length, int offset)
+{
+ return dissect_corosync_totemsrp_memb_ring_id(tvb, pinfo, parent_tree,
+ length, offset,
+ corosync_totemsrp_is_little_endian(pinfo));
+}
+
Index: wireshark-1.4.1/epan/dissectors/packet-corosync-totemsrp.h
===================================================================
--- /dev/null
+++ wireshark-1.4.1/epan/dissectors/packet-corosync-totemsrp.h
@@ -0,0 +1,53 @@
+/* packet-corosync-totemsrp.h
+ * Dissectors for totem single ring protocol implemented in corosync cluster engine
+ * Copyright 2007 2009 2010 Masatake YAMATO <yamato@redhat.com>
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * $Id$
+ *
+ * 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
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __PACKET_COROSYNC_TOTEMSRP_H__
+#define __PACKET_COROSYNC_TOTEMSRP_H__
+
+#include <netinet/in.h>
+
+extern int dissect_corosync_totemsrp (tvbuff_t *tvb,
+ packet_info *pinfo,
+ proto_tree *parent_tree);
+
+
+/* subdissectors for corosync_totemsrp can know the endian information
+ embedded in totemsrp packet header. */
+extern gboolean corosync_totemsrp_is_little_endian(packet_info *pinfo);
+
+
+#define COROSYNC_TOTEMSRP_IP_ADDRLEN (sizeof(struct in6_addr))
+#define corosync_totemsrp_ip_address_length ( 4 + 2 + COROSYNC_TOTEMSRP_IP_ADDRLEN )
+#define corosync_totemsrp_memb_ring_id_length ( 8 + corosync_totemsrp_ip_address_length )
+
+extern int corosync_totemsrp_dissect_memb_ring_id(tvbuff_t *tvb,
+ packet_info *pinfo,
+ proto_tree *parent_tree,
+ guint length,
+ int offset);
+
+
+#endif /* packet-totemsrp.h */
Index: wireshark-1.4.1/epan/dissectors/Makefile.in
===================================================================
--- wireshark-1.4.1.orig/epan/dissectors/Makefile.in
+++ wireshark-1.4.1/epan/dissectors/Makefile.in
@@ -224,6 +224,8 @@ am__objects_3 = libdissectors_la-packet-
libdissectors_la-packet-collectd.lo \
libdissectors_la-packet-componentstatus.lo \
libdissectors_la-packet-cops.lo \
+ libdissectors_la-packet-corosync-totemnet.lo \
+ libdissectors_la-packet-corosync-totemsrp.lo \
libdissectors_la-packet-cosine.lo \
libdissectors_la-packet-cpfi.lo \
libdissectors_la-packet-cpha.lo \
@@ -1486,6 +1488,8 @@ DISSECTOR_SRC = \
packet-collectd.c \
packet-componentstatus.c \
packet-cops.c \
+ packet-corosync-totemnet.c \
+ packet-corosync-totemsrp.c \
packet-cosine.c \
packet-cpfi.c \
packet-cpha.c \
@@ -2773,6 +2777,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-collectd.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-componentstatus.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-cops.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-corosync-totemnet.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-corosync-totemsrp.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-cosine.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-cpfi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdissectors_la-packet-cpha.Plo@am__quote@
@@ -4406,6 +4412,20 @@ libdissectors_la-packet-cops.lo: packet-
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdissectors_la_CFLAGS) $(CFLAGS) -c -o libdissectors_la-packet-cops.lo `test -f 'packet-cops.c' || echo '$(srcdir)/'`packet-cops.c
+libdissectors_la-packet-corosync-totemnet.lo: packet-corosync-totemnet.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdissectors_la_CFLAGS) $(CFLAGS) -MT libdissectors_la-packet-corosync-totemnet.lo -MD -MP -MF "$(DEPDIR)/libdissectors_la-packet-corosync-totemnet.Tpo" -c -o libdissectors_la-packet-corosync-totemnet.lo `test -f 'packet-corosync-totemnet.c' || echo '$(srcdir)/'`packet-corosync-totemnet.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libdissectors_la-packet-corosync-totemnet.Tpo" "$(DEPDIR)/libdissectors_la-packet-corosync-totemnet.Plo"; else rm -f "$(DEPDIR)/libdissectors_la-packet-corosync-totemnet.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='packet-corosync-totemnet.c' object='libdissectors_la-packet-corosync-totemnet.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdissectors_la_CFLAGS) $(CFLAGS) -c -o libdissectors_la-packet-corosync-totemnet.lo `test -f 'packet-corosync-totemnet.c' || echo '$(srcdir)/'`packet-corosync-totemnet.c
+
+libdissectors_la-packet-corosync-totemsrp.lo: packet-corosync-totemsrp.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdissectors_la_CFLAGS) $(CFLAGS) -MT libdissectors_la-packet-corosync-totemsrp.lo -MD -MP -MF "$(DEPDIR)/libdissectors_la-packet-corosync-totemsrp.Tpo" -c -o libdissectors_la-packet-corosync-totemsrp.lo `test -f 'packet-corosync-totemsrp.c' || echo '$(srcdir)/'`packet-corosync-totemsrp.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libdissectors_la-packet-corosync-totemsrp.Tpo" "$(DEPDIR)/libdissectors_la-packet-corosync-totemsrp.Plo"; else rm -f "$(DEPDIR)/libdissectors_la-packet-corosync-totemsrp.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='packet-corosync-totemsrp.c' object='libdissectors_la-packet-corosync-totemsrp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdissectors_la_CFLAGS) $(CFLAGS) -c -o libdissectors_la-packet-corosync-totemsrp.lo `test -f 'packet-corosync-totemsrp.c' || echo '$(srcdir)/'`packet-corosync-totemsrp.c
+
libdissectors_la-packet-cosine.lo: packet-cosine.c
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdissectors_la_CFLAGS) $(CFLAGS) -MT libdissectors_la-packet-cosine.lo -MD -MP -MF "$(DEPDIR)/libdissectors_la-packet-cosine.Tpo" -c -o libdissectors_la-packet-cosine.lo `test -f 'packet-cosine.c' || echo '$(srcdir)/'`packet-cosine.c; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libdissectors_la-packet-cosine.Tpo" "$(DEPDIR)/libdissectors_la-packet-cosine.Plo"; else rm -f "$(DEPDIR)/libdissectors_la-packet-cosine.Tpo"; exit 1; fi