summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Dale <richard.dale@codethink.co.uk>2015-06-15 09:07:45 +0000
committerRichard Dale <richard.dale@codethink.co.uk>2015-06-15 09:07:45 +0000
commit1259dc8ccc1836d37ed99536ea330f565896a201 (patch)
tree433fbaed1744542f59a5d22fc25447247a6a54da
parent04b6a1d17fcd05ef66ab12e1c3b37499eb582ee3 (diff)
downloadppp-1259dc8ccc1836d37ed99536ea330f565896a201.tar.gz
multilink support custom iface names
-rw-r--r--pppd/multilink.c55
-rw-r--r--pppd/sys-linux.c12
2 files changed, 53 insertions, 14 deletions
diff --git a/pppd/multilink.c b/pppd/multilink.c
index 135cab0..c898607 100644
--- a/pppd/multilink.c
+++ b/pppd/multilink.c
@@ -56,7 +56,8 @@ static void iterate_bundle_links __P((void (*func) __P((char *))));
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;
diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c
index 2e7e4bb..a7dc534 100644
--- a/pppd/sys-linux.c
+++ b/pppd/sys-linux.c
@@ -698,6 +698,16 @@ void cfg_bundle(int mrru, int mtru, int rssn, int tssn)
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, int rssn, int tssn)
/* set the mrru and flags */
cfg_bundle(mrru, mtru, rssn, tssn);
+
+ setenv_ifunit();
}
/*