* DHCP now actually uses the new SO_BINDTODEVICE socket option to make sure

the request is sent only on the device it should.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28017 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2008-10-12 23:34:08 +00:00
parent 94b1f00114
commit 36bde12db2
2 changed files with 22 additions and 9 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2006-2007, Haiku, Inc. All Rights Reserved.
* Copyright 2006-2008, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -17,6 +17,7 @@
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/sockio.h>
#include <sys/time.h>
@ -408,6 +409,24 @@ DHCPClient::_Negotiate(dhcp_state state)
int option = 1;
setsockopt(socket, SOL_SOCKET, SO_BROADCAST, &option, sizeof(option));
if (state == INIT) {
// The local interface does not have an address yet, bind the socket
// to the device directly.
int linkSocket = ::socket(AF_LINK, SOCK_DGRAM, 0);
if (linkSocket >= 0) {
// we need to know the index of the device to be able to bind to it
ifreq request;
prepare_request(request, fDevice.String());
if (ioctl(linkSocket, SIOCGIFINDEX, &request, sizeof(struct ifreq))
== 0) {
setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE,
&request.ifr_index, sizeof(int));
}
close(linkSocket);
}
}
bigtime_t previousLeaseTime = fLeaseTime;
fLeaseTime = 0;
fRenewalTime = 0;

View File

@ -588,14 +588,8 @@ NetServer::_ConfigureInterface(int socket, BMessage& interface, bool fromMessage
request.ifr_route = route;
if (autoConfig) {
// add a default route to make the interface accessible, even without an address
if (ioctl(socket, SIOCADDRT, &request, sizeof(request)) < 0) {
fprintf(stderr, "%s: Could not add route for %s: %s\n",
Name(), device, strerror(errno));
} else {
_QuitLooperForDevice(device);
startAutoConfig = true;
}
_QuitLooperForDevice(device);
startAutoConfig = true;
} else if (addressMessage.FindString("gateway", &string) == B_OK
&& parse_address(familyIndex, string, gateway)) {
// add gateway route, if we're asked for it