[En-Nut-Discussion] RE: Closing PPP properly: The solution (I hope)

Eduardo Serantes eserantes at telefonica.net
Fri Jan 14 07:24:47 CET 2005


Hi again,

Sorry, but I forgot the sequence to close ppp:

   _ioctl(pppHandler, HDLC_SETIFNET, 0);
   NutSleep(2000);
   _close(pppHandler);
   AvrUsartSetDTR1(1); //or the function you use to hang up the modem

Regards,

Eduardo

> Hi all,
> 
> After 100 coffees and 1000 cigarrettes (who has written the "easy" PPP
> code?), I think I have found a solution to restart the ppp driver
> succesfully. The solution is a little bit "dirty" (in spanish we say
> "casposa"), but it seems no memory remains allocated and the system works
> very well. The changes are only applied to ahdlcavr.c and I have marked
> them:
> 
> 
> THREAD(AhdlcRx, arg)
> {
>     NUTDEVICE *dev = arg;
>     NUTDEVICE *netdev;
>     AHDLCDCB *dcb = dev->dev_dcb;
>     IFNET *ifn;
>     NETBUF *nb;
>     u_char *rxbuf;
>     u_char *rxptr = 0;
>     u_short rxcnt = 0;
>     u_char ch;
>     u_short tbx;
>     u_char inframe;
>     u_char escaped = 0;
>     u_short rxfcs = AHDLC_INITFCS;
> 
>     NutThreadSetPriority(9);
>     for (;;) {
> 
> 	/* Added by Edu */
> 	rxptr = 0;
> 	rxcnt = 0;
> 	escaped = 0;
> 	rxfcs = AHDLC_INITFCS;
> 	/* End*/
> 
>         for (;;) {
> 
> 	............
> 
> 	for (;;) {
>             /*
>              * If we are still connected to a network, fetch the next
>              * character from the buffer.
>              */
>             while (dcb->dcb_rd_idx == dcb->dcb_rx_idx) {
>                 if (dev->dev_icb == 0)
>                     break;
>                 /* TODO: Check for idle timeout. */
>                 if (NutEventWait(&dcb->dcb_rx_rdy, dcb->dcb_rtimeout)) {
>                     continue;
>                 	}
>                 }
> 
> 			/* Added by Edu */
> 			if (dev->dev_icb == 0)
>                     break;
> 			/* End */
> 
>             ch = dcb->dcb_rx_buf[dcb->dcb_rd_idx++];
> 
> 	.............
> 
> /* Signal the link driver that we are down. */
>         netdev->dev_ioctl(netdev, LCP_LOWERDOWN, 0);
> 
>         /* Disconnected, clean up. */
>         if (rxbuf) {
>             NutHeapFree(rxbuf);
>             rxbuf = 0;
>         	}
> 
>         /* Added by Edu */
>       	if (nb) {
> 		   NutHeapFree(nb);
> 		   nb=0;
> 		   }
> 	  /* End */
>     }
> }
> 
> I hope it helps... and if you find any bug, please keep me posted!!
> 
> Regards,
> 
> Eduardo




More information about the En-Nut-Discussion mailing list