]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-linux.c
pppd: Don't unconditionally disable VJ compression under Linux
[ppp.git] / pppd / sys-linux.c
index aba33d3b413e2a65d8839e82317bb5c065bbbc19..4fe221d86549ba9efeb204db375e093eebfceba0 100644 (file)
@@ -1658,6 +1658,8 @@ int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
     SET_SA_FAMILY (rt.rt_dst,     AF_INET);
     SET_SA_FAMILY (rt.rt_gateway, AF_INET);
 
+    rt.rt_dev = ifname;
+
     if (kernel_version > KVERSION(2,1,0)) {
        SET_SA_FAMILY (rt.rt_genmask, AF_INET);
        SIN_ADDR(rt.rt_genmask) = 0L;
@@ -2022,14 +2024,6 @@ int ppp_available(void)
     int    my_version, my_modification, my_patch;
     int osmaj, osmin, ospatch;
 
-    no_ppp_msg =
-       "This system lacks kernel support for PPP.  This could be because\n"
-       "the PPP kernel module could not be loaded, or because PPP was not\n"
-       "included in the kernel configuration.  If PPP was included as a\n"
-       "module, try `/sbin/modprobe -v ppp'.  If that fails, check that\n"
-       "ppp.o exists in /lib/modules/`uname -r`/net.\n"
-       "See README.linux file in the ppp distribution for more details.\n";
-
     /* get the kernel version now, since we are called before sys_init */
     uname(&utsname);
     osmaj = osmin = ospatch = 0;
@@ -2037,21 +2031,6 @@ int ppp_available(void)
     kernel_version = KVERSION(osmaj, osmin, ospatch);
 
     fd = open("/dev/ppp", O_RDWR);
-#if 0
-    if (fd < 0 && errno == ENOENT) {
-       /* try making it and see if that helps. */
-       if (mknod("/dev/ppp", S_IFCHR | S_IRUSR | S_IWUSR,
-                 makedev(108, 0)) >= 0) {
-           fd = open("/dev/ppp", O_RDWR);
-           if (fd >= 0)
-               info("Created /dev/ppp device node");
-           else
-               unlink("/dev/ppp");     /* didn't work, undo the mknod */
-       } else if (errno == EEXIST) {
-           fd = open("/dev/ppp", O_RDWR);
-       }
-    }
-#endif /* 0 */
     if (fd >= 0) {
        new_style_driver = 1;
 
@@ -2062,16 +2041,29 @@ int ppp_available(void)
        close(fd);
        return 1;
     }
+
     if (kernel_version >= KVERSION(2,3,13)) {
+       error("Couldn't open the /dev/ppp device: %m");
        if (errno == ENOENT)
            no_ppp_msg =
-               "pppd is unable to open the /dev/ppp device.\n"
                "You need to create the /dev/ppp device node by\n"
                "executing the following command as root:\n"
                "       mknod /dev/ppp c 108 0\n";
+       else if (errno == ENODEV || errno == ENXIO)
+           no_ppp_msg =
+               "Please load the ppp_generic kernel module.\n";
        return 0;
     }
 
+    /* we are running on a really really old kernel */
+    no_ppp_msg =
+       "This system lacks kernel support for PPP.  This could be because\n"
+       "the PPP kernel module could not be loaded, or because PPP was not\n"
+       "included in the kernel configuration.  If PPP was included as a\n"
+       "module, try `/sbin/modprobe -v ppp'.  If that fails, check that\n"
+       "ppp.o exists in /lib/modules/`uname -r`/net.\n"
+       "See README.linux file in the ppp distribution for more details.\n";
+
 /*
  * Open a socket for doing the ioctl operations.
  */
@@ -2240,9 +2232,10 @@ int sifvjcomp (int u, int vjcomp, int cidcomp, int maxcid)
        u_int x;
 
        if (vjcomp) {
-               if (ioctl(ppp_dev_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0)
+               if (ioctl(ppp_dev_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) {
                        error("Couldn't set up TCP header compression: %m");
-               vjcomp = 0;
+                       vjcomp = 0;
+               }
        }
 
        x = (vjcomp? SC_COMP_TCP: 0) | (cidcomp? 0: SC_NO_TCP_CCID);
@@ -2346,11 +2339,13 @@ int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
 /*
  *  Set the gateway address
  */
-    SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
-    if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
-       if (! ok_error (errno))
-           error("ioctl(SIOCSIFDSTADDR): %m (line %d)", __LINE__);
-       return (0);
+    if (his_adr != 0) {
+       SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
+       if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
+           if (! ok_error (errno))
+               error("ioctl(SIOCSIFDSTADDR): %m (line %d)", __LINE__);
+           return (0);
+       }
     }
 /*
  *  Set the netmask.