+ if (rif)
+ ifname = rif->ifname;
+
+ if (route) {
+ DPRINTF(2, "%s: add route to "IP_FMT"/%d via "IP_FMT" (%s)\n", ifname,
+ IP_BUF(route->dest), route->mask, IP_BUF(host->ipaddr),
+ host->rif->ifname);
+
+ req.rt.rtm_dst_len = route->mask;
+ if (route->mask)
+ addr = rtnl_add_addr(addr, &pktlen, RTA_DST, route->dest);
+ addr = rtnl_add_addr(addr, &pktlen, RTA_GATEWAY, host->ipaddr);
+ } else {
+ DPRINTF(2, "%s: add host route to "IP_FMT" (%s)\n", ifname,
+ IP_BUF(host->ipaddr), host->rif->ifname);
+ addr = rtnl_add_addr(addr, &pktlen, RTA_DST, host->ipaddr);
+ req.rt.rtm_dst_len = 32;
+ }
+
+ /* local route */
+ if (!rif)
+ addr = rtnl_add_addr(addr, &pktlen, RTA_PREFSRC, local_addr);
+
+ req.nl.nlmsg_len = pktlen;
+ if (route)
+ rtnl_rule_request(rif, RULE_F_DEFGW_WORKAROUND | RULE_F_ADD);
+ send(rtnl_sock.fd, &req, pktlen, 0);
+ if (route)
+ rtnl_rule_request(rif, RULE_F_DEFGW_WORKAROUND);