PS2SDK
PS2 Homebrew Libraries
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 
17 static struct NetManNetProtStack MainNetProtStack;
18 static struct NetManNetIF NetIFs[NETMAN_MAX_NETIF_COUNT];
19 static struct NetManNetIF *MainNetIF=NULL;
20 static unsigned char IsInitialized=0;
21 static char NIFLinkState=0;
22 static unsigned char NextNetIFID=0;
23 static int NetManIOSemaID;
24 
25 IRX_ID("Network_Manager", 2, 1);
26 
27 extern struct irx_export_table _exp_netman;
28 extern struct irx_export_table _exp_netdev;
29 
30 int _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 
53 void *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 
64 void free(void *buffer){
65  int OldState;
66 
67  CpuSuspendIntr(&OldState);
68  FreeSysMemory(buffer);
69  CpuResumeIntr(OldState);
70 }
71 
72 void NetManToggleGlobalNetIFLinkState(unsigned char state){
73  NIFLinkState = state;
74 
75  NetManUpdateStackNIFLinkState();
76 }
77 
78 int NetManGetGlobalNetIFLinkState(void){
79  return NIFLinkState;
80 }
81 
82 void NetManUpdateStackNIFLinkState(void){
83  if(IsInitialized){
84  if(NIFLinkState){
85  MainNetProtStack.LinkStateUp();
86  }
87  else{
88  MainNetProtStack.LinkStateDown();
89  }
90  }
91 }
92 
93 static 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 
110 int 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 
125 void 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 
144 void NetManNetIFXmit(void){
145  if(MainNetIF != NULL)
146  MainNetIF->xmit();
147 }
148 
149 int 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 
164 int NetManNetIFSetLinkMode(int mode){
165  return NetManIoctl(NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE, &mode, sizeof(mode), NULL, 0);
166 }
167 
168 void *NetManNetProtStackAllocRxPacket(unsigned int length, void **payload){
169  return IsInitialized?MainNetProtStack.AllocRxPacket(length, payload):NULL;
170 }
171 
172 void NetManNetProtStackFreeRxPacket(void *packet){
173  if(IsInitialized)
174  MainNetProtStack.FreeRxPacket(packet);
175 }
176 
177 void NetManNetProtStackEnQRxPacket(void *packet){
178  if(IsInitialized)
179  MainNetProtStack.EnQRxPacket(packet);
180 }
181 
182 int NetManTxPacketNext(void **payload){
183  return IsInitialized?MainNetProtStack.NextTxPacket(payload):0;
184 }
185 
186 void NetManTxPacketDeQ(void){
187  if(IsInitialized)
188  MainNetProtStack.DeQTxPacket();
189 }
190 
191 int 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 
223 void 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 
241 void 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 
266 int 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 
284 int 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 
299 int 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 }
NetManNetProtStack
Definition: netman.h:16
iop_sema_t
Definition: thsemap.h:38
sifman.h
sysclib.h
ENOMEM
#define ENOMEM
Definition: errno.h:43
ENXIO
#define ENXIO
Definition: errno.h:31
CpuSuspendIntr
int CpuSuspendIntr(int *state)
Definition: intrman.c:195
EIO
#define EIO
Definition: errno.h:29
loadcore.h
NETMAN_NETIF_IN_USE
#define NETMAN_NETIF_IN_USE
Definition: netman.h:142
NetManNetIF
Definition: netman.h:150
NETMAN_NETIF_LINK_UP
#define NETMAN_NETIF_LINK_UP
Definition: netman.h:148
netman.h
irx.h
thsemap.h
irx_export_table
Definition: irx.h:90
netman_rpc.h
NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE
@ NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE
Definition: netman.h:93
NetManNetIF::id
short int id
Definition: netman.h:155
CpuResumeIntr
int CpuResumeIntr(int state)
Definition: intrman.c:217
netif
Definition: tcpip.h:1262
sysmem.h
NetManIoctl
Definition: netman_rpc.h:60
intrman.h
iop_event_t
Definition: thevent.h:37
thevent.h
errno.h