[FreeBSD] Патч для привязки имени PPP интерфейса к порту. (mac freebsd kernel patch ip)
Ключевые слова: mac, freebsd, kernel, patch, ip, (найти похожие документы)
From: Roman V. Palagin <[email protected]>
Subject: [FreeBSD] Патч для привязки имени PPP интерфейса к порту.
Патчи для FreeBSD 3.x, добавляющие PPPIOCSUNIT. Без коментариев.
вопросы (по существу): [email protected]
KERNEL PATCH:
diff -urN /usr/src/sys/net/save/if_ppp.c net/if_ppp.c
--- /usr/src/sys/net/save/if_ppp.c Mon Aug 2 11:12:29 1999
+++ net/if_ppp.c Mon Aug 2 13:49:18 1999
@@ -246,26 +246,23 @@
}
/*
- * Allocate a ppp interface unit and initialize it.
+ * Initialize ppp interface unit.
*/
-struct ppp_softc *
-pppalloc(pid)
- pid_t pid;
-{
- int nppp, i;
+void
+pppinit(sc)
struct ppp_softc *sc;
-
- for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++)
- if (sc->sc_xfer == pid) {
- sc->sc_xfer = 0;
- return sc;
- }
- for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++)
- if (sc->sc_devp == NULL)
- break;
- if (nppp >= NPPP)
- return NULL;
-
+{
+ int i;
+
+ sc->sc_ilen = 0;
+ sc->sc_m = NULL;
+ bzero(sc->sc_asyncmap, sizeof(sc->sc_asyncmap));
+ sc->sc_asyncmap[0] = 0xffffffff;
+ sc->sc_asyncmap[3] = 0x60000000;
+ sc->sc_rasyncmap = 0;
+ sc->sc_outm = NULL;
+ sc->sc_if.if_flags |= IFF_RUNNING;
+ getmicrotime(&sc->sc_if.if_lastchange);
sc->sc_flags = 0;
sc->sc_mru = PPP_MRU;
sc->sc_relinq = NULL;
@@ -285,8 +282,6 @@
sc->sc_npqueue = NULL;
sc->sc_npqtail = &sc->sc_npqueue;
sc->sc_last_sent = sc->sc_last_recv = time_second;
-
- return sc;
}
/*
@@ -378,10 +373,6 @@
switch (cmd) {
case FIONREAD:
*(int *)data = sc->sc_inq.ifq_len;
- break;
-
- case PPPIOCGUNIT:
- *(int *)data = sc->sc_if.if_unit;
break;
case PPPIOCGFLAGS:
diff -urN /usr/src/sys/net/save/if_ppp.h net/if_ppp.h
--- /usr/src/sys/net/save/if_ppp.h Mon Aug 2 11:12:29 1999
+++ net/if_ppp.h Mon Aug 2 11:08:25 1999
@@ -49,6 +49,7 @@
#define SC_LOG_OUTPKT 0x00040000 /* log contents of pkts sent */
#define SC_LOG_RAWIN 0x00080000 /* log all chars received */
#define SC_LOG_FLUSH 0x00100000 /* log all chars flushed */
+#define SC_STATIC 0x00200000 /* static unit */
#define SC_RCV_B7_0 0x01000000 /* have rcvd char with bit 7 = 0 */
#define SC_RCV_B7_1 0x02000000 /* have rcvd char with bit 7 = 1 */
#define SC_RCV_EVNP 0x04000000 /* have rcvd char with even parity */
@@ -98,7 +99,7 @@
/*
* Ioctl definitions.
*/
-
+#define PPPIOCSUNIT _IOW('t', 91, int) /* set PPP unit number */
#define PPPIOCGFLAGS _IOR('t', 90, int) /* get configuration flags */
#define PPPIOCSFLAGS _IOW('t', 89, int) /* set configuration flags */
#define PPPIOCGASYNCMAP _IOR('t', 88, int) /* get async map */
diff -urN /usr/src/sys/net/save/if_pppvar.h net/if_pppvar.h
--- /usr/src/sys/net/save/if_pppvar.h Mon Aug 2 13:43:57 1999
+++ net/if_pppvar.h Mon Aug 2 16:18:11 1999
@@ -100,7 +100,7 @@
extern struct ppp_softc ppp_softc[NPPP];
-struct ppp_softc *pppalloc __P((pid_t pid));
+void pppinit __P((struct ppp_softc *sc));
void pppdealloc __P((struct ppp_softc *sc));
int pppioctl __P((struct ppp_softc *sc, u_long cmd, caddr_t data,
int flag, struct proc *p));
diff -urN /usr/src/sys/net/save/ppp_tty.c net/ppp_tty.c
--- /usr/src/sys/net/save/ppp_tty.c Mon Aug 2 11:12:29 1999
+++ net/ppp_tty.c Mon Aug 2 15:59:20 1999
@@ -90,6 +90,7 @@
#include <sys/conf.h>
#include <sys/uio.h>
#include <sys/vnode.h>
+#include <sys/malloc.h>
#ifdef __i386__
#include <i386/isa/intr_machdep.h>
@@ -190,7 +191,7 @@
/*
* Line specific open routine for async tty devices.
- * Attach the given tty to the first available ppp unit.
+ * Just make some checks and return.
* Called from device open routine or ttioctl() at >= splsofttty()
*/
/* ARGSUSED */
@@ -199,49 +200,25 @@
dev_t dev;
register struct tty *tp;
{
- struct proc *p = curproc; /* XXX */
+ struct proc *p = curproc; /* XXX */
register struct ppp_softc *sc;
int error, s;
if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
return (error);
-
+
+ printf("pppopen() entered\n");
s = spltty();
- if (tp->t_line == PPPDISC) {
+ if (tp->t_line == PPPDISC) { /* XXX unsure */
sc = (struct ppp_softc *) tp->t_sc;
if (sc != NULL && sc->sc_devp == (void *) tp) {
splx(s);
- return (0);
+ return (EBUSY);
}
}
- if ((sc = pppalloc(p->p_pid)) == NULL) {
- splx(s);
- return ENXIO;
- }
-
- if (sc->sc_relinq)
- (*sc->sc_relinq)(sc); /* get previous owner to relinquish the unit */
-
- sc->sc_ilen = 0;
- sc->sc_m = NULL;
- bzero(sc->sc_asyncmap, sizeof(sc->sc_asyncmap));
- sc->sc_asyncmap[0] = 0xffffffff;
- sc->sc_asyncmap[3] = 0x60000000;
- sc->sc_rasyncmap = 0;
- sc->sc_devp = (void *) tp;
- sc->sc_start = pppasyncstart;
- sc->sc_ctlp = pppasyncctlp;
- sc->sc_relinq = pppasyncrelinq;
- sc->sc_setmtu = pppasyncsetmtu;
- sc->sc_outm = NULL;
- pppgetm(sc);
- sc->sc_if.if_flags |= IFF_RUNNING;
- getmicrotime(&sc->sc_if.if_lastchange);
- sc->sc_if.if_baudrate = tp->t_ospeed;
-
- tp->t_sc = (caddr_t) sc;
+ tp->t_sc = (caddr_t) 0;
ttyflush(tp, FREAD | FWRITE);
/*
@@ -250,12 +227,12 @@
* We also pass 1 byte tokens through t_canq...
*/
clist_alloc_cblocks(&tp->t_canq, 1, 1);
- clist_alloc_cblocks(&tp->t_outq, sc->sc_if.if_mtu + PPP_HIWAT,
- sc->sc_if.if_mtu + PPP_HIWAT);
+ clist_alloc_cblocks(&tp->t_outq, PPP_MTU + PPP_HIWAT,
+ PPP_MTU + PPP_HIWAT);
clist_alloc_cblocks(&tp->t_rawq, 0, 0);
splx(s);
-
+ printf("pppopen() exited\n");
return (0);
}
@@ -464,13 +441,65 @@
struct proc *p;
{
struct ppp_softc *sc = (struct ppp_softc *) tp->t_sc;
- int error, s;
+ int error, s, unit;
- if (sc == NULL || tp != (struct tty *) sc->sc_devp)
- return (ENOIOCTL);
+ if(cmd != PPPIOCSUNIT)
+ if(sc == NULL || tp != (struct tty *) sc->sc_devp)
+ return (ENOIOCTL);
error = 0;
switch (cmd) {
+
+ case PPPIOCGUNIT:
+ *(int *)data = sc->sc_if.if_unit;
+ break;
+
+ case PPPIOCSUNIT:
+
+
+ if(sc != NULL) {
+ error = EINVAL;
+ break;
+ }
+
+ unit = *(int*)data;
+ printf("pppioctl(PPPIOCSUNIT): unit %d\n", unit);
+
+ if(unit == -1) { /* get first free unit */
+ for(unit = 0; unit < NPPP; unit++)
+ if(ppp_softc[unit].sc_devp == NULL)
+ break;
+ *(int*)data = unit; /* return unit number */
+ }
+
+ if( unit <0 || unit >= NPPP ) {
+ error = ENXIO;
+ break;
+ }
+
+ sc = &ppp_softc[unit];
+
+ if(sc->sc_devp != NULL) {
+ error = EBUSY;
+ break;
+ }
+
+ pppinit(sc);
+ sc->sc_start = pppasyncstart;
+ sc->sc_ctlp = pppasyncctlp;
+ sc->sc_relinq = pppasyncrelinq;
+ sc->sc_setmtu = pppasyncsetmtu;
+ sc->sc_devp = (void *) tp;
+ sc->sc_if.if_baudrate = tp->t_ospeed;
+ pppgetm(sc);
+ tp->t_sc = (caddr_t)sc;
+#ifdef notyet
+ if (sc->sc_relinq)
+ (*sc->sc_relinq)(sc); /* get previous owner to relinquish the unit */
+#endif
+
+ break;
+
case PPPIOCSASYNCMAP:
if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
break;
PPPD PATCH:
diff -urN /usr/src/usr.sbin/pppd/Makefile pppd/Makefile
--- /usr/src/usr.sbin/pppd/Makefile Sat Jul 31 18:08:34 1999
+++ pppd/Makefile Mon Aug 2 11:43:05 1999
@@ -1,6 +1,6 @@
# $Id: Makefile,v 1.12.2.1 1999/05/07 04:29:04 jdp Exp $
-CFLAGS+= -DHAVE_PATHS_H
+CFLAGS+= -g -DHAVE_PATHS_H
PROG= pppd
SRCS= main.c magic.c fsm.c lcp.c ipcp.c ipxcp.c upap.c chap.c ccp.c \
diff -urN /usr/src/usr.sbin/pppd/main.c pppd/main.c
--- /usr/src/usr.sbin/pppd/main.c Sat Jul 31 18:08:34 1999
+++ pppd/main.c Mon Aug 2 16:49:54 1999
@@ -72,7 +72,6 @@
/* interface vars */
char ifname[32]; /* Interface name */
-int ifunit; /* Interface unit number */
char *progname; /* Name of this program */
char hostname[MAXNAMELEN]; /* Our hostname */
diff -urN /usr/src/usr.sbin/pppd/options.c pppd/options.c
--- /usr/src/usr.sbin/pppd/options.c Sat Jul 31 18:08:34 1999
+++ pppd/options.c Mon Aug 2 16:50:21 1999
@@ -85,6 +85,7 @@
int kdebugflag = 0; /* Tell kernel to print debug messages */
int default_device = 1; /* Using /dev/tty or equivalent */
char devnam[MAXPATHLEN] = "/dev/tty"; /* Device name */
+int ifunit = -1; /* PPP iface unit number, if -1 - auto */
int crtscts = 0; /* Use hardware flow control */
int modem = 1; /* Use modem control lines */
int inspeed = 0; /* Input/Output speed requested */
@@ -138,6 +139,7 @@
* Prototypes
*/
static int setdevname __P((char *, int));
+static int setpppunit __P((char **));
static int setspeed __P((char *));
static int setdebug __P((char **));
static int setkdebug __P((char **));
@@ -285,6 +287,7 @@
int num_args;
int (*cmd_func) __P((char **));
} cmds[] = {
+ {"pppunit",1,setpppunit}, /* Set PPP iface number */
{"-all", 0, noopt}, /* Don't request/allow any options (useless) */
{"noaccomp", 0, noaccomp}, /* Disable Address/Control compression */
{"-ac", 0, noaccomp}, /* Disable Address/Control compress */
@@ -1308,6 +1311,19 @@
return (1);
}
+/*
+ * setpppunit - Set PPP unit number.
+ */
+static int
+setpppunit(argv)
+ char **argv;
+{
+ int unit;
+ if (!number_option(*argv, &unit, 0))
+ return 0;
+ ifunit = unit;
+ return (1);
+}
/*
* setmru - Set the largest MTU we'll use.
diff -urN /usr/src/usr.sbin/pppd/patchlevel.h pppd/patchlevel.h
--- /usr/src/usr.sbin/pppd/patchlevel.h Sat Jun 20 22:02:14 1998
+++ pppd/patchlevel.h Mon Aug 2 16:48:18 1999
@@ -2,5 +2,5 @@
#define PATCHLEVEL 5
#define VERSION "2.3"
-#define IMPLEMENTATION ""
-#define DATE "4 May 1998"
+#define IMPLEMENTATION "-PPPIOCSUNIT"
+#define DATE "02 Aug 1999"
diff -urN /usr/src/usr.sbin/pppd/sys-bsd.c pppd/sys-bsd.c
--- /usr/src/usr.sbin/pppd/sys-bsd.c Sat Jul 31 18:08:34 1999
+++ pppd/sys-bsd.c Mon Aug 2 13:56:58 1999
@@ -236,10 +236,19 @@
}
if (!demand) {
+
+ /*
+ * Allocate async PPP unit
+ */
+ if (ioctl(fd, PPPIOCSUNIT, &ifunit) < 0) {
+ syslog(LOG_ERR, "ioctl(PPPIOCSUNIT): %m");
+ die(1);
+ }
+
/*
* Find out which interface we were given.
*/
- if (ioctl(fd, PPPIOCGUNIT, &ifunit) < 0) {
+ if (ioctl(fd, PPPIOCGUNIT, &ifunit) < 0) {
syslog(LOG_ERR, "ioctl(PPPIOCGUNIT): %m");
die(1);
}