diff --git a/ndhc/arp.c b/ndhc/arp.c index 1ec17c6..41a25f9 100644 --- a/ndhc/arp.c +++ b/ndhc/arp.c @@ -85,7 +85,7 @@ out: return -1; } -static void arp_close_fd(struct client_state_t *cs) +void arp_close_fd(struct client_state_t *cs) { if (cs->arpFd == -1) return; diff --git a/ndhc/arp.h b/ndhc/arp.h index bdcb2df..c661a88 100644 --- a/ndhc/arp.h +++ b/ndhc/arp.h @@ -49,6 +49,7 @@ struct arpMsg { uint8_t pad[18]; /* 2a pad for min. ethernet payload (60 bytes) */ }; +void arp_close_fd(struct client_state_t *cs); int arp_check(struct client_state_t *cs, struct dhcpmsg *packet); int arp_gw_check(struct client_state_t *cs); int arp_get_gw_hwaddr(struct client_state_t *cs); diff --git a/ndhc/state.c b/ndhc/state.c index 624a7b8..5cbbf42 100644 --- a/ndhc/state.c +++ b/ndhc/state.c @@ -23,6 +23,7 @@ static void renewing_timeout(struct client_state_t *cs); static void rebinding_timeout(struct client_state_t *cs); static void renew_requested_timeout(struct client_state_t *cs); static void released_timeout(struct client_state_t *cs); +static void anfrelease(struct client_state_t *cs); static void nfrelease(struct client_state_t *cs); static void frelease(struct client_state_t *cs); static void frenew(struct client_state_t *cs); @@ -43,7 +44,7 @@ dhcp_state_t dhcp_states[] = { { an_packet, renewing_timeout, frenew, nfrelease}, // RENEWING { an_packet, rebinding_timeout, frenew, nfrelease}, // REBINDING { 0, arp_gw_failed, frenew, frelease}, // ARP_GW_CHECK XXX - { 0, arp_success, frenew, nfrelease}, // ARP_CHECK + { 0, arp_success, frenew, anfrelease}, // ARP_CHECK { an_packet, renew_requested_timeout, frenew, frelease}, // RENEW_REQUESTED { 0, released_timeout, frenew, frelease}, // RELEASED { 0, 0, 0, 0}, // NUM_STATES @@ -228,12 +229,17 @@ static void selecting_timeout(struct client_state_t *cs) } #undef DELAY_SEC +static void anfrelease(struct client_state_t *cs) +{ + arp_close_fd(cs); + nfrelease(cs); +} + static void nfrelease(struct client_state_t *cs) { - struct in_addr temp_saddr = { .s_addr = cs->serverAddr }; - struct in_addr temp_raddr = { .s_addr = cs->requestedIP }; log_line("Unicasting a release of %s to %s.", - inet_ntoa(temp_raddr), inet_ntoa(temp_saddr)); + inet_ntoa((struct in_addr){.s_addr=cs->requestedIP}), + inet_ntoa((struct in_addr){.s_addr=cs->serverAddr})); send_release(cs->serverAddr, cs->requestedIP); ifchange(NULL, IFCHANGE_DECONFIG); frelease(cs); @@ -242,11 +248,6 @@ static void nfrelease(struct client_state_t *cs) static void frelease(struct client_state_t *cs) { log_line("Entering released state."); - if (cs->dhcpState == DS_ARP_CHECK) { - epoll_del(cs, cs->arpFd); - close(cs->arpFd); - cs->arpFd = -1; - } change_listen_mode(cs, LM_NONE); cs->dhcpState = DS_RELEASED; cs->timeout = -1;