2019-12-27 22:36:56 +00:00
|
|
|
/* packet-netlink-route.c
|
2013-12-08 12:01:32 +00:00
|
|
|
*
|
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
2018-02-12 11:23:27 +00:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
2013-12-08 12:01:32 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* man 7 rtnetlink */
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
#define HFI_DECLS /* for checkAPIs.pl */
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <epan/packet.h>
|
2013-12-08 12:42:10 +00:00
|
|
|
#include <epan/aftypes.h>
|
2018-04-09 18:06:52 +00:00
|
|
|
#include <epan/to_str.h>
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
#include "packet-arp.h"
|
|
|
|
#include "packet-netlink.h"
|
|
|
|
|
2013-12-13 22:34:10 +00:00
|
|
|
void proto_register_netlink_route(void);
|
|
|
|
void proto_reg_handoff_netlink_route(void);
|
|
|
|
|
2021-06-14 02:19:55 +00:00
|
|
|
/*
|
|
|
|
* The "legacy" flag indicates that the packet is a legacy dump
|
|
|
|
* request message.
|
|
|
|
*
|
|
|
|
* Some legacy tools, including iproute2 < 3.9, issue shorter RTM_GETLINK
|
|
|
|
* and RTM_GETADDR dump queries which only contain struct rtgenmsg rather
|
|
|
|
* than struct ifinfomsg. As noted in kernel comment in rtnl_dump_ifinfo(),
|
|
|
|
* these legacy requests will be (even with attributes) always shorter than
|
|
|
|
* struct ifinfomsg so that they are easy to detect.
|
|
|
|
*
|
|
|
|
* Similar problem can be observed with tools using nl_rtgen_request()
|
|
|
|
* function from libnl3; this also affects other RTM_GET* types.
|
|
|
|
*
|
|
|
|
* If such legacy message is detected by length shorter than expected data
|
|
|
|
* structure, we parse it as this legacy version with (1-byte) struct
|
|
|
|
* rtgenmsg so that it's shown as intended rather than as malformed.
|
|
|
|
*
|
|
|
|
* The legacy messages appear, from looking at the iproute2 3.1.0 code,
|
|
|
|
* to be a structure containing a struct nlmsghdr followed by a struct
|
|
|
|
* rtgenmsg.
|
|
|
|
*
|
|
|
|
* struct rtgenmsg contains only a 1-byte address family value, as noted.
|
|
|
|
* *However*, a struct nlmsghdr has a 4-byte length field, and is, as a
|
|
|
|
* result, aligned on a 4-byte boundary, so the structure containing those
|
|
|
|
* two structures is also aligned on a 4-byte boundary, and thus has a
|
|
|
|
* length that's a multiple of 4 bytes. Therefore, there are 3 bytes of
|
|
|
|
* padding following the address family byte.
|
|
|
|
*
|
2021-06-15 04:56:17 +00:00
|
|
|
* The message length, however, doesn't include those bytes.
|
|
|
|
*
|
|
|
|
* Legacy messages don't include any attributes - they're not large enough
|
|
|
|
* to contain anything other than the netlink message header and the one-byte
|
|
|
|
* address family. For legacy messages, the attribute we hand to
|
|
|
|
* dissect_netlink_route_attributes() is not aligned on a 4-byte boundary,
|
|
|
|
* as it's the offset right after the 1-byte address family value;
|
|
|
|
* dissect_netlink_route_attributes() will try to align that on a 4-byte
|
|
|
|
* boundary, but that will go past the "immediately after the end of
|
|
|
|
* the packet" offset, which can cause problems if any checking is done
|
|
|
|
* to make sure the offset is valid. Therefore, we don't try to dissect
|
|
|
|
* the attributes, rather than relying on the attributes dissector to
|
|
|
|
* discover that there's nothing left in the packet.
|
2021-06-14 02:19:55 +00:00
|
|
|
*/
|
2013-12-08 12:01:32 +00:00
|
|
|
struct netlink_route_info {
|
|
|
|
packet_info *pinfo;
|
2017-03-10 07:59:02 +00:00
|
|
|
gboolean legacy;
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum {
|
2019-12-27 22:36:56 +00:00
|
|
|
/* rtnetlink values for nlmsghdr.nlmsg_type from <include/uapi/linux/rtnetlink.h> */
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_RTM_NEWLINK = 16,
|
|
|
|
WS_RTM_DELLINK = 17,
|
|
|
|
WS_RTM_GETLINK = 18,
|
|
|
|
WS_RTM_SETLINK = 19,
|
|
|
|
WS_RTM_NEWADDR = 20,
|
|
|
|
WS_RTM_DELADDR = 21,
|
|
|
|
WS_RTM_GETADDR = 22,
|
|
|
|
WS_RTM_NEWROUTE = 24,
|
|
|
|
WS_RTM_DELROUTE = 25,
|
|
|
|
WS_RTM_GETROUTE = 26,
|
|
|
|
WS_RTM_NEWNEIGH = 28,
|
|
|
|
WS_RTM_DELNEIGH = 29,
|
|
|
|
WS_RTM_GETNEIGH = 30,
|
|
|
|
WS_RTM_NEWRULE = 32,
|
|
|
|
WS_RTM_DELRULE = 33,
|
|
|
|
WS_RTM_GETRULE = 34,
|
|
|
|
WS_RTM_NEWQDISC = 36,
|
|
|
|
WS_RTM_DELQDISC = 37,
|
|
|
|
WS_RTM_GETQDISC = 38,
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_RTM_NEWTCLASS = 40,
|
|
|
|
WS_RTM_DELTCLASS = 41,
|
|
|
|
WS_RTM_GETTCLASS = 42,
|
|
|
|
WS_RTM_NEWTFILTER = 44,
|
|
|
|
WS_RTM_DELTFILTER = 45,
|
|
|
|
WS_RTM_GETTFILTER = 46,
|
|
|
|
WS_RTM_NEWACTION = 48,
|
|
|
|
WS_RTM_DELACTION = 49,
|
|
|
|
WS_RTM_GETACTION = 50,
|
|
|
|
WS_RTM_NEWPREFIX = 52,
|
2013-12-08 12:01:32 +00:00
|
|
|
WS_RTM_GETMULTICAST = 58,
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_RTM_GETANYCAST = 62,
|
|
|
|
WS_RTM_NEWNEIGHTBL = 64,
|
|
|
|
WS_RTM_GETNEIGHTBL = 66,
|
|
|
|
WS_RTM_SETNEIGHTBL = 67,
|
2013-12-08 12:01:32 +00:00
|
|
|
WS_RTM_NEWNDUSEROPT = 68,
|
|
|
|
WS_RTM_NEWADDRLABEL = 72,
|
|
|
|
WS_RTM_DELADDRLABEL = 73,
|
|
|
|
WS_RTM_GETADDRLABEL = 74,
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_RTM_GETDCB = 78,
|
|
|
|
WS_RTM_SETDCB = 79,
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_RTM_NEWNETCONF = 80,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_RTM_DELNETCONF = 81,
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_RTM_GETNETCONF = 82,
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_RTM_NEWMDB = 84,
|
|
|
|
WS_RTM_DELMDB = 85,
|
|
|
|
WS_RTM_GETMDB = 86,
|
|
|
|
WS_RTM_NEWNSID = 88,
|
|
|
|
WS_RTM_DELNSID = 89,
|
|
|
|
WS_RTM_GETNSID = 90,
|
|
|
|
WS_RTM_NEWSTATS = 92,
|
|
|
|
WS_RTM_GETSTATS = 94,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_RTM_NEWCACHEREPORT = 96,
|
|
|
|
WS_RTM_NEWCHAIN = 100,
|
|
|
|
WS_RTM_DELCHAIN = 101,
|
|
|
|
WS_RTM_GETCHAIN = 102,
|
|
|
|
WS_RTM_NEWNEXTHOP = 104,
|
|
|
|
WS_RTM_DELNEXTHOP = 105,
|
|
|
|
WS_RTM_GETNEXTHOP = 106,
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for rta_type (network interface) from </include/uapi/linux/if_link.h> */
|
2013-12-08 12:01:32 +00:00
|
|
|
enum ws_ifla_attr_type {
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_IFLA_UNSPEC = 0,
|
|
|
|
WS_IFLA_ADDRESS = 1,
|
|
|
|
WS_IFLA_BROADCAST = 2,
|
|
|
|
WS_IFLA_IFNAME = 3,
|
|
|
|
WS_IFLA_MTU = 4,
|
|
|
|
WS_IFLA_LINK = 5,
|
|
|
|
WS_IFLA_QDISC = 6,
|
|
|
|
WS_IFLA_STATS = 7,
|
|
|
|
WS_IFLA_COST = 8,
|
|
|
|
WS_IFLA_PRIORITY = 9,
|
|
|
|
WS_IFLA_MASTER = 10,
|
|
|
|
WS_IFLA_WIRELESS = 11,
|
|
|
|
WS_IFLA_PROTINFO = 12,
|
|
|
|
WS_IFLA_TXQLEN = 13,
|
|
|
|
WS_IFLA_MAP = 14,
|
|
|
|
WS_IFLA_WEIGHT = 15,
|
|
|
|
WS_IFLA_OPERSTATE = 16,
|
|
|
|
WS_IFLA_LINKMODE = 17,
|
|
|
|
WS_IFLA_LINKINFO = 18,
|
|
|
|
WS_IFLA_NET_NS_PID = 19,
|
|
|
|
WS_IFLA_IFALIAS = 20,
|
|
|
|
WS_IFLA_NUM_VF = 21,
|
|
|
|
WS_IFLA_VFINFO_LIST = 22,
|
|
|
|
WS_IFLA_STATS64 = 23,
|
|
|
|
WS_IFLA_VF_PORTS = 24,
|
|
|
|
WS_IFLA_PORT_SELF = 25,
|
|
|
|
WS_IFLA_AF_SPEC = 26,
|
|
|
|
WS_IFLA_GROUP = 27,
|
|
|
|
WS_IFLA_NET_NS_FD = 28,
|
|
|
|
WS_IFLA_EXT_MASK = 29,
|
|
|
|
WS_IFLA_PROMISCUITY = 30,
|
|
|
|
WS_IFLA_NUM_TX_QUEUES = 31,
|
|
|
|
WS_IFLA_NUM_RX_QUEUES = 32,
|
|
|
|
WS_IFLA_CARRIER = 33,
|
|
|
|
WS_IFLA_PHYS_PORT_ID = 34,
|
|
|
|
WS_IFLA_CARRIER_CHANGES = 35,
|
|
|
|
WS_IFLA_PHYS_SWITCH_ID = 36,
|
|
|
|
WS_IFLA_LINK_NETNSID = 37,
|
|
|
|
WS_IFLA_PHYS_PORT_NAME = 38,
|
|
|
|
WS_IFLA_PROTO_DOWN = 39,
|
|
|
|
WS_IFLA_GSO_MAX_SEGS = 40,
|
|
|
|
WS_IFLA_GSO_MAX_SIZE = 41,
|
|
|
|
WS_IFLA_PAD = 42,
|
|
|
|
WS_IFLA_XDP = 43,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_IFLA_EVENT = 44,
|
|
|
|
WS_IFLA_NEW_NETNSID = 45,
|
|
|
|
WS_IFLA_IF_NETNSID = 46,
|
|
|
|
WS_IFLA_CARRIER_UP_COUNT = 47,
|
|
|
|
WS_IFLA_CARRIER_DOWN_COUNT = 48,
|
|
|
|
WS_IFLA_NEW_IFINDEX = 49,
|
|
|
|
WS_IFLA_MIN_MTU = 50,
|
|
|
|
WS_IFLA_MAX_MTU = 51,
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for rta_type (ip address) from <include/uapi/linux/if_addr.h> */
|
2014-02-25 16:27:32 +00:00
|
|
|
enum ws_ifa_attr_type {
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_IFA_UNSPEC = 0,
|
|
|
|
WS_IFA_ADDRESS = 1,
|
|
|
|
WS_IFA_LOCAL = 2,
|
2013-12-08 13:28:01 +00:00
|
|
|
WS_IFA_LABEL = 3,
|
|
|
|
WS_IFA_BROADCAST = 4,
|
|
|
|
WS_IFA_ANYCAST = 5,
|
|
|
|
WS_IFA_CACHEINFO = 6,
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_IFA_MULTICAST = 7,
|
|
|
|
WS_IFA_FLAGS = 8,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_IFA_RT_PRIORITY = 9,
|
|
|
|
WS_IFA_TARGET_NETNSID = 10,
|
2013-12-08 13:28:01 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for rta_type (route) from <include/uapi/linux/rtnetlink.h> */
|
2013-12-08 12:01:32 +00:00
|
|
|
enum ws_rta_attr_type {
|
|
|
|
WS_RTA_UNSPEC = 0,
|
|
|
|
WS_RTA_DST = 1,
|
|
|
|
WS_RTA_SRC = 2,
|
|
|
|
WS_RTA_IIF = 3,
|
|
|
|
WS_RTA_OIF = 4,
|
|
|
|
WS_RTA_GATEWAY = 5,
|
|
|
|
WS_RTA_PRIORITY = 6,
|
|
|
|
WS_RTA_PREFSRC = 7,
|
|
|
|
WS_RTA_METRICS = 8,
|
|
|
|
WS_RTA_MULTIPATH = 9,
|
|
|
|
WS_RTA_PROTOINFO = 10,
|
|
|
|
WS_RTA_FLOW = 11,
|
|
|
|
WS_RTA_CACHEINFO = 12,
|
|
|
|
WS_RTA_SESSION = 13,
|
|
|
|
WS_RTA_MP_ALGO = 14,
|
|
|
|
WS_RTA_TABLE = 15,
|
|
|
|
WS_RTA_MARK = 16,
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_RTA_MFC_STATS = 17,
|
|
|
|
WS_RTA_VIA = 18,
|
|
|
|
WS_RTA_NEWDST = 19,
|
|
|
|
WS_RTA_PREF = 20,
|
|
|
|
WS_RTA_ENCAP_TYPE= 21,
|
|
|
|
WS_RTA_ENCAP = 22,
|
|
|
|
WS_RTA_EXPIRES = 23,
|
|
|
|
WS_RTA_PAD = 24,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_RTA_UID = 25,
|
|
|
|
WS_RTA_TTL_PROPAGATE = 26,
|
|
|
|
WS_RTA_IP_PROTO = 27,
|
|
|
|
WS_RTA_SPORT = 28,
|
|
|
|
WS_RTA_DPORT = 29,
|
|
|
|
WS_RTA_NH_ID = 30,
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for rtmsg.rtm_protocol from <include/uapi/linux/rtnetlink.h> */
|
2013-12-08 12:01:32 +00:00
|
|
|
enum {
|
|
|
|
/* kernel */
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_RTPROT_UNSPEC = 0,
|
|
|
|
WS_RTPROT_REDIRECT = 1,
|
|
|
|
WS_RTPROT_KERNEL = 2,
|
|
|
|
WS_RTPROT_BOOT = 3,
|
|
|
|
WS_RTPROT_STATIC = 4,
|
2013-12-08 12:01:32 +00:00
|
|
|
/* user */
|
|
|
|
WS_RTPROT_GATED = 8,
|
|
|
|
WS_RTPROT_RA = 9,
|
|
|
|
WS_RTPROT_MRT = 10,
|
|
|
|
WS_RTPROT_ZEBRA = 11,
|
|
|
|
WS_RTPROT_BIRD = 12,
|
|
|
|
WS_RTPROT_DNROUTED = 13,
|
|
|
|
WS_RTPROT_XORP = 14,
|
|
|
|
WS_RTPROT_NTK = 15,
|
|
|
|
WS_RTPROT_DHCP = 16,
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_RTPROT_MROUTED = 17,
|
|
|
|
WS_RTPROT_BABEL = 42,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_RTPROT_BGP = 186,
|
|
|
|
WS_RTPROT_ISIS = 187,
|
|
|
|
WS_RTPROT_OSPF = 188,
|
|
|
|
WS_RTPROT_RIP = 189,
|
|
|
|
WS_RTPROT_EIGRP = 192,
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for rtmsg.rtm_scope from <include/uapi/linux/rtnetlink.h> */
|
2013-12-08 12:01:32 +00:00
|
|
|
enum {
|
2014-02-26 03:18:37 +00:00
|
|
|
WS_RT_SCOPE_UNIVERSE = 0,
|
2013-12-08 19:30:33 +00:00
|
|
|
/* ... user defined (/etc/iproute2/rt_scopes) ... */
|
|
|
|
WS_RT_SCOPE_SITE = 200,
|
|
|
|
WS_RT_SCOPE_LINK = 253,
|
|
|
|
WS_RT_SCOPE_HOST = 254,
|
2013-12-08 12:01:32 +00:00
|
|
|
WS_RT_SCOPE_NOWHERE = 255
|
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for rtmsg.rtm_type from <include/uapi/linux/rtnetlink.h> */
|
2013-12-08 12:01:32 +00:00
|
|
|
enum {
|
|
|
|
WS_RTN_UNSPEC = 0,
|
|
|
|
WS_RTN_UNICAST = 1,
|
|
|
|
WS_RTN_LOCAL = 2,
|
|
|
|
WS_RTN_BROADCAST = 3,
|
|
|
|
WS_RTN_ANYCAST = 4,
|
|
|
|
WS_RTN_MULTICAST = 5,
|
|
|
|
WS_RTN_BLACKHOLE = 6,
|
|
|
|
WS_RTN_UNREACHABLE = 7,
|
|
|
|
WS_RTN_PROHIBIT = 8,
|
|
|
|
WS_RTN_THROW = 9,
|
|
|
|
WS_RTN_NAT = 10,
|
|
|
|
WS_RTN_XRESOLVE = 11
|
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for ifinfomsg.ifi_flags <include/uapi/linux/if.h> */
|
2013-12-08 12:01:32 +00:00
|
|
|
enum {
|
|
|
|
WS_IFF_UP = 0x1,
|
|
|
|
WS_IFF_BROADCAST = 0x2,
|
|
|
|
WS_IFF_DEBUG = 0x4,
|
|
|
|
WS_IFF_LOOPBACK = 0x8,
|
|
|
|
WS_IFF_POINTOPOINT = 0x10,
|
|
|
|
WS_IFF_NOTRAILERS = 0x20,
|
|
|
|
WS_IFF_RUNNING = 0x40,
|
|
|
|
WS_IFF_NOARP = 0x80,
|
|
|
|
WS_IFF_PROMISC = 0x100,
|
|
|
|
WS_IFF_ALLMULTI = 0x200,
|
|
|
|
WS_IFF_MASTER = 0x400,
|
|
|
|
WS_IFF_SLAVE = 0x800,
|
|
|
|
WS_IFF_MULTICAST = 0x1000,
|
|
|
|
WS_IFF_PORTSEL = 0x2000,
|
|
|
|
WS_IFF_AUTOMEDIA = 0x4000,
|
|
|
|
WS_IFF_DYNAMIC = 0x8000,
|
|
|
|
WS_IFF_LOWER_UP = 0x10000,
|
|
|
|
WS_IFF_DORMANT = 0x20000,
|
2013-12-09 20:15:47 +00:00
|
|
|
WS_IFF_ECHO = 0x40000
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for ifaddrmsg.ifa_flags <include/uapi/linux/if_addr.h> */
|
2013-12-08 19:30:33 +00:00
|
|
|
enum {
|
|
|
|
WS_IFA_F_SECONDARY = 0x01,
|
|
|
|
WS_IFA_F_NODAD = 0x02,
|
|
|
|
WS_IFA_F_OPTIMISTIC = 0x04,
|
|
|
|
WS_IFA_F_DADFAILED = 0x08,
|
|
|
|
WS_IFA_F_HOMEADDRESS = 0x10,
|
|
|
|
WS_IFA_F_DEPRECATED = 0x20,
|
|
|
|
WS_IFA_F_TENTATIVE = 0x40,
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_IFA_F_PERMANENT = 0x80,
|
|
|
|
WS_IFA_F_MANAGETEMPADDR = 0x100,
|
|
|
|
WS_IFA_F_NOPREFIXROUTE = 0x200,
|
|
|
|
WS_IFA_F_MCAUTOJOIN = 0x400,
|
|
|
|
WS_IFA_F_STABLE_PRIVACY = 0x800,
|
2013-12-08 19:30:33 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for ndmsg.ndm_state <include/uapi/linux/neighbour.h> */
|
2013-12-08 19:30:33 +00:00
|
|
|
enum {
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_NUD_INCOMPLETE = 0x01,
|
|
|
|
WS_NUD_REACHABLE = 0x02,
|
|
|
|
WS_NUD_STALE = 0x04,
|
|
|
|
WS_NUD_DELAY = 0x08,
|
|
|
|
WS_NUD_PROBE = 0x10,
|
|
|
|
WS_NUD_FAILED = 0x20,
|
2013-12-08 19:30:33 +00:00
|
|
|
/* Dummy states */
|
2016-08-06 14:08:09 +00:00
|
|
|
WS_NUD_NOARP = 0x40,
|
2019-12-27 22:36:56 +00:00
|
|
|
WS_NUD_PERMANENT = 0x80,
|
|
|
|
WS_NUD_NONE = 0x00
|
2013-12-08 19:30:33 +00:00
|
|
|
};
|
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* values for ifla.operstate <include/uapi/linux/if.h> */
|
2018-04-09 18:06:52 +00:00
|
|
|
enum {
|
|
|
|
WS_IF_OPER_UNKNOWN,
|
|
|
|
WS_IF_OPER_NOTPRESENT,
|
|
|
|
WS_IF_OPER_DOWN,
|
|
|
|
WS_IF_OPER_LOWERLAYERDOWN,
|
|
|
|
WS_IF_OPER_TESTING,
|
|
|
|
WS_IF_OPER_DORMANT,
|
|
|
|
WS_IF_OPER_UP,
|
|
|
|
};
|
|
|
|
|
2017-04-04 19:30:45 +00:00
|
|
|
static int proto_netlink_route;
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
static dissector_handle_t netlink_route_handle;
|
|
|
|
|
|
|
|
static header_field_info *hfi_netlink_route = NULL;
|
|
|
|
|
|
|
|
static gint ett_netlink_route = -1;
|
|
|
|
static gint ett_netlink_route_attr = -1;
|
|
|
|
static gint ett_netlink_route_if_flags = -1;
|
2018-04-09 18:06:52 +00:00
|
|
|
static gint ett_netlink_route_attr_linkstats = -1;
|
|
|
|
static gint ett_netlink_route_attr_linkstats_rxerrs = -1;
|
|
|
|
static gint ett_netlink_route_attr_linkstats_txerrs = -1;
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2013-12-08 19:30:33 +00:00
|
|
|
static void
|
|
|
|
_fill_label_value_string_bitmask(char *label, guint32 value, const value_string *vals)
|
|
|
|
{
|
|
|
|
char tmp[16];
|
|
|
|
|
|
|
|
label[0] = '\0';
|
|
|
|
|
|
|
|
while (vals->strptr) {
|
|
|
|
if (value & vals->value) {
|
|
|
|
value &= ~(vals->value);
|
|
|
|
if (label[0])
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, ", ", ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, vals->strptr, ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vals++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
if (label[0])
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, ", ", ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
g_snprintf(tmp, sizeof(tmp), "0x%x", value);
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, tmp, ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
static int
|
2020-01-07 22:02:06 +00:00
|
|
|
dissect_netlink_route_attributes(tvbuff_t *tvb, header_field_info *hfi_type, struct netlink_route_info *info, struct packet_netlink_data *nl_data, proto_tree *tree, int offset, netlink_attributes_cb_t cb)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
2013-12-11 20:48:18 +00:00
|
|
|
/* XXX, it's *almost* the same:
|
2014-02-25 16:27:32 +00:00
|
|
|
* - rtnetlink is using struct rtattr with shorts
|
2013-12-11 20:48:18 +00:00
|
|
|
* - generic netlink is using struct nlattr with __u16
|
|
|
|
*/
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2013-12-11 20:48:18 +00:00
|
|
|
/* XXX, nice */
|
netlink: don't use -1 to mean "to end of packet".
Add dissect_netlink_attributes_to_end(), which takes no length argument,
and uses tvb_ensure_reported_length() to get the remaining length in the
packet.
In dissect_netlink_attributes_common(), treat negative lengths as if
they were a positive length >= 2^31, and throw a reported bounds error.
Also, throw a bounds error if there's more padding to a 4-byte boundary
than there is data in the packet.
At that point, we know the length is positive, so assign it to an
unsigned variable and use *that* in the loop. Throw an error if the
attribute goes past the end of the packet (although we presumably would
have done that already).
(We really should eliminate all use of -1 as "to the end", and make
lengths unsigned. We should also get rid of any places where we're
using negative offsets as offsets from the end of the packet - in the
few cases where you're dealing with trailers, you want to do that
carefully, so as not to throw an exception dissecting the trailer before
you get around to dissecting the rest of the packet - and make offsets
unsigned as well.)
2021-06-15 21:32:54 +00:00
|
|
|
return dissect_netlink_attributes_to_end(tvb, hfi_type, ett_netlink_route_attr, info, nl_data, tree, offset, cb);
|
2013-12-08 12:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Interface */
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_family =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Interface family", "netlink-route.ifi_family", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_type =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Device type", "netlink-route.ifi_type", FT_UINT16, BASE_DEC,
|
|
|
|
VALS(arp_hrd_vals), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_index =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Interface index", "netlink-route.ifi_index", FT_INT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2013-12-08 19:30:33 +00:00
|
|
|
static void
|
|
|
|
hfi_netlink_route_ifi_flags_label(char *label, guint32 value)
|
|
|
|
{
|
|
|
|
static const value_string iff_vals[] = {
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFF_UP, "UP" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFF_BROADCAST, "BROADCAST" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFF_DEBUG, "DEBUG" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFF_LOOPBACK, "LOOPBACK" },
|
2013-12-08 19:30:33 +00:00
|
|
|
{ WS_IFF_POINTOPOINT, "POINTOPOINT" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFF_NOTRAILERS, "NOTRAILERS" },
|
|
|
|
{ WS_IFF_RUNNING, "RUNNING" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFF_NOARP, "NOARP" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFF_PROMISC, "PROMISC" },
|
|
|
|
{ WS_IFF_ALLMULTI, "ALLMULTI" },
|
|
|
|
{ WS_IFF_MASTER, "MASTER" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFF_SLAVE, "SLAVE" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFF_MULTICAST, "MULTICAST" },
|
|
|
|
{ WS_IFF_PORTSEL, "PORTSEL" },
|
|
|
|
{ WS_IFF_AUTOMEDIA, "AUTOMEDIA" },
|
|
|
|
{ WS_IFF_DYNAMIC, "DYNAMIC" },
|
|
|
|
{ WS_IFF_LOWER_UP, "LOWER_UP" },
|
|
|
|
{ WS_IFF_DORMANT, "DORMANT" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFF_ECHO, "ECHO" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ 0, NULL }
|
2013-12-08 19:30:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
char tmp[16];
|
|
|
|
|
|
|
|
_fill_label_value_string_bitmask(label, value, iff_vals);
|
|
|
|
|
|
|
|
g_snprintf(tmp, sizeof(tmp), " (0x%.8x)", value);
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, tmp, ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
}
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_flags =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "Device flags", "netlink-route.ifi_flags", FT_UINT32, BASE_CUSTOM,
|
2015-02-16 01:58:12 +00:00
|
|
|
CF_FUNC(hfi_netlink_route_ifi_flags_label), 0x00, NULL, HFILL };
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_flags_iff_up =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Interface", "netlink-route.ifi_flags.iff_up", FT_BOOLEAN, 32,
|
2018-09-19 21:40:33 +00:00
|
|
|
TFS(&tfs_up_down), WS_IFF_UP, NULL, HFILL };
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_flags_iff_broadcast =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Broadcast", "netlink-route.ifi_flags.iff_broadcast", FT_BOOLEAN, 32,
|
2018-09-19 21:40:33 +00:00
|
|
|
TFS(&tfs_valid_invalid), WS_IFF_BROADCAST, NULL, HFILL };
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2019-12-27 22:36:56 +00:00
|
|
|
/* TODO: Other flags */
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifi_change =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Device change flags", "netlink-route.ifi_change", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_ifinfomsg(tvbuff_t *tvb, struct netlink_route_info *info, struct packet_netlink_data *nl_data, proto_tree *tree, int offset)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
|
|
|
proto_item *ti;
|
|
|
|
proto_tree *if_flags_tree;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifi_family.id, tvb, offset, 1, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-06-14 02:19:55 +00:00
|
|
|
if (info->legacy) {
|
|
|
|
/*
|
|
|
|
* See the comment for the netlink_route_info structure,
|
|
|
|
* above.
|
|
|
|
*/
|
2017-03-10 07:59:02 +00:00
|
|
|
return offset;
|
2021-06-14 02:19:55 +00:00
|
|
|
}
|
2017-03-10 07:59:02 +00:00
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
/* XXX padding, check if 0 */
|
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifi_type.id, tvb, offset, 2, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 2;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifi_index.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 4;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
ti = proto_tree_add_item(tree, hfi_netlink_route_ifi_flags.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
if_flags_tree = proto_item_add_subtree(ti, ett_netlink_route_if_flags);
|
|
|
|
|
|
|
|
if (if_flags_tree) {
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(if_flags_tree, hfi_netlink_route_ifi_flags_iff_up.id, tvb, offset, 4, nl_data->encoding);
|
|
|
|
proto_tree_add_item(if_flags_tree, hfi_netlink_route_ifi_flags_iff_broadcast.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
/* XXX */
|
|
|
|
}
|
|
|
|
offset += 4;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifi_change.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 4;
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Interface Attributes */
|
|
|
|
|
|
|
|
static const value_string netlink_route_ifla_attr_vals[] = {
|
2015-06-08 20:24:17 +00:00
|
|
|
{ WS_IFLA_UNSPEC, "Unspecified" },
|
2018-04-09 18:06:52 +00:00
|
|
|
{ WS_IFLA_ADDRESS, "HW Address" },
|
2015-06-08 20:24:17 +00:00
|
|
|
{ WS_IFLA_BROADCAST, "Broadcast" },
|
|
|
|
{ WS_IFLA_IFNAME, "Device name" },
|
|
|
|
{ WS_IFLA_MTU, "MTU" },
|
|
|
|
{ WS_IFLA_LINK, "Link type" },
|
|
|
|
{ WS_IFLA_QDISC, "Queueing discipline" },
|
|
|
|
{ WS_IFLA_STATS, "Interface Statistics" },
|
|
|
|
{ WS_IFLA_COST, "Cost" },
|
|
|
|
{ WS_IFLA_PRIORITY, "Priority" },
|
|
|
|
{ WS_IFLA_MASTER, "Master" },
|
|
|
|
{ WS_IFLA_WIRELESS, "Wireless" },
|
|
|
|
{ WS_IFLA_PROTINFO, "Prot info" },
|
|
|
|
{ WS_IFLA_TXQLEN, "TxQueue length"},
|
|
|
|
{ WS_IFLA_MAP, "Map"},
|
|
|
|
{ WS_IFLA_WEIGHT, "Weight"},
|
|
|
|
{ WS_IFLA_OPERSTATE, "Operstate"},
|
|
|
|
{ WS_IFLA_LINKMODE, "Link mode"},
|
|
|
|
{ WS_IFLA_LINKINFO, "Link info"},
|
|
|
|
{ WS_IFLA_NET_NS_PID, "NetNs id"},
|
|
|
|
{ WS_IFLA_IFALIAS, "Ifalias"},
|
2018-04-09 18:06:52 +00:00
|
|
|
{ WS_IFLA_NUM_VF, "Num VF"},
|
|
|
|
{ WS_IFLA_VFINFO_LIST, "VF Info"},
|
2015-06-08 20:24:17 +00:00
|
|
|
{ WS_IFLA_STATS64, "Stats" },
|
|
|
|
{ WS_IFLA_VF_PORTS, "VF ports" },
|
|
|
|
{ WS_IFLA_PORT_SELF, "Port self" },
|
|
|
|
{ WS_IFLA_AF_SPEC, "AF spec" },
|
|
|
|
{ WS_IFLA_GROUP, "Group" },
|
|
|
|
{ WS_IFLA_NET_NS_FD, "NetNs fd" },
|
|
|
|
{ WS_IFLA_EXT_MASK, "Ext mask" },
|
|
|
|
{ WS_IFLA_PROMISCUITY, "Promiscuity" },
|
|
|
|
{ WS_IFLA_NUM_TX_QUEUES, "Number of Tx queues" },
|
|
|
|
{ WS_IFLA_NUM_RX_QUEUES, "Number of Rx queues" },
|
|
|
|
{ WS_IFLA_CARRIER, "Carrier" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFLA_PHYS_PORT_ID, "Physical port ID" },
|
|
|
|
{ WS_IFLA_CARRIER_CHANGES,"Carrier changes" },
|
|
|
|
{ WS_IFLA_PHYS_SWITCH_ID, "Physical switch ID" },
|
|
|
|
{ WS_IFLA_LINK_NETNSID, "Link network namespace ID" },
|
|
|
|
{ WS_IFLA_PHYS_PORT_NAME, "Physical port name" },
|
|
|
|
{ WS_IFLA_PROTO_DOWN, "IFLA_PROTO_DOWN" },
|
2018-04-09 18:06:52 +00:00
|
|
|
{ WS_IFLA_GSO_MAX_SEGS, "Maximum GSO segment count" },
|
|
|
|
{ WS_IFLA_GSO_MAX_SIZE, "Maximum GSO size" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFLA_PAD, "IFLA_PAD" },
|
|
|
|
{ WS_IFLA_XDP, "IFLA_XDP" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_IFLA_EVENT, "IFLA_EVENT" },
|
|
|
|
{ WS_IFLA_NEW_NETNSID, "IFLA_NEW_NETNSID" },
|
|
|
|
{ WS_IFLA_IF_NETNSID, "IFLA_IF_NETNSID" },
|
|
|
|
{ WS_IFLA_CARRIER_UP_COUNT, "Carrier up count" },
|
|
|
|
{ WS_IFLA_CARRIER_DOWN_COUNT, "Carrier down count" },
|
|
|
|
{ WS_IFLA_NEW_IFINDEX, "IFLA_NEW_IFINDEX" },
|
|
|
|
{ WS_IFLA_MIN_MTU, "Minimum MTU" },
|
|
|
|
{ WS_IFLA_MAX_MTU, "Maximum MTU" },
|
2013-12-08 12:01:32 +00:00
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
2018-04-09 18:06:52 +00:00
|
|
|
static const value_string netlink_route_ifla_operstate_vals[] = {
|
|
|
|
{ WS_IF_OPER_UNKNOWN, "Unknown" },
|
|
|
|
{ WS_IF_OPER_NOTPRESENT, "Not present" },
|
|
|
|
{ WS_IF_OPER_DOWN, "Down" },
|
|
|
|
{ WS_IF_OPER_LOWERLAYERDOWN, "Lower layer down" },
|
|
|
|
{ WS_IF_OPER_TESTING, "Testing" },
|
|
|
|
{ WS_IF_OPER_DORMANT, "Dormant" },
|
|
|
|
{ WS_IF_OPER_UP, "Up"},
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_attr_type =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Attribute type", "netlink-route.ifla_attr_type", FT_UINT16, BASE_DEC,
|
|
|
|
VALS(netlink_route_ifla_attr_vals), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_ifname =
|
2021-11-30 02:53:49 +00:00
|
|
|
{ "Device name", "netlink-route.ifla_ifname", FT_STRINGZ, BASE_NONE,
|
2013-12-08 12:01:32 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_mtu =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "MTU of device", "netlink-route.ifla_mtu", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_txqlen =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "TxQueue length", "netlink-route.ifla_txqlen", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_operstate =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Operstate", "netlink-route.ifla_operstate", FT_UINT8, BASE_DEC,
|
|
|
|
VALS(netlink_route_ifla_operstate_vals), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_promiscuity =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Promiscuity", "netlink-route.ifla_promiscuity", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_txqnum =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Number of Tx queues", "netlink-route.ifla_txqnum", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_rxqnum =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Number of Rx queues", "netlink-route.ifla_rxqnum", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_group =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Group", "netlink-route.ifla_group", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_gso_maxsize =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Maximum GSO size", "netlink-route.ifla_gso_maxsize", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_gso_maxsegs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Maximum GSO segment count", "netlink-route.ifla_gso_maxsegs", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_carrier =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Carrier", "netlink-route.ifla_carrier", FT_BOOLEAN, 32,
|
2020-01-11 11:43:53 +00:00
|
|
|
TFS(&tfs_restricted_not_restricted), 0x01, NULL, HFILL };
|
2018-04-09 18:06:52 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_qdisc =
|
2021-11-30 02:53:49 +00:00
|
|
|
{ "Queueing discipline", "netlink-route.ifla_qdisc", FT_STRINGZ, BASE_NONE,
|
2018-04-09 18:06:52 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_carrier_changes =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Carrier changes", "netlink-route.ifla_carrier_changes", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_hwaddr =
|
2018-04-20 07:22:30 +00:00
|
|
|
{ "HW Address", "netlink-route.ifla_hwaddr", FT_BYTES, SEP_COLON,
|
2018-04-09 18:06:52 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_broadcast =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Broadcast", "netlink-route.ifla_broadcast", FT_BYTES, SEP_COLON,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_carrier_up_count =
|
2019-12-27 22:36:56 +00:00
|
|
|
{ "Carrier changes to up", "netlink-route.ifla_carrier_up_count", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_carrier_down_count =
|
2019-12-27 22:36:56 +00:00
|
|
|
{ "Carrier changes to down", "netlink-route.ifla_carrier_down_count", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_min_mtu =
|
2019-12-27 22:36:56 +00:00
|
|
|
{ "Minimum MTU of device", "netlink-route.ifla_min_mtu", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_max_mtu =
|
2019-12-27 22:36:56 +00:00
|
|
|
{ "Maximum MTU of device", "netlink-route.ifla_max_mtu", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2018-04-09 18:06:52 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_map_memstart =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Memory start", "netlink-route.ifla_map.mem_start", FT_UINT64, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_map_memend =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Memory end", "netlink-route.ifla_map.mem_end", FT_UINT64, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_map_baseaddr =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Base address", "netlink-route.ifla_map.base_addr", FT_UINT64, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_map_irq =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "IRQ", "netlink-route.ifla_map.irq", FT_UINT16, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_map_dma =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "DMA", "netlink-route.ifla_map.dma", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_map_port =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Port", "netlink-route.ifla_map.port", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rxpackets =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Rx packets", "netlink-route.ifla_linkstats.rxpackets", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_txpackets =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Tx packets", "netlink-route.ifla_linkstats.txpackets", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rxbytes =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Rx bytes", "netlink-route.ifla_linkstats.rxbytes", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_txbytes =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Tx packets", "netlink-route.ifla_linkstats.txbytes", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rxerrors =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Rx errors", "netlink-route.ifla_linkstats.rxerrors", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_txerrors =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Tx errors", "netlink-route.ifla_linkstats.txerrors", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rxdropped =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Rx dropped", "netlink-route.ifla_linkstats.rxdropped", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_txdropped =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Tx dropped", "netlink-route.ifla_linkstats.txdropped", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_multicast =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Multicast Rx", "netlink-route.ifla_linkstats.multicast", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_collisions =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Collisions", "netlink-route.ifla_linkstats.collisions", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static header_field_info* linkstat_root_hfis[] = {
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxpackets,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txpackets,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxbytes,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txbytes,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxerrors,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txerrors,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxdropped,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txdropped,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_multicast,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_collisions,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rx_len_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Length errors", "netlink-route.ifla_linkstats.rx_errors.length_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rx_over_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Ring buffer overflow errors", "netlink-route.ifla_linkstats.rx_errors.over_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rx_crc_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "CRC errors", "netlink-route.ifla_linkstats.rx_errors.crc_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rx_frame_errs =
|
2020-09-13 08:03:08 +00:00
|
|
|
{ "Frame alignment errors", "netlink-route.ifla_linkstats.rx_errors.frame_errs", FT_UINT64, BASE_DEC,
|
2018-04-09 18:06:52 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rx_fifo_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "FIFO overrun errors", "netlink-route.ifla_linkstats.rx_errors.fifo_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_rx_miss_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Missed packet errors", "netlink-route.ifla_linkstats.rx_errors.miss_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
|
|
|
|
static header_field_info* linkstat_rxerr_hfis[] = {
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_len_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_over_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_crc_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_frame_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_fifo_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_miss_errs,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_tx_abort_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Abort errors", "netlink-route.ifla_linkstats.rx_errors.abort_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_tx_carrier_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Carrier errors", "netlink-route.ifla_linkstats.rx_errors.carrier_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_tx_fifo_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "FIFO errors", "netlink-route.ifla_linkstats.rx_errors.fifo_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_tx_heartbeat_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Heartbeat errors", "netlink-route.ifla_linkstats.rx_errors.heartbeat_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifla_linkstats_tx_window_errs =
|
2018-04-09 18:06:52 +00:00
|
|
|
{ "Window errors", "netlink-route.ifla_linkstats.rx_errors.window_errs", FT_UINT64, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static header_field_info* linkstat_txerr_hfis[] = {
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_abort_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_carrier_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_fifo_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_heartbeat_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_window_errs,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_ifla_linkstats(tvbuff_t *tvb, struct netlink_route_info *info _U_, struct packet_netlink_data *nl_data, proto_tree *tree, int offset, int byte_size)
|
|
|
|
{
|
2018-04-09 18:06:52 +00:00
|
|
|
proto_tree* rxerr_subtree;
|
|
|
|
const gint rxerr_hfis_len = (sizeof(linkstat_rxerr_hfis) / sizeof(header_field_info*));
|
|
|
|
proto_tree* txerr_subtree;
|
|
|
|
const gint txerr_hfis_len = (sizeof(linkstat_txerr_hfis) / sizeof(header_field_info*));
|
|
|
|
|
|
|
|
for (size_t i = 0; i < (sizeof(linkstat_root_hfis) / sizeof(header_field_info*)); i++) {
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, linkstat_root_hfis[i]->id, tvb, offset, byte_size, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
offset += byte_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
rxerr_subtree = proto_tree_add_subtree(tree, tvb, offset, byte_size * rxerr_hfis_len, ett_netlink_route_attr_linkstats_rxerrs, NULL, "Rx errors");
|
|
|
|
for (gint i = 0; i < rxerr_hfis_len; i++) {
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(rxerr_subtree, linkstat_rxerr_hfis[i]->id, tvb, offset, byte_size, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
offset += byte_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
txerr_subtree = proto_tree_add_subtree(tree, tvb, offset, byte_size * txerr_hfis_len, ett_netlink_route_attr_linkstats_txerrs, NULL, "Tx errors");
|
|
|
|
for (gint i = 0; i < txerr_hfis_len; i++) {
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(txerr_subtree, linkstat_txerr_hfis[i]->id, tvb, offset, byte_size, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
offset += byte_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
static int
|
2020-01-07 22:02:06 +00:00
|
|
|
dissect_netlink_route_ifla_attrs(tvbuff_t *tvb, void *data, struct packet_netlink_data *nl_data, proto_tree *tree, int rta_type, int offset, int len)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
2020-01-07 22:02:06 +00:00
|
|
|
struct netlink_route_info *info = (struct netlink_route_info *)data;
|
2013-12-08 12:01:32 +00:00
|
|
|
enum ws_ifla_attr_type type = (enum ws_ifla_attr_type) rta_type;
|
2016-06-26 14:52:37 +00:00
|
|
|
const guint8* str;
|
2020-01-11 11:43:53 +00:00
|
|
|
guint32 value;
|
|
|
|
gboolean flag;
|
2018-04-09 18:06:52 +00:00
|
|
|
proto_tree* subtree;
|
2013-12-08 12:01:32 +00:00
|
|
|
switch (type) {
|
|
|
|
case WS_IFLA_IFNAME:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_string(tree, hfi_netlink_route_ifla_ifname.id, tvb, offset, len, ENC_ASCII | ENC_NA, wmem_packet_scope(), &str);
|
2016-06-26 14:52:37 +00:00
|
|
|
proto_item_append_text(tree, ": %s", str);
|
2013-12-08 12:01:32 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_MTU:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_mtu.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_TXQLEN:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_txqlen.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_OPERSTATE:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_operstate.id, tvb, offset, len, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_PROMISCUITY:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_promiscuity.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_NUM_TX_QUEUES:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_txqnum.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_NUM_RX_QUEUES:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_rxqnum.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_GROUP:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_group.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_GSO_MAX_SEGS:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_gso_maxsegs.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_GSO_MAX_SIZE:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_gso_maxsize.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_CARRIER:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_boolean(tree, hfi_netlink_route_ifla_carrier.id, tvb, offset, len, nl_data->encoding, &flag);
|
2020-04-24 12:21:51 +00:00
|
|
|
proto_item_append_text(tree, ": %s", tfs_get_string(flag, &tfs_restricted_not_restricted));
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_CARRIER_CHANGES:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_carrier_changes.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_ADDRESS:
|
|
|
|
proto_item_append_text(tree, ": %s", tvb_bytes_to_str_punct(wmem_packet_scope(), tvb, offset, len, ':'));
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_hwaddr.id, tvb, offset, len, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_BROADCAST:
|
|
|
|
proto_item_append_text(tree, ": %s", tvb_bytes_to_str_punct(wmem_packet_scope(), tvb, offset, len, ':'));
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_broadcast.id, tvb, offset, len, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_STATS:
|
|
|
|
subtree = proto_tree_add_subtree(tree, tvb, offset, len, ett_netlink_route_attr_linkstats, NULL, "Statistics");
|
2020-01-07 22:02:06 +00:00
|
|
|
return dissect_netlink_route_ifla_linkstats(tvb, info, nl_data, subtree, offset, 4);
|
2018-04-09 18:06:52 +00:00
|
|
|
case WS_IFLA_STATS64:
|
|
|
|
subtree = proto_tree_add_subtree(tree, tvb, offset, len, ett_netlink_route_attr_linkstats, NULL, "Statistics");
|
2020-01-07 22:02:06 +00:00
|
|
|
return dissect_netlink_route_ifla_linkstats(tvb, info, nl_data, subtree, offset, 8);
|
2018-04-09 18:06:52 +00:00
|
|
|
case WS_IFLA_QDISC:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_string(tree, hfi_netlink_route_ifla_qdisc.id, tvb, offset, len, ENC_ASCII | ENC_NA, wmem_packet_scope(), &str);
|
2018-04-09 18:06:52 +00:00
|
|
|
proto_item_append_text(tree, ": %s", str);
|
|
|
|
return 1;
|
|
|
|
case WS_IFLA_MAP:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_map_memstart.id, tvb, offset, 8, nl_data->encoding);
|
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_map_memend.id, tvb, offset + 8, 8, nl_data->encoding);
|
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_map_baseaddr.id, tvb, offset + 16, 8, nl_data->encoding);
|
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_map_irq.id, tvb, offset + 24, 2, nl_data->encoding);
|
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_map_dma.id, tvb, offset + 26, 1, nl_data->encoding);
|
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifla_map_port.id, tvb, offset + 27, 1, nl_data->encoding);
|
2018-04-09 18:06:52 +00:00
|
|
|
return 1;
|
2019-12-27 22:36:56 +00:00
|
|
|
case WS_IFLA_CARRIER_UP_COUNT:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_carrier_up_count.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2019-12-27 22:36:56 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_CARRIER_DOWN_COUNT:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_carrier_down_count.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2019-12-27 22:36:56 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_MIN_MTU:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_min_mtu.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2019-12-27 22:36:56 +00:00
|
|
|
return 1;
|
|
|
|
case WS_IFLA_MAX_MTU:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_ifla_max_mtu.id, tvb, offset, len, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2019-12-27 22:36:56 +00:00
|
|
|
return 1;
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* IP address */
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_family =
|
2013-12-08 12:42:10 +00:00
|
|
|
{ "Address type", "netlink-route.ifa_family", FT_UINT8, BASE_DEC | BASE_EXT_STRING,
|
|
|
|
&linux_af_vals_ext, 0x00, NULL, HFILL };
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_prefixlen =
|
2013-12-08 13:28:01 +00:00
|
|
|
{ "Address prefixlength", "netlink-route.ifa_prefixlen", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2013-12-08 19:30:33 +00:00
|
|
|
static void
|
|
|
|
hfi_netlink_route_ifa_flags_label(char *label, guint32 value)
|
|
|
|
{
|
|
|
|
static const value_string iff_vals[] = {
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFA_F_SECONDARY, "secondary/temporary" },
|
|
|
|
{ WS_IFA_F_NODAD, "nodad" },
|
|
|
|
{ WS_IFA_F_OPTIMISTIC, "optimistic" },
|
|
|
|
{ WS_IFA_F_DADFAILED, "dadfailed" },
|
|
|
|
{ WS_IFA_F_HOMEADDRESS, "homeaddress" },
|
|
|
|
{ WS_IFA_F_DEPRECATED, "deprecated" },
|
|
|
|
{ WS_IFA_F_TENTATIVE, "tentative" },
|
|
|
|
{ WS_IFA_F_PERMANENT, "permanent" },
|
|
|
|
/* 32-bit IFA_FLAGS (in attribute) */
|
|
|
|
{ WS_IFA_F_MANAGETEMPADDR, "mngtmpaddr" },
|
|
|
|
{ WS_IFA_F_NOPREFIXROUTE, "noprefixroute" },
|
|
|
|
{ WS_IFA_F_MCAUTOJOIN, "autojoin" },
|
|
|
|
{ WS_IFA_F_STABLE_PRIVACY, "stable_privacy" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ 0, NULL }
|
2013-12-08 19:30:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
char tmp[16];
|
|
|
|
|
|
|
|
_fill_label_value_string_bitmask(label, value, iff_vals);
|
|
|
|
|
|
|
|
g_snprintf(tmp, sizeof(tmp), " (0x%.8x)", value);
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, tmp, ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
}
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_flags =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "Address flags", "netlink-route.ifa_flags", FT_UINT8, BASE_CUSTOM,
|
2015-02-16 01:58:12 +00:00
|
|
|
CF_FUNC(hfi_netlink_route_ifa_flags_label), 0x00, NULL, HFILL };
|
2013-12-08 13:28:01 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_scope =
|
2013-12-08 13:28:01 +00:00
|
|
|
{ "Address scope", "netlink-route.ifa_scope", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_index =
|
2015-11-18 15:55:07 +00:00
|
|
|
{ "Interface index", "netlink-route.ifa_index", FT_INT32, BASE_DEC,
|
2013-12-08 13:28:01 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_ifaddrmsg(tvbuff_t *tvb, struct netlink_route_info *info, struct packet_netlink_data *nl_data, proto_tree *tree, int offset)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_family.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-06-14 02:19:55 +00:00
|
|
|
if (info->legacy) {
|
|
|
|
/*
|
|
|
|
* See the comment for the netlink_route_info structure,
|
|
|
|
* above.
|
|
|
|
*/
|
2017-03-10 07:59:02 +00:00
|
|
|
return offset;
|
2021-06-14 02:19:55 +00:00
|
|
|
}
|
2017-03-10 07:59:02 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_prefixlen.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 13:28:01 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_flags.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 13:28:01 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_scope.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 13:28:01 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_index.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 13:28:01 +00:00
|
|
|
offset += 4;
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
2013-12-08 13:28:01 +00:00
|
|
|
/* IP address attributes */
|
|
|
|
|
|
|
|
static const value_string netlink_route_ifa_attr_vals[] = {
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFA_UNSPEC, "Unspecified" },
|
|
|
|
{ WS_IFA_ADDRESS, "Interface address" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFA_LOCAL, "Local address" },
|
|
|
|
{ WS_IFA_LABEL, "Name of interface" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_IFA_BROADCAST, "Broadcast address" },
|
|
|
|
{ WS_IFA_ANYCAST, "Anycast address" },
|
|
|
|
{ WS_IFA_CACHEINFO, "Address information" },
|
|
|
|
{ WS_IFA_MULTICAST, "Multicast address" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_IFA_FLAGS, "Address flags" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_IFA_RT_PRIORITY, "IFA_RT_PRIORITY" },
|
|
|
|
{ WS_IFA_TARGET_NETNSID, "IFA_TARGET_NETNSID" },
|
2013-12-08 13:28:01 +00:00
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_attr_type =
|
2013-12-08 13:28:01 +00:00
|
|
|
{ "Attribute type", "netlink-route.ifa_attr_type", FT_UINT16, BASE_DEC,
|
|
|
|
VALS(netlink_route_ifa_attr_vals), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_label =
|
2021-11-30 02:53:49 +00:00
|
|
|
{ "Interface name", "netlink-route.ifa_label", FT_STRINGZ, BASE_NONE,
|
2013-12-08 13:28:01 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_flags32 =
|
2016-08-06 14:08:09 +00:00
|
|
|
{ "Address flags", "netlink-route.ifa_flags32", FT_UINT32, BASE_CUSTOM,
|
|
|
|
CF_FUNC(hfi_netlink_route_ifa_flags_label), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_addr6 =
|
2018-07-24 05:56:36 +00:00
|
|
|
{ "Address", "netlink-route.ifa_address.ipv6", FT_IPv6, BASE_NONE,
|
2018-04-09 18:06:52 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_ifa_addr4 =
|
2018-07-24 05:56:36 +00:00
|
|
|
{ "Address", "netlink-route.ifa_address.ipv4", FT_IPv4, BASE_NONE,
|
2018-04-09 18:06:52 +00:00
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2013-12-08 13:28:01 +00:00
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_ifa_attrs(tvbuff_t *tvb, void *data _U_, struct packet_netlink_data *nl_data, proto_tree *tree, int rta_type, int offset, int len)
|
2013-12-08 13:28:01 +00:00
|
|
|
{
|
|
|
|
enum ws_ifa_attr_type type = (enum ws_ifa_attr_type) rta_type;
|
2016-06-26 14:52:37 +00:00
|
|
|
const guint8* str;
|
2013-12-08 13:28:01 +00:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case WS_IFA_LABEL:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_string(tree, hfi_netlink_route_ifa_label.id, tvb, offset, len, ENC_ASCII | ENC_NA, wmem_packet_scope(), &str);
|
2016-06-26 14:52:37 +00:00
|
|
|
proto_item_append_text(tree, ": %s", str);
|
2013-12-08 13:28:01 +00:00
|
|
|
return 1;
|
|
|
|
|
2016-08-06 14:08:09 +00:00
|
|
|
case WS_IFA_FLAGS:
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_flags32.id, tvb, offset, 4, nl_data->encoding);
|
2016-08-06 14:08:09 +00:00
|
|
|
return 1;
|
2018-04-09 18:06:52 +00:00
|
|
|
case WS_IFA_ADDRESS:
|
2019-12-27 22:36:56 +00:00
|
|
|
case WS_IFA_LOCAL:
|
|
|
|
case WS_IFA_BROADCAST:
|
2018-04-09 18:06:52 +00:00
|
|
|
if (len == 4) {
|
2021-10-07 14:25:12 +00:00
|
|
|
proto_item_append_text(tree, ": %s", tvb_ip_to_str(wmem_packet_scope(), tvb, offset));
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_addr4.id, tvb, offset, len, ENC_BIG_ENDIAN);
|
2018-04-09 18:06:52 +00:00
|
|
|
} else {
|
2021-10-07 17:31:23 +00:00
|
|
|
proto_item_append_text(tree, ": %s", tvb_ip6_to_str(wmem_packet_scope(), tvb, offset));
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_ifa_addr6.id, tvb, offset, len, ENC_NA);
|
2018-04-09 18:06:52 +00:00
|
|
|
}
|
|
|
|
return 1;
|
2013-12-08 13:28:01 +00:00
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
/* Route */
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_family =
|
2013-12-08 12:42:10 +00:00
|
|
|
{ "Address family", "netlink-route.rt_family", FT_UINT8, BASE_DEC | BASE_EXT_STRING,
|
|
|
|
&linux_af_vals_ext, 0x00, NULL, HFILL };
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_dst_len =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Length of destination", "netlink-route.rt_dst_len", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_src_len =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Length of source", "netlink-route.rt_src_len", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_tos =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "TOS filter", "netlink-route.rt_tos", FT_UINT8, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_table =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Routing table ID", "netlink-route.rt_table", FT_UINT8, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static const value_string hfi_netlink_route_rt_protocol_vals[] = {
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_RTPROT_UNSPEC, "unknown" },
|
|
|
|
{ WS_RTPROT_REDIRECT, "ICMP redirects" },
|
|
|
|
{ WS_RTPROT_KERNEL, "kernel" },
|
|
|
|
{ WS_RTPROT_BOOT, "boot" },
|
|
|
|
{ WS_RTPROT_STATIC, "static" },
|
|
|
|
{ WS_RTPROT_GATED, "GateD" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_RTPROT_RA, "RDISC/ND router advertisements" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_RTPROT_MRT, "Merit MRT" },
|
|
|
|
{ WS_RTPROT_ZEBRA, "Zebra" },
|
|
|
|
{ WS_RTPROT_BIRD, "BIRD" },
|
|
|
|
{ WS_RTPROT_DNROUTED, "DECnet routing daemon" },
|
|
|
|
{ WS_RTPROT_XORP, "XORP" },
|
|
|
|
{ WS_RTPROT_NTK, "Netsukuku" },
|
|
|
|
{ WS_RTPROT_DHCP, "DHCP client" },
|
|
|
|
{ WS_RTPROT_MROUTED, "Multicast daemon" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_RTPROT_BABEL, "Babel daemon" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_RTPROT_BGP, "BGP" },
|
|
|
|
{ WS_RTPROT_ISIS, "ISIS" },
|
|
|
|
{ WS_RTPROT_OSPF, "OSPF" },
|
|
|
|
{ WS_RTPROT_RIP, "RIP" },
|
|
|
|
{ WS_RTPROT_EIGRP, "EIGRP" },
|
|
|
|
{ 0, NULL }
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
2014-02-26 03:18:37 +00:00
|
|
|
static value_string_ext hfi_netlink_route_rt_protocol_vals_ext =
|
|
|
|
VALUE_STRING_EXT_INIT(hfi_netlink_route_rt_protocol_vals);
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_protocol =
|
2014-02-26 03:18:37 +00:00
|
|
|
{ "Routing protocol", "netlink-route.rt_protocol", FT_UINT8, BASE_HEX | BASE_EXT_STRING,
|
|
|
|
&hfi_netlink_route_rt_protocol_vals_ext, 0x00, NULL, HFILL };
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
static const value_string netlink_route_rt_scope_vals[] = {
|
|
|
|
{ WS_RT_SCOPE_UNIVERSE, "global route" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_RT_SCOPE_SITE, "interior route in the local autonomous system" },
|
|
|
|
{ WS_RT_SCOPE_LINK, "route on this link" },
|
|
|
|
{ WS_RT_SCOPE_HOST, "route on the local host" },
|
|
|
|
{ WS_RT_SCOPE_NOWHERE, "destination doesn't exist" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ 0, NULL }
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_scope =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Route origin", "netlink-route.rt_scope", FT_UINT8, BASE_HEX,
|
|
|
|
VALS(netlink_route_rt_scope_vals), 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static const value_string netlink_route_rt_type_vals[] = {
|
|
|
|
{ WS_RTN_UNSPEC, "Unknown route" },
|
|
|
|
{ WS_RTN_UNICAST, "Gateway or direct route" },
|
|
|
|
{ WS_RTN_LOCAL, "Local interface route" },
|
|
|
|
{ WS_RTN_BROADCAST, "Local broadcast route (send as broadcast)" },
|
|
|
|
{ WS_RTN_ANYCAST, "Local broadcast route (send as unicast)" },
|
|
|
|
{ WS_RTN_MULTICAST, "Multicast route" },
|
|
|
|
{ WS_RTN_BLACKHOLE, "Drop" },
|
|
|
|
{ WS_RTN_UNREACHABLE, "Unreachable destination" },
|
|
|
|
{ WS_RTN_PROHIBIT, "Administratively prohibited" },
|
|
|
|
{ WS_RTN_THROW, "Routing lookup in another table" },
|
2021-06-16 08:10:09 +00:00
|
|
|
{ WS_RTN_NAT, "Network address translation rule" },
|
2013-12-08 12:01:32 +00:00
|
|
|
{ WS_RTN_XRESOLVE, "Use external resolver" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ 0, NULL }
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_type =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Route type", "netlink-route.rt_type", FT_UINT8, BASE_HEX,
|
|
|
|
VALS(netlink_route_rt_type_vals), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rt_flags =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Route flags", "netlink-route.rt_flags", FT_UINT32, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_rtmsg(tvbuff_t *tvb, struct netlink_route_info *info, struct packet_netlink_data *nl_data, proto_tree *tree, int offset)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_family.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-06-14 02:19:55 +00:00
|
|
|
if (info->legacy) {
|
|
|
|
/*
|
|
|
|
* See the comment for the netlink_route_info structure,
|
|
|
|
* above.
|
|
|
|
*/
|
2017-03-10 07:59:02 +00:00
|
|
|
return offset;
|
2021-06-14 02:19:55 +00:00
|
|
|
}
|
2017-03-10 07:59:02 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_dst_len.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_src_len.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_tos.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_table.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_protocol.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_scope.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_type.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_rt_flags.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 12:01:32 +00:00
|
|
|
offset += 4;
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Route Attributes */
|
|
|
|
|
|
|
|
static const value_string netlink_route_rta_attr_vals[] = {
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_RTA_UNSPEC, "Unspecified" },
|
|
|
|
{ WS_RTA_DST, "Route destination address" },
|
|
|
|
{ WS_RTA_SRC, "Route source address" },
|
|
|
|
{ WS_RTA_IIF, "Input interface index" },
|
|
|
|
{ WS_RTA_OIF, "Output interface index" },
|
|
|
|
{ WS_RTA_GATEWAY, "Gateway of the route" },
|
|
|
|
{ WS_RTA_PRIORITY, "RTA_PRIORITY" },
|
|
|
|
{ WS_RTA_PREFSRC, "RTA_PREFSRC" },
|
|
|
|
{ WS_RTA_METRICS, "RTA_METRICS" },
|
|
|
|
{ WS_RTA_MULTIPATH, "RTA_MULTIPATH" },
|
|
|
|
{ WS_RTA_PROTOINFO, "RTA_PROTOINFO" },
|
|
|
|
{ WS_RTA_FLOW, "RTA_FLOW" },
|
|
|
|
{ WS_RTA_CACHEINFO, "RTA_CACHEINFO" },
|
|
|
|
{ WS_RTA_SESSION, "RTA_SESSION" },
|
|
|
|
{ WS_RTA_MP_ALGO, "RTA_MP_ALGO" },
|
|
|
|
{ WS_RTA_TABLE, "RTA_TABLE" },
|
|
|
|
{ WS_RTA_MARK, "RTA_MARK" },
|
|
|
|
{ WS_RTA_MFC_STATS, "RTA_MFC_STATS" },
|
|
|
|
{ WS_RTA_VIA, "RTA_VIA" },
|
|
|
|
{ WS_RTA_NEWDST, "RTA_NEWDST" },
|
|
|
|
{ WS_RTA_PREF, "RTA_PREF" },
|
|
|
|
{ WS_RTA_ENCAP_TYPE,"RTA_ENCAP_TYPE" },
|
|
|
|
{ WS_RTA_ENCAP, "RTA_ENCAP" },
|
|
|
|
{ WS_RTA_EXPIRES, "RTA_EXPIRES" },
|
|
|
|
{ WS_RTA_PAD, "RTA_PAD" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_RTA_UID, "RTA_UID" },
|
|
|
|
{ WS_RTA_TTL_PROPAGATE, "RTA_TTL_PROPAGATE" },
|
|
|
|
{ WS_RTA_IP_PROTO, "RTA_IP_PROTO" },
|
|
|
|
{ WS_RTA_SPORT, "RTA_SPORT" },
|
|
|
|
{ WS_RTA_DPORT, "RTA_DPORT" },
|
|
|
|
{ WS_RTA_NH_ID, "RTA_NH_ID" },
|
2013-12-08 12:01:32 +00:00
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rta_attr_type =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Attribute type", "netlink-route.rta_attr_type", FT_UINT16, BASE_DEC,
|
|
|
|
VALS(netlink_route_rta_attr_vals), 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rta_iif =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Input interface index", "netlink-route.rta_iif", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_rta_oif =
|
2013-12-08 12:01:32 +00:00
|
|
|
{ "Output interface index", "netlink-route.rta_oif", FT_UINT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_route_attrs(tvbuff_t *tvb, void *data _U_, struct packet_netlink_data *nl_data, proto_tree *tree, int rta_type, int offset, int len)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
|
|
|
enum ws_rta_attr_type type = (enum ws_rta_attr_type) rta_type;
|
2020-01-11 11:43:53 +00:00
|
|
|
guint32 value;
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case WS_RTA_IIF:
|
|
|
|
if (len == 4) {
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_rta_iif.id, tvb, offset, 4, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2013-12-08 12:01:32 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case WS_RTA_OIF:
|
|
|
|
if (len == 4) {
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item_ret_uint(tree, hfi_netlink_route_rta_oif.id, tvb, offset, 4, nl_data->encoding, &value);
|
2020-01-11 11:43:53 +00:00
|
|
|
proto_item_append_text(tree, ": %u", value);
|
2013-12-08 12:01:32 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_nd_family =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "Family", "netlink-route.nd_family", FT_UINT8, BASE_DEC | BASE_EXT_STRING,
|
|
|
|
&linux_af_vals_ext, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_nd_index =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "Interface index", "netlink-route.nd_index", FT_INT32, BASE_DEC,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static void
|
|
|
|
hfi_netlink_route_nd_states_label(char *label, guint32 value)
|
|
|
|
{
|
|
|
|
static const value_string flags_vals[] = {
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_NUD_NONE, "NONE" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_NUD_INCOMPLETE, "INCOMPLETE" },
|
|
|
|
{ WS_NUD_REACHABLE, "REACHABLE" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_NUD_STALE, "STALE" },
|
|
|
|
{ WS_NUD_DELAY, "DELAY" },
|
|
|
|
{ WS_NUD_PROBE, "PROBE" },
|
2014-02-26 03:18:37 +00:00
|
|
|
{ WS_NUD_FAILED, "FAILED" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_NUD_NOARP, "NOARP" },
|
2021-06-16 08:10:09 +00:00
|
|
|
{ WS_NUD_PERMANENT, "PERMANENT" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ 0, NULL }
|
2013-12-08 19:30:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
char tmp[16];
|
|
|
|
|
|
|
|
_fill_label_value_string_bitmask(label, value, flags_vals);
|
|
|
|
|
|
|
|
g_snprintf(tmp, sizeof(tmp), " (0x%.4x)", value);
|
2021-04-30 10:18:25 +00:00
|
|
|
(void) g_strlcat(label, tmp, ITEM_LABEL_LENGTH);
|
2013-12-08 19:30:33 +00:00
|
|
|
}
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_nd_state =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "State", "netlink-route.nd_state", FT_UINT16, BASE_CUSTOM,
|
2015-02-16 01:58:12 +00:00
|
|
|
CF_FUNC(hfi_netlink_route_nd_states_label), 0x00, NULL, HFILL };
|
2013-12-08 19:30:33 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_nd_flags =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "Flags", "netlink-route.nd_flags", FT_UINT8, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_nd_type =
|
2013-12-08 19:30:33 +00:00
|
|
|
{ "Type", "netlink-route.nd_type", FT_UINT8, BASE_HEX,
|
|
|
|
NULL, 0x00, NULL, HFILL };
|
|
|
|
|
|
|
|
static int
|
2020-01-08 21:08:15 +00:00
|
|
|
dissect_netlink_route_ndmsg(tvbuff_t *tvb, struct netlink_route_info *info, struct packet_netlink_data *nl_data, proto_tree *tree, int offset)
|
2013-12-08 19:30:33 +00:00
|
|
|
{
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_nd_family.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 19:30:33 +00:00
|
|
|
offset += 1;
|
2014-02-25 16:27:32 +00:00
|
|
|
|
2021-06-14 02:19:55 +00:00
|
|
|
if (info->legacy) {
|
|
|
|
/*
|
|
|
|
* See the comment for the netlink_route_info structure,
|
|
|
|
* above.
|
|
|
|
*/
|
2017-03-10 07:59:02 +00:00
|
|
|
return offset;
|
2021-06-14 02:19:55 +00:00
|
|
|
}
|
2017-03-10 07:59:02 +00:00
|
|
|
|
2013-12-08 19:30:33 +00:00
|
|
|
/* XXX, 3B padding */
|
|
|
|
offset += 3;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_nd_index.id, tvb, offset, 4, nl_data->encoding);
|
2013-12-08 19:30:33 +00:00
|
|
|
offset += 4;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_nd_state.id, tvb, offset, 2, nl_data->encoding);
|
2013-12-08 19:30:33 +00:00
|
|
|
offset += 2;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_nd_flags.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 19:30:33 +00:00
|
|
|
offset += 1;
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_tree_add_item(tree, hfi_netlink_route_nd_type.id, tvb, offset, 1, ENC_NA);
|
2013-12-08 19:30:33 +00:00
|
|
|
offset += 1;
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
2013-12-11 20:48:18 +00:00
|
|
|
static const value_string netlink_route_type_vals[] = {
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_RTM_NEWLINK, "Create network interface" },
|
|
|
|
{ WS_RTM_DELLINK, "Remove network interface" },
|
|
|
|
{ WS_RTM_GETLINK, "Get network interface info" },
|
|
|
|
{ WS_RTM_SETLINK, "Set network interface info" },
|
|
|
|
{ WS_RTM_NEWADDR, "Add IP address" },
|
|
|
|
{ WS_RTM_DELADDR, "Delete IP address" },
|
|
|
|
{ WS_RTM_GETADDR, "Get IP address" },
|
|
|
|
{ WS_RTM_NEWROUTE, "Add network route" },
|
|
|
|
{ WS_RTM_DELROUTE, "Delete network route" },
|
|
|
|
{ WS_RTM_GETROUTE, "Get network route" },
|
|
|
|
{ WS_RTM_NEWNEIGH, "Add neighbor table entry" },
|
|
|
|
{ WS_RTM_DELNEIGH, "Delete neighbor table entry" },
|
|
|
|
{ WS_RTM_GETNEIGH, "Get neighbor table entry" },
|
|
|
|
{ WS_RTM_NEWRULE, "Add routing rule" },
|
|
|
|
{ WS_RTM_DELRULE, "Delete routing rule" },
|
|
|
|
{ WS_RTM_GETRULE, "Get routing rule" },
|
|
|
|
{ WS_RTM_NEWQDISC, "Add queueing discipline" },
|
|
|
|
{ WS_RTM_DELQDISC, "Delete queueing discipline" },
|
|
|
|
{ WS_RTM_GETQDISC, "Get queueing discipline" },
|
|
|
|
{ WS_RTM_NEWTCLASS, "Add traffic class" },
|
|
|
|
{ WS_RTM_DELTCLASS, "Delete traffic class" },
|
|
|
|
{ WS_RTM_GETTCLASS, "Get traffic class" },
|
|
|
|
{ WS_RTM_NEWTFILTER, "Add traffic class" },
|
|
|
|
{ WS_RTM_DELTFILTER, "Delete traffic class" },
|
|
|
|
{ WS_RTM_GETTFILTER, "Get traffic class" },
|
|
|
|
{ WS_RTM_NEWACTION, "New Action" },
|
|
|
|
{ WS_RTM_DELACTION, "Delete Action" },
|
|
|
|
{ WS_RTM_GETACTION, "Get Action" },
|
|
|
|
{ WS_RTM_NEWPREFIX, "New IPv6 prefix" },
|
|
|
|
{ WS_RTM_GETMULTICAST, "Get multicast address" },
|
|
|
|
{ WS_RTM_GETANYCAST, "Get anycast address" },
|
|
|
|
{ WS_RTM_NEWNEIGHTBL, "New Neighbour tables" },
|
|
|
|
{ WS_RTM_GETNEIGHTBL, "Get Neighbour tables" },
|
|
|
|
{ WS_RTM_SETNEIGHTBL, "Set Neighbour tables" },
|
|
|
|
{ WS_RTM_NEWNDUSEROPT, "New ND Userland options" },
|
|
|
|
{ WS_RTM_NEWADDRLABEL, "New IPv6 Address Label" },
|
|
|
|
{ WS_RTM_DELADDRLABEL, "Delete IPv6 Address Label" },
|
|
|
|
{ WS_RTM_GETADDRLABEL, "Get IPv6 Address Label" },
|
|
|
|
{ WS_RTM_GETDCB, "Get Data Center Bridging" },
|
|
|
|
{ WS_RTM_SETDCB, "Set Data Center Bridging" },
|
|
|
|
{ WS_RTM_NEWNETCONF, "RTM_NEWNETCONF" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_RTM_DELNETCONF, "RTM_DELNETCONF" },
|
2016-08-06 14:08:09 +00:00
|
|
|
{ WS_RTM_GETNETCONF, "RTM_GETNETCONF" },
|
|
|
|
{ WS_RTM_NEWMDB, "Add multicast database entry" },
|
|
|
|
{ WS_RTM_DELMDB, "Delete multicast database entry" },
|
|
|
|
{ WS_RTM_GETMDB, "Get multicast database" },
|
|
|
|
{ WS_RTM_NEWNSID, "New network namespace ID" },
|
|
|
|
{ WS_RTM_DELNSID, "Delete network namespace ID" },
|
|
|
|
{ WS_RTM_GETNSID, "Get network namespace ID" },
|
|
|
|
{ WS_RTM_NEWSTATS, "New link statistics" },
|
|
|
|
{ WS_RTM_GETSTATS, "Get link statistics" },
|
2019-12-27 22:36:56 +00:00
|
|
|
{ WS_RTM_NEWCACHEREPORT,"New cache report" },
|
|
|
|
{ WS_RTM_NEWCHAIN, "New chain" },
|
|
|
|
{ WS_RTM_DELCHAIN, "Delete chain" },
|
|
|
|
{ WS_RTM_GETCHAIN, "Get chain" },
|
|
|
|
{ WS_RTM_NEWNEXTHOP, "New next hop" },
|
|
|
|
{ WS_RTM_DELNEXTHOP, "Delete next hop" },
|
|
|
|
{ WS_RTM_GETNEXTHOP, "Get next hop" },
|
2013-12-11 20:48:18 +00:00
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2014-02-26 03:18:37 +00:00
|
|
|
static value_string_ext netlink_route_type_vals_ext = VALUE_STRING_EXT_INIT(netlink_route_type_vals);
|
2013-12-11 20:48:18 +00:00
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
static header_field_info hfi_netlink_route_nltype =
|
2014-02-26 03:18:37 +00:00
|
|
|
{ "Message type", "netlink-route.nltype", FT_UINT16, BASE_DEC | BASE_EXT_STRING,
|
|
|
|
&netlink_route_type_vals_ext, 0x00, NULL, HFILL };
|
2013-12-11 20:48:18 +00:00
|
|
|
|
2013-12-08 12:01:32 +00:00
|
|
|
static int
|
2020-01-07 22:02:06 +00:00
|
|
|
dissect_netlink_route(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
2013-12-08 12:01:32 +00:00
|
|
|
{
|
|
|
|
struct netlink_route_info info;
|
2020-01-07 22:02:06 +00:00
|
|
|
struct packet_netlink_data *nl_data = (struct packet_netlink_data *)data;
|
2017-04-04 19:30:45 +00:00
|
|
|
proto_tree *nlmsg_tree;
|
|
|
|
proto_item *pi;
|
|
|
|
int offset = 0;
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2020-01-07 22:02:06 +00:00
|
|
|
DISSECTOR_ASSERT(nl_data && nl_data->magic == PACKET_NETLINK_MAGIC);
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "Netlink route");
|
|
|
|
col_clear(pinfo->cinfo, COL_INFO);
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
pi = proto_tree_add_item(tree, proto_netlink_route, tvb, 0, -1, ENC_NA);
|
2017-04-04 19:30:45 +00:00
|
|
|
nlmsg_tree = proto_item_add_subtree(pi, ett_netlink_route);
|
2013-12-08 12:01:32 +00:00
|
|
|
|
2017-04-04 19:30:45 +00:00
|
|
|
/* Netlink message header (nlmsghdr) */
|
2020-01-07 22:02:06 +00:00
|
|
|
offset = dissect_netlink_header(tvb, nlmsg_tree, offset, nl_data->encoding, &hfi_netlink_route_nltype, NULL);
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
info.pinfo = pinfo;
|
|
|
|
|
2020-01-07 22:02:06 +00:00
|
|
|
switch (nl_data->type) {
|
2013-12-08 12:01:32 +00:00
|
|
|
case WS_RTM_NEWLINK:
|
|
|
|
case WS_RTM_DELLINK:
|
|
|
|
case WS_RTM_GETLINK:
|
2021-06-14 02:19:55 +00:00
|
|
|
/*
|
|
|
|
* Backward compatibility with legacy tools; 16 is
|
|
|
|
* sizeof(struct ifinfomsg).
|
|
|
|
*
|
|
|
|
* See the comment for the netlink_route_info
|
|
|
|
* structure, above.
|
|
|
|
*/
|
2020-01-07 22:02:06 +00:00
|
|
|
info.legacy = (nl_data->type == WS_RTM_GETLINK) && (tvb_reported_length_remaining(tvb, offset) < 16);
|
|
|
|
offset = dissect_netlink_route_ifinfomsg(tvb, &info, nl_data, nlmsg_tree, offset);
|
2013-12-08 12:01:32 +00:00
|
|
|
/* Optional attributes */
|
2020-01-07 22:02:06 +00:00
|
|
|
offset = dissect_netlink_route_attributes(tvb, &hfi_netlink_route_ifla_attr_type, &info, nl_data, nlmsg_tree, offset, dissect_netlink_route_ifla_attrs);
|
2013-12-08 12:01:32 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case WS_RTM_NEWADDR:
|
|
|
|
case WS_RTM_DELADDR:
|
|
|
|
case WS_RTM_GETADDR:
|
2021-06-14 02:19:55 +00:00
|
|
|
/*
|
|
|
|
* Backward compatibility with legacy tools; 8 is
|
|
|
|
* sizeof(struct ifaddrmsg).
|
|
|
|
*
|
|
|
|
* See the comment for the netlink_route_info
|
|
|
|
* structure, above.
|
|
|
|
*/
|
2020-01-07 22:02:06 +00:00
|
|
|
info.legacy = (nl_data->type == WS_RTM_GETADDR) && (tvb_reported_length_remaining(tvb, offset) < 8);
|
|
|
|
offset = dissect_netlink_route_ifaddrmsg(tvb, &info, nl_data, nlmsg_tree, offset);
|
2021-06-15 04:56:17 +00:00
|
|
|
if (!info.legacy) {
|
|
|
|
/*
|
|
|
|
* Optional attributes.
|
|
|
|
*
|
|
|
|
* Not present in legacy-tool messages;
|
|
|
|
* again, see the comment above.
|
|
|
|
*/
|
|
|
|
offset = dissect_netlink_route_attributes(tvb, &hfi_netlink_route_ifa_attr_type, &info, nl_data, nlmsg_tree, offset, dissect_netlink_route_ifa_attrs);
|
|
|
|
}
|
2013-12-08 12:01:32 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case WS_RTM_NEWROUTE:
|
|
|
|
case WS_RTM_DELROUTE:
|
|
|
|
case WS_RTM_GETROUTE:
|
2021-06-14 02:19:55 +00:00
|
|
|
/*
|
|
|
|
* Backward compatibility with legacy tools; 12 is
|
|
|
|
* sizeof(struct rtmsg).
|
|
|
|
*
|
|
|
|
* See the comment for the netlink_route_info
|
|
|
|
* structure, above.
|
|
|
|
*/
|
2020-01-07 22:02:06 +00:00
|
|
|
info.legacy = (nl_data->type == WS_RTM_GETROUTE) && (tvb_reported_length_remaining(tvb, offset) < 12);
|
|
|
|
offset = dissect_netlink_route_rtmsg(tvb, &info, nl_data, nlmsg_tree, offset);
|
2013-12-08 12:01:32 +00:00
|
|
|
/* Optional attributes */
|
2021-06-15 04:56:17 +00:00
|
|
|
if (!info.legacy) {
|
|
|
|
/*
|
|
|
|
* Optional attributes.
|
|
|
|
*
|
|
|
|
* Not present in legacy-tool messages;
|
|
|
|
* again, see the comment above.
|
|
|
|
*/
|
|
|
|
offset = dissect_netlink_route_attributes(tvb, &hfi_netlink_route_rta_attr_type, &info, nl_data, nlmsg_tree, offset, dissect_netlink_route_route_attrs);
|
|
|
|
}
|
2013-12-08 12:01:32 +00:00
|
|
|
break;
|
2013-12-08 19:30:33 +00:00
|
|
|
|
|
|
|
case WS_RTM_NEWNEIGH:
|
|
|
|
case WS_RTM_DELNEIGH:
|
|
|
|
case WS_RTM_GETNEIGH:
|
2021-06-14 02:19:55 +00:00
|
|
|
/*
|
|
|
|
* Backward compatibility with legacy tools; 12 is
|
|
|
|
* sizeof(struct ndmsg).
|
|
|
|
*
|
|
|
|
* See the comment for the netlink_route_info
|
|
|
|
* structure, above.
|
|
|
|
*/
|
2020-01-07 22:02:06 +00:00
|
|
|
info.legacy = (nl_data->type == WS_RTM_GETNEIGH) && (tvb_reported_length_remaining(tvb, offset) < 12);
|
2021-06-15 04:56:17 +00:00
|
|
|
if (!info.legacy) {
|
|
|
|
/*
|
|
|
|
* Optional attributes.
|
|
|
|
*
|
|
|
|
* Not present in legacy-tool messages;
|
|
|
|
* again, see the comment above.
|
|
|
|
*/
|
|
|
|
offset = dissect_netlink_route_ndmsg(tvb, &info, nl_data, nlmsg_tree, offset);
|
|
|
|
}
|
2013-12-08 19:30:33 +00:00
|
|
|
break;
|
2013-12-08 12:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
proto_register_netlink_route(void)
|
|
|
|
{
|
|
|
|
static header_field_info *hfi[] = {
|
2013-12-11 20:48:18 +00:00
|
|
|
&hfi_netlink_route_nltype,
|
2013-12-08 12:01:32 +00:00
|
|
|
|
|
|
|
/* Interface */
|
|
|
|
&hfi_netlink_route_ifi_family,
|
|
|
|
&hfi_netlink_route_ifi_type,
|
|
|
|
&hfi_netlink_route_ifi_index,
|
|
|
|
&hfi_netlink_route_ifi_flags,
|
|
|
|
&hfi_netlink_route_ifi_flags_iff_up,
|
|
|
|
&hfi_netlink_route_ifi_flags_iff_broadcast,
|
|
|
|
&hfi_netlink_route_ifi_change,
|
|
|
|
/* Interface Attributes */
|
|
|
|
&hfi_netlink_route_ifla_attr_type,
|
|
|
|
&hfi_netlink_route_ifla_ifname,
|
|
|
|
&hfi_netlink_route_ifla_mtu,
|
2018-04-09 18:06:52 +00:00
|
|
|
&hfi_netlink_route_ifla_txqlen,
|
|
|
|
&hfi_netlink_route_ifla_operstate,
|
|
|
|
&hfi_netlink_route_ifla_promiscuity,
|
|
|
|
&hfi_netlink_route_ifla_txqnum,
|
|
|
|
&hfi_netlink_route_ifla_rxqnum,
|
|
|
|
&hfi_netlink_route_ifla_group,
|
|
|
|
&hfi_netlink_route_ifla_gso_maxsize,
|
|
|
|
&hfi_netlink_route_ifla_gso_maxsegs,
|
|
|
|
&hfi_netlink_route_ifla_carrier,
|
|
|
|
&hfi_netlink_route_ifla_qdisc,
|
|
|
|
&hfi_netlink_route_ifla_carrier_changes,
|
|
|
|
&hfi_netlink_route_ifla_hwaddr,
|
|
|
|
&hfi_netlink_route_ifla_broadcast,
|
2019-12-27 22:36:56 +00:00
|
|
|
&hfi_netlink_route_ifla_carrier_up_count,
|
|
|
|
&hfi_netlink_route_ifla_carrier_down_count,
|
|
|
|
&hfi_netlink_route_ifla_min_mtu,
|
|
|
|
&hfi_netlink_route_ifla_max_mtu,
|
2018-04-09 18:06:52 +00:00
|
|
|
/* Interface map */
|
|
|
|
&hfi_netlink_route_ifla_map_memstart,
|
|
|
|
&hfi_netlink_route_ifla_map_memend,
|
|
|
|
&hfi_netlink_route_ifla_map_baseaddr,
|
|
|
|
&hfi_netlink_route_ifla_map_irq,
|
|
|
|
&hfi_netlink_route_ifla_map_dma,
|
|
|
|
&hfi_netlink_route_ifla_map_port,
|
|
|
|
/* Interface statistics */
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxpackets,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txpackets,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxbytes,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txbytes,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxerrors,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txerrors,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rxdropped,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_txdropped,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_multicast,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_collisions,
|
|
|
|
/* Interface RX error statistics */
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_len_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_over_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_crc_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_frame_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_fifo_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_rx_miss_errs,
|
|
|
|
/* Interface TX error statistics */
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_abort_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_carrier_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_fifo_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_heartbeat_errs,
|
|
|
|
&hfi_netlink_route_ifla_linkstats_tx_window_errs,
|
2013-12-08 12:01:32 +00:00
|
|
|
/* IP address */
|
|
|
|
&hfi_netlink_route_ifa_family,
|
2013-12-08 13:28:01 +00:00
|
|
|
&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,
|
2016-08-06 14:08:09 +00:00
|
|
|
&hfi_netlink_route_ifa_flags32,
|
2018-04-09 18:06:52 +00:00
|
|
|
&hfi_netlink_route_ifa_addr6,
|
|
|
|
&hfi_netlink_route_ifa_addr4,
|
2013-12-08 12:01:32 +00:00
|
|
|
/* Network Route */
|
|
|
|
&hfi_netlink_route_rt_family,
|
|
|
|
&hfi_netlink_route_rt_dst_len,
|
|
|
|
&hfi_netlink_route_rt_src_len,
|
|
|
|
&hfi_netlink_route_rt_tos,
|
|
|
|
&hfi_netlink_route_rt_table,
|
|
|
|
&hfi_netlink_route_rt_protocol,
|
|
|
|
&hfi_netlink_route_rt_scope,
|
|
|
|
&hfi_netlink_route_rt_type,
|
|
|
|
&hfi_netlink_route_rt_flags,
|
|
|
|
/* Network route Attributes */
|
|
|
|
&hfi_netlink_route_rta_attr_type,
|
|
|
|
&hfi_netlink_route_rta_iif,
|
|
|
|
&hfi_netlink_route_rta_oif,
|
2013-12-08 19:30:33 +00:00
|
|
|
/* Neighbor */
|
|
|
|
&hfi_netlink_route_nd_family,
|
|
|
|
&hfi_netlink_route_nd_index,
|
|
|
|
&hfi_netlink_route_nd_state,
|
|
|
|
&hfi_netlink_route_nd_flags,
|
|
|
|
&hfi_netlink_route_nd_type,
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static gint *ett[] = {
|
|
|
|
&ett_netlink_route,
|
|
|
|
&ett_netlink_route_attr,
|
2018-04-09 18:06:52 +00:00
|
|
|
&ett_netlink_route_if_flags,
|
|
|
|
&ett_netlink_route_attr_linkstats,
|
|
|
|
&ett_netlink_route_attr_linkstats_rxerrs,
|
|
|
|
&ett_netlink_route_attr_linkstats_txerrs,
|
2013-12-08 12:01:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
proto_netlink_route = proto_register_protocol("Linux rtnetlink (route netlink) protocol", "rtnetlink", "netlink-route" );
|
|
|
|
hfi_netlink_route = proto_registrar_get_nth(proto_netlink_route);
|
|
|
|
|
2021-12-10 00:56:19 +00:00
|
|
|
proto_register_fields_manual(proto_netlink_route, hfi, array_length(hfi));
|
2013-12-08 12:01:32 +00:00
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
|
|
|
2015-12-09 03:49:44 +00:00
|
|
|
netlink_route_handle = create_dissector_handle(dissect_netlink_route, proto_netlink_route);
|
2013-12-08 12:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
proto_reg_handoff_netlink_route(void)
|
|
|
|
{
|
|
|
|
dissector_add_uint("netlink.protocol", WS_NETLINK_ROUTE, netlink_route_handle);
|
|
|
|
}
|
2014-10-03 14:13:07 +00:00
|
|
|
|
|
|
|
/*
|
2019-07-26 18:43:17 +00:00
|
|
|
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
2014-10-03 14:13:07 +00:00
|
|
|
*
|
|
|
|
* Local variables:
|
|
|
|
* c-basic-offset: 8
|
|
|
|
* tab-width: 8
|
|
|
|
* indent-tabs-mode: t
|
|
|
|
* End:
|
|
|
|
*
|
|
|
|
* vi: set shiftwidth=8 tabstop=8 noexpandtab:
|
|
|
|
* :indentSize=8:tabSize=8:noTabs=false:
|
|
|
|
*/
|