2002-03-27 Ilya Alexeev <ilya@continuum.ru>

* PR162
        * net/if_ppp.c ppp_txdaemon(), net/if_pppvar.h pppstart(): Local
	variables must not be used in a device write routines.  Now
	ppp_softc structure have own character for writing to device
	(sc_outchar).  I think that converting local variables to static
	is not a right solution, because problems will occur in the case
	of two or more ppp instances.
	* net/ppp_tty.c pppstart(): Type of the ioffset variable must be
	u_long, otherwise in the case of the big output packet endless
	loop may occur.
This commit is contained in:
Joel Sherrill
2002-03-27 14:36:07 +00:00
parent 90f30c8c14
commit f4c118d7a3
12 changed files with 78 additions and 39 deletions

View File

@@ -1,3 +1,16 @@
2002-03-27 Ilya Alexeev <ilya@continuum.ru>
* PR162
* net/if_ppp.c ppp_txdaemon(), net/if_pppvar.h pppstart(): Local
variables must not be used in a device write routines. Now
ppp_softc structure have own character for writing to device
(sc_outchar). I think that converting local variables to static
is not a right solution, because problems will occur in the case
of two or more ppp instances.
* net/ppp_tty.c pppstart(): Type of the ioffset variable must be
u_long, otherwise in the case of the big output packet endless
loop may occur.
2002-03-21 Ilya Alexeev <ilya@continuum.ru> 2002-03-21 Ilya Alexeev <ilya@continuum.ru>
* net/if_ppp.c, net/ppp_tty.c: Initial preparations for multiple * net/if_ppp.c, net/ppp_tty.c: Initial preparations for multiple

View File

@@ -243,7 +243,6 @@ static rtems_task ppp_rxdaemon(rtems_task_argument arg)
static rtems_task ppp_txdaemon(rtems_task_argument arg) static rtems_task ppp_txdaemon(rtems_task_argument arg)
{ {
rtems_event_set events; rtems_event_set events;
char cFrame = (char )PPP_FLAG;
int iprocess = (int )0; int iprocess = (int )0;
struct ppp_softc *sc = (struct ppp_softc *)arg; struct ppp_softc *sc = (struct ppp_softc *)arg;
struct mbuf *mp; struct mbuf *mp;
@@ -351,7 +350,8 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
microtime(&sc->sc_if.if_lastchange); microtime(&sc->sc_if.if_lastchange);
/* write out frame byte to start the transmission */ /* write out frame byte to start the transmission */
(*tp->device.write)(tp->minor, &cFrame, 1); sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
} }
/* check to see if we need to free some empty mbufs */ /* check to see if we need to free some empty mbufs */

View File

