X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Finterface.c;h=b0b63b9a9b1c7e8e443e1440a86d61102de5ebbb;hb=7c43aea724fea42bc297f47f9c180a5080c6fd17;hp=ab458b6b6df63a0feee92b114b5eccaf90f9d6db;hpb=06f8392897b1001c41fcfa3e3fd5db4ca5b77258;p=tpg%2Facess2.git diff --git a/Modules/IPStack/interface.c b/Modules/IPStack/interface.c index ab458b6b..b0b63b9a 100644 --- a/Modules/IPStack/interface.c +++ b/Modules/IPStack/interface.c @@ -6,8 +6,8 @@ #define VERSION VER2(0,10) #include "ipstack.h" #include "link.h" -#include -#include +#include +#include // === CONSTANTS === //! Default timeout value, 30 seconds @@ -32,6 +32,11 @@ tVFS_Node *IPStack_Iface_FindDir(tVFS_Node *Node, const char *Name); int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data); // === GLOBALS === +tVFS_NodeType gIP_InterfaceNodeType = { + .ReadDir = IPStack_Iface_ReadDir, + .FindDir = IPStack_Iface_FindDir, + .IOCtl = IPStack_Iface_IOCtl +}; //! Loopback (127.0.0.0/8, ::1) Pseudo-Interface tInterface gIP_LoopInterface = { .Node = { @@ -40,9 +45,7 @@ tInterface gIP_LoopInterface = { .Size = -1, .NumACLs = 1, .ACLs = &gVFS_ACL_EveryoneRX, - .ReadDir = IPStack_Iface_ReadDir, - .FindDir = IPStack_Iface_FindDir, - .IOCtl = IPStack_Iface_IOCtl + .Type = &gIP_InterfaceNodeType }, .Adapter = NULL, .Type = 0 @@ -75,10 +78,12 @@ char *IPStack_Root_ReadDir(tVFS_Node *Node, int Pos) // Routing Subdir if( Pos == 0 ) { + LEAVE('s', "routes"); return strdup("routes"); } // Pseudo Interfaces if( Pos == 1 ) { + LEAVE('s', "lo"); return strdup("lo"); } Pos -= 2; @@ -136,36 +141,16 @@ tVFS_Node *IPStack_Root_FindDir(tVFS_Node *Node, const char *Name) // Routing subdir if( strcmp(Name, "routes") == 0 ) { + LEAVE('p', &gIP_RouteNode); return &gIP_RouteNode; } // Loopback if( strcmp(Name, "lo") == 0 ) { + LEAVE('p', &gIP_LoopInterface.Node); return &gIP_LoopInterface.Node; } - #if 0 - i = 0; num = 0; - while('0' <= Name[i] && Name[i] <= '9') - { - num *= 10; - num += Name[i] - '0'; - i ++; - } - if(Name[i] != '\0') { - LEAVE('n'); - return NULL; - } - - for( iface = gIP_Interfaces; iface; iface = iface->Next ) - { - if( (int)iface->Node.ImplInt == num ) - { - LEAVE('p', &iface->Node); - return &iface->Node; - } - } - #else for( iface = gIP_Interfaces; iface; iface = iface->Next ) { if( strcmp(iface->Name, Name) == 0 ) @@ -174,7 +159,6 @@ tVFS_Node *IPStack_Root_FindDir(tVFS_Node *Node, const char *Name) return &iface->Node; } } - #endif LEAVE('p', NULL); return NULL; @@ -201,9 +185,11 @@ int IPStack_Root_IOCtl(tVFS_Node *Node, int ID, void *Data) case 4: if( Threads_GetUID() != 0 ) LEAVE_RET('i', -1); if( !CheckString( Data ) ) LEAVE_RET('i', -1); + LOG("New interface for '%s'", Data); { char name[4] = ""; tInterface *iface = IPStack_AddInterface(Data, name); + if(iface == NULL) LEAVE_RET('i', -1); tmp = iface->Node.ImplInt; } LEAVE_RET('i', tmp); @@ -226,6 +212,7 @@ tInterface *IPStack_AddInterface(const char *Device, const char *Name) card = IPStack_GetAdapter(Device); if( !card ) { + Log_Debug("IPStack", "Unable to open card '%s'", Device); LEAVE('n'); return NULL; // ERR_YOURBAD } @@ -255,13 +242,7 @@ tInterface *IPStack_AddInterface(const char *Device, const char *Name) iface->Node.Size = -1; iface->Node.NumACLs = 1; iface->Node.ACLs = &gVFS_ACL_EveryoneRX; - iface->Node.ReadDir = IPStack_Iface_ReadDir; - iface->Node.FindDir = IPStack_Iface_FindDir; - iface->Node.IOCtl = IPStack_Iface_IOCtl; - iface->Node.MkNod = NULL; - iface->Node.Link = NULL; - iface->Node.Relink = NULL; - iface->Node.Close = NULL; + iface->Node.Type = &gIP_InterfaceNodeType; // Set Defaults iface->TimeoutDelay = DEFAULT_TIMEOUT; @@ -272,7 +253,7 @@ tInterface *IPStack_AddInterface(const char *Device, const char *Name) // Delay setting ImplInt until after the adapter is opened // Keeps things simple iface->Node.ImplInt = giIP_NextIfaceId++; - sprintf(iface->Name, "%i", iface->Node.ImplInt); + sprintf(iface->Name, "%i", (int)iface->Node.ImplInt); // Append to list SHORTLOCK( &glIP_Interfaces ); @@ -388,6 +369,7 @@ int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data) // Set type iface->Type = *(int*)Data; + LOG("Interface type set to %i", iface->Type); size = IPStack_GetAddressSize(iface->Type); // Check it's actually valid if( iface->Type != 0 && size == 0 ) { @@ -423,9 +405,9 @@ int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data) size = IPStack_GetAddressSize(iface->Type); if( !CheckMem( Data, size ) ) LEAVE_RET('i', -1); // TODO: Protect against trashing + LOG("Interface address set to '%s'", IPStack_PrintAddress(iface->Type, Data)); memcpy( iface->Address, Data, size ); - LEAVE('i', 1); - return 1; + LEAVE_RET('i', 1); /* * getset_subnet @@ -443,12 +425,11 @@ int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data) // Is the mask sane? if( *(int*)Data < 0 || *(int*)Data > IPStack_GetAddressSize(iface->Type)*8-1 ) LEAVE_RET('i', -1); - + LOG("Set subnet bits to %i", *(int*)Data); // Ok, set it iface->SubnetBits = *(int*)Data; } - LEAVE('i', iface->SubnetBits); - return iface->SubnetBits; + LEAVE_RET('i', iface->SubnetBits); /* * get_device @@ -462,7 +443,7 @@ int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data) if( !CheckMem( Data, iface->Adapter->DeviceLen+1 ) ) LEAVE_RET('i', -1); strcpy( Data, iface->Adapter->Device ); - return iface->Adapter->DeviceLen; + LEAVE_RET('i', iface->Adapter->DeviceLen); /* * ping @@ -477,8 +458,7 @@ int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data) case 4: if( !CheckMem( Data, sizeof(tIPv4) ) ) LEAVE_RET('i', -1); tmp = IPv4_Ping(iface, *(tIPv4*)Data); - LEAVE('i', tmp); - return tmp; + LEAVE_RET('i', tmp); case 6: LEAVE_RET('i', 1);