Ethereal-dev: [Ethereal-dev] [patch] conversations demarked by setup frame number

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Jon Ringle <ml-ethereal@xxxxxxxxxx>
Date: Tue, 18 Jan 2005 02:01:55 -0500
1) Added a setup_frame parameter to conversation_t
2) Used the conversation_t next to maintain a list of conversations with the 
same src/dest tuple but different setup_frame number.
3) Changed the signature of find_conversation() and conversation_new() to pass 
in the frame number.
4) Adjusted packet-sdp to select RTP conversation if both m=audio and m=image 
are present, and T.38 conversation if only m=image is present. I expect that 
RTP/T.38 dissecting to be better, but I don't have a way to generate T.38 
packets.

Potential problems I noticed:
1) packet-quake.c and packet-bittorrent.c make calls to conversation_new() 
without checking to see if there is an already existing conversation with 
find_conversation()

2) packet-dcerpc.c in dcerpc_add_conv_to_bind_table() makes calls to 
find_conversation() and conversation_new() without a means to get a frame 
number. I faked it with a zero.

Comments welcome...

Jon
Index: asn1/h225/packet-h225-template.c
===================================================================
--- asn1/h225/packet-h225-template.c	(revision 13086)
+++ asn1/h225/packet-h225-template.c	(working copy)
@@ -310,13 +310,13 @@
 
 		msg_category = pi->msg_tag / 3;
 		if(pi->msg_tag % 3 == 0) {		/* Request Message */
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 				&pinfo->dst, pinfo->ptype, pinfo->srcport,
 				pinfo->destport, 0);
 
 			if (conversation == NULL) {
 				/* It's not part of any conversation - create a new one. */
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 				    pinfo->destport, 0);
 
