aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2012-08-01 12:03:05 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2012-08-01 12:13:25 +0000
commitf63ef90aefd8142c7b2ea2e3cd1abae375fc46b5 (patch)
treeb6f7f7be636480a68f407548340411242ac68d6d
parentc372540f96cb20e8a06bcc68c8c69fe745a21164 (diff)
downloadpingu-f63ef90aefd8142c7b2ea2e3cd1abae375fc46b5.tar.bz2
pingu-f63ef90aefd8142c7b2ea2e3cd1abae375fc46b5.tar.xz
pingu_route: allow default routes that has no via address
This fixes load-balancing with ppp0 We also make the via address family (ipv4/ipv6) agnostic.
-rw-r--r--pingu_netlink.c10
-rw-r--r--pingu_route.c3
2 files changed, 7 insertions, 6 deletions
diff --git a/pingu_netlink.c b/pingu_netlink.c
index e3afbf6..dc4a2ed 100644
--- a/pingu_netlink.c
+++ b/pingu_netlink.c
@@ -138,7 +138,7 @@ static int netlink_add_subrtattr_l(struct rtattr *rta, int maxlen, int type,
subrta->rta_len = len;
memcpy(RTA_DATA(subrta), data, alen);
rta->rta_len = NLMSG_ALIGN(rta->rta_len) + RTA_ALIGN(len);
- return TRUE;
+ return alen;
}
static int netlink_add_subrtattr_addr_any(struct rtattr *rta, int maxlen,
@@ -346,11 +346,13 @@ static int add_one_nh(struct rtattr *rta, struct rtnexthop *rtnh,
struct pingu_iface *iface,
struct pingu_route *route)
{
+ int addr_size;
if (route == NULL)
return 0;
- netlink_add_subrtattr_addr_any(rta, 1024, RTA_GATEWAY,
- &route->gw_addr);
- rtnh->rtnh_len += sizeof(struct rtattr) + 4; // TODO: support ipv6
+ addr_size = netlink_add_subrtattr_addr_any(rta, 1024, RTA_GATEWAY,
+ &route->gw_addr);
+ if (addr_size > 0)
+ rtnh->rtnh_len += sizeof(struct rtattr) + addr_size;
if (iface->balance_weight)
rtnh->rtnh_hops = iface->balance_weight - 1;
rtnh->rtnh_ifindex = iface->index;
diff --git a/pingu_route.c b/pingu_route.c
index 3a82f70..a2462c1 100644
--- a/pingu_route.c
+++ b/pingu_route.c
@@ -126,8 +126,7 @@ int is_default_gw(struct pingu_route *route)
{
switch (route->dest.sa.sa_family) {
case AF_INET:
- return ((route->dest.sin.sin_addr.s_addr == 0)
- && (route->gw_addr.sin.sin_addr.s_addr != 0));
+ return (route->dest.sin.sin_addr.s_addr == 0);
break;
case AF_INET6:
log_debug("TODO: ipv6");