13#include "rpc_client.h"
14#include "rpc_server.h"
18static struct NetManNetIF NetIFs[NETMAN_MAX_NETIF_COUNT];
20static unsigned char IsInitialized=0;
21static char NIFLinkState=0;
22static unsigned char NextNetIFID=0;
23static int NetManIOSemaID;
25IRX_ID(
"Network_Manager", 2, 1);
30int _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;
53void *malloc(
int size){
58 result = AllocSysMemory(ALLOC_FIRST, size, NULL);
64void free(
void *buffer){
68 FreeSysMemory(buffer);
72void NetManToggleGlobalNetIFLinkState(
unsigned char state){
75 NetManUpdateStackNIFLinkState();
78int NetManGetGlobalNetIFLinkState(
void){
82void NetManUpdateStackNIFLinkState(
void){
85 MainNetProtStack.LinkStateUp();
88 MainNetProtStack.LinkStateDown();
93static 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);
125void NetManUnregisterNetworkStack(
void){
128 WaitSema(NetManIOSemaID);
130 for(i=0; i<NETMAN_MAX_NETIF_COUNT; i++){
138 memset(&MainNetProtStack, 0,
sizeof(MainNetProtStack));
141 SignalSema(NetManIOSemaID);
144void NetManNetIFXmit(
void){
145 if(MainNetIF != NULL)
149int 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);
164int NetManNetIFSetLinkMode(
int mode){
168void *NetManNetProtStackAllocRxPacket(
unsigned int length,
void **payload){
169 return IsInitialized?MainNetProtStack.AllocRxPacket(length, payload):NULL;
172void NetManNetProtStackFreeRxPacket(
void *packet){
174 MainNetProtStack.FreeRxPacket(packet);
177void NetManNetProtStackEnQRxPacket(
void *packet){
179 MainNetProtStack.EnQRxPacket(packet);
182int NetManTxPacketNext(
void **payload){
183 return IsInitialized?MainNetProtStack.NextTxPacket(payload):0;
186void 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);
223void 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);
241void 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);
256 pNetIF->flags&=~NETMAN_NETIF_LINK_UP;
257 SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_DOWN);
263 SignalSema(NetManIOSemaID);
266int 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);
284int NetManQueryMainIF(
char *name){
287 WaitSema(NetManIOSemaID);
290 strcpy(name, MainNetIF->name);
292 }
else result = -
ENXIO;
294 SignalSema(NetManIOSemaID);
299int 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);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
@ NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE
#define NETMAN_NETIF_LINK_UP
#define NETMAN_NETIF_IN_USE