1 diff --git a/lib/route/addr.c b/lib/route/addr.c
2 index 97905f0..e6e91d2 100644
5 @@ -598,7 +598,19 @@ static int build_addr_msg(struct rtnl_addr *tmpl, int cmd, int flags,
6 NLA_PUT(msg, IFA_CACHEINFO, sizeof(ca), &ca);
9 - NLA_PUT_U32(msg, IFA_FLAGS, tmpl->a_flags);
10 + if (tmpl->a_flags & ~0xFF) {
11 + /* only set the IFA_FLAGS attribute, if they actually contain additional
12 + * flags that are not already set to am.ifa_flags.
14 + * Older kernels refuse RTM_NEWADDR and RTM_NEWROUTE messages with EINVAL
15 + * if they contain unknown netlink attributes. See net/core/rtnetlink.c, which
16 + * was fixed by kernel commit 661d2967b3f1b34eeaa7e212e7b9bbe8ee072b59.
18 + * With this workaround, libnl will function correctly with older kernels,
19 + * unless there is a new libnl user that wants to set these flags. In this
20 + * case it's up to the user to workaround this issue. */
21 + NLA_PUT_U32(msg, IFA_FLAGS, tmpl->a_flags);