]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/plugins/rp-pppoe/plugin.c
Remove name checks in the rp-pppoe plugin PPPoEDevnameHook function.
[ppp.git] / pppd / plugins / rp-pppoe / plugin.c
index 6fb6bf83d8f2d566a9720e20f4270d6a95912e0f..b84a6af696d192448151ed84ac6b38fdaa929a9d 100644 (file)
@@ -22,7 +22,7 @@
 ***********************************************************************/
 
 static char const RCSID[] =
-"$Id: plugin.c,v 1.5 2002/03/14 20:32:41 dfs Exp $";
+"$Id: plugin.c,v 1.15 2006/05/29 23:29:16 paulus Exp $";
 
 #define _GNU_SOURCE 1
 #include "pppoe.h"
@@ -64,7 +64,7 @@ static char *acName = NULL;
 static char *existingSession = NULL;
 static int printACNames = 0;
 
-static int PPPoEDevnameHook(const char **argv);
+static int PPPoEDevnameHook(char *cmd, char **argv, int doit);
 static option_t Options[] = {
     { "device name", o_wild, (void *) &PPPoEDevnameHook,
       "PPPoE device name",
@@ -80,7 +80,7 @@ static option_t Options[] = {
       "Be verbose about discovered access concentrators"},
     { NULL }
 };
-int (*OldDevnameHook)(const char **argv) = NULL;
+
 static PPPoEConnection *conn = NULL;
 
 /**********************************************************************
@@ -144,7 +144,8 @@ PPPOEConnectDevice(void)
     } else {
        discovery(conn);
        if (conn->discoveryState != STATE_SESSION) {
-           fatal("Unable to complete PPPoE Discovery");
+           error("Unable to complete PPPoE Discovery");
+           return -1;
        }
     }
 
@@ -180,41 +181,16 @@ PPPOEConnectDevice(void)
     return conn->sessionSocket;
 }
 
-static void
-PPPOESendConfig(int mtu,
-               u_int32_t asyncmap,
-               int pcomp,
-               int accomp)
-{
-    int sock;
-    struct ifreq ifr;
-
-    if (mtu > MAX_PPPOE_MTU) {
-       warn("Couldn't increase MTU to %d", mtu);
-       mtu = MAX_PPPOE_MTU;
-    }
-    sock = socket(AF_INET, SOCK_DGRAM, 0);
-    if (sock < 0) {
-       fatal("Couldn't create IP socket: %m");
-    }
-    strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-    ifr.ifr_mtu = mtu;
-    if (ioctl(sock, SIOCSIFMTU, &ifr) < 0) {
-       fatal("ioctl(SIOCSIFMTU): %m");
-    }
-    (void) close (sock);
-}
-
-
 static void
 PPPOERecvConfig(int mru,
                u_int32_t asyncmap,
                int pcomp,
                int accomp)
 {
-    if (mru > MAX_PPPOE_MTU) {
-       error("Couldn't increase MRU to %d", mru);
-    }
+#if 0 /* broken protocol, but no point harrassing the users I guess... */
+    if (mru > MAX_PPPOE_MTU)
+       warn("Couldn't increase MRU to %d", mru);
+#endif
 }
 
 /**********************************************************************
@@ -242,6 +218,8 @@ PPPOEDisconnectDevice(void)
        return;
     }
     close(conn->sessionSocket);
+    /* don't send PADT?? */
+    close(conn->discoverySocket);
 }
 
 static void
@@ -259,7 +237,9 @@ struct channel pppoe_channel;
 /**********************************************************************
  * %FUNCTION: PPPoEDevnameHook
  * %ARGUMENTS:
- * argv -- argument vector for option
+ * cmd -- the command (actually, the device name
+ * argv -- argument vector
+ * doit -- if non-zero, set device name.  Otherwise, just check if possible
  * %RETURNS:
  * 1 if we will handle this device; 0 otherwise.
  * %DESCRIPTION:
@@ -267,17 +247,20 @@ struct channel pppoe_channel;
  * sets up devnam (string representation of device).
  ***********************************************************************/
 static int
