Remove half way implemented address and default route proposals. This never worked out and is getting in the way of DNS proposals which are coming next. No (intended) functional change.
The diff is mostly mechanical, pull 3 types out of the imsg_type enum and churn until it compiles again. I'm going to put this in soon but testing would still be appreciated. diff --git Makefile Makefile index 989f432c621..5172c51b1ba 100644 --- Makefile +++ Makefile @@ -7,8 +7,6 @@ MAN= slaacd.8 #DEBUG= -g -DDEBUG=3 -O0 -CFLAGS+= -DSKIP_PROPOSAL - CFLAGS+= -Wall -I${.CURDIR} CFLAGS+= -Wstrict-prototypes -Wmissing-prototypes CFLAGS+= -Wmissing-declarations diff --git engine.c engine.c index 6a4762ecd65..59bc003edc8 100644 --- engine.c +++ engine.c @@ -104,7 +104,6 @@ const char* if_state_name[] = { enum proposal_state { PROPOSAL_NOT_CONFIGURED, - PROPOSAL_SENT, PROPOSAL_CONFIGURED, PROPOSAL_NEARLY_EXPIRED, PROPOSAL_WITHDRAWN, @@ -114,7 +113,6 @@ enum proposal_state { const char* proposal_state_name[] = { "NOT_CONFIGURED", - "SENT", "CONFIGURED", "NEARLY_EXPIRED", "WITHDRAWN", @@ -260,7 +258,6 @@ void free_dfr_proposal(struct dfr_proposal *); void withdraw_dfr(struct dfr_proposal *); char *parse_dnssl(char *, int); void update_iface_ra(struct slaacd_iface *, struct radv *); -void send_proposal(struct imsg_proposal *); void start_probe(struct slaacd_iface *); void address_proposal_timeout(int, short, void *); void dfr_proposal_timeout(int, short, void *); @@ -399,7 +396,6 @@ engine_dispatch_frontend(int fd, short event, void *bula) struct imsg imsg; struct slaacd_iface *iface; struct imsg_ra ra; - struct imsg_proposal_ack proposal_ack; struct address_proposal *addr_proposal = NULL; struct dfr_proposal *dfr_proposal = NULL; struct imsg_del_addr del_addr; @@ -481,43 +477,6 @@ engine_dispatch_frontend(int fd, short event, void *bula) IMSG_CTL_SEND_SOLICITATION, imsg.hdr.pid, &iface->if_index, sizeof(iface->if_index)); break; - case IMSG_PROPOSAL_ACK: - if (IMSG_DATA_SIZE(imsg) != sizeof(proposal_ack)) - fatalx("%s: IMSG_PROPOSAL_ACK wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&proposal_ack, imsg.data, sizeof(proposal_ack)); - log_debug("%s: IMSG_PROPOSAL_ACK: %lld - %d", __func__, - proposal_ack.id, proposal_ack.pid); - if (proposal_ack.pid != getpid()) { - log_debug("IMSG_PROPOSAL_ACK: wrong pid, " - "ignoring"); - break; - } - - iface = get_slaacd_iface_by_id(proposal_ack.if_index); - if (iface == NULL) { - log_debug("IMSG_PROPOSAL_ACK: unknown interface" - ", ignoring"); - break; - } - - addr_proposal = find_address_proposal_by_id(iface, - proposal_ack.id); - if (addr_proposal == NULL) { - dfr_proposal = find_dfr_proposal_by_id(iface, - proposal_ack.id); - if (dfr_proposal == NULL) { - log_debug("IMSG_PROPOSAL_ACK: cannot " - "find proposal, ignoring"); - break; - } - } - if (addr_proposal != NULL) - configure_address(addr_proposal); - else if (dfr_proposal != NULL) - configure_dfr(dfr_proposal); - - break; case IMSG_DEL_ADDRESS: if (IMSG_DATA_SIZE(imsg) != sizeof(del_addr)) fatalx("%s: IMSG_DEL_ADDRESS wrong length: %lu", @@ -1982,11 +1941,8 @@ gen_address_proposal(struct slaacd_iface *iface, struct radv *ra, struct gen_addr(iface, prefix, addr_proposal, privacy); - tv.tv_sec = 0; - tv.tv_usec = 0; - evtimer_add(&addr_proposal->timer, &tv); - LIST_INSERT_HEAD(&iface->addr_proposals, addr_proposal, entries); + configure_address(addr_proposal); hbuf = sin6_to_str(&addr_proposal->addr); log_debug("%s: iface %d: %s: %lld s", __func__, @@ -2047,11 +2003,8 @@ gen_dfr_proposal(struct slaacd_iface *iface, struct radv *ra) dfr_proposal->router_lifetime = ra->router_lifetime; dfr_proposal->rpref = ra->rpref; - tv.tv_sec = 0; - tv.tv_usec = 0; - evtimer_add(&dfr_proposal->timer, &tv); - LIST_INSERT_HEAD(&iface->dfr_proposals, dfr_proposal, entries); + configure_dfr(dfr_proposal); hbuf = sin6_to_str(&dfr_proposal->addr); log_debug("%s: iface %d: %s: %lld s", __func__, @@ -2130,20 +2083,6 @@ free_dfr_proposal(struct dfr_proposal *dfr_proposal) free(dfr_proposal); } -void -send_proposal(struct imsg_proposal *proposal) -{ -#ifndef SKIP_PROPOSAL - engine_imsg_compose_main(IMSG_PROPOSAL, 0, proposal, sizeof(*proposal)); -#else - struct imsg_proposal_ack ack; - ack.id = proposal->id; - ack.pid = proposal->pid; - ack.if_index = proposal->if_index; - engine_imsg_compose_frontend(IMSG_FAKE_ACK, 0, &ack, sizeof(ack)); -#endif -} - void start_probe(struct slaacd_iface *iface) { @@ -2165,7 +2104,6 @@ void address_proposal_timeout(int fd, short events, void *arg) { struct address_proposal *addr_proposal; - struct imsg_proposal proposal; struct timeval tv; const char *hbuf; @@ -2178,38 +2116,6 @@ address_proposal_timeout(int fd, short events, void *arg) addr_proposal->privacy ? "y" : "n"); switch (addr_proposal->state) { - case PROPOSAL_NOT_CONFIGURED: - case PROPOSAL_SENT: - if (addr_proposal->timeout_count++ < 6) { - addr_proposal->id = ++proposal_id; - - memset(&proposal, 0, sizeof(proposal)); - proposal.if_index = addr_proposal->if_index; - proposal.pid = getpid(); - proposal.id = addr_proposal->id; - memcpy(&proposal.addr, &addr_proposal->addr, - sizeof(proposal.addr)); - memcpy(&proposal.mask, &addr_proposal->mask, - sizeof(proposal.mask)); - - proposal.rtm_addrs = RTA_NETMASK | RTA_IFA; - - addr_proposal->state = PROPOSAL_SENT; - - send_proposal(&proposal); - - tv.tv_sec = addr_proposal->next_timeout; - tv.tv_usec = arc4random_uniform(1000000); - addr_proposal->next_timeout *= 2; - evtimer_add(&addr_proposal->timer, &tv); - log_debug("%s: scheduling new timeout in %llds.%06ld", - __func__, tv.tv_sec, tv.tv_usec); - } else { - log_debug("%s: giving up, no response to proposal", - __func__); - free_address_proposal(addr_proposal); - } - break; case PROPOSAL_CONFIGURED: log_debug("PROPOSAL_CONFIGURED timeout: id: %lld, privacy: %s", addr_proposal->id, addr_proposal->privacy ? "y" : "n"); @@ -2274,7 +2180,6 @@ void dfr_proposal_timeout(int fd, short events, void *arg) { struct dfr_proposal *dfr_proposal; - struct imsg_proposal proposal; struct timeval tv; const char *hbuf; @@ -2285,36 +2190,6 @@ dfr_proposal_timeout(int fd, short events, void *arg) hbuf, proposal_state_name[dfr_proposal->state]); switch (dfr_proposal->state) { - case PROPOSAL_NOT_CONFIGURED: - case PROPOSAL_SENT: - if (dfr_proposal->timeout_count++ < 6) { - dfr_proposal->id = ++proposal_id; - - memset(&proposal, 0, sizeof(proposal)); - proposal.if_index = dfr_proposal->if_index; - proposal.pid = getpid(); - proposal.id = dfr_proposal->id; - memcpy(&proposal.addr, &dfr_proposal->addr, - sizeof(proposal.addr)); - - proposal.rtm_addrs = RTA_GATEWAY; - - dfr_proposal->state = PROPOSAL_SENT; - - send_proposal(&proposal); - - tv.tv_sec = dfr_proposal->next_timeout; - tv.tv_usec = arc4random_uniform(1000000); - dfr_proposal->next_timeout *= 2; - evtimer_add(&dfr_proposal->timer, &tv); - log_debug("%s: scheduling new timeout in %llds.%06ld", - __func__, tv.tv_sec, tv.tv_usec); - } else { - log_debug("%s: giving up, no response to proposal", - __func__); - free_dfr_proposal(dfr_proposal); - } - break; case PROPOSAL_CONFIGURED: log_debug("PROPOSAL_CONFIGURED timeout: id: %lld", dfr_proposal->id); diff --git engine.h engine.h index dfb2c97f8c2..3d65f87d5df 100644 --- engine.h +++ engine.h @@ -16,16 +16,6 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -struct imsg_proposal { - uint32_t if_index; - pid_t pid; - int64_t id; - struct sockaddr_in6 addr; - struct in6_addr mask; - struct sockaddr_in6 gateway; - int rtm_addrs; -}; - struct imsg_configure_address { uint32_t if_index; struct sockaddr_in6 addr; diff --git frontend.c frontend.c index fb38815a97b..79022cfc79f 100644 --- frontend.c +++ frontend.c @@ -436,14 +436,6 @@ frontend_dispatch_engine(int fd, short event, void *bula) if_index = *((uint32_t *)imsg.data); send_solicitation(if_index); break; - case IMSG_FAKE_ACK: - if (IMSG_DATA_SIZE(imsg) != sizeof(struct - imsg_proposal_ack)) - fatalx("%s: IMSG_FAKE_ACK wrong length: %lu", - __func__, IMSG_DATA_SIZE(imsg)); - frontend_imsg_compose_engine(IMSG_PROPOSAL_ACK, - 0, 0, imsg.data, sizeof(struct imsg_proposal_ack)); - break; default: log_debug("%s: error handling imsg %d", __func__, imsg.hdr.type); @@ -727,7 +719,6 @@ void handle_route_message(struct rt_msghdr *rtm, struct sockaddr **rti_info) { struct if_msghdr *ifm; - struct imsg_proposal_ack proposal_ack; struct imsg_del_addr del_addr; struct imsg_del_route del_route; struct imsg_dup_addr dup_addr; @@ -735,12 +726,9 @@ handle_route_message(struct rt_msghdr *rtm, struct sockaddr **rti_info) struct sockaddr_in6 *sin6; struct in6_ifreq ifr6; struct in6_addr *in6; - int64_t id, pid; int xflags, if_index; char ifnamebuf[IFNAMSIZ]; char *if_name; - char **ap, *argv[4], *p; - const char *errstr; switch (rtm->rtm_type) { case RTM_IFINFO: @@ -863,57 +851,6 @@ handle_route_message(struct rt_msghdr *rtm, struct sockaddr **rti_info) log_debug("RTM_DELETE: %s[%u]", if_name, ifm->ifm_index); - break; - case RTM_PROPOSAL: - ifm = (struct if_msghdr *)rtm; - if_name = if_indextoname(ifm->ifm_index, ifnamebuf); - - if ((rtm->rtm_flags & (RTF_DONE | RTF_PROTO1)) == - (RTF_DONE | RTF_PROTO1) && rtm->rtm_addrs == RTA_LABEL) { - rl = (struct sockaddr_rtlabel *)rti_info[RTAX_LABEL]; - /* XXX validate rl */ - - p = rl->sr_label; - - for (ap = argv; ap < &argv[3] && (*ap = - strsep(&p, " ")) != NULL;) { - if (**ap != '\0') - ap++; - } - *ap = NULL; - - if (argv[0] != NULL && strncmp(argv[0], - SLAACD_RTA_LABEL":", strlen(SLAACD_RTA_LABEL":")) - == 0 && argv[1] != NULL && argv[2] != NULL && - argv[3] == NULL) { - id = strtonum(argv[1], 0, INT64_MAX, &errstr); - if (errstr != NULL) { - log_warnx("%s: proposal seq is %s: %s", - __func__, errstr, argv[1]); - break; - } - pid = strtonum(argv[2], 0, INT32_MAX, &errstr); - if (errstr != NULL) { - log_warnx("%s: pid is %s: %s", - __func__, errstr, argv[2]); - break; - } - proposal_ack.id = id; - proposal_ack.pid = pid; - proposal_ack.if_index = ifm->ifm_index; - - frontend_imsg_compose_engine(IMSG_PROPOSAL_ACK, - 0, 0, &proposal_ack, sizeof(proposal_ack)); - } else { - log_debug("cannot parse: %s", rl->sr_label); - } - } else { -#if 0 - log_debug("%s: got flags %x, expcted %x", __func__, - rtm->rtm_flags, (RTF_DONE | RTF_PROTO1)); -#endif - } - break; default: log_debug("unexpected RTM: %d", rtm->rtm_type); diff --git slaacd.c slaacd.c index a2b0adb6dd2..8976e30f0a6 100644 --- slaacd.c +++ slaacd.c @@ -63,7 +63,6 @@ static pid_t start_child(int, char *, int, int, int); void main_dispatch_frontend(int, short, void *); void main_dispatch_engine(int, short, void *); -void handle_proposal(struct imsg_proposal *); void configure_interface(struct imsg_configure_address *); void delete_address(struct imsg_configure_address *); void configure_gateway(struct imsg_configure_dfr *, uint8_t); @@ -267,8 +266,8 @@ main(int argc, char *argv[]) fatal("route socket"); rtfilter = ROUTE_FILTER(RTM_IFINFO) | ROUTE_FILTER(RTM_NEWADDR) | - ROUTE_FILTER(RTM_DELADDR) | ROUTE_FILTER(RTM_PROPOSAL) | - ROUTE_FILTER(RTM_DELETE) | ROUTE_FILTER(RTM_CHGADDRATTR); + ROUTE_FILTER(RTM_DELADDR) | ROUTE_FILTER(RTM_DELETE) | + ROUTE_FILTER(RTM_CHGADDRATTR); if (setsockopt(frontend_routesock, AF_ROUTE, ROUTE_MSGFILTER, &rtfilter, sizeof(rtfilter)) == -1) fatal("setsockopt(ROUTE_MSGFILTER)"); @@ -476,7 +475,6 @@ main_dispatch_engine(int fd, short event, void *bula) struct imsgev *iev = bula; struct imsgbuf *ibuf; struct imsg imsg; - struct imsg_proposal proposal; struct imsg_configure_address address; struct imsg_configure_dfr dfr; ssize_t n; @@ -504,14 +502,6 @@ main_dispatch_engine(int fd, short event, void *bula) break; switch (imsg.hdr.type) { - case IMSG_PROPOSAL: - if (IMSG_DATA_SIZE(imsg) != sizeof(proposal)) - fatalx("%s: IMSG_PROPOSAL wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&proposal, imsg.data, sizeof(proposal)); - handle_proposal(&proposal); - break; case IMSG_CONFIGURE_ADDRESS: if (IMSG_DATA_SIZE(imsg) != sizeof(address)) fatalx("%s: IMSG_CONFIGURE_ADDRESS wrong " @@ -636,93 +626,6 @@ main_imsg_send_ipc_sockets(struct imsgbuf *frontend_buf, return (0); } -#define ROUNDUP(a) \ - (((a) & (sizeof(long) - 1)) ? (1 + ((a) | (sizeof(long) - 1))) : (a)) - -void -handle_proposal(struct imsg_proposal *proposal) -{ - struct rt_msghdr rtm; - struct sockaddr_in6 ifa, mask; - struct sockaddr_rtlabel rl; - struct iovec iov[13]; - long pad = 0; - int iovcnt = 0, padlen; - - memset(&rtm, 0, sizeof(rtm)); - - rtm.rtm_version = RTM_VERSION; - rtm.rtm_type = RTM_PROPOSAL; - rtm.rtm_msglen = sizeof(rtm); - rtm.rtm_tableid = 0; /* XXX imsg->rdomain; */ - rtm.rtm_index = proposal->if_index; - rtm.rtm_seq = ++rtm_seq; - rtm.rtm_priority = RTP_PROPOSAL_SLAAC; - rtm.rtm_addrs = (proposal->rtm_addrs & (RTA_NETMASK | RTA_IFA)) | - RTA_LABEL; - rtm.rtm_flags = RTF_UP; - - iov[iovcnt].iov_base = &rtm; - iov[iovcnt++].iov_len = sizeof(rtm); - - if (rtm.rtm_addrs & RTA_NETMASK) { - memset(&mask, 0, sizeof(mask)); - mask.sin6_family = AF_INET6; - mask.sin6_len = sizeof(struct sockaddr_in6); - mask.sin6_addr = proposal->mask; - - iov[iovcnt].iov_base = &mask; - iov[iovcnt++].iov_len = sizeof(mask); - rtm.rtm_msglen += sizeof(mask); - padlen = ROUNDUP(sizeof(mask)) - sizeof(mask); - if (padlen > 0) { - iov[iovcnt].iov_base = &pad; - iov[iovcnt++].iov_len = padlen; - rtm.rtm_msglen += padlen; - } - } - - if (rtm.rtm_addrs & RTA_IFA) { - memcpy(&ifa, &proposal->addr, sizeof(ifa)); - - if (ifa.sin6_family != AF_INET6 || ifa.sin6_len != - sizeof(struct sockaddr_in6)) { - log_warnx("%s: invalid address", __func__); - return; - } - - iov[iovcnt].iov_base = &ifa; - iov[iovcnt++].iov_len = sizeof(ifa); - rtm.rtm_msglen += sizeof(ifa); - padlen = ROUNDUP(sizeof(ifa)) - sizeof(ifa); - if (padlen > 0) { - iov[iovcnt].iov_base = &pad; - iov[iovcnt++].iov_len = padlen; - rtm.rtm_msglen += padlen; - } - } - - rl.sr_len = sizeof(rl); - rl.sr_family = AF_UNSPEC; - if (snprintf(rl.sr_label, sizeof(rl.sr_label), "%s: %lld %d", - SLAACD_RTA_LABEL, proposal->id, (int32_t)proposal->pid) >= - (ssize_t)sizeof(rl.sr_label)) - log_warnx("route label truncated"); - - iov[iovcnt].iov_base = &rl; - iov[iovcnt++].iov_len = sizeof(rl); - rtm.rtm_msglen += sizeof(rl); - padlen = ROUNDUP(sizeof(rl)) - sizeof(rl); - if (padlen > 0) { - iov[iovcnt].iov_base = &pad; - iov[iovcnt++].iov_len = padlen; - rtm.rtm_msglen += padlen; - } - - if (writev(routesock, iov, iovcnt) == -1) - log_warn("failed to send proposal"); -} - void configure_interface(struct imsg_configure_address *address) { @@ -805,6 +708,9 @@ delete_address(struct imsg_configure_address *address) } +#define ROUNDUP(a) \ + (((a) & (sizeof(long) - 1)) ? (1 + ((a) | (sizeof(long) - 1))) : (a)) + void configure_gateway(struct imsg_configure_dfr *dfr, uint8_t rtm_type) { diff --git slaacd.h slaacd.h index c82b35d92e8..07c3efc1404 100644 --- slaacd.h +++ slaacd.h @@ -69,13 +69,10 @@ enum imsg_type { IMSG_UPDATE_IF, IMSG_REMOVE_IF, IMSG_RA, - IMSG_PROPOSAL, - IMSG_PROPOSAL_ACK, IMSG_CONFIGURE_ADDRESS, IMSG_WITHDRAW_ADDRESS, IMSG_DEL_ADDRESS, IMSG_DEL_ROUTE, - IMSG_FAKE_ACK, IMSG_CONFIGURE_DFR, IMSG_WITHDRAW_DFR, IMSG_DUP_ADDRESS, @@ -200,12 +197,6 @@ struct imsg_del_route { struct sockaddr_in6 gw; }; -struct imsg_proposal_ack { - int64_t id; - pid_t pid; - uint32_t if_index; -}; - struct imsg_ra { uint32_t if_index; struct sockaddr_in6 from; -- I'm not entirely sure you are real.