@@ -383,7 +383,7 @@
   		/* end of request message handling*/
 		}
 		else { 					/* Confirm or Reject Message */
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
     				&pinfo->dst, pinfo->ptype, pinfo->srcport,
   				pinfo->destport, 0);
   			if (conversation != NULL) {
Index: plugins/irda/packet-irda.c
===================================================================
--- plugins/irda/packet-irda.c	(revision 13086)
+++ plugins/irda/packet-irda.c	(working copy)
@@ -565,7 +565,7 @@
             destaddr.len  = 1;
             destaddr.data = (char*)&pinfo->circuit_id;
 
-            conv = find_conversation(&srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
+            conv = find_conversation(pinfo->fd->num, &srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
             if (conv)
             {
                 iap_conv = (iap_conversation_t*)conversation_get_proto_data(conv, PT_NONE);
@@ -587,7 +587,7 @@
             }
             else
             {
-                conv = conversation_new(&srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
+                conv = conversation_new(pinfo->fd->num, &srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
                 iap_conv = g_mem_chunk_alloc(iap_conv_chunk);
                 conversation_add_proto_data(conv, PT_NONE, (void*)iap_conv);
             }
@@ -726,7 +726,7 @@
     destaddr.data = (char*)&pinfo->circuit_id;
 
     /* Find result value dissector */
-    conv = find_conversation(&srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
+    conv = find_conversation(pinfo->fd->num, &srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
     if (conv)
     {
         num = pinfo->fd->num;
@@ -1015,7 +1015,7 @@
     destaddr.data = (char*)&pinfo->circuit_id;
 
     /* Find result value dissector */
-    conv = find_conversation(&srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
+    conv = find_conversation(pinfo->fd->num, &srcaddr, &destaddr, PT_NONE, pinfo->srcport, pinfo->destport, 0);
     if (conv)
     {
         num = pinfo->fd->num;
@@ -1255,7 +1255,7 @@
     destaddr.len  = 1;
     destaddr.data = (char*)&dest;
 
-    conv = find_conversation(&destaddr, &srcaddr, PT_NONE, dlsap, 0, NO_PORT_B);
+    conv = find_conversation(pinfo->fd->num, &destaddr, &srcaddr, PT_NONE, dlsap, 0, NO_PORT_B);
     if (conv)
     {
         lmp_conv = (lmp_conversation_t*)conversation_get_proto_data(conv, PT_NONE);
@@ -1276,7 +1276,7 @@
     }
     else
     {
-        conv = conversation_new(&destaddr, &srcaddr, PT_NONE, dlsap, 0, NO_PORT_B);
+        conv = conversation_new(pinfo->fd->num, &destaddr, &srcaddr, PT_NONE, dlsap, 0, NO_PORT_B);
         lmp_conv = g_mem_chunk_alloc(lmp_conv_chunk);
         conversation_add_proto_data(conv, PT_NONE, (void*)lmp_conv);
     }
Index: plugins/mgcp/packet-mgcp.c
===================================================================
--- plugins/mgcp/packet-mgcp.c	(revision 13086)
+++ plugins/mgcp/packet-mgcp.c	(working copy)
@@ -1189,7 +1189,7 @@
 	   guarantee that the reply will come from the address
 	   to which the call was sent. */
 	if (pinfo->ptype == PT_TCP) {
-		conversation = find_conversation(&pinfo->src,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 		    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 		    pinfo->destport, 0);
 	} else {
@@ -1199,7 +1199,7 @@
 		 * pointer for the second address argument even
 		 * if you do that.
 		 */
-		conversation = find_conversation(&null_address,
+		conversation = find_conversation(pinfo->fd->num, &null_address,
 		    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 		    pinfo->destport, 0);
 	}
@@ -1275,7 +1275,7 @@
 	   guarantee that the reply will come from the address
 	   to which the call was sent. */
 	if (pinfo->ptype == PT_TCP) {
-		conversation = find_conversation(&pinfo->src,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 		    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 		    pinfo->destport, 0);
 	} else {
@@ -1285,7 +1285,7 @@
 		 * pointer for the second address argument even
 		 * if you do that.
 		 */
-		conversation = find_conversation(&pinfo->src,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 		    &null_address, pinfo->ptype, pinfo->srcport,
 		    pinfo->destport, 0);
 	}
@@ -1293,11 +1293,11 @@
 		/* It's not part of any conversation - create a new
 		   one. */
 		if (pinfo->ptype == PT_TCP) {
-			conversation = conversation_new(&pinfo->src,
+			conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 			    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 			    pinfo->destport, 0);
 		} else {
-			conversation = conversation_new(&pinfo->src,
+			conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 			    &null_address, pinfo->ptype, pinfo->srcport,
 			    pinfo->destport, 0);
 		}
Index: epan/conversation.c
===================================================================
--- epan/conversation.c	(revision 13086)
+++ epan/conversation.c	(working copy)
@@ -130,7 +130,8 @@
           * conversation with new 2nd address and 2nd port.
           */
          new_conversation_from_template =
-            conversation_new(&conversation->key_ptr->addr1, addr2,
+            conversation_new(conversation->setup_frame,
+                             &conversation->key_ptr->addr1, addr2,
                              conversation->key_ptr->ptype, conversation->key_ptr->port1,
                              port2, options);
       }
@@ -141,7 +142,8 @@
           * only. Create a new conversation with new 2nd port.
           */
          new_conversation_from_template =
-            conversation_new(&conversation->key_ptr->addr1, &conversation->key_ptr->addr2,
+            conversation_new(conversation->setup_frame,
+                             &conversation->key_ptr->addr1, &conversation->key_ptr->addr2,
                              conversation->key_ptr->ptype, conversation->key_ptr->port1,
                              port2, options);
       }
@@ -152,7 +154,8 @@
           * 2. Create a new conversation with new 2nd address.
           */
          new_conversation_from_template =
-            conversation_new(&conversation->key_ptr->addr1, addr2,
+            conversation_new(conversation->setup_frame,
+                             &conversation->key_ptr->addr1, addr2,
                              conversation->key_ptr->ptype, conversation->key_ptr->port1,
                              conversation->key_ptr->port2, options);
       }
@@ -528,16 +531,42 @@
  * when searching for this conversation.
  */
 conversation_t *
-conversation_new(address *addr1, address *addr2, port_type ptype,
+conversation_new(guint32 setup_frame, address *addr1, address *addr2, port_type ptype,
     guint32 port1, guint32 port2, guint options)
 {
 /*
 	g_assert(!(options | CONVERSATION_TEMPLATE) || ((options | (NO_ADDR2 | NO_PORT2 | NO_PORT2_FORCE))) &&
 				"A conversation template may not be constructed without wildcard options");
 */
+	GHashTable* hashtable;
 	conversation_t *conversation;
+	conversation_t *tc;
+	conversation_key existing_key;
 	conversation_key *new_key;
 
+	if (options & NO_ADDR2) {
+		if (options & (NO_PORT2|NO_PORT2_FORCE)) {
+			hashtable = conversation_hashtable_no_addr2_or_port2;
+		} else {
+			hashtable = conversation_hashtable_no_addr2;
+		}
+	} else {
+		if (options & (NO_PORT2|NO_PORT2_FORCE)) {
+			hashtable = conversation_hashtable_no_port2;
+		} else {
+			hashtable = conversation_hashtable_exact;
+		}
+	}
+
+	existing_key.addr1 = *addr1;
+	existing_key.addr2 = *addr2;
+	existing_key.ptype = ptype;
+	existing_key.port1 = port1;
+	existing_key.port2 = port2;
+
+	conversation = g_hash_table_lookup(hashtable, &existing_key);
+	tc = conversation; /* Remember if lookup was successful */
+
 	new_key = g_mem_chunk_alloc(conversation_key_chunk);
 	new_key->next = conversation_keys;
 	conversation_keys = new_key;
@@ -547,8 +576,18 @@
 	new_key->port1 = port1;
 	new_key->port2 = port2;
 
-	conversation = g_mem_chunk_alloc(conversation_chunk);
+	if (conversation) {
+		for (; conversation->next; conversation = conversation->next)
+			;
+		conversation->next = g_mem_chunk_alloc(conversation_chunk);
+		conversation = conversation->next;
+	} else {
+		conversation = g_mem_chunk_alloc(conversation_chunk);
+	}
+
+	conversation->next = NULL;
 	conversation->index = new_index;
+	conversation->setup_frame = setup_frame;
 	conversation->data_list = NULL;
 
 	/* clear dissector handle */
@@ -560,23 +599,11 @@
 
 	new_index++;
 
-	if (options & NO_ADDR2) {
-		if (options & (NO_PORT2|NO_PORT2_FORCE)) {
-			g_hash_table_insert(conversation_hashtable_no_addr2_or_port2,
-			    new_key, conversation);
-		} else {
-			g_hash_table_insert(conversation_hashtable_no_addr2,
-			    new_key, conversation);
-		}
-	} else {
-		if (options & (NO_PORT2|NO_PORT2_FORCE)) {
-			g_hash_table_insert(conversation_hashtable_no_port2,
-			    new_key, conversation);
-		} else {
-			g_hash_table_insert(conversation_hashtable_exact,
-			    new_key, conversation);
-		}
-	}
+	/* only insert a hash table entry if this
+	 * is the first conversation with this key */
+	if (!tc)
+		g_hash_table_insert(hashtable, new_key, conversation);
+
 	return conversation;
 }
 
@@ -653,9 +680,11 @@
  * addr1, port1, addr2, and port2.
  */
 static conversation_t *
-conversation_lookup_hashtable(GHashTable *hashtable, address *addr1, address *addr2,
+conversation_lookup_hashtable(GHashTable *hashtable, guint32 frame_num, address *addr1, address *addr2,
     port_type ptype, guint32 port1, guint32 port2)
 {
+	conversation_t* conversation;
+	conversation_t* match;
 	conversation_key key;
 
 	/*
@@ -667,7 +696,18 @@
 	key.ptype = ptype;
 	key.port1 = port1;
 	key.port2 = port2;
-	return g_hash_table_lookup(hashtable, &key);
+
+	match = g_hash_table_lookup(hashtable, &key);
+
+	if (match) {
+		for (conversation = match->next; conversation; conversation = conversation->next) {
+			if ((conversation->setup_frame < frame_num)
+				&& (conversation->setup_frame > match->setup_frame))
+				match = conversation;
+		}
+	}
+
+	return match;
 }
 
 
@@ -708,7 +748,7 @@
  *	otherwise, we found no matching conversation, and return NULL.
  */
 conversation_t *
-find_conversation(address *addr_a, address *addr_b, port_type ptype,
+find_conversation(guint32 frame_num, address *addr_a, address *addr_b, port_type ptype,
     guint32 port_a, guint32 port_b, guint options)
 {
    conversation_t *conversation;
@@ -724,7 +764,7 @@
        */
       conversation =
          conversation_lookup_hashtable(conversation_hashtable_exact,
-         addr_a, addr_b, ptype,
+         frame_num, addr_a, addr_b, ptype,
          port_a, port_b);
       if ((conversation == NULL) && (addr_a->type == AT_FC)) {
          /* In Fibre channel, OXID & RXID are never swapped as
@@ -732,7 +772,7 @@
           */
          conversation =
             conversation_lookup_hashtable(conversation_hashtable_exact,
-            addr_b, addr_a, ptype,
+            frame_num, addr_b, addr_a, ptype,
             port_a, port_b);
       }
       if (conversation != NULL)
@@ -755,14 +795,14 @@
        */
       conversation =
          conversation_lookup_hashtable(conversation_hashtable_no_addr2,
-         addr_a, addr_b, ptype, port_a, port_b);
+         frame_num, addr_a, addr_b, ptype, port_a, port_b);
       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_addr2,
-            addr_b, addr_a, ptype,
+            frame_num, addr_b, addr_a, ptype,
             port_a, port_b);
       }
       if (conversation != NULL) {
@@ -805,7 +845,7 @@
       if (!(options & NO_ADDR_B)) {
          conversation =
             conversation_lookup_hashtable(conversation_hashtable_no_addr2,
-            addr_b, addr_a, ptype, port_b, port_a);
+            frame_num, addr_b, addr_a, ptype, port_b, port_a);
          if (conversation != NULL) {
             /*
              * If this is for a connection-oriented
@@ -847,14 +887,14 @@
        */
       conversation =
          conversation_lookup_hashtable(conversation_hashtable_no_port2,
-         addr_a, addr_b, ptype, port_a, port_b);
+         frame_num, addr_a, addr_b, ptype, port_a, port_b);
       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,
-            addr_b, addr_a, ptype, port_a, port_b);
+            frame_num, addr_b, addr_a, ptype, port_a, port_b);
       }
       if (conversation != NULL) {
          /*
@@ -896,7 +936,7 @@
       if (!(options & NO_PORT_B)) {
          conversation =
             conversation_lookup_hashtable(conversation_hashtable_no_port2,
-            addr_b, addr_a, ptype, port_b, port_a);
+            frame_num, addr_b, addr_a, ptype, port_b, port_a);
          if (conversation != NULL) {
             /*
              * If this is for a connection-oriented
@@ -933,7 +973,7 @@
     */
    conversation =
       conversation_lookup_hashtable(conversation_hashtable_no_addr2_or_port2,
-      addr_a, addr_b, ptype, port_a, port_b);
+      frame_num, addr_a, addr_b, ptype, port_a, port_b);
    if (conversation != NULL) {
       /*
        * If this is for a connection-oriented protocol:
@@ -978,11 +1018,11 @@
    if (addr_a->type == AT_FC)
       conversation =
       conversation_lookup_hashtable(conversation_hashtable_no_addr2_or_port2,
-      addr_b, addr_a, ptype, port_a, port_b);
+      frame_num, addr_b, addr_a, ptype, port_a, port_b);
    else 
       conversation =
       conversation_lookup_hashtable(conversation_hashtable_no_addr2_or_port2,
-      addr_b, addr_a, ptype, port_b, port_a);
+      frame_num, addr_b, addr_a, ptype, port_b, port_a);
    if (conversation != NULL) {
       /*
        * If this is for a connection-oriented protocol, set the
@@ -1097,7 +1137,7 @@
 {
 	conversation_t *conversation;
 
-	conversation = find_conversation(addr_a, addr_b, ptype, port_a,
+	conversation = find_conversation(pinfo->fd->num, addr_a, addr_b, ptype, port_a,
 	    port_b, 0);
 
 	if (conversation != NULL) {
Index: epan/conversation.h
===================================================================
--- epan/conversation.h	(revision 13086)
+++ epan/conversation.h	(working copy)
@@ -66,6 +66,7 @@
 typedef struct conversation {
 	struct conversation *next;	/* pointer to next conversation on hash chain */
 	guint32	index;			/* unique ID for conversation */
+	guint32 setup_frame;	/* frame number that setup this conversation */
 	GSList *data_list;		/* list of data associated with conversation */
 	dissector_handle_t dissector_handle;
 					/* handle for protocol dissector client associated with conversation */
@@ -75,10 +76,10 @@
 
 extern void conversation_init(void);
 
-extern conversation_t *conversation_new(address *addr1, address *addr2,
+extern conversation_t *conversation_new(guint32 setup_frame, address *addr1, address *addr2,
     port_type ptype, guint32 port1, guint32 port2, guint options);
 
-extern conversation_t *find_conversation(address *addr_a, address *addr_b,
+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);
 
 extern void conversation_add_proto_data(conversation_t *conv, int proto,
Index: epan/dissectors/packet-ndmp.c
===================================================================
--- epan/dissectors/packet-ndmp.c	(revision 13086)
+++ epan/dissectors/packet-ndmp.c	(working copy)
@@ -1166,10 +1166,10 @@
 	 * sequence number in requests and the reply sequence
 	 * number in replies to identify SCSI tasks.
 	 */
-	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 	    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	if (conversation == NULL) {
-		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 	task_key.conv_id = conversation->index;
@@ -1255,7 +1255,7 @@
 	 * sequence number in requests and the reply sequence
 	 * number in replies to identify SCSI tasks.
 	 */
-	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 	    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	if (conversation != NULL) {
 		task_key.conv_id = conversation->index;
Index: epan/dissectors/packet-snmp.c
===================================================================
--- epan/dissectors/packet-snmp.c	(revision 13086)
+++ epan/dissectors/packet-snmp.c	(working copy)
@@ -2324,10 +2324,10 @@
 	 * wildcarded, and give it the SNMP dissector as a dissector.
 	 */
 	if (pinfo->destport == UDP_PORT_SNMP) {
-	  conversation = find_conversation(&pinfo->src, &pinfo->dst, PT_UDP,
+	  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
 					   pinfo->srcport, 0, NO_PORT_B);
 	  if (conversation == NULL) {
-	    conversation = conversation_new(&pinfo->src, &pinfo->dst, PT_UDP,
+	    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
 					    pinfo->srcport, 0, NO_PORT2);
 	    conversation_set_dissector(conversation, snmp_handle);
 	  }
Index: epan/dissectors/packet-fcfcs.c
===================================================================
--- epan/dissectors/packet-fcfcs.c	(revision 13086)
+++ epan/dissectors/packet-fcfcs.c	(working copy)
@@ -843,11 +843,11 @@
     cthdr.maxres_size = ntohs (cthdr.maxres_size);
 
     if ((opcode != FCCT_MSG_ACC) && (opcode != FCCT_MSG_RJT)) {
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         if (!conversation) {
-            conversation = conversation_new (&pinfo->src, &pinfo->dst,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                              pinfo->ptype, pinfo->oxid,
                                              pinfo->rxid, NO_PORT2);
         }
@@ -879,7 +879,7 @@
     }
     else {
         /* Opcode is ACC or RJT */
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         isreq = 0;
Index: epan/dissectors/packet-pgsql.c
===================================================================
--- epan/dissectors/packet-pgsql.c	(revision 13086)
+++ epan/dissectors/packet-pgsql.c	(working copy)
@@ -321,10 +321,10 @@
     first_message = TRUE;
 
     /* We don't use conversation data yet, but... */
-    cv = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+    cv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                            pinfo->srcport, pinfo->destport, 0);
     if (!cv) {
-        cv = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+        cv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                               pinfo->srcport, pinfo->destport, 0);
     }
 
Index: epan/dissectors/packet-spnego.c
===================================================================
--- epan/dissectors/packet-spnego.c	(revision 13086)
+++ epan/dissectors/packet-spnego.c	(working copy)
@@ -1082,7 +1082,7 @@
 	 * could override that. :-(
 	 */
 
-	if ((conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	if ((conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 					     pinfo->ptype, pinfo->srcport,
 					     pinfo->destport, 0))) {
 
@@ -1294,7 +1294,7 @@
 	     * If we have a conversation, try to get the handle,
 	     * and if we get one, attach it to the frame.
 	     */
-	    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 					     pinfo->ptype, pinfo->srcport,
 					     pinfo->destport, 0);
 
@@ -1427,7 +1427,7 @@
 	     * If we have a conversation, try to get the handle,
 	     * and if we get one, attach it to the frame.
 	     */
-	    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 					     pinfo->ptype, pinfo->srcport,
 					     pinfo->destport, 0);
 
Index: epan/dissectors/packet-rtsp.c
===================================================================
--- epan/dissectors/packet-rtsp.c	(revision 13086)
+++ epan/dissectors/packet-rtsp.c	(working copy)
@@ -233,7 +233,7 @@
 		length_remaining = rf_len;
 	next_tvb = tvb_new_subset(tvb, offset, length_remaining, rf_len);
 
-	conv = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
 	if (conv &&
@@ -410,10 +410,10 @@
 				pinfo->fd->num);
 			return;
 		}
-		conv = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+		conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 			pinfo->srcport, pinfo->destport, 0);
 		if (!conv) {
-			conv = conversation_new(&pinfo->src, &pinfo->dst,
+			conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				pinfo->ptype, pinfo->srcport, pinfo->destport,
 				0);
 		}
Index: epan/dissectors/packet-ntlmssp.c
===================================================================
--- epan/dissectors/packet-ntlmssp.c	(revision 13086)
+++ epan/dissectors/packet-ntlmssp.c	(working copy)
@@ -926,11 +926,11 @@
    * Store the flags and the RC4 state information with the conversation,
    * as they're needed in order to dissect subsequent messages.
    */
-  conversation = find_conversation(&pinfo->src, &pinfo->dst,
+  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				   pinfo->ptype, pinfo->srcport,
 				   pinfo->destport, 0);
   if (!conversation) { /* Create one */
-    conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype, 
+    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, 
 				    pinfo->srcport, pinfo->destport, 0);
   }
 
@@ -1019,7 +1019,7 @@
      * it means this is the first time we've dissected this frame, so
      * we should give it flag info.
      */
-    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				     pinfo->ptype, pinfo->srcport,
 				     pinfo->destport, 0);
     if (conversation != NULL) {
@@ -1203,7 +1203,7 @@
   conversation_t *conversation;
   ntlmssp_info *conv_ntlmssp_info;
 
-  conversation = find_conversation(&pinfo->src, &pinfo->dst,
+  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				   pinfo->ptype, pinfo->srcport,
 				   pinfo->destport, 0);
   if (conversation == NULL) {
@@ -1258,7 +1258,7 @@
     return;
   }
   if (!packet_ntlmssp_info->verifier_decrypted) {
-    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				     pinfo->ptype, pinfo->srcport,
 				     pinfo->destport, 0);
     if (conversation == NULL) {
@@ -1437,7 +1437,7 @@
   
   if (!packet_ntlmssp_info->payload_decrypted) {
     /* Pull the challenge info from the conversation */
-    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				     pinfo->ptype, pinfo->srcport,
 				     pinfo->destport, 0);
     if (conversation == NULL) {
Index: epan/dissectors/packet-quake.c
===================================================================
--- epan/dissectors/packet-quake.c	(revision 13086)
+++ epan/dissectors/packet-quake.c	(working copy)
@@ -220,7 +220,7 @@
 	conversation_t *c;
 
 	port = tvb_get_letohl(tvb, 0);
-	c = conversation_new( &pinfo->src, &pinfo->dst, PT_UDP, port,
+	c = conversation_new( pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP, port,
 	    pinfo->destport, 0);
 	if (c) {
 		conversation_set_dissector(c, quake_handle);
Index: epan/dissectors/packet-fc.c
===================================================================
--- epan/dissectors/packet-fc.c	(revision 13086)
+++ epan/dissectors/packet-fc.c	(working copy)
@@ -1165,11 +1165,11 @@
          * SEQ_CNT of the first frame in sequence and use this value to
          * determine the actual offset into a frame.
          */
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         if (!conversation) {
-            conversation = conversation_new (&pinfo->src, &pinfo->dst,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                              pinfo->ptype, pinfo->oxid,
                                              pinfo->rxid, NO_PORT2);
         }
Index: epan/dissectors/packet-fcfzs.c
===================================================================
--- epan/dissectors/packet-fcfzs.c	(revision 13086)
+++ epan/dissectors/packet-fcfzs.c	(working copy)
@@ -664,11 +664,11 @@
     }
     
     if ((opcode != FCCT_MSG_ACC) && (opcode != FCCT_MSG_RJT)) {
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         if (!conversation) {
-            conversation = conversation_new (&pinfo->src, &pinfo->dst,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                              pinfo->ptype, pinfo->oxid,
                                              pinfo->rxid, NO_PORT2);
         }
@@ -700,7 +700,7 @@
     }
     else {
         /* Opcode is ACC or RJT */
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         isreq = 0;
Index: epan/dissectors/packet-rsync.c
===================================================================
--- epan/dissectors/packet-rsync.c	(revision 13086)
+++ epan/dissectors/packet-rsync.c	(working copy)
@@ -106,10 +106,10 @@
     if (check_col(pinfo->cinfo, COL_INFO))
         col_clear(pinfo->cinfo, COL_INFO);
 
-    conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 				     pinfo->srcport, pinfo->destport, 0);
     if (conversation == NULL) {
-	conversation = conversation_new(&pinfo->src, &pinfo->dst,
+	conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 					pinfo->ptype, pinfo->srcport,
 					pinfo->destport, 0);
     }
Index: epan/dissectors/packet-x11.c
===================================================================
--- epan/dissectors/packet-x11.c	(revision 13086)
+++ epan/dissectors/packet-x11.c	(working copy)
@@ -4122,13 +4122,13 @@
 	     * if we don't have one, and create the state if we don't have
 	     * any.
 	     */
-	    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	    if (conversation == NULL) {
 		  /*
 		   * No - create one.
 		   */
-		  conversation = conversation_new(&pinfo->src,
+		  conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 			&pinfo->dst, pinfo->ptype, pinfo->srcport,
 			pinfo->destport, 0);
 	    }
@@ -4407,13 +4407,13 @@
 	* if we don't have one, and create the state if we don't have
 	* any.
 	*/
-	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 	pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	if (conversation == NULL) {
 		/*
 	   	 * No - create one.
 	   	*/
-		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 
Index: epan/dissectors/packet-isns.c
===================================================================
--- epan/dissectors/packet-isns.c	(revision 13086)
+++ epan/dissectors/packet-isns.c	(working copy)
@@ -942,19 +942,19 @@
 
         if ((port_type == ISNS_ESI_PORT) || (port_type == ISNS_SCN_PORT)) {
             if (isudp) {
-                conversation = find_conversation (&pinfo->src, &pinfo->dst, PT_UDP,
+                conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
                                                   port, 0, NO_PORT_B);
                 if (conversation == NULL) {
-                    conversation = conversation_new (&pinfo->src, &pinfo->dst,
+                    conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                                      PT_UDP, port, 0, NO_PORT2_FORCE);
                     conversation_set_dissector (conversation, isns_udp_handle);
                 }
             }
             else {
-                conversation = find_conversation (&pinfo->src, &pinfo->dst, PT_TCP,
+                conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_TCP,
                                                   port, 0, NO_PORT_B);
                 if (conversation == NULL) {
-                    conversation = conversation_new (&pinfo->src, &pinfo->dst,
+                    conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                                      PT_TCP, port, 0, NO_PORT2_FORCE);
                     conversation_set_dissector (conversation, isns_tcp_handle);
                 }
Index: epan/dissectors/packet-portmap.c
===================================================================
--- epan/dissectors/packet-portmap.c	(revision 13086)
+++ epan/dissectors/packet-portmap.c	(working copy)
@@ -123,9 +123,9 @@
 			port=tvb_get_ntohl(tvb, offset);
 			if(port){
 				conversation_t *conv;
-				conv=find_conversation(&pinfo->src, &pinfo->dst, (port_type)rpc_call->private_data, port, 0, NO_ADDR_B|NO_PORT_B);
+				conv=find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, (port_type)rpc_call->private_data, port, 0, NO_ADDR_B|NO_PORT_B);
 				if(!conv){
-					conv=conversation_new(&pinfo->src, &pinfo->dst, (port_type)rpc_call->private_data, port, 0, NO_ADDR2|NO_PORT2);
+					conv=conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, (port_type)rpc_call->private_data, port, 0, NO_ADDR2|NO_PORT2);
 				}
 				conversation_set_dissector(conv, rpc_handle);
 			}
Index: epan/dissectors/packet-dcm.c
===================================================================
--- epan/dissectors/packet-dcm.c	(revision 13086)
+++ epan/dissectors/packet-dcm.c	(working copy)
@@ -898,14 +898,14 @@
     guint32 len, tlen;
     dcmState_t *dcm_data = NULL;
 
-    conv = find_conversation(&pinfo->src, &pinfo->dst,
+    conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 	pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 
     if (NULL != conv) 	/* conversation exists */
 			/* do we have any data for this conversation ? */
 	dcm_data = conversation_get_proto_data(conv, proto_dcm);
     else
-	conv = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 	    pinfo->srcport, pinfo->destport, 0);
 
     if (NULL == dcm_data) {
@@ -950,7 +950,7 @@
     char *buf;
     int offset = 0;
 
-    if (NULL == (conv = find_conversation(&pinfo->src, &pinfo->dst,
+    if (NULL == (conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 	pinfo->ptype, pinfo->srcport, pinfo->destport, 0)))
 	return;  /* OOPS */
 
Index: epan/dissectors/packet-kerberos.c
===================================================================
--- epan/dissectors/packet-kerberos.c	(revision 13086)
+++ epan/dissectors/packet-kerberos.c	(working copy)
@@ -3044,10 +3044,10 @@
 	 * http://www.ietf.org/internet-drafts/draft-ietf-krb-wg-kerberos-clarifications-07.txt
 	 */
 	if (pinfo->destport == UDP_PORT_KERBEROS && pinfo->ptype == PT_UDP) {
-		conversation = find_conversation(&pinfo->src, &pinfo->dst, PT_UDP,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
 			pinfo->srcport, 0, NO_PORT_B);
 		if (conversation == NULL) {
-			conversation = conversation_new(&pinfo->src, &pinfo->dst, PT_UDP,
+			conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
 				pinfo->srcport, 0, NO_PORT2);
 			conversation_set_dissector(conversation, kerberos_handle_udp);
 		}
Index: epan/dissectors/packet-h225.c
===================================================================
--- epan/dissectors/packet-h225.c	(revision 13086)
+++ epan/dissectors/packet-h225.c	(working copy)
@@ -2221,9 +2221,9 @@
 		src_addr.len=4;
 		src_addr.data=(const guint8 *)&ipv4_address;
 
-		conv=find_conversation(&src_addr, &src_addr, PT_TCP, ipv4_port, ipv4_port, NO_ADDR_B|NO_PORT_B);
+		conv=find_conversation(pinfo->fd->num, &src_addr, &src_addr, PT_TCP, ipv4_port, ipv4_port, NO_ADDR_B|NO_PORT_B);
 		if(!conv){
-			conv=conversation_new(&src_addr, &src_addr, PT_TCP, ipv4_port, ipv4_port, NO_ADDR2|NO_PORT2);
+			conv=conversation_new(pinfo->fd->num, &src_addr, &src_addr, PT_TCP, ipv4_port, ipv4_port, NO_ADDR2|NO_PORT2);
 			conversation_set_dissector(conv, h245_handle);
 		}
 	}
@@ -12115,13 +12115,13 @@
 
 		msg_category = pi->msg_tag / 3;
 		if(pi->msg_tag % 3 == 0) {		/* Request Message */
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 				&pinfo->dst, pinfo->ptype, pinfo->srcport,
 				pinfo->destport, 0);
 
 			if (conversation == NULL) {
 				/* It's not part of any conversation - create a new one. */
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 				    pinfo->destport, 0);
 
@@ -12188,7 +12188,7 @@
   		/* end of request message handling*/
 		}
 		else { 					/* Confirm or Reject Message */
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
     				&pinfo->dst, pinfo->ptype, pinfo->srcport,
   				pinfo->destport, 0);
   			if (conversation != NULL) {
Index: epan/dissectors/packet-mysql.c
===================================================================
--- epan/dissectors/packet-mysql.c	(revision 13086)
+++ epan/dissectors/packet-mysql.c	(working copy)
@@ -251,12 +251,12 @@
 
 	gboolean	is_response;
 
-	conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
 	if (!conversation) {
 		/* create a new conversation */
-		conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 				pinfo->srcport, pinfo->destport, 0);
 	}
 
Index: epan/dissectors/packet-ftp.c
===================================================================
--- epan/dissectors/packet-ftp.c	(revision 13086)
+++ epan/dissectors/packet-ftp.c	(working copy)
@@ -462,7 +462,7 @@
 				 * "ftp_ip_address" and "server_port", and
 				 * wildcard everything else?
 				 */
-				conversation = find_conversation(&ftp_ip_address,
+				conversation = find_conversation(pinfo->fd->num, &ftp_ip_address,
 				    &pinfo->dst, PT_TCP, ftp_port, 0,
 				    NO_PORT_B);
 				if (conversation == NULL) {
@@ -489,7 +489,7 @@
 					 * and a new one was opened?
 					 */
 					conversation = conversation_new(
-					    &ftp_ip_address, &pinfo->dst,
+					    pinfo->fd->num, &ftp_ip_address, &pinfo->dst,
 					    PT_TCP, ftp_port, 0, NO_PORT2);
 					conversation_set_dissector(conversation,
 					    ftpdata_handle);
Index: epan/dissectors/packet-bittorrent.c
===================================================================
--- epan/dissectors/packet-bittorrent.c	(revision 13086)
+++ epan/dissectors/packet-bittorrent.c	(working copy)
@@ -221,7 +221,7 @@
 		return FALSE;
 	}
 
-	conversation = conversation_new (&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+	conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 
 	g_assert(find_dissector("bittorrent"));
 
Index: epan/dissectors/packet-ndps.c
===================================================================
--- epan/dissectors/packet-ndps.c	(revision 13086)
+++ epan/dissectors/packet-ndps.c	(working copy)
@@ -3818,13 +3818,13 @@
     if (!pinfo->fd->flags.visited) 
     {
         /* Lets see if this is a new conversation */
-        conversation = find_conversation(&pinfo->src, &pinfo->dst,
+        conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
             PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
     
         if (conversation == NULL) 
         {
             /* It's not part of any conversation - create a new one. */
-            conversation = conversation_new(&pinfo->src, &pinfo->dst,
+            conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
                 PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
             /* Create new request value hash */
             request_value = ndps_hash_insert(conversation, (guint32) pinfo->srcport);
@@ -4015,13 +4015,13 @@
         as being part of a single conversation so that we can
         let the user select that conversation to be displayed.) */
         
-        conversation = find_conversation(&pinfo->src, &pinfo->dst,
+        conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
             PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
 
         if (conversation == NULL) 
         {
             /* It's not part of any conversation - create a new one. */
-            conversation = conversation_new(&pinfo->src, &pinfo->dst,
+            conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
                 PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
         }
 
@@ -6247,7 +6247,7 @@
     
     if (!pinfo->fd->flags.visited) {
         /* Find the conversation whence the request would have come. */
-        conversation = find_conversation(&pinfo->src, &pinfo->dst,
+        conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
             PT_NCP, (guint32) pinfo->destport, (guint32) pinfo->destport, 0);
         if (conversation != NULL) {
             /* find the record telling us the request made that caused
Index: epan/dissectors/packet-beep.c
===================================================================
--- epan/dissectors/packet-beep.c	(revision 13086)
+++ epan/dissectors/packet-beep.c	(working copy)
@@ -870,10 +870,10 @@
 
   if (!frame_data) {
 
-    conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 				       pinfo->srcport, pinfo->destport, 0);
     if (conversation == NULL) { /* No conversation, create one */
-	conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 					pinfo->srcport, pinfo->destport, 0);
 
       }
Index: epan/dissectors/packet-ssh.c
===================================================================
--- epan/dissectors/packet-ssh.c	(revision 13086)
+++ epan/dissectors/packet-ssh.c	(working copy)
@@ -227,12 +227,12 @@
 	is_newdata = FALSE;
 	this_data = p_get_proto_data(pinfo->fd, proto_ssh);
 
-	conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
 	if (!conversation) {
 		/* create a new conversation */
-		conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 			pinfo->srcport, pinfo->destport, 0);
 	}
 
Index: epan/dissectors/packet-afp.c
===================================================================
--- epan/dissectors/packet-afp.c	(revision 13086)
+++ epan/dissectors/packet-afp.c	(working copy)
@@ -3313,12 +3313,12 @@
 	if (col_info)
 		col_clear(pinfo->cinfo, COL_INFO);
 
-	conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
 	if (conversation == NULL)
 	{
-		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 
Index: epan/dissectors/packet-wsp.c
===================================================================
--- epan/dissectors/packet-wsp.c	(revision 13086)
+++ epan/dissectors/packet-wsp.c	(working copy)
@@ -4506,10 +4506,10 @@
 			redir_address.len = 4;
 			redir_address.data = (const guint8 *)&address_ipv4;
 			/* Find a conversation based on redir_address and pinfo->dst */
-			conv = find_conversation(&redir_address, &pinfo->dst,
+			conv = find_conversation(pinfo->fd->num, &redir_address, &pinfo->dst,
 			    PT_UDP, port_num, 0, NO_PORT_B);
 			if (conv == NULL) { /* This conversation does not exist yet */
-				conv = conversation_new(&redir_address,
+				conv = conversation_new(pinfo->fd->num, &redir_address,
 				    &pinfo->dst, PT_UDP, port_num, 0, NO_PORT2);
 			}
 			/* Apply WSP dissection to the conversation */
@@ -4542,10 +4542,10 @@
 			redir_address.len = 16;
 			redir_address.data = (const guint8 *)&address_ipv4;
 			/* Find a conversation based on redir_address and pinfo->dst */
-			conv = find_conversation(&redir_address, &pinfo->dst,
+			conv = find_conversation(pinfo->fd->num, &redir_address, &pinfo->dst,
 			    PT_UDP, port_num, 0, NO_PORT_B);
 			if (conv == NULL) { /* This conversation does not exist yet */
-				conv = conversation_new(&redir_address,
+				conv = conversation_new(pinfo->fd->num, &redir_address,
 				    &pinfo->dst, PT_UDP, port_num, 0, NO_PORT2);
 			}
 			/* Apply WSP dissection to the conversation */
Index: epan/dissectors/packet-t38.c
===================================================================
--- epan/dissectors/packet-t38.c	(revision 13086)
+++ epan/dissectors/packet-t38.c	(working copy)
@@ -199,14 +199,14 @@
          * Check if the ip address and port combination is not
          * already registered as a conversation.
          */
-        p_conv = find_conversation( addr, &null_addr, PT_UDP, port, other_port,
+        p_conv = find_conversation( setup_frame_number, addr, &null_addr, PT_UDP, port, other_port,
                                 NO_ADDR_B | (!other_port ? NO_PORT_B : 0));
 
         /*
          * If not, create a new conversation.
          */
-        if ( ! p_conv ) {
-                p_conv = conversation_new( addr, &null_addr, PT_UDP,
+        if ( !p_conv || p_conv->setup_frame != setup_frame_number) {
+                p_conv = conversation_new( setup_frame_number, addr, &null_addr, PT_UDP,
                                            (guint32)port, (guint32)other_port,
                                                                    NO_ADDR2 | (!other_port ? NO_PORT2 : 0));
         }
@@ -892,7 +892,7 @@
         if (!p_conv_data)
         {
                 /* First time, get info from conversation */
-                p_conv = find_conversation(&pinfo->net_src, &pinfo->net_dst,
+                p_conv = find_conversation(pinfo->fd->num, &pinfo->net_src, &pinfo->net_dst,
                                    pinfo->ptype,
                                    pinfo->srcport, pinfo->destport, NO_ADDR_B);
                 if (p_conv)
Index: epan/dissectors/packet-eap.c
===================================================================
--- epan/dissectors/packet-eap.c	(revision 13086)
+++ epan/dissectors/packet-eap.c	(working copy)
@@ -647,21 +647,21 @@
    * keep them separate?  (Or is that not going to happen?)
    */
   if (pinfo->destport == pinfo->match_port) {
-    conversation = find_conversation(&pinfo->dst, &pinfo->src,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->dst, &pinfo->src,
 				     pinfo->ptype, pinfo->destport,
 				     0, NO_PORT_B);
   } else {
-    conversation = find_conversation(&pinfo->src, &pinfo->dst,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				     pinfo->ptype, pinfo->srcport,
 				     0, NO_PORT_B);
   }
   if (conversation == NULL) {
     if (pinfo->destport == pinfo->match_port) {
-      conversation = conversation_new(&pinfo->dst, &pinfo->src,
+      conversation = conversation_new(pinfo->fd->num, &pinfo->dst, &pinfo->src,
 				      pinfo->ptype, pinfo->destport,
 				      0, NO_PORT2);
     } else {
-      conversation = conversation_new(&pinfo->src, &pinfo->dst,
+      conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				      pinfo->ptype, pinfo->srcport,
 				      0, NO_PORT2);
     }
Index: epan/dissectors/packet-ldap.c
===================================================================
--- epan/dissectors/packet-ldap.c	(revision 13086)
+++ epan/dissectors/packet-ldap.c	(working copy)
@@ -2374,12 +2374,12 @@
   /*
    * Do we have a conversation for this connection?
    */
-  conversation = find_conversation(&pinfo->src, &pinfo->dst,
+  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                    pinfo->ptype, pinfo->srcport,
                                    pinfo->destport, 0);
   if (conversation == NULL) {
     /* We don't yet have a conversation, so create one. */
-    conversation = conversation_new(&pinfo->src, &pinfo->dst,
+    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                     pinfo->ptype, pinfo->srcport,
                                     pinfo->destport, 0);
   }
Index: epan/dissectors/packet-smb.c
===================================================================
--- epan/dissectors/packet-smb.c	(revision 13086)
+++ epan/dissectors/packet-smb.c	(working copy)
@@ -14594,11 +14594,11 @@
 
 	/* find which conversation we are part of and get the tables for that
 	   conversation*/
-	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		 pinfo->ptype,  pinfo->srcport, pinfo->destport, 0);
 	if(!conversation){
 		/* OK this is a new conversation so lets create it */
-		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 	/* see if we already have the smb data for this conversation */
Index: epan/dissectors/packet-xyplex.c
===================================================================
--- epan/dissectors/packet-xyplex.c	(revision 13086)
+++ epan/dissectors/packet-xyplex.c	(working copy)
@@ -115,10 +115,10 @@
 		 * requestiong server and the Xyplex host using the
 		 * return_port.
 		 */
-		conversation = find_conversation(&pinfo->src, &pinfo->dst,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				  PT_TCP, return_port, 0, NO_PORT_B);
 		if (conversation == NULL) {
-		    conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 				    PT_TCP, return_port, 0, NO_PORT2);
 		    conversation_set_dissector(conversation, xyplex_handle);
 		}
Index: epan/dissectors/packet-smtp.c
===================================================================
--- epan/dissectors/packet-smtp.c	(revision 13086)
+++ epan/dissectors/packet-smtp.c	(working copy)
@@ -177,10 +177,10 @@
 
     if (!frame_data) {
 
-      conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+      conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 				       pinfo->srcport, pinfo->destport, 0);
       if (conversation == NULL) { /* No conversation, create one */
-	conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 					pinfo->srcport, pinfo->destport, 0);
 
       }
Index: epan/dissectors/packet-sdp.c
===================================================================
--- epan/dissectors/packet-sdp.c	(revision 13086)
+++ epan/dissectors/packet-sdp.c	(working copy)
@@ -207,7 +207,8 @@
 
 	guint32 	port=0;
 	gboolean 	is_rtp=FALSE;
-	gboolean        is_t38=FALSE;
+	gboolean 	is_t38=FALSE;
+	gboolean 	set_rtp=FALSE;
 	gboolean 	is_ipv4_addr=FALSE;
 	gboolean	is_ipv6_addr=FALSE;
     guint32 	ipaddr[4];
@@ -399,12 +400,13 @@
 				}
 		    }
 	    }
-	    /* Add rtp and rtcp conversation, if available */
+	    /* Add rtp and rtcp conversation, if available (overrides t38 if conversation already set) */
 	    if((!pinfo->fd->flags.visited) && port!=0 && is_rtp && (is_ipv4_addr || is_ipv6_addr)){
 		    src_addr.data=(char *)&ipaddr;
 		    if(rtp_handle){
 				rtp_add_address(pinfo, &src_addr, port, 0,
 	                "SDP", pinfo->fd->num);
+				set_rtp = TRUE;
 		    }
 		    if(rtcp_handle){
 				port++;
@@ -413,8 +415,8 @@
 		    }
 	    }
 			
-	    /* Add t38 conversation, if available */
-	    if((!pinfo->fd->flags.visited) && port!=0 && is_t38 && is_ipv4_addr){
+	    /* Add t38 conversation, if available and only if no rtp */
+	    if((!pinfo->fd->flags.visited) && port!=0 && !set_rtp && is_t38 && is_ipv4_addr){
                     src_addr.data=(char *)&ipaddr;
                     if(t38_handle){
                                 t38_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num);
Index: epan/dissectors/packet-atalk.c
===================================================================
--- epan/dissectors/packet-atalk.c	(revision 13086)
+++ epan/dissectors/packet-atalk.c	(working copy)
@@ -759,12 +759,12 @@
   aspinfo.code = 0;
   query = (!aspinfo.reply && !aspinfo.release);
 
-  conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
   if (conversation == NULL)
   {
-	conversation = conversation_new(&pinfo->src, &pinfo->dst,
+	conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
   }
 
@@ -1117,12 +1117,12 @@
   asp_request_val *request_val;
   guint8 fn;
 
-  conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
   if (conversation == NULL)
   {
-	conversation = conversation_new(&pinfo->src, &pinfo->dst,
+	conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
   }
 
Index: epan/dissectors/packet-tcp.c
===================================================================
--- epan/dissectors/packet-tcp.c	(revision 13086)
+++ epan/dissectors/packet-tcp.c	(working copy)
@@ -289,9 +289,9 @@
 	struct tcp_analysis *tcpd=NULL;
 
 	/* Have we seen this conversation before? */
-	if( (conv=find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0)) == NULL){
+	if( (conv=find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0)) == NULL){
 		/* No this is a new conversation. */
-		conv=conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+		conv=conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 
 	/* check if we have any data for this conversation */
Index: epan/dissectors/packet-fcsb3.c
===================================================================
--- epan/dissectors/packet-fcsb3.c	(revision 13086)
+++ epan/dissectors/packet-fcsb3.c	(working copy)
@@ -780,7 +780,7 @@
     }
     
     /* Retrieve conversation state to determine expected payload */
-    conversation = find_conversation (&pinfo->src, &pinfo->dst,
+    conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                       PT_SBCCS, ch_cu_id, dev_addr, 0);
                                       
     if (conversation) {
@@ -791,7 +791,7 @@
     }
     else if ((type == FC_SBCCS_IU_CMD_HDR) || 
              (type != FC_SBCCS_IU_CMD_DATA)) {
-        conversation = conversation_new (&pinfo->src, &pinfo->dst,
+        conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                          PT_SBCCS, ch_cu_id, dev_addr, 0);
         task_key.conv_id = conversation->index;
         task_key.task_id = ccw;
Index: epan/dissectors/packet-tuxedo.c
===================================================================
--- epan/dissectors/packet-tuxedo.c	(revision 13086)
+++ epan/dissectors/packet-tuxedo.c	(working copy)
@@ -154,10 +154,10 @@
 		{
 			/* Register this dissector for this conversation */
 			conversation_t  *conversation = NULL;
-			conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 			if (conversation == NULL) 
 			{
-				conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 			}
 			conversation_set_dissector(conversation, tuxedo_handle);
 
Index: epan/dissectors/packet-fcswils.c
===================================================================
--- epan/dissectors/packet-fcswils.c	(revision 13086)
+++ epan/dissectors/packet-fcswils.c	(working copy)
@@ -1476,11 +1476,11 @@
 
     /* Register conversation if this is not a response */
     if ((opcode != FC_SWILS_SWACC) && (opcode != FC_SWILS_SWRJT)) {
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         if (!conversation) {
-            conversation = conversation_new (&pinfo->src, &pinfo->dst,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                              pinfo->ptype, pinfo->oxid,
                                              pinfo->rxid, NO_PORT2);
         }
@@ -1508,7 +1508,7 @@
     }
     else {
         /* Opcode is ACC or RJT */
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         isreq = FC_SWILS_RPLY;
Index: epan/dissectors/packet-ncp2222.inc
===================================================================
--- epan/dissectors/packet-ncp2222.inc	(revision 13086)
+++ epan/dissectors/packet-ncp2222.inc	(working copy)
@@ -4129,7 +4129,7 @@
     /* Has this already been dissected? */
     if (!pinfo->fd->flags.visited) {
       	/* Find the conversation whence the request would have come. */
-       	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+       	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
        		    PT_NCP, nw_connection, nw_connection, 0);
        	if (conversation != NULL) {
        		/* find the record telling us the request made that caused
@@ -4438,12 +4438,12 @@
 		   to have all packets over the same connection treated
 		   as being part of a single conversation so that we can
 		   let the user select that conversation to be displayed.) */
-		conversation = find_conversation(&pinfo->src, &pinfo->dst,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		    PT_NCP, nw_connection, nw_connection, 0);
 
 		if (conversation == NULL) {
 			/* It's not part of any conversation - create a new one. */
-			conversation = conversation_new(&pinfo->src, &pinfo->dst,
+			conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			    PT_NCP, nw_connection, nw_connection, 0);
 		}
 		request_value = ncp_hash_insert(conversation, sequence, ncp_rec);
@@ -4596,7 +4596,7 @@
                         
                         if (!request_value)
                         {
-        		        conversation = find_conversation(&pinfo->src, &pinfo->dst,
+        		        conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
         			    PT_NCP, nw_connection, nw_connection, 0);
         		        if (conversation != NULL) {
         			        /* find the record telling us the request made that caused
@@ -4736,7 +4736,7 @@
 	
 	if (!pinfo->fd->flags.visited) {
 		/* Find the conversation whence the request would have come. */
-		conversation = find_conversation(&pinfo->src, &pinfo->dst,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			    PT_NCP, nw_connection, nw_connection, 0);
 		if (conversation != NULL) {
 			/* find the record telling us the request made that caused
@@ -8198,11 +8198,11 @@
            as being part of a single conversation so that we can
            let the user select that conversation to be displayed.) */
 
-        conversation = find_conversation(&pinfo->src, &pinfo->dst,
+        conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
         	    PT_NCP, nw_connection, nw_connection, 0);
        	if (conversation == NULL) {
        		/* It's not part of any conversation - create a new one. */
-       		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+       		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
        		    PT_NCP, nw_connection, nw_connection, 0);
 	}
                 
@@ -8471,13 +8471,13 @@
    		as being part of a single conversation so that we can
    	        let the user select that conversation to be displayed.) */
                 
-       		conversation = find_conversation(&pinfo->src, &pinfo->dst,
+       		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
        		    PT_NCP, nw_connection, nw_connection, 0);
         
        		if (conversation == NULL) 
                 {
        			/* It's not part of any conversation - create a new one. */
-       			conversation = conversation_new(&pinfo->src, &pinfo->dst,
+       			conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
        			    PT_NCP, nw_connection, nw_connection, 0);
        		}
                 
Index: epan/dissectors/packet-aoe.c
===================================================================
--- epan/dissectors/packet-aoe.c	(revision 13086)
+++ epan/dissectors/packet-aoe.c	(working copy)
@@ -226,12 +226,12 @@
   conversation_t *conversation;
 
   /* only create a conversation for ATA commands */
-  conversation = find_conversation(&pinfo->src, &pinfo->dst,
+  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                    pinfo->ptype, pinfo->srcport,
                                    pinfo->destport, 0);
   if (conversation == NULL) {
     /* We don't yet have a conversation, so create one. */
-    conversation = conversation_new(&pinfo->src, &pinfo->dst,
+    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                     pinfo->ptype, pinfo->srcport,
                                     pinfo->destport, 0);
   }
Index: epan/dissectors/packet-rtcp.c
===================================================================
--- epan/dissectors/packet-rtcp.c	(revision 13086)
+++ epan/dissectors/packet-rtcp.c	(working copy)
@@ -284,14 +284,14 @@
 	 * Check if the ip address and port combination is not
 	 * already registered as a conversation.
 	 */
-	p_conv = find_conversation( addr, &null_addr, PT_UDP, port, other_port,
+	p_conv = find_conversation( pinfo->fd->num, addr, &null_addr, PT_UDP, port, other_port,
 	                            NO_ADDR_B | (!other_port ? NO_PORT_B : 0));
 
 	/*
 	 * If not, create a new conversation.
 	 */
 	if ( ! p_conv ) {
-		p_conv = conversation_new( addr, &null_addr, PT_UDP,
+		p_conv = conversation_new( pinfo->fd->num, addr, &null_addr, PT_UDP,
 		                           (guint32)port, (guint32)other_port,
 		                           NO_ADDR2 | (!other_port ? NO_PORT2 : 0));
 	}
@@ -867,7 +867,7 @@
 	if (!p_conv_data)
 	{
 		/* First time, get info from conversation */
-		p_conv = find_conversation(&pinfo->net_dst, &pinfo->net_src,
+		p_conv = find_conversation(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src,
 		                           pinfo->ptype,
 		                           pinfo->destport, pinfo->srcport, NO_ADDR_B);
 
@@ -950,14 +950,14 @@
 	/* First time, get info from conversation.
 	   Even though we think of this as an outgoing packet being sent,
 	   we store the time as being received by the destination. */
-	p_conv = find_conversation(&pinfo->net_dst, &pinfo->net_src,
+	p_conv = find_conversation(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src,
 	                           pinfo->ptype,
 	                           pinfo->destport, pinfo->srcport, NO_ADDR_B);
 
 	/* If the conversation doesn't exist, create it now. */
 	if (!p_conv)
 	{
-		p_conv = conversation_new(&pinfo->net_dst, &pinfo->net_src, PT_UDP,
+		p_conv = conversation_new(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src, PT_UDP,
 		                          pinfo->destport, pinfo->srcport,
 		                          NO_ADDR2);
 		if (!p_conv)
@@ -1056,7 +1056,7 @@
 	/********************************************************************/
 	/* Look for captured timestamp of last SR in conversation of sender */
 	/* of this packet                                                   */
-	p_conv = find_conversation(&pinfo->net_src, &pinfo->net_dst,
+	p_conv = find_conversation(pinfo->fd->num, &pinfo->net_src, &pinfo->net_dst,
 	                           pinfo->ptype,
 	                           pinfo->srcport, pinfo->destport, NO_ADDR_B);
 	if (!p_conv)
Index: epan/dissectors/packet-afs.c
===================================================================
--- epan/dissectors/packet-afs.c	(revision 13086)
+++ epan/dissectors/packet-afs.c	(working copy)
@@ -216,11 +216,11 @@
 	 * packets from A:X to B:Y as being part of the same conversation as
 	 * packets from B:Y to A:X.
 	 */
-	conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 	    pinfo->srcport, pinfo->destport, 0);
 	if (conversation == NULL) {
 		/* It's not part of any conversation - create a new one. */
-		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 
Index: epan/dissectors/packet-iscsi.c
===================================================================
--- epan/dissectors/packet-iscsi.c	(revision 13086)
+++ epan/dissectors/packet-iscsi.c	(working copy)
@@ -1789,11 +1789,11 @@
 	}
 
 	/* make sure we have a conversation for this session */
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->srcport,
                                           pinfo->destport, 0);
         if (!conversation) {
-            conversation = conversation_new (&pinfo->src, &pinfo->dst,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                              pinfo->ptype, pinfo->srcport,
                                              pinfo->destport, 0);
             iscsi_session=g_mem_chunk_alloc(iscsi_sessions);
Index: epan/dissectors/packet-rlogin.c
===================================================================
--- epan/dissectors/packet-rlogin.c	(revision 13086)
+++ epan/dissectors/packet-rlogin.c	(working copy)
@@ -338,11 +338,11 @@
 	gint ti_offset;
 
 						/* Lookup this connection*/
-	conversation = find_conversation( &pinfo->src, &pinfo->dst,
+	conversation = find_conversation( pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 
 	if ( !conversation) {
-		conversation = conversation_new( &pinfo->src, &pinfo->dst,
+		conversation = conversation_new( pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 	hash_info = conversation_get_proto_data(conversation, proto_rlogin);
Index: epan/dissectors/packet-dcerpc.c
===================================================================
--- epan/dissectors/packet-dcerpc.c	(revision 13086)
+++ epan/dissectors/packet-dcerpc.c	(working copy)
@@ -2412,10 +2412,10 @@
       }
 
       if (!saw_ctx_item) {
-        conv = find_conversation (&pinfo->src, &pinfo->dst, pinfo->ptype,
+        conv = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                   pinfo->srcport, pinfo->destport, 0);
         if (conv == NULL) {
-            conv = conversation_new (&pinfo->src, &pinfo->dst, pinfo->ptype,
+            conv = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                      pinfo->srcport, pinfo->destport, 0);
         }
 
@@ -2914,6 +2914,7 @@
     conversation_t *conv;
 
     conv = find_conversation (
+        0, 
         &binding->addr_a, 
         &binding->addr_b, 
         binding->ptype, 
@@ -2923,6 +2924,7 @@
 
     if (!conv) {
         conv = conversation_new (
+            0, 
             &binding->addr_a, 
             &binding->addr_b, 
             binding->ptype, 
@@ -3014,7 +3016,7 @@
      */
     dissect_dcerpc_cn_auth (tvb, offset, pinfo, dcerpc_tree, hdr, FALSE, &auth_info);
 
-    conv = find_conversation (&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conv = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                               pinfo->srcport, pinfo->destport, 0);
     if (!conv)
         show_stub_data (tvb, offset, dcerpc_tree, &auth_info, TRUE);
@@ -3159,7 +3161,7 @@
      */
     dissect_dcerpc_cn_auth (tvb, offset, pinfo, dcerpc_tree, hdr, FALSE, &auth_info);
 
-    conv = find_conversation (&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conv = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                               pinfo->srcport, pinfo->destport, 0);
 
     if (!conv) {
@@ -3280,7 +3282,7 @@
      */
     dissect_dcerpc_cn_auth (tvb, offset, pinfo, dcerpc_tree, hdr, FALSE, &auth_info);
 
-    conv = find_conversation (&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conv = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                               pinfo->srcport, pinfo->destport, 0);
     if (!conv) {
         /* no point in creating one here, really */
@@ -4498,10 +4500,10 @@
      * activity_id and seqnum.  I haven't seen anywhere that it would
      * make a difference, but for future reference...
      */
-    conv = find_conversation (&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conv = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                               pinfo->srcport, pinfo->destport, 0);
     if (!conv) {
-        conv = conversation_new (&pinfo->src, &pinfo->dst, pinfo->ptype,
+        conv = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                  pinfo->srcport, pinfo->destport, 0);
     }
 
Index: epan/dissectors/packet-ssl.c
===================================================================
--- epan/dissectors/packet-ssl.c	(revision 13086)
+++ epan/dissectors/packet-ssl.c	(working copy)
@@ -843,12 +843,12 @@
      *       the conv_version, must set the copy in the conversation
      *       in addition to conv_version
      */
-    conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                      pinfo->srcport, pinfo->destport, 0);
     if (!conversation)
     {
         /* create a new conversation */
-        conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+        conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                         pinfo->srcport, pinfo->destport, 0);
     }
     conv_data = conversation_get_proto_data(conversation, proto_ssl);
@@ -2841,13 +2841,13 @@
         return;
     }
 
-    conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                      pinfo->srcport, pinfo->destport, 0);
 
     if (conversation == NULL)
     {
         /* create a new conversation */
-        conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+        conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                                         pinfo->srcport, pinfo->destport, 0);
     }
 
Index: epan/dissectors/packet-ajp13.c
===================================================================
--- epan/dissectors/packet-ajp13.c	(revision 13086)
+++ epan/dissectors/packet-ajp13.c	(working copy)
@@ -640,10 +640,10 @@
   /* conversational state really only does us good during the first
    * in-order traversal
    */
-  conv = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+  conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                            pinfo->srcport, pinfo->destport, 0);
   if (!conv) {
-    conv = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype,
+    conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
                             pinfo->srcport, pinfo->destport, 0);
   }
   cd = (ajp13_conv_data*)conversation_get_proto_data(conv, proto_ajp13);
Index: epan/dissectors/packet-rpc.c
===================================================================
--- epan/dissectors/packet-rpc.c	(revision 13086)
+++ epan/dissectors/packet-rpc.c	(working copy)
@@ -1391,7 +1391,7 @@
 		   NFS client *cough) might send retransmissions from a
 		   different port from the original request. */
 		if (pinfo->ptype == PT_TCP) {
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 			    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 			    pinfo->destport, 0);
 		} else {
@@ -1400,7 +1400,7 @@
 			 * pointer for the second address argument even
 			 * if you use NO_ADDR_B.
 			 */
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 			    &null_address, pinfo->ptype, pinfo->destport,
 			    0, NO_ADDR_B|NO_PORT_B);
 		}
@@ -1412,11 +1412,11 @@
 			   created a conversation for it in the RPC
 			   dissector. */
 			if (pinfo->ptype == PT_TCP) {
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 				    pinfo->destport, 0);
 			} else {
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &null_address, pinfo->ptype, pinfo->destport,
 				    0, NO_ADDR2|NO_PORT2);
 			}
@@ -1528,7 +1528,7 @@
 	   NFS client *cough) might send retransmissions from a
 	   different port from the original request. */
 	if (pinfo->ptype == PT_TCP) {
-		conversation = find_conversation(&pinfo->src, &pinfo->dst,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	} else {
 		/*
@@ -1536,7 +1536,7 @@
 		 * pointer for the second address argument even
 		 * if you use NO_ADDR_B.
 		 */
-		conversation = find_conversation(&pinfo->dst, &null_address,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->dst, &null_address,
 		    pinfo->ptype, pinfo->srcport, 0, NO_ADDR_B|NO_PORT_B);
 	}
 	if (conversation == NULL) {
@@ -1804,7 +1804,7 @@
 		   NFS client *cough) might send retransmissions from a
 		   different port from the original request. */
 		if (pinfo->ptype == PT_TCP) {
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 			    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 			    pinfo->destport, 0);
 		} else {
@@ -1813,7 +1813,7 @@
 			 * pointer for the second address argument even
 			 * if you use NO_ADDR_B.
 			 */
-			conversation = find_conversation(&pinfo->dst,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->dst,
 			    &null_address, pinfo->ptype, pinfo->srcport,
 			    0, NO_ADDR_B|NO_PORT_B);
 		}
@@ -2039,7 +2039,7 @@
 		   NFS client *cough) might send retransmissions from a
 		   different port from the original request. */
 		if (pinfo->ptype == PT_TCP) {
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 			    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 			    pinfo->destport, 0);
 		} else {
@@ -2048,7 +2048,7 @@
 			 * pointer for the second address argument even
 			 * if you use NO_ADDR_B.
 			 */
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 			    &null_address, pinfo->ptype, pinfo->destport,
 			    0, NO_ADDR_B|NO_PORT_B);
 		}
@@ -2056,11 +2056,11 @@
 			/* It's not part of any conversation - create a new
 			   one. */
 			if (pinfo->ptype == PT_TCP) {
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &pinfo->dst, pinfo->ptype, pinfo->srcport,
 				    pinfo->destport, 0);
 			} else {
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &null_address, pinfo->ptype, pinfo->destport,
 				    0, NO_ADDR2|NO_PORT2);
 			}
@@ -2920,13 +2920,13 @@
 	 * one, create it.  We know this is running over TCP, so the
 	 * conversation should not wildcard either address or port.
 	 */
-	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 	    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	if (conversation == NULL) {
 		/*
 		 * It's not part of any conversation - create a new one.
 		 */
-		conversation = conversation_new(&pinfo->src, &pinfo->dst,
+		conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 	old_rfk.conv_id = conversation->index;
Index: epan/dissectors/packet-msproxy.c
===================================================================
--- epan/dissectors/packet-msproxy.c	(revision 13086)
+++ epan/dissectors/packet-msproxy.c	(working copy)
@@ -203,7 +203,7 @@
 	proto_tree      *msp_tree;
 	proto_item      *ti;
 
-	conversation = find_conversation( &pinfo->src, &pinfo->dst,
+	conversation = find_conversation( pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 
 	g_assert( conversation);	/* should always find a conversation */
@@ -279,12 +279,12 @@
 		return;
 	}
 
-	conversation = find_conversation( &pinfo->src,
+	conversation = find_conversation( pinfo->fd->num, &pinfo->src,
 		&pinfo->dst, hash_info->proto, hash_info->server_int_port,
 		hash_info->clnt_port, 0);
 
 	if ( !conversation) {
-		conversation = conversation_new( &pinfo->src, &pinfo->dst,
+		conversation = conversation_new( pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			hash_info->proto, hash_info->server_int_port,
 			hash_info->clnt_port, 0);
 	}
@@ -1099,11 +1099,11 @@
 	if (check_col(pinfo->cinfo, COL_INFO))
 		col_clear(pinfo->cinfo, COL_INFO);
 
-	conversation = find_conversation( &pinfo->src, &pinfo->dst,
+	conversation = find_conversation( pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 
 	if ( !conversation) {
-		conversation = conversation_new( &pinfo->src, &pinfo->dst,
+		conversation = conversation_new( pinfo->fd->num, &pinfo->src, &pinfo->dst,
 			pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 	hash_info = conversation_get_proto_data(conversation, proto_msproxy);
Index: epan/dissectors/packet-fcp.c
===================================================================
--- epan/dissectors/packet-fcp.c	(revision 13086)
+++ epan/dissectors/packet-fcp.c	(working copy)
@@ -262,11 +262,11 @@
     /* by the data that is sent back or sent next by the initiator as part */
     /* of this command. The state is destroyed in the response dissector */
     
-    conversation = find_conversation (&pinfo->src, &pinfo->dst,
+    conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                       pinfo->ptype, pinfo->oxid,
                                       pinfo->rxid, NO_PORT2);
     if (!conversation) {
-        conversation = conversation_new (&pinfo->src, &pinfo->dst,
+        conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                          pinfo->ptype, pinfo->oxid,
                                          pinfo->rxid, NO_PORT2);
     }
@@ -353,7 +353,7 @@
     scsi_task_id_t task_key;
 
     /* Retrieve conversation state to determine expected payload */
-    conversation = find_conversation (&pinfo->src, &pinfo->dst,
+    conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                       pinfo->ptype, pinfo->oxid,
                                       pinfo->rxid, NO_PORT2);
     if (conversation) {
@@ -410,7 +410,7 @@
     }
 
     /* Response marks the end of the conversation. So destroy state */
-    conversation = find_conversation (&pinfo->src, &pinfo->dst,
+    conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                       pinfo->ptype, pinfo->oxid,
                                       pinfo->rxid, NO_PORT2);
     if (conversation) {
@@ -494,11 +494,11 @@
     fcp_conv_key_t ckey, *req_key;
 
     /* Retrieve conversation state to determine expected payload */
-    conversation = find_conversation (&pinfo->src, &pinfo->dst,
+    conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                       pinfo->ptype, pinfo->oxid,
                                       pinfo->rxid, NO_PORT2);
     if (!conversation) {
-        conversation = conversation_new (&pinfo->src, &pinfo->dst,
+        conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                          pinfo->ptype, pinfo->oxid,
                                          pinfo->rxid, NO_PORT2);
     }
Index: epan/dissectors/packet-mq.c
===================================================================
--- epan/dissectors/packet-mq.c	(revision 13086)
+++ epan/dissectors/packet-mq.c	(working copy)
@@ -2433,10 +2433,10 @@
 		{
 			/* Register this dissector for this conversation */
 			conversation_t  *conversation = NULL;
-			conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 			if (conversation == NULL) 
 			{
-				conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 			}
 			if (iProto == MQ_XPT_TCP) conversation_set_dissector(conversation, mq_tcp_handle); 
 
Index: epan/dissectors/packet-tftp.c
===================================================================
--- epan/dissectors/packet-tftp.c	(revision 13086)
+++ epan/dissectors/packet-tftp.c	(working copy)
@@ -115,10 +115,10 @@
 	 * wildcarded, and give it the TFTP dissector as a dissector.
 	 */
 	if (pinfo->destport == UDP_PORT_TFTP) {
-	  conversation = find_conversation(&pinfo->src, &pinfo->dst, PT_UDP,
+	  conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
 					   pinfo->srcport, 0, NO_PORT_B);
 	  if (conversation == NULL) {
-	    conversation = conversation_new(&pinfo->src, &pinfo->dst, PT_UDP,
+	    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, PT_UDP,
 					    pinfo->srcport, 0, NO_PORT2);
 	    conversation_set_dissector(conversation, tftp_handle);
 	  }
Index: epan/dissectors/packet-ncp.c
===================================================================
--- epan/dissectors/packet-ncp.c	(revision 13086)
+++ epan/dissectors/packet-ncp.c	(working copy)
@@ -355,7 +355,7 @@
 		 * packets we will be able to determine if we need 
 		 * to also dissect with a signature.
 		 */
-		conversation = find_conversation(&pinfo->src, &pinfo->dst,
+		conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		    PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->destport,
 		    0);
 		if ((ncpiph.length & 0x80000000) ||
@@ -382,7 +382,7 @@
 					/* It's not part of any conversation
 					 * - create a new one.
 					 */
-					conversation = conversation_new(&pinfo->src,
+					conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 					    &pinfo->dst, PT_NCP,
 					    (guint32) pinfo->srcport,
 					    (guint32) pinfo->destport, 0);
@@ -443,7 +443,7 @@
 					/* It's not part of any conversation
 					 * - create a new one.
 					 */
-					conversation = conversation_new(&pinfo->src,
+					conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 					    &pinfo->dst, PT_NCP,
 					    (guint32) pinfo->srcport,
 					    (guint32) pinfo->destport, 0);
Index: epan/dissectors/packet-socks.c
===================================================================
--- epan/dissectors/packet-socks.c	(revision 13086)
+++ epan/dissectors/packet-socks.c	(working copy)
@@ -376,7 +376,7 @@
 	proto_tree      *socks_tree;
 	proto_item      *ti;
 
-	conversation = find_conversation( &pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = find_conversation( pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
 	g_assert( conversation);	/* should always find a conversation */
@@ -435,7 +435,7 @@
 static void
 new_udp_conversation( socks_hash_entry_t *hash_info, packet_info *pinfo){
 
-	conversation_t *conversation = conversation_new( &pinfo->src, &pinfo->dst,  PT_UDP,
+	conversation_t *conversation = conversation_new( pinfo->fd->num, &pinfo->src, &pinfo->dst,  PT_UDP,
 			hash_info->udp_port, hash_info->port, 0);
 
 	g_assert( conversation);
@@ -1000,11 +1000,11 @@
 		return;
 	}
 
-	conversation = find_conversation( &pinfo->src, &pinfo->dst, pinfo->ptype,
+	conversation = find_conversation( pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 		pinfo->srcport, pinfo->destport, 0);
 
 	if ( !conversation){
-		conversation = conversation_new( &pinfo->src, &pinfo->dst, pinfo->ptype,
+		conversation = conversation_new( pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
 			pinfo->srcport, pinfo->destport, 0);
 	}
 	hash_info = conversation_get_proto_data(conversation,proto_socks);
Index: epan/dissectors/packet-gssapi.c
===================================================================
--- epan/dissectors/packet-gssapi.c	(revision 13086)
+++ epan/dissectors/packet-gssapi.c	(working copy)
@@ -167,7 +167,7 @@
 	 * We need this later, so lets get it now ...
 	 */
 
-	conversation = find_conversation(&pinfo->src, &pinfo->dst,
+	conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 					 pinfo->ptype, pinfo->srcport,
 					 pinfo->destport, 0);
 
@@ -334,7 +334,7 @@
 		 */
 
 		if (!conversation) { /* Create one */
-		  conversation = conversation_new(&pinfo->src,
+		  conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 						  &pinfo->dst, 
 						  pinfo->ptype, 
 						  pinfo->srcport, 
Index: epan/dissectors/packet-fcels.c
===================================================================
--- epan/dissectors/packet-fcels.c	(revision 13086)
+++ epan/dissectors/packet-fcels.c	(working copy)
@@ -1531,12 +1531,12 @@
         else {
             options = NO_PORT2;
         }
-        conversation = find_conversation (&pinfo->dst, &pinfo->src,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->dst, &pinfo->src,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, options);
             
         if (!conversation) {
-            conversation = conversation_new (&pinfo->dst, &pinfo->src,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->dst, &pinfo->src,
                                              pinfo->ptype, pinfo->oxid,
                                              pinfo->rxid, options);
         }
@@ -1566,7 +1566,7 @@
         isreq = FC_ELS_RPLY;
 
         options = NO_PORT2;
-        conversation = find_conversation (&pinfo->dst, &pinfo->src,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->dst, &pinfo->src,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, options);
         if (!conversation) {
@@ -1576,7 +1576,7 @@
             addrdata[0] = addrdata[1] = 0;
             addrdata[2] = pinfo->dst.data[2];
             SET_ADDRESS (&dstaddr, AT_FC, 3, addrdata);
-            conversation = find_conversation (&dstaddr, &pinfo->src,
+            conversation = find_conversation (pinfo->fd->num, &dstaddr, &pinfo->src,
                                               pinfo->ptype, pinfo->oxid,
                                               pinfo->rxid, options);
         }
@@ -1584,7 +1584,7 @@
         if (!conversation) {
             /* Finally check for FLOGI with both NO_PORT2 and NO_ADDR2 set */
             options = NO_ADDR2 | NO_PORT2;
-            conversation = find_conversation (&pinfo->src, &pinfo->dst,
+            conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                               pinfo->ptype, pinfo->oxid,
                                               pinfo->rxid, options);
             if (!conversation) {
Index: epan/dissectors/packet-tds.c
===================================================================
--- epan/dissectors/packet-tds.c	(revision 13086)
+++ epan/dissectors/packet-tds.c	(working copy)
@@ -1930,13 +1930,13 @@
 	 * OK, it passes the test; assume the rest of this conversation
 	 * is TDS.
 	 */
-	conv = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype,
+	conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
             pinfo->srcport, pinfo->destport, 0);
         if (conv == NULL) {
         	/*
         	 * No conversation exists yet - create one.
         	 */
-		conv = conversation_new(&pinfo->src, &pinfo->dst,
+		conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
 		    pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
 	}
 	conversation_set_dissector(conv, tds_tcp_handle);
Index: epan/dissectors/packet-fcdns.c
===================================================================
--- epan/dissectors/packet-fcdns.c	(revision 13086)
+++ epan/dissectors/packet-fcdns.c	(working copy)
@@ -1509,11 +1509,11 @@
     }
 
     if ((opcode != FCCT_MSG_ACC) && (opcode != FCCT_MSG_RJT)) {
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         if (!conversation) {
-            conversation = conversation_new (&pinfo->src, &pinfo->dst,
+            conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                              pinfo->ptype, pinfo->oxid,
                                              pinfo->rxid, NO_PORT2);
         }
@@ -1545,7 +1545,7 @@
     }
     else {
         /* Opcode is ACC or RJT */
-        conversation = find_conversation (&pinfo->src, &pinfo->dst,
+        conversation = find_conversation (pinfo->fd->num, &pinfo->src, &pinfo->dst,
                                           pinfo->ptype, pinfo->oxid,
                                           pinfo->rxid, NO_PORT2);
         isreq = 0;
Index: epan/dissectors/packet-ipx.c
===================================================================
--- epan/dissectors/packet-ipx.c	(revision 13086)
+++ epan/dissectors/packet-ipx.c	(working copy)
@@ -716,7 +716,7 @@
 		 * Not a system packet - check for retransmissions.
 		 */
 		if (!pinfo->fd->flags.visited) {
-			conversation = find_conversation(&pinfo->src,
+			conversation = find_conversation(pinfo->fd->num, &pinfo->src,
 			    &pinfo->dst, PT_NCP, pinfo->srcport,
 			    pinfo->srcport, 0);
 			if (conversation == NULL) {
@@ -724,7 +724,7 @@
 				 * It's not part of any conversation - create
 				 * a new one.
 				 */
-				conversation = conversation_new(&pinfo->src,
+				conversation = conversation_new(pinfo->fd->num, &pinfo->src,
 				    &pinfo->dst, PT_NCP, pinfo->srcport,
 				    pinfo->srcport, 0);
 			}
Index: epan/dissectors/packet-rtp.c
===================================================================
--- epan/dissectors/packet-rtp.c	(revision 13086)
+++ epan/dissectors/packet-rtp.c	(working copy)
@@ -216,14 +216,14 @@
 	 * Check if the ip address and port combination is not
 	 * already registered as a conversation.
 	 */
-	p_conv = find_conversation( addr, &null_addr, PT_UDP, port, other_port,
+	p_conv = find_conversation( setup_frame_number, addr, &null_addr, PT_UDP, port, other_port,
                                 NO_ADDR_B | (!other_port ? NO_PORT_B : 0));
 
 	/*
 	 * If not, create a new conversation.
 	 */
-	if ( ! p_conv ) {
-		p_conv = conversation_new( addr, &null_addr, PT_UDP,
+	if ( !p_conv || p_conv->setup_frame != setup_frame_number) {
+		p_conv = conversation_new( setup_frame_number, addr, &null_addr, PT_UDP,
 		                           (guint32)port, (guint32)other_port,
 								   NO_ADDR2 | (!other_port ? NO_PORT2 : 0));
 	}
@@ -633,7 +633,7 @@
 	if (!p_conv_data)
 	{
 		/* First time, get info from conversation */
-		p_conv = find_conversation(&pinfo->net_dst, &pinfo->net_src,
+		p_conv = find_conversation(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src,
                                    pinfo->ptype,
                                    pinfo->destport, pinfo->srcport, NO_ADDR_B);
 		if (p_conv)