#define VERSION VER2(0,10)
#include "ipstack.h"
#include "link.h"
-#include <tpl_drv_common.h>
-#include <tpl_drv_network.h>
+#include <api_drv_common.h>
+#include <api_drv_network.h>
// === CONSTANTS ===
//! Default timeout value, 30 seconds
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: {
- 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,
+ .Type = &gIP_InterfaceNodeType
},
- Adapter: NULL,
- Type: 0
+ .Adapter = NULL,
+ .Type = 0
};
tShortSpinlock glIP_Interfaces;
tInterface *gIP_Interfaces = NULL;
tSocketFile *gIP_FileTemplates;
tAdapter gIP_LoopAdapter = {
- DeviceLen: 8,
- Device: "LOOPBACK"
+ .DeviceLen = 8,
+ .Device = "LOOPBACK"
};
tMutex glIP_Adapters;
tAdapter *gIP_Adapters = NULL;
// Routing Subdir
if( Pos == 0 ) {
+ LEAVE('s', "routes");
return strdup("routes");
}
// Pseudo Interfaces
if( Pos == 1 ) {
+ LEAVE('s', "lo");
return strdup("lo");
}
Pos -= 2;
// 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 )
return &iface->Node;
}
}
- #endif
LEAVE('p', NULL);
return NULL;
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);
+ 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);
card = IPStack_GetAdapter(Device);
if( !card ) {
+ Log_Debug("IPStack", "Unable to open card '%s'", Device);
LEAVE('n');
return NULL; // ERR_YOURBAD
}
+ IPStack_GetAddressSize(-1)*3 // Address, Route->Network, Route->NextHop
);
if(!iface) {
+ Log_Warning("IPStack", "AddInterface - malloc() failed");
LEAVE('n');
return NULL; // Return ERR_MYBAD
}
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;
// Get adapter handle
- iface->Adapter = IPStack_GetAdapter(Device);
- if( !iface->Adapter ) {
- free( iface );
- LEAVE('n');
- return NULL; // Return ERR_YOUFAIL
- }
+ iface->Adapter = card;
// 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 );
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
// 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 ) {
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
// 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
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
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);
// Ok, so let's open it
dev = malloc( sizeof(tAdapter) + strlen(Path) + 1 );
if(!dev) {
+ Log_Warning("IPStack", "GetAdapter - malloc() failed");
Mutex_Release( &glIP_Adapters );
LEAVE('n');
return NULL;
tmp = VFS_IOCtl(dev->DeviceFD, 0, NULL);
LOG("Device type = %i", tmp);
if( tmp != DRV_TYPE_NETWORK ) {
- Warning("IPStack_GetAdapter: '%s' is not a network interface", dev->Device);
+ Log_Warning("IPStack", "IPStack_GetAdapter: '%s' is not a network interface", dev->Device);
VFS_Close( dev->DeviceFD );
free( dev );
Mutex_Release( &glIP_Adapters );