36#include "ps2ip_internal.h"
45typedef struct pbuf PBuf;
46typedef struct netif NetIF;
49static struct pbuf *TxHead, *TxTail;
51#define MODNAME "TCP/IP Stack"
57static int iTimerARP=0;
59#if defined(PS2IP_DHCP)
60static int iTimerDHCP=0;
65ps2ip_getconfig(
char* pszName,
t_ip_info* pInfo)
74 memset(pInfo,0,
sizeof(*pInfo));
77 strcpy(pInfo->netif_name,pszName);
78 pInfo->ipaddr.s_addr=pNetIF->
ip_addr.addr;
79 pInfo->netmask.s_addr=pNetIF->netmask.addr;
80 pInfo->gw.s_addr=pNetIF->gw.addr;
82 memcpy(pInfo->hw_addr,pNetIF->
hwaddr,
sizeof(pInfo->hw_addr));
85 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
87 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
89 pInfo->dhcp_enabled=1;
90 pInfo->dhcp_status=dhcp->state;
94 pInfo->dhcp_enabled=0;
95 pInfo->dhcp_status=DHCP_STATE_OFF;
100 pInfo->dhcp_enabled=0;
119 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
123 if (pInfo->dhcp_enabled)
125 if ((dhcp == NULL) || (dhcp->state == DHCP_STATE_OFF))
128 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
129 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
130 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
138 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
141 dhcp_release(pNetIF);
147 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
148 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
149 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
152 netif_set_ipaddr(pNetIF,(
const IPAddr*)&pInfo->ipaddr);
153 netif_set_netmask(pNetIF,(
const IPAddr*)&pInfo->netmask);
154 netif_set_gw(pNetIF,(
const IPAddr*)&pInfo->gw);
160static void InitDone(
void* pvArg)
162 dbgprintf(
"InitDone: TCPIP initialized\n");
167static void TimerThread(
void* pvArg)
175 iTimerARP+=TCP_TMR_INTERVAL;
176 if (iTimerARP>=ARP_TMR_INTERVAL)
178 iTimerARP-=ARP_TMR_INTERVAL;
182#if defined(PS2IP_DHCP)
186 iTimerDHCP+=TCP_TMR_INTERVAL;
187 if ((iTimerDHCP-TCP_TMR_INTERVAL)/DHCP_FINE_TIMER_MSECS!=iTimerDHCP/DHCP_FINE_TIMER_MSECS)
192 if (iTimerDHCP>=DHCP_COARSE_TIMER_SECS*1000)
194 iTimerDHCP-=DHCP_COARSE_TIMER_SECS*1000;
199 DelayThread(TCP_TMR_INTERVAL*250);
203static inline void InitTimer(
void)
205 iop_thread_t Thread={TH_C, (u32)
"PS2IP-timer", TimerThread, 0x300, 0x16};
206 int iTimerThreadID=CreateThread(&Thread);
208 if (iTimerThreadID<0)
210 printf(
"InitTimer: Fatal error - Failed to create tcpip timer-thread!\n");
214 StartThread(iTimerThreadID, NULL);
219ps2ip_input(PBuf* pInput,NetIF* pNetIF)
223 if((result = pNetIF->
input(pInput, pNetIF)) !=
ERR_OK)
229int _exit(
int argc,
char *argv[])
234 return MODULE_NO_RESIDENT_END;
237static struct netif NIF;
239static void LinkStateUp(
void){
243static void LinkStateDown(
void){
247static void *AllocRxPacket(
unsigned int size,
void **payload)
259static void FreeRxPacket(
void *packet)
264static void EnQRxPacket(
void *packet)
266 ps2ip_input(packet, &NIF);
269static int NextTxPacket(
void **
payload)
283static void DeQTxPacket(
void)
295 if(TxTail == TxHead) {
300 TxTail = TxTail->
next;
312static void EnQTxPacket(
struct pbuf *tx)
331SMapLowLevelOutput(
struct netif *pNetIF,
struct pbuf* pOutput)
351 EnQTxPacket(pOutput);
359static err_t SMapIFInit(
struct netif* pNetIF)
366 pNetIF->
output=ðarp_output;
380static inline int InitializeLWIP(
void){
384 dbgprintf(
"PS2IP: Module Loaded.\n");
386 if ((result = RegisterLibraryEntries(&_exp_ps2ip))!=0)
388 printf(
"PS2IP: RegisterLibraryEntries returned: %d\n", result);
391 dbgprintf(
"PS2IP: Calling tcpip_init\n");
397 dbgprintf(
"PS2IP: tcpip_init called\n");
402 dbgprintf(
"PS2IP: System Initialised\n");
410static inline int InitLWIPStack(IPAddr *IP, IPAddr *NM, IPAddr *GW){
424 if((result = InitializeLWIP()) != 0)
430 NetManRegisterNetworkStack(&stack);
436int _start(
int argc,
char *argv[]){
442 dbgprintf(
"SMAP: %s %s %s\n", argv[1],argv[2],argv[3]);
443 IP.addr=inet_addr(argv[1]);
444 NM.addr=inet_addr(argv[2]);
445 GW.addr=inet_addr(argv[3]);
455 return InitLWIPStack(&IP, &NM, &GW)==0?MODULE_RESIDENT_END:MODULE_NO_RESIDENT_END;
#define IP4_ADDR(ipaddr, a, b, c, d)
#define NETIF_MAX_HWADDR_LEN
void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg)
err_t tcpip_callback(tcpip_callback_fn function, void *ctx)
err_t tcpip_input(struct pbuf *p, struct netif *inp)
#define NETIF_FLAG_ETHERNET
#define NETIF_FLAG_ETHARP
#define NETIF_FLAG_BROADCAST
void netif_set_link_down(struct netif *netif)
struct netif * netif_find(const char *name)
struct netif * netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
void netif_set_default(struct netif *netif)
void netif_set_link_up(struct netif *netif)
void netif_set_up(struct netif *netif)
struct pbuf * pbuf_coalesce(struct pbuf *p, pbuf_layer layer)
void pbuf_ref(struct pbuf *p)
u8 pbuf_free(struct pbuf *p)
void sys_sem_free(sys_sem_t *sem)
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
void sys_sem_signal(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
@ NETMAN_NETIF_IOCTL_ETH_GET_MAC
u8 hwaddr[NETIF_MAX_HWADDR_LEN]
netif_linkoutput_fn linkoutput