Ticket #2531: dhcp.3.2.diff

File dhcp.3.2.diff, 6.5 KB (added by Adek336, 15 years ago)
  • src/servers/net/DHCPClient.cpp

     
    2121#include <sys/time.h>
    2222
    2323
     24#define LND do { ktrace_printf("DHCP: %s: %s: %d\n", __FILE__, __func__, __LINE__); } while(0)
     25
     26void trace_dhcp_state(dhcp_state state)
     27{
     28    char *state_name=NULL;
     29    switch(state)
     30    {
     31        case INIT: state_name = "INIT"; break;
     32        case REQUESTING: state_name = "REQUESTING"; break;
     33        case BOUND: state_name = "BOUND"; break;
     34        case RENEWAL: state_name="RENEWAL"; break;
     35        case REBINDING: state_name="REBINDING"; break;
     36        case ACKNOWLEDGED: state_name="ACKNOWLEDGED"; break;
     37        default: break;
     38    }
     39    if (state_name == NULL)
     40        ktrace_printf("DHCP: state 0x%x\n", (unsigned)state);
     41    else
     42        ktrace_printf("DHCP: state %s\n", state_name);
     43}
     44
    2445// See RFC 2131 for DHCP, see RFC 1533 for BOOTP/DHCP options
    2546
    2647#define DHCP_CLIENT_PORT    68
     
    336357    fRunner(NULL),
    337358    fLeaseTime(0)
    338359{
     360    LND;
    339361    fStartTime = system_time();
    340362    fTransactionID = (uint32)fStartTime;
    341363
    342364    fStatus = get_mac_address(device, fMAC);
    343     if (fStatus < B_OK)
     365    if (fStatus < B_OK) {
     366        LND;
    344367        return;
     368    }
    345369
    346370    memset(&fServer, 0, sizeof(struct sockaddr_in));
    347371    fServer.sin_family = AF_INET;
    348372    fServer.sin_len = sizeof(struct sockaddr_in);
    349373    fServer.sin_port = htons(DHCP_SERVER_PORT);
     374    LND;
    350375}
    351376
    352377
    353378DHCPClient::~DHCPClient()
    354379{
     380    LND;
    355381    if (fStatus != B_OK)
    356382        return;
    357383
     
    374400status_t
    375401DHCPClient::Initialize()
    376402{
     403    LND;
     404    trace_dhcp_state(INIT);
    377405    fStatus = _Negotiate(INIT);
    378406    printf("DHCP for %s, status: %s\n", fDevice.String(), strerror(fStatus));
    379407    return fStatus;
    380408}
    381409
    382 
    383410status_t
    384411DHCPClient::_Negotiate(dhcp_state state)
    385412{
     413    LND;
     414    trace_dhcp_state(state);
    386415    int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
    387416    if (socket < 0)
    388417        return errno;
     
    453482
    454483    // receive loop until we've got an offer and acknowledged it
    455484
     485    LND;
     486
    456487    while (state != ACKNOWLEDGED) {
     488        LND;
     489        trace_dhcp_state(state);
    457490        char buffer[2048];
    458491        ssize_t bytesReceived = recvfrom(socket, buffer, sizeof(buffer),
    459492            0, NULL, NULL);
    460493        if (bytesReceived < 0 && errno == B_TIMED_OUT) {
     494            LND;
    461495            // depending on the state, we'll just try again
    462496            if (!_TimeoutShift(socket, timeout, tries)) {
     497                LND;
    463498                close(socket);
    464499                return B_TIMED_OUT;
    465500            }
     
    467502            if (state == INIT)
    468503                status = _SendMessage(socket, discover, broadcast);
    469504            else {
     505                LND;
    470506                status = _SendMessage(socket, request, state != RENEWAL
    471507                    ? broadcast : fServer);
    472508            }
    473509
    474510            if (status < B_OK)
    475511                break;
     512            LND;
    476513        } else if (bytesReceived < B_OK)
    477514            break;
     515        LND;
    478516
    479517        dhcp_message *message = (dhcp_message *)buffer;
    480518        if (message->transaction_id != htonl(fTransactionID)
    481519            || !message->HasOptions()
    482520            || memcmp(message->mac_address, discover.mac_address,
    483521                discover.hardware_address_length)) {
     522            LND;
    484523            // this message is not for us
    485524            continue;
    486525        }
     
    488527        switch (message->Type()) {
    489528            case DHCP_NONE:
    490529            default:
     530                LND;
    491531                // ignore this message
    492532                break;
    493533
    494534            case DHCP_OFFER:
    495535            {
     536                LND;
    496537                // first offer wins
    497538                if (state != INIT)
    498539                    break;
     
    526567
    527568            case DHCP_ACK:
    528569            {
     570                LND;
     571                trace_dhcp_state(state);
    529572                if (state != REQUESTING && state != REBINDING
    530573                    && state != RENEWAL)
    531574                    continue;
     575                LND;
    532576
    533577                // TODO: we might want to configure the stuff, don't we?
    534578                BMessage address;
     
    548592            }
    549593
    550594            case DHCP_NACK:
     595            LND;
    551596                if (state != REQUESTING)
    552597                    continue;
     598                LND;
    553599
    554600                // try again (maybe we should prefer other servers if this
    555601                // happens more than once)
     
    559605                break;
    560606        }
    561607    }
     608    LND;
     609    trace_dhcp_state(state);
    562610
    563611    close(socket);
    564612
     
    582630        fRenewalTime = (fLeaseTime - now) * 2/3 + now;
    583631        fRebindingTime = (fLeaseTime - now) * 5/6 + now;
    584632    }
     633    LND;
    585634
    586635    return status;
    587636}
     
    819868            dhcp_state state = _CurrentState();
    820869
    821870            bigtime_t next;
     871            LND;
     872            trace_dhcp_state(state);
    822873            if (_Negotiate(state) == B_OK) {
    823874                switch (state) {
    824875                    case RENEWAL:
  • src/servers/net/NetServer.cpp

     
    3737#include <string.h>
    3838#include <unistd.h>
    3939
     40#define LND do { ktrace_printf("DHCP: %s: %s: %d\n", __FILE__, __func__, __LINE__); } while(0)
    4041
     42
    4143static const char *kSignature = "application/x-vnd.haiku-net_server";
    4244
    4345
     
    485487status_t
    486488NetServer::_ConfigureInterface(int socket, BMessage& interface, bool fromMessage)
    487489{
     490    LND;
     491
    488492    const char *device;
    489493    if (interface.FindString("device", &device) != B_OK)
    490494        return B_BAD_VALUE;
     
    675679        }
    676680    }
    677681
     682    LND;
    678683    if (startAutoConfig) {
    679684        // start auto configuration
     685        LND;
    680686        AutoconfigLooper* looper = new AutoconfigLooper(this, device);
    681687        looper->Run();
    682688
     
    725731    address.AddBool("auto config", true);
    726732    interface.AddMessage("address", &address);
    727733
     734    LND;
     735
    728736    return _ConfigureInterface(socket, interface);
    729737}
    730738
     
    746754            continue;
    747755
    748756        if (S_ISBLK(stat.st_mode) || S_ISCHR(stat.st_mode)) {
     757            LND;
    749758            if (suggestedInterface != NULL
    750759                && suggestedInterface->RemoveName("device") == B_OK
    751760                && suggestedInterface->AddString("device", path.Path()) == B_OK
     
    782791            }
    783792        }
    784793
     794        LND;
    785795        _ConfigureInterface(socket, interface);
    786796    }
    787797}
     
    817827        address.AddString("address", "127.0.0.1");
    818828        interface.AddMessage("address", &address);
    819829
     830        LND;
    820831        _ConfigureInterface(socket, interface);
    821832    }
    822833
  • src/servers/net/AutoconfigLooper.cpp

     
    1818#include <sys/socket.h>
    1919#include <sys/sockio.h>
    2020
     21#define LND do { ktrace_printf("DHCP: %s: %s: %d\n", __FILE__, __func__, __LINE__); } while(0)
    2122
     23
    2224static const uint32 kMsgReadyToRun = 'rdyr';
    2325
    2426
     
    2729    fTarget(target),
    2830    fDevice(device)
    2931{
     32    LND;
    3033    BMessage ready(kMsgReadyToRun);
    3134    PostMessage(&ready);
    3235}
     
    4043void
    4144AutoconfigLooper::_ReadyToRun()
    4245{
     46    LND;
    4347    ifreq request;
    4448    if (!prepare_request(request, fDevice.String()))
    4549        return;
     50    LND;
    4651
    4752    // set IFF_CONFIGURING flag on interface
    4853
     
    5863    close(socket);
    5964
    6065    // start with DHCP
     66    LND;
    6167
    6268    DHCPClient* client = new DHCPClient(fTarget, fDevice.String());
    6369    AddHandler(client);