Lines Matching refs:mess

87 static void option_put(struct dhcp_packet *mess, unsigned char *end, int opt, int len, unsigned int val);
88 static void option_put_string(struct dhcp_packet *mess, unsigned char *end,
95 static unsigned char *option_find(struct dhcp_packet *mess, size_t size, int opt_type, int minsize);
97 static size_t dhcp_packet_size(struct dhcp_packet *mess, struct dhcp_netid *netid,
99 static void clear_packet(struct dhcp_packet *mess, unsigned char *end);
101 struct dhcp_packet *mess,
114 static void do_encap_opts(struct dhcp_opt *opts, int encap, int flag, struct dhcp_packet *mess, unsigned char *end, int null_term);
115 static void pxe_misc(struct dhcp_packet *mess, unsigned char *end, unsigned char *uuid);
130 struct dhcp_packet *mess = (struct dhcp_packet *)daemon->dhcp_packet.iov_base;
131 unsigned char *end = (unsigned char *)(mess + 1);
132 unsigned char *real_end = (unsigned char *)(mess + 1);
158 if (mess->op != BOOTREQUEST || mess->hlen > DHCP_CHADDR_MAX)
161 if (mess->htype == 0 && mess->hlen != 0)
165 if ((opt = option_find(mess, sz, OPTION_MESSAGE_TYPE, 1)))
170 if (*((u32 *)&mess->options) != htonl(DHCP_COOKIE))
174 so reassign mess from daemon->packet. Also, the size
176 if ((opt = option_find(mess, sz, OPTION_MAXMESSAGE, 2)))
187 mess = (struct dhcp_packet *)daemon->dhcp_packet.iov_base;
188 real_end = end = ((unsigned char *)mess) + size;
194 if ((option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ) || mess_type == DHCPDISCOVER))
195 mess->ciaddr.s_addr = 0;
197 if ((opt = option_find(mess, sz, OPTION_AGENT_ID, 1)))
206 unsigned char *last_opt = option_find(mess, sz, OPTION_END, 0);
248 if (subnet_addr.s_addr == 0 && (opt = option_find(mess, sz, OPTION_SUBNET_SELECT, INADDRSZ)))
252 if ((opt = option_find(mess, sz, OPTION_CLIENT_ID, 1)))
259 lease = lease_find_by_client(mess->chaddr, mess->hlen, mess->htype, clid, clid_len);
270 emac = extended_hwaddr(mess->htype, mess->hlen, mess->chaddr, clid_len, clid, &emac_len);
274 if (mac->hwaddr_len == mess->hlen &&
275 (mac->hwaddr_type == mess->htype || mac->hwaddr_type == 0) &&
276 memcmp_masked(mac->hwaddr, mess->chaddr, mess->hlen, mac->mask))
289 if (mess->giaddr.s_addr || subnet_addr.s_addr || mess->ciaddr.s_addr)
300 else if (mess->giaddr.s_addr)
302 addr = mess->giaddr;
308 addr = mess->ciaddr;
338 // subnet_addr.s_addr ? inet_ntoa(subnet_addr) : (mess->giaddr.s_addr ? inet_ntoa(mess->giaddr) : iface_name));
353 ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->netmask));
356 ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->end));
360 mess->op = BOOTREPLY;
363 mess->chaddr, mess->hlen, mess->htype, NULL);
380 if (mess->htype == 0 || mess->hlen == 0 || (context->flags & CONTEXT_PROXY))
386 end = mess->options + 64; /* BOOTP vend area is only 64 bytes */
401 if (mess->file[0])
403 memcpy(daemon->dhcp_buff2, mess->file, sizeof(mess->file));
404 daemon->dhcp_buff2[sizeof(mess->file) + 1] = 0; /* ensure zero term. */
428 mess->yiaddr = config->addr;
430 (lease->hwaddr_len != mess->hlen ||
431 lease->hwaddr_type != mess->htype ||
432 memcmp(lease->hwaddr, mess->chaddr, lease->hwaddr_len) != 0))
437 if (!(lease = lease_find_by_client(mess->chaddr, mess->hlen, mess->htype, NULL, 0)) ||
446 if (!address_allocate(context, &mess->yiaddr, mess->chaddr, mess->hlen, netid, now))
450 mess->yiaddr = lease->addr;
453 if (!message && !(context = narrow_context(context, mess->yiaddr, netid)))
472 (!(lease = lease_allocate(mess->yiaddr))))
477 logaddr = &mess->yiaddr;
479 lease_set_hwaddr(lease, mess->chaddr, NULL, mess->hlen, mess->htype, 0);
488 clear_packet(mess, end);
489 do_options(context, mess, end, NULL, hostname, get_domain(mess->yiaddr),
494 log_packet("BOOTP", logaddr, mess->chaddr, mess->hlen, iface_name, message, mess->xid);
496 return message ? 0 : dhcp_packet_size(mess, netid, agent_id, real_end);
499 if ((opt = option_find(mess, sz, OPTION_CLIENT_FQDN, 4)))
542 else if ((opt = option_find(mess, sz, OPTION_HOSTNAME, 1)))
558 my_syslog(MS_DHCP | LOG_INFO, _("%u client provides name: %s"), ntohl(mess->xid), client_hostname);
582 mess->chaddr, mess->hlen,
583 mess->htype, hostname);
609 if (!(opt = option_find(mess, sz, o->opt, 1)) ||
653 if ((opt = option_find(mess, sz, OPTION_USER_CLASS, 1)))
677 if ((opt = option_find(mess, sz, mopt, 1)))
691 match_vendor_opts(option_find(mess, sz, OPTION_VENDOR_ID, 1), daemon->dhcp_opts);
695 if (sanitise(option_find(mess, sz, OPTION_VENDOR_ID, 1), daemon->namebuff))
696 my_syslog(MS_DHCP | LOG_INFO, _("%u Vendor class: %s"), ntohl(mess->xid), daemon->namebuff);
697 if (sanitise(option_find(mess, sz, OPTION_USER_CLASS, 1), daemon->namebuff))
698 my_syslog(MS_DHCP | LOG_INFO, _("%u User class: %s"), ntohl(mess->xid), daemon->namebuff);
712 (opt = option_find(mess, sz, OPTION_VENDOR_ID, 9)) &&
715 if ((opt = option_find(mess, sz, OPTION_PXE_UUID, 17)))
723 (opt = option_find(mess, sz, OPTION_VENDOR_CLASS_OPT, 1)) &&
750 clear_packet(mess, end);
752 mess->yiaddr = mess->ciaddr;
753 mess->ciaddr.s_addr = 0;
755 mess->siaddr = service->server;
757 mess->siaddr = context->local;
759 snprintf((char *)mess->file, sizeof(mess->file), "%s.%d", service->basename, layer);
760 option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPACK);
761 option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, htonl(context->local.s_addr));
762 pxe_misc(mess, end, uuid);
771 do_encap_opts(&opt71, OPTION_VENDOR_CLASS_OPT, DHOPT_VENDOR_MATCH, mess, end, 0);
773 log_packet("PXE", &mess->yiaddr, emac, emac_len, iface_name, (char *)mess->file, mess->xid);
774 return dhcp_packet_size(mess, netid, agent_id, real_end);
777 if ((opt = option_find(mess, sz, OPTION_ARCH, 2)))
787 mess->yiaddr.s_addr = 0;
788 if (mess_type == DHCPDISCOVER || mess->ciaddr.s_addr == 0)
790 mess->ciaddr.s_addr = 0;
791 mess->flags |= htons(0x8000); /* broadcast */
794 clear_packet(mess, end);
801 mess->siaddr = boot->next_server;
804 strncpy((char *)mess->file, boot->file, sizeof(mess->file)-1);
807 option_put(mess, end, OPTION_MESSAGE_TYPE, 1,
809 option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, htonl(context->local.s_addr));
810 pxe_misc(mess, end, uuid);
812 do_encap_opts(pxe_opts(pxearch, netid), OPTION_VENDOR_CLASS_OPT, DHOPT_VENDOR_MATCH, mess, end, 0);
814 log_packet("PXE", NULL, emac, emac_len, iface_name, ignore ? "proxy" : "proxy-ignored", mess->xid);
815 return ignore ? 0 : dhcp_packet_size(mess, netid, agent_id, real_end);
824 if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 0)))
834 if (!(opt = option_find(mess, sz, OPTION_SERVER_IDENTIFIER, INADDRSZ)) ||
839 sanitise(option_find(mess, sz, OPTION_MESSAGE, 1), daemon->dhcp_buff);
841 if (!(opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))
844 log_packet("DHCPDECLINE", option_ptr(opt, 0), emac, emac_len, iface_name, daemon->dhcp_buff, mess->xid);
866 if (!(context = narrow_context(context, mess->ciaddr, netid)) ||
867 !(opt = option_find(mess, sz, OPTION_SERVER_IDENTIFIER, INADDRSZ)) ||
871 if (lease && lease->addr.s_addr == mess->ciaddr.s_addr)
876 log_packet("DHCPRELEASE", &mess->ciaddr, emac, emac_len, iface_name, message, mess->xid);
892 if ((opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))
926 mess->yiaddr = conf;
930 mess->yiaddr = lease->addr;
933 mess->yiaddr = addr;
936 else if (!address_allocate(context, &mess->yiaddr, emac, emac_len, netid, now))
940 log_packet("DHCPDISCOVER", opt ? option_ptr(opt, 0) : NULL, emac, emac_len, iface_name, message, mess->xid);
942 if (message || !(context = narrow_context(context, mess->yiaddr, netid)))
945 log_packet("DHCPOFFER" , &mess->yiaddr, emac, emac_len, iface_name, NULL, mess->xid);
953 time = calc_time(context, config, option_find(mess, sz, OPTION_LEASE_TIME, 4));
954 clear_packet(mess, end);
955 option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPOFFER);
956 option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
957 option_put(mess, end, OPTION_LEASE_TIME, 4, time);
961 option_put(mess, end, OPTION_T1, 4, (time/2));
962 option_put(mess, end, OPTION_T2, 4, (time*7)/8);
964 do_options(context, mess, end, req_options, offer_hostname, get_domain(mess->yiaddr),
967 return dhcp_packet_size(mess, netid, agent_id, real_end);
972 if ((opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))
975 mess->yiaddr = option_addr(opt);
980 if ((opt = option_find(mess, sz, OPTION_SERVER_IDENTIFIER, INADDRSZ)))
1008 if (lease && lease->addr.s_addr != mess->yiaddr.s_addr)
1020 if (lease && lease->addr.s_addr != mess->yiaddr.s_addr)
1036 if ((lease && mess->ciaddr.s_addr != lease->addr.s_addr) ||
1045 mess->yiaddr = mess->ciaddr;
1048 log_packet("DHCPREQUEST", &mess->yiaddr, emac, emac_len, iface_name, NULL, mess->xid);
1060 if (!(context = narrow_context(context, mess->yiaddr, netid)))
1069 else if (!address_available(context, mess->yiaddr, netid) &&
1070 (!have_config(config, CONFIG_ADDR) || config->addr.s_addr != mess->yiaddr.s_addr))
1080 config->addr.s_addr != mess->yiaddr.s_addr &&
1085 else if ((addr_config = config_find_by_address(daemon->dhcp_conf, mess->yiaddr)) && addr_config != config)
1088 else if (!lease && (ltmp = lease_find_by_addr(mess->yiaddr)))
1110 if ((lease = lease_allocate(mess->yiaddr)))
1120 log_packet("DHCPNAK", &mess->yiaddr, emac, emac_len, iface_name, message, mess->xid);
1122 mess->yiaddr.s_addr = 0;
1123 clear_packet(mess, end);
1124 option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPNAK);
1125 option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
1126 option_put_string(mess, end, OPTION_MESSAGE, message, borken_opt);
1129 if (!unicast_dest || mess->giaddr.s_addr != 0 ||
1130 mess->ciaddr.s_addr == 0 || is_same_net(context->local, mess->ciaddr, context->netmask))
1132 mess->flags |= htons(0x8000); /* broadcast */
1133 mess->ciaddr.s_addr = 0;
1140 if (mess->giaddr.s_addr)
1141 lease->giaddr = mess->giaddr;
1145 if ((opt = option_find(mess, sz, OPTION_USER_CLASS, 1)))
1160 if ((opt = option_find(mess, sz, OPTION_VENDOR_ID, 1)))
1172 if ((opt = option_find(mess, sz, OPTION_HOSTNAME, 1)))
1186 if (!hostname_auth && (client_hostname = host_from_dns(mess->yiaddr)))
1198 time = calc_time(context, config, option_find(mess, sz, OPTION_LEASE_TIME, 4));
1199 lease_set_hwaddr(lease, mess->chaddr, clid, mess->hlen, mess->htype, clid_len);
1221 log_packet("DHCPACK", &mess->yiaddr, emac, emac_len, iface_name, hostname, mess->xid);
1223 clear_packet(mess, end);
1224 option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPACK);
1225 option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
1226 option_put(mess, end, OPTION_LEASE_TIME, 4, time);
1231 option_put(mess, end, OPTION_T1, 4, (time/2) - fuzz);
1232 option_put(mess, end, OPTION_T2, 4, ((time/8)*7) - fuzz);
1234 do_options(context, mess, end, req_options, hostname, get_domain(mess->yiaddr),
1238 return dhcp_packet_size(mess, netid, agent_id, real_end);
1244 log_packet("DHCPINFORM", &mess->ciaddr, emac, emac_len, iface_name, message, mess->xid);
1246 if (message || mess->ciaddr.s_addr == 0)
1250 context = narrow_context(context, mess->ciaddr, netid);
1255 (lease = lease_find_by_addr(mess->ciaddr)) &&
1260 hostname = host_from_dns(mess->ciaddr);
1262 log_packet("DHCPACK", &mess->ciaddr, emac, emac_len, iface_name, hostname, mess->xid);
1278 clear_packet(mess, end);
1279 option_put(mess, end, OPTION_MESSAGE_TYPE, 1, DHCPACK);
1280 option_put(mess, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, ntohl(server_id(context, override, fallback).s_addr));
1288 option_put(mess, end, OPTION_LEASE_TIME, 4, time);
1292 do_options(context, mess, end, req_options, hostname, get_domain(mess->ciaddr),
1296 return dhcp_packet_size(mess, netid, agent_id, real_end);
1473 static unsigned char *option_find(struct dhcp_packet *mess, size_t size, int opt_type, int minsize)
1478 if ((ret = option_find1(&mess->options[0] + sizeof(u32), ((unsigned char *)mess) + size, opt_type, minsize)))
1482 if (!(overload = option_find1(&mess->options[0] + sizeof(u32), ((unsigned char *)mess) + size, OPTION_OVERLOAD, 1)))
1487 (ret = option_find1(&mess->file[0], &mess->file[128], opt_type, minsize)))
1492 (ret = option_find1(&mess->sname[0], &mess->sname[64], opt_type, minsize)))
1535 static unsigned char *find_overload(struct dhcp_packet *mess)
1537 unsigned char *p = &mess->options[0] + sizeof(u32);
1548 static size_t dhcp_packet_size(struct dhcp_packet *mess, struct dhcp_netid *netid,
1551 unsigned char *p = dhcp_skip_opts(&mess->options[0] + sizeof(u32));
1583 my_syslog(MS_DHCP | LOG_INFO, _("%u tags: %s"), ntohl(mess->xid), s);
1587 overload = find_overload(mess);
1591 *dhcp_skip_opts(mess->file) = OPTION_END;
1593 log_options(mess->file, mess->xid);
1595 else if ((daemon->options & OPT_LOG_OPTS) && strlen((char *)mess->file) != 0)
1596 my_syslog(MS_DHCP | LOG_INFO, _("%u bootfile name: %s"), ntohl(mess->xid), (char *)mess->file);
1600 *dhcp_skip_opts(mess->sname) = OPTION_END;
1602 log_options(mess->sname, mess->xid);
1604 else if ((daemon->options & OPT_LOG_OPTS) && strlen((char *)mess->sname) != 0)
1605 my_syslog(MS_DHCP | LOG_INFO, _("%u server name: %s"), ntohl(mess->xid), (char *)mess->sname);
1612 if (mess->siaddr.s_addr != 0)
1613 my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), inet_ntoa(mess->siaddr));
1615 log_options(&mess->options[0] + sizeof(u32), mess->xid);
1620 mess->flags |= htons(0x8000); /* force broadcast */
1622 ret = (size_t)(p - (unsigned char *)mess);
1630 static unsigned char *free_space(struct dhcp_packet *mess, unsigned char *end, int opt, int len)
1632 unsigned char *p = dhcp_skip_opts(&mess->options[0] + sizeof(u32));
1639 if (!(overload = find_overload(mess)) &&
1640 (mess->file[0] == 0 || mess->sname[0] == 0))
1654 if (mess->file[0] == 0)
1659 p = dhcp_skip_opts(mess->file);
1660 if (p + len + 3 >= mess->file + sizeof(mess->file))
1667 if (mess->sname[0] == 0)
1672 p = dhcp_skip_opts(mess->sname);
1673 if (p + len + 3 >= mess->sname + sizeof(mess->file))
1692 static void option_put(struct dhcp_packet *mess, unsigned char *end, int opt, int len, unsigned int val)
1695 unsigned char *p = free_space(mess, end, opt, len);
1702 static void option_put_string(struct dhcp_packet *mess, unsigned char *end, int opt,
1711 if ((p = free_space(mess, end, opt, len)))
1794 struct dhcp_packet *mess, unsigned char *end, int null_term)
1809 p = free_space(mess, end, encap, enc_len);
1824 (p = free_space(mess, end, encap, enc_len + 1)))
1838 static void pxe_misc(struct dhcp_packet *mess, unsigned char *end, unsigned char *uuid)
1842 option_put_string(mess, end, OPTION_VENDOR_ID, "PXEClient", 0);
1843 if (uuid && (p = free_space(mess, end, OPTION_PXE_UUID, 17)))
1949 discovery_control = 8; /* no menu - just use use mess->filename */
1989 static void clear_packet(struct dhcp_packet *mess, unsigned char *end)
1991 memset(mess->sname, 0, sizeof(mess->sname));
1992 memset(mess->file, 0, sizeof(mess->file));
1993 memset(&mess->options[0] + sizeof(u32), 0, end - (&mess->options[0] + sizeof(u32)));
1994 mess->siaddr.s_addr = 0;
2015 struct dhcp_packet *mess,
2052 my_syslog(MS_DHCP | LOG_INFO, _("%u requested options: %s"), ntohl(mess->xid), daemon->namebuff);
2058 mess->siaddr = context->local;
2073 option_put_string(mess, end, OPTION_SNAME, boot->sname, 1);
2075 strncpy((char *)mess->sname, boot->sname, sizeof(mess->sname)-1);
2083 option_put_string(mess, end, OPTION_FILENAME, boot->file, 1);
2085 strncpy((char *)mess->file, boot->file, sizeof(mess->file)-1);
2089 mess->siaddr = boot->next_server;
2097 if ((!req_options || !in_list(req_options, OPTION_FILENAME)) && mess->file[0] == 0 &&
2100 strncpy((char *)mess->file, (char *)opt->val, sizeof(mess->file)-1);
2107 strncpy((char *)mess->sname, (char *)opt->val, sizeof(mess->sname)-1);
2112 mess->siaddr.s_addr = ((struct in_addr *)opt->val)->s_addr;
2121 f0 = mess->file[0];
2122 mess->file[0] = 1;
2123 s0 = mess->sname[0];
2124 mess->sname[0] = 1;
2127 /* At this point, if mess->sname or mess->file are zeroed, they are available
2129 if (mess->file[0] == 0 || mess->sname[0] == 0)
2134 option_put(mess, end, OPTION_SUBNET_SELECT, INADDRSZ, ntohl(subnet_addr.s_addr));
2140 option_put(mess, end, OPTION_NETMASK, INADDRSZ, ntohl(context->netmask.s_addr));
2146 option_put(mess, end, OPTION_BROADCAST, INADDRSZ, ntohl(context->broadcast.s_addr));
2153 option_put(mess, end, OPTION_ROUTER, INADDRSZ, ntohl(context->router.s_addr));
2157 option_put(mess, end, OPTION_DNSSERVER, INADDRSZ, ntohl(context->local.s_addr));
2162 option_put_string(mess, end, OPTION_DOMAINNAME, domain, null_term);
2169 option_put_string(mess, end, OPTION_HOSTNAME, hostname, null_term);
2183 if ((p = free_space(mess, end, OPTION_CLIENT_FQDN, len)))
2259 if ((p = free_space(mess, end, optno, len)))
2300 do_encap_opts(config_opts, opt->u.encap, DHOPT_ENCAP_MATCH, mess, end, null_term);
2310 pxe_misc(mess, end, uuid);
2315 do_encap_opts(config_opts, OPTION_VENDOR_CLASS_OPT, DHOPT_VENDOR_MATCH, mess, end, null_term);
2320 mess->file[0] = f0;
2321 mess->sname[0] = s0;