summaryrefslogtreecommitdiffstats
path: root/cpukit/libnetworking/net/if_ppp.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libnetworking/net/if_ppp.c')
-rw-r--r--cpukit/libnetworking/net/if_ppp.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/cpukit/libnetworking/net/if_ppp.c b/cpukit/libnetworking/net/if_ppp.c
index 3e4f8b25ff..cdab88ee73 100644
--- a/cpukit/libnetworking/net/if_ppp.c
+++ b/cpukit/libnetworking/net/if_ppp.c
@@ -250,6 +250,8 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
struct mbuf *mf;
struct mbuf *m;
struct rtems_termios_tty *tp;
+
+ int frag;
/* enter processing loop */
while ( 1 ) {
@@ -258,7 +260,9 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
if ( events & TX_TRANSMIT ) {
/* received event from interrupt handler - free current mbuf */
rtems_bsdnet_semaphore_obtain();
+
m_freem(sc->sc_outm);
+
rtems_bsdnet_semaphore_release();
/* chain is done - clear the values */
@@ -267,7 +271,7 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
/* now set flag to fake receive of TX_PACKET event */
/* this will check to see if we have any pending packets */
- events |= TX_PACKET;
+ events |= TX_PACKET;
}
/* received event from pppasyncstart */
@@ -294,6 +298,7 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
if ( iprocess ) {
/* clear process flag */
iprocess = (int)0;
+ frag=0;
/* initialize output values */
sc->sc_outfcs = PPP_INITFCS;
@@ -301,23 +306,37 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
sc->sc_outlen = (short )0;
sc->sc_outoff = (short )0;
sc->sc_outfcslen = (short )0;
+
+/* printf("Start Transmit Packet..\n"); */
/* loop over all mbufs in chain */
mf = NULL;
mp = NULL;
m = sc->sc_outm;
+
+ sc->sc_outmc = m;
+ sc->sc_outlen = m->m_len;
+ sc->sc_outbuf = mtod(m, u_char *);
+
while (( m != (struct mbuf *)0 ) && ( m->m_len > 0 )) {
- /* check to see if first mbuf value has been set */
- if ( sc->sc_outmc == (struct mbuf *)0 ) {
- /* set values to start with this mbuf */
- sc->sc_outmc = m;
- sc->sc_outlen = m->m_len;
- sc->sc_outbuf = mtod(m, u_char *);
- }
+ frag++;
/* update the FCS value and then check next packet length */
- sc->sc_outfcs = pppfcs(sc->sc_outfcs, mtod(m, u_char *), m->m_len);
-
+ if(m->m_len){
+ sc->sc_outfcs = pppfcs(sc->sc_outfcs, mtod(m, u_char *), m->m_len);
+ }
+
+ if(( m->m_next != NULL ) && ( m->m_next->m_len == 0 )) {
+ if(mf){
+ printf(" if_ppp.c : MBUF Error !!!!\n");
+ }
+ else{
+ mf = m->m_next;
+ m->m_next = NULL;
+ }
+ }
+
+#ifdef LALL_X
/* check next packet to see if it is empty */
while (( m->m_next != NULL ) && ( m->m_next->m_len == 0 )) {
/* next mbuf is zero length */
@@ -337,7 +356,7 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
m->m_next = m->m_next->m_next;
mp->m_next = NULL;
}
-
+#endif
/* move to next packet */
m = m->m_next;
}
@@ -351,7 +370,7 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
microtime(&sc->sc_if.if_lastchange);
/* write out frame byte to start the transmission */
- sc->sc_outchar = (u_char)PPP_FLAG;
+ sc->sc_outchar = (u_char)PPP_FLAG;
(*tp->device.write)(tp->minor, &sc->sc_outchar, 1);
}
@@ -361,7 +380,7 @@ static rtems_task ppp_txdaemon(rtems_task_argument arg)
rtems_bsdnet_semaphore_obtain();
m_freem(mf);
rtems_bsdnet_semaphore_release();
- }
+ }
}
}
}