[En-Nut-Discussion] PPP/memory problem

Alain M. alainm at pobox.com
Mon Oct 22 22:15:03 CEST 2007


Could this be incorporated in main version, I intend to use PPP too!!!

thanks,
Alain

Brett Abbott escreveu:
> Daniel
> 
> I have an extended sample app developed for nutos/PPP which didnt make 
> it into the released code base for some reason.  This addresses a number 
> of bugs and gives some examples for some of the stuff you are trying to 
> do.  You might be able to use it to cross check your own code.
> 
> Drop me a note directly with your email address if you are interested.
> 
> Cheers
> Brett
> 
> Michael Müller wrote:
>> Hi,
>>
>> I also experience the same problem running the PPP stack. There seems to
>> be a magic barrier of about 10kB free heap space. If the system
>> (standard Ethernut 1.3 NutOS 4.3.x) under-runs this amount of free
>> memory it becomes instable and crashes immediately. As it happens just
>> with the first dial in and not after many dial processes the memory leak
>>   seems to be a different trouble maker.
>>
>> Kind regards
>>   Michael
>>
>>
>> p3stk4 schrieb:
>>   
>>> Welcome,
>>>
>>> I'm writting a program for device which has to connect via GPRS modem
>>> send (MC35i) and some information to the server. Everything was good
>>> until program become bigger. Than I've noticed a problem with PPP
>>> driver. Without any reason it cannot establish connection (modem says
>>> ERROR/OK) or device hangup or restart.
>>> It seams to be a memory - like problem, because sometimes the
>>> configuration structure in the memory is overwritten with some data. 
>>>
>>> How can I solve this problem?
>>>
>>> The device is:
>>> ATmega128 + 64 KB sram memory (3 wait states, one block)
>>> One RS232
>>> and nothing more.
>>>
>>> Configuration file used to build Nut/OS:
>>>
>>> PLATFORM = "ETHERNUT1"
>>> AVR_GCC = ""
>>> MCU_ATMEGA128 = ""
>>> NUTMEM_START = "0x100"
>>> NUTMEM_RESERVED = "64"
>>> NUTXMEM_SIZE = "0xEE00"
>>> NUTXMEM_START = "0x1100"
>>> NUT_CPU_FREQ = "16000000"
>>>
>>> Software:
>>> avr-gcc 4.2.1-1
>>> avr-libc 1.4.5-2
>>> binutils-avr 2.17
>>> Nut/OS 4.4.0.0
>>> Ubuntu Gutsy Gibbon RC
>>>
>>>
>>>
>>>
>>> The main below.
>>> Regards,
>>> Daniel Lewandowski
>>>
>>>
>>>
>>> /*
>>>  * open modem as uart device
>>>  */
>>> int modem_open (void)
>>> {
>>>   u_long lctl;
>>>   char buffer[64];
>>>
>>>   strcpy_P(buffer, PSTR("ppp:" PPPCOM "/"));
>>>   strncat(buffer, config->pppuser, PPPUSER_MAX);
>>>   strcat_P(buffer, PSTR("/"));
>>>   strncat(buffer, config->ppppass, PPPPASS_MAX);
>>>
>>>   uart = _open(buffer, _O_RDWR | _O_BINARY);
>>>   if (uart == -1) {
>>>     return -1;
>>>   }
>>>
>>>   lctl = UARTSPEED;
>>>   _ioctl(uart, UART_SETSPEED, &lctl);
>>>
>>>   lctl = 1;
>>>   _ioctl(uart, UART_SETRAWMODE, &lctl);
>>>
>>>   modem_rxto(UARTFSTRXTO);
>>>
>>>   _ioctl(uart, HDLC_SETIFNET, 0);
>>>   NutSleep(2000);
>>>
>>>   return 0;
>>> }
>>>
>>>
>>> /*
>>>  * close raw uart 
>>>  */
>>> int modem_close(void)
>>> {
>>>   return _close(uart);
>>> }
>>>
>>>
>>> /*
>>>  * make a gprs connection active
>>>  */
>>> int modem_gprs_open(void)
>>> {
>>>   int rc;
>>>   u_long lctl;
>>>   char buffer[256];
>>>
>>>   lctl = 0;
>>>   _ioctl(uart, UART_SETRAWMODE, &lctl);
>>>
>>>   strcpy_P(buffer, PSTR("TIMEOUT 30"
>>> 			" ABORT ERROR"
>>> 			" ABORT 'NO CARRIER'"
>>> 			" ABORT 'NO DIALTONE'"
>>> 			" '' ATH OK AT&D1 OK"
>>> 			" AT+CGDCONT=1,\"IP\",\""));
>>>   strncat(buffer, config->pppapn, PPPAPN_MAX);
>>>   strcat_P(buffer, PSTR("\" OK ATD*99***1# CONNECT"));
>>>
>>>   rc = NutChat(uart, buffer);
>>>   return rc;
>>> }
>>>
>>>
>>> int modem_gprs_close(void)
>>> {
>>>   int rc = 0;
>>>   u_long lctl;
>>>
>>>   _ioctl(uart, HDLC_SETIFNET, 0);
>>>   NutSleep(2000);
>>>
>>>   MODEM_PORT &= ~_BV(MODEM_DTR); // DTR low
>>>
>>>   lctl = 1;
>>>   _ioctl(uart, UART_SETRAWMODE, &lctl);
>>>
>>>   NutSleep(3000);
>>>
>>>
>>>   MODEM_PORT |= _BV(MODEM_DTR); // DTR high
>>>   NutSleep(500);
>>>
>>>
>>>   return rc;
>>> }
>>>
>>>
>>> /*
>>>  * create request frame
>>>  */
>>> static void modem_frame_request(char *buffer);
>>> static void modem_frame_alarm(char *buffer);
>>> static void modem_frame_logged(char *buffer);
>>> static void modem_frame_keepalive(char *buffer);
>>>
>>> static int send_data(u_long ip, u_short port, void *data, u_short bytes)
>>> {
>>>   int rc;
>>>   u_char *msg = (u_char*)data;
>>>   u_long sock_to = 5000;
>>>   TCPSOCKET *const sock = NutTcpCreateSocket();
>>>
>>>   if (sock == NULL) {
>>>     return -1;
>>>   }
>>>
>>>   NutTcpSetSockOpt(sock, SO_RCVTIMEO, &sock_to, sizeof(sock_to));
>>>   NutTcpSetSockOpt(sock, SO_SNDTIMEO, &sock_to, sizeof(sock_to));
>>>
>>>   rc = NutTcpConnect(sock, ip, port);
>>>   if (rc == 0) {
>>>     while(bytes > 0) {
>>>       rc = NutTcpSend(sock, msg, bytes);
>>>       if (rc > 0) {
>>> 	bytes -= rc;
>>> 	msg += rc;
>>>       }
>>>       else if (rc == 0) {
>>> 	break;
>>>       }
>>>       else {
>>> 	break;
>>>       }
>>>     }
>>>   }
>>>
>>>   rc = NutTcpCloseSocket(sock);
>>>   if (rc) {
>>>     return -1;
>>>   }
>>>
>>>   return 0;
>>> }
>>>
>>>
>>> /*
>>>  * send string message to the server
>>>  */
>>> static int send_msg(u_long ip, u_short port, char *msg)
>>> {
>>>   return send_data(ip, port, msg, strlen(msg));
>>> }
>>>
>>>
>>>
>>> char buffer[64];
>>>
>>> /*
>>>  * main loop
>>>  */
>>> int main (void)
>>> {
>>>   DEVICE_STATE state;
>>>   int rc;
>>>
>>>   u_char alarm_phone_index = 0;
>>>   u_long interval = 0;
>>>   u_long next_slot = 0;
>>>   PPPDCB *dcb;
>>>
>>>   state = INITIALIZE;
>>>
>>>   for(;;) {
>>>     NutSleep(0);
>>>     watchdog_clear();
>>>     switch (state) {
>>>     case INITIALIZE:
>>>       config_init();
>>>       adc_init();
>>>       leds_init();
>>>       amplifier_init();
>>>       buttons_init();
>>>       modem_init();
>>>
>>>       modem_open();
>>>       modem_ignite();
>>>       state = IDLE;
>>>
>>>
>>>     case IDLE:
>>>       state = READ_SMS;
>>>       break;
>>>
>>>
>>>     case OPEN_GPRS:
>>>       NutNetIfConfig("ppp", 0, 0, 0); 
>>>       dcb = devPpp.dev_dcb;
>>>       NutDnsConfig2(0, 0, dcb->dcb_ip_dns1, dcb->dcb_ip_dns2);
>>>       NutIpRouteAdd(0, 0, dcb->dcb_remote_ip, &devPpp);
>>>
>>>       state = WORKING;
>>>       break;
>>>
>>>
>>>     case CLOSE_GPRS:
>>>       modem_gprs_close();
>>>       state = IDLE;
>>>       break;
>>>
>>>
>>>     case WORKING:
>>> 	...
>>>       break;
>>>     }
>>>   }
>>>
>>>   return 0;
>>> }
>>>
>>>
>>> _______________________________________________
>>> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
>>>
>>>     
>>
>> _______________________________________________
>> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
>>
>>
>>   
> 



More information about the En-Nut-Discussion mailing list