-PPPoEDevnameHook(const char **argv)
+PPPoEDevnameHook(char *cmd, char **argv, int doit)
 {
     int r = 1;
     int fd;
     struct ifreq ifr;
-    char const *name = *argv;
 
-    /* Only do it if name is "ethXXX" */
-    /* Thanks to Russ Couturier for this fix */
-    if (strlen(name) < 4 || strncmp(name, "eth", 3)) {
-       return 0;
+    /*
+     * Take any otherwise-unrecognized option as a possible device name,
+     * and test if it is the name of a network interface with a
+     * hardware address whose sa_family is ARPHRD_ETHER.
+     */
+    if (strlen(cmd) > 4 && !strncmp(cmd, "nic-", 4)) {
+       /* Strip off "nic-" */
+       cmd += 4;
     }
 
     /* Open a socket */
@@ -287,7 +270,7 @@ PPPoEDevnameHook(const char **argv)
 
     /* Try getting interface index */
     if (r) {
-       strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+       strncpy(ifr.ifr_name, cmd, sizeof(ifr.ifr_name));
        if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) {
            r = 0;
        } else {
@@ -295,8 +278,9 @@ PPPoEDevnameHook(const char **argv)
                r = 0;
            } else {
                if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
-                   error("Interface %s not Ethernet", name);
-                   r=0;
+                   if (doit)
+                       error("Interface %s not Ethernet", cmd);
+                   r = 0;
                }
            }
        }
@@ -304,37 +288,18 @@ PPPoEDevnameHook(const char **argv)
 
     /* Close socket */
     close(fd);
-    if (r) {
-       strncpy(devnam, name, sizeof(devnam));
+    if (r && doit) {
+       strncpy(devnam, cmd, sizeof(devnam));
        if (the_channel != &pppoe_channel) {
 
            the_channel = &pppoe_channel;
            modem = 0;
 
-           lcp_allowoptions[0].neg_accompression = 0;
-           lcp_wantoptions[0].neg_accompression = 0;
-
-           lcp_allowoptions[0].neg_asyncmap = 0;
-           lcp_wantoptions[0].neg_asyncmap = 0;
-
-           lcp_allowoptions[0].neg_pcompression = 0;
-           lcp_wantoptions[0].neg_pcompression = 0;
-
-           ccp_allowoptions[0].deflate = 0 ;
-           ccp_wantoptions[0].deflate = 0 ;
-
-           ipcp_allowoptions[0].neg_vj=0;
-           ipcp_wantoptions[0].neg_vj=0;
-
-           ccp_allowoptions[0].bsd_compress = 0;
-           ccp_wantoptions[0].bsd_compress = 0;
-
            PPPOEInitDevice();
        }
        return 1;
     }
 
-    if (OldDevnameHook) r = OldDevnameHook(argv);
     return r;
 }
 
@@ -414,16 +379,41 @@ sysErr(char const *str)
     rp_fatal(str);
 }
 
+void pppoe_check_options(void)
+{
+    lcp_allowoptions[0].neg_accompression = 0;
+    lcp_wantoptions[0].neg_accompression = 0;
+
+    lcp_allowoptions[0].neg_asyncmap = 0;
+    lcp_wantoptions[0].neg_asyncmap = 0;
+
+    lcp_allowoptions[0].neg_pcompression = 0;
+    lcp_wantoptions[0].neg_pcompression = 0;
+
+    if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
+       lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
+    if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
+       lcp_wantoptions[0].mru = MAX_PPPOE_MTU;
+
+    ccp_allowoptions[0].deflate = 0;
+    ccp_wantoptions[0].deflate = 0;
+
+    ipcp_allowoptions[0].neg_vj = 0;
+    ipcp_wantoptions[0].neg_vj = 0;
+
+    ccp_allowoptions[0].bsd_compress = 0;
+    ccp_wantoptions[0].bsd_compress = 0;
+}
 
 struct channel pppoe_channel = {
     options: Options,
     process_extra_options: &PPPOEDeviceOptions,
-    check_options: NULL,
+    check_options: pppoe_check_options,
     connect: &PPPOEConnectDevice,
     disconnect: &PPPOEDisconnectDevice,
     establish_ppp: &generic_establish_ppp,
     disestablish_ppp: &generic_disestablish_ppp,
-    send_config: &PPPOESendConfig,
+    send_config: NULL,
     recv_config: &PPPOERecvConfig,
     close: NULL,
     cleanup: NULL