X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fsys-linux.c;h=e23315a3486a583092aa9796e3d77a4f58a881dc;hb=d6e4ac0c098b02de9cc7907133d209da1bbf99df;hp=26cadc6e7c797778ca45ca5d80b6eed8f8489b5b;hpb=7977da267649fee17261d0d163a12863f3534b57;p=ppp.git diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c index 26cadc6..e23315a 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -173,8 +173,8 @@ static int ppp_disc = N_PPP; /* The PPP discpline */ static int initfdflags = -1; /* Initial file descriptor flags for fd */ static int ppp_fd = -1; /* fd which is set to PPP discipline */ static int sock_fd = -1; /* socket for doing interface ioctls */ -static int slave_fd = -1; -static int master_fd = -1; +static int slave_fd = -1; /* pty for old-style demand mode, slave */ +static int master_fd = -1; /* pty for old-style demand mode, master */ #ifdef INET6 static int sock6_fd = -1; #endif /* INET6 */ @@ -205,7 +205,7 @@ static char loop_name[20]; static unsigned char inbuf[512]; /* buffer for chars read from loopback */ static int if_is_up; /* Interface has been marked up */ -static u_int32_t default_route_gateway; /* Gateway for default route added */ +static int have_default_route; /* Gateway for default route added */ 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 */ @@ -260,7 +260,6 @@ extern int hungup; /* new_fd is the fd of a tty */ static void set_ppp_fd (int new_fd) { - SYSDEBUG ((LOG_DEBUG, "setting ppp_fd to %d\n", new_fd)); ppp_fd = new_fd; if (!new_style_driver) ppp_dev_fd = new_fd; @@ -342,8 +341,8 @@ void sys_cleanup(void) /* * Delete any routes through the device. */ - if (default_route_gateway != 0) - cifdefaultroute(0, 0, default_route_gateway); + if (have_default_route) + cifdefaultroute(0, 0, 0); if (has_proxy_arp) cifproxyarp(0, proxy_arp_addr); @@ -384,8 +383,6 @@ static int set_kdebugflag (int requested_level) error("ioctl(PPPIOCSDEBUG): %m (line %d)", __LINE__); return (0); } - SYSDEBUG ((LOG_INFO, "set kernel debugging level to %d", - requested_level)); return (1); } @@ -532,9 +529,6 @@ int generic_establish_ppp (int fd) looped = 0; - SYSDEBUG ((LOG_NOTICE, "Using version %d.%d.%d of PPP driver", - driver_version, driver_modification, driver_patch)); - return ppp_fd; err_close: @@ -599,7 +593,7 @@ void generic_disestablish_ppp(int dev_fd) if (demand) { modify_flags(ppp_dev_fd, 0, SC_LOOP_TRAFFIC); looped = 1; - } else if (ppp_dev_fd >= 0) { + } else if (!doing_multilink && ppp_dev_fd >= 0) { close(ppp_dev_fd); remove_fd(ppp_dev_fd); ppp_dev_fd = -1; @@ -718,6 +712,18 @@ int bundle_attach(int ifnum) return 1; } +/* + * destroy_bundle - tell the driver to destroy our bundle. + */ +void destroy_bundle(void) +{ + if (ppp_dev_fd >= 0) { + close(ppp_dev_fd); + remove_fd(ppp_dev_fd); + ppp_dev_fd = -1; + } +} + /******************************************************************** * * clean_check - Fetch the flags for the device and generate @@ -1092,15 +1098,21 @@ int read_packet (unsigned char *buf) if (nr < 0 && errno == ENXIO) return 0; } - if (nr < 0 && new_style_driver && ppp_dev_fd >= 0) { + if (nr < 0 && new_style_driver && ppp_dev_fd >= 0 && !bundle_eof) { /* N.B. we read ppp_fd first since LCP packets come in there. */ nr = read(ppp_dev_fd, buf, len); if (nr < 0 && errno != EWOULDBLOCK && errno != EAGAIN && errno != EIO && errno != EINTR) error("read /dev/ppp: %m"); if (nr < 0 && errno == ENXIO) - return 0; + nr = 0; + if (nr == 0 && doing_multilink) { + remove_fd(ppp_dev_fd); + bundle_eof = 1; + } } + if (new_style_driver && ppp_fd < 0 && ppp_dev_fd < 0) + nr = 0; return (new_style_driver && nr > 0)? nr+2: nr; } @@ -1144,8 +1156,6 @@ netif_set_mtu(int unit, int mtu) { struct ifreq ifr; - SYSDEBUG ((LOG_DEBUG, "netif_set_mtu: mtu = %d\n", mtu)); - memset (&ifr, '\0', sizeof (ifr)); strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); ifr.ifr_mtu = mtu; @@ -1204,9 +1214,6 @@ void tty_send_config(int mtu, u_int32_t asyncmap, int pcomp, int accomp) void tty_set_xaccm (ext_accm accm) { - SYSDEBUG ((LOG_DEBUG, "set_xaccm: %08lx %08lx %08lx %08lx\n", - accm[0], accm[1], accm[2], accm[3])); - if (!still_ppp()) return; if (ioctl(ppp_fd, PPPIOCSXASYNCMAP, accm) < 0 && errno != ENOTTY) { @@ -1582,17 +1589,17 @@ 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); + if (rt.rt_flags & RTF_GATEWAY) + error("not replacing existing default route via %I", + SIN_ADDR(rt.rt_gateway)); + else + error("not replacing existing default route through %s", + rt.rt_dev); return 0; } - memset (&rt, '\0', sizeof (rt)); - SET_SA_FAMILY (rt.rt_dst, AF_INET); - SET_SA_FAMILY (rt.rt_gateway, AF_INET); + memset (&rt, 0, sizeof (rt)); + SET_SA_FAMILY (rt.rt_dst, AF_INET); rt.rt_dev = ifname; @@ -1601,16 +1608,14 @@ int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway) SIN_ADDR(rt.rt_genmask) = 0L; } - SIN_ADDR(rt.rt_gateway) = gateway; - - rt.rt_flags = RTF_UP | RTF_GATEWAY; + rt.rt_flags = RTF_UP; if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) { if ( ! ok_error ( errno )) error("default route ioctl(SIOCADDRT): %m"); return 0; } - default_route_gateway = gateway; + have_default_route = 1; return 1; } @@ -1623,7 +1628,7 @@ int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway) { struct rtentry rt; - default_route_gateway = 0; + have_default_route = 0; memset (&rt, '\0', sizeof (rt)); SET_SA_FAMILY (rt.rt_dst, AF_INET); @@ -1634,9 +1639,7 @@ int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway) SIN_ADDR(rt.rt_genmask) = 0L; } - SIN_ADDR(rt.rt_gateway) = gateway; - - rt.rt_flags = RTF_UP | RTF_GATEWAY; + rt.rt_flags = RTF_UP; if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) { if (still_ppp()) { if ( ! ok_error ( errno )) @@ -1753,8 +1756,6 @@ static int get_ether_addr (u_int32_t ipaddr, return 0; } - SYSDEBUG ((LOG_DEBUG, "proxy arp: scanning %d interfaces for IP %s", - ifc.ifc_len / sizeof(struct ifreq), ip_ntoa(ipaddr))); /* * Scan through looking for an interface with an Internet * address on the same subnet as `ipaddr'. @@ -1764,8 +1765,6 @@ static int get_ether_addr (u_int32_t ipaddr, if (ifr->ifr_addr.sa_family == AF_INET) { ina = SIN_ADDR(ifr->ifr_addr); strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name)); - SYSDEBUG ((LOG_DEBUG, "proxy arp: examining interface %s", - ifreq.ifr_name)); /* * Check that the interface is up, and not point-to-point * nor loopback. @@ -1782,8 +1781,6 @@ static int get_ether_addr (u_int32_t ipaddr, continue; mask = SIN_ADDR(ifreq.ifr_addr); - SYSDEBUG ((LOG_DEBUG, "proxy arp: interface addr %s mask %lx", - ip_ntoa(ina), ntohl(mask))); if (((ipaddr ^ ina) & mask) != 0) continue; /* no match */ @@ -1821,16 +1818,6 @@ static int get_ether_addr (u_int32_t ipaddr, &bestifreq.ifr_hwaddr, sizeof (struct sockaddr)); - SYSDEBUG ((LOG_DEBUG, - "proxy arp: found hwaddr %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", - (int) ((unsigned char *) &hwaddr->sa_data)[0], - (int) ((unsigned char *) &hwaddr->sa_data)[1], - (int) ((unsigned char *) &hwaddr->sa_data)[2], - (int) ((unsigned char *) &hwaddr->sa_data)[3], - (int) ((unsigned char *) &hwaddr->sa_data)[4], - (int) ((unsigned char *) &hwaddr->sa_data)[5], - (int) ((unsigned char *) &hwaddr->sa_data)[6], - (int) ((unsigned char *) &hwaddr->sa_data)[7])); return 1; } @@ -2642,7 +2629,6 @@ open_ppp_loopback(void) if (!get_pty(&master_fd, &slave_fd, loop_name, 0)) fatal("No free pty for loopback"); - SYSDEBUG(("using %s for loopback", loop_name)); set_ppp_fd(slave_fd); @@ -2818,7 +2804,8 @@ sys_check_options(void) if (ipxcp_protent.enabled_flag) { struct stat stat_buf; - if ((path = path_to_procfs("/net/ipx_interface")) == 0 + if ( ((path = path_to_procfs("/net/ipx/interface")) == NULL + && (path = path_to_procfs("/net/ipx_interface")) == NULL) || lstat(path, &stat_buf) < 0) { error("IPX support is not present in the kernel\n"); ipxcp_protent.enabled_flag = 0;