aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/ppp/patches/321-multilink_support_custom_iface_names.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/ppp/patches/321-multilink_support_custom_iface_names.patch')
-rw-r--r--package/network/services/ppp/patches/321-multilink_support_custom_iface_names.patch146
1 files changed, 146 insertions, 0 deletions
diff --git a/package/network/services/ppp/patches/321-multilink_support_custom_iface_names.patch b/package/network/services/ppp/patches/321-multilink_support_custom_iface_names.patch
new file mode 100644
index 0000000..bba5884
--- /dev/null
+++ b/package/network/services/ppp/patches/321-multilink_support_custom_iface_names.patch
@@ -0,0 +1,146 @@
+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();
+ }
+
+ /*