forked from Imagelibrary/rtems
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:
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user