From: George Kashperko Make mlppp support more generic interface naming other than pppX Signed-off-by: George Kashperko --- pppd/multilink.c | 55 +++++++++++++++++++++++++++++++++------------ pppd/sys-linux.c | 12 +++++++++ 2 files changed, 53 insertions(+), 14 deletions(-) --- a/pppd/multilink.c +++ b/pppd/multilink.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "pppd-private.h" #include "fsm.h" @@ -62,7 +63,8 @@ static void iterate_bundle_links(void (* static int get_default_epdisc(struct epdisc *); static int parse_num(char *str, const char *key, int *valp); -static int owns_unit(TDB_DATA pid, int unit); +static int parse_str(char *str, const char *key, char *buf, int buflen); +static int owns_link(TDB_DATA pid, char *ifname); #define set_ip_epdisc(ep, addr) do { \ ep->length = 4; \ @@ -215,35 +217,38 @@ mp_join_bundle(void) 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, "UNIT=", &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); ppp_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 */ @@ -423,20 +428,39 @@ parse_num(char *str, const char *key, in return 0; } +static int +parse_str(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(TDB_DATA key, int unit) +owns_link(TDB_DATA key, char *ifname) { - char ifkey[32]; + char ifkey[7 + IFNAMSIZ]; TDB_DATA kd, vd; int ret = 0; - slprintf(ifkey, sizeof(ifkey), "UNIT=%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 @@ -984,6 +984,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); + ppp_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 @@ -1002,6 +1012,8 @@ void make_new_bundle(int mrru, int mtru, /* set the mrru and flags */ cfg_bundle(mrru, mtru, rssn, tssn); + + setenv_ifunit(); } /*