Ethereal-dev: [Ethereal-dev] [PATCH] Fix handling of IP fragment bits
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: nick black <dank@xxxxxxxxxxxxxxxxxx>
Date: Tue, 17 Feb 2004 09:06:55 -0500
Hello there. Currently, Ethereal not only refrains from displaying whether the reserved bit is explictly set, it also erroneously displays only mf | df & ~offmask (ie MF + reserved bit shows Flags: 0x02 rather than 0x0A). Reading the list, there seems to have been some confusion stemming from ECN and certain kernels' use of IP_CE. The two bits used for ECN within the IP header come from the differentiated services/ToS bits in both RFC 2481 and 3168. Linux's ECN implementation in the IP header is restricted to these bits, but declares IP_CE in include/net/ip.h with the comment "Congestion". This is only used in netfilter (the actual testing of IP bits for ECN is done in include/net/inet_ecn.h, and clearly shows the ToS bits being used) for a log. FreeBSD knows no IP_CE, only IP_RF. This patch does away with mentions of CE and congestion in the fragment bits field, uses the flag binary set for the RF, and fixes the Flags: display. Please apply. diff -ur ethereal-0.10.0a-orig/packet-ip.c ethereal-0.10.0a/packet-ip.c --- ethereal-0.10.0a-orig/packet-ip.c 2004-02-17 07:36:20.000000000 -0500 +++ ethereal-0.10.0a/packet-ip.c 2004-02-17 08:39:11.000000000 -0500 @@ -84,6 +84,7 @@ static int hf_ip_src = -1; static int hf_ip_addr = -1; static int hf_ip_flags = -1; +static int hf_ip_flags_rf = -1; static int hf_ip_flags_df = -1; static int hf_ip_flags_mf = -1; static int hf_ip_frag_offset = -1; @@ -220,7 +221,7 @@ #define IPH_MIN_LEN 20 /* IP flags. */ -#define IP_CE 0x8000 /* Flag: "Congestion" */ +#define IP_RF 0x8000 /* Flag: "Reserved bit" */ #define IP_DF 0x4000 /* Flag: "Don't Fragment" */ #define IP_MF 0x2000 /* Flag: "More Fragments" */ #define IP_OFFSET 0x1FFF /* "Fragment Offset" part */ @@ -927,9 +928,10 @@ iph->ip_off = tvb_get_ntohs(tvb, offset + 6); if (tree) { - flags = (iph->ip_off & (IP_DF|IP_MF)) >> 12; + flags = (iph->ip_off & (IP_RF | IP_DF | IP_MF)) >> 12; tf = proto_tree_add_uint(ip_tree, hf_ip_flags, tvb, offset + 6, 1, flags); field_tree = proto_item_add_subtree(tf, ett_ip_off); + proto_tree_add_boolean(field_tree, hf_ip_flags_rf, tvb, offset + 6, 1, flags), proto_tree_add_boolean(field_tree, hf_ip_flags_df, tvb, offset + 6, 1, flags), proto_tree_add_boolean(field_tree, hf_ip_flags_mf, tvb, offset + 6, 1, flags), @@ -1633,12 +1635,16 @@ { "Flags", "ip.flags", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }}, + { &hf_ip_flags_rf, + { "Reserved bit", "ip.flags.rb", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_RF >> 12, + "", HFILL }}, + { &hf_ip_flags_df, - { "Don't fragment", "ip.flags.df", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_DF>>12, + { "Don't fragment", "ip.flags.df", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_DF >> 12, "", HFILL }}, { &hf_ip_flags_mf, - { "More fragments", "ip.flags.mf", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_MF>>12, + { "More fragments", "ip.flags.mf", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_MF >> 12, "", HFILL }}, { &hf_ip_frag_offset, -- nick black <dank@xxxxxxxxxxxxxxxxxx> "np: nondeterministic polynomial-time the class of dashed hopes and idle dreams." - the complexity zoo
diff -ur ethereal-0.10.0a-orig/packet-ip.c ethereal-0.10.0a/packet-ip.c --- ethereal-0.10.0a-orig/packet-ip.c 2004-02-17 07:36:20.000000000 -0500 +++ ethereal-0.10.0a/packet-ip.c 2004-02-17 08:39:11.000000000 -0500 @@ -84,6 +84,7 @@ static int hf_ip_src = -1; static int hf_ip_addr = -1; static int hf_ip_flags = -1; +static int hf_ip_flags_rf = -1; static int hf_ip_flags_df = -1; static int hf_ip_flags_mf = -1; static int hf_ip_frag_offset = -1; @@ -220,7 +221,7 @@ #define IPH_MIN_LEN 20 /* IP flags. */ -#define IP_CE 0x8000 /* Flag: "Congestion" */ +#define IP_RF 0x8000 /* Flag: "Reserved bit" */ #define IP_DF 0x4000 /* Flag: "Don't Fragment" */ #define IP_MF 0x2000 /* Flag: "More Fragments" */ #define IP_OFFSET 0x1FFF /* "Fragment Offset" part */ @@ -927,9 +928,10 @@ iph->ip_off = tvb_get_ntohs(tvb, offset + 6); if (tree) { - flags = (iph->ip_off & (IP_DF|IP_MF)) >> 12; + flags = (iph->ip_off & (IP_RF | IP_DF | IP_MF)) >> 12; tf = proto_tree_add_uint(ip_tree, hf_ip_flags, tvb, offset + 6, 1, flags); field_tree = proto_item_add_subtree(tf, ett_ip_off); + proto_tree_add_boolean(field_tree, hf_ip_flags_rf, tvb, offset + 6, 1, flags), proto_tree_add_boolean(field_tree, hf_ip_flags_df, tvb, offset + 6, 1, flags), proto_tree_add_boolean(field_tree, hf_ip_flags_mf, tvb, offset + 6, 1, flags), @@ -1633,12 +1635,16 @@ { "Flags", "ip.flags", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }}, + { &hf_ip_flags_rf, + { "Reserved bit", "ip.flags.rb", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_RF >> 12, + "", HFILL }}, + { &hf_ip_flags_df, - { "Don't fragment", "ip.flags.df", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_DF>>12, + { "Don't fragment", "ip.flags.df", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_DF >> 12, "", HFILL }}, { &hf_ip_flags_mf, - { "More fragments", "ip.flags.mf", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_MF>>12, + { "More fragments", "ip.flags.mf", FT_BOOLEAN, 4, TFS(&flags_set_truth), IP_MF >> 12, "", HFILL }}, { &hf_ip_frag_offset,
- Follow-Ups:
- Re: [Ethereal-dev] [PATCH] Fix handling of IP fragment bits
- From: Guy Harris
- Re: [Ethereal-dev] [PATCH] Fix handling of IP fragment bits
- Prev by Date: [Ethereal-dev] Re: Ethereal - Remember Directory feature
- Next by Date: Re: [Ethereal-dev] Re: Ethereal - Remember Directory feature
- Previous by thread: Re: [Ethereal-dev] Re: Ethereal - Remember Directory feature
- Next by thread: Re: [Ethereal-dev] [PATCH] Fix handling of IP fragment bits
- Index(es):