@@ -105,6 +105,7 @@ struct ppp_softc {
short sc_outfcslen; /* length of output fcs data */ short sc_outfcslen; /* length of output fcs data */
u_char sc_outfcsbuf[8]; /* output packet fcs buffer */ u_char sc_outfcsbuf[8]; /* output packet fcs buffer */
u_char *sc_outbuf; /* pointer to output data */ u_char *sc_outbuf; /* pointer to output data */
u_char sc_outchar;
rtems_id sc_rxtask; rtems_id sc_rxtask;
rtems_id sc_txtask; rtems_id sc_txtask;

View File

@@ -562,10 +562,8 @@ pppasyncctlp(sc)
int int
pppstart(struct rtems_termios_tty *tp) pppstart(struct rtems_termios_tty *tp)
{ {
char c;
char *sendBegin; char *sendBegin;
char cFrame = (char )PPP_FLAG; u_long ioffset = (u_long )0;
u_char ioffset = (u_char )0;
struct mbuf *m = (struct mbuf *)0; struct mbuf *m = (struct mbuf *)0;
struct ppp_softc *sc = tp->t_sc; struct ppp_softc *sc = tp->t_sc;
@@ -596,7 +594,8 @@ pppstart(struct rtems_termios_tty *tp)
else { else {
/* done with this packet */ /* done with this packet */
sc->sc_outflag &= ~SC_TX_BUSY; sc->sc_outflag &= ~SC_TX_BUSY;
(*tp->device.write)(tp->minor, &cFrame, 1); sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
rtems_event_send(sc->sc_txtask, TX_TRANSMIT); rtems_event_send(sc->sc_txtask, TX_TRANSMIT);
} }
} }
@@ -604,11 +603,11 @@ pppstart(struct rtems_termios_tty *tp)
/* check to see if there is some data to write out */ /* check to see if there is some data to write out */
if ( sc->sc_outoff < sc->sc_outlen ) { if ( sc->sc_outoff < sc->sc_outlen ) {
/* check to see if character needs to be escaped */ /* check to see if character needs to be escaped */
c = sc->sc_outbuf[sc->sc_outoff]; sc->sc_outchar = sc->sc_outbuf[sc->sc_outoff];
if ( ESCAPE_P(c) ) { if ( ESCAPE_P(sc->sc_outchar) ) {
if ( sc->sc_outflag & SC_TX_ESCAPE ) { if ( sc->sc_outflag & SC_TX_ESCAPE ) {
/* last sent character was the escape character */ /* last sent character was the escape character */
c = c ^ PPP_TRANS; sc->sc_outchar = sc->sc_outchar ^ PPP_TRANS;
/* clear the escape flag and increment the offset */ /* clear the escape flag and increment the offset */
sc->sc_outflag &= ~SC_TX_ESCAPE; sc->sc_outflag &= ~SC_TX_ESCAPE;
@@ -616,18 +615,18 @@ pppstart(struct rtems_termios_tty *tp)
} }
else { else {
/* need to send the escape character */ /* need to send the escape character */
c = PPP_ESCAPE; sc->sc_outchar = PPP_ESCAPE;
/* set the escape flag */ /* set the escape flag */
sc->sc_outflag |= SC_TX_ESCAPE; sc->sc_outflag |= SC_TX_ESCAPE;
} }
sendBegin = &c; sendBegin = &sc->sc_outchar;
} }
else { else {
/* escape not needed - increment the offset as much as possible */ /* escape not needed - increment the offset as much as possible */
while ((!ESCAPE_P(c)) && ((sc->sc_outoff + ioffset) < sc->sc_outlen)) { while ((!ESCAPE_P(sc->sc_outchar)) && ((sc->sc_outoff + ioffset) < sc->sc_outlen)) {
ioffset++; ioffset++;
c = sc->sc_outbuf[sc->sc_outoff + ioffset]; sc->sc_outchar = sc->sc_outbuf[sc->sc_outoff + ioffset];
} }
sendBegin = &sc->sc_outbuf[sc->sc_outoff]; sendBegin = &sc->sc_outbuf[sc->sc_outoff];
} }

View File

@@ -1,3 +1,16 @@
2002-03-27 Ilya Alexeev <ilya@continuum.ru>
* PR162
* net/if_ppp.c ppp_txdaemon(), net/if_pppvar.h pppstart(): Local
variables must not be used in a device write routines. Now
ppp_softc structure have own character for writing to device
(sc_outchar). I think that converting local variables to static
is not a right solution, because problems will occur in the case
of two or more ppp instances.
* net/ppp_tty.c pppstart(): Type of the ioffset variable must be
u_long, otherwise in the case of the big output packet endless
loop may occur.
2002-03-21 Ilya Alexeev <ilya@continuum.ru> 2002-03-21 Ilya Alexeev <ilya@continuum.ru>
* net/if_ppp.c, net/ppp_tty.c: Initial preparations for multiple * net/if_ppp.c, net/ppp_tty.c: Initial preparations for multiple

View File

@@ -243,7 +243,6 @@ static rtems_task ppp_rxdaemon(rtems_task_argument arg)
static rtems_task ppp_txdaemon(rtems_task_argument arg) static rtems_task ppp_txdaemon(rtems_task_argument arg)
{ {
rtems_event_set events; rtems_event_set events;
char cFrame = (char )PPP_FLAG;
int iprocess = (int )0; int iprocess = (int )0;
struct ppp_softc *sc = (struct ppp_softc *)arg; struct ppp_softc *sc = (struct ppp_softc *)arg;
struct mbuf *mp; struct mbuf *mp;
@@ -351,7 +350,8 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
microtime(&sc->sc_if.if_lastchange); microtime(&sc->sc_if.if_lastchange);
/* write out frame byte to start the transmission */ /* write out frame byte to start the transmission */
(*tp->device.write)(tp->minor, &cFrame, 1); sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
} }
/* check to see if we need to free some empty mbufs */ /* check to see if we need to free some empty mbufs */

View File

@@ -105,6 +105,7 @@ struct ppp_softc {
short sc_outfcslen; /* length of output fcs data */ short sc_outfcslen; /* length of output fcs data */
u_char sc_outfcsbuf[8]; /* output packet fcs buffer */ u_char sc_outfcsbuf[8]; /* output packet fcs buffer */
u_char *sc_outbuf; /* pointer to output data */ u_char *sc_outbuf; /* pointer to output data */
u_char sc_outchar;
rtems_id sc_rxtask; rtems_id sc_rxtask;
rtems_id sc_txtask; rtems_id sc_txtask;

View File

@@ -562,10 +562,8 @@ pppasyncctlp(sc)
int int
pppstart(struct rtems_termios_tty *tp) pppstart(struct rtems_termios_tty *tp)
{ {
char c;
char *sendBegin; char *sendBegin;
char cFrame = (char )PPP_FLAG; u_long ioffset = (u_long )0;
u_char ioffset = (u_char )0;
struct mbuf *m = (struct mbuf *)0; struct mbuf *m = (struct mbuf *)0;
struct ppp_softc *sc = tp->t_sc; struct ppp_softc *sc = tp->t_sc;
@@ -596,7 +594,8 @@ pppstart(struct rtems_termios_tty *tp)
else { else {
/* done with this packet */ /* done with this packet */
sc->sc_outflag &= ~SC_TX_BUSY; sc->sc_outflag &= ~SC_TX_BUSY;
(*tp->device.write)(tp->minor, &cFrame, 1); sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
rtems_event_send(sc->sc_txtask, TX_TRANSMIT); rtems_event_send(sc->sc_txtask, TX_TRANSMIT);
} }
} }
@@ -604,11 +603,11 @@ pppstart(struct rtems_termios_tty *tp)
/* check to see if there is some data to write out */ /* check to see if there is some data to write out */
if ( sc->sc_outoff < sc->sc_outlen ) { if ( sc->sc_outoff < sc->sc_outlen ) {
/* check to see if character needs to be escaped */ /* check to see if character needs to be escaped */
c = sc->sc_outbuf[sc->sc_outoff]; sc->sc_outchar = sc->sc_outbuf[sc->sc_outoff];
if ( ESCAPE_P(c) ) { if ( ESCAPE_P(sc->sc_outchar) ) {
if ( sc->sc_outflag & SC_TX_ESCAPE ) { if ( sc->sc_outflag & SC_TX_ESCAPE ) {
/* last sent character was the escape character */ /* last sent character was the escape character */
c = c ^ PPP_TRANS; sc->sc_outchar = sc->sc_outchar ^ PPP_TRANS;
/* clear the escape flag and increment the offset */ /* clear the escape flag and increment the offset */
sc->sc_outflag &= ~SC_TX_ESCAPE; sc->sc_outflag &= ~SC_TX_ESCAPE;
@@ -616,18 +615,18 @@ pppstart(struct rtems_termios_tty *tp)
} }
else { else {
/* need to send the escape character */ /* need to send the escape character */
c = PPP_ESCAPE; sc->sc_outchar = PPP_ESCAPE;
/* set the escape flag */ /* set the escape flag */
sc->sc_outflag |= SC_TX_ESCAPE; sc->sc_outflag |= SC_TX_ESCAPE;
} }
sendBegin = &c; sendBegin = &sc->sc_outchar;
} }
else { else {
/* escape not needed - increment the offset as much as possible */ /* escape not needed - increment the offset as much as possible */
while ((!ESCAPE_P(c)) && ((sc->sc_outoff + ioffset) < sc->sc_outlen)) { while ((!ESCAPE_P(sc->sc_outchar)) && ((sc->sc_outoff + ioffset) < sc->sc_outlen)) {
ioffset++; ioffset++;
c = sc->sc_outbuf[sc->sc_outoff + ioffset]; sc->sc_outchar = sc->sc_outbuf[sc->sc_outoff + ioffset];
} }
sendBegin = &sc->sc_outbuf[sc->sc_outoff]; sendBegin = &sc->sc_outbuf[sc->sc_outoff];
} }

View File

@@ -1,3 +1,16 @@
2002-03-27 Ilya Alexeev <ilya@continuum.ru>
* PR162
* net/if_ppp.c ppp_txdaemon(), net/if_pppvar.h pppstart(): Local
variables must not be used in a device write routines. Now
ppp_softc structure have own character for writing to device
(sc_outchar). I think that converting local variables to static
is not a right solution, because problems will occur in the case
of two or more ppp instances.
* net/ppp_tty.c pppstart(): Type of the ioffset variable must be
u_long, otherwise in the case of the big output packet endless
loop may occur.
2002-03-21 Ilya Alexeev <ilya@continuum.ru> 2002-03-21 Ilya Alexeev <ilya@continuum.ru>
* net/if_ppp.c, net/ppp_tty.c: Initial preparations for multiple * net/if_ppp.c, net/ppp_tty.c: Initial preparations for multiple

View File

@@ -243,7 +243,6 @@ static rtems_task ppp_rxdaemon(rtems_task_argument arg)
static rtems_task ppp_txdaemon(rtems_task_argument arg) static rtems_task ppp_txdaemon(rtems_task_argument arg)
{ {
rtems_event_set events; rtems_event_set events;
char cFrame = (char )PPP_FLAG;
int iprocess = (int )0; int iprocess = (int )0;
struct ppp_softc *sc = (struct ppp_softc *)arg; struct ppp_softc *sc = (struct ppp_softc *)arg;
struct mbuf *mp; struct mbuf *mp;
@@ -351,7 +350,8 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
microtime(&sc->sc_if.if_lastchange); microtime(&sc->sc_if.if_lastchange);
/* write out frame byte to start the transmission */ /* write out frame byte to start the transmission */
(*tp->device.write)(tp->minor, &cFrame, 1); sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
} }
/* check to see if we need to free some empty mbufs */ /* check to see if we need to free some empty mbufs */

View File

@@ -105,6 +105,7 @@ struct ppp_softc {
short sc_outfcslen; /* length of output fcs data */ short sc_outfcslen; /* length of output fcs data */
u_char sc_outfcsbuf[8]; /* output packet fcs buffer */ u_char sc_outfcsbuf[8]; /* output packet fcs buffer */
u_char *sc_outbuf; /* pointer to output data */ u_char *sc_outbuf; /* pointer to output data */
u_char sc_outchar;
rtems_id sc_rxtask; rtems_id sc_rxtask;
rtems_id sc_txtask; rtems_id sc_txtask;

View File

@@ -562,10 +562,8 @@ pppasyncctlp(sc)
int int
pppstart(struct rtems_termios_tty *tp) pppstart(struct rtems_termios_tty *tp)
{ {
char c;
char *sendBegin; char *sendBegin;
char cFrame = (char )PPP_FLAG; u_long ioffset = (u_long )0;
u_char ioffset = (u_char )0;
struct mbuf *m = (struct mbuf *)0; struct mbuf *m = (struct mbuf *)0;
struct ppp_softc *sc = tp->t_sc; struct ppp_softc *sc = tp->t_sc;
@@ -596,7 +594,8 @@ pppstart(struct rtems_termios_tty *tp)
else { else {
/* done with this packet */ /* done with this packet */
sc->sc_outflag &= ~SC_TX_BUSY; sc->sc_outflag &= ~SC_TX_BUSY;
(*tp->device.write)(tp->minor, &cFrame, 1); sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
rtems_event_send(sc->sc_txtask, TX_TRANSMIT); rtems_event_send(sc->sc_txtask, TX_TRANSMIT);
} }
} }
@@ -604,11 +603,11 @@ pppstart(struct rtems_termios_tty *tp)
/* check to see if there is some data to write out */ /* check to see if there is some data to write out */
if ( sc->sc_outoff < sc->sc_outlen ) { if ( sc->sc_outoff < sc->sc_outlen ) {
/* check to see if character needs to be escaped */ /* check to see if character needs to be escaped */
c = sc->sc_outbuf[sc->sc_outoff]; sc->sc_outchar = sc->sc_outbuf[sc->sc_outoff];
if ( ESCAPE_P(c) ) { if ( ESCAPE_P(sc->sc_outchar) ) {
if ( sc->sc_outflag & SC_TX_ESCAPE ) { if ( sc->sc_outflag & SC_TX_ESCAPE ) {
/* last sent character was the escape character */ /* last sent character was the escape character */
c = c ^ PPP_TRANS; sc->sc_outchar = sc->sc_outchar ^ PPP_TRANS;
/* clear the escape flag and increment the offset */ /* clear the escape flag and increment the offset */
sc->sc_outflag &= ~SC_TX_ESCAPE; sc->sc_outflag &= ~SC_TX_ESCAPE;
@@ -616,18 +615,18 @@ pppstart(struct rtems_termios_tty *tp)
} }
else { else {
/* need to send the escape character */ /* need to send the escape character */
c = PPP_ESCAPE; sc->sc_outchar = PPP_ESCAPE;
/* set the escape flag */ /* set the escape flag */
sc->sc_outflag |= SC_TX_ESCAPE; sc->sc_outflag |= SC_TX_ESCAPE;
} }
sendBegin = &c; sendBegin = &sc->sc_outchar;
} }
else { else {
/* escape not needed - increment the offset as much as possible */ /* escape not needed - increment the offset as much as possible */
while ((!ESCAPE_P(c)) && ((sc->sc_outoff + ioffset) < sc->sc_outlen)) { while ((!ESCAPE_P(sc->sc_outchar)) && ((sc->sc_outoff + ioffset) < sc->sc_outlen)) {
ioffset++; ioffset++;
c = sc->sc_outbuf[sc->sc_outoff + ioffset]; sc->sc_outchar = sc->sc_outbuf[sc->sc_outoff + ioffset];
} }
sendBegin = &sc->sc_outbuf[sc->sc_outoff]; sendBegin = &sc->sc_outbuf[sc->sc_outoff];
} }