• Home
  • Raw
  • Download

Lines Matching +full:- +full:- +full:daemon

1 /* dnsmasq is Copyright (c) 2000-2009 Simon Kelley
38 if (fd == -1) die(_("cannot create DHCP socket: %s"), NULL, EC_BADNET); in dhcp_init()
42 setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &mtu, sizeof(mtu)) == -1 || in dhcp_init()
45 setsockopt(fd, SOL_IP, IP_PKTINFO, &oneopt, sizeof(oneopt)) == -1 || in dhcp_init()
47 setsockopt(fd, IPPROTO_IP, IP_RECVIF, &oneopt, sizeof(oneopt)) == -1 || in dhcp_init()
49 setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &oneopt, sizeof(oneopt)) == -1) in dhcp_init()
52 /* When bind-interfaces is set, there might be more than one dnmsasq in dhcp_init()
55 if (daemon->options & OPT_NOWILD) { in dhcp_init()
61 if (rc == -1) in dhcp_init()
67 saddr.sin_port = htons(daemon->dhcp_server_port); in dhcp_init()
74 … if (setsockopt(fd, SOL_SOCKET, SO_MARK, &daemon->listen_mark, sizeof(daemon->listen_mark)) == -1) in dhcp_init()
78 daemon->dhcpfd = fd; in dhcp_init()
82 daemon->dhcp_packet.iov_len = sizeof(struct dhcp_packet); in dhcp_init()
83 daemon->dhcp_packet.iov_base = safe_malloc(daemon->dhcp_packet.iov_len); in dhcp_init()
111 msg.msg_iov = &daemon->dhcp_packet; in dhcp_packet()
116 while ((sz = recvmsg(daemon->dhcpfd, &msg, MSG_PEEK | MSG_TRUNC)) == -1 && errno == EINTR) in dhcp_packet()
119 if (sz == -1) return; in dhcp_packet()
125 if ((size_t) sz == daemon->dhcp_packet.iov_len) { in dhcp_packet()
126 if (!expand_buf(&daemon->dhcp_packet, sz + 100)) return; in dhcp_packet()
128 expand_buf(&daemon->dhcp_packet, sz); in dhcp_packet()
134 mess = (struct dhcp_packet*) daemon->dhcp_packet.iov_base; in dhcp_packet()
141 while ((sz = recvmsg(daemon->dhcpfd, &msg, 0)) == -1 && errno == EINTR) in dhcp_packet()
144 if ((msg.msg_flags & MSG_TRUNC) || sz < (ssize_t)(sizeof(*mess) - sizeof(mess->options))) in dhcp_packet()
150 if (cmptr->cmsg_level == SOL_IP && cmptr->cmsg_type == IP_PKTINFO) { in dhcp_packet()
151 iface_index = ((struct in_pktinfo*) CMSG_DATA(cmptr))->ipi_ifindex; in dhcp_packet()
152 if (((struct in_pktinfo*) CMSG_DATA(cmptr))->ipi_addr.s_addr != INADDR_BROADCAST) in dhcp_packet()
157 if (!indextoname(daemon->dhcpfd, iface_index, ifr.ifr_name)) return; in dhcp_packet()
165 if (ioctl(daemon->dhcpfd, SIOCGIFADDR, &ifr) != -1) { in dhcp_packet()
167 iface_addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr; in dhcp_packet()
172 for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) in dhcp_packet()
173 if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) return; in dhcp_packet()
177 if (ioctl(daemon->dhcpfd, SIOCGIFADDR, &ifr) == -1) { in dhcp_packet()
182 iface_addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr; in dhcp_packet()
185 /* unlinked contexts are marked by context->current == context */ in dhcp_packet()
186 for (context = daemon->dhcp; context; context = context->next) context->current = context; in dhcp_packet()
188 parm.relay = mess->giaddr; in dhcp_packet()
207 iov.iov_base = daemon->dhcp_packet.iov_base; in dhcp_packet()
210 mess = (struct dhcp_packet*) daemon->dhcp_packet.iov_base; in dhcp_packet()
212 if (mess->giaddr.s_addr) { in dhcp_packet()
214 dest.sin_port = htons(daemon->dhcp_server_port); in dhcp_packet()
215 dest.sin_addr = mess->giaddr; in dhcp_packet()
216 } else if (mess->ciaddr.s_addr) { in dhcp_packet()
221 if ((!is_inform && dest.sin_addr.s_addr != mess->ciaddr.s_addr) || dest.sin_port == 0 || in dhcp_packet()
223 dest.sin_port = htons(daemon->dhcp_client_port); in dhcp_packet()
224 dest.sin_addr = mess->ciaddr; in dhcp_packet()
228 else if ((ntohs(mess->flags) & 0x8000) || mess->hlen == 0 || in dhcp_packet()
229 mess->hlen > sizeof(ifr.ifr_addr.sa_data) || mess->htype == 0) { in dhcp_packet()
236 pkt->ipi_ifindex = iface_index; in dhcp_packet()
237 pkt->ipi_spec_dst.s_addr = 0; in dhcp_packet()
238 msg.msg_controllen = cmptr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); in dhcp_packet()
239 cmptr->cmsg_level = SOL_IP; in dhcp_packet()
240 cmptr->cmsg_type = IP_PKTINFO; in dhcp_packet()
242 dest.sin_port = htons(daemon->dhcp_client_port); in dhcp_packet()
247 dest.sin_addr = mess->yiaddr; in dhcp_packet()
248 dest.sin_port = htons(daemon->dhcp_client_port); in dhcp_packet()
250 req.arp_ha.sa_family = mess->htype; in dhcp_packet()
251 memcpy(req.arp_ha.sa_data, mess->chaddr, mess->hlen); in dhcp_packet()
254 ioctl(daemon->dhcpfd, SIOCSARP, &req); in dhcp_packet()
258 while (sendmsg(daemon->dhcpfd, &msg, 0) == -1 && retry_send()) in dhcp_packet()
269 ->current.
279 for (context = daemon->dhcp; context; context = context->next) { in complete_context()
280 if (!(context->flags & CONTEXT_NETMASK) && (is_same_net(local, context->start, netmask) || in complete_context()
281 is_same_net(local, context->end, netmask))) { in complete_context()
282 if (context->netmask.s_addr != netmask.s_addr && in complete_context()
283 !(is_same_net(local, context->start, netmask) && in complete_context()
284 is_same_net(local, context->end, netmask))) { in complete_context()
285 strcpy(daemon->dhcp_buff, inet_ntoa(context->start)); in complete_context()
286 strcpy(daemon->dhcp_buff2, inet_ntoa(context->end)); in complete_context()
288 _("DHCP range %s -- %s is not consistent with netmask %s"), in complete_context()
289 daemon->dhcp_buff, daemon->dhcp_buff2, inet_ntoa(netmask)); in complete_context()
291 context->netmask = netmask; in complete_context()
294 if (context->netmask.s_addr) { in complete_context()
295 if (is_same_net(local, context->start, context->netmask) && in complete_context()
296 is_same_net(local, context->end, context->netmask)) { in complete_context()
298 if (if_index == param->ind && context->current == context) { in complete_context()
299 context->router = local; in complete_context()
300 context->local = local; in complete_context()
301 context->current = param->current; in complete_context()
302 param->current = context; in complete_context()
305 if (!(context->flags & CONTEXT_BRDCAST)) { in complete_context()
306 if (is_same_net(broadcast, context->start, context->netmask)) in complete_context()
307 context->broadcast = broadcast; in complete_context()
309 … context->broadcast.s_addr = context->start.s_addr | ~context->netmask.s_addr; in complete_context()
311 } else if (param->relay.s_addr && in complete_context()
312 is_same_net(param->relay, context->start, context->netmask)) { in complete_context()
313 context->router = param->relay; in complete_context()
314 context->local = param->primary; in complete_context()
316 if (!(context->flags & CONTEXT_BRDCAST)) in complete_context()
317 context->broadcast.s_addr = context->start.s_addr | ~context->netmask.s_addr; in complete_context()
334 for (tmp = context; tmp; tmp = tmp->current) in address_available()
335 if (taddr.s_addr == context->router.s_addr) return NULL; in address_available()
337 for (tmp = context; tmp; tmp = tmp->current) { in address_available()
338 start = ntohl(tmp->start.s_addr); in address_available()
339 end = ntohl(tmp->end.s_addr); in address_available()
341 if (!(tmp->flags & CONTEXT_STATIC) && addr >= start && addr <= end && in address_available()
342 match_netid(tmp->filter, netids, 1)) in address_available()
352 These are chained on ->current. in narrow_context()
354 address. Note that none may fit, if the address came a dhcp-host and is outside in narrow_context()
355 any dhcp-range. In that case we return a static range if possible, or failing that, in narrow_context()
362 for (tmp = context; tmp; tmp = tmp->current) in narrow_context()
363 if (is_same_net(taddr, tmp->start, tmp->netmask) && (tmp->flags & CONTEXT_STATIC)) in narrow_context()
367 for (tmp = context; tmp; tmp = tmp->current) in narrow_context()
368 if (is_same_net(taddr, tmp->start, tmp->netmask)) break; in narrow_context()
372 if (tmp) tmp->current = NULL; in narrow_context()
380 for (config = configs; config; config = config->next) in config_find_by_address()
381 if ((config->flags & CONFIG_ADDR) && config->addr.s_addr == addr.s_addr) return config; in config_find_by_address()
393 for (; check; check = check->next) { in match_netid()
394 if (check->net[0] != '#') { in match_netid()
395 for (tmp1 = pool; tmp1; tmp1 = tmp1->next) in match_netid()
396 if (strcmp(check->net, tmp1->net) == 0) break; in match_netid()
399 for (tmp1 = pool; tmp1; tmp1 = tmp1->next) in match_netid()
400 if (strcmp((check->net) + 1, tmp1->net) == 0) return 0; in match_netid()
420 for (c = context; c; c = c->current) in address_allocate()
421 if (c->flags & CONTEXT_STATIC) in address_allocate()
423 else if (!match_netid(c->filter, netids, pass)) in address_allocate()
428 ntohl(c->start.s_addr) + in address_allocate()
429 ((j + c->addr_epoch) % (1 + ntohl(c->end.s_addr) - ntohl(c->start.s_addr)))); in address_allocate()
433 for (d = context; d; d = d->current) in address_allocate()
434 if (addr.s_addr == d->router.s_addr) break; in address_allocate()
437 supernetting. ie dhcp-range=192.168.0.1,192.168.1.254,255,255,254.0 in address_allocate()
440 addresses to avoid hard-to-diagnose problems. Thanks Bill. */ in address_allocate()
442 !config_find_by_address(daemon->dhcp_conf, addr) && in address_allocate()
451 if (daemon->options & OPT_NO_PING) return 1; in address_allocate()
458 PING_CACHE_TIME, we are in high-load mode, so don't do any more. */ in address_allocate()
459 for (count = 0, r = daemon->ping_results; r; r = r->next) in address_allocate()
460 if (difftime(now, r->time) > (float) PING_CACHE_TIME) in address_allocate()
462 else if (++count == max || r->addr.s_addr == addr.s_addr) in address_allocate()
468 c->addr_epoch++; in address_allocate()
473 victim->next = daemon->ping_results; in address_allocate()
474 daemon->ping_results = victim; in address_allocate()
481 victim->addr = addr; in address_allocate()
482 victim->time = now; in address_allocate()
490 if (addr.s_addr == htonl(ntohl(c->end.s_addr) + 1)) addr = c->start; in address_allocate()
500 if (!(config->flags & CONFIG_ADDR)) return 1; in is_addr_in_context()
501 for (; context; context = context->current) in is_addr_in_context()
502 if (is_same_net(config->addr, context->start, context->netmask)) return 1; in is_addr_in_context()
510 for (conf_addr = config->hwaddr; conf_addr; conf_addr = conf_addr->next) in config_has_mac()
511 if (conf_addr->wildcard_mask == 0 && conf_addr->hwaddr_len == len && in config_has_mac()
512 (conf_addr->hwaddr_type == type || conf_addr->hwaddr_type == 0) && in config_has_mac()
513 memcmp(conf_addr->hwaddr, hwaddr, len) == 0) in config_has_mac()
527 for (config = configs; config; config = config->next) in find_config()
528 if (config->flags & CONFIG_CLID) { in find_config()
529 if (config->clid_len == clid_len && memcmp(config->clid, clid, clid_len) == 0 && in find_config()
535 if (*clid == 0 && config->clid_len == clid_len - 1 && in find_config()
536 memcmp(config->clid, clid + 1, clid_len - 1) == 0 && in find_config()
541 for (config = configs; config; config = config->next) in find_config()
546 for (config = configs; config; config = config->next) in find_config()
547 if ((config->flags & CONFIG_NAME) && hostname_isequal(config->hostname, hostname) && in find_config()
552 for (candidate = NULL, count = 0, config = configs; config; config = config->next) in find_config()
554 for (conf_addr = config->hwaddr; conf_addr; conf_addr = conf_addr->next) in find_config()
555 if (conf_addr->wildcard_mask != 0 && conf_addr->hwaddr_len == hw_len && in find_config()
556 (conf_addr->hwaddr_type == hw_type || conf_addr->hwaddr_type == 0) && in find_config()
557 (new = memcmp_masked(conf_addr->hwaddr, hwaddr, hw_len, in find_config()
558 conf_addr->wildcard_mask)) > count) { in find_config()
569 since the address is reserved by the other one -> protocol loop. in check_dhcp_hosts()
574 for (configs = daemon->dhcp_conf; configs; configs = configs->next) { in check_dhcp_hosts()
577 if ((configs->flags & DHOPT_BANK) || fatal) { in check_dhcp_hosts()
578 for (cp = configs->next; cp; cp = cp->next) in check_dhcp_hosts()
579 if ((configs->flags & cp->flags & CONFIG_ADDR) && in check_dhcp_hosts()
580 configs->addr.s_addr == cp->addr.s_addr) { in check_dhcp_hosts()
582 die(_("duplicate IP address %s in dhcp-config directive."), in check_dhcp_hosts()
583 inet_ntoa(cp->addr), EC_BADCONF); in check_dhcp_hosts()
586 inet_ntoa(cp->addr), daemon->dhcp_hosts_file); in check_dhcp_hosts()
587 configs->flags &= ~CONFIG_ADDR; in check_dhcp_hosts()
591 if ((configs->flags & CONFIG_NAME) && (domain = strip_hostname(configs->hostname))) in check_dhcp_hosts()
592 configs->domain = domain; in check_dhcp_hosts()
602 in at most one dhcp-host. Since /etc/hosts can be re-read by SIGHUP, in dhcp_update_configs()
603 restore the status-quo ante first. */ in dhcp_update_configs()
608 for (config = configs; config; config = config->next) in dhcp_update_configs()
609 if (config->flags & CONFIG_ADDR_HOSTS) config->flags &= ~(CONFIG_ADDR | CONFIG_ADDR_HOSTS); in dhcp_update_configs()
611 if (daemon->port != 0) in dhcp_update_configs()
612 for (config = configs; config; config = config->next) in dhcp_update_configs()
613 if (!(config->flags & CONFIG_ADDR) && (config->flags & CONFIG_NAME) && in dhcp_update_configs()
614 (crec = cache_find_by_name(NULL, config->hostname, 0, F_IPV4)) && in dhcp_update_configs()
615 (crec->flags & F_HOSTS)) { in dhcp_update_configs()
616 if (cache_find_by_name(crec, config->hostname, 0, F_IPV4)) { in dhcp_update_configs()
618 while (crec && !(crec->flags & F_REVERSE)) in dhcp_update_configs()
619 crec = cache_find_by_name(crec, config->hostname, 0, F_IPV4); in dhcp_update_configs()
623 config->hostname, inet_ntoa(crec->addr.addr.addr.addr4)); in dhcp_update_configs()
626 if (config_find_by_address(configs, crec->addr.addr.addr.addr4)) in dhcp_update_configs()
628 _("duplicate IP address %s (%s) in dhcp-config directive"), in dhcp_update_configs()
629 inet_ntoa(crec->addr.addr.addr.addr4), config->hostname); in dhcp_update_configs()
631 config->addr = crec->addr.addr.addr.addr4; in dhcp_update_configs()
632 config->flags |= CONFIG_ADDR | CONFIG_ADDR_HOSTS; in dhcp_update_configs()
646 if (daemon->port == 0) return NULL; /* DNS disabled. */ in host_from_dns()
649 if (lookup && (lookup->flags & F_HOSTS)) { in host_from_dns()
650 hostname = daemon->dhcp_buff; in host_from_dns()