19 #include <lwip/memp.h>
23 #include "lwip/tcpip.h"
24 #include "lwip/netif.h"
25 #include "lwip/dhcp.h"
26 #include "lwip/prot/dhcp.h"
27 #include "lwip/inet.h"
28 #include "netif/etharp.h"
30 #include "ps2ip_internal.h"
36 static struct netif NIF;
37 static struct pbuf *TxHead, *TxTail;
39 int ps2ip_getconfig(
char* pszName,
t_ip_info* pInfo)
46 memset(pInfo,0,
sizeof(*pInfo));
49 strcpy(pInfo->netif_name,pszName);
50 pInfo->ipaddr.s_addr=pNetIF->
ip_addr.addr;
51 pInfo->netmask.s_addr=pNetIF->netmask.addr;
52 pInfo->gw.s_addr=pNetIF->gw.addr;
54 memcpy(pInfo->hw_addr,pNetIF->
hwaddr,
sizeof(pInfo->hw_addr));
57 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
59 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
61 pInfo->dhcp_enabled=1;
62 pInfo->dhcp_status=dhcp->state;
66 pInfo->dhcp_enabled=0;
67 pInfo->dhcp_status=DHCP_STATE_OFF;
71 pInfo->dhcp_enabled=0;
77 int ps2ip_setconfig(
const t_ip_info* pInfo)
87 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
91 if (pInfo->dhcp_enabled)
93 if ((dhcp == NULL) || (dhcp->state == DHCP_STATE_OFF))
96 netif_set_ipaddr(pNetIF,(
IPAddr*)&pInfo->ipaddr);
97 netif_set_netmask(pNetIF,(
IPAddr*)&pInfo->netmask);
98 netif_set_gw(pNetIF,(
IPAddr*)&pInfo->gw);
106 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
109 dhcp_release(pNetIF);
115 netif_set_ipaddr(pNetIF,(
IPAddr*)&pInfo->ipaddr);
116 netif_set_netmask(pNetIF,(
IPAddr*)&pInfo->netmask);
117 netif_set_gw(pNetIF,(
IPAddr*)&pInfo->gw);
121 netif_set_ipaddr(pNetIF,(
IPAddr*)&pInfo->ipaddr);
122 netif_set_netmask(pNetIF,(
IPAddr*)&pInfo->netmask);
123 netif_set_gw(pNetIF,(
IPAddr*)&pInfo->gw);
129 static void EnQTxPacket(
struct pbuf *tx)
145 static err_t SMapLowLevelOutput(
struct netif* pNetIF,
struct pbuf* pOutput)
157 if((
pbuf = pbuf_coalesce(pOutput,
PBUF_RAW)) != pOutput)
165 EnQTxPacket(pOutput);
172 static void LinkStateUp(
void)
174 tcpip_callback((
void*)&netif_set_link_up, &NIF);
177 static void LinkStateDown(
void)
179 tcpip_callback((
void*)&netif_set_link_down, &NIF);
182 static void *AllocRxPacket(
unsigned int size,
void **
payload)
192 static void ReallocRxPacket(
void *packet,
unsigned int size)
194 pbuf_realloc((
struct pbuf *)packet, size);
197 static void FreeRxPacket(
void *packet)
202 static void EnQRxPacket(
void *packet)
204 ps2ip_input(packet, &NIF);
207 static int NextTxPacket(
void **
payload)
221 static void DeQTxPacket(
void)
232 if(TxTail == TxHead) {
237 TxTail = TxTail->
next;
249 static int AfterTxPacket(
void **
payload)
253 if(TxTail != NULL && TxTail->
next != NULL)
263 static void InitDone(
void* pvArg)
265 dbgprintf(
"InitDone: TCPIP initialized\n");
266 sys_sem_signal((sys_sem_t*)pvArg);
277 pNetIF->
output=ðarp_output;
285 dbgprintf(
"MAC address : %02d:%02d:%02d:%02d:%02d:%02d\n",pNetIF->
hwaddr[0],pNetIF->
hwaddr[1],pNetIF->
hwaddr[2],
291 err_t ps2ip_input(
PBuf* pInput,
NetIF* pNetIF)
295 if((result = pNetIF->
input(pInput, pNetIF)) != ERR_OK)
301 static inline void InitializeLWIP(
void)
305 dbgprintf(
"PS2IP: Module Loaded.\n");
307 sys_sem_new(&Sema, 0);
308 dbgprintf(
"PS2IP: Calling tcpip_init\n");
309 tcpip_init(InitDone,&Sema);
311 sys_arch_sem_wait(&Sema, 0);
314 dbgprintf(
"PS2IP: System Initialised\n");
318 extern void _ps2sdk_ps2ipee_init(
void);
319 extern void _ps2sdk_ps2ipee_deinit(
void);
338 netif_add(&NIF, ip_address, subnet_mask, gateway, NULL, &
SMapIFInit, tcpip_input);
339 netif_set_default(&NIF);
341 NetManRegisterNetworkStack(&stack);
344 _ps2sdk_ps2ipee_init();
349 void ps2ipDeinit(
void){
350 _ps2sdk_ps2ipee_deinit();
352 NetManUnregisterNetworkStack();