#include #include #include "system.h" /* define global variables */ static unsigned int pppdapp_linkcount = 0; static rtems_id pppdapp_taskid; static void pppdapp_linkup_hook(void) { pppdapp_linkcount++; printf("PPP LINK UP [%d]\n", pppdapp_linkcount); } static void pppdapp_linkdown_hook(void) { printf("PPP LINK DOWN [%d]\n", pppdapp_linkcount); } static void pppdapp_ipup_hook(void) { /* send ipup signal to pppdapp task */ rtems_event_send(pppdapp_taskid, RTEMS_EVENT_10); } static void pppdapp_ipdown_hook(void) { /* send ip down signal to pppdapp task */ rtems_event_send(pppdapp_taskid, RTEMS_EVENT_11); } static void pppdapp_setup(void) { const char *pUser = "oscar"; const char *pPassword = "goldman"; #undef USE_MODEM #ifdef USE_MODEM const char *pTelephone = "5551234"; const char *pInitScript = "TIMEOUT@5@@AT@@OK@"; const char *pConnectScript = "TIMEOUT@90@@ATDT%s@CONNECT@@name:@%s@word:@%s@"; const char *pDisconnectScript = "TIMEOUT@5@@ATH0@@OK@"; char pConnect[128]; /* set the connect string */ sprintf(pConnect, pConnectScript, pTelephone, pUser, pPassword); /* set pppd options for modem */ rtems_pppd_set_option("/dev/ttyS2", NULL); rtems_pppd_set_option("57600", NULL); rtems_pppd_set_option("crtscts", NULL); rtems_pppd_set_option("modem", NULL); rtems_pppd_set_option("noauth", NULL); rtems_pppd_set_option("debug", NULL); rtems_pppd_set_option("init", pInitScript); rtems_pppd_set_option("connect", pConnect); rtems_pppd_set_option("disconnect", pDisconnectScript); #else /* set pppd options for null modem direct link serial cable */ rtems_pppd_set_option("/dev/ttyS1", NULL); rtems_pppd_set_option("57600", NULL); rtems_pppd_set_option("crtscts", NULL); rtems_pppd_set_option("local", NULL); rtems_pppd_set_option("noauth", NULL); rtems_pppd_set_option("debug", NULL); rtems_pppd_set_option("user", pUser); rtems_pppd_set_option("password", pPassword); #endif /* set up pppd hooks */ rtems_pppd_set_hook(RTEMS_PPPD_LINKUP_HOOK, pppdapp_linkup_hook); rtems_pppd_set_hook(RTEMS_PPPD_LINKDOWN_HOOK, pppdapp_linkdown_hook); rtems_pppd_set_hook(RTEMS_PPPD_IPUP_HOOK, pppdapp_ipup_hook); rtems_pppd_set_hook(RTEMS_PPPD_IPDOWN_HOOK, pppdapp_ipdown_hook); } static rtems_task pppdapp(rtems_task_argument arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_interval tickspersecond = 0; rtems_option options; rtems_event_set in; rtems_event_set out; /* initialize ticks per second */ rtems_clock_get(RTEMS_CLOCK_GET_TICKS_PER_SECOND, &tickspersecond); if ( tickspersecond == 0 ) { /* ensure value is greater than zero */ tickspersecond = 100; } /* initiate connection */ pppdapp_setup(); rtems_pppd_connect(); /* enter processing loop */ in = (RTEMS_EVENT_10 | RTEMS_EVENT_11); options = (RTEMS_EVENT_ANY | RTEMS_WAIT); while ( sc == RTEMS_SUCCESSFUL ) { /* wait for the next event */ sc = rtems_event_receive(in, options, RTEMS_NO_TIMEOUT, &out); if ( sc == RTEMS_SUCCESSFUL ) { /* determine which event was sent */ if ( out & RTEMS_EVENT_10 ) { /* ip up recived */ /* call disconnect function */ rtems_pppd_disconnect(); } if ( out & RTEMS_EVENT_11 ) { /* ip down recived */ /* sleep 10 seconds and call connect function */ rtems_task_wake_after(10*tickspersecond); rtems_pppd_connect(); } } } /* terminate myself */ rtems_task_delete(RTEMS_SELF); } int pppdapp_initialize(void) { int iReturn = (int)-1; rtems_status_code status; rtems_name taskName; taskName = rtems_build_name( 'p', 'a', 'p', 'p' ); status = rtems_task_create(taskName, CONFIGURE_INIT_TASK_PRIORITY, CONFIGURE_INIT_TASK_STACK_SIZE, CONFIGURE_INIT_TASK_INITIAL_MODES, RTEMS_DEFAULT_ATTRIBUTES, &pppdapp_taskid); if ( status == RTEMS_SUCCESSFUL ) { status = rtems_task_start(pppdapp_taskid, pppdapp, 0); if ( status == RTEMS_SUCCESSFUL ) { iReturn = (int)0; } } return ( iReturn ); }