24 #include <lwip/memp.h>
28 #include "lwip/tcpip.h"
29 #include "lwip/prot/dhcp.h"
30 #include "lwip/netif.h"
31 #include "lwip/dhcp.h"
32 #include "lwip/inet.h"
33 #include "netif/etharp.h"
35 #include "ps2ip_internal.h"
48 #define MODNAME "TCP/IP Stack"
49 IRX_ID(MODNAME, 2, 3);
54 static int iTimerARP=0;
56 #if defined(PS2IP_DHCP)
57 static int iTimerDHCP=0;
58 #endif //defined(PS2IP_DHCP)
62 ps2ip_getconfig(
char* pszName,
t_ip_info* pInfo)
71 memset(pInfo,0,
sizeof(*pInfo));
74 strcpy(pInfo->netif_name,pszName);
75 pInfo->ipaddr.s_addr=pNetIF->
ip_addr.addr;
76 pInfo->netmask.s_addr=pNetIF->netmask.addr;
77 pInfo->gw.s_addr=pNetIF->gw.addr;
79 memcpy(pInfo->hw_addr,pNetIF->
hwaddr,
sizeof(pInfo->hw_addr));
82 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
84 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
86 pInfo->dhcp_enabled=1;
87 pInfo->dhcp_status=dhcp->state;
91 pInfo->dhcp_enabled=0;
92 pInfo->dhcp_status=DHCP_STATE_OFF;
97 pInfo->dhcp_enabled=0;
116 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
120 if (pInfo->dhcp_enabled)
122 if ((dhcp == NULL) || (dhcp->state == DHCP_STATE_OFF))
125 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
126 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
127 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
135 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
138 dhcp_release(pNetIF);
144 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
145 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
146 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
149 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
150 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
151 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
157 static void InitDone(
void* pvArg)
159 dbgprintf(
"InitDone: TCPIP initialized\n");
160 sys_sem_signal((sys_sem_t*)pvArg);
164 static void TimerThread(
void* pvArg)
172 iTimerARP+=TCP_TMR_INTERVAL;
173 if (iTimerARP>=ARP_TMR_INTERVAL)
175 iTimerARP-=ARP_TMR_INTERVAL;
179 #if defined(PS2IP_DHCP)
183 iTimerDHCP+=TCP_TMR_INTERVAL;
184 if ((iTimerDHCP-TCP_TMR_INTERVAL)/DHCP_FINE_TIMER_MSECS!=iTimerDHCP/DHCP_FINE_TIMER_MSECS)
189 if (iTimerDHCP>=DHCP_COARSE_TIMER_SECS*1000)
191 iTimerDHCP-=DHCP_COARSE_TIMER_SECS*1000;
196 DelayThread(TCP_TMR_INTERVAL*250);
200 static inline void InitTimer(
void)
202 iop_thread_t Thread={TH_C, (u32)
"PS2IP-timer", TimerThread, 0x300, 0x16};
203 int iTimerThreadID=CreateThread(&Thread);
205 if (iTimerThreadID<0)
207 printf(
"InitTimer: Fatal error - Failed to create tcpip timer-thread!\n");
211 StartThread(iTimerThreadID, NULL);
220 if((result = pNetIF->
input(pInput, pNetIF)) != ERR_OK)
226 int _exit(
int argc,
char *argv[])
231 return MODULE_NO_RESIDENT_END;
234 int _start(
int argc,
char *argv[]){
241 dbgprintf(
"PS2IP: Module Loaded.\n");
243 if ((result = RegisterLibraryEntries(&_exp_ps2ip)) != 0)
245 printf(
"PS2IP: RegisterLibraryEntries returned: %d\n", result);
246 return MODULE_NO_RESIDENT_END;
248 sys_sem_new(&Sema, 0);
249 dbgprintf(
"PS2IP: Calling tcpip_init\n");
250 tcpip_init(InitDone,&Sema);
252 sys_arch_sem_wait(&Sema, 0);
255 dbgprintf(
"PS2IP: tcpip_init called\n");
260 dbgprintf(
"PS2IP: System Initialised\n");
263 return MODULE_RESIDENT_END;