6cc7630f36
* The DHCPClient is now added to its looper before doing the negotiation, so that it's BMessenger is already valid. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19478 a95241bf-73f2-0310-859d-f6bbb57e9c96
101 lines
1.9 KiB
C++
101 lines
1.9 KiB
C++
/*
|
|
* Copyright 2006, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Axel Dörfler, axeld@pinc-software.de
|
|
*/
|
|
|
|
|
|
#include "AutoconfigLooper.h"
|
|
#include "DHCPClient.h"
|
|
#include "NetServer.h"
|
|
|
|
#include <errno.h>
|
|
#include <net/if_dl.h>
|
|
#include <net/if_types.h>
|
|
#include <stdio.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/sockio.h>
|
|
|
|
|
|
static const uint32 kMsgReadyToRun = 'rdyr';
|
|
|
|
|
|
AutoconfigLooper::AutoconfigLooper(BMessenger target, const char* device)
|
|
: BLooper(device),
|
|
fTarget(target),
|
|
fDevice(device)
|
|
{
|
|
BMessage ready(kMsgReadyToRun);
|
|
PostMessage(&ready);
|
|
}
|
|
|
|
|
|
AutoconfigLooper::~AutoconfigLooper()
|
|
{
|
|
}
|
|
|
|
|
|
void
|
|
AutoconfigLooper::_ReadyToRun()
|
|
{
|
|
// start with DHCP
|
|
|
|
DHCPClient* client = new DHCPClient(fTarget, fDevice.String());
|
|
AddHandler(client);
|
|
|
|
if (client->Initialize() == B_OK)
|
|
return;
|
|
|
|
RemoveHandler(client);
|
|
delete client;
|
|
|
|
puts("DHCP failed miserably!");
|
|
|
|
// DHCP obviously didn't work out, take some default values for now
|
|
// TODO: have a look at zeroconf
|
|
// TODO: this could also be done add-on based
|
|
|
|
BMessage interface;
|
|
interface.AddString("device", fDevice.String());
|
|
|
|
uint8 mac[6];
|
|
uint8 last = 56;
|
|
if (get_mac_address(fDevice.String(), mac) == B_OK) {
|
|
// choose IP address depending on the MAC address, if available
|
|
last = mac[0] ^ mac[1] ^ mac[2] ^ mac[3] ^ mac[4] ^ mac[5];
|
|
if (last > 253)
|
|
last = 253;
|
|
else if (last == 0)
|
|
last = 1;
|
|
}
|
|
|
|
char string[64];
|
|
snprintf(string, sizeof(string), "192.168.0.%u", last);
|
|
|
|
BMessage address;
|
|
address.AddString("family", "inet");
|
|
address.AddString("address", string);
|
|
address.AddString("gateway", "192.168.0.254");
|
|
interface.AddMessage("address", &address);
|
|
|
|
fTarget.SendMessage(kMsgConfigureInterface, &interface);
|
|
}
|
|
|
|
|
|
void
|
|
AutoconfigLooper::MessageReceived(BMessage* message)
|
|
{
|
|
switch (message->what) {
|
|
case kMsgReadyToRun:
|
|
_ReadyToRun();
|
|
break;
|
|
|
|
default:
|
|
BLooper::MessageReceived(message);
|
|
break;
|
|
}
|
|
}
|
|
|