* \param VAddr Base address to check
* \return 1 if the memory is all user-accessable, 0 otherwise
*/
-#define MM_IsUser(VAddr) (!(MM_GetFlags((VAddr))&MM_PFLAG_KERNEL))
+#define MM_IsUser(VAddr) (!(MM_GetFlags((tVAddr)(VAddr))&MM_PFLAG_KERNEL))
/**
* \brief Temporarily map a page into the address space
* \param PAddr Physical addres to map
int IPStack_Root_IOCtl(tVFS_Node *Node, int ID, void *Data);
int IPStack_AddFile(tSocketFile *File);
-tInterface *IPStack_AddInterface(const char *Device, const char *Name);
+tInterface *IPStack_AddInterface(const char *Device, int Type, const char *Name);
int IPStack_Iface_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]);
tVFS_Node *IPStack_Iface_FindDir(tVFS_Node *Node, const char *Name);
}
// Create the name
- Pos = iface->Node.ImplInt;
- snprintf(Dest, FILENAME_MAX, "%i", Pos);
+ strncpy(Dest, iface->Name, FILENAME_MAX);
LEAVE('i', 0);
return 0;
/*
* add_interface
- * - Adds a new IP interface and binds it to a device
+ * - Adds a new 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;
- }
+ case 4: {
+ const struct {
+ const char *Device;
+ const char *Name;
+ int Type;
+ } *ifinfo = Data;
+
+ if( Threads_GetUID() != 0 )
+ LEAVE_RET('i', -1);
+ if( !CheckMem(ifinfo, sizeof(*ifinfo)) )
+ LEAVE_RET('i', -1);
+ if( !MM_IsUser(ifinfo->Device) || !CheckString( ifinfo->Device ) )
+ LEAVE_RET('i', -1);
+ if( !MM_IsUser(ifinfo->Name) || !CheckString( ifinfo->Name ) )
+ LEAVE_RET('i', -1);
+
+ LOG("New interface of type %i for '%s' named '%s'",
+ ifinfo->Type, ifinfo->Device, ifinfo->Name);
+ tInterface *iface = IPStack_AddInterface(ifinfo->Device, ifinfo->Type, ifinfo->Name);
+ if(iface == NULL) LEAVE_RET('i', -1);
+
+ tmp = iface->Node.ImplInt;
LEAVE_RET('i', tmp);
+ }
}
LEAVE('i', 0);
return 0;
* \fn tInterface *IPStack_AddInterface(char *Device)
* \brief Adds an interface to the list
*/
-tInterface *IPStack_AddInterface(const char *Device, const char *Name)
+tInterface *IPStack_AddInterface(const char *Device, int Type, const char *Name)
{
tInterface *iface;
tAdapter *card;
- int nameLen;
+ int nameLen, addrsize;
ENTER("sDevice", Device);
+ // Check address type
+ addrsize = IPStack_GetAddressSize(Type);
+ if( addrsize == -1 ) {
+ Log_Debug("IPStack", "Bad address type %i", Type);
+ return NULL;
+ }
+
+ // Open card
card = Adapter_GetByName(Device);
if( !card ) {
Log_Debug("IPStack", "Unable to open card '%s'", Device);
LEAVE('n');
return NULL; // ERR_YOURBAD
}
-
- nameLen = sprintf(NULL, "%i", giIP_NextIfaceId);
-
+
+ // Get name length
+ if( Name[0] )
+ {
+ nameLen = strlen(Name);
+ }
+ else
+ {
+ nameLen = sprintf(NULL, "%i", giIP_NextIfaceId);
+ }
+
iface = malloc(
sizeof(tInterface)
+ nameLen + 1
- + IPStack_GetAddressSize(-1)*3 // Address, Route->Network, Route->NextHop
+ + addrsize*3 // Address, Route->Network, Route->NextHop
);
if(!iface) {
Log_Warning("IPStack", "AddInterface - malloc() failed");
+ // TODO: Close card
LEAVE('n');
return NULL; // Return ERR_MYBAD
}
iface->Next = NULL;
- iface->Type = 0; // Unset type
+ iface->Type = Type; // Unset type
iface->Address = iface->Name + nameLen + 1; // Address
+ memset(iface->Address, 0, addrsize);
memset(&iface->Route, 0, sizeof(iface->Route));
- iface->Route.Network = iface->Address + IPStack_GetAddressSize(-1);
- iface->Route.NextHop = iface->Route.Network + IPStack_GetAddressSize(-1);
+ iface->Route.Network = iface->Address + addrsize;
+ memset(iface->Route.Network, 0, addrsize);
+ iface->Route.NextHop = iface->Route.Network + addrsize;
+ memset(iface->Route.NextHop, 0, addrsize);
// Create Node
iface->Node.ImplPtr = iface;
// Get adapter handle
iface->Adapter = card;
- // Delay setting ImplInt until after the adapter is opened
- // Keeps things simple
- iface->Node.ImplInt = giIP_NextIfaceId++;
- sprintf(iface->Name, "%i", (int)iface->Node.ImplInt);
+ // Set name
+ if( Name[0] )
+ {
+ iface->Node.ImplInt = 0;
+ strcpy(iface->Name, Name);
+ }
+ else
+ {
+ iface->Node.ImplInt = giIP_NextIfaceId++;
+ sprintf(iface->Name, "%i", (int)iface->Node.ImplInt);
+ }
// Append to list
SHORTLOCK( &glIP_Interfaces );
}
SHORTREL( &glIP_Interfaces );
-// gIP_DriverInfo.RootNode.Size ++;
-
// Success!
LEAVE('p', iface);
return iface;
// Set Type?
if( Data )
{
+#if 0
// Ok, it's set type
if( Threads_GetUID() != 0 ) {
LOG("Attempt by non-root to alter an interface (%i)", Threads_GetUID());
// Clear address
memset(iface->Address, 0, size);
+#endif
+ Log_Notice("IPStack", "Interface ioctl(settype) no longer usable");
}
LEAVE('i', iface->Type);
return iface->Type;
-
+/*
+ * Acess2 IP Stack
+ * - By John Hodge
+ *
+ * interface.h
+ * - Interface manipulation/access definitions
+ */
#ifndef _IPSTACK__INTERFACE_H_
#define _IPSTACK__INTERFACE_H_
extern tInterface gIP_LoopInterface;
extern tVFS_NodeType gIP_RootNodeType;
-extern tInterface *IPStack_AddInterface(const char *Device, const char *Name);
+extern tInterface *IPStack_AddInterface(const char *Device, int Type, const char *Name);
#endif
fprintf(stderr, "ERROR: Unable to open '/Devices/ip'\n");
return -1;
}
- Iface->Num = _SysIOCtl(fd, 4, (void*)Iface->Adapter); // Create interface
+ struct {
+ const char *Device;
+ const char *Name;
+ int Type;
+ } ifinfo;
+ ifinfo.Device = Iface->Adapter;
+ ifinfo.Name = "";
+ ifinfo.Type = 4;
+ Iface->Num = _SysIOCtl(fd, 4, &ifinfo); // Create interface
if( Iface->Num == -1 ) {
fprintf(stderr, "ERROR: Unable to create new interface\n");
return -1;
fprintf(stderr, "ERROR: Unable to open '%s'\n", path);
return -1;
}
- tmp = 4; _SysIOCtl(fd, 4, &tmp); // Set to IPv4
_SysIOCtl(fd, 6, addr); // Set address to 0.0.0.0
tmp = 0; _SysIOCtl(fd, 7, &tmp); // Set subnet mask to 0
}
tmp = 68; _SysIOCtl(fd, 4, &tmp); // Local port
tmp = 67; _SysIOCtl(fd, 5, &tmp); // Remote port
- tmp = 0; _SysIOCtl(fd, 7, &tmp); // Remote addr mask bits - we don't care where the reply comes from
+ tmp = 0; _SysIOCtl(fd, 7, &tmp); // Remote addr mask bits - we don't care where the reply comes from
addr[0] = addr[1] = addr[2] = addr[3] = 255; // 255.255.255.255
_SysIOCtl(fd, 8, addr); // Remote address
// === PROTOTYPES ===
int Addr_main(int argc, char *argv[]);
- int AddInterface(const char *Device);
- int SetAddress(int IFNum, const char *Address);
+ int AddInterface(const char *Device, int Type);
+ int SetAddress(int IFNum, const void *Address, int SubnetSize);
void DumpInterfaces(void);
void DumpInterface(const char *Name);
void DumpRoute(const char *Name);
}
else if( strcmp(argv[1], "add") == 0 )
{
+ uint8_t addr[16];
+ int type, subnet_size;
+
+ // Check argument counts
if( argc - 2 < 2 ) {
- fprintf(stderr, "ERROR: '%s add' requires two arguments, %i passed\n", argv[0], argc-2);
+ fprintf(stderr, "ERROR: '%s add' requires two arguments, %i passed\n",
+ argv[0], argc-2);
PrintUsage(argv[0]);
return -1;
}
- ret = AddInterface( argv[2] );
+
+ // Parse IP Address
+ type = ParseIPAddress(argv[3], addr, &subnet_size);
+ if(type == 0) {
+ fprintf(stderr, "'%s' cannot be parsed as an IP address\n", argv[3]);
+ return -1;
+ }
+
+ // Fun
+ ret = AddInterface( argv[2], type );
if(ret < 0) return ret;
- ret = SetAddress( ret, argv[3] );
+ ret = SetAddress( ret, addr, subnet_size );
return ret;
}
// Delete an interface
* \brief Create a new interface using the passed device
* \param Device Network device to bind to
*/
-int AddInterface(const char *Device)
+int AddInterface(const char *Device, int Type)
{
int dp, ret;
dp = _SysOpen(IPSTACK_ROOT, OPENFLAG_READ);
- ret = _SysIOCtl(dp, 4, (void*)Device);
+ struct {
+ const char *Dev;
+ const char *Name;
+ int Type;
+ } ifinfo;
+ ifinfo.Dev = Device;
+ ifinfo.Name = "";
+ ifinfo.Type = Type;
+ ret = _SysIOCtl(dp, 4, &ifinfo);
_SysClose(dp);
if( ret < 0 ) {
/**
* \brief Set the address on an interface from a textual IP address
*/
-int SetAddress(int IFNum, const char *Address)
+int SetAddress(int IFNum, const void *Address, int SubnetSize)
{
- uint8_t addr[16];
- int type;
char path[sizeof(IPSTACK_ROOT)+1+5+1]; // ip000
- int tmp, fd, subnet;
-
- // Parse IP Address
- type = ParseIPAddress(Address, addr, &subnet);
- if(type == 0) {
- fprintf(stderr, "'%s' cannot be parsed as an IP address\n", Address);
- return -1;
- }
+ int fd;
// Open file
sprintf(path, IPSTACK_ROOT"/%i", IFNum);
return -1;
}
- tmp = type;
- tmp = _SysIOCtl(fd, _SysIOCtl(fd, 3, "getset_type"), &tmp);
- if( tmp != type ) {
- fprintf(stderr, "Error in setting address type (got %i, expected %i)\n", tmp, type);
- _SysClose(fd);
- return -1;
- }
// Set Address
- _SysIOCtl(fd, _SysIOCtl(fd, 3, "set_address"), addr);
+ _SysIOCtl(fd, _SysIOCtl(fd, 3, "set_address"), (void*)Address);
// Set Subnet
- _SysIOCtl(fd, _SysIOCtl(fd, 3, "getset_subnet"), &subnet);
+ _SysIOCtl(fd, _SysIOCtl(fd, 3, "getset_subnet"), &SubnetSize);
_SysClose(fd);