| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- Index: ppp-2.4.3/pppd/ipcp.c
- ===================================================================
- --- ppp-2.4.3.orig/pppd/ipcp.c 2007-06-04 13:22:09.003486544 +0200
- +++ ppp-2.4.3/pppd/ipcp.c 2007-06-04 13:22:11.387124176 +0200
- @@ -197,6 +197,16 @@
- "disable defaultroute option", OPT_ALIAS | OPT_A2CLR,
- &ipcp_wantoptions[0].default_route },
-
- +#ifdef __linux__
- + { "replacedefaultroute", o_bool,
- + &ipcp_wantoptions[0].replace_default_route,
- + "Replace default route", 1
- + },
- + { "noreplacedefaultroute", o_bool,
- + &ipcp_allowoptions[0].replace_default_route,
- + "Never replace default route", OPT_A2COPY,
- + &ipcp_wantoptions[0].replace_default_route },
- +#endif
- { "proxyarp", o_bool, &ipcp_wantoptions[0].proxy_arp,
- "Add proxy ARP entry", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },
- { "noproxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
- @@ -263,7 +273,7 @@
- ip_active_pkt
- };
-
- -static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t));
- +static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t, bool));
- static void ipcp_script __P((char *)); /* Run an up/down script */
- static void ipcp_script_done __P((void *));
-
- @@ -1659,7 +1669,12 @@
- if (!sifnpmode(u, PPP_IP, NPMODE_QUEUE))
- return 0;
- if (wo->default_route)
- +#ifndef __linux__
- if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr))
- +#else
- + if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr,
- + wo->replace_default_route))
- +#endif
- default_route_set[u] = 1;
- if (wo->proxy_arp)
- if (sifproxyarp(u, wo->hisaddr))
- @@ -1741,7 +1756,8 @@
- */
- if (demand) {
- if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
- - ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr);
- + ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,
- + wo->replace_default_route);
- if (go->ouraddr != wo->ouraddr) {
- warn("Local IP address changed to %I", go->ouraddr);
- script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr), 0);
- @@ -1766,7 +1782,12 @@
-
- /* assign a default route through the interface if required */
- if (ipcp_wantoptions[f->unit].default_route)
- +#ifndef __linux__
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
- +#else
- + if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
- + wo->replace_default_route))
- +#endif
- default_route_set[f->unit] = 1;
-
- /* Make a proxy ARP entry if requested. */
- @@ -1813,7 +1834,12 @@
-
- /* assign a default route through the interface if required */
- if (ipcp_wantoptions[f->unit].default_route)
- +#ifndef __linux__
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
- +#else
- + if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
- + wo->replace_default_route))
- +#endif
- default_route_set[f->unit] = 1;
-
- /* Make a proxy ARP entry if requested. */
- @@ -1890,7 +1916,7 @@
- sifnpmode(f->unit, PPP_IP, NPMODE_DROP);
- sifdown(f->unit);
- ipcp_clear_addrs(f->unit, ipcp_gotoptions[f->unit].ouraddr,
- - ipcp_hisoptions[f->unit].hisaddr);
- + ipcp_hisoptions[f->unit].hisaddr, 0);
- }
-
- /* Execute the ip-down script */
- @@ -1906,16 +1932,25 @@
- * proxy arp entries, etc.
- */
- static void
- -ipcp_clear_addrs(unit, ouraddr, hisaddr)
- +ipcp_clear_addrs(unit, ouraddr, hisaddr, replacedefaultroute)
- int unit;
- u_int32_t ouraddr; /* local address */
- u_int32_t hisaddr; /* remote address */
- + bool replacedefaultroute;
- {
- if (proxy_arp_set[unit]) {
- cifproxyarp(unit, hisaddr);
- proxy_arp_set[unit] = 0;
- }
- - if (default_route_set[unit]) {
- + /* If replacedefaultroute, sifdefaultroute will be called soon
- + * with replacedefaultroute set and that will overwrite the current
- + * default route. This is the case only when doing demand, otherwise
- + * during demand, this cifdefaultroute would restore the old default
- + * route which is not what we want in this case. In the non-demand
- + * case, we'll delete the default route and restore the old if there
- + * is one saved by an sifdefaultroute with replacedefaultroute.
- + */
- + if (!replacedefaultroute && default_route_set[unit]) {
- cifdefaultroute(unit, ouraddr, hisaddr);
- default_route_set[unit] = 0;
- }
- Index: ppp-2.4.3/pppd/ipcp.h
- ===================================================================
- --- ppp-2.4.3.orig/pppd/ipcp.h 2007-06-04 13:22:08.263599024 +0200
- +++ ppp-2.4.3/pppd/ipcp.h 2007-06-04 13:22:11.387124176 +0200
- @@ -70,6 +70,7 @@
- bool old_addrs; /* Use old (IP-Addresses) option? */
- bool req_addr; /* Ask peer to send IP address? */
- bool default_route; /* Assign default route through interface? */
- + bool replace_default_route; /* Replace default route through interface? */
- bool proxy_arp; /* Make proxy ARP entry for peer? */
- bool neg_vj; /* Van Jacobson Compression? */
- bool old_vj; /* use old (short) form of VJ option? */
- Index: ppp-2.4.3/pppd/pppd.h
- ===================================================================
- --- ppp-2.4.3.orig/pppd/pppd.h 2007-06-04 13:22:09.005486240 +0200
- +++ ppp-2.4.3/pppd/pppd.h 2007-06-04 13:22:11.388124024 +0200
- @@ -642,7 +642,11 @@
- int cif6addr __P((int, eui64_t, eui64_t));
- /* Remove an IPv6 address from i/f */
- #endif
- +#ifndef __linux__
- int sifdefaultroute __P((int, u_int32_t, u_int32_t));
- +#else
- +int sifdefaultroute __P((int, u_int32_t, u_int32_t, bool replace_default_rt));
- +#endif
- /* Create default route through i/f */
- int cifdefaultroute __P((int, u_int32_t, u_int32_t));
- /* Delete default route through i/f */
- Index: ppp-2.4.3/pppd/sys-linux.c
- ===================================================================
- --- ppp-2.4.3.orig/pppd/sys-linux.c 2007-06-04 13:22:08.807516336 +0200
- +++ ppp-2.4.3/pppd/sys-linux.c 2007-06-04 13:22:11.389123872 +0200
- @@ -206,6 +206,8 @@
-
- static int if_is_up; /* Interface has been marked up */
- static u_int32_t default_route_gateway; /* Gateway for default route added */
- +static struct rtentry old_def_rt; /* Old default route */
- +static int default_rt_repl_rest; /* replace and restore old default rt */
- static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
- static char proxy_arp_dev[16]; /* Device for proxy arp entry */
- static u_int32_t our_old_addr; /* for detecting address changes */
- @@ -1520,6 +1522,9 @@
- p = NULL;
- }
-
- + SET_SA_FAMILY (rt->rt_dst, AF_INET);
- + SET_SA_FAMILY (rt->rt_gateway, AF_INET);
- +
- SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
- SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
- SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
- @@ -1589,19 +1594,53 @@
- /********************************************************************
- *
- * sifdefaultroute - assign a default route through the address given.
- - */
- -
- -int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
- -{
- - struct rtentry rt;
- -
- - if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
- - u_int32_t old_gateway = SIN_ADDR(rt.rt_gateway);
- -
- - if (old_gateway != gateway)
- - error("not replacing existing default route to %s [%I]",
- - rt.rt_dev, old_gateway);
- - return 0;
- + *
- + * If the global default_rt_repl_rest flag is set, then this function
- + * already replaced the original system defaultroute with some other
- + * route and it should just replace the current defaultroute with
- + * another one, without saving the current route. Use: demand mode,
- + * when pppd sets first a defaultroute it it's temporary ppp0 addresses
- + * and then changes the temporary addresses to the addresses for the real
- + * ppp connection when it has come up.
- + */
- +
- +int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway, bool replace)
- +{
- + struct rtentry rt, tmp_rt;
- + struct rtentry *del_rt = NULL;
- +
- +
- + if (default_rt_repl_rest) {
- + /* We have already reclaced the original defaultroute, if we
- + * are called again, we will delete the current default route
- + * and set the new default route in this function.
- + * - this is normally only the case the doing demand: */
- + if (defaultroute_exists( &tmp_rt ))
- + del_rt = &tmp_rt;
- + } else if ( defaultroute_exists( &old_def_rt ) &&
- + strcmp( old_def_rt.rt_dev, ifname ) != 0) {
- + /* We did not yet replace an existing default route, let's
- + * check if we should save and replace a default route:
- + */
- + u_int32_t old_gateway = SIN_ADDR(old_def_rt.rt_gateway);
- +
- + if (old_gateway != gateway) {
- + if (!replace) {
- + error("not replacing default route to %s [%I]",
- + old_def_rt.rt_dev, old_gateway);
- + return 0;
- + } else {
- + // we need to copy rt_dev because we need it permanent too:
- + char * tmp_dev = malloc(strlen(old_def_rt.rt_dev)+1);
- + strcpy(tmp_dev, old_def_rt.rt_dev);
- + old_def_rt.rt_dev = tmp_dev;
- +
- + notice("replacing old default route to %s [%I]",
- + old_def_rt.rt_dev, old_gateway);
- + default_rt_repl_rest = 1;
- + del_rt = &old_def_rt;
- + }
- + }
- }
-
- memset (&rt, '\0', sizeof (rt));
- @@ -1623,6 +1662,12 @@
- error("default route ioctl(SIOCADDRT): %m");
- return 0;
- }
- + if (default_rt_repl_rest && del_rt)
- + if (ioctl(sock_fd, SIOCDELRT, del_rt) < 0) {
- + if ( ! ok_error ( errno ))
- + error("del old default route ioctl(SIOCDELRT): %m(%d)", errno);
- + return 0;
- + }
-
- default_route_gateway = gateway;
- return 1;
- @@ -1658,6 +1703,16 @@
- return 0;
- }
- }
- + if (default_rt_repl_rest) {
- + notice("restoring old default route to %s [%I]",
- + old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
- + if (ioctl(sock_fd, SIOCADDRT, &old_def_rt) < 0) {
- + if ( ! ok_error ( errno ))
- + error("restore default route ioctl(SIOCADDRT): %m(%d)", errno);
- + return 0;
- + }
- + default_rt_repl_rest = 0;
- + }
-
- return 1;
- }
|