struct timeval tv;
int arping = 0;
+ if (state->arp_fd == -1) {
+ if (ipv4_opensocket(ifp, ETHERTYPE_ARP) == -1)
+ return;
+ eloop_event_add(state->arp_fd, arp_packet, ifp);
+ }
+
if (state->arping_index < ifp->options->arping_len) {
addr.s_addr = ifp->options->arping[state->arping_index];
arping = 1;
} else
addr.s_addr = state->addr.s_addr;
- if (state->arp_fd == -1) {
- ipv4_opensocket(ifp, ETHERTYPE_ARP);
- eloop_event_add(state->arp_fd, arp_packet, ifp);
- }
if (state->probes == 0) {
if (arping)
syslog(LOG_INFO, "%s: searching for %s",
#endif
if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
- return -1;
+ return -1;
n = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1)
- goto eexit;
+ goto eexit;
#ifdef SO_BINDTODEVICE
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
*p = '\0';
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, &ifr,
sizeof(ifr)) == -1)
- goto eexit;
+ goto eexit;
#endif
/* As we don't use this socket for receiving, set the
* * receive buffer to 1 */
n = 1;
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1)
- goto eexit;
+ goto eexit;
state = D_STATE(iface);
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(DHCP_CLIENT_PORT);
sin.sin_addr.s_addr = state->addr.s_addr;
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1)
- goto eexit;
+ goto eexit;
state->udp_fd = s;
set_cloexec(s);
ip->ip_p = IPPROTO_UDP;
ip->ip_src.s_addr = source.s_addr;
if (dest.s_addr == 0)
- ip->ip_dst.s_addr = INADDR_BROADCAST;
+ ip->ip_dst.s_addr = INADDR_BROADCAST;
else
- ip->ip_dst.s_addr = dest.s_addr;
+ ip->ip_dst.s_addr = dest.s_addr;
udp->uh_sport = htons(DHCP_CLIENT_PORT);
udp->uh_dport = htons(DHCP_SERVER_PORT);
state = D_STATE(ifp);
if (state->raw_fd == -1) {
- if ((r = ipv4_opensocket(ifp, ETHERTYPE_IP)) == -1)
+ if ((r = ipv4_opensocket(ifp, ETHERTYPE_IP)) == -1) {
syslog(LOG_ERR, "%s: %s: %m", __func__, ifp->name);
- else
- eloop_event_add(state->raw_fd, dhcp_handlepacket, ifp);
+ return -1;
+ }
+ eloop_event_add(state->raw_fd, dhcp_handlepacket, ifp);
}
if (state->udp_fd == -1 &&
state->addr.s_addr != 0 &&
{
if (dhcp_openudp(ifp) == -1 && errno != EADDRINUSE) {
syslog(LOG_ERR, "%s: dhcp_openudp: %m", ifp->name);
- r = -1;
+ return -1;
}
}
- return r;
+ return 0;
}
int
return;
}
- if (!dhcp_open(ifp))
+ if (dhcp_open(ifp) == -1)
return;
if (ifo->options & DHCPCD_INFORM) {
ipv6_buildroutes();
}
-static void
+static int
dhcp6_sendmessage(struct interface *ifp, void (*callback)(void *))
{
struct dhcp6_state *state;
pi.ipi6_ifindex = ifp->index;
memcpy(CMSG_DATA(cm), &pi, sizeof(pi));
- if (sendmsg(sock, &sndhdr, 0) == -1)
+ if (sendmsg(sock, &sndhdr, 0) == -1) {
syslog(LOG_ERR, "%s: sendmsg: %m", ifp->name);
+ ifp->options->options &= ~DHCPCD_IPV6;
+ dhcp6_drop(ifp, "EXPIRE6");
+ return -1;
+ }
state->RTC++;
if (callback) {
syslog(LOG_WARNING, "%s: sent %d times with no reply",
ifp->name, state->RTC);
}
+ return 0;
}
static void
struct dhcp6_state *state;
ifp = arg;
+ printf ("%s: HERE!!!!\n", ifp->name);
state = D6_STATE(ifp);
state->state = DH6S_DISCOVER;
state->start_uptime = uptime();
/* Section 18.1.2 says that we SHOULD use the last known
* IP address(s) and lifetimes if we didn't get a reply.
* I disagree with this. */
- dhcp6_startdiscover(ifp);
+ if (ifp->options->options & DHCPCD_IPV6)
+ dhcp6_startdiscover(ifp);
}
static void
memcpy(CMSG_DATA(cm), &hoplimit, sizeof(hoplimit));
syslog(LOG_INFO, "%s: sending IPv6 Router Solicitation", ifp->name);
- if (sendmsg(sock, &sndhdr, 0) == -1)
+ if (sendmsg(sock, &sndhdr, 0) == -1) {
syslog(LOG_ERR, "%s: sendmsg: %m", ifp->name);
+ ipv6rs_drop(ifp);
+ ifp->options->options &= ~DHCPCD_IPV6RS;
+ return;
+ }
if (state->rsprobes++ < MAX_RTR_SOLICITATIONS)
eloop_timeout_add_sec(RTR_SOLICITATION_INTERVAL,