OpenWrt – Rev 4

Subversion Repositories:
Rev:
From: George Kashperko <george@znau.edu.ua>

Make mlppp support more generic interface naming other than pppX
Signed-off-by: George Kashperko <george@znau.edu.ua>
---
 pppd/multilink.c |   55 +++++++++++++++++++++++++++++++++------------
 pppd/sys-linux.c |   12 +++++++++
 2 files changed, 53 insertions(+), 14 deletions(-)
--- a/pppd/multilink.c
+++ b/pppd/multilink.c
@@ -56,7 +56,8 @@ static void iterate_bundle_links __P((vo
 
 static int get_default_epdisc __P((struct epdisc *));
 static int parse_num __P((char *str, const char *key, int *valp));
-static int owns_unit __P((TDB_DATA pid, int unit));
+static int parse_str __P((char *str, const char *key, char *buf, int buflen));
+static int owns_link __P((TDB_DATA pid, char *ifname));
 
 #define set_ip_epdisc(ep, addr) do {   \
        ep->length = 4;                 \
@@ -197,35 +198,38 @@ mp_join_bundle()
        key.dptr = bundle_id;
        key.dsize = p - bundle_id;
        pid = tdb_fetch(pppdb, key);
+
        if (pid.dptr != NULL) {
+               char tmp[IFNAMSIZ];
+
                /* bundle ID exists, see if the pppd record exists */
                rec = tdb_fetch(pppdb, pid);
+
                if (rec.dptr != NULL && rec.dsize > 0) {
                        /* make sure the string is null-terminated */
                        rec.dptr[rec.dsize-1] = 0;
-                       /* parse the interface number */
-                       parse_num(rec.dptr, "IFNAME=ppp", &unit);
+
                        /* check the pid value */
                        if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid)
+                           || !parse_str(rec.dptr, "IFNAME=", tmp, sizeof(tmp))
+                           || !parse_num(rec.dptr, "IFUNIT=", &unit)
                            || !process_exists(pppd_pid)
-                           || !owns_unit(pid, unit))
+                           || !owns_link(pid, tmp))
                                unit = -1;
                        free(rec.dptr);
                }
                free(pid.dptr);
-       }
 
-       if (unit >= 0) {
                /* attach to existing unit */
-               if (bundle_attach(unit)) {
+               if (unit >= 0 && bundle_attach(unit)) {
                        set_ifunit(0);
                        script_setenv("BUNDLE", bundle_id + 7, 0);
                        make_bundle_links(1);
                        unlock_db();
-                       info("Link attached to %s", ifname);
+                       info("Link attached to %s", tmp);
                        return 1;
+                       /* attach failed because bundle doesn't exist */
                }
-               /* attach failed because bundle doesn't exist */
        }
 
        /* we have to make a new bundle */
@@ -408,22 +412,45 @@ parse_num(str, key, valp)
        return 0;
 }
 
+static int
+parse_str(str, key, buf, buflen)
+     char *str;
+     const char *key;
+     char *buf;
+     int buflen;
+{
+       char *p, *endp;
+       int i;
+
+       p = strstr(str, key);
+       if (p) {
+               p += strlen(key);
+               while (--buflen && *p != 0 && *p != ';')
+                       *(buf++) = *(p++);
+               *buf = 0;
+               return 1;
+       }
+       return 0;
+}
+
 /*
- * Check whether the pppd identified by `key' still owns ppp unit `unit'.
+ * Check whether the pppd identified by `key' still owns ppp link `ifname'.
  */
 static int
-owns_unit(key, unit)
+owns_link(key, ifname)
      TDB_DATA key;
-     int unit;
+     char *ifname;
 {
-       char ifkey[32];
+       char ifkey[7 + IFNAMSIZ];
        TDB_DATA kd, vd;
        int ret = 0;
 
-       slprintf(ifkey, sizeof(ifkey), "IFNAME=ppp%d", unit);
+       slprintf(ifkey, sizeof(ifkey), "IFNAME=%s", ifname);
+
        kd.dptr = ifkey;
        kd.dsize = strlen(ifkey);
        vd = tdb_fetch(pppdb, kd);
+
        if (vd.dptr != NULL) {
                ret = vd.dsize == key.dsize
                        && memcmp(vd.dptr, key.dptr, vd.dsize) == 0;
--- a/pppd/sys-linux.c
+++ b/pppd/sys-linux.c
@@ -698,6 +698,16 @@ void cfg_bundle(int mrru, int mtru, int
        add_fd(ppp_dev_fd);
 }
 
+static void
+setenv_ifunit(void)
+{
+#ifdef USE_TDB
+       char tmp[11];
+       slprintf(tmp, sizeof(tmp), "%d", ifunit);
+       script_setenv("IFUNIT", tmp, 0);
+#endif
+}
+
 /*
  * make_new_bundle - create a new PPP unit (i.e. a bundle)
  * and connect our channel to it.  This should only get called
@@ -716,6 +726,8 @@ void make_new_bundle(int mrru, int mtru,
 
        /* set the mrru and flags */
        cfg_bundle(mrru, mtru, rssn, tssn);
+
+       setenv_ifunit();
 }
 
 /*