[package] ppp:
[openwrt.git] / package / ppp / patches / 320-custom_iface_names.patch
1 --- a/pppd/main.c
2 +++ b/pppd/main.c
3 @@ -742,8 +742,11 @@ void
4  set_ifunit(iskey)
5      int iskey;
6  {
7 -    info("Using interface %s%d", PPP_DRV_NAME, ifunit);
8 -    slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit);
9 +    if (use_ifname[0] == 0)
10 +       slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit);
11 +    else
12 +       slprintf(ifname, sizeof(ifname), "%s", use_ifname);
13 +    info("Using interface %s", ifname);
14      script_setenv("IFNAME", ifname, iskey);
15      if (iskey) {
16         create_pidfile(getpid());       /* write pid to file */
17 --- a/pppd/options.c
18 +++ b/pppd/options.c
19 @@ -111,6 +111,7 @@ int log_to_fd = 1;          /* send log messages
20  bool   log_default = 1;        /* log_to_fd is default (stdout) */
21  int    maxfail = 10;           /* max # of unsuccessful connection attempts */
22  char   linkname[MAXPATHLEN];   /* logical name for link */
23 +char   use_ifname[IFNAMSIZ];   /* physical name for PPP link */
24  bool   tune_kernel;            /* may alter kernel settings */
25  int    connect_delay = 1000;   /* wait this many ms after connect script */
26  int    req_unit = -1;          /* requested interface unit */
27 @@ -264,6 +265,9 @@ option_t general_options[] = {
28      { "linkname", o_string, linkname,
29        "Set logical name for link",
30        OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXPATHLEN },
31 +    { "ifname", o_string, use_ifname,
32 +      "Set physical name for PPP interface",
33 +      OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, IFNAMSIZ },
34  
35      { "maxfail", o_int, &maxfail,
36        "Maximum number of unsuccessful connection attempts to allow",
37 --- a/pppd/pppd.h
38 +++ b/pppd/pppd.h
39 @@ -71,6 +71,10 @@
40  #include "eui64.h"
41  #endif
42  
43 +#ifndef IFNAMSIZ
44 +#define IFNAMSIZ       16
45 +#endif
46 +
47  /*
48   * Limits.
49   */
50 @@ -308,6 +312,7 @@ extern char *record_file;   /* File to rec
51  extern bool    sync_serial;    /* Device is synchronous serial device */
52  extern int     maxfail;        /* Max # of unsuccessful connection attempts */
53  extern char    linkname[MAXPATHLEN]; /* logical name for link */
54 +extern char    use_ifname[IFNAMSIZ]; /* physical name for PPP interface */
55  extern bool    tune_kernel;    /* May alter kernel settings as necessary */
56  extern int     connect_delay;  /* Time to delay after connect script */
57  extern int     max_data_rate;  /* max bytes/sec through charshunt */
58 --- a/pppd/sys-linux.c
59 +++ b/pppd/sys-linux.c
60 @@ -168,6 +168,10 @@ struct in6_ifreq {
61  /* We can get an EIO error on an ioctl if the modem has hung up */
62  #define ok_error(num) ((num)==EIO)
63  
64 +#if !defined(PPP_DRV_NAME)
65 +#define PPP_DRV_NAME   "ppp"
66 +#endif /* !defined(PPP_DRV_NAME) */
67 +
68  static int tty_disc = N_TTY;   /* The TTY discipline */
69  static int ppp_disc = N_PPP;   /* The PPP discpline */
70  static int initfdflags = -1;   /* Initial file descriptor flags for fd */
71 @@ -622,7 +626,8 @@ void generic_disestablish_ppp(int dev_fd
72   */
73  static int make_ppp_unit()
74  {
75 -       int x, flags;
76 +       struct ifreq ifr;
77 +       int x, flags, s;
78  
79         if (ppp_dev_fd >= 0) {
80                 dbglog("in make_ppp_unit, already had /dev/ppp open?");
81 @@ -645,6 +650,32 @@ static int make_ppp_unit()
82         }
83         if (x < 0)
84                 error("Couldn't create new ppp unit: %m");
85 +
86 +       if (use_ifname[0] != 0) {
87 +               s = socket(PF_INET, SOCK_DGRAM, 0);
88 +               if (s < 0)
89 +                       s = socket(PF_PACKET, SOCK_DGRAM, 0);
90 +               if (s < 0)
91 +                       s = socket(PF_INET6, SOCK_DGRAM, 0);
92 +               if (s < 0)
93 +                       s = socket(PF_UNIX, SOCK_DGRAM, 0);
94 +               if (s >= 0) {
95 +                       slprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", PPP_DRV_NAME, ifunit);
96 +                       slprintf(ifr.ifr_newname, sizeof(ifr.ifr_newname), "%s", use_ifname);
97 +                       x = ioctl(s, SIOCSIFNAME, &ifr);
98 +                       close(s);
99 +               } else {
100 +                       x = s;
101 +               }
102 +               if (x < 0) {
103 +                       error("Couldn't rename %s to %s", ifr.ifr_name, ifr.ifr_newname);
104 +                       close(ppp_dev_fd);
105 +                       ppp_dev_fd = -1;
106 +               } else {
107 +                       info("Renamed %s to %s", ifr.ifr_name, ifr.ifr_newname);
108 +               }
109 +       }
110 +
111         return x;
112  }
113  
114 --- a/pppstats/pppstats.c
115 +++ b/pppstats/pppstats.c
116 @@ -506,10 +506,12 @@ main(argc, argv)
117      if (argc > 0)
118         interface = argv[0];
119  
120 +/*
121      if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) {
122         fprintf(stderr, "%s: invalid interface '%s' specified\n",
123                 progname, interface);
124      }
125 +*/
126  
127  #ifndef STREAMS
128      {