diff options
author | Gilbert Ramirez <gram@alumni.rice.edu> | 1999-07-07 22:52:57 +0000 |
---|---|---|
committer | Gilbert Ramirez <gram@alumni.rice.edu> | 1999-07-07 22:52:57 +0000 |
commit | 07f42b5b31f9523deeb147226521f77a2c8dd797 (patch) | |
tree | c720d2a42f11c9d14ac1a161eb785b438c2c4b14 /packet-bootp.c | |
parent | fba49cfe85d4b23ebbffa97fae126a379e913ecd (diff) | |
download | wireshark-07f42b5b31f9523deeb147226521f77a2c8dd797.tar.gz wireshark-07f42b5b31f9523deeb147226521f77a2c8dd797.tar.bz2 wireshark-07f42b5b31f9523deeb147226521f77a2c8dd797.zip |
Created a new protocol tree implementation and a new display filter
mechanism that is built into ethereal. Wiretap is now used to read all
file formats. Libpcap is used only for capturing.
svn path=/trunk/; revision=342
Diffstat (limited to 'packet-bootp.c')
-rw-r--r-- | packet-bootp.c | 131 |
1 files changed, 62 insertions, 69 deletions
diff --git a/packet-bootp.c b/packet-bootp.c index c6046b96fb..19fcf4f4dc 100644 --- a/packet-bootp.c +++ b/packet-bootp.c @@ -2,7 +2,7 @@ * Routines for BOOTP/DHCP packet disassembly * Gilbert Ramirez <gram@verdict.uthscsa.edu> * - * $Id: packet-bootp.c,v 1.16 1999/03/23 03:14:35 gram Exp $ + * $Id: packet-bootp.c,v 1.17 1999/07/07 22:51:40 gram Exp $ * * The information used comes from: * RFC 2132: DHCP Options and BOOTP Vendor Extensions @@ -174,7 +174,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) } } i = i - voff; - proto_tree_add_item(bp_tree, voff, i, "Padding"); + proto_tree_add_text(bp_tree, voff, i, "Padding"); consumed = i; return consumed; @@ -182,7 +182,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) case 21: /* one IP address pair */ if (vlen == 8) { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s/%s", code, text, ip_to_str((guint8*)&pd[voff+2]), ip_to_str((guint8*)&pd[voff+6])); @@ -190,12 +190,11 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) /* > 1 IP address pair. Let's make a sub-tree */ else { - vti = proto_tree_add_item(bp_tree, voff, + vti = proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s", code, text); - v_tree = proto_tree_new(); - proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION); + v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 8) { - proto_tree_add_item(v_tree, i, 8, "IP Address/Mask: %s/%s", + proto_tree_add_text(v_tree, i, 8, "IP Address/Mask: %s/%s", ip_to_str((guint8*)&pd[i]), ip_to_str((guint8*)&pd[i+4])); } @@ -206,7 +205,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) case 33: /* one IP address pair */ if (vlen == 8) { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s/%s", code, text, ip_to_str((guint8*)&pd[voff+2]), ip_to_str((guint8*)&pd[voff+6])); @@ -214,12 +213,11 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) /* > 1 IP address pair. Let's make a sub-tree */ else { - vti = proto_tree_add_item(bp_tree, voff, + vti = proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s", code, text); - v_tree = proto_tree_new(); - proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION); + v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 8) { - proto_tree_add_item(v_tree, i, 8, + proto_tree_add_text(v_tree, i, 8, "Destination IP Address/Router: %s/%s", ip_to_str((guint8*)&pd[i]), ip_to_str((guint8*)&pd[i+4])); @@ -229,14 +227,14 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) /* Vendor-Specific Info */ case 43: - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s", code, text); break; /* NetBIOS-over-TCP/IP Node Type */ case 46: byte = pd[voff+2]; - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s", code, text, val_to_str(byte, nbnt_vals, "Unknown (0x%02x)")); @@ -251,24 +249,23 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) else { i = 0; } - proto_tree_add_item(bp_tree, voff, 3, "Option %d: %s = DHCP %s", + proto_tree_add_text(bp_tree, voff, 3, "Option %d: %s = DHCP %s", code, text, opt53_text[i]); break; /* Parameter Request List */ case 55: - vti = proto_tree_add_item(bp_tree, voff, + vti = proto_tree_add_text(bp_tree, voff, vlen + 2, "Option %d: %s", code, text); - v_tree = proto_tree_new(); - proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION); + v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION); for (i = 0; i < vlen; i++) { byte = pd[voff+2+i]; if (byte < NUM_OPT_INFOS) { - proto_tree_add_item(v_tree, voff+2+i, 1, "%d = %s", + proto_tree_add_text(v_tree, voff+2+i, 1, "%d = %s", byte, opt[byte].text); } else { - proto_tree_add_item(vti, voff+2+i, 1, + proto_tree_add_text(vti, voff+2+i, 1, "Unknown Option Code: %d", byte); } } @@ -280,29 +277,28 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) guess that the first is the hwtype, and the last 6 are the hw addr */ if (vlen == 7) { - vti = proto_tree_add_item(bp_tree, voff, + vti = proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s", code, text); - v_tree = proto_tree_new(); - proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION); - proto_tree_add_item(v_tree, voff+2, 1, + v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION); + proto_tree_add_text(v_tree, voff+2, 1, "Hardware type: %s", arphrdtype_to_str(pd[voff+2], "Unknown (0x%02x)")); - proto_tree_add_item(v_tree, voff+3, 6, + proto_tree_add_text(v_tree, voff+3, 6, "Client hardware address: %s", arphrdaddr_to_str((guint8*)&pd[voff+3], 6, pd[voff+2])); } /* otherwise, it's opaque data */ else { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s (%d bytes)", code, text, vlen); } break; /* End Option */ case 255: - proto_tree_add_item(bp_tree, voff, 1, "End Option"); + proto_tree_add_text(bp_tree, voff, 1, "End Option"); consumed = 1; return consumed; @@ -323,19 +319,18 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) case ipv4: /* one IP address */ if (vlen == 4) { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s", code, text, ip_to_str((guint8*)&pd[voff+2])); } /* > 1 IP addresses. Let's make a sub-tree */ else { - vti = proto_tree_add_item(bp_tree, voff, + vti = proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s", code, text); - v_tree = proto_tree_new(); - proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION); + v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 4) { - proto_tree_add_item(v_tree, i, 4, "IP Address: %s", + proto_tree_add_text(v_tree, i, 4, "IP Address: %s", ip_to_str((guint8*)&pd[i])); } } @@ -345,12 +340,12 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) /* Fix for non null-terminated string supplied by * John Lines <John.Lines@aeat.co.uk> */ - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %.*s", code, text, vlen, &pd[voff+2]); break; case opaque: - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s (%d bytes)", code, text, vlen); break; @@ -358,43 +353,42 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) case val_u_short: /* one IP address */ if (vlen == 2) { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %d", code, text, pntohs(&pd[voff+2])); } /* > 1 u_short */ else { - vti = proto_tree_add_item(bp_tree, voff, + vti = proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s", code, text); - v_tree = proto_tree_new(); - proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION); + v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 2) { - proto_tree_add_item(v_tree, i, 4, "Value: %d", + proto_tree_add_text(v_tree, i, 4, "Value: %d", pntohs(&pd[i])); } } break; case val_u_long: - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %d", code, text, pntohl(&pd[voff+2])); break; case val_u_byte: - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %d", code, text, pd[voff+2]); break; case toggle: i = pd[voff+2]; if (i != 0 && i != 1) { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = Invalid Value %d", code, text, pd[voff+2]); } else { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s", code, text, pd[voff+2] == 0 ? "Disabled" : "Enabled"); } @@ -403,12 +397,12 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) case yes_no: i = pd[voff+2]; if (i != 0 && i != 1) { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = Invalid Value %d", code, text, pd[voff+2]); } else { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s", code, text, pd[voff+2] == 0 ? "No" : "Yes"); } @@ -416,7 +410,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) case time_in_secs: time_secs = pntohl(&pd[voff+2]); - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s = %s", code, text, ((time_secs == 0xffffffff) ? "infinity" : @@ -424,12 +418,12 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff) break; default: - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Option %d: %s (%d bytes)", code, text, vlen); } } else { - proto_tree_add_item(bp_tree, voff, consumed, + proto_tree_add_text(bp_tree, voff, consumed, "Unknown Option Code: %d (%d bytes)", code, vlen); } @@ -458,66 +452,65 @@ dissect_bootp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } if (tree) { - ti = proto_tree_add_item(tree, offset, END_OF_FRAME, + ti = proto_tree_add_text(tree, offset, END_OF_FRAME, "Bootstrap Protocol"); - bp_tree = proto_tree_new(); - proto_item_add_subtree(ti, bp_tree, ETT_BOOTP); + bp_tree = proto_item_add_subtree(ti, ETT_BOOTP); - proto_tree_add_item(bp_tree, offset, 1, pd[offset] == 1 ? + proto_tree_add_text(bp_tree, offset, 1, pd[offset] == 1 ? "Boot Request" : "Boot Reply"); - proto_tree_add_item(bp_tree, offset + 1, 1, + proto_tree_add_text(bp_tree, offset + 1, 1, "Hardware type: %s", arphrdtype_to_str(pd[offset+1], "Unknown (0x%02x)")); - proto_tree_add_item(bp_tree, offset + 2, 1, + proto_tree_add_text(bp_tree, offset + 2, 1, "Hardware address length: %d", pd[offset+2]); - proto_tree_add_item(bp_tree, offset + 3, 1, + proto_tree_add_text(bp_tree, offset + 3, 1, "Hops: %d", pd[offset+3]); - proto_tree_add_item(bp_tree, offset + 4, 4, + proto_tree_add_text(bp_tree, offset + 4, 4, "Transaction ID: 0x%08x", pntohl(&pd[offset+4])); - proto_tree_add_item(bp_tree, offset + 8, 2, + proto_tree_add_text(bp_tree, offset + 8, 2, "Seconds elapsed: %d", pntohs(&pd[offset+8])); - proto_tree_add_item(bp_tree, offset + 10, 2, + proto_tree_add_text(bp_tree, offset + 10, 2, "Broadcast flag: %d", pd[offset+10] & 1); - proto_tree_add_item(bp_tree, offset + 12, 4, + proto_tree_add_text(bp_tree, offset + 12, 4, "Client IP address: %s", ip_to_str((guint8*)&pd[offset+12])); - proto_tree_add_item(bp_tree, offset + 16, 4, + proto_tree_add_text(bp_tree, offset + 16, 4, "Your (client) IP address: %s", ip_to_str((guint8*)&pd[offset+16])); - proto_tree_add_item(bp_tree, offset + 20, 4, + proto_tree_add_text(bp_tree, offset + 20, 4, "Next server IP address: %s", ip_to_str((guint8*)&pd[offset+20])); - proto_tree_add_item(bp_tree, offset + 24, 4, + proto_tree_add_text(bp_tree, offset + 24, 4, "Relay agent IP address: %s", ip_to_str((guint8*)&pd[offset+24])); - proto_tree_add_item(bp_tree, offset + 28, pd[offset+2], + proto_tree_add_text(bp_tree, offset + 28, pd[offset+2], "Client hardware address: %s", arphrdaddr_to_str((guint8*)&pd[offset+28], pd[offset+2], pd[offset+1])); /* The server host name is optional */ if (pd[offset+44]) { - proto_tree_add_item(bp_tree, offset + 44, 64, + proto_tree_add_text(bp_tree, offset + 44, 64, "Server host name: %s", &pd[offset+44]); } else { - proto_tree_add_item(bp_tree, offset + 44, 64, + proto_tree_add_text(bp_tree, offset + 44, 64, "Server host name not given"); } /* Boot file */ if (pd[offset+108]) { - proto_tree_add_item(bp_tree, offset + 108, 128, + proto_tree_add_text(bp_tree, offset + 108, 128, "Boot file name: %s", &pd[offset+108]); } else { - proto_tree_add_item(bp_tree, offset + 108, 128, + proto_tree_add_text(bp_tree, offset + 108, 128, "Boot file name not given"); } if (pntohl(&pd[offset+236]) == 0x63825363) { - proto_tree_add_item(bp_tree, offset + 236, 4, + proto_tree_add_text(bp_tree, offset + 236, 4, "Magic cookie: (OK)"); } else { - proto_tree_add_item(bp_tree, offset + 236, 4, + proto_tree_add_text(bp_tree, offset + 236, 4, "Magic cookie: %s", ip_to_str((guint8*)&pd[offset+236])); } |