Misc Changes
[tpg/acess2.git] / Modules / IPStack / main.c
index 60bc787..9b132ec 100644 (file)
 
 // === IMPORTS ===
 extern int     ARP_Initialise();
+extern void    UDP_Initialise();
+extern void    TCP_Initialise();
 extern int     IPv4_Initialise();
 extern int     IPv4_Ping(tInterface *Iface, tIPv4 Addr);
+extern int     IPv6_Initialise();
+//extern int   IPv6_Ping(tInterface *Iface, tIPv6 Addr);
 
 // === PROTOTYPES ===
  int   IPStack_Install(char **Arguments);
@@ -63,9 +67,14 @@ int IPStack_Install(char **Arguments)
 {
         int    i = 0;
        
-       // Install Handlers
+       // Layer 2 - Data Link Layer
        ARP_Initialise();
+       // Layer 3 - Network Layer
        IPv4_Initialise();
+       IPv6_Initialise();
+       // Layer 4 - Transport Layer
+       TCP_Initialise();
+       UDP_Initialise();
        
        if(Arguments)
        {
@@ -80,7 +89,7 @@ int IPStack_Install(char **Arguments)
        
        DevFS_AddDevice( &gIP_DriverInfo );
        
-       return 1;
+       return MODULE_ERR_OK;
 }
 
 /**
@@ -88,6 +97,7 @@ int IPStack_Install(char **Arguments)
  */
 int IPStack_AddFile(tSocketFile *File)
 {
+       Log("IPStack_AddFile: %s", File->Name);
        File->Next = gIP_FileTemplates;
        gIP_FileTemplates = File;
        return 0;
@@ -111,26 +121,24 @@ char *IPStack_Root_ReadDir(tVFS_Node *Node, int Pos)
                return NULL;
        }
        
-       name = malloc(6);
-       name[0] = 'i';
-       name[1] = 'p';
+       name = malloc(4);
        
        // Create the name
        Pos = iface->Node.ImplInt;
        if(Pos < 10) {
-               name[2] = '0' + Pos;
-               name[3] = '\0';
+               name[0] = '0' + Pos;
+               name[1] = '\0';
        }
        else if(Pos < 100) {
-               name[2] = '0' + Pos/10;
-               name[3] = '0' + Pos%10;
-               name[4] = '\0';
+               name[0] = '0' + Pos/10;
+               name[1] = '0' + Pos%10;
+               name[2] = '\0';
        }
        else {
-               name[2] = '0' + Pos/100;
-               name[3] = '0' + (Pos/10)%10;
-               name[4] = '0' + Pos%10;
-               name[5] = '\0';
+               name[0] = '0' + Pos/100;
+               name[1] = '0' + (Pos/10)%10;
+               name[2] = '0' + Pos%10;
+               name[3] = '\0';
        }
        
        LEAVE('s', name);
@@ -148,12 +156,7 @@ tVFS_Node *IPStack_Root_FindDir(tVFS_Node *Node, char *Name)
        
        ENTER("pNode sName", Node, Name);
        
-       if(Name[0] != 'i' || Name[1] != 'p') {
-               LEAVE('n');
-               return NULL;
-       }
-       
-       i = 2;  num = 0;
+       i = 0;  num = 0;
        while('0' <= Name[i] && Name[i] <= '9')
        {
                num *= 10;
@@ -227,7 +230,10 @@ int IPStack_Root_IOCtl(tVFS_Node *Node, int ID, void *Data)
 char *IPStack_Iface_ReadDir(tVFS_Node *Node, int Pos)
 {
        tSocketFile     *file = gIP_FileTemplates;
-       while(Pos-- && file)    file = file->Next;
+       while(Pos-- && file) {
+               Log("IPStack_Iface_ReadDir: %s", file->Name);
+               file = file->Next;
+       }
        
        if(!file)       return NULL;
        
@@ -245,6 +251,7 @@ tVFS_Node *IPStack_Iface_FindDir(tVFS_Node *Node, char *Name)
        for(;file;file = file->Next)
        {
                if( strcmp(file->Name, Name) == 0 )     break;
+               Log("IPStack_Iface_FindDir: strcmp('%s', '%s')", file->Name, Name);
        }
        if(!file)       return NULL;
        
@@ -261,6 +268,7 @@ static const char *casIOCtls_Iface[] = {
        "get_address", "set_address",
        "getset_subnet",
        "get_gateway", "set_gateway",
+       "get_device",
        "ping",
        NULL
        };
@@ -458,11 +466,23 @@ int IPStack_Iface_IOCtl(tVFS_Node *Node, int ID, void *Data)
                }
                break;
        
+       /*
+        * get_device
+        * - Gets the name of the attached device
+        */
+       case 10:
+               if( Data == NULL )
+                       LEAVE_RET('i', iface->Adapter->DeviceLen);
+               if( !CheckMem( Data, iface->Adapter->DeviceLen+1 ) )
+                       LEAVE_RET('i', -1);
+               strcpy( Data, iface->Adapter->Device );
+               return iface->Adapter->DeviceLen;
+       
        /*
         * ping
         * - Send an ICMP Echo
         */
-       case 10:
+       case 11:
                switch(iface->Type)
                {
                case 0:
@@ -509,7 +529,7 @@ int IPStack_AddInterface(char *Device)
        iface->Node.ImplPtr = iface;
        iface->Node.ImplInt = giIP_NextIfaceId++;
        iface->Node.Flags = VFS_FFLAG_DIRECTORY;
-       iface->Node.Size = 0;
+       iface->Node.Size = -1;
        iface->Node.NumACLs = 1;
        iface->Node.ACLs = &gVFS_ACL_EveryoneRX;
        iface->Node.ReadDir = IPStack_Iface_ReadDir;
@@ -581,6 +601,7 @@ tAdapter *IPStack_GetAdapter(char *Path)
        // Fill Structure
        strcpy( dev->Device, Path );
        dev->NRef = 1;
+       dev->DeviceLen = strlen(Path);
        
        // Open Device
        dev->DeviceFD = VFS_Open( dev->Device, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE );

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