Renamed tpl_drv_* to api_drv_* (a more fitting name)
[tpg/acess2.git] / Modules / IPStack / routing.c
index 26817b6..9e298a0 100644 (file)
@@ -2,10 +2,10 @@
  * Acess2 IP Stack
  * - Routing Tables
  */
-#define DEBUG  1
+#define DEBUG  0
 #define VERSION        VER2(0,10)
 #include <acess.h>
-#include <tpl_drv_common.h>
+#include <api_drv_common.h>
 #include "ipstack.h"
 #include "link.h"
 
@@ -32,13 +32,13 @@ tRoute      *IPStack_FindRoute(int AddressType, tInterface *Interface, void *Address)
 tRoute *gIP_Routes;
 tRoute *gIP_RoutesEnd;
 tVFS_Node      gIP_RouteNode = {
-       Flags: VFS_FFLAG_DIRECTORY,
-       Size: -1,
-       NumACLs: 1,
-       ACLs: &gVFS_ACL_EveryoneRX,
-       ReadDir: IPStack_RouteDir_ReadDir,
-       FindDir: IPStack_RouteDir_FindDir,
-       IOCtl: IPStack_RouteDir_IOCtl
+       .Flags = VFS_FFLAG_DIRECTORY,
+       .Size = -1,
+       .NumACLs = 1,
+       .ACLs = &gVFS_ACL_EveryoneRX,
+       .ReadDir = IPStack_RouteDir_ReadDir,
+       .FindDir = IPStack_RouteDir_FindDir,
+       .IOCtl = IPStack_RouteDir_IOCtl
 };
 
 // === CODE ===
@@ -74,10 +74,39 @@ tVFS_Node *IPStack_RouteDir_FindDir(tVFS_Node *Node, const char *Name)
        // Zero is invalid, sorry :)
        if( !num )      return NULL;
        
+       // Interpret the name as <type>:<addr>, returning the interface for
+       // needed to access that address.
+       //   E.g. '4:0A02000A'  - 10.2.0.10
+       // Hm... It could do with a way to have a better address type representation
+       if( Name[1] == ':' )    // TODO: Allow variable length type codes
+       {
+                int    addrSize = IPStack_GetAddressSize(num);
+               Uint8   addrData[addrSize];
+               
+               // Errof if the size is invalid
+               if( strlen(Name) != 2 + addrSize*2 )
+                       return NULL;
+               
+               // Parse the address
+               // - Error if the address data is not fully hex
+               if( UnHex(addrData, addrSize, Name + 2) != addrSize )
+                       return NULL;
+               
+               // Find the route
+               rt = IPStack_FindRoute(num, NULL, addrData);
+               if(!rt) return NULL;
+               
+               // Return the interface node
+               // - Sure it's hijacking it from inteface.c's area, but it's
+               //   simpler this way
+               return &rt->Interface->Node;
+       }
+       
        // The list is inherently sorted, so we can do a quick search
        for(rt = gIP_Routes; rt && rt->Node.Inode < num; rt = rt->Next);
-       // Fast fail on larger number
-       if( rt->Node.Inode > num )
+       
+       // Fast fail end of list / larger number
+       if( !rt || rt->Node.Inode > num )
                return NULL;
        
        return &rt->Node;
@@ -104,23 +133,7 @@ int IPStack_RouteDir_IOCtl(tVFS_Node *Node, int ID, void *Data)
        switch(ID)
        {
        // --- Standard IOCtls (0-3) ---
-       case DRV_IOCTL_TYPE:
-               LEAVE('i', DRV_TYPE_MISC);
-               return DRV_TYPE_MISC;
-       
-       case DRV_IOCTL_IDENT:
-               tmp = ModUtil_SetIdent(Data, STR(IDENT));
-               LEAVE('i', 1);
-               return 1;
-       
-       case DRV_IOCTL_VERSION:
-               LEAVE('x', VERSION);
-               return VERSION;
-       
-       case DRV_IOCTL_LOOKUP:
-               tmp = ModUtil_LookupString( (char**)casIOCtls_RouteDir, (char*)Data );
-               LEAVE('i', tmp);
-               return tmp;
+       BASE_IOCTLS(DRV_TYPE_MISC, STR(IDENT), VERSION, casIOCtls_RouteDir)
        
        case 4: // Add Route
                if( !CheckString(Data) )        LEAVE_RET('i', -1);
@@ -335,10 +348,10 @@ tRoute *IPStack_FindRoute(int AddressType, tInterface *Interface, void *Address)
        {
                rt = &Interface->Route;
                // Make sure route is up to date
-               memcpy(rt->Network, iface->Address, addrSize);
+               memcpy(rt->Network, Interface->Address, addrSize);
                memset(rt->NextHop, 0, addrSize);
                rt->Metric = DEFAUTL_METRIC;
-               rt->SubnetBits = iface->SubnetBits;
+               rt->SubnetBits = Interface->SubnetBits;
                
                if( IPStack_CompareAddress(AddressType, rt->Network, Address, rt->SubnetBits) )
                {
@@ -371,7 +384,6 @@ static const char *casIOCtls_Route[] = {
  */
 int IPStack_Route_IOCtl(tVFS_Node *Node, int ID, void *Data)
 {
-        int    tmp;
         int    *iData = Data;
        tRoute  *rt = Node->ImplPtr;
         int    addrSize = IPStack_GetAddressSize(rt->AddressType);
@@ -379,23 +391,7 @@ int IPStack_Route_IOCtl(tVFS_Node *Node, int ID, void *Data)
        switch(ID)
        {
        // --- Standard IOCtls (0-3) ---
-       case DRV_IOCTL_TYPE:
-               LEAVE('i', DRV_TYPE_MISC);
-               return DRV_TYPE_MISC;
-       
-       case DRV_IOCTL_IDENT:
-               tmp = ModUtil_SetIdent(Data, STR(IDENT));
-               LEAVE('i', 1);
-               return 1;
-       
-       case DRV_IOCTL_VERSION:
-               LEAVE('x', VERSION);
-               return VERSION;
-       
-       case DRV_IOCTL_LOOKUP:
-               tmp = ModUtil_LookupString( (char**)casIOCtls_Route, (char*)Data );
-               LEAVE('i', tmp);
-               return tmp;
+       BASE_IOCTLS(DRV_TYPE_MISC, STR(IDENT), VERSION, casIOCtls_Route)
        
        // Get address type
        case 4:

UCC git Repository :: git.ucc.asn.au