78cd384 Update README and patchlevel.h for 2.4.8 release 5d03403 pppd: Avoid use of strnlen (and strlen) in vslprintf a1e950a pppd: Fix IPv6 default route code for Solaris ca5e61b plugins/rp-pppoe: Make tag parsing loop condition more accurate c10c3c7 pppd: Make sure word read from options file is null-terminated b311e98 pppd: Limit memory accessed by string formats with max length specified 3ea9de9 pppd: Eliminate some more compiler warnings 57edb1a pppd: Include time.h header before using time_t 09f695f pppd: Don't free static string 03104ba pppd.h: Add missing headers 388597e pppd: Add defaultroute6 and related options 66ce4ba pppd: Avoid declarations within statements in main.c 5637180 pppd: Fix `ifname` option in case of multilink (#105) d00f8a0 pppd: Fix variable reference syntax in Makefile.linux b6b4d28 pppd: Check tdb pointer before closing Signed-off-by: DENG Qingfang <dengqf6@mail2.sysu.edu.cn>
34 lines
1.1 KiB
Diff
34 lines
1.1 KiB
Diff
pppd: Fill in default gateway on Linux
|
|
|
|
On Linux, when pppd creates the default route, it does not set the peer
|
|
address as gateway, leading to a default route without gateway address.
|
|
|
|
This behaviour breaks various downstream programs which attempt to infer
|
|
the default gateway IP address from the system default route entry.
|
|
|
|
This patch addresses the issue by filling in the peer address as gateway
|
|
when generating the default route entry.
|
|
|
|
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
|
|
--- a/pppd/sys-linux.c
|
|
+++ b/pppd/sys-linux.c
|
|
@@ -1717,6 +1717,9 @@ int sifdefaultroute (int unit, u_int32_t
|
|
memset (&rt, 0, sizeof (rt));
|
|
SET_SA_FAMILY (rt.rt_dst, AF_INET);
|
|
|
|
+ SET_SA_FAMILY(rt.rt_gateway, AF_INET);
|
|
+ SIN_ADDR(rt.rt_gateway) = gateway;
|
|
+
|
|
rt.rt_dev = ifname;
|
|
rt.rt_metric = dfl_route_metric + 1; /* +1 for binary compatibility */
|
|
|
|
@@ -1725,7 +1728,7 @@ int sifdefaultroute (int unit, u_int32_t
|
|
SIN_ADDR(rt.rt_genmask) = 0L;
|
|
}
|
|
|
|
- rt.rt_flags = RTF_UP;
|
|
+ rt.rt_flags = RTF_UP | RTF_GATEWAY;
|
|
if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
|
|
if (!ok_error(errno))
|
|
error("default route ioctl(SIOCADDRT): %m");
|