diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index 5b595a9b71..8836f3d70b 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -337,6 +337,11 @@ struct _ifla_vf_vlan_info { #define BRIDGE_VLAN_INFO_RANGE_END (1 << 4) /* VLAN is end of vlan range */ #endif +/* Appeared in kernel 4.2 dated August 2015 */ +#ifndef RTM_F_LOOKUP_TABLE +#define RTM_F_LOOKUP_TABLE 0x1000 /* set rtm_table to FIB lookup result */ +#endif + /*****************************************************************************/ #define PSCHED_TIME_UNITS_PER_SEC 1000000 @@ -7784,17 +7789,42 @@ _nl_msg_new_dump_rtnl(NMPObjectType obj_type, int preferred_addr_family) g_return_val_if_reached(NULL); } break; case NMP_OBJECT_TYPE_LINK: + { + struct ifinfomsg ifm = {}; + + if (nlmsg_append_struct(nlmsg, &ifm) < 0) + g_return_val_if_reached(NULL); + break; + } case NMP_OBJECT_TYPE_IP4_ADDRESS: case NMP_OBJECT_TYPE_IP6_ADDRESS: - case NMP_OBJECT_TYPE_IP4_ROUTE: - case NMP_OBJECT_TYPE_IP6_ROUTE: - case NMP_OBJECT_TYPE_ROUTING_RULE: { - const struct rtgenmsg gmsg = { - .rtgen_family = preferred_addr_family, + struct ifaddrmsg ifm = { + .ifa_family = preferred_addr_family, }; - if (nlmsg_append_struct(nlmsg, &gmsg) < 0) + if (nlmsg_append_struct(nlmsg, &ifm) < 0) + g_return_val_if_reached(NULL); + break; + } + case NMP_OBJECT_TYPE_IP4_ROUTE: + case NMP_OBJECT_TYPE_IP6_ROUTE: + { + struct rtmsg rtm = { + .rtm_family = preferred_addr_family, + }; + + if (nlmsg_append_struct(nlmsg, &rtm) < 0) + g_return_val_if_reached(NULL); + break; + } + case NMP_OBJECT_TYPE_ROUTING_RULE: + { + struct fib_rule_hdr frh = { + .family = preferred_addr_family, + }; + + if (nlmsg_append_struct(nlmsg, &frh) < 0) g_return_val_if_reached(NULL); } break; default: @@ -10307,7 +10337,7 @@ ip_route_get(NMPlatform *platform, .r.rtm_family = addr_family, .r.rtm_tos = 0, .r.rtm_dst_len = IS_IPv4 ? 32 : 128, - .r.rtm_flags = 0x1000 /* RTM_F_LOOKUP_TABLE */, + .r.rtm_flags = IS_IPv4 ? RTM_F_LOOKUP_TABLE : 0, }; nm_clear_pointer(&route, nmp_object_unref); diff --git a/src/libnm-platform/nm-netlink.c b/src/libnm-platform/nm-netlink.c index 6d15312882..5bbbcc8474 100644 --- a/src/libnm-platform/nm-netlink.c +++ b/src/libnm-platform/nm-netlink.c @@ -1152,6 +1152,7 @@ nl_socket_new(struct nl_sock **out_sk, i_val = 1; (void) setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_EXT_ACK, &i_val, sizeof(i_val)); + (void) setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_GET_STRICT_CHK, &i_val, sizeof(i_val)); if (NM_FLAGS_HAS(flags, NL_SOCKET_FLAGS_PASSCRED)) { err = nl_socket_set_passcred(sk, 1);