13 #include "rpc_client.h"
14 #include "rpc_server.h"
18 static struct NetManNetIF NetIFs[NETMAN_MAX_NETIF_COUNT];
20 static unsigned char IsInitialized=0;
21 static char NIFLinkState=0;
22 static unsigned char NextNetIFID=0;
23 static int NetManIOSemaID;
25 IRX_ID(
"Network_Manager", 2, 1);
30 int _start(
int argc,
char *argv[]){
36 if(RegisterLibraryEntries(&_exp_netman) != 0){
37 return MODULE_NO_RESIDENT_END;
39 if(RegisterLibraryEntries(&_exp_netdev) != 0){
40 return MODULE_NO_RESIDENT_END;
46 NetManIOSemaID = CreateSema(&sema);
48 NetmanInitRPCServer();
50 return MODULE_RESIDENT_END;
53 void *malloc(
int size){
58 result = AllocSysMemory(ALLOC_FIRST, size, NULL);
64 void free(
void *buffer){
68 FreeSysMemory(buffer);
72 void NetManToggleGlobalNetIFLinkState(
unsigned char state){
75 NetManUpdateStackNIFLinkState();
78 int NetManGetGlobalNetIFLinkState(
void){
82 void NetManUpdateStackNIFLinkState(
void){
85 MainNetProtStack.LinkStateUp();
88 MainNetProtStack.LinkStateDown();
93 static void UpdateNetIFStatus(
void){
96 if(MainNetIF == NULL){
99 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
101 MainNetIF=&NetIFs[i];
107 NetManToggleGlobalNetIFLinkState((MainNetIF!=NULL && (MainNetIF->flags&
NETMAN_NETIF_LINK_UP)) ? 1 : 0);
111 WaitSema(NetManIOSemaID);
114 memcpy(&MainNetProtStack, stack,
sizeof(MainNetProtStack));
117 NetManUpdateStackNIFLinkState();
120 SignalSema(NetManIOSemaID);
125 void NetManUnregisterNetworkStack(
void){
128 WaitSema(NetManIOSemaID);
130 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
138 memset(&MainNetProtStack, 0,
sizeof(MainNetProtStack));
141 SignalSema(NetManIOSemaID);
144 void NetManNetIFXmit(
void){
145 if(MainNetIF != NULL)
149 int NetManIoctl(
unsigned int command,
void *args,
unsigned int args_len,
void *output,
unsigned int length){
152 WaitSema(NetManIOSemaID);
155 result=MainNetIF->ioctl(command, args, args_len, output, length);
159 SignalSema(NetManIOSemaID);
164 int NetManNetIFSetLinkMode(
int mode){
168 void *NetManNetProtStackAllocRxPacket(
unsigned int length,
void **payload){
169 return IsInitialized?MainNetProtStack.AllocRxPacket(length, payload):NULL;
172 void NetManNetProtStackFreeRxPacket(
void *packet){
174 MainNetProtStack.FreeRxPacket(packet);
177 void NetManNetProtStackEnQRxPacket(
void *packet){
179 MainNetProtStack.EnQRxPacket(packet);
182 int NetManTxPacketNext(
void **payload){
183 return IsInitialized?MainNetProtStack.NextTxPacket(payload):0;
186 void NetManTxPacketDeQ(
void){
188 MainNetProtStack.DeQTxPacket();
196 WaitSema(NetManIOSemaID);
198 for(i=0, result=-
ENOMEM; i<NETMAN_MAX_NETIF_COUNT; i++){
200 if(
NetIF->init()==0){
202 EventFlag.option = 0;
204 if((result =
NetIF->EventFlagID = CreateEventFlag(&EventFlag)) >= 0){
205 memcpy(&NetIFs[i],
NetIF,
sizeof(NetIFs[i]));
207 result=NetIFs[i].
id=((
unsigned int)NextNetIFID)<<8|i;
218 SignalSema(NetManIOSemaID);
223 void NetManUnregisterNetIF(
const char *name){
226 WaitSema(NetManIOSemaID);
228 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
232 DeleteEventFlag(NetIFs[i].EventFlagID);
238 SignalSema(NetManIOSemaID);
241 void NetManToggleNetIFLinkState(
int NetIFID,
unsigned char state){
242 WaitSema(NetManIOSemaID);
244 if((NetIFID&0xFF)<NETMAN_MAX_NETIF_COUNT && NetIFID==NetIFs[NetIFID&0xFF].
id && (NetIFs[NetIFID&0xFF].flags&
NETMAN_NETIF_IN_USE)){
247 pNetIF = &NetIFs[NetIFID&0xFF];
249 ClearEventFlag(pNetIF->EventFlagID, ~(NETMAN_NETIF_EVF_UP|NETMAN_NETIF_EVF_DOWN));
253 SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_UP);
257 SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_DOWN);
263 SignalSema(NetManIOSemaID);
266 int NetManSetMainIF(
const char *name){
269 WaitSema(NetManIOSemaID);
271 for(i=0,result=-
ENXIO; i<NETMAN_MAX_NETIF_COUNT; i++){
273 MainNetIF=&NetIFs[i];
279 SignalSema(NetManIOSemaID);
284 int NetManQueryMainIF(
char *name){
287 WaitSema(NetManIOSemaID);
290 strcpy(name, MainNetIF->name);
292 }
else result = -
ENXIO;
294 SignalSema(NetManIOSemaID);
299 int NetManSetLinkMode(
int mode){
302 WaitSema(NetManIOSemaID);
305 evfid = MainNetIF->EventFlagID;
307 ClearEventFlag(evfid, ~NETMAN_NETIF_EVF_DOWN);
315 SignalSema(NetManIOSemaID);
317 if(result == 0 && evfid >= 0)
318 WaitEventFlag(evfid, NETMAN_NETIF_EVF_DOWN, WEF_OR, NULL);