X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Finterface.c;h=b0b63b9a9b1c7e8e443e1440a86d61102de5ebbb;hb=a2495c6ea4f4cab16b5d339ae511428e92e89e73;hp=82d1b8c43d14356550946df291599d073eaea92c;hpb=aed19895fd79f673586565453be0743c4abfea5b;p=tpg%2Facess2.git diff --git a/Modules/IPStack/interface.c b/Modules/IPStack/interface.c index 82d1b8c4..b0b63b9a 100644 --- a/Modules/IPStack/interface.c +++ b/Modules/IPStack/interface.c @@ -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,11 +141,13 @@ 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; } @@ -178,6 +185,7 @@ 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); @@ -234,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; @@ -367,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 ) { @@ -402,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 @@ -422,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 @@ -441,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 @@ -456,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);