Now checks if a valid configuration was found, and if that's not the case, it
will automatically configure the stack - without DHCP for now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19084 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -11,7 +11,9 @@
|
|||||||
|
|
||||||
#include <Alert.h>
|
#include <Alert.h>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
|
#include <Directory.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
|
#include <Path.h>
|
||||||
#include <TextView.h>
|
#include <TextView.h>
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
@@ -24,6 +26,7 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
@@ -37,7 +40,10 @@ class NetServer : public BApplication {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool _PrepareRequest(ifreq& request, const char* name);
|
bool _PrepareRequest(ifreq& request, const char* name);
|
||||||
|
bool _TestForInterface(int socket, const char* name);
|
||||||
status_t _ConfigureInterface(int socket, BMessage& interface);
|
status_t _ConfigureInterface(int socket, BMessage& interface);
|
||||||
|
status_t _ConfigureDevice(int socket, const char* path);
|
||||||
|
void _ConfigureDevices(int socket, const char* path);
|
||||||
void _BringUpInterfaces();
|
void _BringUpInterfaces();
|
||||||
|
|
||||||
Settings fSettings;
|
Settings fSettings;
|
||||||
@@ -164,6 +170,51 @@ NetServer::_PrepareRequest(ifreq& request, const char* name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
NetServer::_TestForInterface(int socket, const char* name)
|
||||||
|
{
|
||||||
|
// get a list of all interfaces
|
||||||
|
|
||||||
|
ifconf config;
|
||||||
|
config.ifc_len = sizeof(config.ifc_value);
|
||||||
|
if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint32 count = (uint32)config.ifc_value;
|
||||||
|
if (count == 0) {
|
||||||
|
// there are no interfaces yet
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *buffer = malloc(count * sizeof(struct ifreq));
|
||||||
|
if (buffer == NULL) {
|
||||||
|
fprintf(stderr, "%s: Out of memory.\n", Name());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
config.ifc_len = count * sizeof(struct ifreq);
|
||||||
|
config.ifc_buf = buffer;
|
||||||
|
if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ifreq *interface = (ifreq *)buffer;
|
||||||
|
int32 nameLength = strlen(name);
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < count; i++) {
|
||||||
|
if (!strncmp(interface->ifr_name, name, nameLength)) {
|
||||||
|
success = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface = (ifreq *)((addr_t)interface + IF_NAMESIZE + interface->ifr_addr.sa_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
NetServer::_ConfigureInterface(int socket, BMessage& interface)
|
NetServer::_ConfigureInterface(int socket, BMessage& interface)
|
||||||
{
|
{
|
||||||
@@ -356,6 +407,45 @@ NetServer::_ConfigureInterface(int socket, BMessage& interface)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
NetServer::_ConfigureDevice(int socket, const char* path)
|
||||||
|
{
|
||||||
|
BMessage interface;
|
||||||
|
interface.AddString("device", path);
|
||||||
|
|
||||||
|
// TODO: enable DHCP instead
|
||||||
|
BMessage address;
|
||||||
|
address.AddString("family", "inet");
|
||||||
|
address.AddString("address", "192.168.0.56");
|
||||||
|
interface.AddMessage("address", &address);
|
||||||
|
|
||||||
|
return _ConfigureInterface(socket, interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
NetServer::_ConfigureDevices(int socket, const char* startPath)
|
||||||
|
{
|
||||||
|
BDirectory directory(startPath);
|
||||||
|
BEntry entry;
|
||||||
|
while (directory.GetNextEntry(&entry) == B_OK) {
|
||||||
|
char name[B_FILE_NAME_LENGTH];
|
||||||
|
struct stat stat;
|
||||||
|
BPath path;
|
||||||
|
if (entry.GetName(name) != B_OK
|
||||||
|
|| !strcmp(name, "stack")
|
||||||
|
|| entry.GetPath(&path) != B_OK
|
||||||
|
|| entry.GetStat(&stat) != B_OK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (S_ISBLK(stat.st_mode) || S_ISCHR(stat.st_mode))
|
||||||
|
_ConfigureDevice(socket, path.Path());
|
||||||
|
else if (entry.IsDirectory())
|
||||||
|
_ConfigureDevices(socket, path.Path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
NetServer::_BringUpInterfaces()
|
NetServer::_BringUpInterfaces()
|
||||||
{
|
{
|
||||||
@@ -386,10 +476,29 @@ NetServer::_BringUpInterfaces()
|
|||||||
|
|
||||||
// try to bring the interface up
|
// try to bring the interface up
|
||||||
|
|
||||||
status_t status = _ConfigureInterface(socket, interface);
|
_ConfigureInterface(socket, interface);
|
||||||
if (status < B_OK)
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check configuration
|
||||||
|
|
||||||
|
if (!_TestForInterface(socket, "loop")) {
|
||||||
|
// there is no loopback interface, create one
|
||||||
|
interface.MakeEmpty();
|
||||||
|
interface.AddString("device", "loop");
|
||||||
|
BMessage address;
|
||||||
|
address.AddString("family", "inet");
|
||||||
|
address.AddString("address", "127.0.0.1");
|
||||||
|
interface.AddMessage("address", &address);
|
||||||
|
|
||||||
|
_ConfigureInterface(socket, interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_TestForInterface(socket, "/dev/net/")) {
|
||||||
|
// there is no driver configured - see if there is one and try to use it
|
||||||
|
_ConfigureDevices(socket, "/dev/net");
|
||||||
|
}
|
||||||
|
|
||||||
|
close(socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user