diff options
author | Bill Meier <wmeier@newsguy.com> | 2014-09-28 19:25:09 -0400 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2014-09-29 13:47:02 +0000 |
commit | 10406870f5c39617f57cc0a77f55100404505c17 (patch) | |
tree | ea566d2ff47afa6b53ccbb2709be65847e17b0e1 /epan/dissectors/packet-eth.c | |
parent | 768e36fc4fae55932bcddb0b5435c81da475b01d (diff) |
Add editor modelines; fix indentation as needed.
Change-Id: I1ad94654343e5a018a0b3159481d45ffb3a91263
Reviewed-on: https://code.wireshark.org/review/4363
Reviewed-by: Bill Meier <wmeier@newsguy.com>
Diffstat (limited to 'epan/dissectors/packet-eth.c')
-rw-r--r-- | epan/dissectors/packet-eth.c | 439 |
1 files changed, 226 insertions, 213 deletions
diff --git a/epan/dissectors/packet-eth.c b/epan/dissectors/packet-eth.c index 30773c5e91..a972e3999e 100644 --- a/epan/dissectors/packet-eth.c +++ b/epan/dissectors/packet-eth.c @@ -100,27 +100,27 @@ static int eth_tap = -1; #define ETH_HEADER_SIZE 14 static const true_false_string ig_tfs = { - "Group address (multicast/broadcast)", - "Individual address (unicast)" + "Group address (multicast/broadcast)", + "Individual address (unicast)" }; static const true_false_string lg_tfs = { - "Locally administered address (this is NOT the factory default)", - "Globally unique address (factory default)" + "Locally administered address (this is NOT the factory default)", + "Globally unique address (factory default)" }; static const char* eth_conv_get_filter_type(conv_item_t* conv, conv_filter_type_e filter) { - if ((filter == CONV_FT_SRC_ADDRESS) && (conv->src_address.type == AT_ETHER)) - return "eth.src"; + if ((filter == CONV_FT_SRC_ADDRESS) && (conv->src_address.type == AT_ETHER)) + return "eth.src"; - if ((filter == CONV_FT_DST_ADDRESS) && (conv->dst_address.type == AT_ETHER)) - return "eth.dst"; + if ((filter == CONV_FT_DST_ADDRESS) && (conv->dst_address.type == AT_ETHER)) + return "eth.dst"; - if ((filter == CONV_FT_ANY_ADDRESS) && (conv->src_address.type == AT_ETHER)) - return "eth.addr"; + if ((filter == CONV_FT_ANY_ADDRESS) && (conv->src_address.type == AT_ETHER)) + return "eth.addr"; - return CONV_FILTER_INVALID; + return CONV_FILTER_INVALID; } static ct_dissector_info_t eth_ct_dissector_info = {ð_conv_get_filter_type}; @@ -128,20 +128,20 @@ static ct_dissector_info_t eth_ct_dissector_info = {ð_conv_get_filter_type}; static int eth_conversation_packet(void *pct, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip) { - conv_hash_t *hash = (conv_hash_t*) pct; - const eth_hdr *ehdr=(const eth_hdr *)vip; + conv_hash_t *hash = (conv_hash_t*) pct; + const eth_hdr *ehdr=(const eth_hdr *)vip; - add_conversation_table_data(hash, &ehdr->src, &ehdr->dst, 0, 0, 1, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->fd->abs_ts, ð_ct_dissector_info, PT_NONE); + add_conversation_table_data(hash, &ehdr->src, &ehdr->dst, 0, 0, 1, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->fd->abs_ts, ð_ct_dissector_info, PT_NONE); - return 1; + return 1; } static const char* eth_host_get_filter_type(hostlist_talker_t* host, conv_filter_type_e filter) { - if ((filter == CONV_FT_ANY_ADDRESS) && (host->myaddress.type == AT_ETHER)) - return "eth.addr"; + if ((filter == CONV_FT_ANY_ADDRESS) && (host->myaddress.type == AT_ETHER)) + return "eth.addr"; - return CONV_FILTER_INVALID; + return CONV_FILTER_INVALID; } static hostlist_dissector_info_t eth_host_dissector_info = {ð_host_get_filter_type}; @@ -149,16 +149,16 @@ static hostlist_dissector_info_t eth_host_dissector_info = {ð_host_get_filter static int eth_hostlist_packet(void *pit, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip) { - conv_hash_t *hash = (conv_hash_t*) pit; - const eth_hdr *ehdr=(const eth_hdr *)vip; + conv_hash_t *hash = (conv_hash_t*) pit; + const eth_hdr *ehdr=(const eth_hdr *)vip; - /* Take two "add" passes per packet, adding for each direction, ensures that all - packets are counted properly (even if address is sending to itself) - XXX - this could probably be done more efficiently inside hostlist_table */ - add_hostlist_table_data(hash, &ehdr->src, 0, TRUE, 1, pinfo->fd->pkt_len, ð_host_dissector_info, PT_NONE); - add_hostlist_table_data(hash, &ehdr->dst, 0, FALSE, 1, pinfo->fd->pkt_len, ð_host_dissector_info, PT_NONE); + /* Take two "add" passes per packet, adding for each direction, ensures that all + packets are counted properly (even if address is sending to itself) + XXX - this could probably be done more efficiently inside hostlist_table */ + add_hostlist_table_data(hash, &ehdr->src, 0, TRUE, 1, pinfo->fd->pkt_len, ð_host_dissector_info, PT_NONE); + add_hostlist_table_data(hash, &ehdr->dst, 0, FALSE, 1, pinfo->fd->pkt_len, ð_host_dissector_info, PT_NONE); - return 1; + return 1; } @@ -835,203 +835,216 @@ dissect_eth_withfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) void proto_register_eth(void) { - static hf_register_info hf[] = { - - { &hf_eth_dst, - { "Destination", "eth.dst", FT_ETHER, BASE_NONE, NULL, 0x0, - "Destination Hardware Address", HFILL }}, - - { &hf_eth_dst_resolved, - { "Destination (resolved)", "eth.dst_resolved", FT_STRING, BASE_NONE, - NULL, 0x0, "Destination Hardware Address (resolved)", HFILL }}, - - { &hf_eth_src, - { "Source", "eth.src", FT_ETHER, BASE_NONE, NULL, 0x0, - "Source Hardware Address", HFILL }}, - - { &hf_eth_src_resolved, - { "Source (resolved)", "eth.src_resolved", FT_STRING, BASE_NONE, - NULL, 0x0, "Source Hardware Address (resolved)", HFILL }}, - - { &hf_eth_len, - { "Length", "eth.len", FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, - - /* registered here but handled in packet-ethertype.c */ - { &hf_eth_type, - { "Type", "eth.type", FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0, - NULL, HFILL }}, - - { &hf_eth_invalid_lentype, - { "Invalid length/type", "eth.invalid_lentype", FT_UINT16, BASE_HEX_DEC, - NULL, 0x0, NULL, HFILL }}, - - { &hf_eth_addr, - { "Address", "eth.addr", FT_ETHER, BASE_NONE, NULL, 0x0, - "Source or Destination Hardware Address", HFILL }}, - - { &hf_eth_addr_resolved, - { "Address (resolved)", "eth.addr_resolved", FT_STRING, BASE_NONE, - NULL, 0x0, "Source or Destination Hardware Address (resolved)", - HFILL }}, - - { &hf_eth_padding, - { "Padding", "eth.padding", FT_BYTES, BASE_NONE, NULL, 0x0, - "Ethernet Padding", HFILL }}, - - { &hf_eth_trailer, - { "Trailer", "eth.trailer", FT_BYTES, BASE_NONE, NULL, 0x0, - "Ethernet Trailer or Checksum", HFILL }}, - - { &hf_eth_fcs, - { "Frame check sequence", "eth.fcs", FT_UINT32, BASE_HEX, NULL, 0x0, - "Ethernet checksum", HFILL }}, - - { &hf_eth_fcs_good, - { "FCS Good", "eth.fcs_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_eth_fcs_bad, - { "FCS Bad", "eth.fcs_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't matche packet content; False: does match content or not checked", HFILL }}, - - { &hf_eth_lg, - { "LG bit", "eth.lg", FT_BOOLEAN, 24, - TFS(&lg_tfs), 0x020000, - "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }}, - - { &hf_eth_ig, - { "IG bit", "eth.ig", FT_BOOLEAN, 24, - TFS(&ig_tfs), 0x010000, - "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }} - }; - static gint *ett[] = { - &ett_ieee8023, - &ett_ether2, - &ett_ether, - &ett_addr, - &ett_eth_fcs - }; - - static ei_register_info ei[] = { - { &ei_eth_invalid_lentype, { "eth.invalid_lentype", PI_PROTOCOL, PI_WARN, "Invalid length/type", EXPFILL }}, - { &ei_eth_src_not_group, { "eth.src_not_group", PI_PROTOCOL, PI_WARN, "Source MAC must not be a group address: IEEE 802.3-2002, Section 3.2.3(b)", EXPFILL }}, - { &ei_eth_fcs_bad, { "eth.fcs_bad.expert", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }}, - { &ei_eth_len, { "eth.len.past_end", PI_MALFORMED, PI_ERROR, "Length field value goes past the end of the payload", EXPFILL }}, - }; - - module_t *eth_module; - expert_module_t* expert_eth; - - proto_eth = proto_register_protocol("Ethernet", "Ethernet", "eth"); - proto_register_field_array(proto_eth, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_eth = expert_register_protocol(proto_eth); - expert_register_field_array(expert_eth, ei, array_length(ei)); - - /* subdissector code */ - register_heur_dissector_list("eth", &heur_subdissector_list); - register_heur_dissector_list("eth.trailer", ð_trailer_subdissector_list); - - /* Register configuration preferences */ - eth_module = prefs_register_protocol(proto_eth, NULL); - - prefs_register_bool_preference(eth_module, "assume_padding", - "Assume short frames which include a trailer contain padding", - "Some devices add trailing data to frames. When this setting is checked " - "the Ethernet dissector will assume there has been added padding to the " - "frame before the trailer was added. Uncheck if a device added a trailer " - "before the frame was padded.", - ð_assume_padding); - - prefs_register_uint_preference(eth_module, "trailer_length", - "Fixed ethernet trailer length", - "Some TAPs add a fixed length ethernet trailer at the end " - "of the frame, but before the (optional) FCS. Make sure it " - "gets interpreted correctly.", - 10, ð_trailer_length); - - prefs_register_bool_preference(eth_module, "assume_fcs", - "Assume packets have FCS", - "Some Ethernet adapters and drivers include the FCS at the end of a packet, others do not. " - "The Ethernet dissector attempts to guess whether a captured packet has an FCS, " - "but it cannot always guess correctly.", - ð_assume_fcs); - - prefs_register_bool_preference(eth_module, "check_fcs", - "Validate the Ethernet checksum if possible", - "Whether to validate the Frame Check Sequence", - ð_check_fcs); - - prefs_register_bool_preference(eth_module, "interpret_as_fw1_monitor", - "Attempt to interpret as FireWall-1 monitor file", - "Whether packets should be interpreted as coming from CheckPoint FireWall-1 monitor file if they look as if they do", - ð_interpret_as_fw1_monitor); - - prefs_register_static_text_preference(eth_module, "ccsds_heuristic", - "These are the conditions to match a payload against in order to determine if this\n" - "is a CCSDS (Consultative Committee for Space Data Systems) packet within\n" - "an 802.3 packet. A packet is considered as a possible CCSDS packet only if\n" - "one or more of the conditions are checked.", - "Describe the conditions that must be true for the CCSDS dissector to be called"); - - prefs_register_bool_preference(eth_module, "ccsds_heuristic_length", - "CCSDS Length in header matches payload size", - "Set the condition that must be true for the CCSDS dissector to be called", - &ccsds_heuristic_length); - - prefs_register_bool_preference(eth_module, "ccsds_heuristic_version", - "CCSDS Version # is zero", - "Set the condition that must be true for the CCSDS dissector to be called", - &ccsds_heuristic_version); - - prefs_register_bool_preference(eth_module, "ccsds_heuristic_header", - "CCSDS Secondary Header Flag is set", - "Set the condition that must be true for the CCSDS dissector to be called", - &ccsds_heuristic_header); - - prefs_register_bool_preference(eth_module, "ccsds_heuristic_bit", - "CCSDS Spare bit is cleared", - "Set the condition that must be true for the CCSDS dissector to be called", - &ccsds_heuristic_bit); - - register_dissector("eth_withoutfcs", dissect_eth_withoutfcs, proto_eth); - register_dissector("eth_withfcs", dissect_eth_withfcs, proto_eth); - register_dissector("eth", dissect_eth_maybefcs, proto_eth); - eth_tap = register_tap("eth"); - - register_conversation_table(proto_eth, TRUE, eth_conversation_packet, eth_hostlist_packet, NULL); + static hf_register_info hf[] = { + + { &hf_eth_dst, + { "Destination", "eth.dst", FT_ETHER, BASE_NONE, NULL, 0x0, + "Destination Hardware Address", HFILL }}, + + { &hf_eth_dst_resolved, + { "Destination (resolved)", "eth.dst_resolved", FT_STRING, BASE_NONE, + NULL, 0x0, "Destination Hardware Address (resolved)", HFILL }}, + + { &hf_eth_src, + { "Source", "eth.src", FT_ETHER, BASE_NONE, NULL, 0x0, + "Source Hardware Address", HFILL }}, + + { &hf_eth_src_resolved, + { "Source (resolved)", "eth.src_resolved", FT_STRING, BASE_NONE, + NULL, 0x0, "Source Hardware Address (resolved)", HFILL }}, + + { &hf_eth_len, + { "Length", "eth.len", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + /* registered here but handled in packet-ethertype.c */ + { &hf_eth_type, + { "Type", "eth.type", FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0, + NULL, HFILL }}, + + { &hf_eth_invalid_lentype, + { "Invalid length/type", "eth.invalid_lentype", FT_UINT16, BASE_HEX_DEC, + NULL, 0x0, NULL, HFILL }}, + + { &hf_eth_addr, + { "Address", "eth.addr", FT_ETHER, BASE_NONE, NULL, 0x0, + "Source or Destination Hardware Address", HFILL }}, + + { &hf_eth_addr_resolved, + { "Address (resolved)", "eth.addr_resolved", FT_STRING, BASE_NONE, + NULL, 0x0, "Source or Destination Hardware Address (resolved)", + HFILL }}, + + { &hf_eth_padding, + { "Padding", "eth.padding", FT_BYTES, BASE_NONE, NULL, 0x0, + "Ethernet Padding", HFILL }}, + + { &hf_eth_trailer, + { "Trailer", "eth.trailer", FT_BYTES, BASE_NONE, NULL, 0x0, + "Ethernet Trailer or Checksum", HFILL }}, + + { &hf_eth_fcs, + { "Frame check sequence", "eth.fcs", FT_UINT32, BASE_HEX, NULL, 0x0, + "Ethernet checksum", HFILL }}, + + { &hf_eth_fcs_good, + { "FCS Good", "eth.fcs_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, + + { &hf_eth_fcs_bad, + { "FCS Bad", "eth.fcs_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "True: checksum doesn't matche packet content; False: does match content or not checked", HFILL }}, + + { &hf_eth_lg, + { "LG bit", "eth.lg", FT_BOOLEAN, 24, + TFS(&lg_tfs), 0x020000, + "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }}, + + { &hf_eth_ig, + { "IG bit", "eth.ig", FT_BOOLEAN, 24, + TFS(&ig_tfs), 0x010000, + "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }} + }; + static gint *ett[] = { + &ett_ieee8023, + &ett_ether2, + &ett_ether, + &ett_addr, + &ett_eth_fcs + }; + + static ei_register_info ei[] = { + { &ei_eth_invalid_lentype, { "eth.invalid_lentype", PI_PROTOCOL, PI_WARN, "Invalid length/type", EXPFILL }}, + { &ei_eth_src_not_group, { "eth.src_not_group", PI_PROTOCOL, PI_WARN, "Source MAC must not be a group address: IEEE 802.3-2002, Section 3.2.3(b)", EXPFILL }}, + { &ei_eth_fcs_bad, { "eth.fcs_bad.expert", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }}, + { &ei_eth_len, { "eth.len.past_end", PI_MALFORMED, PI_ERROR, "Length field value goes past the end of the payload", EXPFILL }}, + }; + + module_t *eth_module; + expert_module_t* expert_eth; + + proto_eth = proto_register_protocol("Ethernet", "Ethernet", "eth"); + proto_register_field_array(proto_eth, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_eth = expert_register_protocol(proto_eth); + expert_register_field_array(expert_eth, ei, array_length(ei)); + + /* subdissector code */ + register_heur_dissector_list("eth", &heur_subdissector_list); + register_heur_dissector_list("eth.trailer", ð_trailer_subdissector_list); + + /* Register configuration preferences */ + eth_module = prefs_register_protocol(proto_eth, NULL); + + prefs_register_bool_preference(eth_module, "assume_padding", + "Assume short frames which include a trailer contain padding", + "Some devices add trailing data to frames. When this setting is checked " + "the Ethernet dissector will assume there has been added padding to the " + "frame before the trailer was added. Uncheck if a device added a trailer " + "before the frame was padded.", + ð_assume_padding); + + prefs_register_uint_preference(eth_module, "trailer_length", + "Fixed ethernet trailer length", + "Some TAPs add a fixed length ethernet trailer at the end " + "of the frame, but before the (optional) FCS. Make sure it " + "gets interpreted correctly.", + 10, ð_trailer_length); + + prefs_register_bool_preference(eth_module, "assume_fcs", + "Assume packets have FCS", + "Some Ethernet adapters and drivers include the FCS at the end of a packet, others do not. " + "The Ethernet dissector attempts to guess whether a captured packet has an FCS, " + "but it cannot always guess correctly.", + ð_assume_fcs); + + prefs_register_bool_preference(eth_module, "check_fcs", + "Validate the Ethernet checksum if possible", + "Whether to validate the Frame Check Sequence", + ð_check_fcs); + + prefs_register_bool_preference(eth_module, "interpret_as_fw1_monitor", + "Attempt to interpret as FireWall-1 monitor file", + "Whether packets should be interpreted as coming from CheckPoint FireWall-1 monitor file if they look as if they do", + ð_interpret_as_fw1_monitor); + + prefs_register_static_text_preference(eth_module, "ccsds_heuristic", + "These are the conditions to match a payload against in order to determine if this\n" + "is a CCSDS (Consultative Committee for Space Data Systems) packet within\n" + "an 802.3 packet. A packet is considered as a possible CCSDS packet only if\n" + "one or more of the conditions are checked.", + "Describe the conditions that must be true for the CCSDS dissector to be called"); + + prefs_register_bool_preference(eth_module, "ccsds_heuristic_length", + "CCSDS Length in header matches payload size", + "Set the condition that must be true for the CCSDS dissector to be called", + &ccsds_heuristic_length); + + prefs_register_bool_preference(eth_module, "ccsds_heuristic_version", + "CCSDS Version # is zero", + "Set the condition that must be true for the CCSDS dissector to be called", + &ccsds_heuristic_version); + + prefs_register_bool_preference(eth_module, "ccsds_heuristic_header", + "CCSDS Secondary Header Flag is set", + "Set the condition that must be true for the CCSDS dissector to be called", + &ccsds_heuristic_header); + + prefs_register_bool_preference(eth_module, "ccsds_heuristic_bit", + "CCSDS Spare bit is cleared", + "Set the condition that must be true for the CCSDS dissector to be called", + &ccsds_heuristic_bit); + + register_dissector("eth_withoutfcs", dissect_eth_withoutfcs, proto_eth); + register_dissector("eth_withfcs", dissect_eth_withfcs, proto_eth); + register_dissector("eth", dissect_eth_maybefcs, proto_eth); + eth_tap = register_tap("eth"); + + register_conversation_table(proto_eth, TRUE, eth_conversation_packet, eth_hostlist_packet, NULL); } void proto_reg_handoff_eth(void) { - dissector_handle_t eth_maybefcs_handle, eth_withoutfcs_handle; + dissector_handle_t eth_maybefcs_handle, eth_withoutfcs_handle; - /* Get a handle for the Firewall-1 dissector. */ - fw1_handle = find_dissector("fw1"); + /* Get a handle for the Firewall-1 dissector. */ + fw1_handle = find_dissector("fw1"); - /* Get a handle for the ethertype dissector. */ - ethertype_handle = find_dissector("ethertype"); + /* Get a handle for the ethertype dissector. */ + ethertype_handle = find_dissector("ethertype"); - /* Get a handle for the generic data dissector. */ - data_handle = find_dissector("data"); + /* Get a handle for the generic data dissector. */ + data_handle = find_dissector("data"); - eth_maybefcs_handle = find_dissector("eth"); - dissector_add_uint("wtap_encap", WTAP_ENCAP_ETHERNET, eth_maybefcs_handle); + eth_maybefcs_handle = find_dissector("eth"); + dissector_add_uint("wtap_encap", WTAP_ENCAP_ETHERNET, eth_maybefcs_handle); - eth_withoutfcs_handle = find_dissector("eth_withoutfcs"); - dissector_add_uint("ethertype", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); - dissector_add_uint("erf.types.type", ERF_TYPE_ETH, eth_withoutfcs_handle); - dissector_add_uint("chdlc.protocol", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); - dissector_add_uint("gre.proto", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); + eth_withoutfcs_handle = find_dissector("eth_withoutfcs"); + dissector_add_uint("ethertype", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); + dissector_add_uint("erf.types.type", ERF_TYPE_ETH, eth_withoutfcs_handle); + dissector_add_uint("chdlc.protocol", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); + dissector_add_uint("gre.proto", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); - dissector_add_uint("sll.ltype", LINUX_SLL_P_ETHERNET, eth_withoutfcs_handle); + dissector_add_uint("sll.ltype", LINUX_SLL_P_ETHERNET, eth_withoutfcs_handle); - /* - * This is to handle the output for the Cisco CMTS "cable intercept" - * command - it encapsulates Ethernet frames in UDP packets, but - * the UDP port is user-defined. - */ - dissector_add_for_decode_as("udp.port", eth_withoutfcs_handle); + /* + * This is to handle the output for the Cisco CMTS "cable intercept" + * command - it encapsulates Ethernet frames in UDP packets, but + * the UDP port is user-defined. + */ + dissector_add_for_decode_as("udp.port", eth_withoutfcs_handle); } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local Variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=2 tabstop=8 expandtab: + * :indentSize=2:tabSize=8:noTabs=true: + */ |