Ethereal-dev: [ethereal-dev] DHCP patch
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: guy@xxxxxxxxxx (Guy Harris)
Date: Wed, 27 Jan 1999 23:56:46 -0800 (PST)
I sent most of this out in the past couple of days, but it may have gotten lost due to some problems "pow.zing.org" seemed to have had. These are patches to: display "time interval, in seconds" values in DHCP, DNS, and NBNS as "N days, N hours, N minutes, N seconds"; decode the NetBIOS node type option in DHCP; treat all DHCP options as having the length specified by the byte after the option number byte; fix the item length for IP address/netmask pairs to be 8 rather than 4; decode hardware types by using the same routine the ARP dissector uses; decode hardware addresses by using the same routine the ARP dissector uses; fix that routine to recognize 6-octet IEEE 802.x and Experimental Ethernet (3Mb) addresses as being Ethernet-like (although I have vague memories that 3Mb Ethernet may not have used 6-octet addresses); fix the value against which the "magic cookie" is checked to be in the right byte order and, if it matches, just show it as "(OK)"; fix "snprintf()" to print "%o" and "%x" as unsigned rather than signed (the ANSI C standard says that they're unsigned, and some DHCP fields in a packet trace I saw looked rather odd as "0x-756fe3" or whatever). diff -c /tmp/xxx/packet-arp.c ./packet-arp.c *** /tmp/xxx/packet-arp.c Wed Jan 27 23:31:32 1999 --- ./packet-arp.c Mon Jan 25 22:00:32 1999 *************** *** 117,126 **** return cur; } ! static gchar * arphrdaddr_to_str(guint8 *ad, int ad_len, guint16 type) { ! if (type == ARPHRD_ETHER && ad_len == 6) { ! /* Ethernet address. */ return ether_to_str(ad); } return arpaddr_to_str(ad, ad_len); --- 117,128 ---- return cur; } ! gchar * arphrdaddr_to_str(guint8 *ad, int ad_len, guint16 type) { ! if ((type == ARPHRD_ETHER || type == ARPHRD_EETHER || type == ARPHRD_IEEE802) ! && ad_len == 6) { ! /* Ethernet address (or Experimental 3Mb Ethernet, or IEEE 802.x ! address, which are the same type of address). */ return ether_to_str(ad); } return arpaddr_to_str(ad, ad_len); *************** *** 135,164 **** return arpaddr_to_str(ad, ad_len); } ! /* Offsets of fields within an ARP packet. */ ! #define AR_HRD 0 ! #define AR_PRO 2 ! #define AR_HLN 4 ! #define AR_PLN 5 ! #define AR_OP 6 ! ! void ! dissect_arp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) { ! guint16 ar_hrd; ! guint16 ar_pro; ! guint8 ar_hln; ! guint8 ar_pln; ! guint16 ar_op; ! GtkWidget *arp_tree, *ti; ! gchar *op_str; ! int sha_offset, spa_offset, tha_offset, tpa_offset; ! gchar *sha_str, *spa_str, *tha_str, *tpa_str; ! static const value_string op_vals[] = { ! {ARPOP_REQUEST, "ARP request" }, ! {ARPOP_REPLY, "ARP reply" }, ! {ARPOP_RREQUEST, "RARP request"}, ! {ARPOP_RREPLY, "RARP reply" }, ! {0, NULL } }; static const value_string hrd_vals[] = { {ARPHRD_NETROM, "NET/ROM pseudo" }, {ARPHRD_ETHER, "Ethernet" }, --- 137,144 ---- return arpaddr_to_str(ad, ad_len); } ! gchar * ! arphrdtype_to_str(guint16 hwtype, const char *fmt) { static const value_string hrd_vals[] = { {ARPHRD_NETROM, "NET/ROM pseudo" }, {ARPHRD_ETHER, "Ethernet" }, *************** *** 190,195 **** --- 170,203 ---- {ARPHRD_EUI_64, "EUI-64" }, {0, NULL } }; + return val_to_str(hwtype, hrd_vals, fmt); + } + + /* Offsets of fields within an ARP packet. */ + #define AR_HRD 0 + #define AR_PRO 2 + #define AR_HLN 4 + #define AR_PLN 5 + #define AR_OP 6 + + void + dissect_arp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) { + guint16 ar_hrd; + guint16 ar_pro; + guint8 ar_hln; + guint8 ar_pln; + guint16 ar_op; + GtkWidget *arp_tree, *ti; + gchar *op_str; + int sha_offset, spa_offset, tha_offset, tpa_offset; + gchar *sha_str, *spa_str, *tha_str, *tpa_str; + static const value_string op_vals[] = { + {ARPOP_REQUEST, "ARP request" }, + {ARPOP_REPLY, "ARP reply" }, + {ARPOP_RREQUEST, "RARP request"}, + {ARPOP_RREPLY, "RARP reply" }, + {0, NULL } }; + /* To do: Check for {cap len,pkt len} < struct len */ ar_hrd = pntohs(&pd[offset + AR_HRD]); ar_pro = pntohs(&pd[offset + AR_PRO]); *************** *** 246,252 **** arp_tree = gtk_tree_new(); add_subtree(ti, arp_tree, ETT_ARP); add_item_to_tree(arp_tree, offset + AR_HRD, 2, ! "Hardware type: %s", val_to_str(ar_hrd, hrd_vals, "Unknown (0x%04x)")); add_item_to_tree(arp_tree, offset + AR_PRO, 2, "Protocol type: %s", ethertype_to_str(ar_pro, "Unknown (0x%04x)")); add_item_to_tree(arp_tree, offset + AR_HLN, 1, --- 254,260 ---- arp_tree = gtk_tree_new(); add_subtree(ti, arp_tree, ETT_ARP); add_item_to_tree(arp_tree, offset + AR_HRD, 2, ! "Hardware type: %s", arphrdtype_to_str(ar_hrd, "Unknown (0x%04x)")); add_item_to_tree(arp_tree, offset + AR_PRO, 2, "Protocol type: %s", ethertype_to_str(ar_pro, "Unknown (0x%04x)")); add_item_to_tree(arp_tree, offset + AR_HLN, 1, diff -c /tmp/xxx/packet-bootp.c ./packet-bootp.c *** /tmp/xxx/packet-bootp.c Wed Jan 27 23:31:33 1999 --- ./packet-bootp.c Wed Jan 27 23:28:24 1999 *************** *** 51,56 **** --- 51,57 ---- #include "etypes.h" enum field_type { none, ipv4, string, toggle, yes_no, special, opaque, + time_in_secs, val_u_byte, val_u_short, val_u_long, val_s_long }; *************** *** 62,68 **** #define NUM_OPT_INFOS 77 /* returns the number of bytes consumed by this option */ ! int bootp_option(const u_char *pd, GtkWidget *bp_tree, int voff, int eoff) { char *text; --- 63,69 ---- #define NUM_OPT_INFOS 77 /* returns the number of bytes consumed by this option */ ! static int bootp_option(const u_char *pd, GtkWidget *bp_tree, int voff, int eoff) { char *text; *************** *** 70,79 **** u_char code = pd[voff]; int vlen = pd[voff+1]; u_char byte; ! int i, consumed = 1; /* if code is unknown, consume 1 byte */ GtkWidget *vti, *v_tree; ! char *opt53_text[] = { "Unknown Message Type", "Discover", "Offer", --- 71,81 ---- u_char code = pd[voff]; int vlen = pd[voff+1]; u_char byte; ! int i, consumed = vlen + 2; ! u_long time_secs; GtkWidget *vti, *v_tree; ! static const char *opt53_text[] = { "Unknown Message Type", "Discover", "Offer", *************** *** 84,89 **** --- 86,97 ---- "Release", "Inform" }; + static const value_string nbnt_vals[] = { + {0x1, "B-node" }, + {0x2, "P-node" }, + {0x4, "M-node" }, + {0x8, "H-node" }, + {0, NULL } }; static struct opt_info opt[] = { /* 0 */ { "Padding", none }, *************** *** 110,116 **** /* 21 */ { "Policy Filter", special }, /* 22 */ { "Maximum Datagram Reassembly Size", val_u_short }, /* 23 */ { "Default IP Time-to-Live", val_u_byte }, ! /* 24 */ { "Path MTU Aging Timeout", val_u_long }, /* 25 */ { "Path MTU Plateau Table", val_u_short }, /* 26 */ { "Interface MTU", val_u_short }, /* 27 */ { "All Subnets are Local", yes_no }, --- 118,124 ---- /* 21 */ { "Policy Filter", special }, /* 22 */ { "Maximum Datagram Reassembly Size", val_u_short }, /* 23 */ { "Default IP Time-to-Live", val_u_byte }, ! /* 24 */ { "Path MTU Aging Timeout", time_in_secs }, /* 25 */ { "Path MTU Plateau Table", val_u_short }, /* 26 */ { "Interface MTU", val_u_short }, /* 27 */ { "All Subnets are Local", yes_no }, *************** *** 121,130 **** /* 32 */ { "Router Solicitation Address", ipv4 }, /* 33 */ { "Static Route", special }, /* 34 */ { "Trailer Encapsulation", toggle }, ! /* 35 */ { "ARP Cache Timeout", val_u_long }, /* 36 */ { "Ethernet Encapsulation", toggle }, /* 37 */ { "TCP Default TTL", val_u_byte }, ! /* 38 */ { "TCP Keepalive Interval", val_u_long }, /* 39 */ { "TCP Keepalive Garbage", toggle }, /* 40 */ { "Network Information Service Domain", string }, /* 41 */ { "Network Information Service Servers", ipv4 }, --- 129,138 ---- /* 32 */ { "Router Solicitation Address", ipv4 }, /* 33 */ { "Static Route", special }, /* 34 */ { "Trailer Encapsulation", toggle }, ! /* 35 */ { "ARP Cache Timeout", time_in_secs }, /* 36 */ { "Ethernet Encapsulation", toggle }, /* 37 */ { "TCP Default TTL", val_u_byte }, ! /* 38 */ { "TCP Keepalive Interval", time_in_secs }, /* 39 */ { "TCP Keepalive Garbage", toggle }, /* 40 */ { "Network Information Service Domain", string }, /* 41 */ { "Network Information Service Servers", ipv4 }, *************** *** 137,151 **** /* 48 */ { "X Window System Font Server", ipv4 }, /* 49 */ { "X Window System Display Manager", ipv4 }, /* 50 */ { "Requested IP Address", ipv4 }, ! /* 51 */ { "IP Address Lease Time", val_u_long }, /* 52 */ { "Option Overload", special }, /* 53 */ { "DHCP Message Type", special }, /* 54 */ { "Server Identifier", ipv4 }, /* 55 */ { "Parameter Request List", special }, /* 56 */ { "Message", string }, /* 57 */ { "Maximum DHCP Message Size", val_u_short }, ! /* 58 */ { "Renewal Time Value", val_u_long }, ! /* 59 */ { "Rebinding Time Value", val_u_long }, /* 60 */ { "Vendor class identifier", opaque }, /* 61 */ { "Client identifier", special }, /* 64 */ { "Network Information Service+ Domain", string }, --- 145,159 ---- /* 48 */ { "X Window System Font Server", ipv4 }, /* 49 */ { "X Window System Display Manager", ipv4 }, /* 50 */ { "Requested IP Address", ipv4 }, ! /* 51 */ { "IP Address Lease Time", time_in_secs }, /* 52 */ { "Option Overload", special }, /* 53 */ { "DHCP Message Type", special }, /* 54 */ { "Server Identifier", ipv4 }, /* 55 */ { "Parameter Request List", special }, /* 56 */ { "Message", string }, /* 57 */ { "Maximum DHCP Message Size", val_u_short }, ! /* 58 */ { "Renewal Time Value", time_in_secs }, ! /* 59 */ { "Rebinding Time Value", time_in_secs }, /* 60 */ { "Vendor class identifier", opaque }, /* 61 */ { "Client identifier", special }, /* 64 */ { "Network Information Service+ Domain", string }, *************** *** 196,202 **** v_tree = gtk_tree_new(); add_subtree(vti, v_tree, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 8) { ! add_item_to_tree(v_tree, i, 4, "IP Address/Mask: %s/%s", ip_to_str((guint8*)&pd[i]), ip_to_str((guint8*)&pd[i+4])); } --- 204,210 ---- v_tree = gtk_tree_new(); add_subtree(vti, v_tree, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 8) { ! add_item_to_tree(v_tree, i, 8, "IP Address/Mask: %s/%s", ip_to_str((guint8*)&pd[i]), ip_to_str((guint8*)&pd[i+4])); } *************** *** 220,226 **** v_tree = gtk_tree_new(); add_subtree(vti, v_tree, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 8) { ! add_item_to_tree(v_tree, i, 4, "Destination IP Address/Router: %s/%s", ip_to_str((guint8*)&pd[i]), ip_to_str((guint8*)&pd[i+4])); --- 228,234 ---- v_tree = gtk_tree_new(); add_subtree(vti, v_tree, ETT_BOOTP_OPTION); for (i = voff + 2; i < voff + consumed; i += 8) { ! add_item_to_tree(v_tree, i, 8, "Destination IP Address/Router: %s/%s", ip_to_str((guint8*)&pd[i]), ip_to_str((guint8*)&pd[i+4])); *************** *** 228,233 **** --- 236,250 ---- } break; + /* NetBIOS-over-TCP/IP Node Type */ + case 46: + byte = pd[voff+2]; + add_item_to_tree(bp_tree, voff, consumed, + "Option %d: %s = %s", code, text, + val_to_str(byte, nbnt_vals, + "Unknown (0x%02x)")); + break; + /* DHCP Message Type */ case 53: byte = pd[voff+2]; *************** *** 265,280 **** /* We *MAY* use hwtype/hwaddr. If we have 7 bytes, I'll guess that the first is the hwtype, and the last 6 are the hw addr */ ! if (pd[voff+1] == 7) { vti = add_item_to_tree(GTK_WIDGET(bp_tree), voff, consumed, "Option %d: %s", code, text); v_tree = gtk_tree_new(); add_subtree(vti, v_tree, ETT_BOOTP_OPTION); add_item_to_tree(v_tree, voff+2, 1, ! "Hardware type: 0x%02x", pd[voff+2]); add_item_to_tree(v_tree, voff+3, 6, "Client hardware address: %s", ! ether_to_str((guint8*)&pd[voff+3])); } /* otherwise, it's opaque data */ else { --- 282,300 ---- /* We *MAY* use hwtype/hwaddr. If we have 7 bytes, I'll guess that the first is the hwtype, and the last 6 are the hw addr */ ! if (vlen == 7) { vti = add_item_to_tree(GTK_WIDGET(bp_tree), voff, consumed, "Option %d: %s", code, text); v_tree = gtk_tree_new(); add_subtree(vti, v_tree, ETT_BOOTP_OPTION); add_item_to_tree(v_tree, voff+2, 1, ! "Hardware type: %s", ! arphrdtype_to_str(pd[voff+2], ! "Unknown (0x%02x)")); add_item_to_tree(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 { *************** *** 295,301 **** } /* Normal cases */ - consumed = vlen + 2; if (code < NUM_OPT_INFOS) { text = opt[code].text; ftype = opt[code].ftype; --- 315,320 ---- *************** *** 398,403 **** --- 417,431 ---- } break; + case time_in_secs: + time_secs = pntohl(&pd[voff+2]); + add_item_to_tree(bp_tree, voff, consumed, + "Option %d: %s = %s", code, text, + ((time_secs == 0xffffffff) ? + "infinity" : + time_secs_to_str(time_secs))); + break; + default: add_item_to_tree(bp_tree, voff, consumed, "Option %d: %s (%d bytes)", code, text, vlen); *************** *** 421,434 **** col_add_str(fd, COL_PROTOCOL, "BOOTP"); if (check_col(fd, COL_INFO)) { ! /* if hwaddr is 6 bytes, assume MAC */ ! if (pd[offset] == 1 && pd[offset+2] == 6) { col_add_fstr(fd, COL_INFO, "Boot Request from %s", ! ether_to_str((guint8*)&pd[offset+28])); } else { ! col_add_str(fd, COL_INFO, pd[offset] == 1 ? "Boot Request" : ! "Boot Reply"); } } --- 449,461 ---- col_add_str(fd, COL_PROTOCOL, "BOOTP"); if (check_col(fd, COL_INFO)) { ! if (pd[offset] == 1) { col_add_fstr(fd, COL_INFO, "Boot Request from %s", ! arphrdaddr_to_str((guint8*)&pd[offset+28], ! pd[offset+2], pd[offset+1])); } else { ! col_add_str(fd, COL_INFO, "Boot Reply"); } } *************** *** 441,447 **** add_item_to_tree(bp_tree, offset, 1, pd[offset] == 1 ? "Boot Request" : "Boot Reply"); add_item_to_tree(bp_tree, offset + 1, 1, ! "Hardware type: 0x%02x", pd[offset+1]); add_item_to_tree(bp_tree, offset + 2, 1, "Hardware address length: %d", pd[offset+2]); add_item_to_tree(bp_tree, offset + 3, 1, --- 468,475 ---- add_item_to_tree(bp_tree, offset, 1, pd[offset] == 1 ? "Boot Request" : "Boot Reply"); add_item_to_tree(bp_tree, offset + 1, 1, ! "Hardware type: %s", ! arphrdtype_to_str(pd[offset+1], "Unknown (0x%02x)")); add_item_to_tree(bp_tree, offset + 2, 1, "Hardware address length: %d", pd[offset+2]); add_item_to_tree(bp_tree, offset + 3, 1, *************** *** 461,480 **** add_item_to_tree(bp_tree, offset + 24, 4, "Relay agent IP address: %s", ip_to_str((guint8*)&pd[offset+24])); ! /* If HW address is 6 bytes, assume MAC. */ ! if (pd[offset+2] == 6) { ! add_item_to_tree(bp_tree, offset + 28, 6, ! "Client hardware address: %s", ! ether_to_str((guint8*)&pd[offset+28])); ! } ! else { ! add_item_to_tree(bp_tree, offset + 28, 16, ! "Client hardware address: %02x:%02x%02x:%02x:%02x:%02x:%02x:%02x%02x:%02x%02x:%02x:%02x:%02x:%02x:%02x", ! pd[offset+28], pd[offset+29], pd[offset+30], pd[offset+31], ! pd[offset+32], pd[offset+33], pd[offset+34], pd[offset+35], ! pd[offset+36], pd[offset+37], pd[offset+38], pd[offset+39], ! pd[offset+40], pd[offset+41], pd[offset+42], pd[offset+43]); ! } /* The server host name is optional */ if (pd[offset+44]) { --- 489,498 ---- add_item_to_tree(bp_tree, offset + 24, 4, "Relay agent IP address: %s", ip_to_str((guint8*)&pd[offset+24])); ! add_item_to_tree(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]) { *************** *** 496,505 **** "Boot file name not given"); } ! if (pntohl(&pd[offset+236]) == 0x63538263) { add_item_to_tree(bp_tree, offset + 236, 4, ! "Magic cookie: %s (generic)", ! ip_to_str((guint8*)&pd[offset+236])); } else { add_item_to_tree(bp_tree, offset + 236, 4, --- 514,522 ---- "Boot file name not given"); } ! if (pntohl(&pd[offset+236]) == 0x63825363) { add_item_to_tree(bp_tree, offset + 236, 4, ! "Magic cookie: (OK)"); } else { add_item_to_tree(bp_tree, offset + 236, 4, diff -c /tmp/xxx/packet-dns.c ./packet-dns.c *** /tmp/xxx/packet-dns.c Wed Jan 27 23:31:33 1999 --- ./packet-dns.c Mon Jan 25 23:12:27 1999 *************** *** 341,347 **** offset += 2; add_item_to_tree(rr_tree, offset, 2, "Class: %s", class_name); offset += 2; ! add_item_to_tree(rr_tree, offset, 4, "Time to live: %u", ttl); offset += 4; add_item_to_tree(rr_tree, offset, 2, "Data length: %u", data_len); return rr_tree; --- 341,348 ---- offset += 2; add_item_to_tree(rr_tree, offset, 2, "Class: %s", class_name); offset += 2; ! add_item_to_tree(rr_tree, offset, 4, "Time to live: %s", ! time_secs_to_str(ttl)); offset += 4; add_item_to_tree(rr_tree, offset, 2, "Data length: %u", data_len); return rr_tree; diff -c /tmp/xxx/packet.c ./packet.c *** /tmp/xxx/packet.c Wed Jan 27 23:31:32 1999 --- ./packet.c Mon Jan 25 22:37:06 1999 *************** *** 89,94 **** --- 89,144 ---- return cur; } + #define PLURALIZE(n) (((n) > 1) ? "s" : "") + #define COMMA(do_it) ((do_it) ? ", " : "") + + gchar * + time_secs_to_str(guint32 time) + { + static gchar str[3][8+1+4+2+2+5+2+2+7+2+2+7+1]; + static gchar *cur, *p; + int hours, mins, secs; + int do_comma; + + if (cur == &str[0][0]) { + cur = &str[1][0]; + } else if (cur == &str[1][0]) { + cur = &str[2][0]; + } else { + cur = &str[0][0]; + } + + secs = time % 60; + time /= 60; + mins = time % 60; + time /= 60; + hours = time % 24; + time /= 24; + + p = cur; + if (time != 0) { + sprintf(p, "%u day%s", time, PLURALIZE(time)); + p += strlen(p); + do_comma = 1; + } else + do_comma = 0; + if (hours != 0) { + sprintf(p, "%s%u hour%s", COMMA(do_comma), hours, PLURALIZE(hours)); + p += strlen(p); + do_comma = 1; + } else + do_comma = 0; + if (mins != 0) { + sprintf(p, "%s%u minute%s", COMMA(do_comma), mins, PLURALIZE(mins)); + p += strlen(p); + do_comma = 1; + } else + do_comma = 0; + if (secs != 0) + sprintf(p, "%s%u second%s", COMMA(do_comma), secs, PLURALIZE(secs)); + return cur; + } + void packet_hex_print(GtkText *bv, guchar *pd, gint len, gint bstart, gint blen) { gint i = 0, j, k, cur; diff -c /tmp/xxx/packet.h ./packet.h *** /tmp/xxx/packet.h Wed Jan 27 23:31:32 1999 --- ./packet.h Mon Jan 25 22:37:01 1999 *************** *** 498,503 **** --- 498,504 ---- /* Utility routines used by packet*.c */ gchar* ether_to_str(const guint8 *); gchar* ip_to_str(const guint8 *); + gchar* time_secs_to_str(guint32); void packet_hex_print(GtkText *, guint8 *, gint, gint, gint); #define E_TREEINFO_START_KEY "tree_info_start" #define E_TREEINFO_LEN_KEY "tree_info_len" *************** *** 584,588 **** --- 585,593 ---- void ethertype(guint16 etype, int offset, const u_char *pd, frame_data *fd, GtkTree *tree, GtkWidget *fh_tree); + + /* These functions are in packet-arp.c */ + gchar *arphrdaddr_to_str(guint8 *ad, int ad_len, guint16 type); + gchar *arphrdtype_to_str(guint16 hwtype, const char *fmt); #endif /* packet.h */ diff -c /tmp/xxx/snprintf.c ./snprintf.c *** /tmp/xxx/snprintf.c Wed Jan 27 23:31:32 1999 --- ./snprintf.c Mon Jan 25 21:32:10 1999 *************** *** 574,582 **** case 'o': /* octal */ STAR_ARGS(&data); if (data.a_long == FOUND) ! d = va_arg(args, long); else ! d = va_arg(args, int); octal(&data, d); state = 0; break; --- 574,582 ---- case 'o': /* octal */ STAR_ARGS(&data); if (data.a_long == FOUND) ! d = va_arg(args, unsigned long); else ! d = va_arg(args, unsigned int); octal(&data, d); state = 0; break; *************** *** 584,592 **** case 'X': /* hexadecimal */ STAR_ARGS(&data); if (data.a_long == FOUND) ! d = va_arg(args, long); else ! d = va_arg(args, int); hexa(&data, d); state = 0; break; --- 584,592 ---- case 'X': /* hexadecimal */ STAR_ARGS(&data); if (data.a_long == FOUND) ! d = va_arg(args, unsigned long); else ! d = va_arg(args, unsigned int); hexa(&data, d); state = 0; break;
- Prev by Date: [ethereal-dev] CDP
- Next by Date: [ethereal-dev] network usage by protocol
- Previous by thread: [ethereal-dev] CDP
- Next by thread: [ethereal-dev] network usage by protocol
- Index(es):