Ethereal-dev: [Ethereal-dev] Re: LDP multi-PDUs in one TCP segement support
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Motonori Shindo <mshindo@xxxxxxxxxxx>
Date: Mon, 26 Nov 2001 07:51:06 +0900 (JST)
Hi, Oops, I found one minor bug in my patch. Please throw away the previous one and use the one attached in this e-mail. Sorry for the confusion. Regards, From: Motonori Shindo <mshindo@xxxxxxxxxxx> Subject: LDP multi-PDUs in one TCP segement support Date: Mon, 26 Nov 2001 07:43:01 +0900 (JST) > Hi, > > Since LDP works on top of TCP, there's a possibility that multiple > PDUs are sent as one TCP segment. However, current LDP dissector > simply assumes that one TCP segment has only one PDU in it. > > I'm not sure that this is the right way to address the issue but > here's a patch anyway. Comments are welcome. > > Regards, =--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--= +----+----+ |.. .| | Motonori Shindo |_~__| | | .. |~~_~| Sr. Systems Engineer | . | | CoSine Communications Inc. +----+----+ C o S i n e e-mail: mshindo@xxxxxxxxxxxxx Communications =--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=
Index: packet-ldp.c
===================================================================
RCS file: /cvsroot/ethereal/packet-ldp.c,v
retrieving revision 1.19
diff -u -r1.19 packet-ldp.c
--- packet-ldp.c 2001/07/21 10:27:12 1.19
+++ packet-ldp.c 2001/11/25 22:54:36
@@ -565,8 +565,15 @@
ti = proto_tree_add_item(tree, proto_ldp, tvb, offset,
tvb_length_remaining(tvb, offset), FALSE);
ldp_tree = proto_item_add_subtree(ti, ett_ldp);
+ }
+
+ while (tvb_length_remaining(tvb, offset) > 0) { /* Dissect LDP PDUs */
+
+ guint pdu_len;
+
+ /* Dissect LDP Header */
- ti = proto_tree_add_text(ldp_tree, tvb, 0, 10, "Header");
+ ti = proto_tree_add_text(ldp_tree, tvb, offset, 10, "Header");
hdr_tree = proto_item_add_subtree(ti, ett_ldp_header);
@@ -575,6 +582,7 @@
offset += 2;
proto_tree_add_item(hdr_tree, hf_ldp_pdu_len, tvb, offset, 2, FALSE);
+ pdu_len = tvb_get_ntohs(tvb, offset);
offset += 2;
@@ -589,129 +597,127 @@
proto_tree_add_item(ldpid_tree, hf_ldp_ls_id, tvb, offset, 2, FALSE);
offset += 2;
-
- }
-
- offset = 10;
-
- while (tvb_length_remaining(tvb, offset) > 0) { /* Dissect a message */
- guint msg_len;
+ while (pdu_len > 0) { /* Dissect LDP TLV */
- ldp_message = tvb_get_ntohs(tvb, offset) & 0x7FFF; /* Get the message type */
+ guint msg_len;
- msg_len = tvb_get_ntohs(tvb, offset + 2);
+ ldp_message = tvb_get_ntohs(tvb, offset) & 0x7FFF; /* Get the message type */
- if (check_col(pinfo->fd, COL_INFO)) { /* Check the type ... */
+ msg_len = tvb_get_ntohs(tvb, offset + 2);
- if (msg_cnt > 0)
- col_append_fstr(pinfo->fd, COL_INFO, ", %s",
- val_to_str(ldp_message, ldp_message_types, "Unknown Message (0x%04X)"));
- else
- col_add_fstr(pinfo->fd, COL_INFO, "%s",
- val_to_str(ldp_message, ldp_message_types, "Unknown Message (0x%04X)"));
+ if (check_col(pinfo->fd, COL_INFO)) { /* Check the type ... */
- }
-
- msg_cnt++;
-
- if (tree) {
+ if (msg_cnt > 0)
+ col_append_fstr(pinfo->fd, COL_INFO, ", %s",
+ val_to_str(ldp_message, ldp_message_types, "Unknown Message (0x%04X)"));
+ else
+ col_add_fstr(pinfo->fd, COL_INFO, "%s",
+ val_to_str(ldp_message, ldp_message_types, "Unknown Message (0x%04X)"));
+
+ }
- proto_tree *ti = NULL, *msg_tree = NULL;
+ msg_cnt++;
- /* FIXME: Account for vendor and experimental messages */
+ if (tree) {
- ti = proto_tree_add_text(ldp_tree, tvb, offset, msg_len + 4, "%s",
- val_to_str(ldp_message, ldp_message_types, "Unknown Message (0x%04X)"));
+ proto_tree *ti = NULL, *msg_tree = NULL;
- msg_tree = proto_item_add_subtree(ti, ett_ldp_message);
+ /* FIXME: Account for vendor and experimental messages */
- proto_tree_add_item(msg_tree, hf_ldp_msg_type, tvb, offset, 2, FALSE);
+ ti = proto_tree_add_text(ldp_tree, tvb, offset, msg_len + 4, "%s",
+ val_to_str(ldp_message, ldp_message_types, "Unknown Message (0x%04X)"));
- proto_tree_add_item(msg_tree, hf_ldp_msg_len, tvb, offset + 2, 2, FALSE);
+ msg_tree = proto_item_add_subtree(ti, ett_ldp_message);
+
+ proto_tree_add_item(msg_tree, hf_ldp_msg_type, tvb, offset, 2, FALSE);
- proto_tree_add_item(msg_tree, hf_ldp_msg_id, tvb, offset + 4, 4, FALSE);
+ proto_tree_add_item(msg_tree, hf_ldp_msg_len, tvb, offset + 2, 2, FALSE);
- switch (ldp_message) {
+ proto_tree_add_item(msg_tree, hf_ldp_msg_id, tvb, offset + 4, 4, FALSE);
- case LDP_NOTIFICATION:
+ switch (ldp_message) {
- dissect_ldp_notification(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ case LDP_NOTIFICATION:
- break;
+ dissect_ldp_notification(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- case LDP_HELLO:
+ break;
- dissect_ldp_hello(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ case LDP_HELLO:
- break;
+ dissect_ldp_hello(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- case LDP_INITIALIZATION:
+ break;
- dissect_ldp_initialization(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ case LDP_INITIALIZATION:
- break;
+ dissect_ldp_initialization(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- case LDP_KEEPALIVE:
+ break;
- dissect_ldp_keepalive(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ case LDP_KEEPALIVE:
- break;
+ dissect_ldp_keepalive(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+
+ break;
- case LDP_ADDRESS:
+ case LDP_ADDRESS:
- dissect_ldp_address(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_address(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- case LDP_ADDRESS_WITHDRAWAL:
+ case LDP_ADDRESS_WITHDRAWAL:
- dissect_ldp_address_withdrawal(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_address_withdrawal(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- case LDP_LABEL_MAPPING:
+ case LDP_LABEL_MAPPING:
- dissect_ldp_label_mapping(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_label_mapping(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- case LDP_LABEL_REQUEST:
+ case LDP_LABEL_REQUEST:
- dissect_ldp_label_request(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_label_request(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- case LDP_LABEL_WITHDRAWAL:
+ case LDP_LABEL_WITHDRAWAL:
- dissect_ldp_label_withdrawal(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_label_withdrawal(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- case LDP_LABEL_RELEASE:
+ case LDP_LABEL_RELEASE:
- dissect_ldp_label_release(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_label_release(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- case LDP_LABEL_ABORT_REQUEST:
+ case LDP_LABEL_ABORT_REQUEST:
- dissect_ldp_label_abort_request(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
+ dissect_ldp_label_abort_request(tvb, offset + 8, pinfo, msg_tree, msg_len - 4);
- break;
+ break;
- default:
+ default:
- /* Some sort of unknown message, treat as undissected data */
+ /* Some sort of unknown message, treat as undissected data */
- break;
+ break;
- }
+ }
- }
+ }
- offset += msg_len + 4;
+ offset += msg_len + 4;
+ pdu_len -= (msg_len + 10); /* 10 octets LDP Header*/
+ }
}
}
- Follow-Ups:
- Re: [Ethereal-dev] Re: LDP multi-PDUs in one TCP segement support
- From: Guy Harris
- Re: [Ethereal-dev] Re: LDP multi-PDUs in one TCP segement support
- References:
- [Ethereal-dev] LDP multi-PDUs in one TCP segement support
- From: Motonori Shindo
- [Ethereal-dev] LDP multi-PDUs in one TCP segement support
- Prev by Date: Re: [Ethereal-dev] TDS decoding
- Next by Date: Re: [Ethereal-dev] TDS decoding
- Previous by thread: [Ethereal-dev] LDP multi-PDUs in one TCP segement support
- Next by thread: Re: [Ethereal-dev] Re: LDP multi-PDUs in one TCP segement support
- Index(es):





