sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
ps2ip.c
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
15
16#include <stdio.h>
17#include <string.h>
18#include <netman.h>
19#include <lwip/memp.h>
20
21#include "lwip/sys.h"
22#include "lwip/tcp.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"
29
30#include "ps2ip_internal.h"
31
32typedef struct pbuf PBuf;
33typedef struct netif NetIF;
34typedef struct ip4_addr IPAddr;
35
36static struct netif NIF;
37static struct pbuf *TxHead, *TxTail;
38
39int ps2ip_getconfig(char* pszName, t_ip_info* pInfo)
40{
41 NetIF* pNetIF=netif_find(pszName);
42
43 if (pNetIF==NULL)
44 {
45 //Net interface not found.
46 memset(pInfo,0,sizeof(*pInfo));
47 return 0;
48 }
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;
53
54 memcpy(pInfo->hw_addr,pNetIF->hwaddr,sizeof(pInfo->hw_addr));
55
56#if LWIP_DHCP
57 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
58
59 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
60 {
61 pInfo->dhcp_enabled=1;
62 pInfo->dhcp_status=dhcp->state;
63 }
64 else
65 {
66 pInfo->dhcp_enabled=0;
67 pInfo->dhcp_status=DHCP_STATE_OFF;
68 }
69
70#else
71 pInfo->dhcp_enabled=0;
72#endif
73
74 return 1;
75}
76
77int ps2ip_setconfig(const t_ip_info* pInfo)
78{
79 NetIF* pNetIF=netif_find(pInfo->netif_name);
80
81 if (pNetIF==NULL)
82 {
83 return 0;
84 }
85
86#if LWIP_DHCP
87 struct dhcp *dhcp = netif_dhcp_data(pNetIF);
88
89 //Enable dhcp here
90
91 if (pInfo->dhcp_enabled)
92 {
93 if ((dhcp == NULL) || (dhcp->state == DHCP_STATE_OFF))
94 {
95 //Set initial IP address
96 netif_set_ipaddr(pNetIF,(IPAddr*)&pInfo->ipaddr);
97 netif_set_netmask(pNetIF,(IPAddr*)&pInfo->netmask);
98 netif_set_gw(pNetIF,(IPAddr*)&pInfo->gw);
99
100 //Start DHCP client
101 dhcp_start(pNetIF);
102 }
103 }
104 else
105 {
106 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF))
107 {
108 //Release DHCP lease
109 dhcp_release(pNetIF);
110
111 //Stop DHCP client
112 dhcp_stop(pNetIF);
113 }
114
115 netif_set_ipaddr(pNetIF,(IPAddr*)&pInfo->ipaddr);
116 netif_set_netmask(pNetIF,(IPAddr*)&pInfo->netmask);
117 netif_set_gw(pNetIF,(IPAddr*)&pInfo->gw);
118 }
119
120#else
121 netif_set_ipaddr(pNetIF,(IPAddr*)&pInfo->ipaddr);
122 netif_set_netmask(pNetIF,(IPAddr*)&pInfo->netmask);
123 netif_set_gw(pNetIF,(IPAddr*)&pInfo->gw);
124#endif
125
126 return 1;
127}
128
129static void EnQTxPacket(struct pbuf *tx)
130{
131 DI();
132
133 if(TxHead != NULL)
134 TxHead->next = tx;
135
136 TxHead = tx;
137 tx->next = NULL;
138
139 if(TxTail == NULL) //Queue empty
140 TxTail = tx;
141
142 EI();
143}
144
145static err_t SMapLowLevelOutput(struct netif* pNetIF, struct pbuf* pOutput)
146{
147 err_t result;
148
149 (void)pNetIF;
150
151 result = ERR_OK;
152 if(pOutput->tot_len > pOutput->len)
153 {
154 struct pbuf* pbuf;
155
156 pbuf_ref(pOutput); //Increment reference count because LWIP must free the PBUF, not the driver!
157 if((pbuf = pbuf_coalesce(pOutput, PBUF_RAW)) != pOutput)
158 { //No need to increase reference count because pbuf_coalesce() does it.
159 EnQTxPacket(pbuf);
160 NetManNetIFXmit();
161 } else
162 result = ERR_MEM;
163 } else {
164 pbuf_ref(pOutput); //This will be freed later.
165 EnQTxPacket(pOutput);
166 NetManNetIFXmit();
167 }
168
169 return result;
170}
171
172static void LinkStateUp(void)
173{
174 tcpip_callback((void*)&netif_set_link_up, &NIF);
175}
176
177static void LinkStateDown(void)
178{
179 tcpip_callback((void*)&netif_set_link_down, &NIF);
180}
181
182static void *AllocRxPacket(unsigned int size, void **payload)
183{
184 struct pbuf* pbuf;
185
186 if((pbuf = pbuf_alloc(PBUF_RAW, size, PBUF_POOL)) != NULL)
187 *payload = pbuf->payload;
188
189 return pbuf;
190}
191
192static void ReallocRxPacket(void *packet, unsigned int size)
193{
194 pbuf_realloc((struct pbuf *)packet, size);
195}
196
197static void FreeRxPacket(void *packet)
198{
199 pbuf_free(packet);
200}
201
202static void EnQRxPacket(void *packet)
203{
204 ps2ip_input(packet, &NIF);
205}
206
207static int NextTxPacket(void **payload)
208{
209 int len;
210
211 if(TxTail != NULL)
212 {
213 *payload = TxTail->payload;
214 len = TxTail->len;
215 } else
216 len = 0;
217
218 return len;
219}
220
221static void DeQTxPacket(void)
222{
223 struct pbuf *toFree;
224
225 toFree = NULL;
226
227 DI();
228 if(TxTail != NULL)
229 {
230 toFree = TxTail;
231
232 if(TxTail == TxHead) {
233 //Last in queue.
234 TxTail = NULL;
235 TxHead = NULL;
236 } else {
237 TxTail = TxTail->next;
238 }
239 }
240 EI();
241
242 if(toFree != NULL)
243 {
244 toFree->next = NULL;
245 pbuf_free(toFree);
246 }
247}
248
249static int AfterTxPacket(void **payload)
250{
251 int len;
252
253 if(TxTail != NULL && TxTail->next != NULL)
254 {
255 *payload = TxTail->next->payload;
256 len = TxTail->next->len;
257 } else
258 len = 0;
259
260 return len;
261}
262
263static void InitDone(void* pvArg)
264{
265 dbgprintf("InitDone: TCPIP initialized\n");
266 sys_sem_signal((sys_sem_t*)pvArg);
267}
268
270static err_t SMapIFInit(struct netif* pNetIF)
271{
272 TxHead = NULL;
273 TxTail = NULL;
274
275 pNetIF->name[0]='s';
276 pNetIF->name[1]='m';
277 pNetIF->output=&etharp_output; // For LWIP 1.3.0 and later.
278 pNetIF->linkoutput=&SMapLowLevelOutput;
280 pNetIF->flags|=(NETIF_FLAG_ETHARP|NETIF_FLAG_BROADCAST); // For LWIP v1.3.0 and later.
281 pNetIF->mtu=1500;
282
283 //Get MAC address.
284 NetManIoctl(NETMAN_NETIF_IOCTL_ETH_GET_MAC, NULL, 0, pNetIF->hwaddr, sizeof(pNetIF->hwaddr));
285 dbgprintf("MAC address : %02d:%02d:%02d:%02d:%02d:%02d\n",pNetIF->hwaddr[0],pNetIF->hwaddr[1],pNetIF->hwaddr[2],
286 pNetIF->hwaddr[3],pNetIF->hwaddr[4],pNetIF->hwaddr[5]);
287
288 return ERR_OK;
289}
290
291err_t ps2ip_input(PBuf* pInput, NetIF* pNetIF)
292{
293 err_t result;
294
295 if((result = pNetIF->input(pInput, pNetIF)) != ERR_OK)
296 pbuf_free(pInput);
297
298 return result;
299}
300
301static inline void InitializeLWIP(void)
302{
303 sys_sem_t Sema;
304
305 dbgprintf("PS2IP: Module Loaded.\n");
306
307 sys_sem_new(&Sema, 0);
308 dbgprintf("PS2IP: Calling tcpip_init\n");
309 tcpip_init(InitDone,&Sema);
310
311 sys_arch_sem_wait(&Sema, 0);
312 sys_sem_free(&Sema);
313
314 dbgprintf("PS2IP: System Initialised\n");
315}
316
317/* The following are defined in ps2ip_ps2sdk.c */
318extern void _ps2sdk_ps2ipee_init(void);
319extern void _ps2sdk_ps2ipee_deinit(void);
320
321int ps2ipInit(struct ip4_addr *ip_address, struct ip4_addr *subnet_mask, struct ip4_addr *gateway){
322 static const struct NetManNetProtStack stack={
323 &LinkStateUp,
324 &LinkStateDown,
325 &AllocRxPacket,
326 &FreeRxPacket,
327 &EnQRxPacket,
328 &NextTxPacket,
329 &DeQTxPacket,
330 &AfterTxPacket,
331 &ReallocRxPacket
332 };
333
334 NetManInit();
335
336 InitializeLWIP();
337
338 netif_add(&NIF, ip_address, subnet_mask, gateway, NULL, &SMapIFInit, tcpip_input);
339 netif_set_default(&NIF);
340
341 NetManRegisterNetworkStack(&stack);
342 netif_set_up(&NIF);
343
344 _ps2sdk_ps2ipee_init();
345
346 return 0;
347}
348
349void ps2ipDeinit(void){
350 _ps2sdk_ps2ipee_deinit();
351
352 NetManUnregisterNetworkStack();
353}
354
355// Stubbed for compatibility purposes
356void ps2ipSetHsyncTicksPerMSec(unsigned char ticks) {}
#define NETIF_MAX_HWADDR_LEN
Definition tcpip.h:1109
void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg)
Definition tcpip.c:659
err_t tcpip_callback(tcpip_callback_fn function, void *ctx)
Definition tcpip.c:323
err_t tcpip_input(struct pbuf *p, struct netif *inp)
Definition tcpip.c:297
@ ERR_OK
Definition err.h:55
@ ERR_MEM
Definition err.h:57
#define NETIF_FLAG_ETHARP
Definition tcpip.h:1137
#define NETIF_FLAG_BROADCAST
Definition tcpip.h:1127
void netif_set_link_down(struct netif *netif)
Definition netif.c:1056
struct netif * netif_find(const char *name)
Definition netif.c:1755
struct netif * netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
Definition netif.c:287
void netif_set_default(struct netif *netif)
Definition netif.c:849
void netif_set_link_up(struct netif *netif)
Definition netif.c:1018
void netif_set_up(struct netif *netif)
Definition netif.c:871
struct pbuf * pbuf_coalesce(struct pbuf *p, pbuf_layer layer)
Definition pbuf.c:1318
void pbuf_ref(struct pbuf *p)
Definition pbuf.c:833
u8 pbuf_free(struct pbuf *p)
Definition pbuf.c:729
@ PBUF_POOL
Definition tcpip.h:229
@ PBUF_RAW
Definition tcpip.h:200
void sys_sem_free(sys_sem_t *sem)
Definition sys_arch.c:334
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
Definition sys_arch.c:289
void sys_sem_signal(sys_sem_t *sem)
Definition sys_arch.c:329
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
Definition sys_arch.c:263
@ NETMAN_NETIF_IOCTL_ETH_GET_MAC
Definition netman.h:83
int ps2ipInit(struct ip4_addr *ip_address, struct ip4_addr *subnet_mask, struct ip4_addr *gateway)
Definition ps2ip.c:321
void ps2ipSetHsyncTicksPerMSec(unsigned char ticks)
Definition ps2ip.c:356
u8 hwaddr_len
Definition tcpip.h:1347
netif_output_fn output
Definition tcpip.h:1296
netif_input_fn input
Definition tcpip.h:1290
ip_addr_t ip_addr
Definition tcpip.h:1277
char name[2]
Definition tcpip.h:1353
u8 hwaddr[NETIF_MAX_HWADDR_LEN]
Definition tcpip.h:1349
u8 flags
Definition tcpip.h:1351
netif_linkoutput_fn linkoutput
Definition tcpip.h:1301
u16 mtu
Definition tcpip.h:1345
Definition tcpip.h:234
void * payload
Definition tcpip.h:239
struct pbuf * next
Definition tcpip.h:236
u16 tot_len
Definition tcpip.h:248
u16 len
Definition tcpip.h:251