PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
netman.c
1#include <errno.h>
2#include <intrman.h>
3#include <irx.h>
4#include <loadcore.h>
5#include <sysclib.h>
6#include <sysmem.h>
7#include <sifman.h>
8#include <thevent.h>
9#include <thsemap.h>
10#include <netman.h>
11#include <netman_rpc.h>
12
13#include "rpc_client.h"
14#include "rpc_server.h"
15#include "internal.h"
16
17static struct NetManNetProtStack MainNetProtStack;
18static struct NetManNetIF NetIFs[NETMAN_MAX_NETIF_COUNT];
19static struct NetManNetIF *MainNetIF=NULL;
20static unsigned char IsInitialized=0;
21static char NIFLinkState=0;
22static unsigned char NextNetIFID=0;
23static int NetManIOSemaID;
24
25IRX_ID("Network_Manager", 2, 1);
26
27extern struct irx_export_table _exp_netman;
28extern struct irx_export_table _exp_netdev;
29
30int _start(int argc, char *argv[]){
31 iop_sema_t sema;
32
33 (void)argc;
34 (void)argv;
35
36 if(RegisterLibraryEntries(&_exp_netman) != 0){
37 return MODULE_NO_RESIDENT_END;
38 }
39 if(RegisterLibraryEntries(&_exp_netdev) != 0){
40 return MODULE_NO_RESIDENT_END;
41 }
42 sema.attr = 0;
43 sema.option = 0;
44 sema.initial = 1;
45 sema.max = 1;
46 NetManIOSemaID = CreateSema(&sema);
47
48 NetmanInitRPCServer();
49
50 return MODULE_RESIDENT_END;
51}
52
53void *malloc(int size){
54 int OldState;
55 void *result;
56
57 CpuSuspendIntr(&OldState);
58 result = AllocSysMemory(ALLOC_FIRST, size, NULL);
59 CpuResumeIntr(OldState);
60
61 return result;
62}
63
64void free(void *buffer){
65 int OldState;
66
67 CpuSuspendIntr(&OldState);
68 FreeSysMemory(buffer);
69 CpuResumeIntr(OldState);
70}
71
72void NetManToggleGlobalNetIFLinkState(unsigned char state){
73 NIFLinkState = state;
74
75 NetManUpdateStackNIFLinkState();
76}
77
78int NetManGetGlobalNetIFLinkState(void){
79 return NIFLinkState;
80}
81
82void NetManUpdateStackNIFLinkState(void){
83 if(IsInitialized){
84 if(NIFLinkState){
85 MainNetProtStack.LinkStateUp();
86 }
87 else{
88 MainNetProtStack.LinkStateDown();
89 }
90 }
91}
92
93static void UpdateNetIFStatus(void){
94 if(!(MainNetIF->flags&NETMAN_NETIF_IN_USE)) MainNetIF = NULL;
95
96 if(MainNetIF == NULL){
97 unsigned char i;
98
99 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
100 if(NetIFs[i].flags&NETMAN_NETIF_IN_USE){
101 MainNetIF=&NetIFs[i];
102 break;
103 }
104 }
105 }
106
107 NetManToggleGlobalNetIFLinkState((MainNetIF!=NULL && (MainNetIF->flags&NETMAN_NETIF_LINK_UP)) ? 1 : 0);
108}
109
110int NetManRegisterNetworkStack(const struct NetManNetProtStack *stack){
111 WaitSema(NetManIOSemaID);
112
113 if(!IsInitialized){
114 memcpy(&MainNetProtStack, stack, sizeof(MainNetProtStack));
115 IsInitialized=1;
116
117 NetManUpdateStackNIFLinkState();
118 }
119
120 SignalSema(NetManIOSemaID);
121
122 return 0;
123}
124
125void NetManUnregisterNetworkStack(void){
126 unsigned int i;
127
128 WaitSema(NetManIOSemaID);
129
130 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
131 if(NetIFs[i].flags&NETMAN_NETIF_IN_USE){
132 NetIFs[i].flags=0;
133 NetIFs[i].deinit();
134 }
135 }
136
137 UpdateNetIFStatus();
138 memset(&MainNetProtStack, 0, sizeof(MainNetProtStack));
139 IsInitialized=0;
140
141 SignalSema(NetManIOSemaID);
142}
143
144void NetManNetIFXmit(void){
145 if(MainNetIF != NULL)
146 MainNetIF->xmit();
147}
148
149int NetManIoctl(unsigned int command, void *args, unsigned int args_len, void *output, unsigned int length){
150 int result;
151
152 WaitSema(NetManIOSemaID);
153
154 if(MainNetIF!=NULL){
155 result=MainNetIF->ioctl(command, args, args_len, output, length);
156 }
157 else result=-1;
158
159 SignalSema(NetManIOSemaID);
160
161 return result;
162}
163
164int NetManNetIFSetLinkMode(int mode){
165 return NetManIoctl(NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE, &mode, sizeof(mode), NULL, 0);
166}
167
168void *NetManNetProtStackAllocRxPacket(unsigned int length, void **payload){
169 return IsInitialized?MainNetProtStack.AllocRxPacket(length, payload):NULL;
170}
171
172void NetManNetProtStackFreeRxPacket(void *packet){
173 if(IsInitialized)
174 MainNetProtStack.FreeRxPacket(packet);
175}
176
177void NetManNetProtStackEnQRxPacket(void *packet){
178 if(IsInitialized)
179 MainNetProtStack.EnQRxPacket(packet);
180}
181
182int NetManTxPacketNext(void **payload){
183 return IsInitialized?MainNetProtStack.NextTxPacket(payload):0;
184}
185
186void NetManTxPacketDeQ(void){
187 if(IsInitialized)
188 MainNetProtStack.DeQTxPacket();
189}
190
191int NetManRegisterNetIF(struct NetManNetIF *NetIF){
192 unsigned int i;
193 int result;
194 iop_event_t EventFlag;
195
196 WaitSema(NetManIOSemaID);
197
198 for(i=0, result=-ENOMEM; i<NETMAN_MAX_NETIF_COUNT; i++){
199 if(!(NetIFs[i].flags&NETMAN_NETIF_IN_USE)){
200 if(NetIF->init()==0){
201 EventFlag.attr = 0;
202 EventFlag.option = 0;
203 EventFlag.bits = 0;
204 if((result = NetIF->EventFlagID = CreateEventFlag(&EventFlag)) >= 0){
205 memcpy(&NetIFs[i], NetIF, sizeof(NetIFs[i]));
206 NetIFs[i].flags|=NETMAN_NETIF_IN_USE;
207 result=NetIFs[i].id=((unsigned int)NextNetIFID)<<8|i;
208
209 UpdateNetIFStatus();
210 NextNetIFID++;
211 }
212 }
213 else result=-EIO;
214 break;
215 }
216 }
217
218 SignalSema(NetManIOSemaID);
219
220 return result;
221}
222
223void NetManUnregisterNetIF(const char *name){
224 unsigned int i;
225
226 WaitSema(NetManIOSemaID);
227
228 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
229 if((NetIFs[i].flags&NETMAN_NETIF_IN_USE) && strcmp(name, NetIFs[i].name)==0){
230 NetIFs[i].flags=0;
231 NetIFs[i].deinit();
232 DeleteEventFlag(NetIFs[i].EventFlagID);
233 UpdateNetIFStatus();
234 break;
235 }
236 }
237
238 SignalSema(NetManIOSemaID);
239}
240
241void NetManToggleNetIFLinkState(int NetIFID, unsigned char state){
242 WaitSema(NetManIOSemaID);
243
244 if((NetIFID&0xFF)<NETMAN_MAX_NETIF_COUNT && NetIFID==NetIFs[NetIFID&0xFF].id && (NetIFs[NetIFID&0xFF].flags&NETMAN_NETIF_IN_USE)){
245 struct NetManNetIF *pNetIF;
246
247 pNetIF = &NetIFs[NetIFID&0xFF];
248
249 ClearEventFlag(pNetIF->EventFlagID, ~(NETMAN_NETIF_EVF_UP|NETMAN_NETIF_EVF_DOWN));
250
251 if(state){
252 pNetIF->flags|=NETMAN_NETIF_LINK_UP;
253 SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_UP);
254 }
255 else{
256 pNetIF->flags&=~NETMAN_NETIF_LINK_UP;
257 SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_DOWN);
258 }
259
260 UpdateNetIFStatus();
261 }
262
263 SignalSema(NetManIOSemaID);
264}
265
266int NetManSetMainIF(const char *name){
267 int result, i;
268
269 WaitSema(NetManIOSemaID);
270
271 for(i=0,result=-ENXIO; i<NETMAN_MAX_NETIF_COUNT; i++){
272 if((NetIFs[i].flags&NETMAN_NETIF_IN_USE) && strcmp(name, NetIFs[i].name)==0){
273 MainNetIF=&NetIFs[i];
274 result = 0;
275 break;
276 }
277 }
278
279 SignalSema(NetManIOSemaID);
280
281 return result;
282}
283
284int NetManQueryMainIF(char *name){
285 int result;
286
287 WaitSema(NetManIOSemaID);
288
289 if(MainNetIF!=NULL && (MainNetIF->flags&NETMAN_NETIF_IN_USE)){
290 strcpy(name, MainNetIF->name);
291 result = 0;
292 }else result = -ENXIO;
293
294 SignalSema(NetManIOSemaID);
295
296 return result;
297}
298
299int NetManSetLinkMode(int mode){
300 int result, evfid;
301
302 WaitSema(NetManIOSemaID);
303
304 if(MainNetIF!=NULL){
305 evfid = MainNetIF->EventFlagID;
306
307 ClearEventFlag(evfid, ~NETMAN_NETIF_EVF_DOWN);
308 result = MainNetIF->ioctl(NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE, &mode, sizeof(mode), NULL, 0);
309 }
310 else{
311 evfid = -1;
312 result = -1;
313 }
314
315 SignalSema(NetManIOSemaID);
316
317 if(result == 0 && evfid >= 0)
318 WaitEventFlag(evfid, NETMAN_NETIF_EVF_DOWN, WEF_OR, NULL); //Wait for the IF to go down.
319
320 return result;
321}
#define ENXIO
Definition errno.h:31
#define ENOMEM
Definition errno.h:43
#define EIO
Definition errno.h:29
int CpuResumeIntr(int state)
Definition intrman.c:227
int CpuSuspendIntr(int *state)
Definition intrman.c:205
@ NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE
Definition netman.h:93
#define NETMAN_NETIF_LINK_UP
Definition netman.h:148
short int id
Definition netman.h:155
#define NETMAN_NETIF_IN_USE
Definition netman.h:142