diff options
| author | Roy Marples <roy@marples.name> | 2008-11-25 13:12:29 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2008-11-25 13:12:29 +0000 |
| commit | bcb9225fbb04226c5d717a44b30f03c1a67ff9e8 (patch) | |
| tree | 199ba38287dec3694bd5d4f3892db2df5699eb87 | |
| parent | fe36434eb4a933f7c49615083f6296098ed97493 (diff) | |
| download | dhcpcd-bcb9225fbb04226c5d717a44b30f03c1a67ff9e8.tar.xz | |
Fix adding of host routes.dhcpcd-4.0.6
| -rw-r--r-- | if-linux.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -325,7 +325,6 @@ if_route(const char *ifname, unsigned int ifindex; int retval = 0; - if (!(ifindex = if_nametoindex(ifname))) { errno = ENODEV; return -1; @@ -336,7 +335,7 @@ if_route(const char *ifname, nlm->hdr.nlmsg_type = RTM_NEWROUTE; if (action == 0) nlm->hdr.nlmsg_flags = NLM_F_REPLACE; - else if (action > 0) + else if (action == 1) nlm->hdr.nlmsg_flags = NLM_F_CREATE | NLM_F_EXCL; else nlm->hdr.nlmsg_type = RTM_DELROUTE; @@ -344,12 +343,14 @@ if_route(const char *ifname, nlm->rt.rtm_family = AF_INET; nlm->rt.rtm_table = RT_TABLE_MAIN; - if (action < 0) + if (action == -1 || action == -2) 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 (gateway->s_addr == INADDR_ANY) + 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; @@ -359,8 +360,11 @@ if_route(const char *ifname, nlm->rt.rtm_dst_len = inet_ntocidr(*netmask); add_attr_l(&nlm->hdr, sizeof(*nlm), RTA_DST, &destination->s_addr, sizeof(destination->s_addr)); - add_attr_l(&nlm->hdr, sizeof(*nlm), RTA_GATEWAY, - &gateway->s_addr, sizeof(gateway->s_addr)); + /* If destination == gateway then don't add the gateway */ + if (destination->s_addr != gateway->s_addr || + netmask->s_addr != INADDR_BROADCAST) + add_attr_l(&nlm->hdr, sizeof(*nlm), RTA_GATEWAY, + &gateway->s_addr, sizeof(gateway->s_addr)); add_attr_32(&nlm->hdr, sizeof(*nlm), RTA_OIF, ifindex); add_attr_32(&nlm->hdr, sizeof(*nlm), RTA_PRIORITY, metric); |
