diff options
author | guy <guy@f5534014-38df-0310-8fa8-9805f1628bb7> | 2002-04-04 23:20:33 +0000 |
---|---|---|
committer | guy <guy@f5534014-38df-0310-8fa8-9805f1628bb7> | 2002-04-04 23:20:33 +0000 |
commit | ce7323639179ad910591eb210e62dc3c644f100e (patch) | |
tree | 58ae75aacdfa5901808b93589bccea9b10792c09 /packet-rip.c | |
parent | 8417849a395ac80ac55e88356e41b14e6eef03ff (diff) |
Put in the RFCs for RIPv1 and RIPv2.
Handle an address family of 0; that means that the address wasn't
specified in the request, which is used for a "send me the whole routing
table" request.
Replace some "proto_tree_add_XXX" calls with "proto_tree_add_item"
calls.
Use FALSE, rather than TRUE, as the byte order argument in one
"proto_tree_add_item" call, for consistency with other calls; the field
is a string, so the byte order doesn't matter.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@5099 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-rip.c')
-rw-r--r-- | packet-rip.c | 59 |
1 files changed, 49 insertions, 10 deletions
diff --git a/packet-rip.c b/packet-rip.c index 4753330f79..1e536147df 100644 --- a/packet-rip.c +++ b/packet-rip.c @@ -1,8 +1,9 @@ /* packet-rip.c * Routines for RIPv1 and RIPv2 packet disassembly + * RFC1058, RFC2453 * (c) Copyright Hannes R. Boehm <hannes@boehm.org> * - * $Id: packet-rip.c,v 1.30 2002/01/24 09:20:51 guy Exp $ + * $Id: packet-rip.c,v 1.31 2002/04/04 23:20:33 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -57,9 +58,13 @@ static const value_string command_vals[] = { { 0, NULL } }; +#define AFVAL_UNSPEC 0 +#define AFVAL_IP 2 + static const value_string family_vals[] = { - { 2, "IP" }, - { 0, NULL } + { AFVAL_UNSPEC, "Unspecified" }, + { AFVAL_IP, "IP" }, + { 0, NULL } }; #define RIP_HEADER_LENGTH 4 @@ -81,6 +86,8 @@ static int hf_rip_route_tag = -1; static gint ett_rip = -1; static gint ett_rip_vec = -1; +static void dissect_unspec_rip_vektor(tvbuff_t *tvb, int offset, guint8 version, + proto_tree *tree); static void dissect_ip_rip_vektor(tvbuff_t *tvb, int offset, guint8 version, proto_tree *tree); static void dissect_rip_authentication(tvbuff_t *tvb, int offset, @@ -128,7 +135,14 @@ dissect_rip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) while (tvb_reported_length_remaining(tvb, offset) > 0) { family = tvb_get_ntohs(tvb, offset); switch (family) { - case 2: /* IP */ + case AFVAL_UNSPEC: /* Unspecified */ + /* + * There should be one entry in the request, and a metric + * of infinity, meaning "show the entire routing table". + */ + dissect_unspec_rip_vektor(tvb, offset, version, rip_tree); + break; + case AFVAL_IP: /* IP */ dissect_ip_rip_vektor(tvb, offset, version, rip_tree); break; case 0xFFFF: @@ -147,6 +161,33 @@ dissect_rip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } static void +dissect_unspec_rip_vektor(tvbuff_t *tvb, int offset, guint8 version, + proto_tree *tree) +{ + proto_item *ti; + proto_tree *rip_vektor_tree; + guint32 metric; + + metric = tvb_get_ntohl(tvb, offset+16); + ti = proto_tree_add_text(tree, tvb, offset, + RIP_ENTRY_LENGTH, "Address not specified, Metric: %u", + metric); + rip_vektor_tree = proto_item_add_subtree(ti, ett_rip_vec); + + proto_tree_add_item(rip_vektor_tree, hf_rip_family, tvb, offset, 2, FALSE); + if (version == RIPv2) { + proto_tree_add_item(rip_vektor_tree, hf_rip_route_tag, tvb, offset+2, 2, + FALSE); + proto_tree_add_item(rip_vektor_tree, hf_rip_netmask, tvb, offset+8, 4, + FALSE); + proto_tree_add_item(rip_vektor_tree, hf_rip_next_hop, tvb, offset+12, 4, + FALSE); + } + proto_tree_add_uint(rip_vektor_tree, hf_rip_metric, tvb, + offset+16, 4, metric); +} + +static void dissect_ip_rip_vektor(tvbuff_t *tvb, int offset, guint8 version, proto_tree *tree) { @@ -159,13 +200,11 @@ dissect_ip_rip_vektor(tvbuff_t *tvb, int offset, guint8 version, RIP_ENTRY_LENGTH, "IP Address: %s, Metric: %u", ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), metric); rip_vektor_tree = proto_item_add_subtree(ti, ett_rip_vec); - - proto_tree_add_uint(rip_vektor_tree, hf_rip_family, tvb, offset, 2, - tvb_get_ntohs(tvb, offset)); + proto_tree_add_item(rip_vektor_tree, hf_rip_family, tvb, offset, 2, FALSE); if (version == RIPv2) { - proto_tree_add_uint(rip_vektor_tree, hf_rip_route_tag, tvb, offset+2, 2, - tvb_get_ntohs(tvb, offset+2)); + proto_tree_add_item(rip_vektor_tree, hf_rip_route_tag, tvb, offset+2, 2, + FALSE); } proto_tree_add_item(rip_vektor_tree, hf_rip_ip, tvb, offset+4, 4, FALSE); @@ -196,7 +235,7 @@ dissect_rip_authentication(tvbuff_t *tvb, int offset, proto_tree *tree) authtype); if (authtype == 2) { proto_tree_add_item(rip_authentication_tree, hf_rip_auth_passwd, - tvb, offset+4, 16, TRUE); + tvb, offset+4, 16, FALSE); } } |