| diff -Nur wireshark-1.2.7/epan/conversation.c wireshark-1.2.7-fD/epan/conversation.c |
| --- wireshark-1.2.7/epan/conversation.c 2010-04-01 01:44:39.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/conversation.c 2011-02-23 14:26:35.000000000 +0900 |
| @@ -40,6 +40,11 @@ |
| static GHashTable *conversation_hashtable_exact = NULL; |
| |
| /* |
| + * Hash table for conversations without strid. |
| + */ |
| +static GHashTable *conversation_hashtable_no_strid = NULL; |
| + |
| +/* |
| * Hash table for conversations with one wildcard address. |
| */ |
| static GHashTable *conversation_hashtable_no_addr2 = NULL; |
| @@ -63,6 +68,7 @@ |
| port_type ptype; |
| guint32 port1; |
| guint32 port2; |
| + guint32 strid; |
| } conversation_key; |
| #endif |
| /* |
| @@ -193,6 +199,7 @@ |
| hash_val += key->port1; |
| ADD_ADDRESS_TO_HASH(hash_val, &key->addr2); |
| hash_val += key->port2; |
| + hash_val += key->strid; |
| |
| return hash_val; |
| } |
| @@ -217,6 +224,78 @@ |
| */ |
| if (v1->port1 == v2->port1 && |
| v1->port2 == v2->port2 && |
| + v1->strid == v2->strid && |
| + ADDRESSES_EQUAL(&v1->addr1, &v2->addr1) && |
| + ADDRESSES_EQUAL(&v1->addr2, &v2->addr2)) { |
| + /* |
| + * Yes. It's the same conversation, and the two |
| + * address/port pairs are going in the same direction. |
| + */ |
| + return 1; |
| + } |
| + |
| + /* |
| + * Is the first port 2 the same as the second port 1, the first |
| + * port 1 the same as the second port 2, the first address 2 |
| + * the same as the second address 1, and the first address 1 |
| + * the same as the second address 2? |
| + */ |
| + if (v1->port2 == v2->port1 && |
| + v1->port1 == v2->port2 && |
| + v1->strid == v2->strid && |
| + ADDRESSES_EQUAL(&v1->addr2, &v2->addr1) && |
| + ADDRESSES_EQUAL(&v1->addr1, &v2->addr2)) { |
| + /* |
| + * Yes. It's the same conversation, and the two |
| + * address/port pairs are going in opposite directions. |
| + */ |
| + return 1; |
| + } |
| + |
| + /* |
| + * The addresses or the ports don't match. |
| + */ |
| + return 0; |
| +} |
| + |
| +/* |
| + * Compute the hash value for two given address/port pairs if the match |
| + * has a wildcard stream id. |
| + */ |
| +static guint |
| +conversation_hash_no_strid(gconstpointer v) |
| +{ |
| + const conversation_key *key = (const conversation_key *)v; |
| + guint hash_val; |
| + |
| + hash_val = 0; |
| + ADD_ADDRESS_TO_HASH(hash_val, &key->addr1); |
| + hash_val += key->port1; |
| + hash_val += key->port2; |
| + |
| + return hash_val; |
| +} |
| + |
| +/* |
| + * Compare two conversation keys, except for the stream id value. |
| + */ |
| +static gint |
| +conversation_match_no_strid(gconstpointer v, gconstpointer w) |
| +{ |
| + const conversation_key *v1 = (const conversation_key *)v; |
| + const conversation_key *v2 = (const conversation_key *)w; |
| + |
| + if (v1->ptype != v2->ptype) |
| + return 0; /* different types of port */ |
| + |
| + /* |
| + * Are the first and second port 1 values the same, the first and |
| + * second port 2 values the same, the first and second address |
| + * 1 values the same, and the first and second address 2 values |
| + * the same? |
| + */ |
| + if (v1->port1 == v2->port1 && |
| + v1->port2 == v2->port2 && |
| ADDRESSES_EQUAL(&v1->addr1, &v2->addr1) && |
| ADDRESSES_EQUAL(&v1->addr2, &v2->addr2)) { |
| /* |
| @@ -263,6 +342,7 @@ |
| ADD_ADDRESS_TO_HASH(hash_val, &key->addr1); |
| hash_val += key->port1; |
| hash_val += key->port2; |
| + hash_val += key->strid; |
| |
| return hash_val; |
| } |
| @@ -289,6 +369,7 @@ |
| */ |
| if (v1->port1 == v2->port1 && |
| v1->port2 == v2->port2 && |
| + v1->strid == v2->strid && |
| ADDRESSES_EQUAL(&v1->addr1, &v2->addr1)) { |
| /* |
| * Yes. It's the same conversation, and the two |
| @@ -317,6 +398,7 @@ |
| ADD_ADDRESS_TO_HASH(hash_val, &key->addr1); |
| hash_val += key->port1; |
| ADD_ADDRESS_TO_HASH(hash_val, &key->addr2); |
| + hash_val += key->strid; |
| |
| return hash_val; |
| } |
| @@ -342,6 +424,7 @@ |
| * address 2 values the same? |
| */ |
| if (v1->port1 == v2->port1 && |
| + v1->strid == v2->strid && |
| ADDRESSES_EQUAL(&v1->addr1, &v2->addr1) && |
| ADDRESSES_EQUAL(&v1->addr2, &v2->addr2)) { |
| /* |
| @@ -370,6 +453,7 @@ |
| hash_val = 0; |
| ADD_ADDRESS_TO_HASH(hash_val, &key->addr1); |
| hash_val += key->port1; |
| + hash_val += key->strid; |
| |
| return hash_val; |
| } |
| @@ -394,6 +478,7 @@ |
| * and second address 1 values the same? |
| */ |
| if (v1->port1 == v2->port1 && |
| + v1->strid == v2->strid && |
| ADDRESSES_EQUAL(&v1->addr1, &v2->addr1)) { |
| /* |
| * Yes. It's the same conversation, and the two |
| @@ -420,6 +505,8 @@ |
| conversation_keys = NULL; |
| if (conversation_hashtable_exact != NULL) |
| g_hash_table_destroy(conversation_hashtable_exact); |
| + if (conversation_hashtable_no_strid != NULL) |
| + g_hash_table_destroy(conversation_hashtable_no_strid); |
| if (conversation_hashtable_no_addr2 != NULL) |
| g_hash_table_destroy(conversation_hashtable_no_addr2); |
| if (conversation_hashtable_no_port2 != NULL) |
| @@ -438,6 +525,9 @@ |
| conversation_hashtable_exact = |
| g_hash_table_new(conversation_hash_exact, |
| conversation_match_exact); |
| + conversation_hashtable_no_strid = |
| + g_hash_table_new(conversation_hash_no_strid, |
| + conversation_match_no_strid); |
| conversation_hashtable_no_addr2 = |
| g_hash_table_new(conversation_hash_no_addr2, |
| conversation_match_no_addr2); |
| @@ -466,6 +556,15 @@ |
| conversation_new(guint32 setup_frame, address *addr1, address *addr2, port_type ptype, |
| guint32 port1, guint32 port2, guint options) |
| { |
| + return conversation_new_ext(setup_frame, addr1, addr2, ptype, |
| + port1, port2, options & ~(DISTINCT_SCTP_STREAMID), 0); |
| + |
| +} |
| + |
| +conversation_t * |
| +conversation_new_ext(guint32 setup_frame, address *addr1, address *addr2, port_type ptype, |
| + guint32 port1, guint32 port2, guint options, guint16 strid) |
| +{ |
| /* |
| DISSECTOR_ASSERT(!(options | CONVERSATION_TEMPLATE) || ((options | (NO_ADDR2 | NO_PORT2 | NO_PORT2_FORCE))) && |
| "A conversation template may not be constructed without wildcard options"); |
| @@ -486,7 +585,11 @@ |
| if (options & (NO_PORT2|NO_PORT2_FORCE)) { |
| hashtable = conversation_hashtable_no_port2; |
| } else { |
| - hashtable = conversation_hashtable_exact; |
| + if (options & DISTINCT_SCTP_STREAMID) { |
| + hashtable = conversation_hashtable_exact; |
| + } else { |
| + hashtable = conversation_hashtable_no_strid; |
| + } |
| } |
| } |
| |
| @@ -495,6 +598,7 @@ |
| existing_key.ptype = ptype; |
| existing_key.port1 = port1; |
| existing_key.port2 = port2; |
| + existing_key.strid = strid; |
| |
| conversation = g_hash_table_lookup(hashtable, &existing_key); |
| tc = conversation; /* Remember if lookup was successful */ |
| @@ -507,6 +611,7 @@ |
| new_key->ptype = ptype; |
| new_key->port1 = port1; |
| new_key->port2 = port2; |
| + new_key->strid = strid; |
| |
| if (conversation) { |
| for (; conversation->next; conversation = conversation->next) |
| @@ -568,8 +673,13 @@ |
| g_hash_table_insert(conversation_hashtable_no_addr2, |
| conv->key_ptr, conv); |
| } else { |
| - g_hash_table_insert(conversation_hashtable_exact, |
| - conv->key_ptr, conv); |
| + if (conv->options & DISTINCT_SCTP_STREAMID) { |
| + g_hash_table_insert(conversation_hashtable_exact, |
| + conv->key_ptr, conv); |
| + } else { |
| + g_hash_table_insert(conversation_hashtable_no_strid, |
| + conv->key_ptr, conv); |
| + } |
| } |
| } |
| |
| @@ -602,18 +712,23 @@ |
| g_hash_table_insert(conversation_hashtable_no_port2, |
| conv->key_ptr, conv); |
| } else { |
| - g_hash_table_insert(conversation_hashtable_exact, |
| - conv->key_ptr, conv); |
| + if (conv->options & DISTINCT_SCTP_STREAMID) { |
| + g_hash_table_insert(conversation_hashtable_exact, |
| + conv->key_ptr, conv); |
| + } else { |
| + g_hash_table_insert(conversation_hashtable_no_strid, |
| + conv->key_ptr, conv); |
| + } |
| } |
| } |
| |
| /* |
| * Search a particular hash table for a conversation with the specified |
| - * {addr1, port1, addr2, port2} and set up before frame_num. |
| + * {addr1, port1, addr2, port2, strid} and set up before frame_num. |
| */ |
| static conversation_t * |
| conversation_lookup_hashtable(GHashTable *hashtable, guint32 frame_num, address *addr1, address *addr2, |
| - port_type ptype, guint32 port1, guint32 port2) |
| + port_type ptype, guint32 port1, guint32 port2, guint16 strid) |
| { |
| conversation_t* conversation; |
| conversation_t* match; |
| @@ -628,6 +743,7 @@ |
| key.ptype = ptype; |
| key.port1 = port1; |
| key.port2 = port2; |
| + key.strid = strid; |
| |
| match = g_hash_table_lookup(hashtable, &key); |
| |
| @@ -685,12 +801,19 @@ |
| find_conversation(guint32 frame_num, address *addr_a, address *addr_b, port_type ptype, |
| guint32 port_a, guint32 port_b, guint options) |
| { |
| + return find_conversation_ext(frame_num, addr_a, addr_b, ptype, |
| + port_a, port_b, options | IGNORE_SCTP_STREAMID, 0); |
| +} |
| +conversation_t * |
| +find_conversation_ext(guint32 frame_num, address *addr_a, address *addr_b, port_type ptype, |
| + guint32 port_a, guint32 port_b, guint options, guint16 strid) |
| +{ |
| conversation_t *conversation; |
| |
| /* |
| - * First try an exact match, if we have two addresses and ports. |
| + * First try an exact match, if we have two addresses and ports and strid. |
| */ |
| - if (!(options & (NO_ADDR_B|NO_PORT_B))) { |
| + if (!(options & (NO_ADDR_B|NO_PORT_B|IGNORE_SCTP_STREAMID))) { |
| /* |
| * Neither search address B nor search port B are wildcarded, |
| * start out with an exact match. |
| @@ -699,7 +822,7 @@ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_exact, |
| frame_num, addr_a, addr_b, ptype, |
| - port_a, port_b); |
| + port_a, port_b, strid); |
| if ((conversation == NULL) && (addr_a->type == AT_FC)) { |
| /* In Fibre channel, OXID & RXID are never swapped as |
| * TCP/UDP ports are in TCP/IP. |
| @@ -707,7 +830,33 @@ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_exact, |
| frame_num, addr_b, addr_a, ptype, |
| - port_a, port_b); |
| + port_a, port_b, strid); |
| + } |
| + if (conversation != NULL) |
| + return conversation; |
| + } |
| + |
| + /* |
| + * Then, ignoring strid try an exact match, if we have two addresses and ports. |
| + */ |
| + if (!(options & (NO_ADDR_B|NO_PORT_B|NO_IGNORE_SCTP_STREAMID))) { |
| + /* |
| + * Neither search address B nor search port B are wildcarded, |
| + * start out with an exact match. |
| + * Exact matches check both directions. |
| + */ |
| + conversation = |
| + conversation_lookup_hashtable(conversation_hashtable_no_strid, |
| + frame_num, addr_a, addr_b, ptype, |
| + port_a, port_b, strid); |
| + if ((conversation == NULL) && (addr_a->type == AT_FC)) { |
| + /* In Fibre channel, OXID & RXID are never swapped as |
| + * TCP/UDP ports are in TCP/IP. |
| + */ |
| + conversation = |
| + conversation_lookup_hashtable(conversation_hashtable_no_strid, |
| + frame_num, addr_b, addr_a, ptype, |
| + port_a, port_b, strid); |
| } |
| if (conversation != NULL) |
| return conversation; |
| @@ -729,7 +878,7 @@ |
| */ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_addr2, |
| - frame_num, addr_a, addr_b, ptype, port_a, port_b); |
| + frame_num, addr_a, addr_b, ptype, port_a, port_b, strid); |
| if ((conversation == NULL) && (addr_a->type == AT_FC)) { |
| /* In Fibre channel, OXID & RXID are never swapped as |
| * TCP/UDP ports are in TCP/IP. |
| @@ -737,7 +886,7 @@ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_addr2, |
| frame_num, addr_b, addr_a, ptype, |
| - port_a, port_b); |
| + port_a, port_b, strid); |
| } |
| if (conversation != NULL) { |
| /* |
| @@ -779,7 +928,7 @@ |
| if (!(options & NO_ADDR_B)) { |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_addr2, |
| - frame_num, addr_b, addr_a, ptype, port_b, port_a); |
| + frame_num, addr_b, addr_a, ptype, port_b, port_a, strid); |
| if (conversation != NULL) { |
| /* |
| * If this is for a connection-oriented |
| @@ -821,14 +970,14 @@ |
| */ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_port2, |
| - frame_num, addr_a, addr_b, ptype, port_a, port_b); |
| + frame_num, addr_a, addr_b, ptype, port_a, port_b, strid); |
| if ((conversation == NULL) && (addr_a->type == AT_FC)) { |
| /* In Fibre channel, OXID & RXID are never swapped as |
| * TCP/UDP ports are in TCP/IP |
| */ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_port2, |
| - frame_num, addr_b, addr_a, ptype, port_a, port_b); |
| + frame_num, addr_b, addr_a, ptype, port_a, port_b, strid); |
| } |
| if (conversation != NULL) { |
| /* |
| @@ -870,7 +1019,7 @@ |
| if (!(options & NO_PORT_B)) { |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_port2, |
| - frame_num, addr_b, addr_a, ptype, port_b, port_a); |
| + frame_num, addr_b, addr_a, ptype, port_b, port_a, strid); |
| if (conversation != NULL) { |
| /* |
| * If this is for a connection-oriented |
| @@ -907,7 +1056,7 @@ |
| */ |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_addr2_or_port2, |
| - frame_num, addr_a, addr_b, ptype, port_a, port_b); |
| + frame_num, addr_a, addr_b, ptype, port_a, port_b, strid); |
| if (conversation != NULL) { |
| /* |
| * If this is for a connection-oriented protocol: |
| @@ -952,11 +1101,11 @@ |
| if (addr_a->type == AT_FC) |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_addr2_or_port2, |
| - frame_num, addr_b, addr_a, ptype, port_a, port_b); |
| + frame_num, addr_b, addr_a, ptype, port_a, port_b, strid); |
| else |
| conversation = |
| conversation_lookup_hashtable(conversation_hashtable_no_addr2_or_port2, |
| - frame_num, addr_b, addr_a, ptype, port_b, port_a); |
| + frame_num, addr_b, addr_a, ptype, port_b, port_a, strid); |
| if (conversation != NULL) { |
| /* |
| * If this is for a connection-oriented protocol, set the |
| diff -Nur wireshark-1.2.7/epan/conversation.h wireshark-1.2.7-fD/epan/conversation.h |
| --- wireshark-1.2.7/epan/conversation.h 2010-04-01 01:44:39.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/conversation.h 2011-02-23 14:25:44.000000000 +0900 |
| @@ -39,11 +39,13 @@ |
| * TEMPLATE flag will be altered once the first connections (connection |
| * oriented protocols only) to include the newly found information which |
| * matched the wildcard options. |
| + * DISTINCT_SCTP_STREAMID will also save the SCTP stream identifier, if any. |
| */ |
| #define NO_ADDR2 0x01 |
| #define NO_PORT2 0x02 |
| #define NO_PORT2_FORCE 0x04 |
| #define CONVERSATION_TEMPLATE 0x08 |
| +#define DISTINCT_SCTP_STREAMID 0x10 |
| |
| /* |
| * Flags to pass to "find_conversation()" to indicate that the address B |
| @@ -51,6 +53,8 @@ |
| */ |
| #define NO_ADDR_B 0x01 |
| #define NO_PORT_B 0x02 |
| +#define IGNORE_SCTP_STREAMID 0x04 |
| +#define NO_IGNORE_SCTP_STREAMID 0x08 |
| |
| #include "packet.h" /* for conversation dissector type */ |
| |
| @@ -64,6 +68,7 @@ |
| port_type ptype; |
| guint32 port1; |
| guint32 port2; |
| + guint16 strid; |
| } conversation_key; |
| |
| typedef struct conversation { |
| @@ -85,6 +90,13 @@ |
| extern conversation_t *find_conversation(guint32 frame_num, address *addr_a, address *addr_b, |
| port_type ptype, guint32 port_a, guint32 port_b, guint options); |
| |
| +/* for SCTP stream */ |
| +extern conversation_t *conversation_new_ext(guint32 setup_frame, address *addr1, address *addr2, |
| + port_type ptype, guint32 port1, guint32 port2, guint options, guint16 strid); |
| +extern conversation_t *find_conversation_ext(guint32 frame_num, address *addr_a, address *addr_b, |
| + port_type ptype, guint32 port_a, guint32 port_b, guint options, guint16 strid); |
| + |
| + |
| extern void conversation_add_proto_data(conversation_t *conv, int proto, |
| void *proto_data); |
| extern void *conversation_get_proto_data(conversation_t *conv, int proto); |
| diff -Nur wireshark-1.2.7/epan/dissectors/packet-diameter.c wireshark-1.2.7-fD/epan/dissectors/packet-diameter.c |
| --- wireshark-1.2.7/epan/dissectors/packet-diameter.c 2010-04-01 01:44:21.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/dissectors/packet-diameter.c 2011-02-23 13:33:10.000000000 +0900 |
| @@ -63,8 +63,10 @@ |
| #include "packet-ntp.h" |
| #include "packet-diameter.h" |
| #include "diam_dict.h" |
| +#include "packet-ssl.h" |
| |
| #define SCTP_PORT_DIAMETER 3868 |
| +#define SCTP_TLS_PORT_DIAMETER 3869 |
| |
| /* Diameter Header Flags */ |
| /* RPETrrrrCCCCCCCCCCCCCCCCCCCCCCCC */ |
| @@ -271,10 +273,13 @@ |
| |
| |
| static guint gbl_diameterSctpPort=SCTP_PORT_DIAMETER; |
| +static guint gbl_diameterSctpTlsPort=SCTP_TLS_PORT_DIAMETER; |
| |
| static dissector_handle_t diameter_tcp_handle; |
| static range_t *global_diameter_tcp_port_range; |
| +static range_t *global_diameter_tcp_tls_port_range; |
| #define DEFAULT_DIAMETER_PORT_RANGE "3868" |
| +#define DEFAULT_DIAMETER_TLS_PORT_RANGE "3869" |
| |
| /* desegmentation of Diameter over TCP */ |
| static gboolean gbl_diameter_desegment = TRUE; |
| @@ -1358,13 +1363,27 @@ |
| dissector_add("tcp.port", port, diameter_tcp_handle); |
| } |
| |
| +static void |
| +range_delete_callback_sec(guint32 port) |
| +{ |
| + ssl_dissector_delete(port, "diameter", TRUE); |
| +} |
| + |
| +static void |
| +range_add_callback_sec(guint32 port) |
| +{ |
| + ssl_dissector_add(port, "diameter", TRUE); |
| +} |
| + |
| void |
| proto_reg_handoff_diameter(void) |
| { |
| static gboolean Initialized=FALSE; |
| static guint SctpPort; |
| + static guint SctpsPort; |
| static dissector_handle_t diameter_handle; |
| static range_t *diameter_tcp_port_range; |
| + static range_t *diameters_tcp_port_range; |
| |
| if (!Initialized) { |
| diameter_handle = find_dissector("diameter"); |
| @@ -1382,20 +1401,27 @@ |
| /* AVP Code: 463 EAP-Reissued-Payload */ |
| dissector_add("diameter.base", 463, |
| new_create_dissector_handle(dissect_diameter_eap_payload, proto_diameter)); |
| + |
| + /* set port for future deletes */ |
| + diameter_tcp_port_range = range_copy(global_diameter_tcp_port_range); |
| + range_foreach(diameter_tcp_port_range, range_add_callback); |
| + diameters_tcp_port_range = range_copy(global_diameter_tcp_tls_port_range); |
| + range_foreach(diameters_tcp_port_range, range_add_callback_sec); |
| + |
| + dissector_add("sctp.port", gbl_diameterSctpPort, diameter_handle); |
| + ssl_dissector_add(gbl_diameterSctpTlsPort, "diameter", TRUE); |
| |
| Initialized=TRUE; |
| } else { |
| range_foreach(diameter_tcp_port_range, range_delete_callback); |
| g_free(diameter_tcp_port_range); |
| + range_foreach(diameters_tcp_port_range, range_delete_callback_sec); |
| + g_free(diameters_tcp_port_range); |
| dissector_delete("sctp.port", SctpPort, diameter_handle); |
| } |
| |
| - /* set port for future deletes */ |
| - diameter_tcp_port_range = range_copy(global_diameter_tcp_port_range); |
| - range_foreach(diameter_tcp_port_range, range_add_callback); |
| |
| - SctpPort=gbl_diameterSctpPort; |
| - dissector_add("sctp.port", gbl_diameterSctpPort, diameter_handle); |
| + |
| } |
| |
| /* registration with the filtering engine */ |
| @@ -1543,8 +1569,9 @@ |
| diameter_dissector_table = register_dissector_table("diameter.base", "DIAMETER_3GPP_AVPS", FT_UINT32, BASE_DEC); |
| diameter_3gpp_avp_dissector_table = register_dissector_table("diameter.3gpp", "DIAMETER_3GPP_AVPS", FT_UINT32, BASE_DEC); |
| |
| - /* Set default TCP ports */ |
| + /* Set default TCP & TLS ports */ |
| range_convert_str(&global_diameter_tcp_port_range, DEFAULT_DIAMETER_PORT_RANGE, MAX_UDP_PORT); |
| + range_convert_str(&global_diameter_tcp_tls_port_range, DEFAULT_DIAMETER_TLS_PORT_RANGE, MAX_UDP_PORT); |
| |
| /* Register configuration options for ports */ |
| diameter_module = prefs_register_protocol(proto_diameter, |
| diff -Nur wireshark-1.2.7/epan/dissectors/packet-sctp.c wireshark-1.2.7-fD/epan/dissectors/packet-sctp.c |
| --- wireshark-1.2.7/epan/dissectors/packet-sctp.c 2010-04-01 01:44:28.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/dissectors/packet-sctp.c 2011-02-23 13:54:13.000000000 +0900 |
| @@ -2693,6 +2693,7 @@ |
| b_bit = tvb_get_guint8(chunk_tvb, CHUNK_FLAGS_OFFSET) & SCTP_DATA_CHUNK_B_BIT; |
| u_bit = tvb_get_guint8(chunk_tvb, CHUNK_FLAGS_OFFSET) & SCTP_DATA_CHUNK_U_BIT; |
| stream_id = tvb_get_ntohs(chunk_tvb, DATA_CHUNK_STREAM_ID_OFFSET); |
| + pinfo->strid = stream_id; |
| stream_seq_num = tvb_get_ntohs(chunk_tvb, DATA_CHUNK_STREAM_SEQ_NUMBER_OFFSET); |
| tsn = tvb_get_ntohl(chunk_tvb, DATA_CHUNK_TSN_OFFSET); |
| |
| diff -Nur wireshark-1.2.7/epan/dissectors/packet-ssl.c wireshark-1.2.7-fD/epan/dissectors/packet-ssl.c |
| --- wireshark-1.2.7/epan/dissectors/packet-ssl.c 2010-04-01 01:44:34.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/dissectors/packet-ssl.c 2011-02-23 14:56:36.000000000 +0900 |
| @@ -500,6 +500,7 @@ |
| guint* conv_version; |
| Ssl_private_key_t * private_key; |
| guint32 port; |
| + guint16 strid; |
| |
| ti = NULL; |
| ssl_tree = NULL; |
| @@ -507,9 +508,14 @@ |
| first_record_in_frame = TRUE; |
| ssl_session = NULL; |
| port = 0; |
| + strid = 0; |
| |
| |
| ssl_debug_printf("\ndissect_ssl enter frame #%u (%s)\n", pinfo->fd->num, (pinfo->fd->flags.visited)?"already visited":"first time"); |
| + |
| + if (pinfo->ptype == PT_SCTP) { |
| + ssl_debug_printf("\ndissect_ssl SCTP stream %hd\n", pinfo->strid); |
| + } |
| |
| /* Track the version using conversations to reduce the |
| * chance that a packet that simply *looks* like a v2 or |
| @@ -523,14 +529,14 @@ |
| * the conv_version, must set the copy in the conversation |
| * in addition to conv_version |
| */ |
| - conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, |
| - pinfo->srcport, pinfo->destport, 0); |
| + conversation = find_conversation_ext(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, |
| + pinfo->srcport, pinfo->destport, NO_IGNORE_SCTP_STREAMID, pinfo->strid); |
| |
| if (!conversation) |
| { |
| /* create a new conversation */ |
| - conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, |
| - pinfo->srcport, pinfo->destport, 0); |
| + conversation = conversation_new_ext(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, |
| + pinfo->srcport, pinfo->destport, (pinfo->ptype == PT_SCTP) ? DISTINCT_SCTP_STREAMID : 0, pinfo->strid); |
| ssl_debug_printf(" new conversation = %p created\n", (void *)conversation); |
| } |
| conv_data = conversation_get_proto_data(conversation, proto_ssl); |
| @@ -549,7 +555,7 @@ |
| conversation_add_proto_data(conversation, proto_ssl, ssl_session); |
| |
| /* we need to know which side of the conversation is speaking */ |
| - if (ssl_packet_from_server(ssl_associations, pinfo->srcport, pinfo->ptype == PT_TCP)) { |
| + if (ssl_packet_from_server(ssl_associations, pinfo->srcport, pinfo->ptype != PT_UDP)) { |
| dummy.addr = pinfo->src; |
| dummy.port = port = pinfo->srcport; |
| } else { |
| @@ -762,7 +768,7 @@ |
| * add decrypted data to this packet info */ |
| ssl_debug_printf("decrypt_ssl3_record: app_data len %d ssl, state 0x%02X\n", |
| record_length, ssl->state); |
| - direction = ssl_packet_from_server(ssl_associations, pinfo->srcport, pinfo->ptype == PT_TCP); |
| + direction = ssl_packet_from_server(ssl_associations, pinfo->srcport, pinfo->ptype != PT_UDP); |
| |
| /* retrieve decoder for this packet direction */ |
| if (direction != 0) { |
| @@ -1504,7 +1510,7 @@ |
| col_append_str(pinfo->cinfo, COL_INFO, "Change Cipher Spec"); |
| dissect_ssl3_change_cipher_spec(tvb, ssl_record_tree, |
| offset, conv_version, content_type); |
| - if (ssl) ssl_change_cipher(ssl, ssl_packet_from_server(ssl_associations, pinfo->srcport, pinfo->ptype == PT_TCP)); |
| + if (ssl) ssl_change_cipher(ssl, ssl_packet_from_server(ssl_associations, pinfo->srcport, pinfo->ptype != PT_UDP)); |
| break; |
| case SSL_ID_ALERT: |
| { |
| @@ -1566,8 +1572,8 @@ |
| /* we need dissector information when the selected packet is shown. |
| * ssl session pointer is NULL at that time, so we can't access |
| * info cached there*/ |
| - association = ssl_association_find(ssl_associations, pinfo->srcport, pinfo->ptype == PT_TCP); |
| - association = association ? association: ssl_association_find(ssl_associations, pinfo->destport, pinfo->ptype == PT_TCP); |
| + association = ssl_association_find(ssl_associations, pinfo->srcport, pinfo->ptype != PT_UDP); |
| + association = association ? association: ssl_association_find(ssl_associations, pinfo->destport, pinfo->ptype != PT_UDP); |
| |
| proto_item_set_text(ssl_record_tree, |
| "%s Record Layer: %s Protocol: %s", |
| diff -Nur wireshark-1.2.7/epan/dissectors/packet-ssl-utils.c wireshark-1.2.7-fD/epan/dissectors/packet-ssl-utils.c |
| --- wireshark-1.2.7/epan/dissectors/packet-ssl-utils.c 2010-04-01 01:44:27.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/dissectors/packet-ssl-utils.c 2011-02-23 13:33:10.000000000 +0900 |
| @@ -2713,9 +2713,10 @@ |
| fprintf(stderr, "association_add() could not find handle for protocol:%s\n",protocol); |
| } else { |
| if(port) { |
| - if(tcp) |
| + if(tcp) { |
| dissector_add("tcp.port", port, handle); |
| - else |
| + dissector_add("sctp.port", port, handle); |
| + } else |
| dissector_add("udp.port", port, handle); |
| } |
| g_tree_insert(associations, assoc, assoc); |
| diff -Nur wireshark-1.2.7/epan/packet_info.h wireshark-1.2.7-fD/epan/packet_info.h |
| --- wireshark-1.2.7/epan/packet_info.h 2010-04-01 01:44:40.000000000 +0900 |
| +++ wireshark-1.2.7-fD/epan/packet_info.h 2011-02-23 13:54:52.000000000 +0900 |
| @@ -169,6 +169,7 @@ |
| tvbuff_t *gssapi_decrypted_tvb; |
| gboolean gssapi_data_encrypted; |
| |
| + guint16 strid; /* Stream Id of the last DATA chunk in the packet */ |
| guint32 ppid; /* SCTP PPI of current DATA chunk */ |
| guint32 ppids[MAX_NUMBER_OF_PPIDS]; /* The first NUMBER_OF_PPIDS PPIDS which are present |
| * in the SCTP packet |