]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/multilink.c
update for 2.4
[ppp.git] / pppd / multilink.c
index 546fcaea64004d0d2df991705975de6d90a4761d..23f0fa084962a4ffb7baa345919f58b9b2ab6068 100644 (file)
@@ -95,7 +95,11 @@ mp_join_bundle()
                /* not doing multilink */
                if (go->neg_mrru)
                        notice("oops, multilink negotiated only for receive");
-               multilink = 0;
+               if (demand) {
+                       /* already have a bundle */
+                       cfg_bundle(0, 0, 0, 0);
+                       return 0;
+               }
                make_new_bundle(0, 0, 0, 0);
                set_ifunit(1);
                return 0;
@@ -125,26 +129,35 @@ mp_join_bundle()
                              epdisc_to_str(&ho->endpoint));
        if (bundle_name)
                p += slprintf(p, bundle_id+l-p, "/%v", bundle_name);
-       dbglog("bundle_id = %s", bundle_id+7);
+
+       /*
+        * For demand mode, we only need to configure the bundle
+        * and attach the link.
+        */
+       if (demand) {
+               cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
+               script_setenv("BUNDLE", bundle_id + 7, 1);
+               return 0;
+       }
 
        /*
         * Check if the bundle ID is already in the database.
         */
        unit = -1;
-       pppd_pid = -1;
+       tdb_writelock(pppdb);
        key.dptr = bundle_id;
        key.dsize = p - bundle_id;
-       tdb_writelock(pppdb);
        pid = tdb_fetch(pppdb, key);
        if (pid.dptr != NULL) {
-               /* bundle ID exists, see if the pppd record still exists */
+               /* bundle ID exists, see if the pppd record exists */
                rec = tdb_fetch(pppdb, pid);
                if (rec.dptr != NULL) {
                        /* it is, parse the interface number */
                        parse_num(rec.dptr, "IFNAME=ppp", &unit);
                        /* check the pid value */
-                       parse_num(rec.dptr, "PPPD_PID=", &pppd_pid);
-                       if (!process_exists(pppd_pid) || !owns_unit(pid, unit))
+                       if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid)
+                           || !process_exists(pppd_pid)
+                           || !owns_unit(pid, unit))
                                unit = -1;
                        free(rec.dptr);
                }
@@ -152,12 +165,12 @@ mp_join_bundle()
        }
 
        if (unit >= 0) {
-               /* attach to existing unit, if the pid still exists */
+               /* attach to existing unit */
                if (bundle_attach(unit)) {
-                       dbglog("attached link to interface %d", ifunit);
                        set_ifunit(0);
                        script_setenv("BUNDLE", bundle_id + 7, 0);
                        tdb_writeunlock(pppdb);
+                       info("Link attached to %s", ifname);
                        return 1;
                }
                /* attach failed because bundle doesn't exist */
@@ -168,6 +181,7 @@ mp_join_bundle()
        set_ifunit(1);
        script_setenv("BUNDLE", bundle_id + 7, 1);
        tdb_writeunlock(pppdb);
+       info("New bundle %s created", ifname);
        return 0;
 }
 
@@ -345,12 +359,10 @@ str_to_epdisc(ep, str)
                if (i == 0 || str[i] != 0)
                        return 0;
                set_ip_epdisc(ep, addr);
-               dbglog("str_to_epdisc -> %s", epdisc_to_str(ep));
                return 1;
        }
        if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) {
                ep->length = 6;
-               dbglog("str_to_epdisc -> %s", epdisc_to_str(ep));
                return 1;
        }
 
@@ -373,7 +385,6 @@ str_to_epdisc(ep, str)
        if (*str != 0 || (ep->class == EPD_MAC && l != 6))
                return 0;
        ep->length = l;
-       dbglog("str_to_epdisc -> %s", epdisc_to_str(ep));
        return 1;
 }