|
= |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
| #include <stkmain.h> |
|
#include <stkmain.h> |
| #include <netmain.h> |
|
#include <netmain.h> |
| |
-+ |
#include "hdlcif.h" |
| #include "ppp.h" |
= |
#include "ppp.h" |
| |
|
|
| #ifdef _INCLUDE_PPP_CODE |
|
#ifdef _INCLUDE_PPP_CODE |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| static int PPPStart (NETIF_DEVICE* ptr_net_device) |
|
static int PPPStart (NETIF_DEVICE* ptr_net_device) |
| { |
|
{ |
| PPP_SESSION* p; |
|
PPP_SESSION* p; |
| |
|
|
| |
|
|
| p = (PPP_SESSION *)ptr_net_device->pvt_data; |
|
p = (PPP_SESSION *)ptr_net_device->pvt_data; |
| |
|
|
| |
|
|
| lcpInit( (void *)p ); |
|
lcpInit( (void *)p ); |
| authInit( (void *)p ); |
|
authInit( (void *)p ); |
| ipcpInit( (void *)p ); |
|
ipcpInit( (void *)p ); |
| |
|
|
| |
|
|
| lcpOpen( (void *)p, 1 ); |
|
lcpOpen( (void *)p, 1 ); |
| return 0; |
|
return 0; |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| static int PPPStop (NETIF_DEVICE* ptr_net_device) |
|
static int PPPStop (NETIF_DEVICE* ptr_net_device) |
| { |
|
{ |
| PPP_SESSION* p; |
|
PPP_SESSION* p; |
| |
|
|
| |
|
|
| p = (PPP_SESSION *)ptr_net_device->pvt_data; |
|
p = (PPP_SESSION *)ptr_net_device->pvt_data; |
| if( !p || p->Type != HTYPE_PPP ) |
|
if( !p || p->Type != HTYPE_PPP ) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"PPPStop: Bad Handle %08x",p); |
|
DbgPrintf(DBG_ERROR,"PPPStop: Bad Handle %08x",p); |
| return -1; |
|
return -1; |
| } |
|
} |
| |
|
|
| |
|
|
| if( p->InUse != INUSE_LOCKED ) |
|
if( p->InUse != INUSE_LOCKED ) |
| { |
|
{ |
| if( p->InUse > INUSE_IDLE ) |
|
if( p->InUse > INUSE_IDLE ) |
| { |
|
{ |
| p->InUse--; |
|
p->InUse--; |
| } |
|
} |
| else |
|
else |
| { |
|
{ |
| |
|
|
| lcpClose( p ); |
|
lcpClose( p ); |
| |
|
|
| |
|
|
| p->InUse = INUSE_LOCKED; |
|
p->InUse = INUSE_LOCKED; |
| } |
|
} |
| } |
|
} |
| return 0; |
|
return 0; |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| static int PPPSend (NETIF_DEVICE* ptr_net_device, PBM_Handle hPkt) |
|
static int PPPSend (NETIF_DEVICE* ptr_net_device, PBM_Handle hPkt) |
| { |
|
{ |
| PPP_SESSION* p; |
|
PPP_SESSION* p; |
| |
|
|
| |
|
|
| p = (PPP_SESSION *)ptr_net_device->pvt_data; |
|
p = (PPP_SESSION *)ptr_net_device->pvt_data; |
| |
|
|
| |
|
|
|
|
|
|
|
|
| if( p->hNet || p->hRoute ) |
|
if( p->hNet || p->hRoute ) |
| { |
|
{ |
| |
|
|
| p->SICtrl( p->hSI, SI_MSG_SENDPACKET, PPPPROT_IP, (PBM_Pkt *)hPkt); |
|
p->SICtrl( p->hSI, SI_MSG_SENDPACKET, PPPPROT_IP, (PBM_Pkt *)hPkt); |
| return 0; |
|
return 0; |
| } |
|
} |
| |
|
|
| |
|
|
|
|
|
| return -1; |
|
return -1; |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| void *pppNew( void *hSI, uint32_t pppFlags, uint32_t mru, |
|
void *pppNew( void *hSI, uint32_t pppFlags, uint32_t mru, |
| uint32_t IPServer, uint32_t IPMask, uint32_t IPClient, |
|
uint32_t IPServer, uint32_t IPMask, uint32_t IPClient, |
| char *Username, char *Password, uint32_t cmap, |
|
char *Username, char *Password, uint32_t cmap, |
| void (*SICtrl)( void *, uint32_t, uint32_t, PBM_Pkt * ) ) |
|
void (*SICtrl)( void *, uint32_t, uint32_t, PBM_Pkt * ) ) |
| { |
|
{ |
| PPP_SESSION* p; |
|
PPP_SESSION* p; |
| NETIF_DEVICE* ptr_ppp_device; |
|
NETIF_DEVICE* ptr_ppp_device; |
| |
|
|
| |
|
|
| if( !(p = mmAlloc( sizeof(PPP_SESSION) )) ) |
|
if( !(p = mmAlloc( sizeof(PPP_SESSION) )) ) |
| { |
|
{ |
| DbgPrintf(DBG_WARN,"pppNew: OOM"); |
|
DbgPrintf(DBG_WARN,"pppNew: OOM"); |
| NotifyLowResource(); |
|
NotifyLowResource(); |
| return(0); |
|
return(0); |
| } |
|
} |
| |
|
|
| |
|
|
| mmZeroInit( p, sizeof(PPP_SESSION) ); |
|
mmZeroInit( p, sizeof(PPP_SESSION) ); |
| |
|
|
| |
|
|
| p->Type = HTYPE_PPP; |
|
p->Type = HTYPE_PPP; |
| p->InUse = INUSE_IDLE; |
|
p->InUse = INUSE_IDLE; |
| p->hSI = hSI; |
|
p->hSI = hSI; |
| p->ProtMTU = mru; |
|
p->ProtMTU = mru; |
| p->SICtrl = SICtrl; |
|
p->SICtrl = SICtrl; |
| p->Flags = pppFlags; |
|
p->Flags = pppFlags; |
| p->MTU_Phys = mru; |
|
p->MTU_Phys = mru; |
| p->CMap = cmap; |
|
p->CMap = cmap; |
| p->MTU_Tx = p->MTU_Phys; |
|
p->MTU_Tx = p->MTU_Phys; |
| p->MTU_Rx = p->MTU_Phys; |
|
p->MTU_Rx = p->MTU_Phys; |
| |
|
|
| |
|
|
| ptr_ppp_device = mmAlloc(sizeof(NETIF_DEVICE)); |
|
ptr_ppp_device = mmAlloc(sizeof(NETIF_DEVICE)); |
| if (ptr_ppp_device == NULL) |
|
if (ptr_ppp_device == NULL) |
| { |
|
{ |
| DbgPrintf(DBG_WARN,"pppNew: OOM"); |
|
DbgPrintf(DBG_WARN,"pppNew: OOM"); |
| NotifyLowResource(); |
|
NotifyLowResource(); |
| return(0); |
|
return(0); |
| } |
|
} |
| |
|
|
| |
|
|
| mmZeroInit (ptr_ppp_device, sizeof(NETIF_DEVICE)); |
|
mmZeroInit (ptr_ppp_device, sizeof(NETIF_DEVICE)); |
| |
|
|
| |
|
|
| ptr_ppp_device->pvt_data = (void *)p; |
|
ptr_ppp_device->pvt_data = (void *)p; |
| p->ptr_ppp_device = ptr_ppp_device; |
|
p->ptr_ppp_device = ptr_ppp_device; |
| |
|
|
| |
|
|
| strcpy (ptr_ppp_device->name, "ppp0"); |
|
strcpy (ptr_ppp_device->name, "ppp0"); |
| ptr_ppp_device->mtu = mru; |
|
ptr_ppp_device->mtu = mru; |
| |
|
|
| |
|
|
| ptr_ppp_device->flags = ptr_ppp_device->flags | NIMU_DEVICE_NO_ARP; |
|
ptr_ppp_device->flags = ptr_ppp_device->flags | NIMU_DEVICE_NO_ARP; |
| |
|
|
| |
|
|
| ptr_ppp_device->start = PPPStart; |
|
ptr_ppp_device->start = PPPStart; |
| ptr_ppp_device->stop = PPPStop; |
|
ptr_ppp_device->stop = PPPStop; |
| ptr_ppp_device->poll = NULL; |
|
ptr_ppp_device->poll = NULL; |
| ptr_ppp_device->send = PPPSend; |
|
ptr_ppp_device->send = PPPSend; |
| ptr_ppp_device->pkt_service = NULL; |
|
ptr_ppp_device->pkt_service = NULL; |
| ptr_ppp_device->ioctl = NULL; |
|
ptr_ppp_device->ioctl = NULL; |
| ptr_ppp_device->add_header = NULL; |
|
ptr_ppp_device->add_header = NULL; |
| |
|
|
| |
|
|
| if (NIMURegister (ptr_ppp_device) < 0) |
|
if (NIMURegister (ptr_ppp_device) < 0) |
| { |
|
{ |
| DbgPrintf(DBG_INFO, "pppNew: Error: Unable to register the PPP Device\n"); |
|
DbgPrintf(DBG_INFO, "pppNew: Error: Unable to register the PPP Device\n"); |
| return 0; |
|
return 0; |
| } |
|
} |
| |
|
|
| |
|
|
|
|
|
| p->llIndex = ptr_ppp_device->index; |
|
p->llIndex = ptr_ppp_device->index; |
| |
|
|
| |
|
|
| if( p->Flags & PPPFLG_SERVER ) |
|
if( p->Flags & PPPFLG_SERVER ) |
| { |
|
{ |
| |
|
|
| p->IPClient = IPClient; |
|
p->IPClient = IPClient; |
| p->IPServer = IPServer; |
|
p->IPServer = IPServer; |
| p->IPMask = IPMask; |
|
p->IPMask = IPMask; |
| |
|
|
| |
|
|
| if( p->Flags & PPPFLG_OPT_USE_MSE ) |
|
if( p->Flags & PPPFLG_OPT_USE_MSE ) |
| { |
|
{ |
| if( p->Flags & PPPFLG_OPT_LOCALDNS ) |
|
if( p->Flags & PPPFLG_OPT_LOCALDNS ) |
| { |
|
{ |
| |
|
|
| p->IPDNS1 = IPServer; |
|
p->IPDNS1 = IPServer; |
| p->IPDNS2 = 0x0; |
|
p->IPDNS2 = 0x0; |
| } |
|
} |
| else |
|
else |
| { |
|
{ |
| |
|
|
| llExit(); |
|
llExit(); |
| CfgGetImmediate( 0, CFGTAG_SYSINFO, |
|
CfgGetImmediate( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_DOMAINNAMESERVER, 1, |
|
CFGITEM_DHCP_DOMAINNAMESERVER, 1, |
| sizeof(p->IPNBNS1), (unsigned char *)&p->IPDNS1); |
|
sizeof(p->IPNBNS1), (unsigned char *)&p->IPDNS1); |
| CfgGetImmediate( 0, CFGTAG_SYSINFO, |
|
CfgGetImmediate( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_DOMAINNAMESERVER, 2, |
|
CFGITEM_DHCP_DOMAINNAMESERVER, 2, |
| sizeof(p->IPNBNS2), (unsigned char *)&p->IPDNS2); |
|
sizeof(p->IPNBNS2), (unsigned char *)&p->IPDNS2); |
| llEnter(); |
|
llEnter(); |
| } |
|
} |
| |
|
|
| |
|
|
| llExit(); |
|
llExit(); |
| CfgGetImmediate( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_NBNS, 1, |
|
CfgGetImmediate( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_NBNS, 1, |
| sizeof(p->IPNBNS1), (unsigned char *)&p->IPNBNS1); |
|
sizeof(p->IPNBNS1), (unsigned char *)&p->IPNBNS1); |
| CfgGetImmediate( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_NBNS, 2, |
|
CfgGetImmediate( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_NBNS, 2, |
| sizeof(p->IPNBNS2), (unsigned char *)&p->IPNBNS2); |
|
sizeof(p->IPNBNS2), (unsigned char *)&p->IPNBNS2); |
| llEnter(); |
|
llEnter(); |
| } |
|
} |
| } |
|
} |
| else |
|
else |
| { |
|
{ |
| if( Username && strlen(Username) < sizeof(p->UserId) ) |
|
if( Username && strlen(Username) < sizeof(p->UserId) ) |
| strcpy( p->UserId, Username ); |
|
strcpy( p->UserId, Username ); |
| if( Password && strlen(Password) < sizeof(p->Password) ) |
|
if( Password && strlen(Password) < sizeof(p->Password) ) |
| strcpy( p->Password, Password ); |
|
strcpy( p->Password, Password ); |
| } |
|
} |
| |
|
|
| return( (void *)p ); |
|
return( (void *)p ); |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| void pppFree( void *hPPP ) |
|
void pppFree( void *hPPP ) |
| { |
|
{ |
| PPP_SESSION* p; |
|
PPP_SESSION* p; |
| |
|
|
| |
|
|
| p = (PPP_SESSION *)hPPP; |
|
p = (PPP_SESSION *)hPPP; |
| if( !p ) |
|
if( !p ) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"pppFree: Bad Handle %08x",p); |
|
DbgPrintf(DBG_ERROR,"pppFree: Bad Handle %08x",p); |
| return; |
|
return; |
| } |
|
} |
| else if( p->Type != HTYPE_PPP ) |
|
else if( p->Type != HTYPE_PPP ) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"pppFree: Error: Type (%d) != HTYPE_PPP", p->Type); |
|
DbgPrintf(DBG_ERROR,"pppFree: Error: Type (%d) != HTYPE_PPP", p->Type); |
| return; |
|
return; |
| } |
|
} |
| |
|
|
| |
|
|
| if( p->hRoute ) |
|
if( p->hRoute ) |
| { |
|
{ |
| RtRemove( p->hRoute, FLG_RTF_REPORT, RTC_NETUNREACH ); |
|
RtRemove( p->hRoute, FLG_RTF_REPORT, RTC_NETUNREACH ); |
| RtDeRef( p->hRoute ); |
|
RtDeRef( p->hRoute ); |
| } |
|
} |
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| if( p->hClient ) |
|
if( p->hClient ) |
| { |
|
{ |
| CfgRemoveEntry( 0, p->hClient ); |
|
CfgRemoveEntry( 0, p->hClient ); |
| } |
|
} |
| |
|
|
| |
|
|
| if ( p->hNet ) |
|
if ( p->hNet ) |
| { |
|
{ |
| llExit(); |
|
llExit(); |
| CfgRemoveEntry(0, p->hNet); |
|
CfgRemoveEntry(0, p->hNet); |
| llEnter(); |
|
llEnter(); |
| } |
|
} |
| |
|
|
| |
|
|
| if (NIMUUnregister(p->ptr_ppp_device) < 0) |
|
if (NIMUUnregister(p->ptr_ppp_device) < 0) |
| { |
|
{ |
| DbgPrintf(DBG_INFO, |
|
DbgPrintf(DBG_INFO, |
| "pppFree: Error: Unregistering PPP device %d failed\n", |
|
"pppFree: Error: Unregistering PPP device %d failed\n", |
| p->llIndex); |
|
p->llIndex); |
| } |
|
} |
| |
|
|
| |
|
|
| mmFree (p); |
|
mmFree (p); |
| |
|
|
| return; |
|
return; |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| void pppTimer( void *hPPP ) |
|
void pppTimer( void *hPPP ) |
| { |
|
{ |
| PPP_SESSION *p = (PPP_SESSION *)hPPP; |
|
PPP_SESSION *p = (PPP_SESSION *)hPPP; |
| |
-+ |
void *hHDLC; |
| |
= |
|
| if( !p || p->Type != HTYPE_PPP ) |
|
if( !p || p->Type != HTYPE_PPP ) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"pppTimer: Bad Handle %08x",p); |
|
DbgPrintf(DBG_ERROR,"pppTimer: Bad Handle %08x",p); |
| return; |
|
return; |
| } |
|
} |
| |
|
|
| |
|
|
| if( p->InUse < (INUSE_LOCKED-1) ) |
|
if( p->InUse < (INUSE_LOCKED-1) ) |
| { |
|
{ |
| p->InUse++; |
|
p->InUse++; |
| |
|
|
| |
-+ |
/* |
| |
|
* On disconnect, any of the following timer functions may actually |
| |
|
* free the PPP session (i.e. 'p'). If this happens, the HDLC instance's |
| |
|
* status will be set to disconnected. |
| |
|
*/ |
| |
|
hHDLC = p->hSI; |
| |
|
|
| lcpTimer( p ); |
= |
lcpTimer( p ); |
| |
-+ |
if (hdlcGetStatus(hHDLC) >= SI_CSTATUS_DISCONNECT) { |
| |
|
// lcpTimer has freed the PPP session! Further operations on 'p' |
| |
|
// are invalid |
| |
|
return; |
| |
|
} |
| |
|
|
| authTimer( p ); |
= |
authTimer( p ); |
| |
-+ |
if (hdlcGetStatus(hHDLC) >= SI_CSTATUS_DISCONNECT) { |
| |
|
// authTimer has freed the PPP session! Further operations on 'p' |
| |
|
// are invalid |
| |
|
return; |
| |
|
} |
| |
|
|
| ipcpTimer( p ); |
= |
ipcpTimer( p ); |
| |
-+ |
if (hdlcGetStatus(hHDLC) >= SI_CSTATUS_DISCONNECT) { |
| |
|
// ipcpTimer has freed the PPP session! Further operations on 'p' |
| |
|
// are invalid |
| |
|
return; |
| |
|
} |
| |
= |
|
| |
|
|
| if( p->InUse == INUSE_IDLE ) |
|
if( p->InUse == INUSE_IDLE ) |
| pppFree( p ); |
|
pppFree( p ); |
| else |
|
else |
| p->InUse--; |
|
p->InUse--; |
| } |
|
} |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| void pppInput( void *hPPP, PBM_Pkt *pPkt ) |
|
void pppInput( void *hPPP, PBM_Pkt *pPkt ) |
| { |
|
{ |
| PPP_SESSION *p = (PPP_SESSION *)hPPP; |
|
PPP_SESSION *p = (PPP_SESSION *)hPPP; |
| uint16_t type; |
|
uint16_t type; |
| unsigned char *pb; |
|
unsigned char *pb; |
| |
|
|
| if( !p || p->Type != HTYPE_PPP ) |
|
if( !p || p->Type != HTYPE_PPP ) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"pppInput: Bad Handle %08x",p); |
|
DbgPrintf(DBG_ERROR,"pppInput: Bad Handle %08x",p); |
| PBM_free( pPkt ); |
|
PBM_free( pPkt ); |
| return; |
|
return; |
| } |
|
} |
| |
|
|
| if( !pPkt || pPkt->ValidLen < 2 ) |
|
if( !pPkt || pPkt->ValidLen < 2 ) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"pppInput: Bad packet!"); |
|
DbgPrintf(DBG_ERROR,"pppInput: Bad packet!"); |
| return; |
|
return; |
| } |
|
} |
| |
|
|
| |
|
|
| if( p->InUse < (INUSE_LOCKED-1) ) |
|
if( p->InUse < (INUSE_LOCKED-1) ) |
| { |
|
{ |
| p->InUse++; |
|
p->InUse++; |
| |
|
|
| |
|
|
| pb = pPkt->pDataBuffer + pPkt->DataOffset; |
|
pb = pPkt->pDataBuffer + pPkt->DataOffset; |
| |
|
|
| |
|
|
| pPkt->DataOffset += 2; |
|
pPkt->DataOffset += 2; |
| pPkt->ValidLen -= 2; |
|
pPkt->ValidLen -= 2; |
| |
|
|
| type = RdNet16s(pb); |
|
type = RdNet16s(pb); |
| |
|
|
| switch( type ) |
|
switch( type ) |
| { |
|
{ |
| case PPPPROT_IP: |
|
case PPPPROT_IP: |
| |
|
|
| if( p->hNet || p->hRoute ) |
|
if( p->hNet || p->hRoute ) |
| { |
|
{ |
| |
|
|
| pPkt->hIFRx = p->ptr_ppp_device; |
|
pPkt->hIFRx = p->ptr_ppp_device; |
| pPkt->EtherType = 0x800; |
|
pPkt->EtherType = 0x800; |
| |
|
|
| |
|
|
| IPRxPacket( pPkt ); |
|
IPRxPacket( pPkt ); |
| break; |
|
break; |
| } |
|
} |
| PBM_free( pPkt ); |
|
PBM_free( pPkt ); |
| break; |
|
break; |
| |
|
|
| case PPPPROT_LCP: |
|
case PPPPROT_LCP: |
| lcpInput( p, pPkt ); |
|
lcpInput( p, pPkt ); |
| break; |
|
break; |
| |
|
|
| case PPPPROT_PAP: |
|
case PPPPROT_PAP: |
| papInput( p, pPkt ); |
|
papInput( p, pPkt ); |
| break; |
|
break; |
| |
|
|
| case PPPPROT_CHAP: |
|
case PPPPROT_CHAP: |
| chapInput( p, pPkt ); |
|
chapInput( p, pPkt ); |
| break; |
|
break; |
| |
|
|
| case PPPPROT_IPCP: |
|
case PPPPROT_IPCP: |
| ipcpInput( p, pPkt ); |
|
ipcpInput( p, pPkt ); |
| break; |
|
break; |
| |
|
|
| default: |
|
default: |
| |
|
|
| pPkt->DataOffset -= 2; |
|
pPkt->DataOffset -= 2; |
| pPkt->ValidLen += 2; |
|
pPkt->ValidLen += 2; |
| lcpReject( p, pPkt ); |
|
lcpReject( p, pPkt ); |
| break; |
|
break; |
| } |
|
} |
| |
|
|
| |
|
|
| if( p->InUse == INUSE_IDLE ) |
|
if( p->InUse == INUSE_IDLE ) |
| pppFree( p ); |
|
pppFree( p ); |
| else |
|
else |
| p->InUse--; |
|
p->InUse--; |
| } |
|
} |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| static void *pppAddIP( uint32_t Index, uint32_t NetType, uint32_t IPAddr, |
|
static void *pppAddIP( uint32_t Index, uint32_t NetType, uint32_t IPAddr, |
| uint32_t IPMask ) |
|
uint32_t IPMask ) |
| { |
|
{ |
| CI_IPNET NA; |
|
CI_IPNET NA; |
| int rc; |
|
int rc; |
| void *hNet; |
|
void *hNet; |
| |
|
|
| |
|
|
| mmZeroInit( &NA, sizeof(NA) ); |
|
mmZeroInit( &NA, sizeof(NA) ); |
| NA.NetType = NetType; |
|
NA.NetType = NetType; |
| NA.IPAddr = IPAddr; |
|
NA.IPAddr = IPAddr; |
| NA.IPMask = IPMask; |
|
NA.IPMask = IPMask; |
| NDK_sprintf( NA.Domain, "localppp%d.net", Index ); |
|
NDK_sprintf( NA.Domain, "localppp%d.net", Index ); |
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| llExit(); |
|
llExit(); |
| rc = CfgAddEntry( 0, CFGTAG_IPNET, Index, |
|
rc = CfgAddEntry( 0, CFGTAG_IPNET, Index, |
| CFG_ADDMODE_NOSAVE | CFG_ADDMODE_UNIQUE, sizeof(CI_IPNET), |
|
CFG_ADDMODE_NOSAVE | CFG_ADDMODE_UNIQUE, sizeof(CI_IPNET), |
| (unsigned char *)&NA, &hNet ); |
|
(unsigned char *)&NA, &hNet ); |
| if( rc < 0 ) |
|
if( rc < 0 ) |
| { |
|
{ |
| |
|
|
| if( rc <= CFGERROR_SERVICE ) |
|
if( rc <= CFGERROR_SERVICE ) |
| CfgRemoveEntry( 0, hNet ); |
|
CfgRemoveEntry( 0, hNet ); |
| hNet = 0; |
|
hNet = 0; |
| } |
|
} |
| llEnter(); |
|
llEnter(); |
| |
|
|
| return(hNet); |
|
return(hNet); |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| static void *pppAddClient( uint32_t Index, uint32_t IPAddr, char *Name ) |
|
static void *pppAddClient( uint32_t Index, uint32_t IPAddr, char *Name ) |
| { |
|
{ |
| CI_CLIENT CC; |
|
CI_CLIENT CC; |
| int rc; |
|
int rc; |
| void *hClient; |
|
void *hClient; |
| |
|
|
| |
|
|
| mmZeroInit( &CC, sizeof(CC) ); |
|
mmZeroInit( &CC, sizeof(CC) ); |
| |
|
|
| CC.ClientType = CFG_CLIENTTYPE_DYNAMIC; |
|
CC.ClientType = CFG_CLIENTTYPE_DYNAMIC; |
| CC.IPAddr = IPAddr; |
|
CC.IPAddr = IPAddr; |
| CC.Status = CFG_CLIENTSTATUS_STATIC; |
|
CC.Status = CFG_CLIENTSTATUS_STATIC; |
| |
|
|
| if (strlen(Name) < CFG_HOSTNAME_MAX) { |
|
if (strlen(Name) < CFG_HOSTNAME_MAX) { |
| strcpy( CC.Hostname, Name ); |
|
strcpy( CC.Hostname, Name ); |
| } |
|
} |
| else { |
|
else { |
| return (0); |
|
return (0); |
| } |
|
} |
| |
|
|
| |
|
|
| llExit(); |
|
llExit(); |
| rc = CfgAddEntry( 0, CFGTAG_CLIENT, Index, CFG_ADDMODE_NOSAVE, |
|
rc = CfgAddEntry( 0, CFGTAG_CLIENT, Index, CFG_ADDMODE_NOSAVE, |
| sizeof(CI_CLIENT), (unsigned char *)&CC, &hClient ); |
|
sizeof(CI_CLIENT), (unsigned char *)&CC, &hClient ); |
| if( rc < 0 ) |
|
if( rc < 0 ) |
| { |
|
{ |
| |
|
|
| if( rc <= CFGERROR_SERVICE ) |
|
if( rc <= CFGERROR_SERVICE ) |
| CfgRemoveEntry( 0, hClient ); |
|
CfgRemoveEntry( 0, hClient ); |
| hClient = 0; |
|
hClient = 0; |
| } |
|
} |
| llEnter(); |
|
llEnter(); |
| |
|
|
| return(hClient); |
|
return(hClient); |
| } |
|
} |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| void pppEvent( void *hPPP, uint32_t Event ) |
|
void pppEvent( void *hPPP, uint32_t Event ) |
| { |
|
{ |
| PPP_SESSION *p = (PPP_SESSION *)hPPP; |
|
PPP_SESSION *p = (PPP_SESSION *)hPPP; |
| NETIF_DEVICE* ptr_ppp_device; |
|
NETIF_DEVICE* ptr_ppp_device; |
| |
|
|
| switch( Event ) |
|
switch( Event ) |
| { |
|
{ |
| case PPP_EVENT_LCP_CONNECT: |
|
case PPP_EVENT_LCP_CONNECT: |
| if( p->auth.Protocol ) |
|
if( p->auth.Protocol ) |
| { |
|
{ |
| authStart( p ); |
|
authStart( p ); |
| p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_AUTHORIZE, 0); |
|
p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_AUTHORIZE, 0); |
| break; |
|
break; |
| } |
|
} |
| |
|
|
| |
|
|
| |
|
|
| case PPP_EVENT_AUTH_CONNECT: |
|
case PPP_EVENT_AUTH_CONNECT: |
| ipcpStart( p ); |
|
ipcpStart( p ); |
| p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_CONFIGURE, 0); |
|
p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_CONFIGURE, 0); |
| break; |
|
break; |
| |
|
|
| case PPP_EVENT_IPCP_CONNECT: |
|
case PPP_EVENT_IPCP_CONNECT: |
| |
|
|
| if( p->ProtMTU > p->MTU_Tx ) |
|
if( p->ProtMTU > p->MTU_Tx ) |
| p->ProtMTU = p->MTU_Tx; |
|
p->ProtMTU = p->MTU_Tx; |
| if( p->ProtMTU > p->MTU_Rx ) |
|
if( p->ProtMTU > p->MTU_Rx ) |
| p->ProtMTU = p->MTU_Rx; |
|
p->ProtMTU = p->MTU_Rx; |
| |
|
|
| |
|
|
| ptr_ppp_device = NIMUFindByIndex (p->llIndex); |
|
ptr_ppp_device = NIMUFindByIndex (p->llIndex); |
| if (ptr_ppp_device == NULL) |
|
if (ptr_ppp_device == NULL) |
| { |
|
{ |
| DbgPrintf(DBG_ERROR,"pppEvent: NIMU Object for PPP %d does not exist", p->llIndex); |
|
DbgPrintf(DBG_ERROR,"pppEvent: NIMU Object for PPP %d does not exist", p->llIndex); |
| return; |
|
return; |
| } |
|
} |
| |
|
|
| if( p->Flags & PPPFLG_SERVER ) |
|
if( p->Flags & PPPFLG_SERVER ) |
| { |
|
{ |
| |
|
|
| |
|
|
| |
|
|
| if( p->Flags & PPPFLG_OPT_LOCALDNS ) |
|
if( p->Flags & PPPFLG_OPT_LOCALDNS ) |
| { |
|
{ |
| p->hNet = pppAddIP( p->llIndex, |
|
p->hNet = pppAddIP( p->llIndex, |
| CFG_NETTYPE_DYNAMIC | CFG_NETTYPE_VIRTUAL, |
|
CFG_NETTYPE_DYNAMIC | CFG_NETTYPE_VIRTUAL, |
| p->IPServer, p->IPMask ); |
|
p->IPServer, p->IPMask ); |
| p->hClient = pppAddClient(p->llIndex, p->IPClient, p->UserId); |
|
p->hClient = pppAddClient(p->llIndex, p->IPClient, p->UserId); |
| } |
|
} |
| else |
|
else |
| p->hNet = pppAddIP( p->llIndex, CFG_NETTYPE_DYNAMIC, |
|
p->hNet = pppAddIP( p->llIndex, CFG_NETTYPE_DYNAMIC, |
| p->IPServer, p->IPMask ); |
|
p->IPServer, p->IPMask ); |
| |
|
|
| |
|
|
| |
|
|
| p->hRoute = RtCreate( FLG_RTF_REPORT, FLG_RTE_PROXY | FLG_RTE_HOST, |
|
p->hRoute = RtCreate( FLG_RTF_REPORT, FLG_RTE_PROXY | FLG_RTE_HOST, |
| p->IPClient, 0xffffffff, (void *)ptr_ppp_device, 0, 0 ); |
|
p->IPClient, 0xffffffff, (void *)ptr_ppp_device, 0, 0 ); |
| } |
|
} |
| else |
|
else |
| { |
|
{ |
| |
|
|
| |
|
|
| |
|
|
| p->hNet = pppAddIP( p->llIndex, CFG_NETTYPE_DYNAMIC, |
|
p->hNet = pppAddIP( p->llIndex, CFG_NETTYPE_DYNAMIC, |
| p->IPClient, 0xffffffff ); |
|
p->IPClient, 0xffffffff ); |
| |
|
|
| |
|
|
| if( p->Flags & PPPFLG_OPT_CLIENT_P2P ) |
|
if( p->Flags & PPPFLG_OPT_CLIENT_P2P ) |
| p->hRoute = RtCreate( FLG_RTF_REPORT, FLG_RTE_PROXY | FLG_RTE_HOST, |
|
p->hRoute = RtCreate( FLG_RTF_REPORT, FLG_RTE_PROXY | FLG_RTE_HOST, |
| p->IPServer, 0xffffffff, (void *)ptr_ppp_device, 0, 0 ); |
|
p->IPServer, 0xffffffff, (void *)ptr_ppp_device, 0, 0 ); |
| |
|
|
| else |
|
else |
| p->hRoute = RtCreate( FLG_RTF_REPORT, 0, 0, 0, (void *)ptr_ppp_device, 0, 0 ); |
|
p->hRoute = RtCreate( FLG_RTF_REPORT, 0, 0, 0, (void *)ptr_ppp_device, 0, 0 ); |
| |
|
|
| |
|
|
| if( p->Flags & PPPFLG_OPT_USE_MSE ) |
|
if( p->Flags & PPPFLG_OPT_USE_MSE ) |
| { |
|
{ |
| void *hEntry; |
|
void *hEntry; |
| |
|
|
| llExit(); |
|
llExit(); |
| |
|
|
| |
|
|
| while( CfgGetEntry( 0, CFGTAG_SYSINFO, |
|
while( CfgGetEntry( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_DOMAINNAMESERVER, 1, &hEntry ) ) |
|
CFGITEM_DHCP_DOMAINNAMESERVER, 1, &hEntry ) ) |
| CfgRemoveEntry( 0, hEntry ); |
|
CfgRemoveEntry( 0, hEntry ); |
| |
|
|
| |
|
|
| while( CfgGetEntry( 0, CFGTAG_SYSINFO, |
|
while( CfgGetEntry( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_NBNS, 1, &hEntry ) ) |
|
CFGITEM_DHCP_NBNS, 1, &hEntry ) ) |
| CfgRemoveEntry( 0, hEntry ); |
|
CfgRemoveEntry( 0, hEntry ); |
| |
|
|
| |
|
|
| if( p->IPDNS1 ) |
|
if( p->IPDNS1 ) |
| CfgAddEntry( 0, CFGTAG_SYSINFO, |
|
CfgAddEntry( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_DOMAINNAMESERVER, |
|
CFGITEM_DHCP_DOMAINNAMESERVER, |
| CFG_ADDMODE_NOSAVE, |
|
CFG_ADDMODE_NOSAVE, |
| 4, (unsigned char *)&p->IPDNS1, 0 ); |
|
4, (unsigned char *)&p->IPDNS1, 0 ); |
| |
|
|
| if( p->IPDNS2 ) |
|
if( p->IPDNS2 ) |
| CfgAddEntry( 0, CFGTAG_SYSINFO, |
|
CfgAddEntry( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_DOMAINNAMESERVER, |
|
CFGITEM_DHCP_DOMAINNAMESERVER, |
| CFG_ADDMODE_NOSAVE, |
|
CFG_ADDMODE_NOSAVE, |
| 4, (unsigned char *)&p->IPDNS2, 0 ); |
|
4, (unsigned char *)&p->IPDNS2, 0 ); |
| |
|
|
| if( p->IPNBNS1 ) |
|
if( p->IPNBNS1 ) |
| CfgAddEntry( 0, CFGTAG_SYSINFO, |
|
CfgAddEntry( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_NBNS, |
|
CFGITEM_DHCP_NBNS, |
| CFG_ADDMODE_NOSAVE, |
|
CFG_ADDMODE_NOSAVE, |
| 4, (unsigned char *)&p->IPNBNS1, 0 ); |
|
4, (unsigned char *)&p->IPNBNS1, 0 ); |
| |
|
|
| if( p->IPNBNS2 ) |
|
if( p->IPNBNS2 ) |
| CfgAddEntry( 0, CFGTAG_SYSINFO, |
|
CfgAddEntry( 0, CFGTAG_SYSINFO, |
| CFGITEM_DHCP_NBNS, |
|
CFGITEM_DHCP_NBNS, |
| CFG_ADDMODE_NOSAVE, |
|
CFG_ADDMODE_NOSAVE, |
| 4, (unsigned char *)&p->IPNBNS2, 0 ); |
|
4, (unsigned char *)&p->IPNBNS2, 0 ); |
| |
|
|
| llEnter(); |
|
llEnter(); |
| } |
|
} |
| } |
|
} |
| p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_CONNECTED, 0); |
|
p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_CONNECTED, 0); |
| break; |
|
break; |
| |
|
|
| case PPP_EVENT_LCP_STOPPED: |
|
case PPP_EVENT_LCP_STOPPED: |
| p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_DISCONNECT_LCP, 0); |
|
p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_DISCONNECT_LCP, 0); |
| break; |
|
break; |
| |
|
|
| case PPP_EVENT_AUTH_STOPPED: |
|
case PPP_EVENT_AUTH_STOPPED: |
| p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_DISCONNECT_AUTH, 0); |
|
p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_DISCONNECT_AUTH, 0); |
| break; |
|
break; |
| |
|
|
| case PPP_EVENT_IPCP_STOPPED: |
|
case PPP_EVENT_IPCP_STOPPED: |
| p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_DISCONNECT_IPCP, 0); |
|
p->SICtrl( p->hSI, SI_MSG_CALLSTATUS, SI_CSTATUS_DISCONNECT_IPCP, 0); |
| break; |
|
break; |
| } |
|
} |
| } |
|
} |
| |
|
|
| #endif |
|
#endif |
| |
|
|