File bnc#565030.diff of Package dhcpcd
--- interface.c 2010-01-20 13:20:15.000000000 +0100
+++ interface.c 2010-01-20 13:26:53.000000000 +0100
@@ -956,12 +956,14 @@
nlm = xzalloc (sizeof (*nlm));
nlm->hdr.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtmsg));
+ nlm->hdr.nlmsg_type = RTM_NEWROUTE;
if (change)
nlm->hdr.nlmsg_flags = NLM_F_REPLACE;
else if (! del)
nlm->hdr.nlmsg_flags = NLM_F_CREATE | NLM_F_EXCL;
+ else
+ nlm->hdr.nlmsg_type = RTM_DELROUTE;
nlm->hdr.nlmsg_flags |= NLM_F_REQUEST;
- nlm->hdr.nlmsg_type = del ? RTM_DELROUTE : RTM_NEWROUTE;
nlm->rt.rtm_family = AF_INET;
nlm->rt.rtm_table = RT_TABLE_MAIN;
@@ -969,19 +971,20 @@
nlm->rt.rtm_scope = RT_SCOPE_NOWHERE;
else {
nlm->hdr.nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
- nlm->rt.rtm_protocol = RTPROT_BOOT;
- if (netmask.s_addr == INADDR_BROADCAST ||
- gateway.s_addr == INADDR_ANY)
- nlm->rt.rtm_scope = RT_SCOPE_LINK;
- else
- nlm->rt.rtm_scope = RT_SCOPE_UNIVERSE;
- nlm->rt.rtm_type = RTN_UNICAST;
+ nlm->rt.rtm_protocol = RTPROT_BOOT;
+ if (gateway.s_addr == INADDR_ANY ||
+ (gateway.s_addr == destination.s_addr &&
+ netmask.s_addr == INADDR_BROADCAST))
+ nlm->rt.rtm_scope = RT_SCOPE_LINK;
+ else
+ nlm->rt.rtm_scope = RT_SCOPE_UNIVERSE;
+ nlm->rt.rtm_type = RTN_UNICAST;
}
nlm->rt.rtm_dst_len = inet_ntocidr (netmask);
add_attr_l (&nlm->hdr, sizeof (*nlm), RTA_DST,
&destination.s_addr, sizeof (destination.s_addr));
- if (netmask.s_addr != INADDR_BROADCAST &&
+ if (netmask.s_addr != INADDR_BROADCAST ||
destination.s_addr != gateway.s_addr)
add_attr_l (&nlm->hdr, sizeof (*nlm), RTA_GATEWAY,
&gateway.s_addr, sizeof (gateway.s_addr));