Simplify the ifchange API.
This commit is contained in:
14
ndhc/arp.c
14
ndhc/arp.c
@ -1,5 +1,5 @@
|
|||||||
/* arp.c - arp ping checking
|
/* arp.c - arp ping checking
|
||||||
* Time-stamp: <2011-07-04 20:17:51 njk>
|
* Time-stamp: <2011-07-04 20:49:18 njk>
|
||||||
*
|
*
|
||||||
* Copyright 2010-2011 Nicholas J. Kain <njkain@gmail.com>
|
* Copyright 2010-2011 Nicholas J. Kain <njkain@gmail.com>
|
||||||
*
|
*
|
||||||
@ -291,6 +291,7 @@ static void arp_switch_state(struct client_state_t *cs, arp_state_t state)
|
|||||||
log_line("DEBUG: arp_switch_state: leaving.");
|
log_line("DEBUG: arp_switch_state: leaving.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Callable from DS_SELECTING, DS_RENEWING, or DS_REBINDING via an_packet()
|
||||||
int arp_check(struct client_state_t *cs, struct dhcpmsg *packet)
|
int arp_check(struct client_state_t *cs, struct dhcpmsg *packet)
|
||||||
{
|
{
|
||||||
arp_switch_state(cs, AS_COLLISION_CHECK);
|
arp_switch_state(cs, AS_COLLISION_CHECK);
|
||||||
@ -304,6 +305,7 @@ int arp_check(struct client_state_t *cs, struct dhcpmsg *packet)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Callable only from DS_BOUND via netlink.c:nl_process_msgs().
|
||||||
int arp_gw_check(struct client_state_t *cs)
|
int arp_gw_check(struct client_state_t *cs)
|
||||||
{
|
{
|
||||||
arp_switch_state(cs, AS_GW_CHECK);
|
arp_switch_state(cs, AS_GW_CHECK);
|
||||||
@ -338,7 +340,7 @@ static void arp_failed(struct client_state_t *cs)
|
|||||||
send_decline(cs, arp_dhcp_packet.yiaddr);
|
send_decline(cs, arp_dhcp_packet.yiaddr);
|
||||||
|
|
||||||
if (cs->arpPrevState != DS_REQUESTING)
|
if (cs->arpPrevState != DS_REQUESTING)
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
cs->dhcpState = DS_SELECTING;
|
cs->dhcpState = DS_SELECTING;
|
||||||
cs->clientAddr = 0;
|
cs->clientAddr = 0;
|
||||||
cs->timeout = 0;
|
cs->timeout = 0;
|
||||||
@ -351,7 +353,7 @@ void arp_gw_failed(struct client_state_t *cs)
|
|||||||
log_line("arp: Gateway appears to have changed, getting new lease");
|
log_line("arp: Gateway appears to have changed, getting new lease");
|
||||||
arp_close_fd(cs);
|
arp_close_fd(cs);
|
||||||
|
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
cs->dhcpState = DS_SELECTING;
|
cs->dhcpState = DS_SELECTING;
|
||||||
cs->oldTimeout = 0;
|
cs->oldTimeout = 0;
|
||||||
cs->timeout = 0;
|
cs->timeout = 0;
|
||||||
@ -371,13 +373,15 @@ void arp_success(struct client_state_t *cs)
|
|||||||
cs->dhcpState = DS_BOUND;
|
cs->dhcpState = DS_BOUND;
|
||||||
cs->init = 0;
|
cs->init = 0;
|
||||||
if (cs->arpPrevState == DS_RENEWING || cs->arpPrevState == DS_REBINDING) {
|
if (cs->arpPrevState == DS_RENEWING || cs->arpPrevState == DS_REBINDING) {
|
||||||
ifchange(&arp_dhcp_packet, IFCHANGE_RENEW); // XXX when does this happen?
|
// XXX We need to be smarter about this and only issue an ifchange if
|
||||||
|
// the lease has actually changed.
|
||||||
|
ifchange_bind(&arp_dhcp_packet);
|
||||||
arp_switch_state(cs, AS_DEFENSE);
|
arp_switch_state(cs, AS_DEFENSE);
|
||||||
} else {
|
} else {
|
||||||
ssize_t ol;
|
ssize_t ol;
|
||||||
uint8_t *od;
|
uint8_t *od;
|
||||||
od = get_option_data(&arp_dhcp_packet, DHCP_ROUTER, &ol);
|
od = get_option_data(&arp_dhcp_packet, DHCP_ROUTER, &ol);
|
||||||
ifchange(&arp_dhcp_packet, IFCHANGE_BOUND);
|
ifchange_bind(&arp_dhcp_packet);
|
||||||
if (ol == 4) {
|
if (ol == 4) {
|
||||||
memcpy(&cs->routerAddr, od, 4);
|
memcpy(&cs->routerAddr, od, 4);
|
||||||
arp_get_gw_hwaddr(cs);
|
arp_get_gw_hwaddr(cs);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* ifchange.c - functions to call the interface change daemon
|
/* ifchange.c - functions to call the interface change daemon
|
||||||
* Time-stamp: <2011-07-04 18:50:59 njk>
|
* Time-stamp: <2011-07-04 20:48:03 njk>
|
||||||
*
|
*
|
||||||
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
||||||
*
|
*
|
||||||
@ -155,7 +155,7 @@ static void sockwrite(int fd, const char *buf, size_t count)
|
|||||||
log_line("sent to ifchd: %s", buf);
|
log_line("sent to ifchd: %s", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deconfig_if(void)
|
void ifchange_deconfig(void)
|
||||||
{
|
{
|
||||||
int sockfd;
|
int sockfd;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
@ -189,7 +189,7 @@ static void send_cmd(int sockfd, struct dhcpmsg *packet, uint8_t code)
|
|||||||
sockwrite(sockfd, buf, strlen(buf));
|
sockwrite(sockfd, buf, strlen(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bound_if(struct dhcpmsg *packet, int mode)
|
void ifchange_bind(struct dhcpmsg *packet)
|
||||||
{
|
{
|
||||||
int sockfd;
|
int sockfd;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
@ -218,25 +218,3 @@ static void bound_if(struct dhcpmsg *packet, int mode)
|
|||||||
|
|
||||||
close(sockfd);
|
close(sockfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifchange(struct dhcpmsg *packet, int mode)
|
|
||||||
{
|
|
||||||
switch (mode) {
|
|
||||||
case IFCHANGE_DECONFIG:
|
|
||||||
deconfig_if();
|
|
||||||
break;
|
|
||||||
case IFCHANGE_BOUND:
|
|
||||||
bound_if(packet, mode);
|
|
||||||
break;
|
|
||||||
case IFCHANGE_RENEW:
|
|
||||||
bound_if(packet, mode);
|
|
||||||
break;
|
|
||||||
case IFCHANGE_NAK:
|
|
||||||
deconfig_if();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log_error("invalid ifchange mode: %d", mode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* ifchange.h - functions to call the interface change daemon
|
/* ifchange.h - functions to call the interface change daemon
|
||||||
* Time-stamp: <2011-03-31 03:44:18 nk>
|
* Time-stamp: <2011-07-04 20:47:58 njk>
|
||||||
*
|
*
|
||||||
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
||||||
*
|
*
|
||||||
@ -21,15 +21,7 @@
|
|||||||
#ifndef IFCHANGE_H_
|
#ifndef IFCHANGE_H_
|
||||||
#define IFCHANGE_H_
|
#define IFCHANGE_H_
|
||||||
|
|
||||||
#include "dhcp.h"
|
void ifchange_bind(struct dhcpmsg *packet);
|
||||||
|
void ifchange_deconfig(void);
|
||||||
enum {
|
|
||||||
IFCHANGE_DECONFIG = 0,
|
|
||||||
IFCHANGE_BOUND = 1,
|
|
||||||
IFCHANGE_RENEW = 2,
|
|
||||||
IFCHANGE_NAK = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
void ifchange(struct dhcpmsg *packet, int mode);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* ndhc.c - DHCP client
|
/* ndhc.c - DHCP client
|
||||||
* Time-stamp: <2011-07-03 17:19:25 njk>
|
* Time-stamp: <2011-07-04 20:49:48 njk>
|
||||||
*
|
*
|
||||||
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
||||||
*
|
*
|
||||||
@ -335,7 +335,7 @@ int main(int argc, char **argv)
|
|||||||
drop_root(uid, gid);
|
drop_root(uid, gid);
|
||||||
|
|
||||||
if (cs.ifsPrevState != IFS_UP)
|
if (cs.ifsPrevState != IFS_UP)
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
|
|
||||||
do_work();
|
do_work();
|
||||||
return EXIT_SUCCESS; // Never reached.
|
return EXIT_SUCCESS; // Never reached.
|
||||||
|
@ -46,7 +46,7 @@ static void restart_if(struct client_state_t *cs)
|
|||||||
{
|
{
|
||||||
log_line("nl: %s back, querying for new lease", client_config.interface);
|
log_line("nl: %s back, querying for new lease", client_config.interface);
|
||||||
// XXX: Same as packet.c - merge somehow?
|
// XXX: Same as packet.c - merge somehow?
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
cs->dhcpState = DS_SELECTING;
|
cs->dhcpState = DS_SELECTING;
|
||||||
cs->timeout = 0;
|
cs->timeout = 0;
|
||||||
cs->clientAddr = 0;
|
cs->clientAddr = 0;
|
||||||
|
10
ndhc/state.c
10
ndhc/state.c
@ -88,7 +88,7 @@ static void lease_timedout(struct client_state_t *cs)
|
|||||||
{
|
{
|
||||||
cs->dhcpState = DS_SELECTING;
|
cs->dhcpState = DS_SELECTING;
|
||||||
log_line("Lease lost, entering init state.");
|
log_line("Lease lost, entering init state.");
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
cs->timeout = 0;
|
cs->timeout = 0;
|
||||||
cs->packetNum = 0;
|
cs->packetNum = 0;
|
||||||
set_listen_raw(cs);
|
set_listen_raw(cs);
|
||||||
@ -173,7 +173,7 @@ static void an_packet(struct client_state_t *cs, struct dhcpmsg *packet,
|
|||||||
// Can transition from DS_ARP_CHECK to DS_BOUND or DS_SELECTING.
|
// Can transition from DS_ARP_CHECK to DS_BOUND or DS_SELECTING.
|
||||||
if (arp_check(cs, packet) == -1) {
|
if (arp_check(cs, packet) == -1) {
|
||||||
log_warning("arp_check failed to make arp socket, retrying lease");
|
log_warning("arp_check failed to make arp socket, retrying lease");
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
cs->dhcpState = DS_SELECTING;
|
cs->dhcpState = DS_SELECTING;
|
||||||
cs->timeout = 30000;
|
cs->timeout = 30000;
|
||||||
cs->clientAddr = 0;
|
cs->clientAddr = 0;
|
||||||
@ -183,9 +183,7 @@ static void an_packet(struct client_state_t *cs, struct dhcpmsg *packet,
|
|||||||
|
|
||||||
} else if (*message == DHCPNAK) {
|
} else if (*message == DHCPNAK) {
|
||||||
log_line("Received DHCP NAK.");
|
log_line("Received DHCP NAK.");
|
||||||
ifchange(packet, IFCHANGE_NAK);
|
ifchange_deconfig();
|
||||||
if (cs->dhcpState != DS_REQUESTING)
|
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
|
||||||
cs->dhcpState = DS_SELECTING;
|
cs->dhcpState = DS_SELECTING;
|
||||||
cs->timeout = 3000;
|
cs->timeout = 3000;
|
||||||
cs->clientAddr = 0;
|
cs->clientAddr = 0;
|
||||||
@ -248,7 +246,7 @@ static void nfrelease(struct client_state_t *cs)
|
|||||||
inet_ntoa((struct in_addr){.s_addr=cs->clientAddr}),
|
inet_ntoa((struct in_addr){.s_addr=cs->clientAddr}),
|
||||||
inet_ntoa((struct in_addr){.s_addr=cs->serverAddr}));
|
inet_ntoa((struct in_addr){.s_addr=cs->serverAddr}));
|
||||||
send_release(cs);
|
send_release(cs);
|
||||||
ifchange(NULL, IFCHANGE_DECONFIG);
|
ifchange_deconfig();
|
||||||
frelease(cs);
|
frelease(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user