29#include "lwip/tcpip.h"
30#include "lwip/prot/dhcp.h"
31#include "lwip/netif.h"
34#include "netif/etharp.h"
36#include "ps2ip_internal.h"
42static struct pbuf *TxHead, *TxTail;
44#define MODNAME "TCP/IP Stack"
50static int iTimerARP=0;
52#if defined(PS2IP_DHCP)
53static int iTimerDHCP=0;
58ps2ip_getconfig(
char* pszName,
t_ip_info* pInfo)
67 memset(pInfo,0,
sizeof(*pInfo));
70 strcpy(pInfo->netif_name,pszName);
71 pInfo->ipaddr.s_addr=pNetIF->
ip_addr.addr;
72 pInfo->netmask.s_addr=pNetIF->netmask.addr;
73 pInfo->gw.s_addr=pNetIF->gw.addr;
75 memcpy(pInfo->hw_addr,pNetIF->
hwaddr,
sizeof(pInfo->hw_addr));
78 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
80 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
82 pInfo->dhcp_enabled=1;
83 pInfo->dhcp_status=dhcp->state;
87 pInfo->dhcp_enabled=0;
88 pInfo->dhcp_status=DHCP_STATE_OFF;
93 pInfo->dhcp_enabled=0;
112 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
116 if (pInfo->dhcp_enabled)
118 if ((dhcp == NULL) || (dhcp->state == DHCP_STATE_OFF))
121 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
122 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
123 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
131 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
134 dhcp_release(pNetIF);
140 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
141 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
142 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
145 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
146 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
147 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
153static void InitDone(
void* pvArg)
155 dbgprintf(
"InitDone: TCPIP initialized\n");
156 sys_sem_signal((sys_sem_t*)pvArg);
160static void TimerThread(
void* pvArg)
168 iTimerARP+=TCP_TMR_INTERVAL;
169 if (iTimerARP>=ARP_TMR_INTERVAL)
171 iTimerARP-=ARP_TMR_INTERVAL;
175#if defined(PS2IP_DHCP)
179 iTimerDHCP+=TCP_TMR_INTERVAL;
180 if ((iTimerDHCP-TCP_TMR_INTERVAL)/DHCP_FINE_TIMER_MSECS!=iTimerDHCP/DHCP_FINE_TIMER_MSECS)
185 if (iTimerDHCP>=DHCP_COARSE_TIMER_SECS*1000)
187 iTimerDHCP-=DHCP_COARSE_TIMER_SECS*1000;
192 DelayThread(TCP_TMR_INTERVAL*250);
196static inline void InitTimer(
void)
198 iop_thread_t Thread={TH_C, (u32)
"PS2IP-timer", TimerThread, 0x300, 0x16};
199 int iTimerThreadID=CreateThread(&Thread);
201 if (iTimerThreadID<0)
203 printf(
"InitTimer: Fatal error - Failed to create tcpip timer-thread!\n");
207 StartThread(iTimerThreadID, NULL);
216 if((result = pNetIF->
input(pInput, pNetIF)) != ERR_OK)
222int _exit(
int argc,
char *argv[])
227 return MODULE_NO_RESIDENT_END;
230static struct netif NIF;
232static void LinkStateUp(
void){
236static void LinkStateDown(
void){
240static void *AllocRxPacket(
unsigned int size,
void **payload)
252static void FreeRxPacket(
void *packet)
257static void EnQRxPacket(
void *packet)
259 ps2ip_input(packet, &NIF);
262static int NextTxPacket(
void **
payload)
276static void DeQTxPacket(
void)
288 if(TxTail == TxHead) {
293 TxTail = TxTail->
next;
305static void EnQTxPacket(
struct pbuf *tx)
324SMapLowLevelOutput(
struct netif *pNetIF,
struct pbuf* pOutput)
336 if((
pbuf = pbuf_coalesce(pOutput,
PBUF_RAW)) != pOutput)
344 EnQTxPacket(pOutput);
356#ifdef PRE_LWIP_130_COMPAT
360 struct pbuf *pBuf=etharp_output(pNetIF,pIPAddr,pOutput);
362 return pBuf!=NULL ? SMapLowLevelOutput(pNetIF, pBuf):ERR_OK;
374#ifdef PRE_LWIP_130_COMPAT
375 pNetIF->
output=&SMapOutput;
377 pNetIF->
output=ðarp_output;
381#ifdef PRE_LWIP_130_COMPAT
396static inline int InitializeLWIP(
void){
400 dbgprintf(
"PS2IP: Module Loaded.\n");
402 if ((result = RegisterLibraryEntries(&_exp_ps2ip))!=0)
404 printf(
"PS2IP: RegisterLibraryEntries returned: %d\n", result);
406 sys_sem_new(&Sema, 0);
407 dbgprintf(
"PS2IP: Calling tcpip_init\n");
408 tcpip_init(InitDone,&Sema);
410 sys_arch_sem_wait(&Sema, 0);
413 dbgprintf(
"PS2IP: tcpip_init called\n");
418 dbgprintf(
"PS2IP: System Initialised\n");
440 if((result = InitializeLWIP()) != 0)
443 netif_add(&NIF, IP, NM, GW, NULL, &
SMapIFInit, tcpip_input);
444 netif_set_default(&NIF);
446 NetManRegisterNetworkStack(&stack);
452int _start(
int argc,
char *argv[]){
458 dbgprintf(
"SMAP: %s %s %s\n", argv[1],argv[2],argv[3]);
459 IP.addr=inet_addr(argv[1]);
460 NM.addr=inet_addr(argv[2]);
461 GW.addr=inet_addr(argv[3]);
471 return InitLWIPStack(&IP, &NM, &GW)==0?MODULE_RESIDENT_END:MODULE_NO_RESIDENT_END;
struct netif * netif_find(const char *name)
static err_t SMapIFInit(struct netif *pNetIF)
#define NETIF_FLAG_LINK_UP
#define NETIF_FLAG_ETHARP
#define NETIF_FLAG_BROADCAST
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
#define tcpip_callback(f, ctx)
@ NETMAN_NETIF_IOCTL_ETH_GET_MAC
#define IP4_ADDR(ipaddr, a, b, c, d)
#define NETIF_MAX_HWADDR_LEN
u8 hwaddr[NETIF_MAX_HWADDR_LEN]
netif_linkoutput_fn linkoutput