diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-12-08 13:28:01 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-12-08 13:28:01 +0000 |
commit | 17a94af10e8aa9c373c145d04d5a5d0cce4aa377 (patch) | |
tree | c99917661ab15a6a5675ccf271acf3eb8ee63de4 /epan/dissectors/packet-netlink-route.c | |
parent | d6ca0073b03dd8f80dfa0444ac570623b291ffb9 (diff) |
netlink-route: extend Interface IP address dissections
+ try to fix make dist
svn path=/trunk/; revision=53854
Diffstat (limited to 'epan/dissectors/packet-netlink-route.c')
-rw-r--r-- | epan/dissectors/packet-netlink-route.c | 92 |
1 files changed, 89 insertions, 3 deletions
diff --git a/epan/dissectors/packet-netlink-route.c b/epan/dissectors/packet-netlink-route.c index ba3053306d..d073809ce2 100644 --- a/epan/dissectors/packet-netlink-route.c +++ b/epan/dissectors/packet-netlink-route.c @@ -129,6 +129,18 @@ enum ws_ifla_attr_type { WS_IFLA_CARRIER = 33 }; +/* values for rta_type (ip address) from <linux/if_addr.h> */ +enum ws_ifa_attr_type { + WS_IFA_UNSPEC = 0, + WS_IFA_ADDRESS = 1, + WS_IFA_LOCAL = 2, + WS_IFA_LABEL = 3, + WS_IFA_BROADCAST = 4, + WS_IFA_ANYCAST = 5, + WS_IFA_CACHEINFO = 6, + WS_IFA_MULTICAST = 7, +}; + /* values for rta_type (route) from <linux/rtnetlink.h> */ enum ws_rta_attr_type { WS_RTA_UNSPEC = 0, @@ -459,7 +471,7 @@ static header_field_info hfi_netlink_route_ifla_mtu NETLINK_ROUTE_HFI_INIT = NULL, 0x00, NULL, HFILL }; static int -dissect_netlink_route_if_attrs(tvbuff_t *tvb, struct netlink_route_info *info, proto_tree *tree, int rta_type, int offset, int len) +dissect_netlink_route_ifla_attrs(tvbuff_t *tvb, struct netlink_route_info *info, proto_tree *tree, int rta_type, int offset, int len) { enum ws_ifla_attr_type type = (enum ws_ifla_attr_type) rta_type; @@ -485,15 +497,80 @@ static header_field_info hfi_netlink_route_ifa_family NETLINK_ROUTE_HFI_INIT = { "Address type", "netlink-route.ifa_family", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &linux_af_vals_ext, 0x00, NULL, HFILL }; +static header_field_info hfi_netlink_route_ifa_prefixlen NETLINK_ROUTE_HFI_INIT = + { "Address prefixlength", "netlink-route.ifa_prefixlen", FT_UINT8, BASE_DEC, + NULL, 0x00, NULL, HFILL }; + +static header_field_info hfi_netlink_route_ifa_flags NETLINK_ROUTE_HFI_INIT = + { "Address flags", "netlink-route.ifa_flags", FT_UINT8, BASE_HEX, + NULL, 0x00, NULL, HFILL }; + +static header_field_info hfi_netlink_route_ifa_scope NETLINK_ROUTE_HFI_INIT = + { "Address scope", "netlink-route.ifa_scope", FT_UINT8, BASE_DEC, + NULL, 0x00, NULL, HFILL }; + +static header_field_info hfi_netlink_route_ifa_index NETLINK_ROUTE_HFI_INIT = + { "Inteface index", "netlink-route.ifa_index", FT_INT32, BASE_DEC, + NULL, 0x00, NULL, HFILL }; + static int -dissect_netlink_route_ifaddrmsg(tvbuff_t *tvb, struct netlink_route_info *info _U_, proto_tree *tree, int offset) +dissect_netlink_route_ifaddrmsg(tvbuff_t *tvb, struct netlink_route_info *info, proto_tree *tree, int offset) { proto_tree_add_item(tree, &hfi_netlink_route_ifa_family, tvb, offset, 1, ENC_NA); offset += 1; + proto_tree_add_item(tree, &hfi_netlink_route_ifa_prefixlen, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(tree, &hfi_netlink_route_ifa_flags, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(tree, &hfi_netlink_route_ifa_scope, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(tree, &hfi_netlink_route_ifa_index, tvb, offset, 4, info->encoding); + offset += 4; + return offset; } +/* IP address attributes */ + +static const value_string netlink_route_ifa_attr_vals[] = { + { WS_IFA_UNSPEC, "Unspecified" }, + { WS_IFA_ADDRESS, "Interface address" }, + { WS_IFA_LOCAL, "Local address" }, + { WS_IFA_LABEL, "Name of interface" }, + { WS_IFA_BROADCAST, "Broadcast address" }, + { WS_IFA_ANYCAST, "Anycast address" }, + { WS_IFA_CACHEINFO, "Address information" }, + { WS_IFA_MULTICAST, "Multicast address" }, + { 0, NULL } +}; + +static header_field_info hfi_netlink_route_ifa_attr_type NETLINK_ROUTE_HFI_INIT = + { "Attribute type", "netlink-route.ifa_attr_type", FT_UINT16, BASE_DEC, + VALS(netlink_route_ifa_attr_vals), 0x00, NULL, HFILL }; + +static header_field_info hfi_netlink_route_ifa_label NETLINK_ROUTE_HFI_INIT = + { "Interface name", "netlink-route.ifa_label", FT_STRINGZ, STR_ASCII, + NULL, 0x00, NULL, HFILL }; + +static int +dissect_netlink_route_ifa_attrs(tvbuff_t *tvb, struct netlink_route_info *info _U_, proto_tree *tree, int rta_type, int offset, int len) +{ + enum ws_ifa_attr_type type = (enum ws_ifa_attr_type) rta_type; + + switch (type) { + case WS_IFA_LABEL: + proto_tree_add_item(tree, &hfi_netlink_route_ifa_label, tvb, offset, len, ENC_ASCII | ENC_NA); + return 1; + + default: + return 0; + } +} + /* Route */ static header_field_info hfi_netlink_route_rt_family NETLINK_ROUTE_HFI_INIT = { "Address family", "netlink-route.rt_family", FT_UINT8, BASE_DEC | BASE_EXT_STRING, @@ -696,13 +773,15 @@ dissect_netlink_route(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void case WS_RTM_GETLINK: offset = dissect_netlink_route_ifinfomsg(tvb, &info, tree, offset); /* Optional attributes */ - offset = dissect_netlink_route_attributes(tvb, &hfi_netlink_route_ifla_attr_type, &info, tree, offset, dissect_netlink_route_if_attrs); + offset = dissect_netlink_route_attributes(tvb, &hfi_netlink_route_ifla_attr_type, &info, tree, offset, dissect_netlink_route_ifla_attrs); break; case WS_RTM_NEWADDR: case WS_RTM_DELADDR: case WS_RTM_GETADDR: offset = dissect_netlink_route_ifaddrmsg(tvb, &info, tree, offset); + /* Optional attributes */ + offset = dissect_netlink_route_attributes(tvb, &hfi_netlink_route_ifa_attr_type, &info, tree, offset, dissect_netlink_route_ifa_attrs); break; case WS_RTM_NEWROUTE: @@ -739,6 +818,13 @@ proto_register_netlink_route(void) /* IP address */ &hfi_netlink_route_ifa_family, + &hfi_netlink_route_ifa_prefixlen, + &hfi_netlink_route_ifa_flags, + &hfi_netlink_route_ifa_scope, + &hfi_netlink_route_ifa_index, + /* IP address Attributes */ + &hfi_netlink_route_ifa_attr_type, + &hfi_netlink_route_ifa_label, /* Network Route */ &hfi_netlink_route_rt_family, |