Kernel - Instruction tracing support
[tpg/acess2.git] / Modules / IPStack / interface.c
index c6f55ba..6538078 100644 (file)
@@ -23,8 +23,8 @@ char  *IPStack_Root_ReadDir(tVFS_Node *Node, int Pos);
 tVFS_Node      *IPStack_Root_FindDir(tVFS_Node *Node, const char *Name);
  int   IPStack_Root_IOCtl(tVFS_Node *Node, int ID, void *Data);
 
- int   IPStack_AddInterface(const char *Device, const char *Name);
  int   IPStack_AddFile(tSocketFile *File);
+tInterface     *IPStack_AddInterface(const char *Device, const char *Name);
 tAdapter       *IPStack_GetAdapter(const char *Path);
 
 char   *IPStack_Iface_ReadDir(tVFS_Node *Node, int Pos);
@@ -34,18 +34,18 @@ tVFS_Node   *IPStack_Iface_FindDir(tVFS_Node *Node, const char *Name);
 // === GLOBALS ===
 //! Loopback (127.0.0.0/8, ::1) Pseudo-Interface
 tInterface     gIP_LoopInterface = {
-       Node: {
-               ImplPtr: &gIP_LoopInterface,
-               Flags: VFS_FFLAG_DIRECTORY,
-               Size: -1,
-               NumACLs: 1,
-               ACLs: &gVFS_ACL_EveryoneRX,
-               ReadDir: IPStack_Iface_ReadDir,
-               FindDir: IPStack_Iface_FindDir,
-               IOCtl: IPStack_Iface_IOCtl
+       .Node = {
+               .ImplPtr = &gIP_LoopInterface,
+               .Flags = VFS_FFLAG_DIRECTORY,
+               .Size = -1,
+               .NumACLs = 1,
+               .ACLs = &gVFS_ACL_EveryoneRX,
+               .ReadDir = IPStack_Iface_ReadDir,
+               .FindDir = IPStack_Iface_FindDir,
+               .IOCtl = IPStack_Iface_IOCtl
        },
-       Adapter: NULL,
-       Type: 0
+       .Adapter = NULL,
+       .Type = 0
 };
 tShortSpinlock glIP_Interfaces;
 tInterface     *gIP_Interfaces = NULL;
@@ -54,8 +54,8 @@ tInterface    *gIP_Interfaces_Last = NULL;
 tSocketFile    *gIP_FileTemplates;
 
 tAdapter       gIP_LoopAdapter = {
-       DeviceLen: 8,
-       Device: "LOOPBACK"
+       .DeviceLen = 8,
+       .Device = "LOOPBACK"
        };
 tMutex glIP_Adapters;
 tAdapter       *gIP_Adapters = NULL;
@@ -192,34 +192,19 @@ int IPStack_Root_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, "IPStack");
-               LEAVE('i', 1);
-               return 1;
-       
-       case DRV_IOCTL_VERSION:
-               LEAVE('x', VERSION);
-               return VERSION;
-       
-       case DRV_IOCTL_LOOKUP:
-               tmp = ModUtil_LookupString( (char**)casIOCtls_Root, (char*)Data );
-               LEAVE('i', tmp);
-               return tmp;
+       BASE_IOCTLS(DRV_TYPE_MISC, "IPStack", VERSION, casIOCtls_Root)
                
-               /*
-                * add_interface
-                * - Adds a new IP interface and binds it to a device
-                */
+       /*
+        * add_interface
+        * - Adds a new IP interface and binds it to a device
+        */
        case 4:
                if( Threads_GetUID() != 0 )     LEAVE_RET('i', -1);
                if( !CheckString( Data ) )      LEAVE_RET('i', -1);
                {
                        char    name[4] = "";
-                       tmp = IPStack_AddInterface(Data, name);
+                       tInterface      *iface = IPStack_AddInterface(Data, name);
+                       tmp = iface->Node.ImplInt;
                }
                LEAVE_RET('i', tmp);
        }
@@ -228,10 +213,10 @@ int IPStack_Root_IOCtl(tVFS_Node *Node, int ID, void *Data)
 }
 
 /**
- * \fn int IPStack_AddInterface(char *Device)
+ * \fn tInterface *IPStack_AddInterface(char *Device)
  * \brief Adds an interface to the list
  */
-int IPStack_AddInterface(const char *Device, const char *Name)
+tInterface *IPStack_AddInterface(const char *Device, const char *Name)
 {
        tInterface      *iface;
        tAdapter        *card;
@@ -241,8 +226,8 @@ int IPStack_AddInterface(const char *Device, const char *Name)
        
        card = IPStack_GetAdapter(Device);
        if( !card ) {
-               LEAVE('i', -1);
-               return -1;      // ERR_YOURBAD
+               LEAVE('n');
+               return NULL;    // ERR_YOURBAD
        }
        
        nameLen = sprintf(NULL, "%i", giIP_NextIfaceId);
@@ -250,16 +235,18 @@ int IPStack_AddInterface(const char *Device, const char *Name)
        iface = malloc(
                sizeof(tInterface)
                + nameLen + 1
-               + IPStack_GetAddressSize(-1)
+               + IPStack_GetAddressSize(-1)*3  // Address, Route->Network, Route->NextHop
                );
        if(!iface) {
-               LEAVE('i', -2);
-               return -2;      // Return ERR_MYBAD
+               LEAVE('n');
+               return NULL;    // Return ERR_MYBAD
        }
        
        iface->Next = NULL;
        iface->Type = 0;        // Unset type
        iface->Address = iface->Name + nameLen + 1;     // Address
+       iface->Route.Network = iface->Address + IPStack_GetAddressSize(-1);
+       iface->Route.NextHop = iface->Route.Network + IPStack_GetAddressSize(-1);
        
        // Create Node
        iface->Node.ImplPtr = iface;
@@ -282,8 +269,8 @@ int IPStack_AddInterface(const char *Device, const char *Name)
        iface->Adapter = IPStack_GetAdapter(Device);
        if( !iface->Adapter ) {
                free( iface );
-               LEAVE('i', -1);
-               return -1;      // Return ERR_YOUFAIL
+               LEAVE('n');
+               return NULL;    // Return ERR_YOUFAIL
        }
        
        // Delay setting ImplInt until after the adapter is opened
@@ -306,8 +293,8 @@ int IPStack_AddInterface(const char *Device, const char *Name)
 //     gIP_DriverInfo.RootNode.Size ++;
        
        // Success!
-       LEAVE('i', iface->Node.ImplInt);
-       return iface->Node.ImplInt;
+       LEAVE('p', iface);
+       return iface;
 }
 
 /**
@@ -381,23 +368,7 @@ int IPStack_Iface_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_Iface, (char*)Data );
-               LEAVE('i', tmp);
-               return tmp;
+       BASE_IOCTLS(DRV_TYPE_MISC, "IPStack", VERSION, casIOCtls_Iface)
        
        /*
         * getset_type

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